Replace Vault wrapper class with precise TS types
This commit is contained in:
@@ -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>';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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');
|
||||||
|
|||||||
+20
-24
@@ -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 {
|
export type DocMap = TypedMap<DocMapSchema>;
|
||||||
const docsEntry = this.getDocsMap().get(id);
|
|
||||||
if (!docsEntry) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
title: docsEntry.get('title'),
|
|
||||||
tags: new Set(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
getDocsMap(): Y.Map<Y.Map<any>> {
|
type DocMapSchema = {
|
||||||
const vaultMap = this.doc.doc.getMap();
|
|
||||||
return vaultMap.get('docs') as Y.Map<any>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DocInfo {
|
|
||||||
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');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user