fix(editor): add member node before mention (#11197)

This commit is contained in:
Flrande
2025-03-26 08:05:02 +00:00
parent 91876301bf
commit 30072da929
3 changed files with 71 additions and 54 deletions

View File

@@ -29,6 +29,10 @@ import { computed, Signal, signal } from '@preact/signals-core';
import { Service } from '@toeverything/infra'; import { Service } from '@toeverything/infra';
import { cssVarV2 } from '@toeverything/theme/v2'; import { cssVarV2 } from '@toeverything/theme/v2';
import { html } from 'lit'; import { html } from 'lit';
import {
createAbsolutePositionFromRelativePosition,
createRelativePositionFromTypeIndex,
} from 'yjs';
import { AuthService, type WorkspaceServerService } from '../../cloud'; import { AuthService, type WorkspaceServerService } from '../../cloud';
import type { WorkspaceDialogService } from '../../dialogs'; import type { WorkspaceDialogService } from '../../dialogs';
@@ -369,9 +373,9 @@ export class AtMenuConfigService extends Service {
close(); close();
if (id === currentUserId) {
const inlineRange = inlineEditor.getInlineRange(); const inlineRange = inlineEditor.getInlineRange();
if (inlineRange && inlineRange.length === 0) { if (!inlineRange || inlineRange.length !== 0) return;
inlineEditor.insertText(inlineRange, ' ', { inlineEditor.insertText(inlineRange, ' ', {
mention: { mention: {
member: id, member: id,
@@ -381,11 +385,13 @@ export class AtMenuConfigService extends Service {
index: inlineRange.index + 1, index: inlineRange.index + 1,
length: 0, length: 0,
}); });
}
return; const relativePosition = createRelativePositionFromTypeIndex(
} inlineEditor.yText,
inlineRange.index + 1
);
if (id !== currentUserId) {
notificationService notificationService
.mentionUser(id, workspaceId, { .mentionUser(id, workspaceId, {
id: docId, id: docId,
@@ -394,23 +400,38 @@ export class AtMenuConfigService extends Service {
mode: mode as GraphqlDocMode, mode: mode as GraphqlDocMode,
}) })
.then(notificationId => { .then(notificationId => {
const inlineRange = inlineEditor.getInlineRange(); const doc = inlineEditor.yText.doc;
if (inlineRange && inlineRange.length === 0) { if (!doc) return;
inlineEditor.insertText(inlineRange, ' ', { const absolutePosition =
createAbsolutePositionFromRelativePosition(
relativePosition,
doc
);
if (!absolutePosition) return;
const index = absolutePosition.index;
const delta = inlineEditor.getDeltaByRangeIndex(index);
if (
!delta ||
delta.insert !== ' ' ||
!delta.attributes?.mention ||
delta.attributes.mention.notification ||
delta.attributes.mention.member !== id
)
return;
inlineEditor.formatText(
{
index: index - 1,
length: 1,
},
{
mention: { mention: {
member: id, member: id,
notification: notificationId, notification: notificationId,
}, },
});
inlineEditor.setInlineRange({
index: inlineRange.index + 1,
length: 0,
});
} }
);
notify.success({
title: I18n.t('com.affine.editor.at-menu.mention-success'),
});
}) })
.catch(error => { .catch(error => {
const err = UserFriendlyError.fromAny(error); const err = UserFriendlyError.fromAny(error);
@@ -418,13 +439,14 @@ export class AtMenuConfigService extends Service {
title: I18n[`error.${err.name}`](err.data), title: I18n[`error.${err.name}`](err.data),
}); });
}); });
}
}, },
}; };
}; };
if (query.length === 0) { if (query.length === 0) {
return { return {
name: I18n.t('com.affine.editor.at-menu.mention-member'), name: I18n.t('com.affine.editor.at-menu.mention-members'),
items: [ items: [
...this.memberSearchService.result$.value ...this.memberSearchService.result$.value
.slice(0, 3) .slice(0, 3)
@@ -446,7 +468,7 @@ export class AtMenuConfigService extends Service {
this.memberSearchService.search(query); this.memberSearchService.search(query);
return { return {
name: I18n.t('com.affine.editor.at-menu.mention-member'), name: I18n.t('com.affine.editor.at-menu.mention-members'),
items, items,
loading, loading,
}; };

View File

@@ -6928,13 +6928,9 @@ export function useAFFiNEI18N(): {
*/ */
["com.affine.editor.at-menu.date-picker"](): string; ["com.affine.editor.at-menu.date-picker"](): string;
/** /**
* `Mention Member` * `Mention Members`
*/ */
["com.affine.editor.at-menu.mention-member"](): string; ["com.affine.editor.at-menu.mention-members"](): string;
/**
* `Successfully mentioned the member`
*/
["com.affine.editor.at-menu.mention-success"](): string;
/** /**
* `Show` * `Show`
*/ */

View File

@@ -1720,8 +1720,7 @@
"com.affine.editor.at-menu.more-docs-hint": "{{count}} more docs", "com.affine.editor.at-menu.more-docs-hint": "{{count}} more docs",
"com.affine.editor.at-menu.journal": "Journal", "com.affine.editor.at-menu.journal": "Journal",
"com.affine.editor.at-menu.date-picker": "Select a specific date", "com.affine.editor.at-menu.date-picker": "Select a specific date",
"com.affine.editor.at-menu.mention-member": "Mention Member", "com.affine.editor.at-menu.mention-members": "Mention Members",
"com.affine.editor.at-menu.mention-success": "Successfully mentioned the member",
"com.affine.editor.bi-directional-link-panel.show": "Show", "com.affine.editor.bi-directional-link-panel.show": "Show",
"com.affine.editor.bi-directional-link-panel.hide": "Hide", "com.affine.editor.bi-directional-link-panel.hide": "Hide",
"com.affine.editor.edgeless-note-header.fold-page-block": "Fold page block", "com.affine.editor.edgeless-note-header.fold-page-block": "Fold page block",