mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-17 14:27:02 +08:00
- document folder - full-text search - blob storage - basic edgeless support Co-authored-by: tzhangchi <terry.zhangchi@outlook.com> Co-authored-by: QiShaoXuan <qishaoxuan777@gmail.com> Co-authored-by: DiamondThree <diamond.shx@gmail.com> Co-authored-by: MingLiang Wang <mingliangwang0o0@gmail.com> Co-authored-by: JimmFly <yangjinfei001@gmail.com> Co-authored-by: Yifeng Wang <doodlewind@toeverything.info> Co-authored-by: Himself65 <himself65@outlook.com> Co-authored-by: lawvs <18554747+lawvs@users.noreply.github.com> Co-authored-by: Qi <474021214@qq.com>
128 lines
3.8 KiB
TypeScript
128 lines
3.8 KiB
TypeScript
import { Workspace, uuidv4 } 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<string | null>;
|
|
openPage: (
|
|
pageId: string,
|
|
query?: { [key: string]: string },
|
|
newTab?: boolean
|
|
) => Promise<boolean>;
|
|
getPageMeta: (pageId: string) => PageMeta | null;
|
|
toggleDeletePage: (pageId: string) => Promise<boolean>;
|
|
toggleFavoritePage: (pageId: string) => Promise<boolean>;
|
|
permanentlyDeletePage: (pageId: string) => void;
|
|
search: (query: QueryContent) => Map<string, string | undefined>;
|
|
// changeEditorMode: (pageId: string) => void;
|
|
changePageMode: (
|
|
pageId: string,
|
|
mode: EditorContainer['mode']
|
|
) => Promise<EditorContainer['mode']>;
|
|
};
|
|
|
|
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 {
|
|
createPage: ({
|
|
pageId = uuidv4().replaceAll('-', ''),
|
|
title = '',
|
|
} = {}) => {
|
|
return new Promise(resolve => {
|
|
if (!currentWorkspace) {
|
|
return resolve(null);
|
|
}
|
|
currentWorkspace.createPage(pageId);
|
|
currentWorkspace.signals.pageAdded.once(addedPageId => {
|
|
currentWorkspace.setPageMeta(addedPageId, { title });
|
|
resolve(addedPageId);
|
|
});
|
|
});
|
|
},
|
|
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;
|