fix(core): incorrect blocksuite data format (#4039)

This commit is contained in:
Alex Yang 2023-08-30 00:04:16 -05:00 committed by GitHub
parent 82f8ac50de
commit 00e7cf9a06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 8 deletions

View File

@ -33,8 +33,9 @@ import { usePassiveWorkspaceEffect } from '@toeverything/infra/__internal__/reac
import { currentWorkspaceIdAtom } from '@toeverything/infra/atom'; import { currentWorkspaceIdAtom } from '@toeverything/infra/atom';
import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import { useAtom, useAtomValue, useSetAtom } from 'jotai';
import type { PropsWithChildren, ReactElement } from 'react'; import type { PropsWithChildren, ReactElement } from 'react';
import { lazy, Suspense, useCallback } from 'react'; import { lazy, Suspense, useCallback, useEffect } from 'react';
import { useLocation, useParams } from 'react-router-dom'; import { useLocation, useParams } from 'react-router-dom';
import { Map as YMap } from 'yjs';
import { import {
openQuickSearchModalAtom, openQuickSearchModalAtom,
@ -134,6 +135,23 @@ export const WorkspaceLayoutInner = ({ children }: PropsWithChildren) => {
const [currentWorkspace] = useCurrentWorkspace(); const [currentWorkspace] = useCurrentWorkspace();
const { openPage } = useNavigateHelper(); const { openPage } = useNavigateHelper();
useEffect(() => {
// hotfix for blockVersions
// this is a mistake in the
// 0.8.0 ~ 0.8.1
// 0.8.0-beta.0 ~ 0.8.0-beta.3
// 0.9.0-canary.0 ~ 0.9.0-canary.3
const meta = currentWorkspace.blockSuiteWorkspace.doc.getMap('meta');
const blockVersions = meta.get('blockVersions');
if (!(blockVersions instanceof YMap)) {
console.log('fixing blockVersions');
meta.set(
'blockVersions',
new YMap(Object.entries(blockVersions as Record<string, number>))
);
}
}, [currentWorkspace.blockSuiteWorkspace.doc]);
usePassiveWorkspaceEffect(currentWorkspace.blockSuiteWorkspace); usePassiveWorkspaceEffect(currentWorkspace.blockSuiteWorkspace);
const [, setOpenWorkspacesModal] = useAtom(openWorkspacesModalAtom); const [, setOpenWorkspacesModal] = useAtom(openWorkspacesModalAtom);

View File

@ -23,6 +23,7 @@ export const loader: LoaderFunction = async () => {
const target = (lastId && meta.find(({ id }) => id === lastId)) || meta.at(0); const target = (lastId && meta.find(({ id }) => id === lastId)) || meta.at(0);
if (target) { if (target) {
const targetWorkspace = getWorkspace(target.id); const targetWorkspace = getWorkspace(target.id);
const nonTrashPages = targetWorkspace.meta.pageMetas.filter( const nonTrashPages = targetWorkspace.meta.pageMetas.filter(
({ trash }) => !trash ({ trash }) => !trash
); );

View File

@ -50,9 +50,11 @@ export const migrateToLatestDatabase = async (path: string) => {
const update = ( const update = (
await connection.getUpdates(isRoot ? undefined : doc.guid) await connection.getUpdates(isRoot ? undefined : doc.guid)
).map(update => update.data); ).map(update => update.data);
// Buffer[] -> Uint8Array // Buffer[] -> Uint8Array[]
const data = new Uint8Array(Buffer.concat(update).buffer); const data = update.map(update => new Uint8Array(update));
applyUpdate(doc, data); data.forEach(data => {
applyUpdate(doc, data);
});
// trigger data manually // trigger data manually
if (isRoot) { if (isRoot) {
doc.getMap('meta'); doc.getMap('meta');

View File

@ -1,6 +1,7 @@
import type { PageMeta, Workspace } from '@blocksuite/store'; import type { PageMeta, Workspace } from '@blocksuite/store';
import { createIndexeddbStorage } from '@blocksuite/store'; import { createIndexeddbStorage } from '@blocksuite/store';
import type { createStore, WritableAtom } from 'jotai/vanilla'; import type { createStore, WritableAtom } from 'jotai/vanilla';
import { Array as YArray, Doc as YDoc, Map as YMap } from 'yjs';
export async function buildShowcaseWorkspace( export async function buildShowcaseWorkspace(
workspace: Workspace, workspace: Workspace,
@ -27,7 +28,9 @@ export async function buildShowcaseWorkspace(
'affine:bookmark': 1, 'affine:bookmark': 1,
'affine:database': 2, 'affine:database': 2,
}; };
workspace.doc.getMap('meta').set('blockVersions', showcaseWorkspaceVersions); workspace.doc
.getMap('meta')
.set('blockVersions', new YMap(Object.entries(showcaseWorkspaceVersions)));
const prototypes = { const prototypes = {
tags: { tags: {
options: [ options: [
@ -201,7 +204,6 @@ import { applyUpdate, encodeStateAsUpdate } from 'yjs';
const migrationOrigin = 'affine-migration'; const migrationOrigin = 'affine-migration';
import type { Schema } from '@blocksuite/store'; import type { Schema } from '@blocksuite/store';
import { Array as YArray, Doc as YDoc, Map as YMap } from 'yjs';
type XYWH = [number, number, number, number]; type XYWH = [number, number, number, number];
@ -495,7 +497,11 @@ const upgradeV2ToV3 = async (options: UpgradeOptions): Promise<boolean> => {
const spaces = rootDoc.getMap('spaces') as YMap<any>; const spaces = rootDoc.getMap('spaces') as YMap<any>;
const meta = rootDoc.getMap('meta') as YMap<unknown>; const meta = rootDoc.getMap('meta') as YMap<unknown>;
const versions = meta.get('blockVersions') as YMap<number>; const versions = meta.get('blockVersions') as YMap<number>;
if (versions.get('affine:database') === 3) { if ('affine:database' in versions) {
if (versions['affine:database'] === 3) {
return false;
}
} else if (versions.get('affine:database') === 3) {
return false; return false;
} }
const schema = options.getSchema(); const schema = options.getSchema();
@ -516,7 +522,12 @@ const upgradeV2ToV3 = async (options: UpgradeOptions): Promise<boolean> => {
space space
); );
}); });
versions.set('affine:database', 3); if ('affine:database' in versions) {
versions['affine:database'] = 3;
meta.set('blockVersions', new YMap(Object.entries(versions)));
} else {
versions.set('affine:database', 3);
}
return true; return true;
}; };