diff --git a/src/components/CodexOauthQuotaFooter.tsx b/src/components/CodexOauthQuotaFooter.tsx index be9121b58..325cf6d48 100644 --- a/src/components/CodexOauthQuotaFooter.tsx +++ b/src/components/CodexOauthQuotaFooter.tsx @@ -6,6 +6,8 @@ import { SubscriptionQuotaView } from "@/components/SubscriptionQuotaFooter"; interface CodexOauthQuotaFooterProps { meta?: ProviderMeta; inline?: boolean; + /** 是否为当前激活的供应商 */ + isCurrent?: boolean; } /** @@ -17,12 +19,13 @@ interface CodexOauthQuotaFooterProps { const CodexOauthQuotaFooter: React.FC = ({ meta, inline = false, + isCurrent = false, }) => { const { data: quota, isFetching: loading, refetch, - } = useCodexOauthQuota(meta, true); + } = useCodexOauthQuota(meta, { enabled: true, autoQuery: isCurrent }); return ( = ({ meta, inline = false, + isCurrent = false, }) => { const { t } = useTranslation(); const accountId = resolveManagedAccountId( @@ -44,7 +47,7 @@ const CopilotQuotaFooter: React.FC = ({ data: quota, isFetching: loading, refetch, - } = useCopilotQuota(accountId, true); + } = useCopilotQuota(accountId, { enabled: true, autoQuery: isCurrent }); const [now, setNow] = React.useState(Date.now()); React.useEffect(() => { diff --git a/src/components/providers/ProviderCard.tsx b/src/components/providers/ProviderCard.tsx index a79a799a5..3ceb78968 100644 --- a/src/components/providers/ProviderCard.tsx +++ b/src/components/providers/ProviderCard.tsx @@ -357,9 +357,17 @@ export function ProviderCard({
{isCopilot ? ( - + ) : isCodexOauth ? ( - + ) : isOfficial ? ( ) : hasMultiplePlans ? ( diff --git a/src/lib/query/copilot.ts b/src/lib/query/copilot.ts index fd1b58f25..cba62e052 100644 --- a/src/lib/query/copilot.ts +++ b/src/lib/query/copilot.ts @@ -13,7 +13,17 @@ export interface CopilotQuota { queriedAt: number | null; } -export function useCopilotQuota(accountId: string | null, enabled: boolean) { +export interface UseCopilotQuotaOptions { + enabled?: boolean; + /** 是否启用自动轮询(5 分钟)与窗口 focus 重取 */ + autoQuery?: boolean; +} + +export function useCopilotQuota( + accountId: string | null, + options: UseCopilotQuotaOptions = {}, +) { + const { enabled = true, autoQuery = false } = options; return useQuery({ queryKey: ["copilot", "quota", accountId ?? "default"], queryFn: async (): Promise => { @@ -44,8 +54,9 @@ export function useCopilotQuota(accountId: string | null, enabled: boolean) { }; }, enabled, - refetchInterval: REFETCH_INTERVAL, - refetchOnWindowFocus: true, + refetchInterval: autoQuery ? REFETCH_INTERVAL : false, + refetchIntervalInBackground: autoQuery, + refetchOnWindowFocus: autoQuery, staleTime: REFETCH_INTERVAL, retry: 1, }); diff --git a/src/lib/query/subscription.ts b/src/lib/query/subscription.ts index 8353fcca0..71248e7f6 100644 --- a/src/lib/query/subscription.ts +++ b/src/lib/query/subscription.ts @@ -19,6 +19,12 @@ export function useSubscriptionQuota(appId: AppId, enabled: boolean) { }); } +export interface UseCodexOauthQuotaOptions { + enabled?: boolean; + /** 是否启用自动轮询(5 分钟)与窗口 focus 重取 */ + autoQuery?: boolean; +} + /** * Codex OAuth (ChatGPT Plus/Pro 反代) 订阅额度查询 hook * @@ -30,15 +36,17 @@ export function useSubscriptionQuota(appId: AppId, enabled: boolean) { */ export function useCodexOauthQuota( meta: ProviderMeta | undefined, - enabled: boolean, + options: UseCodexOauthQuotaOptions = {}, ) { + const { enabled = true, autoQuery = false } = options; const accountId = resolveManagedAccountId(meta, PROVIDER_TYPES.CODEX_OAUTH); return useQuery({ queryKey: ["codex_oauth", "quota", accountId ?? "default"], queryFn: () => subscriptionApi.getCodexOauthQuota(accountId), enabled, - refetchInterval: REFETCH_INTERVAL, - refetchOnWindowFocus: true, + refetchInterval: autoQuery ? REFETCH_INTERVAL : false, + refetchIntervalInBackground: autoQuery, + refetchOnWindowFocus: autoQuery, staleTime: REFETCH_INTERVAL, retry: 1, });