refactor(core): use fractional indexing for sorting (#5809)

use https://github.com/rocicorp/fractional-indexing to enable better sorting logic for crdt app
This commit is contained in:
Peng Xiao
2024-02-22 09:37:59 +00:00
parent 372b4da884
commit 2df8f29b64
8 changed files with 157 additions and 74 deletions

View File

@@ -1,33 +1,36 @@
import type { Workspace } from '@toeverything/infra';
import { useService } from '@toeverything/infra/di';
import { use } from 'foxact/use';
import { useEffect, useMemo, useState } from 'react';
import { useDebouncedState } from 'foxact/use-debounced-state';
import { useEffect, useMemo } from 'react';
import { WorkspacePropertiesAdapter } from '../modules/workspace/properties';
import { useAllBlockSuitePageMeta } from './use-all-block-suite-page-meta';
function getProxy<T extends object>(obj: T) {
return new Proxy(obj, {});
}
const useReactiveAdapter = (adapter: WorkspacePropertiesAdapter) => {
use(adapter.workspace.blockSuiteWorkspace.doc.whenSynced);
const [proxy, setProxy] = useState(adapter);
// fixme: this is a hack to force re-render when default meta changed
useAllBlockSuitePageMeta(adapter.workspace.blockSuiteWorkspace);
// hack: delay proxy creation to avoid unnecessary re-render + render in another component issue
const [proxy, setProxy] = useDebouncedState(adapter, 0);
useEffect(() => {
// todo: track which properties are used and then filter by property path change
// using Y.YEvent.path
function observe() {
requestAnimationFrame(() => {
setProxy(getProxy(adapter));
});
setProxy(getProxy(adapter));
}
const disposables: (() => void)[] = [];
disposables.push(
adapter.workspace.blockSuiteWorkspace.meta.pageMetasUpdated.on(observe)
.dispose
);
adapter.properties.observeDeep(observe);
disposables.push(() => adapter.properties.unobserveDeep(observe));
return () => {
adapter.properties.unobserveDeep(observe);
for (const dispose of disposables) {
dispose();
}
};
}, [adapter]);
}, [adapter, setProxy]);
return proxy;
};