diff --git a/packages/frontend/core/src/modules/at-menu-config/index.ts b/packages/frontend/core/src/modules/at-menu-config/index.ts index 22bfdd37bc..e9b97f3b97 100644 --- a/packages/frontend/core/src/modules/at-menu-config/index.ts +++ b/packages/frontend/core/src/modules/at-menu-config/index.ts @@ -2,11 +2,12 @@ import { type Framework } from '@toeverything/infra'; import { WorkspaceServerService } from '../cloud'; import { WorkspaceDialogService } from '../dialogs'; -import { DocsService } from '../doc'; +import { DocScope, DocsService } from '../doc'; import { DocDisplayMetaService } from '../doc-display-meta'; import { EditorSettingService } from '../editor-setting'; import { JournalService } from '../journal'; import { GuardService, MemberSearchService } from '../permissions'; +import { DocGrantedUsersService } from '../permissions/services/doc-granted-users'; import { SearchMenuService } from '../search-menu/services'; import { WorkspaceScope } from '../workspace'; import { AtMenuConfigService } from './services'; @@ -14,6 +15,7 @@ import { AtMenuConfigService } from './services'; export function configAtMenuConfigModule(framework: Framework) { framework .scope(WorkspaceScope) + .scope(DocScope) .service(AtMenuConfigService, [ JournalService, DocDisplayMetaService, @@ -24,5 +26,6 @@ export function configAtMenuConfigModule(framework: Framework) { WorkspaceServerService, MemberSearchService, GuardService, + DocGrantedUsersService, ]); } diff --git a/packages/frontend/core/src/modules/at-menu-config/services/index.ts b/packages/frontend/core/src/modules/at-menu-config/services/index.ts index 2d492dc73e..7442bfbf9a 100644 --- a/packages/frontend/core/src/modules/at-menu-config/services/index.ts +++ b/packages/frontend/core/src/modules/at-menu-config/services/index.ts @@ -1,6 +1,10 @@ import { notify } from '@affine/component'; import { UserFriendlyError } from '@affine/error'; -import { type DocMode as GraphqlDocMode, ErrorNames } from '@affine/graphql'; +import { + type DocMode as GraphqlDocMode, + DocRole, + ErrorNames, +} from '@affine/graphql'; import { I18n, i18nTime } from '@affine/i18n'; import track from '@affine/track'; import { @@ -43,6 +47,7 @@ import type { EditorSettingService } from '../../editor-setting'; import { type JournalService, suggestJournalDate } from '../../journal'; import { NotificationService } from '../../notification'; import type { GuardService, MemberSearchService } from '../../permissions'; +import type { DocGrantedUsersService } from '../../permissions/services/doc-granted-users'; import type { SearchMenuService } from '../../search-menu/services'; function resolveSignal(data: T | Signal): T { @@ -65,7 +70,8 @@ export class AtMenuConfigService extends Service { private readonly searchMenuService: SearchMenuService, private readonly workspaceServerService: WorkspaceServerService, private readonly memberSearchService: MemberSearchService, - private readonly guardService: GuardService + private readonly guardService: GuardService, + private readonly docGrantedUsersService: DocGrantedUsersService ) { super(); } @@ -433,11 +439,11 @@ export class AtMenuConfigService extends Service { .catch(error => { const err = UserFriendlyError.fromAny(error); - const canUserManage = this.guardService.can$( - 'Workspace_Users_Manage' - ).signal.value; - if (err.is(ErrorNames.MENTION_USER_DOC_ACCESS_DENIED)) { + const canUserManage = this.guardService.can$( + 'Doc_Users_Manage', + docId + ).signal.value; if (canUserManage) { const username = name ?? 'Unknown'; notify.error({ @@ -449,10 +455,36 @@ export class AtMenuConfigService extends Service { }), action: { label: 'Invite', - onClick: () => { - this.dialogService.open('setting', { - activeTab: 'workspace:members', - }); + onClick: async () => { + try { + await this.docGrantedUsersService.updateUserRole( + id, + DocRole.Reader + ); + + await notificationService.mentionUser( + id, + workspaceId, + { + id: docId, + title: + this.docDisplayMetaService.title$(docId).value, + blockId: block.blockId, + mode: mode as GraphqlDocMode, + } + ); + + notify.success({ + title: I18n.t( + 'com.affine.editor.at-menu.invited-and-notified' + ), + }); + } catch (error) { + const err = UserFriendlyError.fromAny(error); + notify.error({ + title: I18n[`error.${err.name}`](err.data), + }); + } }, }, }); diff --git a/packages/frontend/i18n/src/i18n-completenesses.json b/packages/frontend/i18n/src/i18n-completenesses.json index 2d6c6d2396..015ec58319 100644 --- a/packages/frontend/i18n/src/i18n-completenesses.json +++ b/packages/frontend/i18n/src/i18n-completenesses.json @@ -14,7 +14,7 @@ "it-IT": 100, "it": 1, "ja": 100, - "ko": 58, + "ko": 57, "pl": 100, "pt-BR": 100, "ru": 100, diff --git a/packages/frontend/i18n/src/i18n.gen.ts b/packages/frontend/i18n/src/i18n.gen.ts index 6151ef2971..1057b4ba9b 100644 --- a/packages/frontend/i18n/src/i18n.gen.ts +++ b/packages/frontend/i18n/src/i18n.gen.ts @@ -7079,6 +7079,10 @@ export function useAFFiNEI18N(): { * `This member does not have access to this doc, they are not notified.` */ ["com.affine.editor.at-menu.member-not-notified-message"](): string; + /** + * `Invited and notified` + */ + ["com.affine.editor.at-menu.invited-and-notified"](): string; /** * `Access needed` */ diff --git a/packages/frontend/i18n/src/resources/en.json b/packages/frontend/i18n/src/resources/en.json index 6da608ef2d..2c4a1a7692 100644 --- a/packages/frontend/i18n/src/resources/en.json +++ b/packages/frontend/i18n/src/resources/en.json @@ -1759,6 +1759,7 @@ "com.affine.editor.at-menu.mention-members": "Mention Members", "com.affine.editor.at-menu.member-not-notified": "Member not notified", "com.affine.editor.at-menu.member-not-notified-message": "This member does not have access to this doc, they are not notified.", + "com.affine.editor.at-menu.invited-and-notified": "Invited and notified", "com.affine.editor.at-menu.access-needed": "Access needed", "com.affine.editor.at-menu.access-needed-message": "{{username}} does not have access to this doc, do you want to invite and notify them?", "com.affine.editor.bi-directional-link-panel.show": "Show",