import { Workspace } from '@blocksuite/store'; import { QueryContent } from '@blocksuite/store/dist/workspace/search'; import { PageMeta, useAppState } from '@/providers/app-state-provider'; import { EditorContainer } from '@blocksuite/editor'; import { useChangePageMeta } from '@/hooks/use-change-page-meta'; import { useRouter } from 'next/router'; export type EditorHandlers = { // createPage: (params?: { pageId?: string; title?: string }) => Promise; openPage: ( pageId: string, query?: { [key: string]: string }, newTab?: boolean ) => Promise; getPageMeta: (pageId: string) => PageMeta | null; toggleDeletePage: (pageId: string) => Promise; toggleFavoritePage: (pageId: string) => Promise; permanentlyDeletePage: (pageId: string) => void; search: (query: QueryContent) => Map; // changeEditorMode: (pageId: string) => void; changePageMode: ( pageId: string, mode: EditorContainer['mode'] ) => Promise; }; const getPageMeta = (workspace: Workspace | null, pageId: string) => { return workspace?.meta.pageMetas.find(p => p.id === pageId); }; export const usePageHelper = (): EditorHandlers => { const router = useRouter(); const changePageMeta = useChangePageMeta(); const { currentWorkspace, editor, currentWorkspaceId } = useAppState(); return { toggleFavoritePage: async pageId => { const pageMeta = getPageMeta(currentWorkspace, pageId); if (!pageMeta) { return Promise.reject('No page'); } const favorite = !pageMeta.favorite; changePageMeta(pageMeta.id, { favorite, }); return favorite; }, toggleDeletePage: async pageId => { const pageMeta = getPageMeta(currentWorkspace, pageId); if (!pageMeta) { return Promise.reject('No page'); } const trash = !pageMeta.trash; changePageMeta(pageMeta.id, { trash, trashDate: +new Date(), }); return trash; }, search: (query: QueryContent) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return currentWorkspace!.search(query); }, changePageMode: async (pageId, mode) => { const pageMeta = getPageMeta(currentWorkspace, pageId); if (!pageMeta) { return Promise.reject('No page'); } editor?.setAttribute('mode', mode as string); changePageMeta(pageMeta.id, { mode, }); return mode; }, permanentlyDeletePage: pageId => { // TODO: workspace.meta.removePage or workspace.removePage? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion currentWorkspace!.meta.removePage(pageId); }, openPage: (pageId, query = {}, newTab = false) => { pageId = pageId.replace('space:', ''); if (newTab) { window.open(`/workspace/${currentWorkspaceId}/${pageId}`, '_blank'); return Promise.resolve(true); } return router.push({ pathname: `/workspace/${currentWorkspaceId}/${pageId}`, query, }); }, getPageMeta: pageId => { if (!currentWorkspace) { return null; } return ( (currentWorkspace.meta.pageMetas.find( page => page.id === pageId ) as PageMeta) || null ); }, }; }; export default usePageHelper;