feat(editor): put current user in first on database user select (#13320)
This commit is contained in:
@@ -5,6 +5,7 @@ import type { Signal } from '@preact/signals-core';
|
|||||||
import type { AffineUserInfo } from './types';
|
import type { AffineUserInfo } from './types';
|
||||||
|
|
||||||
export interface UserService {
|
export interface UserService {
|
||||||
|
currentUserInfo$: Signal<AffineUserInfo | null>;
|
||||||
userInfo$(id: string): Signal<AffineUserInfo | null>;
|
userInfo$(id: string): Signal<AffineUserInfo | null>;
|
||||||
isLoading$(id: string): Signal<boolean>;
|
isLoading$(id: string): Signal<boolean>;
|
||||||
error$(id: string): Signal<string | null>; // user friendly error string
|
error$(id: string): Signal<string | null>; // user friendly error string
|
||||||
|
|||||||
@@ -48,10 +48,24 @@ class MemberManager {
|
|||||||
selectedMemberId = signal<string | null>(null);
|
selectedMemberId = signal<string | null>(null);
|
||||||
|
|
||||||
filteredMembers = computed(() => {
|
filteredMembers = computed(() => {
|
||||||
return this.ops.userListService.users$.value.filter(
|
const isSearching = this.userListService.searchText$.value !== '';
|
||||||
member =>
|
if (isSearching) {
|
||||||
!member.removed && !this.selectedMembers.value.includes(member.id)
|
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) {}
|
constructor(private readonly ops: MemberManagerOptions) {}
|
||||||
|
|||||||
@@ -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 { MemberSearchService } from '@affine/core/modules/permissions';
|
||||||
import {
|
import {
|
||||||
type ViewExtensionContext,
|
type ViewExtensionContext,
|
||||||
@@ -31,10 +31,11 @@ export class CloudViewExtension extends ViewExtensionProvider<CloudViewOptions>
|
|||||||
}
|
}
|
||||||
const memberSearchService = framework.get(MemberSearchService);
|
const memberSearchService = framework.get(MemberSearchService);
|
||||||
const publicUserService = framework.get(PublicUserService);
|
const publicUserService = framework.get(PublicUserService);
|
||||||
|
const authService = framework.get(AuthService);
|
||||||
|
|
||||||
context.register([
|
context.register([
|
||||||
patchUserListExtensions(memberSearchService),
|
patchUserListExtensions(memberSearchService),
|
||||||
patchUserExtensions(publicUserService),
|
patchUserExtensions(publicUserService, authService),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 { 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({
|
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
|
// eslint-disable-next-line rxjs/finnish
|
||||||
userInfo$(id) {
|
userInfo$(id) {
|
||||||
return publicUserService.publicUser$(id).signal;
|
return publicUserService.publicUser$(id).signal;
|
||||||
|
|||||||
Reference in New Issue
Block a user