diff --git a/blocksuite/affine/shared/package.json b/blocksuite/affine/shared/package.json index a596c8b8a..78200474a 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 cb0ff5c3b..000000000 --- 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 294e8f064..12e444094 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 000000000..2a4ac6160 --- /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 000000000..5096689a2 --- /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 000000000..ddf898f57 --- /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 000000000..a9c38db64 --- /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); + }, + }; +}