mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-04 02:49:57 +08:00
feat: bump blocksuite (#5953)
This commit is contained in:
+8
-9
@@ -10,16 +10,15 @@ import { initEmptyPage, ServiceProviderContext } from '@toeverything/infra';
|
||||
import type { PropsWithChildren } from 'react';
|
||||
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
||||
|
||||
import { useBlockSuitePageMeta } from '../use-block-suite-page-meta';
|
||||
import { useBlockSuiteDocMeta } from '../use-block-suite-page-meta';
|
||||
import { useBlockSuiteWorkspaceHelper } from '../use-block-suite-workspace-helper';
|
||||
|
||||
const configureTestingWorkspace = async () => {
|
||||
const { workspace } = await configureTestingEnvironment();
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
|
||||
// await initEmptyPage(blockSuiteWorkspace.createPage({ id: 'page-0' }));
|
||||
initEmptyPage(blockSuiteWorkspace.createPage({ id: 'page1' }));
|
||||
initEmptyPage(blockSuiteWorkspace.createPage({ id: 'page2' }));
|
||||
initEmptyPage(blockSuiteWorkspace.createDoc({ id: 'page1' }));
|
||||
initEmptyPage(blockSuiteWorkspace.createDoc({ id: 'page2' }));
|
||||
|
||||
return workspace;
|
||||
};
|
||||
@@ -43,7 +42,7 @@ describe('useBlockSuiteWorkspaceHelper', () => {
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const Wrapper = getWrapper(workspace);
|
||||
|
||||
expect(blockSuiteWorkspace.meta.pageMetas.length).toBe(3);
|
||||
expect(blockSuiteWorkspace.meta.docMetas.length).toBe(3);
|
||||
const helperHook = renderHook(
|
||||
() => useBlockSuiteWorkspaceHelper(blockSuiteWorkspace),
|
||||
{
|
||||
@@ -51,17 +50,17 @@ describe('useBlockSuiteWorkspaceHelper', () => {
|
||||
}
|
||||
);
|
||||
const pageMetaHook = renderHook(
|
||||
() => useBlockSuitePageMeta(blockSuiteWorkspace),
|
||||
() => useBlockSuiteDocMeta(blockSuiteWorkspace),
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
}
|
||||
);
|
||||
await new Promise(resolve => setTimeout(resolve));
|
||||
expect(pageMetaHook.result.current.length).toBe(3);
|
||||
expect(blockSuiteWorkspace.meta.pageMetas.length).toBe(3);
|
||||
const page = helperHook.result.current.createPage('page4');
|
||||
expect(blockSuiteWorkspace.meta.docMetas.length).toBe(3);
|
||||
const page = helperHook.result.current.createDoc('page4');
|
||||
expect(page.id).toBe('page4');
|
||||
expect(blockSuiteWorkspace.meta.pageMetas.length).toBe(4);
|
||||
expect(blockSuiteWorkspace.meta.docMetas.length).toBe(4);
|
||||
pageMetaHook.rerender();
|
||||
expect(pageMetaHook.result.current.length).toBe(4);
|
||||
});
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ describe('useBlockSuiteWorkspacePageTitle', () => {
|
||||
</ServiceProviderContext.Provider>
|
||||
);
|
||||
expect(await findByText('title: Untitled')).toBeDefined();
|
||||
workspace.blockSuiteWorkspace.setPageMeta(page.id, { title: '1' });
|
||||
workspace.blockSuiteWorkspace.setDocMeta(page.id, { title: '1' });
|
||||
rerender(
|
||||
<ServiceProviderContext.Provider value={page.services}>
|
||||
<Provider store={store}>
|
||||
|
||||
@@ -3,9 +3,9 @@ import {
|
||||
type AllPageListConfig,
|
||||
FavoriteTag,
|
||||
} from '@affine/core/components/page-list';
|
||||
import { useBlockSuitePageMeta } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useBlockSuiteDocMeta } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { PageMeta } from '@blocksuite/store';
|
||||
import type { DocMeta } from '@blocksuite/store';
|
||||
import { Workspace } from '@toeverything/infra';
|
||||
import { useService } from '@toeverything/infra/di';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
@@ -18,7 +18,7 @@ export const useAllPageListConfig = () => {
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const { getPublicMode } = usePublicPages(currentWorkspace);
|
||||
const workspace = currentWorkspace.blockSuiteWorkspace;
|
||||
const pageMetas = useBlockSuitePageMeta(workspace);
|
||||
const pageMetas = useBlockSuiteDocMeta(workspace);
|
||||
const { isPreferredEdgeless } = usePageHelper(workspace);
|
||||
const pageMap = useMemo(
|
||||
() => Object.fromEntries(pageMetas.map(page => [page.id, page])),
|
||||
@@ -29,7 +29,7 @@ export const useAllPageListConfig = () => {
|
||||
);
|
||||
const t = useAFFiNEI18N();
|
||||
const onToggleFavoritePage = useCallback(
|
||||
(page: PageMeta) => {
|
||||
(page: DocMeta) => {
|
||||
const status = page.favorite;
|
||||
toggleFavorite(page.id);
|
||||
toast(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { usePageMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useBlockSuiteWorkspaceHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
|
||||
import { CollectionService } from '@affine/core/modules/collection';
|
||||
import { PageRecordList, useService } from '@toeverything/infra';
|
||||
@@ -13,76 +13,76 @@ import { useReferenceLinkHelper } from './use-reference-link-helper';
|
||||
export function useBlockSuiteMetaHelper(
|
||||
blockSuiteWorkspace: BlockSuiteWorkspace
|
||||
) {
|
||||
const { setPageMeta, getPageMeta, setPageReadonly, setPageTitle } =
|
||||
usePageMetaHelper(blockSuiteWorkspace);
|
||||
const { setDocMeta, getDocMeta, setDocReadonly, setDocTitle } =
|
||||
useDocMetaHelper(blockSuiteWorkspace);
|
||||
const { addReferenceLink } = useReferenceLinkHelper(blockSuiteWorkspace);
|
||||
const { createPage } = useBlockSuiteWorkspaceHelper(blockSuiteWorkspace);
|
||||
const { createDoc } = useBlockSuiteWorkspaceHelper(blockSuiteWorkspace);
|
||||
const { openPage } = useNavigateHelper();
|
||||
const collectionService = useService(CollectionService);
|
||||
const pageRecordList = useService(PageRecordList);
|
||||
|
||||
const addToFavorite = useCallback(
|
||||
(pageId: string) => {
|
||||
setPageMeta(pageId, {
|
||||
setDocMeta(pageId, {
|
||||
favorite: true,
|
||||
});
|
||||
},
|
||||
[setPageMeta]
|
||||
[setDocMeta]
|
||||
);
|
||||
const removeFromFavorite = useCallback(
|
||||
(pageId: string) => {
|
||||
setPageMeta(pageId, {
|
||||
setDocMeta(pageId, {
|
||||
favorite: false,
|
||||
});
|
||||
},
|
||||
[setPageMeta]
|
||||
[setDocMeta]
|
||||
);
|
||||
const toggleFavorite = useCallback(
|
||||
(pageId: string) => {
|
||||
const { favorite } = getPageMeta(pageId) ?? {};
|
||||
setPageMeta(pageId, {
|
||||
const { favorite } = getDocMeta(pageId) ?? {};
|
||||
setDocMeta(pageId, {
|
||||
favorite: !favorite,
|
||||
});
|
||||
},
|
||||
[getPageMeta, setPageMeta]
|
||||
[getDocMeta, setDocMeta]
|
||||
);
|
||||
|
||||
// TODO-Doma
|
||||
// "Remove" may cause ambiguity here. Consider renaming as "moveToTrash".
|
||||
const removeToTrash = useCallback(
|
||||
(pageId: string) => {
|
||||
setPageMeta(pageId, {
|
||||
setDocMeta(pageId, {
|
||||
trash: true,
|
||||
trashDate: Date.now(),
|
||||
trashRelate: undefined,
|
||||
});
|
||||
setPageReadonly(pageId, true);
|
||||
setDocReadonly(pageId, true);
|
||||
collectionService.deletePagesFromCollections([pageId]);
|
||||
},
|
||||
[collectionService, setPageMeta, setPageReadonly]
|
||||
[collectionService, setDocMeta, setDocReadonly]
|
||||
);
|
||||
|
||||
const restoreFromTrash = useCallback(
|
||||
(pageId: string) => {
|
||||
const { trashRelate } = getPageMeta(pageId) ?? {};
|
||||
const { trashRelate } = getDocMeta(pageId) ?? {};
|
||||
|
||||
if (trashRelate) {
|
||||
addReferenceLink(trashRelate, pageId);
|
||||
}
|
||||
|
||||
setPageMeta(pageId, {
|
||||
setDocMeta(pageId, {
|
||||
trash: false,
|
||||
trashDate: undefined,
|
||||
trashRelate: undefined,
|
||||
});
|
||||
setPageReadonly(pageId, false);
|
||||
setDocReadonly(pageId, false);
|
||||
},
|
||||
[addReferenceLink, getPageMeta, setPageMeta, setPageReadonly]
|
||||
[addReferenceLink, getDocMeta, setDocMeta, setDocReadonly]
|
||||
);
|
||||
|
||||
const permanentlyDeletePage = useCallback(
|
||||
(pageId: string) => {
|
||||
blockSuiteWorkspace.removePage(pageId);
|
||||
blockSuiteWorkspace.removeDoc(pageId);
|
||||
},
|
||||
[blockSuiteWorkspace]
|
||||
);
|
||||
@@ -92,11 +92,11 @@ export function useBlockSuiteMetaHelper(
|
||||
*/
|
||||
const publicPage = useCallback(
|
||||
(pageId: string) => {
|
||||
setPageMeta(pageId, {
|
||||
setDocMeta(pageId, {
|
||||
isPublic: true,
|
||||
});
|
||||
},
|
||||
[setPageMeta]
|
||||
[setDocMeta]
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -104,21 +104,21 @@ export function useBlockSuiteMetaHelper(
|
||||
*/
|
||||
const cancelPublicPage = useCallback(
|
||||
(pageId: string) => {
|
||||
setPageMeta(pageId, {
|
||||
setDocMeta(pageId, {
|
||||
isPublic: false,
|
||||
});
|
||||
},
|
||||
[setPageMeta]
|
||||
[setDocMeta]
|
||||
);
|
||||
|
||||
const duplicate = useAsyncCallback(
|
||||
async (pageId: string, openPageAfterDuplication: boolean = true) => {
|
||||
const currentPageMode = pageRecordList.record(pageId).value?.mode.value;
|
||||
const currentPageMeta = getPageMeta(pageId);
|
||||
const newPage = createPage();
|
||||
const currentPage = blockSuiteWorkspace.getPage(pageId);
|
||||
const currentPageMeta = getDocMeta(pageId);
|
||||
const newPage = createDoc();
|
||||
const currentPage = blockSuiteWorkspace.getDoc(pageId);
|
||||
|
||||
newPage.waitForLoaded();
|
||||
newPage.load();
|
||||
if (!currentPageMeta || !currentPage) {
|
||||
return;
|
||||
}
|
||||
@@ -126,7 +126,7 @@ export function useBlockSuiteMetaHelper(
|
||||
const update = encodeStateAsUpdate(currentPage.spaceDoc);
|
||||
applyUpdate(newPage.spaceDoc, update);
|
||||
|
||||
setPageMeta(newPage.id, {
|
||||
setDocMeta(newPage.id, {
|
||||
tags: currentPageMeta.tags,
|
||||
favorite: currentPageMeta.favorite,
|
||||
});
|
||||
@@ -141,17 +141,17 @@ export function useBlockSuiteMetaHelper(
|
||||
pageRecordList
|
||||
.record(newPage.id)
|
||||
.value?.setMode(currentPageMode || 'page');
|
||||
setPageTitle(newPage.id, newPageTitle);
|
||||
setDocTitle(newPage.id, newPageTitle);
|
||||
openPageAfterDuplication && openPage(blockSuiteWorkspace.id, newPage.id);
|
||||
},
|
||||
[
|
||||
blockSuiteWorkspace,
|
||||
createPage,
|
||||
getPageMeta,
|
||||
createDoc,
|
||||
getDocMeta,
|
||||
openPage,
|
||||
pageRecordList,
|
||||
setPageMeta,
|
||||
setPageTitle,
|
||||
setDocMeta,
|
||||
setDocTitle,
|
||||
]
|
||||
);
|
||||
|
||||
|
||||
@@ -5,13 +5,13 @@ import {
|
||||
import { pushNotificationAtom } from '@affine/component/notification-center';
|
||||
import { apis } from '@affine/electron-api';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { PageService } from '@blocksuite/blocks';
|
||||
import type { PageRootService } from '@blocksuite/blocks';
|
||||
import {
|
||||
HtmlTransformer,
|
||||
MarkdownTransformer,
|
||||
type PageBlockModel,
|
||||
type RootBlockModel,
|
||||
} from '@blocksuite/blocks';
|
||||
import type { Page } from '@blocksuite/store';
|
||||
import type { Doc } from '@blocksuite/store';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { nanoid } from 'nanoid';
|
||||
import { useCallback } from 'react';
|
||||
@@ -19,27 +19,27 @@ import { useCallback } from 'react';
|
||||
type ExportType = 'pdf' | 'html' | 'png' | 'markdown';
|
||||
|
||||
interface ExportHandlerOptions {
|
||||
page: Page;
|
||||
page: Doc;
|
||||
type: ExportType;
|
||||
}
|
||||
|
||||
async function exportHandler({ page, type }: ExportHandlerOptions) {
|
||||
const editorRoot = document.querySelector('editor-host');
|
||||
let pageService: PageService | null = null;
|
||||
let pageService: PageRootService | null = null;
|
||||
if (editorRoot) {
|
||||
pageService = editorRoot.spec.getService('affine:page') as PageService;
|
||||
pageService = editorRoot.spec.getService<PageRootService>('affine:page');
|
||||
}
|
||||
switch (type) {
|
||||
case 'html':
|
||||
await HtmlTransformer.exportPage(page);
|
||||
await HtmlTransformer.exportDoc(page);
|
||||
break;
|
||||
case 'markdown':
|
||||
await MarkdownTransformer.exportPage(page);
|
||||
await MarkdownTransformer.exportDoc(page);
|
||||
break;
|
||||
case 'pdf':
|
||||
if (environment.isDesktop && page.meta.mode === 'page') {
|
||||
if (environment.isDesktop && page.meta?.mode === 'page') {
|
||||
await apis?.export.savePDFFileAs(
|
||||
(page.root as PageBlockModel).title.toString()
|
||||
(page.root as RootBlockModel).title.toString()
|
||||
);
|
||||
} else {
|
||||
if (!pageService) return;
|
||||
@@ -54,7 +54,7 @@ async function exportHandler({ page, type }: ExportHandlerOptions) {
|
||||
}
|
||||
}
|
||||
|
||||
export const useExportPage = (page: Page) => {
|
||||
export const useExportPage = (page: Doc) => {
|
||||
const pushNotification = useSetAtom(pushNotificationAtom);
|
||||
const pushGlobalLoadingEvent = useSetAtom(pushGlobalLoadingEventAtom);
|
||||
const resolveGlobalLoadingEvent = useSetAtom(resolveGlobalLoadingEventAtom);
|
||||
|
||||
@@ -7,7 +7,7 @@ export function useReferenceLinkHelper(
|
||||
) {
|
||||
const addReferenceLink = useCallback(
|
||||
(pageId: string, referenceId: string) => {
|
||||
const page = blockSuiteWorkspace?.getPage(pageId);
|
||||
const page = blockSuiteWorkspace?.getDoc(pageId);
|
||||
if (!page) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { toast } from '@affine/component';
|
||||
import { usePageMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { assertExists } from '@blocksuite/global/utils';
|
||||
import { EdgelessIcon, HistoryIcon, PageIcon } from '@blocksuite/icons';
|
||||
import { Page, useLiveData, Workspace } from '@toeverything/infra';
|
||||
import { Doc, useLiveData, Workspace } from '@toeverything/infra';
|
||||
import {
|
||||
PreconditionStrategy,
|
||||
registerAffineCommand,
|
||||
@@ -19,16 +19,16 @@ import { useExportPage } from './use-export-page';
|
||||
import { useTrashModalHelper } from './use-trash-modal-helper';
|
||||
|
||||
export function useRegisterBlocksuiteEditorCommands() {
|
||||
const page = useService(Page);
|
||||
const page = useService(Doc);
|
||||
const pageId = page.id;
|
||||
const mode = useLiveData(page.mode);
|
||||
const t = useAFFiNEI18N();
|
||||
const workspace = useService(Workspace);
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const { getPageMeta } = usePageMetaHelper(blockSuiteWorkspace);
|
||||
const currentPage = blockSuiteWorkspace.getPage(pageId);
|
||||
const { getDocMeta } = useDocMetaHelper(blockSuiteWorkspace);
|
||||
const currentPage = blockSuiteWorkspace.getDoc(pageId);
|
||||
assertExists(currentPage);
|
||||
const pageMeta = getPageMeta(pageId);
|
||||
const pageMeta = getDocMeta(pageId);
|
||||
assertExists(pageMeta);
|
||||
const favorite = pageMeta.favorite ?? false;
|
||||
const trash = pageMeta.trash ?? false;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { toast } from '@affine/component';
|
||||
import type { DraggableTitleCellData } from '@affine/core/components/page-list';
|
||||
import { usePageMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { DragEndEvent, UniqueIdentifier } from '@dnd-kit/core';
|
||||
import { Workspace } from '@toeverything/infra';
|
||||
@@ -74,7 +74,7 @@ export const useSidebarDrag = () => {
|
||||
const { setTrashModal } = useTrashModalHelper(workspace);
|
||||
const { addToFavorite, removeFromFavorite } =
|
||||
useBlockSuiteMetaHelper(workspace);
|
||||
const { getPageMeta } = usePageMetaHelper(workspace);
|
||||
const { getDocMeta } = useDocMetaHelper(workspace);
|
||||
|
||||
const isDropArea = useCallback(
|
||||
(id: UniqueIdentifier | undefined, prefix: string) => {
|
||||
@@ -109,7 +109,7 @@ export const useSidebarDrag = () => {
|
||||
const processMoveToTrashDrag = useCallback(
|
||||
(e: DragEndEvent) => {
|
||||
const { pageId } = e.active.data.current as DraggableTitleCellData;
|
||||
const pageTitle = getPageMeta(pageId)?.title ?? t['Untitled']();
|
||||
const pageTitle = getDocMeta(pageId)?.title ?? t['Untitled']();
|
||||
processDrag(e, DropPrefix.SidebarTrash, pageId => {
|
||||
setTrashModal({
|
||||
open: true,
|
||||
@@ -118,13 +118,13 @@ export const useSidebarDrag = () => {
|
||||
});
|
||||
});
|
||||
},
|
||||
[getPageMeta, processDrag, setTrashModal, t]
|
||||
[getDocMeta, processDrag, setTrashModal, t]
|
||||
);
|
||||
|
||||
const processFavouritesDrag = useCallback(
|
||||
(e: DragEndEvent) => {
|
||||
const { pageId } = e.active.data.current as DraggableTitleCellData;
|
||||
const isFavourited = getPageMeta(pageId)?.favorite;
|
||||
const isFavourited = getDocMeta(pageId)?.favorite;
|
||||
const isFavouriteDrag = String(e.over?.id).startsWith(
|
||||
DropPrefix.SidebarFavorites
|
||||
);
|
||||
@@ -136,7 +136,7 @@ export const useSidebarDrag = () => {
|
||||
toast(t['com.affine.cmdk.affine.editor.add-to-favourites']());
|
||||
});
|
||||
},
|
||||
[getPageMeta, processDrag, addToFavorite, t]
|
||||
[getDocMeta, processDrag, addToFavorite, t]
|
||||
);
|
||||
|
||||
const processRemoveDrag = useCallback(
|
||||
|
||||
@@ -20,7 +20,7 @@ const useReactiveAdapter = (adapter: WorkspacePropertiesAdapter) => {
|
||||
}
|
||||
const disposables: (() => void)[] = [];
|
||||
disposables.push(
|
||||
adapter.workspace.blockSuiteWorkspace.meta.pageMetasUpdated.on(observe)
|
||||
adapter.workspace.blockSuiteWorkspace.meta.docMetaUpdated.on(observe)
|
||||
.dispose
|
||||
);
|
||||
adapter.properties.observeDeep(observe);
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
import type { PageMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { Atom } from 'jotai';
|
||||
import { atom, useAtomValue } from 'jotai';
|
||||
|
||||
const weakMap = new WeakMap<Workspace, Atom<PageMeta[]>>();
|
||||
const weakMap = new WeakMap<Workspace, Atom<DocMeta[]>>();
|
||||
|
||||
// this hook is extracted from './use-block-suite-page-meta.ts' to avoid circular dependency
|
||||
export function useAllBlockSuitePageMeta(
|
||||
export function useAllBlockSuiteDocMeta(
|
||||
blockSuiteWorkspace: Workspace
|
||||
): PageMeta[] {
|
||||
): DocMeta[] {
|
||||
if (!weakMap.has(blockSuiteWorkspace)) {
|
||||
const baseAtom = atom<PageMeta[]>(blockSuiteWorkspace.meta.pageMetas);
|
||||
const baseAtom = atom<DocMeta[]>(blockSuiteWorkspace.meta.docMetas);
|
||||
weakMap.set(blockSuiteWorkspace, baseAtom);
|
||||
baseAtom.onMount = set => {
|
||||
set(blockSuiteWorkspace.meta.pageMetas);
|
||||
const dispose = blockSuiteWorkspace.meta.pageMetasUpdated.on(() => {
|
||||
set(blockSuiteWorkspace.meta.pageMetas);
|
||||
set(blockSuiteWorkspace.meta.docMetas);
|
||||
const dispose = blockSuiteWorkspace.meta.docMetaUpdated.on(() => {
|
||||
set(blockSuiteWorkspace.meta.docMetas);
|
||||
});
|
||||
return () => {
|
||||
dispose.dispose();
|
||||
};
|
||||
};
|
||||
}
|
||||
return useAtomValue(weakMap.get(blockSuiteWorkspace) as Atom<PageMeta[]>);
|
||||
return useAtomValue(weakMap.get(blockSuiteWorkspace) as Atom<DocMeta[]>);
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
import type { Page, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import { type Atom, atom, useAtomValue } from 'jotai';
|
||||
|
||||
import { useBlockSuiteWorkspacePage } from './use-block-suite-workspace-page';
|
||||
|
||||
const weakMap = new WeakMap<Page, Atom<string[]>>();
|
||||
function getPageBacklinks(page: Page): string[] {
|
||||
const weakMap = new WeakMap<Doc, Atom<string[]>>();
|
||||
function getPageBacklinks(page: Doc): string[] {
|
||||
return page.workspace.indexer.backlink
|
||||
.getBacklink(page.id)
|
||||
.map(linkNode => linkNode.pageId)
|
||||
.filter(id => id !== page.id);
|
||||
}
|
||||
|
||||
const getPageBacklinksAtom = (page: Page | null) => {
|
||||
const getPageBacklinksAtom = (page: Doc | null) => {
|
||||
if (!page) {
|
||||
return atom([]);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import type { PageBlockModel } from '@blocksuite/blocks';
|
||||
import type { RootBlockModel } from '@blocksuite/blocks';
|
||||
import { assertExists } from '@blocksuite/global/utils';
|
||||
import type { PageMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
import { useAllBlockSuitePageMeta } from './use-all-block-suite-page-meta';
|
||||
import { useAllBlockSuiteDocMeta } from './use-all-block-suite-page-meta';
|
||||
import { useJournalHelper } from './use-journal';
|
||||
|
||||
/**
|
||||
@@ -11,8 +11,8 @@ import { useJournalHelper } from './use-journal';
|
||||
* If you want to get all pageMetas, use `useAllBlockSuitePageMeta` instead
|
||||
* @returns
|
||||
*/
|
||||
export function useBlockSuitePageMeta(blocksuiteWorkspace: Workspace) {
|
||||
const pageMetas = useAllBlockSuitePageMeta(blocksuiteWorkspace);
|
||||
export function useBlockSuiteDocMeta(blocksuiteWorkspace: Workspace) {
|
||||
const pageMetas = useAllBlockSuiteDocMeta(blocksuiteWorkspace);
|
||||
const { isPageJournal } = useJournalHelper(blocksuiteWorkspace);
|
||||
return useMemo(
|
||||
() =>
|
||||
@@ -23,32 +23,32 @@ export function useBlockSuitePageMeta(blocksuiteWorkspace: Workspace) {
|
||||
);
|
||||
}
|
||||
|
||||
export function usePageMetaHelper(blockSuiteWorkspace: Workspace) {
|
||||
export function useDocMetaHelper(blockSuiteWorkspace: Workspace) {
|
||||
return useMemo(
|
||||
() => ({
|
||||
setPageTitle: (pageId: string, newTitle: string) => {
|
||||
const page = blockSuiteWorkspace.getPage(pageId);
|
||||
setDocTitle: (docId: string, newTitle: string) => {
|
||||
const page = blockSuiteWorkspace.getDoc(docId);
|
||||
assertExists(page);
|
||||
const pageBlock = page
|
||||
.getBlockByFlavour('affine:page')
|
||||
.at(0) as PageBlockModel;
|
||||
.at(0) as RootBlockModel;
|
||||
assertExists(pageBlock);
|
||||
page.transact(() => {
|
||||
pageBlock.title.delete(0, pageBlock.title.length);
|
||||
pageBlock.title.insert(newTitle, 0);
|
||||
});
|
||||
blockSuiteWorkspace.meta.setPageMeta(pageId, { title: newTitle });
|
||||
blockSuiteWorkspace.meta.setDocMeta(docId, { title: newTitle });
|
||||
},
|
||||
setPageReadonly: (pageId: string, readonly: boolean) => {
|
||||
const page = blockSuiteWorkspace.getPage(pageId);
|
||||
setDocReadonly: (docId: string, readonly: boolean) => {
|
||||
const page = blockSuiteWorkspace.getDoc(docId);
|
||||
assertExists(page);
|
||||
page.awarenessStore.setReadonly(page, readonly);
|
||||
},
|
||||
setPageMeta: (pageId: string, pageMeta: Partial<PageMeta>) => {
|
||||
blockSuiteWorkspace.meta.setPageMeta(pageId, pageMeta);
|
||||
setDocMeta: (docId: string, docMeta: Partial<DocMeta>) => {
|
||||
blockSuiteWorkspace.meta.setDocMeta(docId, docMeta);
|
||||
},
|
||||
getPageMeta: (pageId: string) => {
|
||||
return blockSuiteWorkspace.meta.getPageMeta(pageId);
|
||||
getDocMeta: (docId: string) => {
|
||||
return blockSuiteWorkspace.meta.getDocMeta(docId);
|
||||
},
|
||||
}),
|
||||
[blockSuiteWorkspace]
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import type { Page, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import { type Atom, atom, useAtomValue } from 'jotai';
|
||||
|
||||
import { useBlockSuiteWorkspacePage } from './use-block-suite-workspace-page';
|
||||
|
||||
const weakMap = new WeakMap<Page, Atom<string[]>>();
|
||||
function getPageReferences(page: Page): string[] {
|
||||
const weakMap = new WeakMap<Doc, Atom<string[]>>();
|
||||
function getPageReferences(page: Doc): string[] {
|
||||
return Object.values(
|
||||
page.workspace.indexer.backlink.linkIndexMap[page.id] ?? {}
|
||||
).flatMap(linkNodes => linkNodes.map(linkNode => linkNode.pageId));
|
||||
}
|
||||
|
||||
const getPageReferencesAtom = (page: Page | null) => {
|
||||
const getPageReferencesAtom = (page: Doc | null) => {
|
||||
if (!page) {
|
||||
return atom([]);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import type { Page, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
export function useBlockSuiteWorkspaceHelper(blockSuiteWorkspace: Workspace) {
|
||||
return useMemo(
|
||||
() => ({
|
||||
createPage: (pageId?: string): Page => {
|
||||
return blockSuiteWorkspace.createPage({ id: pageId });
|
||||
createDoc: (pageId?: string): Doc => {
|
||||
return blockSuiteWorkspace.createDoc({ id: pageId });
|
||||
},
|
||||
}),
|
||||
[blockSuiteWorkspace]
|
||||
|
||||
@@ -15,11 +15,11 @@ function getAtom(w: Workspace, pageId: string): Atom<string> {
|
||||
const map = weakMap.get(w);
|
||||
assertExists(map);
|
||||
if (!map.has(pageId)) {
|
||||
const baseAtom = atom<string>(w.getPage(pageId)?.meta.title || 'Untitled');
|
||||
const baseAtom = atom<string>(w.getDoc(pageId)?.meta?.title || 'Untitled');
|
||||
baseAtom.onMount = set => {
|
||||
const disposable = w.meta.pageMetasUpdated.on(() => {
|
||||
const page = w.getPage(pageId);
|
||||
set(page?.meta.title || 'Untitled');
|
||||
const disposable = w.meta.docMetaUpdated.on(() => {
|
||||
const page = w.getDoc(pageId);
|
||||
set(page?.meta?.title || 'Untitled');
|
||||
});
|
||||
return () => {
|
||||
disposable.dispose();
|
||||
@@ -56,7 +56,7 @@ export function useGetBlockSuiteWorkspacePageTitle(
|
||||
(pageId: string) => {
|
||||
return (
|
||||
getLocalizedJournalDateString(pageId) ||
|
||||
blockSuiteWorkspace.getPage(pageId)?.meta.title
|
||||
blockSuiteWorkspace.getDoc(pageId)?.meta?.title
|
||||
);
|
||||
},
|
||||
[blockSuiteWorkspace, getLocalizedJournalDateString]
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
import { DisposableGroup } from '@blocksuite/global/utils';
|
||||
import type { Page, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
export function useBlockSuiteWorkspacePage(
|
||||
blockSuiteWorkspace: Workspace,
|
||||
pageId: string | null
|
||||
): Page | null {
|
||||
): Doc | null {
|
||||
const [page, setPage] = useState(
|
||||
pageId ? blockSuiteWorkspace.getPage(pageId) : null
|
||||
pageId ? blockSuiteWorkspace.getDoc(pageId) : null
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const group = new DisposableGroup();
|
||||
group.add(
|
||||
blockSuiteWorkspace.slots.pageAdded.on(id => {
|
||||
blockSuiteWorkspace.slots.docAdded.on(id => {
|
||||
if (pageId === id) {
|
||||
setPage(blockSuiteWorkspace.getPage(id));
|
||||
setPage(blockSuiteWorkspace.getDoc(id));
|
||||
}
|
||||
})
|
||||
);
|
||||
group.add(
|
||||
blockSuiteWorkspace.slots.pageRemoved.on(id => {
|
||||
blockSuiteWorkspace.slots.docRemoved.on(id => {
|
||||
if (pageId === id) {
|
||||
setPage(null);
|
||||
}
|
||||
|
||||
@@ -32,9 +32,9 @@ export const useJournalHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
const _createJournal = useCallback(
|
||||
(maybeDate: MaybeDate) => {
|
||||
const title = dayjs(maybeDate).format(JOURNAL_DATE_FORMAT);
|
||||
const page = bsWorkspaceHelper.createPage();
|
||||
const page = bsWorkspaceHelper.createDoc();
|
||||
// set created date to match the journal date
|
||||
page.workspace.setPageMeta(page.id, {
|
||||
page.workspace.setDocMeta(page.id, {
|
||||
createDate: dayjs(maybeDate).toDate().getTime(),
|
||||
});
|
||||
initEmptyPage(page, title);
|
||||
@@ -57,16 +57,16 @@ export const useJournalHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
const getJournalsByDate = useCallback(
|
||||
(maybeDate: MaybeDate) => {
|
||||
const day = dayjs(maybeDate);
|
||||
return Array.from(workspace.pages.values()).filter(page => {
|
||||
return Array.from(workspace.docs.values()).filter(page => {
|
||||
const pageId = page.id;
|
||||
if (!isPageJournal(pageId)) return false;
|
||||
if (page.meta.trash) return false;
|
||||
if (page.meta?.trash) return false;
|
||||
const journalDate = adapter.getJournalPageDateString(page.id);
|
||||
if (!journalDate) return false;
|
||||
return day.isSame(journalDate, 'day');
|
||||
});
|
||||
},
|
||||
[adapter, isPageJournal, workspace.pages]
|
||||
[adapter, isPageJournal, workspace.docs]
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user