mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-16 13:57:02 +08:00
feat: bump blocksuite (#6078)
This commit is contained in:
@@ -11,14 +11,14 @@ import type { PropsWithChildren } from 'react';
|
||||
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
||||
|
||||
import { useBlockSuiteDocMeta } from '../use-block-suite-page-meta';
|
||||
import { useBlockSuiteWorkspaceHelper } from '../use-block-suite-workspace-helper';
|
||||
import { useDocCollectionHelper } from '../use-block-suite-workspace-helper';
|
||||
|
||||
const configureTestingWorkspace = async () => {
|
||||
const { workspace } = await configureTestingEnvironment();
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const docCollection = workspace.docCollection;
|
||||
|
||||
initEmptyPage(blockSuiteWorkspace.createDoc({ id: 'page1' }));
|
||||
initEmptyPage(blockSuiteWorkspace.createDoc({ id: 'page2' }));
|
||||
initEmptyPage(docCollection.createDoc({ id: 'page1' }));
|
||||
initEmptyPage(docCollection.createDoc({ id: 'page2' }));
|
||||
|
||||
return workspace;
|
||||
};
|
||||
@@ -36,31 +36,25 @@ const getWrapper = (workspace: Workspace) =>
|
||||
);
|
||||
};
|
||||
|
||||
describe('useBlockSuiteWorkspaceHelper', () => {
|
||||
describe('useDocCollectionHelper', () => {
|
||||
test('should create page', async () => {
|
||||
const workspace = await configureTestingWorkspace();
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const docCollection = workspace.docCollection;
|
||||
const Wrapper = getWrapper(workspace);
|
||||
|
||||
expect(blockSuiteWorkspace.meta.docMetas.length).toBe(3);
|
||||
const helperHook = renderHook(
|
||||
() => useBlockSuiteWorkspaceHelper(blockSuiteWorkspace),
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
}
|
||||
);
|
||||
const pageMetaHook = renderHook(
|
||||
() => useBlockSuiteDocMeta(blockSuiteWorkspace),
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
}
|
||||
);
|
||||
expect(docCollection.meta.docMetas.length).toBe(3);
|
||||
const helperHook = renderHook(() => useDocCollectionHelper(docCollection), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
const pageMetaHook = renderHook(() => useBlockSuiteDocMeta(docCollection), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
await new Promise(resolve => setTimeout(resolve));
|
||||
expect(pageMetaHook.result.current.length).toBe(3);
|
||||
expect(blockSuiteWorkspace.meta.docMetas.length).toBe(3);
|
||||
expect(docCollection.meta.docMetas.length).toBe(3);
|
||||
const page = helperHook.result.current.createDoc('page4');
|
||||
expect(page.id).toBe('page4');
|
||||
expect(blockSuiteWorkspace.meta.docMetas.length).toBe(4);
|
||||
expect(docCollection.meta.docMetas.length).toBe(4);
|
||||
pageMetaHook.rerender();
|
||||
expect(pageMetaHook.result.current.length).toBe(4);
|
||||
});
|
||||
|
||||
@@ -13,16 +13,13 @@ import { describe, expect, test, vi } from 'vitest';
|
||||
import { beforeEach } from 'vitest';
|
||||
|
||||
import { configureTestingEnvironment } from '../../testing';
|
||||
import { useBlockSuiteWorkspacePageTitle } from '../use-block-suite-workspace-page-title';
|
||||
import { useDocCollectionPageTitle } from '../use-block-suite-workspace-page-title';
|
||||
|
||||
const store = createStore();
|
||||
|
||||
const Component = () => {
|
||||
const workspace = useService(Workspace);
|
||||
const title = useBlockSuiteWorkspacePageTitle(
|
||||
workspace.blockSuiteWorkspace,
|
||||
'page0'
|
||||
);
|
||||
const title = useDocCollectionPageTitle(workspace.docCollection, 'page0');
|
||||
return <div>title: {title}</div>;
|
||||
};
|
||||
|
||||
@@ -30,7 +27,7 @@ beforeEach(async () => {
|
||||
vi.useFakeTimers({ toFake: ['requestIdleCallback'] });
|
||||
});
|
||||
|
||||
describe('useBlockSuiteWorkspacePageTitle', () => {
|
||||
describe('useDocCollectionPageTitle', () => {
|
||||
test('basic', async () => {
|
||||
const { workspace, page } = await configureTestingEnvironment();
|
||||
const { findByText, rerender } = render(
|
||||
@@ -43,7 +40,7 @@ describe('useBlockSuiteWorkspacePageTitle', () => {
|
||||
</ServiceProviderContext.Provider>
|
||||
);
|
||||
expect(await findByText('title: Untitled')).toBeDefined();
|
||||
workspace.blockSuiteWorkspace.setDocMeta(page.id, { title: '1' });
|
||||
workspace.docCollection.setDocMeta(page.id, { title: '1' });
|
||||
rerender(
|
||||
<ServiceProviderContext.Provider value={page.services}>
|
||||
<Provider store={store}>
|
||||
|
||||
@@ -17,7 +17,7 @@ import { usePublicPages } from './use-is-shared-page';
|
||||
export const useAllPageListConfig = () => {
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const { getPublicMode } = usePublicPages(currentWorkspace);
|
||||
const workspace = currentWorkspace.blockSuiteWorkspace;
|
||||
const workspace = currentWorkspace.docCollection;
|
||||
const pageMetas = useBlockSuiteDocMeta(workspace);
|
||||
const { isPreferredEdgeless } = usePageHelper(workspace);
|
||||
const pageMap = useMemo(
|
||||
@@ -25,7 +25,7 @@ export const useAllPageListConfig = () => {
|
||||
[pageMetas]
|
||||
);
|
||||
const { toggleFavorite } = useBlockSuiteMetaHelper(
|
||||
currentWorkspace.blockSuiteWorkspace
|
||||
currentWorkspace.docCollection
|
||||
);
|
||||
const t = useAFFiNEI18N();
|
||||
const onToggleFavoritePage = useCallback(
|
||||
@@ -45,7 +45,7 @@ export const useAllPageListConfig = () => {
|
||||
allPages: pageMetas,
|
||||
isEdgeless: isPreferredEdgeless,
|
||||
getPublicMode,
|
||||
workspace: currentWorkspace.blockSuiteWorkspace,
|
||||
docCollection: currentWorkspace.docCollection,
|
||||
getPage: id => pageMap[id],
|
||||
favoriteRender: page => {
|
||||
return (
|
||||
@@ -61,7 +61,7 @@ export const useAllPageListConfig = () => {
|
||||
pageMetas,
|
||||
isPreferredEdgeless,
|
||||
getPublicMode,
|
||||
currentWorkspace.blockSuiteWorkspace,
|
||||
currentWorkspace.docCollection,
|
||||
pageMap,
|
||||
onToggleFavoritePage,
|
||||
]);
|
||||
|
||||
@@ -1,22 +1,20 @@
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useBlockSuiteWorkspaceHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
|
||||
import { useDocCollectionHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
|
||||
import { CollectionService } from '@affine/core/modules/collection';
|
||||
import { PageRecordList, useService } from '@toeverything/infra';
|
||||
import { useCallback } from 'react';
|
||||
import { applyUpdate, encodeStateAsUpdate } from 'yjs';
|
||||
|
||||
import type { BlockSuiteWorkspace } from '../../shared';
|
||||
import type { DocCollection } from '../../shared';
|
||||
import { useNavigateHelper } from '../use-navigate-helper';
|
||||
import { useReferenceLinkHelper } from './use-reference-link-helper';
|
||||
|
||||
export function useBlockSuiteMetaHelper(
|
||||
blockSuiteWorkspace: BlockSuiteWorkspace
|
||||
) {
|
||||
export function useBlockSuiteMetaHelper(docCollection: DocCollection) {
|
||||
const { setDocMeta, getDocMeta, setDocReadonly, setDocTitle } =
|
||||
useDocMetaHelper(blockSuiteWorkspace);
|
||||
const { addReferenceLink } = useReferenceLinkHelper(blockSuiteWorkspace);
|
||||
const { createDoc } = useBlockSuiteWorkspaceHelper(blockSuiteWorkspace);
|
||||
useDocMetaHelper(docCollection);
|
||||
const { addReferenceLink } = useReferenceLinkHelper(docCollection);
|
||||
const { createDoc } = useDocCollectionHelper(docCollection);
|
||||
const { openPage } = useNavigateHelper();
|
||||
const collectionService = useService(CollectionService);
|
||||
const pageRecordList = useService(PageRecordList);
|
||||
@@ -82,9 +80,9 @@ export function useBlockSuiteMetaHelper(
|
||||
|
||||
const permanentlyDeletePage = useCallback(
|
||||
(pageId: string) => {
|
||||
blockSuiteWorkspace.removeDoc(pageId);
|
||||
docCollection.removeDoc(pageId);
|
||||
},
|
||||
[blockSuiteWorkspace]
|
||||
[docCollection]
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -116,7 +114,7 @@ export function useBlockSuiteMetaHelper(
|
||||
const currentPageMode = pageRecordList.record(pageId).value?.mode.value;
|
||||
const currentPageMeta = getDocMeta(pageId);
|
||||
const newPage = createDoc();
|
||||
const currentPage = blockSuiteWorkspace.getDoc(pageId);
|
||||
const currentPage = docCollection.getDoc(pageId);
|
||||
|
||||
newPage.load();
|
||||
if (!currentPageMeta || !currentPage) {
|
||||
@@ -142,10 +140,10 @@ export function useBlockSuiteMetaHelper(
|
||||
.record(newPage.id)
|
||||
.value?.setMode(currentPageMode || 'page');
|
||||
setDocTitle(newPage.id, newPageTitle);
|
||||
openPageAfterDuplication && openPage(blockSuiteWorkspace.id, newPage.id);
|
||||
openPageAfterDuplication && openPage(docCollection.id, newPage.id);
|
||||
},
|
||||
[
|
||||
blockSuiteWorkspace,
|
||||
docCollection,
|
||||
createDoc,
|
||||
getDocMeta,
|
||||
openPage,
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import type { BlockSuiteWorkspace } from '../../shared';
|
||||
import type { DocCollection } from '../../shared';
|
||||
|
||||
export function useReferenceLinkHelper(
|
||||
blockSuiteWorkspace: BlockSuiteWorkspace
|
||||
) {
|
||||
export function useReferenceLinkHelper(docCollection: DocCollection) {
|
||||
const addReferenceLink = useCallback(
|
||||
(pageId: string, referenceId: string) => {
|
||||
const page = blockSuiteWorkspace?.getDoc(pageId);
|
||||
const page = docCollection?.getDoc(pageId);
|
||||
if (!page) {
|
||||
return;
|
||||
}
|
||||
@@ -26,7 +24,7 @@ export function useReferenceLinkHelper(
|
||||
|
||||
frame && page.addBlock('affine:paragraph', { text }, frame.id);
|
||||
},
|
||||
[blockSuiteWorkspace]
|
||||
[docCollection]
|
||||
);
|
||||
|
||||
return {
|
||||
|
||||
@@ -24,9 +24,9 @@ export function useRegisterBlocksuiteEditorCommands() {
|
||||
const mode = useLiveData(page.mode);
|
||||
const t = useAFFiNEI18N();
|
||||
const workspace = useService(Workspace);
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const { getDocMeta } = useDocMetaHelper(blockSuiteWorkspace);
|
||||
const currentPage = blockSuiteWorkspace.getDoc(pageId);
|
||||
const docCollection = workspace.docCollection;
|
||||
const { getDocMeta } = useDocMetaHelper(docCollection);
|
||||
const currentPage = docCollection.getDoc(pageId);
|
||||
assertExists(currentPage);
|
||||
const pageMeta = getDocMeta(pageId);
|
||||
assertExists(pageMeta);
|
||||
@@ -43,9 +43,9 @@ export function useRegisterBlocksuiteEditorCommands() {
|
||||
}, [pageId, setPageHistoryModalState]);
|
||||
|
||||
const { toggleFavorite, restoreFromTrash, duplicate } =
|
||||
useBlockSuiteMetaHelper(blockSuiteWorkspace);
|
||||
useBlockSuiteMetaHelper(docCollection);
|
||||
const exportHandler = useExportPage(currentPage);
|
||||
const { setTrashModal } = useTrashModalHelper(blockSuiteWorkspace);
|
||||
const { setTrashModal } = useTrashModalHelper(docCollection);
|
||||
const onClickDelete = useCallback(() => {
|
||||
setTrashModal({
|
||||
open: true,
|
||||
|
||||
@@ -70,7 +70,7 @@ export function getDragItemId(
|
||||
export const useSidebarDrag = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const workspace = currentWorkspace.blockSuiteWorkspace;
|
||||
const workspace = currentWorkspace.docCollection;
|
||||
const { setTrashModal } = useTrashModalHelper(workspace);
|
||||
const { addToFavorite, removeFromFavorite } =
|
||||
useBlockSuiteMetaHelper(workspace);
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
import { toast } from '@affine/component';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import { useAtom } from 'jotai';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { trashModalAtom } from '../../atoms/trash-modal';
|
||||
import { useBlockSuiteMetaHelper } from './use-block-suite-meta-helper';
|
||||
|
||||
export function useTrashModalHelper(blocksuiteWorkspace: Workspace) {
|
||||
export function useTrashModalHelper(docCollection: DocCollection) {
|
||||
const t = useAFFiNEI18N();
|
||||
const [trashModal, setTrashModal] = useAtom(trashModalAtom);
|
||||
const { pageIds } = trashModal;
|
||||
const { removeToTrash } = useBlockSuiteMetaHelper(blocksuiteWorkspace);
|
||||
const { removeToTrash } = useBlockSuiteMetaHelper(docCollection);
|
||||
|
||||
const handleOnConfirm = useCallback(() => {
|
||||
pageIds.forEach(pageId => {
|
||||
|
||||
@@ -20,8 +20,7 @@ const useReactiveAdapter = (adapter: WorkspacePropertiesAdapter) => {
|
||||
}
|
||||
const disposables: (() => void)[] = [];
|
||||
disposables.push(
|
||||
adapter.workspace.blockSuiteWorkspace.meta.docMetaUpdated.on(observe)
|
||||
.dispose
|
||||
adapter.workspace.docCollection.meta.docMetaUpdated.on(observe).dispose
|
||||
);
|
||||
adapter.properties.observeDeep(observe);
|
||||
disposables.push(() => adapter.properties.unobserveDeep(observe));
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection, DocMeta } from '@blocksuite/store';
|
||||
import type { Atom } from 'jotai';
|
||||
import { atom, useAtomValue } from 'jotai';
|
||||
|
||||
const weakMap = new WeakMap<Workspace, Atom<DocMeta[]>>();
|
||||
const weakMap = new WeakMap<DocCollection, Atom<DocMeta[]>>();
|
||||
|
||||
// this hook is extracted from './use-block-suite-page-meta.ts' to avoid circular dependency
|
||||
export function useAllBlockSuiteDocMeta(
|
||||
blockSuiteWorkspace: Workspace
|
||||
docCollection: DocCollection
|
||||
): DocMeta[] {
|
||||
if (!weakMap.has(blockSuiteWorkspace)) {
|
||||
const baseAtom = atom<DocMeta[]>(blockSuiteWorkspace.meta.docMetas);
|
||||
weakMap.set(blockSuiteWorkspace, baseAtom);
|
||||
if (!weakMap.has(docCollection)) {
|
||||
const baseAtom = atom<DocMeta[]>(docCollection.meta.docMetas);
|
||||
weakMap.set(docCollection, baseAtom);
|
||||
baseAtom.onMount = set => {
|
||||
set(blockSuiteWorkspace.meta.docMetas);
|
||||
const dispose = blockSuiteWorkspace.meta.docMetaUpdated.on(() => {
|
||||
set(blockSuiteWorkspace.meta.docMetas);
|
||||
set(docCollection.meta.docMetas);
|
||||
const dispose = docCollection.meta.docMetaUpdated.on(() => {
|
||||
set(docCollection.meta.docMetas);
|
||||
});
|
||||
return () => {
|
||||
dispose.dispose();
|
||||
};
|
||||
};
|
||||
}
|
||||
return useAtomValue(weakMap.get(blockSuiteWorkspace) as Atom<DocMeta[]>);
|
||||
return useAtomValue(weakMap.get(docCollection) as Atom<DocMeta[]>);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, DocCollection } from '@blocksuite/store';
|
||||
import { type Atom, atom, useAtomValue } from 'jotai';
|
||||
|
||||
import { useBlockSuiteWorkspacePage } from './use-block-suite-workspace-page';
|
||||
import { useDocCollectionPage } from './use-block-suite-workspace-page';
|
||||
|
||||
const weakMap = new WeakMap<Doc, Atom<string[]>>();
|
||||
function getPageBacklinks(page: Doc): string[] {
|
||||
return page.workspace.indexer.backlink
|
||||
return page.collection.indexer.backlink
|
||||
.getBacklink(page.id)
|
||||
.map(linkNode => linkNode.pageId)
|
||||
.filter(id => id !== page.id);
|
||||
@@ -23,7 +23,7 @@ const getPageBacklinksAtom = (page: Doc | null) => {
|
||||
page.slots.ready.on(() => {
|
||||
set(getPageBacklinks(page));
|
||||
}),
|
||||
page.workspace.indexer.backlink.slots.indexUpdated.on(() => {
|
||||
page.collection.indexer.backlink.slots.indexUpdated.on(() => {
|
||||
set(getPageBacklinks(page));
|
||||
}),
|
||||
];
|
||||
@@ -38,9 +38,9 @@ const getPageBacklinksAtom = (page: Doc | null) => {
|
||||
};
|
||||
|
||||
export function useBlockSuitePageBacklinks(
|
||||
blockSuiteWorkspace: Workspace,
|
||||
pageId: string
|
||||
docCollection: DocCollection,
|
||||
docId: string
|
||||
): string[] {
|
||||
const page = useBlockSuiteWorkspacePage(blockSuiteWorkspace, pageId);
|
||||
return useAtomValue(getPageBacklinksAtom(page));
|
||||
const doc = useDocCollectionPage(docCollection, docId);
|
||||
return useAtomValue(getPageBacklinksAtom(doc));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { RootBlockModel } from '@blocksuite/blocks';
|
||||
import { assertExists } from '@blocksuite/global/utils';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection, DocMeta } from '@blocksuite/store';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
import { useAllBlockSuiteDocMeta } from './use-all-block-suite-page-meta';
|
||||
@@ -11,9 +11,9 @@ import { useJournalHelper } from './use-journal';
|
||||
* If you want to get all pageMetas, use `useAllBlockSuitePageMeta` instead
|
||||
* @returns
|
||||
*/
|
||||
export function useBlockSuiteDocMeta(blocksuiteWorkspace: Workspace) {
|
||||
const pageMetas = useAllBlockSuiteDocMeta(blocksuiteWorkspace);
|
||||
const { isPageJournal } = useJournalHelper(blocksuiteWorkspace);
|
||||
export function useBlockSuiteDocMeta(docCollection: DocCollection) {
|
||||
const pageMetas = useAllBlockSuiteDocMeta(docCollection);
|
||||
const { isPageJournal } = useJournalHelper(docCollection);
|
||||
return useMemo(
|
||||
() =>
|
||||
pageMetas.filter(
|
||||
@@ -23,11 +23,11 @@ export function useBlockSuiteDocMeta(blocksuiteWorkspace: Workspace) {
|
||||
);
|
||||
}
|
||||
|
||||
export function useDocMetaHelper(blockSuiteWorkspace: Workspace) {
|
||||
export function useDocMetaHelper(docCollection: DocCollection) {
|
||||
return useMemo(
|
||||
() => ({
|
||||
setDocTitle: (docId: string, newTitle: string) => {
|
||||
const page = blockSuiteWorkspace.getDoc(docId);
|
||||
const page = docCollection.getDoc(docId);
|
||||
assertExists(page);
|
||||
const pageBlock = page
|
||||
.getBlockByFlavour('affine:page')
|
||||
@@ -37,20 +37,20 @@ export function useDocMetaHelper(blockSuiteWorkspace: Workspace) {
|
||||
pageBlock.title.delete(0, pageBlock.title.length);
|
||||
pageBlock.title.insert(newTitle, 0);
|
||||
});
|
||||
blockSuiteWorkspace.meta.setDocMeta(docId, { title: newTitle });
|
||||
docCollection.meta.setDocMeta(docId, { title: newTitle });
|
||||
},
|
||||
setDocReadonly: (docId: string, readonly: boolean) => {
|
||||
const page = blockSuiteWorkspace.getDoc(docId);
|
||||
const page = docCollection.getDoc(docId);
|
||||
assertExists(page);
|
||||
page.awarenessStore.setReadonly(page, readonly);
|
||||
},
|
||||
setDocMeta: (docId: string, docMeta: Partial<DocMeta>) => {
|
||||
blockSuiteWorkspace.meta.setDocMeta(docId, docMeta);
|
||||
docCollection.meta.setDocMeta(docId, docMeta);
|
||||
},
|
||||
getDocMeta: (docId: string) => {
|
||||
return blockSuiteWorkspace.meta.getDocMeta(docId);
|
||||
return docCollection.meta.getDocMeta(docId);
|
||||
},
|
||||
}),
|
||||
[blockSuiteWorkspace]
|
||||
[docCollection]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, DocCollection } from '@blocksuite/store';
|
||||
import { type Atom, atom, useAtomValue } from 'jotai';
|
||||
|
||||
import { useBlockSuiteWorkspacePage } from './use-block-suite-workspace-page';
|
||||
import { useDocCollectionPage } from './use-block-suite-workspace-page';
|
||||
|
||||
const weakMap = new WeakMap<Doc, Atom<string[]>>();
|
||||
function getPageReferences(page: Doc): string[] {
|
||||
return Object.values(
|
||||
page.workspace.indexer.backlink.linkIndexMap[page.id] ?? {}
|
||||
page.collection.indexer.backlink.linkIndexMap[page.id] ?? {}
|
||||
).flatMap(linkNodes => linkNodes.map(linkNode => linkNode.pageId));
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ const getPageReferencesAtom = (page: Doc | null) => {
|
||||
page.slots.ready.on(() => {
|
||||
set(getPageReferences(page));
|
||||
}),
|
||||
page.workspace.indexer.backlink.slots.indexUpdated.on(() => {
|
||||
page.collection.indexer.backlink.slots.indexUpdated.on(() => {
|
||||
set(getPageReferences(page));
|
||||
}),
|
||||
];
|
||||
@@ -37,9 +37,9 @@ const getPageReferencesAtom = (page: Doc | null) => {
|
||||
};
|
||||
|
||||
export function useBlockSuitePageReferences(
|
||||
blockSuiteWorkspace: Workspace,
|
||||
docCollection: DocCollection,
|
||||
pageId: string
|
||||
): string[] {
|
||||
const page = useBlockSuiteWorkspacePage(blockSuiteWorkspace, pageId);
|
||||
const page = useDocCollectionPage(docCollection, pageId);
|
||||
return useAtomValue(getPageReferencesAtom(page));
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, DocCollection } from '@blocksuite/store';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
export function useBlockSuiteWorkspaceHelper(blockSuiteWorkspace: Workspace) {
|
||||
export function useDocCollectionHelper(docCollection: DocCollection) {
|
||||
return useMemo(
|
||||
() => ({
|
||||
createDoc: (pageId?: string): Doc => {
|
||||
return blockSuiteWorkspace.createDoc({ id: pageId });
|
||||
return docCollection.createDoc({ id: pageId });
|
||||
},
|
||||
}),
|
||||
[blockSuiteWorkspace]
|
||||
[docCollection]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import { assertExists } from '@blocksuite/global/utils';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import type { Atom } from 'jotai';
|
||||
import { atom, useAtomValue } from 'jotai';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { useJournalHelper, useJournalInfoHelper } from './use-journal';
|
||||
|
||||
const weakMap = new WeakMap<Workspace, Map<string, Atom<string>>>();
|
||||
const weakMap = new WeakMap<DocCollection, Map<string, Atom<string>>>();
|
||||
|
||||
function getAtom(w: Workspace, pageId: string): Atom<string> {
|
||||
function getAtom(w: DocCollection, pageId: string): Atom<string> {
|
||||
if (!weakMap.has(w)) {
|
||||
weakMap.set(w, new Map());
|
||||
}
|
||||
@@ -32,33 +32,27 @@ function getAtom(w: Workspace, pageId: string): Atom<string> {
|
||||
}
|
||||
}
|
||||
|
||||
export function useBlockSuiteWorkspacePageTitle(
|
||||
blockSuiteWorkspace: Workspace,
|
||||
export function useDocCollectionPageTitle(
|
||||
docCollection: DocCollection,
|
||||
pageId: string
|
||||
) {
|
||||
const titleAtom = getAtom(blockSuiteWorkspace, pageId);
|
||||
const titleAtom = getAtom(docCollection, pageId);
|
||||
assertExists(titleAtom);
|
||||
const title = useAtomValue(titleAtom);
|
||||
const { localizedJournalDate } = useJournalInfoHelper(
|
||||
blockSuiteWorkspace,
|
||||
pageId
|
||||
);
|
||||
const { localizedJournalDate } = useJournalInfoHelper(docCollection, pageId);
|
||||
return localizedJournalDate || title;
|
||||
}
|
||||
|
||||
// This hook is NOT reactive to the page title change
|
||||
export function useGetBlockSuiteWorkspacePageTitle(
|
||||
blockSuiteWorkspace: Workspace
|
||||
) {
|
||||
const { getLocalizedJournalDateString } =
|
||||
useJournalHelper(blockSuiteWorkspace);
|
||||
export function useGetDocCollectionPageTitle(docCollection: DocCollection) {
|
||||
const { getLocalizedJournalDateString } = useJournalHelper(docCollection);
|
||||
return useCallback(
|
||||
(pageId: string) => {
|
||||
return (
|
||||
getLocalizedJournalDateString(pageId) ||
|
||||
blockSuiteWorkspace.getDoc(pageId)?.meta?.title
|
||||
docCollection.getDoc(pageId)?.meta?.title
|
||||
);
|
||||
},
|
||||
[blockSuiteWorkspace, getLocalizedJournalDateString]
|
||||
[docCollection, getLocalizedJournalDateString]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
import { DisposableGroup } from '@blocksuite/global/utils';
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, DocCollection } from '@blocksuite/store';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
export function useBlockSuiteWorkspacePage(
|
||||
blockSuiteWorkspace: Workspace,
|
||||
export function useDocCollectionPage(
|
||||
docCollection: DocCollection,
|
||||
pageId: string | null
|
||||
): Doc | null {
|
||||
const [page, setPage] = useState(
|
||||
pageId ? blockSuiteWorkspace.getDoc(pageId) : null
|
||||
pageId ? docCollection.getDoc(pageId) : null
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const group = new DisposableGroup();
|
||||
group.add(
|
||||
blockSuiteWorkspace.slots.docAdded.on(id => {
|
||||
docCollection.slots.docAdded.on(id => {
|
||||
if (pageId === id) {
|
||||
setPage(blockSuiteWorkspace.getDoc(id));
|
||||
setPage(docCollection.getDoc(id));
|
||||
}
|
||||
})
|
||||
);
|
||||
group.add(
|
||||
blockSuiteWorkspace.slots.docRemoved.on(id => {
|
||||
docCollection.slots.docRemoved.on(id => {
|
||||
if (pageId === id) {
|
||||
setPage(null);
|
||||
}
|
||||
@@ -29,7 +29,7 @@ export function useBlockSuiteWorkspacePage(
|
||||
return () => {
|
||||
group.dispose();
|
||||
};
|
||||
}, [blockSuiteWorkspace, pageId]);
|
||||
}, [docCollection, pageId]);
|
||||
|
||||
useEffect(() => {
|
||||
if (page && !page.loaded) {
|
||||
|
||||
@@ -2,10 +2,10 @@ import { initEmptyPage } from '@toeverything/infra';
|
||||
import dayjs from 'dayjs';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
|
||||
import type { BlockSuiteWorkspace } from '../shared';
|
||||
import type { DocCollection } from '../shared';
|
||||
import { timestampToLocalDate } from '../utils';
|
||||
import { useCurrentWorkspacePropertiesAdapter } from './use-affine-adapter';
|
||||
import { useBlockSuiteWorkspaceHelper } from './use-block-suite-workspace-helper';
|
||||
import { useDocCollectionHelper } from './use-block-suite-workspace-helper';
|
||||
import { useNavigateHelper } from './use-navigate-helper';
|
||||
|
||||
type MaybeDate = Date | string | number;
|
||||
@@ -22,8 +22,8 @@ function toDayjs(j?: string | false) {
|
||||
return day;
|
||||
}
|
||||
|
||||
export const useJournalHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
const bsWorkspaceHelper = useBlockSuiteWorkspaceHelper(workspace);
|
||||
export const useJournalHelper = (docCollection: DocCollection) => {
|
||||
const bsWorkspaceHelper = useDocCollectionHelper(docCollection);
|
||||
const adapter = useCurrentWorkspacePropertiesAdapter();
|
||||
|
||||
/**
|
||||
@@ -35,7 +35,7 @@ export const useJournalHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
const title = day.format(JOURNAL_DATE_FORMAT);
|
||||
const page = bsWorkspaceHelper.createDoc();
|
||||
// set created date to match the journal date
|
||||
page.workspace.setDocMeta(page.id, {
|
||||
page.collection.setDocMeta(page.id, {
|
||||
createDate: dayjs()
|
||||
.set('year', day.year())
|
||||
.set('month', day.month())
|
||||
@@ -63,7 +63,7 @@ export const useJournalHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
const getJournalsByDate = useCallback(
|
||||
(maybeDate: MaybeDate) => {
|
||||
const day = dayjs(maybeDate);
|
||||
return Array.from(workspace.docs.values()).filter(page => {
|
||||
return Array.from(docCollection.docs.values()).filter(page => {
|
||||
const pageId = page.id;
|
||||
if (!isPageJournal(pageId)) return false;
|
||||
if (page.meta?.trash) return false;
|
||||
@@ -72,7 +72,7 @@ export const useJournalHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
return day.isSame(journalDate, 'day');
|
||||
});
|
||||
},
|
||||
[adapter, isPageJournal, workspace.docs]
|
||||
[adapter, isPageJournal, docCollection.docs]
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -150,18 +150,18 @@ export const useJournalHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
};
|
||||
|
||||
// split useJournalRouteHelper since it requires a <Route /> context, which may not work in lit
|
||||
export const useJournalRouteHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
export const useJournalRouteHelper = (docCollection: DocCollection) => {
|
||||
const navigateHelper = useNavigateHelper();
|
||||
const { getJournalByDate } = useJournalHelper(workspace);
|
||||
const { getJournalByDate } = useJournalHelper(docCollection);
|
||||
/**
|
||||
* open journal by date, create one if not exist
|
||||
*/
|
||||
const openJournal = useCallback(
|
||||
(maybeDate: MaybeDate) => {
|
||||
const page = getJournalByDate(maybeDate);
|
||||
navigateHelper.openPage(workspace.id, page.id);
|
||||
navigateHelper.openPage(docCollection.id, page.id);
|
||||
},
|
||||
[getJournalByDate, navigateHelper, workspace.id]
|
||||
[getJournalByDate, navigateHelper, docCollection.id]
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -182,7 +182,7 @@ export const useJournalRouteHelper = (workspace: BlockSuiteWorkspace) => {
|
||||
};
|
||||
|
||||
export const useJournalInfoHelper = (
|
||||
workspace: BlockSuiteWorkspace,
|
||||
docCollection: DocCollection,
|
||||
pageId?: string | null
|
||||
) => {
|
||||
const {
|
||||
@@ -190,7 +190,7 @@ export const useJournalInfoHelper = (
|
||||
getJournalDateString,
|
||||
getLocalizedJournalDateString,
|
||||
isPageTodayJournal,
|
||||
} = useJournalHelper(workspace);
|
||||
} = useJournalHelper(docCollection);
|
||||
|
||||
return useMemo(
|
||||
() => ({
|
||||
|
||||
@@ -24,7 +24,7 @@ export function useRegisterWorkspaceCommands() {
|
||||
const theme = useTheme();
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const languageHelper = useLanguageHelper();
|
||||
const pageHelper = usePageHelper(currentWorkspace.blockSuiteWorkspace);
|
||||
const pageHelper = usePageHelper(currentWorkspace.docCollection);
|
||||
const navigationHelper = useNavigateHelper();
|
||||
const [editor] = useActiveBlocksuiteEditor();
|
||||
|
||||
@@ -45,14 +45,14 @@ export function useRegisterWorkspaceCommands() {
|
||||
const unsub = registerAffineNavigationCommands({
|
||||
store,
|
||||
t,
|
||||
workspace: currentWorkspace.blockSuiteWorkspace,
|
||||
docCollection: currentWorkspace.docCollection,
|
||||
navigationHelper,
|
||||
});
|
||||
|
||||
return () => {
|
||||
unsub();
|
||||
};
|
||||
}, [store, t, currentWorkspace.blockSuiteWorkspace, navigationHelper]);
|
||||
}, [store, t, currentWorkspace.docCollection, navigationHelper]);
|
||||
|
||||
// register AffineSettingsCommands
|
||||
useEffect(() => {
|
||||
|
||||
Reference in New Issue
Block a user