Skip to content
Source
Sign inSign up

use-model-option-memory.ts

77 lines2.0 KB

1import type { ProviderOptionSelection } from "@t3tools/contracts";
2import { appAtomRegistry } from "./atom-registry";
3import {
4 modelOptionMemoryAtom,
5 schedulePersistComposerState,
6 type ModelOptionMemoryState,
7} from "./use-composer-drafts";
8​
9function recordModelOptionsInState(
10 state: ModelOptionMemoryState,
11 instanceId: string,
12 model: string,
13 options: ReadonlyArray<ProviderOptionSelection>,
14): ModelOptionMemoryState {
15 if (options.length === 0) {
16 return state;
17 }
18 return {
19 ...state,
20 [instanceId]: {
21 ...state[instanceId],
22 [model]: options,
23 },
24 };
26​
27function lookupModelOptionsInState(
28 state: ModelOptionMemoryState,
29 instanceId: string,
30 model: string,
31): ReadonlyArray<ProviderOptionSelection> | undefined {
32 return state[instanceId]?.[model];
34​
35export function rememberModelOptions(
36 instanceId: string,
37 model: string,
38 options: ReadonlyArray<ProviderOptionSelection>,
39): void {
40 if (options.length === 0) {
41 return;
42 }
43 const current = appAtomRegistry.get(modelOptionMemoryAtom);
44 const next = recordModelOptionsInState(current, String(instanceId), model, options);
45 if (next !== current) {
46 appAtomRegistry.set(modelOptionMemoryAtom, next);
47 schedulePersistComposerState();
48 }
50​
51function rememberedModelOptions(
52 instanceId: string,
53 model: string,
54): ReadonlyArray<ProviderOptionSelection> | undefined {
55 return lookupModelOptionsInState(
56 appAtomRegistry.get(modelOptionMemoryAtom),
57 String(instanceId),
58 model,
59 );
61​
62export function withRememberedModelOptions<
63 T extends {
64 readonly instanceId: string;
65 readonly model: string;
66 readonly options?: ReadonlyArray<ProviderOptionSelection>;
67 },
68>(selection: T): T {
69 const remembered = rememberedModelOptions(selection.instanceId, selection.model);
70 if (
71 remembered === undefined ||
72 JSON.stringify(remembered) === JSON.stringify(selection.options ?? [])
73 ) {
74 return selection;
75 }
76 return { ...selection, options: remembered };