From 4eae3cc66a4c375bb5145dc2dc4e1475b7518865 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Mon, 3 Mar 2025 03:15:00 +0000 Subject: [PATCH] feat(editor): add user list services (#10555) --- blocksuite/affine/shared/package.json | 1 - blocksuite/affine/shared/src/mixins/index.ts | 1 - .../affine/shared/src/services/index.ts | 1 + .../shared/src/services/user-service/index.ts | 3 +++ .../shared/src/services/user-service/types.ts | 25 ++++++++++++++++++ .../user-service/user-list-service.ts | 26 +++++++++++++++++++ .../src/services/user-service/user-service.ts | 22 ++++++++++++++++ 7 files changed, 77 insertions(+), 2 deletions(-) delete mode 100644 blocksuite/affine/shared/src/mixins/index.ts create mode 100644 blocksuite/affine/shared/src/services/user-service/index.ts create mode 100644 blocksuite/affine/shared/src/services/user-service/types.ts create mode 100644 blocksuite/affine/shared/src/services/user-service/user-list-service.ts create mode 100644 blocksuite/affine/shared/src/services/user-service/user-service.ts diff --git a/blocksuite/affine/shared/package.json b/blocksuite/affine/shared/package.json index a596c8b8a2..78200474ad 100644 --- a/blocksuite/affine/shared/package.json +++ b/blocksuite/affine/shared/package.json @@ -59,7 +59,6 @@ "./consts": "./src/consts/index.ts", "./types": "./src/types/index.ts", "./commands": "./src/commands/index.ts", - "./mixins": "./src/mixins/index.ts", "./theme": "./src/theme/index.ts", "./styles": "./src/styles/index.ts", "./services": "./src/services/index.ts", diff --git a/blocksuite/affine/shared/src/mixins/index.ts b/blocksuite/affine/shared/src/mixins/index.ts deleted file mode 100644 index cb0ff5c3b5..0000000000 --- a/blocksuite/affine/shared/src/mixins/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/blocksuite/affine/shared/src/services/index.ts b/blocksuite/affine/shared/src/services/index.ts index 294e8f064e..12e4440949 100644 --- a/blocksuite/affine/shared/src/services/index.ts +++ b/blocksuite/affine/shared/src/services/index.ts @@ -18,4 +18,5 @@ export * from './quick-search-service'; export * from './sidebar-service'; export * from './telemetry-service'; export * from './theme-service'; +export * from './user-service'; export * from './virtual-keyboard-service'; diff --git a/blocksuite/affine/shared/src/services/user-service/index.ts b/blocksuite/affine/shared/src/services/user-service/index.ts new file mode 100644 index 0000000000..2a4ac61609 --- /dev/null +++ b/blocksuite/affine/shared/src/services/user-service/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './user-list-service'; +export * from './user-service'; diff --git a/blocksuite/affine/shared/src/services/user-service/types.ts b/blocksuite/affine/shared/src/services/user-service/types.ts new file mode 100644 index 0000000000..5096689a2a --- /dev/null +++ b/blocksuite/affine/shared/src/services/user-service/types.ts @@ -0,0 +1,25 @@ +export type RemovedUserInfo = { + id: string; + removed: true; +}; + +export type ExistedUserInfo = { + id: string; + name: string; + avatar: string; + removed?: false; +}; + +export type AffineUserInfo = RemovedUserInfo | ExistedUserInfo; + +export function isRemovedUserInfo( + userInfo: AffineUserInfo +): userInfo is RemovedUserInfo { + return Boolean('removed' in userInfo && userInfo.removed); +} + +export function isExistedUserInfo( + userInfo: AffineUserInfo +): userInfo is ExistedUserInfo { + return !isRemovedUserInfo(userInfo); +} diff --git a/blocksuite/affine/shared/src/services/user-service/user-list-service.ts b/blocksuite/affine/shared/src/services/user-service/user-list-service.ts new file mode 100644 index 0000000000..ddf898f57d --- /dev/null +++ b/blocksuite/affine/shared/src/services/user-service/user-list-service.ts @@ -0,0 +1,26 @@ +import { createIdentifier } from '@blocksuite/global/di'; +import type { ExtensionType } from '@blocksuite/store'; +import type { Signal } from '@preact/signals-core'; + +import type { AffineUserInfo } from './types'; + +export interface UserListService { + users$: Signal; + hasMore$: Signal; + loadMore(): void; + search(keyword: string): void; +} + +export const UserListProvider = createIdentifier( + 'affine-user-list-service' +); + +export function UserListServiceExtension( + service: UserListService +): ExtensionType { + return { + setup(di) { + di.addImpl(UserListProvider, () => service); + }, + }; +} diff --git a/blocksuite/affine/shared/src/services/user-service/user-service.ts b/blocksuite/affine/shared/src/services/user-service/user-service.ts new file mode 100644 index 0000000000..a9c38db645 --- /dev/null +++ b/blocksuite/affine/shared/src/services/user-service/user-service.ts @@ -0,0 +1,22 @@ +import { createIdentifier } from '@blocksuite/global/di'; +import type { ExtensionType } from '@blocksuite/store'; +import type { Signal } from '@preact/signals-core'; + +import type { AffineUserInfo } from './types'; + +export interface UserService { + getCurrentUser(): AffineUserInfo; + getUserInfo(id: string): Signal; +} + +export const UserProvider = createIdentifier( + 'affine-user-service' +); + +export function UserServiceExtension(service: UserService): ExtensionType { + return { + setup(di) { + di.addImpl(UserProvider, () => service); + }, + }; +}