Files
AFFiNE-Mirror/blocksuite/playground/apps/_common/history.ts
2024-12-20 15:38:06 +08:00

63 lines
1.6 KiB
TypeScript

import type { DocModeProvider } from '@blocksuite/blocks';
import { assertExists } from '@blocksuite/global/utils';
import type { AffineEditorContainer } from '@blocksuite/presets';
import type { BlockCollection, Doc, DocCollection } from '@blocksuite/store';
import type { LitElement } from 'lit';
export function getDocFromUrlParams(collection: DocCollection, url: URL) {
let doc: Doc | null = null;
const docId = decodeURIComponent(url.hash.slice(1));
if (docId) {
doc = collection.getDoc(docId);
}
if (!doc) {
const blockCollection = collection.docs.values().next()
.value as BlockCollection;
assertExists(blockCollection, 'Need to create a doc first');
doc = blockCollection.getDoc();
}
doc.load();
doc.resetHistory();
assertExists(doc.ready, 'Doc is not ready');
assertExists(doc.root, 'Doc root is not ready');
return doc;
}
export function setDocModeFromUrlParams(
service: DocModeProvider,
search: URLSearchParams,
docId: string
) {
const paramMode = search.get('mode');
if (paramMode) {
const docMode = paramMode === 'page' ? 'page' : 'edgeless';
service.setPrimaryMode(docMode, docId);
service.setEditorMode(docMode);
}
}
export function listenHashChange(
collection: DocCollection,
editor: AffineEditorContainer,
panel?: LitElement
) {
window.addEventListener('hashchange', () => {
const url = new URL(location.toString());
const doc = getDocFromUrlParams(collection, url);
if (!doc) return;
if (panel?.checkVisibility()) {
panel.requestUpdate();
}
editor.doc = doc;
editor.doc.load();
editor.doc.resetHistory();
});
}