From 045aefcd1344966ae25211ebd232a42d514d6651 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 27 Jun 2025 20:52:20 -0400 Subject: [PATCH] set and get provider priority --- .../panes/ProviderPrioritySettingsPane.tsx | 41 +++++++++++++++---- frontend/libs/tauri-api/src/index.ts | 1 + .../src/lib/providers/GetProviderOrder.ts | 22 ++++++++++ 3 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 frontend/libs/tauri-api/src/lib/providers/GetProviderOrder.ts diff --git a/frontend/libs/components/settings-modal/src/lib/panes/ProviderPrioritySettingsPane.tsx b/frontend/libs/components/settings-modal/src/lib/panes/ProviderPrioritySettingsPane.tsx index 7085038567..ca0d377003 100644 --- a/frontend/libs/components/settings-modal/src/lib/panes/ProviderPrioritySettingsPane.tsx +++ b/frontend/libs/components/settings-modal/src/lib/panes/ProviderPrioritySettingsPane.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { DndContext, closestCenter, @@ -21,7 +21,7 @@ import { faGripVertical, faSpinnerThird, } from "@fortawesome/pro-solid-svg-icons"; -import { SetProviderOrder, Provider } from "@storyteller/tauri-api"; +import { SetProviderOrder, Provider, GetProviderOrder } from "@storyteller/tauri-api"; interface ProviderItem { id: Provider; @@ -82,14 +82,40 @@ const SortableItem = ({ ); }; +const ProviderItemMap = { + [Provider.ArtCraft]: { id: Provider.ArtCraft, name: "ArtCraft", emoji: "🎨" }, + [Provider.Fal]: { id: Provider.Fal, name: "Fal", emoji: "🤖" }, + [Provider.Sora]: { id: Provider.Sora, name: "Sora / ChatGPT", emoji: "⚡" }, +}; + export const ProviderPrioritySettingsPane = () => { - const [items, setItems] = useState([ - { id: Provider.ArtCraft, name: "ArtCraft", emoji: "🎨" }, - { id: Provider.Fal, name: "Fal", emoji: "🤖" }, - { id: Provider.Sora, name: "Sora / ChatGPT", emoji: "⚡" }, - ]); + const [items, setItems] = useState([]); + const [isUpdating, setIsUpdating] = useState(false); + useEffect(() => { + const fetchData = async () => { + const providers = await GetProviderOrder(); + + let items: ProviderItem[] = []; + + // Add providers from backend (in order) + for (let provider of providers.payload.providers) { + items.push(ProviderItemMap[provider]); + } + + // Add providers not in backend (in order) + for (const [key, value] of Object.entries(ProviderItemMap)) { + if (!providers.payload.providers.includes(key as Provider)) { + items.push(value) + } + } + + setItems(items); + }; + fetchData(); + }, []); + const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { @@ -107,7 +133,6 @@ export const ProviderPrioritySettingsPane = () => { await SetProviderOrder({ providers: ordering }); - console.log("Provider priority updated successfully"); } catch (error) { console.error("Failed to update provider priority:", error); diff --git a/frontend/libs/tauri-api/src/index.ts b/frontend/libs/tauri-api/src/index.ts index 80b255d05a..65a0bdb3a5 100644 --- a/frontend/libs/tauri-api/src/index.ts +++ b/frontend/libs/tauri-api/src/index.ts @@ -19,4 +19,5 @@ export * from "./lib/sora/waitForSoraLogin.js"; export * from "./lib/system/GetAppInfo.js"; export * from "./lib/providers/SetProviderOrder.js"; export * from "./lib/providers/Provider.js"; +export * from "./lib/providers/GetProviderOrder.js"; diff --git a/frontend/libs/tauri-api/src/lib/providers/GetProviderOrder.ts b/frontend/libs/tauri-api/src/lib/providers/GetProviderOrder.ts new file mode 100644 index 0000000000..d7acff65d9 --- /dev/null +++ b/frontend/libs/tauri-api/src/lib/providers/GetProviderOrder.ts @@ -0,0 +1,22 @@ +import { invoke } from "@tauri-apps/api/core"; +import { CommandResult } from "../common/CommandStatus"; +import { Provider } from "./Provider"; + +export interface GetProviderOrderSuccess extends CommandResult { + payload: GetProviderOrderPayload; +} + +export interface GetProviderOrderPayload { + providers: Provider[]; +} + +// Returns the Success and Error variants directly. +// Throws on Network/Tauri errors. +export const GetProviderOrder = async () : Promise => { + try { + return await invoke("get_provider_order_command") as GetProviderOrderSuccess; + } catch (error) { + // NB: Endpoint should be infalliable + throw error; + } +}