mirror of
https://github.com/toeverything/AFFiNE.git
synced 2024-12-22 21:51:39 +03:00
fix: reduce pageMeta instance (#2222)
This commit is contained in:
parent
b3a3911cea
commit
1e84ad1484
@ -19,9 +19,9 @@ beforeEach(() => {
|
||||
})
|
||||
.register(AffineSchemas)
|
||||
.register(__unstableSchemas);
|
||||
initPage(blockSuiteWorkspace.createPage('page0'));
|
||||
initPage(blockSuiteWorkspace.createPage('page1'));
|
||||
initPage(blockSuiteWorkspace.createPage('page2'));
|
||||
initPage(blockSuiteWorkspace.createPage({ id: 'page0' }));
|
||||
initPage(blockSuiteWorkspace.createPage({ id: 'page1' }));
|
||||
initPage(blockSuiteWorkspace.createPage({ id: 'page2' }));
|
||||
});
|
||||
|
||||
describe('useBlockSuiteWorkspaceHelper', () => {
|
||||
|
@ -1,7 +1,9 @@
|
||||
import type { PageBlockModel } from '@blocksuite/blocks';
|
||||
import type { PageMeta, Workspace } from '@blocksuite/store';
|
||||
import { assertExists } from '@blocksuite/store';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import type { Atom } from 'jotai';
|
||||
import { atom, useAtomValue } from 'jotai';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
declare module '@blocksuite/store' {
|
||||
interface PageMeta {
|
||||
@ -19,30 +21,24 @@ declare module '@blocksuite/store' {
|
||||
}
|
||||
}
|
||||
|
||||
const weakMap = new WeakMap<Workspace, Atom<PageMeta[]>>();
|
||||
|
||||
export function useBlockSuitePageMeta(
|
||||
blockSuiteWorkspace: Workspace
|
||||
): PageMeta[] {
|
||||
const [pageMeta, setPageMeta] = useState<PageMeta[]>(
|
||||
() => blockSuiteWorkspace?.meta.pageMetas ?? []
|
||||
);
|
||||
const [prev, setPrev] = useState(() => blockSuiteWorkspace);
|
||||
if (prev !== blockSuiteWorkspace) {
|
||||
setPrev(blockSuiteWorkspace);
|
||||
if (blockSuiteWorkspace) {
|
||||
setPageMeta(blockSuiteWorkspace.meta.pageMetas);
|
||||
}
|
||||
}
|
||||
useEffect(() => {
|
||||
if (blockSuiteWorkspace) {
|
||||
if (!weakMap.has(blockSuiteWorkspace)) {
|
||||
const baseAtom = atom<PageMeta[]>(blockSuiteWorkspace.meta.pageMetas);
|
||||
weakMap.set(blockSuiteWorkspace, baseAtom);
|
||||
baseAtom.onMount = set => {
|
||||
const dispose = blockSuiteWorkspace.meta.pageMetasUpdated.on(() => {
|
||||
setPageMeta(blockSuiteWorkspace.meta.pageMetas);
|
||||
set(blockSuiteWorkspace.meta.pageMetas);
|
||||
});
|
||||
return () => {
|
||||
dispose.dispose();
|
||||
};
|
||||
}
|
||||
}, [blockSuiteWorkspace]);
|
||||
return pageMeta;
|
||||
};
|
||||
}
|
||||
return useAtomValue(weakMap.get(blockSuiteWorkspace) as Atom<PageMeta[]>);
|
||||
}
|
||||
|
||||
export function usePageMetaHelper(blockSuiteWorkspace: Workspace) {
|
||||
|
Loading…
Reference in New Issue
Block a user