import { createContext, MutableRefObject, useContext } from 'react'; import type { AccessTokenMessage, Workspace } from '@affine/datacenter'; import type { Page as StorePage, Workspace as StoreWorkspace, } from '@blocksuite/store'; import type { EditorContainer } from '@blocksuite/editor'; export type LoadWorkspaceHandler = ( workspaceId: string, user?: AccessTokenMessage | null ) => Promise | null; export type CreateEditorHandler = (page: StorePage) => EditorContainer | null; export interface AppStateValue { user: AccessTokenMessage | null; workspacesMeta: Workspace[]; currentWorkspaceId: string; currentWorkspace: StoreWorkspace | null; currentPage: StorePage | null; // workspaces: Record; editor: EditorContainer | null; synced: boolean; refreshWorkspacesMeta: () => void; } export interface AppStateContext extends AppStateValue { setState: (state: AppStateValue) => void; createEditor?: MutableRefObject< ((page: StorePage) => EditorContainer | null) | undefined >; setEditor?: MutableRefObject<((page: EditorContainer) => void) | undefined>; loadWorkspace: (workspaceId: string) => Promise; loadPage: (pageId: string) => Promise; } export const AppState = createContext({ user: null, workspacesMeta: [], currentWorkspaceId: '', currentWorkspace: null, currentPage: null, editor: null, // eslint-disable-next-line @typescript-eslint/no-empty-function setState: () => {}, createEditor: undefined, setEditor: undefined, loadWorkspace: () => Promise.resolve(null), loadPage: () => Promise.resolve(null), synced: false, // eslint-disable-next-line @typescript-eslint/no-empty-function refreshWorkspacesMeta: () => {}, }); export const useAppState = () => { return useContext(AppState); };