Skip to content
Source
Sign inSign up

thread-settings-sheet-state.ts

75 lines2.2 KB

1import type { ModelOption, ProviderGroup } from "../../lib/modelOptions";
2import type { ModelSelection, ProviderInstanceId } from "@t3tools/contracts";
3​
4export function modelFavoriteKey(provider: ProviderInstanceId, model: string): string {
5 return `${provider}:${model}`;
6}
7​
8export function favoritesFirst(
9 models: ReadonlyArray<ModelOption>,
10 favoriteKeys: ReadonlySet<string>,
11): ReadonlyArray<ModelOption> {
12 const favorites: ModelOption[] = [];
13 const others: ModelOption[] = [];
14 for (const model of models) {
15 (favoriteKeys.has(model.key) ? favorites : others).push(model);
16 }
17 return [...favorites, ...others];
19​
20export function modelMatchesCatalogQuery(input: {
21 readonly model: ModelOption;
22 readonly providerLabel: string;
23 readonly query: string;
24}): boolean {
25 const query = input.query.trim().toLocaleLowerCase();
26 if (query.length === 0) {
27 return true;
28 }
29​
30 return [
31 input.model.label,
32 input.model.subtitle,
33 input.model.selection.model,
34 input.providerLabel,
35 ].some((value) => value.toLocaleLowerCase().includes(query));
37​
38export function pendingModelAfterPress(input: {
39 readonly current: ModelOption | null;
40 readonly pressed: ModelOption;
41 readonly pressedIsApplied: boolean;
42 readonly restoreSelection?: (selection: ModelSelection) => ModelSelection;
43}): ModelOption | null {
44 if (input.pressedIsApplied) {
45 return null;
46 }
47 if (input.current?.key === input.pressed.key) {
48 return input.current;
49 }
50 return input.restoreSelection
51 ? { ...input.pressed, selection: input.restoreSelection(input.pressed.selection) }
52 : input.pressed;
54​
55export function canCommitPendingModel(
56 pending: ModelOption,
57 groups: ReadonlyArray<ProviderGroup>,
58): boolean {
59 return groups.some((group) =>
60 group.models.some(
61 (model) => model.key === pending.key && !model.isUnavailable && !model.isHidden,
62 ),
63 );
65​
66export function providerSectionIsCollapsed(input: {
67 readonly defaultExpanded: boolean;
68 readonly hasExpansionOverride: boolean;
69 readonly isNarrowed: boolean;
70}): boolean {
71 if (input.isNarrowed) {
72 return false;
73 }
74 return input.defaultExpanded ? input.hasExpansionOverride : !input.hasExpansionOverride;