diff --git a/src/components/App.tsx b/src/components/App.tsx index 2ae71c9..80c1d0c 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -10,6 +10,7 @@ import Chooser from './Chooser'; import Editor from './Editor'; import { HashRouter, Route, useNavigate } from '@solidjs/router'; import { defaultVault } from '../sync'; +import { getDocsMap } from '../vault'; interface NavbarProps { fileId: Accessor; @@ -32,12 +33,14 @@ function Layout(props: any) { const navigate = useNavigate(); const [fileId, setFileId] = createSignal(null); const [numUpdates, setNumUpdates] = createSignal(null); + const docsMap = getDocsMap(defaultVault.doc); + const title = () => { const id = fileId(); if (id === null) { return null; } else { - return defaultVault.getDocInfo(id)?.title ?? ''; + return docsMap.get(id)?.get('title') ?? ''; } }; diff --git a/src/components/Chooser.tsx b/src/components/Chooser.tsx index f680db1..e5f1d66 100644 --- a/src/components/Chooser.tsx +++ b/src/components/Chooser.tsx @@ -3,13 +3,14 @@ import './Chooser.css'; import { useNavbar } from './App'; import { useNavigate } from '@solidjs/router'; import { defaultVault } from '../sync'; +import { getDocsMap } from '../vault'; function Chooser() { const navigate = useNavigate(); const { setFileId } = useNavbar(); onMount(() => setFileId(null)); - const docsMap = defaultVault.getDocsMap(); + const docsMap = getDocsMap(defaultVault.doc); const titles: Record = {}; for (const [id, docInfo] of docsMap.entries()) { titles[id] = docInfo.get('title'); diff --git a/src/sync.ts b/src/sync.ts index 278eb25..536e396 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -2,7 +2,7 @@ import _ from 'lodash'; import * as Y from 'yjs'; import { openDB } from 'idb'; import { generateId } from './util'; -import { Vault } from './vault'; +import { getDocsMap, type DocMap } from './vault'; const DB_NAME = 'synced-docs'; const LOCAL_UPDATE_STORE = 'local-updates'; @@ -98,17 +98,18 @@ async function getOrCreateVaultDoc() { if (!vaultMap.has('docs')) { vaultMap.set('docs', new Y.Map()); } - return new Vault(vault); + return vault; } export const defaultVault = await getOrCreateVaultDoc(); +// console.log(defaultVault.doc.getMap().toJSON()) -const docsMap = defaultVault.getDocsMap(); +const docsMap = getDocsMap(defaultVault.doc); if (docsMap.size === 0) { console.log('Running vault migration...'); for (const oldKey of ['foo', 'bar', 'baz']) { const newId = generateId(); - const docInfo = new Y.Map([['title', oldKey]]); + const docInfo = new Y.Map([['title', oldKey]]) as DocMap; docsMap.set(newId, docInfo); const tx = db.transaction(LOCAL_UPDATE_STORE, 'readwrite'); diff --git a/src/vault.ts b/src/vault.ts index 47d0e74..330aa7b 100644 --- a/src/vault.ts +++ b/src/vault.ts @@ -1,31 +1,27 @@ -import type { LocalDocument } from './sync'; import * as Y from 'yjs'; -export class Vault { - doc: LocalDocument; +export type VaultMap = TypedMap; - constructor(doc: LocalDocument) { - this.doc = doc; - } +type VaultMapSchema = { + id: string; + docs: Y.Map; +}; - getDocInfo(id: string): DocInfo | null { - const docsEntry = this.getDocsMap().get(id); - if (!docsEntry) { - return null; - } - return { - title: docsEntry.get('title'), - tags: new Set(), - }; - } +export type DocMap = TypedMap; - getDocsMap(): Y.Map> { - const vaultMap = this.doc.doc.getMap(); - return vaultMap.get('docs') as Y.Map; - } -} - -export interface DocInfo { +type DocMapSchema = { title: string; - tags: Set; + tags: Y.Map; +}; + +type TypedMap = Omit, 'get'> & { + get(key: K): T[K]; +}; + +export function getVaultMap(ydoc: Y.Doc): VaultMap { + return ydoc.getMap(); +} + +export function getDocsMap(ydoc: Y.Doc): Y.Map { + return getVaultMap(ydoc).get('docs'); }