mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-13 21:05:19 +00:00
fix(core): properties adapter reactivitiy issue (#5661)
This commit is contained in:
@@ -51,6 +51,8 @@ beforeEach(async () => {
|
||||
|
||||
blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
|
||||
blockSuiteWorkspace.doc.emit('sync', []);
|
||||
|
||||
const initPage = async (page: Page) => {
|
||||
await page.waitForLoaded();
|
||||
expect(page).not.toBeNull();
|
||||
|
||||
@@ -1,20 +1,25 @@
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import { useAtomValue } from 'jotai';
|
||||
import { useEffect, useMemo, useReducer } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
import type { WorkspacePropertiesAdapter } from '../modules/workspace/properties';
|
||||
import {
|
||||
currentWorkspacePropertiesAdapterAtom,
|
||||
WorkspacePropertiesAdapter,
|
||||
workspaceAdapterAtomFamily,
|
||||
} from '../modules/workspace/properties';
|
||||
|
||||
function getProxy<T extends object>(obj: T) {
|
||||
return new Proxy(obj, {});
|
||||
}
|
||||
|
||||
const useReactiveAdapter = (adapter: WorkspacePropertiesAdapter) => {
|
||||
const [, forceUpdate] = useReducer(c => c + 1, 0);
|
||||
const [proxy, setProxy] = useState(adapter);
|
||||
|
||||
useEffect(() => {
|
||||
// todo: track which properties are used and then filter by property path change
|
||||
// using Y.YEvent.path
|
||||
function observe() {
|
||||
forceUpdate();
|
||||
setProxy(getProxy(adapter));
|
||||
}
|
||||
adapter.properties.observeDeep(observe);
|
||||
return () => {
|
||||
@@ -22,7 +27,7 @@ const useReactiveAdapter = (adapter: WorkspacePropertiesAdapter) => {
|
||||
};
|
||||
}, [adapter]);
|
||||
|
||||
return adapter;
|
||||
return proxy;
|
||||
};
|
||||
|
||||
export function useCurrentWorkspacePropertiesAdapter() {
|
||||
@@ -31,9 +36,6 @@ export function useCurrentWorkspacePropertiesAdapter() {
|
||||
}
|
||||
|
||||
export function useWorkspacePropertiesAdapter(workspace: Workspace) {
|
||||
const adapter = useMemo(
|
||||
() => new WorkspacePropertiesAdapter(workspace),
|
||||
[workspace]
|
||||
);
|
||||
const adapter = useAtomValue(workspaceAdapterAtomFamily(workspace));
|
||||
return useReactiveAdapter(adapter);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user