diff --git a/blocksuite/affine/shared/src/services/user-service/user-service.ts b/blocksuite/affine/shared/src/services/user-service/user-service.ts index 7e06ef3130..ebafa391c2 100644 --- a/blocksuite/affine/shared/src/services/user-service/user-service.ts +++ b/blocksuite/affine/shared/src/services/user-service/user-service.ts @@ -5,6 +5,7 @@ import type { Signal } from '@preact/signals-core'; import type { AffineUserInfo } from './types'; export interface UserService { + currentUserInfo$: Signal; userInfo$(id: string): Signal; isLoading$(id: string): Signal; error$(id: string): Signal; // user friendly error string diff --git a/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx b/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx index bf32a77245..840c96d5df 100644 --- a/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx +++ b/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx @@ -48,10 +48,24 @@ class MemberManager { selectedMemberId = signal(null); filteredMembers = computed(() => { - return this.ops.userListService.users$.value.filter( - member => - !member.removed && !this.selectedMembers.value.includes(member.id) - ); + const isSearching = this.userListService.searchText$.value !== ''; + if (isSearching) { + return this.ops.userListService.users$.value.filter( + member => + !member.removed && !this.selectedMembers.value.includes(member.id) + ); + } else { + const currentUser = this.ops.userService.currentUserInfo$.value; + return [ + ...(currentUser ? [currentUser] : []), + ...this.ops.userListService.users$.value.filter( + member => member.id !== currentUser?.id + ), + ].filter( + member => + !member.removed && !this.selectedMembers.value.includes(member.id) + ); + } }); constructor(private readonly ops: MemberManagerOptions) {} diff --git a/packages/frontend/core/src/blocksuite/view-extensions/cloud/index.ts b/packages/frontend/core/src/blocksuite/view-extensions/cloud/index.ts index 20274bdd5a..45f1151fe7 100644 --- a/packages/frontend/core/src/blocksuite/view-extensions/cloud/index.ts +++ b/packages/frontend/core/src/blocksuite/view-extensions/cloud/index.ts @@ -1,4 +1,4 @@ -import { PublicUserService } from '@affine/core/modules/cloud'; +import { AuthService, PublicUserService } from '@affine/core/modules/cloud'; import { MemberSearchService } from '@affine/core/modules/permissions'; import { type ViewExtensionContext, @@ -31,10 +31,11 @@ export class CloudViewExtension extends ViewExtensionProvider } const memberSearchService = framework.get(MemberSearchService); const publicUserService = framework.get(PublicUserService); + const authService = framework.get(AuthService); context.register([ patchUserListExtensions(memberSearchService), - patchUserExtensions(publicUserService), + patchUserExtensions(publicUserService, authService), ]); } } diff --git a/packages/frontend/core/src/blocksuite/view-extensions/cloud/user.ts b/packages/frontend/core/src/blocksuite/view-extensions/cloud/user.ts index 5fc45883f8..acb8d0b690 100644 --- a/packages/frontend/core/src/blocksuite/view-extensions/cloud/user.ts +++ b/packages/frontend/core/src/blocksuite/view-extensions/cloud/user.ts @@ -1,9 +1,30 @@ -import type { PublicUserService } from '@affine/core/modules/cloud'; +import type { + AuthService, + PublicUserService, +} from '@affine/core/modules/cloud'; import { UserFriendlyError } from '@affine/error'; -import { UserServiceExtension } from '@blocksuite/affine/shared/services'; +import { + type AffineUserInfo, + UserServiceExtension, +} from '@blocksuite/affine/shared/services'; -export function patchUserExtensions(publicUserService: PublicUserService) { +export function patchUserExtensions( + publicUserService: PublicUserService, + authService: AuthService +) { return UserServiceExtension({ + // eslint-disable-next-line rxjs/finnish + currentUserInfo$: authService.session.account$.map(account => { + if (!account) { + return null; + } + return { + id: account.id, + name: account.label, + avatar: account.avatar, + removed: false, + } as AffineUserInfo; + }).signal, // eslint-disable-next-line rxjs/finnish userInfo$(id) { return publicUserService.publicUser$(id).signal;