Replace Vault wrapper class with precise TS types

This commit is contained in:
2025-09-07 14:06:10 -07:00
parent f832191c0b
commit d730428eb8
4 changed files with 31 additions and 30 deletions
+4 -1
View File
@@ -10,6 +10,7 @@ import Chooser from './Chooser';
import Editor from './Editor'; import Editor from './Editor';
import { HashRouter, Route, useNavigate } from '@solidjs/router'; import { HashRouter, Route, useNavigate } from '@solidjs/router';
import { defaultVault } from '../sync'; import { defaultVault } from '../sync';
import { getDocsMap } from '../vault';
interface NavbarProps { interface NavbarProps {
fileId: Accessor<string | null>; fileId: Accessor<string | null>;
@@ -32,12 +33,14 @@ function Layout(props: any) {
const navigate = useNavigate(); const navigate = useNavigate();
const [fileId, setFileId] = createSignal<string | null>(null); const [fileId, setFileId] = createSignal<string | null>(null);
const [numUpdates, setNumUpdates] = createSignal<number | null>(null); const [numUpdates, setNumUpdates] = createSignal<number | null>(null);
const docsMap = getDocsMap(defaultVault.doc);
const title = () => { const title = () => {
const id = fileId(); const id = fileId();
if (id === null) { if (id === null) {
return null; return null;
} else { } else {
return defaultVault.getDocInfo(id)?.title ?? '<invalid>'; return docsMap.get(id)?.get('title') ?? '<invalid>';
} }
}; };
+2 -1
View File
@@ -3,13 +3,14 @@ import './Chooser.css';
import { useNavbar } from './App'; import { useNavbar } from './App';
import { useNavigate } from '@solidjs/router'; import { useNavigate } from '@solidjs/router';
import { defaultVault } from '../sync'; import { defaultVault } from '../sync';
import { getDocsMap } from '../vault';
function Chooser() { function Chooser() {
const navigate = useNavigate(); const navigate = useNavigate();
const { setFileId } = useNavbar(); const { setFileId } = useNavbar();
onMount(() => setFileId(null)); onMount(() => setFileId(null));
const docsMap = defaultVault.getDocsMap(); const docsMap = getDocsMap(defaultVault.doc);
const titles: Record<string, string> = {}; const titles: Record<string, string> = {};
for (const [id, docInfo] of docsMap.entries()) { for (const [id, docInfo] of docsMap.entries()) {
titles[id] = docInfo.get('title'); titles[id] = docInfo.get('title');
+5 -4
View File
@@ -2,7 +2,7 @@ import _ from 'lodash';
import * as Y from 'yjs'; import * as Y from 'yjs';
import { openDB } from 'idb'; import { openDB } from 'idb';
import { generateId } from './util'; import { generateId } from './util';
import { Vault } from './vault'; import { getDocsMap, type DocMap } from './vault';
const DB_NAME = 'synced-docs'; const DB_NAME = 'synced-docs';
const LOCAL_UPDATE_STORE = 'local-updates'; const LOCAL_UPDATE_STORE = 'local-updates';
@@ -98,17 +98,18 @@ async function getOrCreateVaultDoc() {
if (!vaultMap.has('docs')) { if (!vaultMap.has('docs')) {
vaultMap.set('docs', new Y.Map()); vaultMap.set('docs', new Y.Map());
} }
return new Vault(vault); return vault;
} }
export const defaultVault = await getOrCreateVaultDoc(); export const defaultVault = await getOrCreateVaultDoc();
// console.log(defaultVault.doc.getMap().toJSON())
const docsMap = defaultVault.getDocsMap(); const docsMap = getDocsMap(defaultVault.doc);
if (docsMap.size === 0) { if (docsMap.size === 0) {
console.log('Running vault migration...'); console.log('Running vault migration...');
for (const oldKey of ['foo', 'bar', 'baz']) { for (const oldKey of ['foo', 'bar', 'baz']) {
const newId = generateId(); const newId = generateId();
const docInfo = new Y.Map([['title', oldKey]]); const docInfo = new Y.Map([['title', oldKey]]) as DocMap;
docsMap.set(newId, docInfo); docsMap.set(newId, docInfo);
const tx = db.transaction(LOCAL_UPDATE_STORE, 'readwrite'); const tx = db.transaction(LOCAL_UPDATE_STORE, 'readwrite');
+19 -23
View File
@@ -1,31 +1,27 @@
import type { LocalDocument } from './sync';
import * as Y from 'yjs'; import * as Y from 'yjs';
export class Vault { export type VaultMap = TypedMap<VaultMapSchema>;
doc: LocalDocument;
constructor(doc: LocalDocument) { type VaultMapSchema = {
this.doc = doc; id: string;
} docs: Y.Map<DocMap>;
getDocInfo(id: string): DocInfo | null {
const docsEntry = this.getDocsMap().get(id);
if (!docsEntry) {
return null;
}
return {
title: docsEntry.get('title'),
tags: new Set(),
}; };
}
getDocsMap(): Y.Map<Y.Map<any>> { export type DocMap = TypedMap<DocMapSchema>;
const vaultMap = this.doc.doc.getMap();
return vaultMap.get('docs') as Y.Map<any>;
}
}
export interface DocInfo { type DocMapSchema = {
title: string; title: string;
tags: Set<string>; tags: Y.Map<boolean>;
};
type TypedMap<T> = Omit<Y.Map<any>, 'get'> & {
get<K extends keyof T>(key: K): T[K];
};
export function getVaultMap(ydoc: Y.Doc): VaultMap {
return ydoc.getMap();
}
export function getDocsMap(ydoc: Y.Doc): Y.Map<DocMap> {
return getVaultMap(ydoc).get('docs');
} }