diff --git a/apps/yaak-client/tsconfig.json b/apps/yaak-client/tsconfig.json index 8d760680..ff1a9ee5 100644 --- a/apps/yaak-client/tsconfig.json +++ b/apps/yaak-client/tsconfig.json @@ -5,8 +5,6 @@ "useDefineForClassFields": true, "allowJs": false, "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, "strict": true, "noUncheckedIndexedAccess": true, "forceConsistentCasingInFileNames": true, @@ -16,7 +14,6 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - "baseUrl": ".", "paths": { "@yaakapp-internal/theme": ["../../packages/theme/src/index.ts"], "@yaakapp-internal/theme/*": ["../../packages/theme/src/*"], diff --git a/apps/yaak-proxy/rpc.ts b/apps/yaak-proxy/rpc.ts index 17b1aac9..10c01628 100644 --- a/apps/yaak-proxy/rpc.ts +++ b/apps/yaak-proxy/rpc.ts @@ -22,7 +22,9 @@ export function listen( ): () => void { let unsub: (() => void) | null = null; tauriListen(event, (e) => callback(e.payload)) - .then((fn) => (unsub = fn)) + .then((fn) => { + unsub = fn; + }) .catch(console.error); return () => unsub?.(); } diff --git a/apps/yaak-proxy/store.ts b/apps/yaak-proxy/store.ts index 0ae5d252..66b1e54f 100644 --- a/apps/yaak-proxy/store.ts +++ b/apps/yaak-proxy/store.ts @@ -1,8 +1,12 @@ import { createModelStore } from "@yaakapp-internal/model-store"; import type { HttpExchange } from "../../crates-proxy/yaak-proxy-lib/bindings/gen_models"; +type ProxyModels = { + http_exchange: HttpExchange; +}; + export const { dataAtom, applyChange, listAtom, orderedListAtom } = - createModelStore(); + createModelStore(["http_exchange"]); export const httpExchangesAtom = orderedListAtom( "http_exchange", diff --git a/packages/model-store/src/index.ts b/packages/model-store/src/index.ts index 3d24cb96..922e5058 100644 --- a/packages/model-store/src/index.ts +++ b/packages/model-store/src/index.ts @@ -1,22 +1,34 @@ import { atom } from "jotai"; import { selectAtom } from "jotai/utils"; -/** Any model must at least have an id. */ -type BaseModel = { id: string }; +/** Model map: each key is a model type name, each value is the model shape (must have id). */ +type ModelMap = Record; -/** The raw store shape: model type string → id → model instance. */ -type StoreData = Record>; +/** The store data shape derived from the model map. */ +type StoreData = { + [K in keyof M]: Record; +}; export type ModelChange = { type: "upsert" } | { type: "delete" }; -export function createModelStore() { - const dataAtom = atom>({}); +function emptyStore(keys: (keyof M)[]): StoreData { + const data = {} as StoreData; + for (const k of keys) { + data[k] = {} as Record; + } + return data; +} + +export function createModelStore( + modelTypes: (keyof M & string)[], +) { + const dataAtom = atom>(emptyStore(modelTypes)); /** Apply a single upsert or delete to the store. */ - function applyChange( + function applyChange( prev: StoreData, - modelType: string, - model: M, + modelType: K, + model: M[K], change: ModelChange, ): StoreData { if (change.type === "upsert") { @@ -32,24 +44,24 @@ export function createModelStore() { } /** Atom that selects all models of a given type as an array. */ - function listAtom(modelType: string) { + function listAtom(modelType: K) { return selectAtom( dataAtom, - (data) => Object.values(data[modelType] ?? {}), + (data) => Object.values(data[modelType] ?? {}) as M[K][], shallowEqual, ); } /** Atom that selects all models of a given type, sorted by a field. */ - function orderedListAtom( - modelType: string, - field: K, + function orderedListAtom( + modelType: K, + field: keyof M[K], order: "asc" | "desc", ) { return selectAtom( dataAtom, (data) => { - const vals = Object.values(data[modelType] ?? {}); + const vals = Object.values(data[modelType] ?? {}) as M[K][]; return vals.sort((a, b) => { const n = a[field] > b[field] ? 1 : -1; return order === "desc" ? -n : n;