From 42f73e7a8ba1cb1d3657e66db6b5a4fba0348824 Mon Sep 17 00:00:00 2001 From: Finesssee <90105158+Finesssee@users.noreply.github.com> Date: Mon, 24 Aug 2026 23:41:28 +0700 Subject: [PATCH 1/2] Port upstream 0.55.0: refresh spend on provider updates --- .../src-tauri/src/commands/usage_spend.rs | 13 ++++++++- .../surfaces/settings/tabs/UsageSpendTab.tsx | 28 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/apps/desktop-tauri/src-tauri/src/commands/usage_spend.rs b/apps/desktop-tauri/src-tauri/src/commands/usage_spend.rs index 4ba0223a10..4de9628913 100644 --- a/apps/desktop-tauri/src-tauri/src/commands/usage_spend.rs +++ b/apps/desktop-tauri/src-tauri/src/commands/usage_spend.rs @@ -141,7 +141,18 @@ fn usage_spend_cache_key(cached: &[ProviderUsageSnapshot], selected_days: u32) - let cost = snapshot .cost .as_ref() - .map(|cost| format!("{:.8}:{}", cost.used, cost.period)) + .map(|cost| { + let daily = cost + .daily + .iter() + .map(|point| format!("{}:{:.8}", point.day, point.amount)) + .collect::>() + .join(","); + format!( + "{:.8}:{:?}:{:?}:{}:{}:{}", + cost.used, cost.limit, cost.balance, cost.currency_code, cost.period, daily + ) + }) .unwrap_or_default(); format!( "{}:{}:{}:{}", diff --git a/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx b/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx index c1e19fecc4..8e9719fdfd 100644 --- a/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx +++ b/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx @@ -1,5 +1,6 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { save } from "@tauri-apps/plugin-dialog"; +import { listen, type UnlistenFn } from "@tauri-apps/api/event"; import { useLocale } from "../../../hooks/useLocale"; import { getSettingsSnapshot, @@ -181,6 +182,33 @@ export default function UsageSpendTab(_props: TabProps) { load(false); }, [load]); + // Upstream 0.55.0 #3106 parity: provider token/cost publications refresh + // Usage & Spend silently while the pane is open. Coalesce bursts so a + // multi-provider refresh does not trigger one dashboard rebuild per event. + useEffect(() => { + let unlisten: UnlistenFn | null = null; + let timer: ReturnType | null = null; + let cancelled = false; + void listen("provider-updated", () => { + if (timer) clearTimeout(timer); + timer = setTimeout(() => { + void getUsageSpendSummary({ historyDays: selectedDays }) + .then((data) => { + if (!cancelled) setSummary(data); + }) + .catch(() => {}); + }, 200); + }).then((fn) => { + if (cancelled) fn(); + else unlisten = fn; + }).catch(() => {}); + return () => { + cancelled = true; + if (timer) clearTimeout(timer); + unlisten?.(); + }; + }, [selectedDays]); + const onShare = useCallback(() => { setShareError(null); if (!summary) { From d533330a48837138e4237325794b62bc931369f0 Mon Sep 17 00:00:00 2001 From: Finesssee <90105158+Finesssee@users.noreply.github.com> Date: Tue, 25 Aug 2026 03:58:40 +0700 Subject: [PATCH 2/2] Address thermo review findings --- .../surfaces/settings/tabs/UsageSpendTab.tsx | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx b/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx index 8e9719fdfd..1380c7b21b 100644 --- a/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx +++ b/apps/desktop-tauri/src/surfaces/settings/tabs/UsageSpendTab.tsx @@ -164,19 +164,20 @@ export default function UsageSpendTab(_props: TabProps) { }); }, []); - const load = useCallback((forceRefresh = false) => { - setLoading(true); - setError(null); - void getUsageSpendSummary({ historyDays: selectedDays, forceRefresh }) - .then((data) => { - setSummary(data); - setLoading(false); - }) - .catch((err: unknown) => { - setError(err instanceof Error ? err.message : String(err)); - setLoading(false); - }); - }, [includeOpenCodex, selectedDays]); + const load = useCallback(async (forceRefresh = false, silent = false) => { + if (!silent) { + setLoading(true); + setError(null); + } + try { + const data = await getUsageSpendSummary({ historyDays: selectedDays, forceRefresh }); + setSummary(data); + } catch (err: unknown) { + if (!silent) setError(err instanceof Error ? err.message : String(err)); + } finally { + if (!silent) setLoading(false); + } + }, [hideNativeCodex, includeOpenCodex, selectedDays]); useEffect(() => { load(false); @@ -192,11 +193,7 @@ export default function UsageSpendTab(_props: TabProps) { void listen("provider-updated", () => { if (timer) clearTimeout(timer); timer = setTimeout(() => { - void getUsageSpendSummary({ historyDays: selectedDays }) - .then((data) => { - if (!cancelled) setSummary(data); - }) - .catch(() => {}); + if (!cancelled) void load(false, true); }, 200); }).then((fn) => { if (cancelled) fn(); @@ -207,7 +204,7 @@ export default function UsageSpendTab(_props: TabProps) { if (timer) clearTimeout(timer); unlisten?.(); }; - }, [selectedDays]); + }, [load]); const onShare = useCallback(() => { setShareError(null);