diff --git a/src/components/CloudAccountCard.tsx b/src/components/CloudAccountCard.tsx index 37af1f8..a548a61 100644 --- a/src/components/CloudAccountCard.tsx +++ b/src/components/CloudAccountCard.tsx @@ -324,6 +324,7 @@ export function CloudAccountCard({ ); const aiCredits = account.quota?.ai_credits; + const shouldShowAiCredits = !!aiCredits && Number.isFinite(aiCredits.credits) && aiCredits.credits >= 0; const formatCreditsExpiry = (expiryDate: string) => { if (!expiryDate) return ''; @@ -369,7 +370,7 @@ export function CloudAccountCard({ {account.email} - {aiCredits && aiCredits.credits > 0 && ( + {shouldShowAiCredits && aiCredits && (
${aiCredits.credits.toFixed(2)} {aiCredits.expiryDate && ( @@ -623,6 +624,7 @@ export function CompactCloudAccountCard({ ); const aiCredits = account.quota?.ai_credits; + const shouldShowAiCredits = !!aiCredits && Number.isFinite(aiCredits.credits) && aiCredits.credits >= 0; const formatCreditsExpiry = (expiryDate: string) => { if (!expiryDate) return ''; @@ -672,7 +674,7 @@ export function CompactCloudAccountCard({
{account.email} - {aiCredits && aiCredits.credits > 0 && ( + {shouldShowAiCredits && aiCredits && ( ${aiCredits.credits.toFixed(2)} {aiCredits.expiryDate && ( diff --git a/src/components/CloudAccountList.tsx b/src/components/CloudAccountList.tsx index b4bbf1a..966a6e7 100644 --- a/src/components/CloudAccountList.tsx +++ b/src/components/CloudAccountList.tsx @@ -280,7 +280,21 @@ export function CloudAccountList() { refreshMutation.mutate( { accountId: id }, { - onSuccess: () => toast({ title: t('cloud.toast.quotaRefreshed') }), + onSuccess: (updatedAccount) => { + const credits = updatedAccount.quota?.ai_credits?.credits; + if (typeof credits === 'number') { + toast({ + title: t('cloud.toast.quotaRefreshed'), + description: `AI credits: $${credits.toFixed(2)}`, + }); + return; + } + + toast({ + title: t('cloud.toast.quotaRefreshed'), + description: 'AI credits not available for this refresh.', + }); + }, onError: () => toast({ title: t('cloud.toast.refreshFailed'), variant: 'destructive' }), }, ); diff --git a/src/ipc/cloud/handler.ts b/src/ipc/cloud/handler.ts index b730028..bd391b2 100644 --- a/src/ipc/cloud/handler.ts +++ b/src/ipc/cloud/handler.ts @@ -86,8 +86,18 @@ export async function addGoogleAccount(authCode: string): Promise try { const quota = await GoogleAPIService.fetchQuota(account.token.access_token); + try { + const aiCredits = await GoogleAPIService.fetchAICredits(account.token.access_token); + if (aiCredits) { + quota.ai_credits = aiCredits; + } else { + logger.info(`No AI credits returned for ${account.email} during initial sync`); + } + } catch (e) { + logger.warn('Failed to fetch initial AI credits', e); + } account.quota = quota; - await CloudAccountRepo.updateQuota(account.id, quota); + await CloudAccountRepo.updateQuota(account.id, account.quota); notifyTrayUpdate(account); } catch (e) { logger.warn('Failed to fetch initial quota', e); @@ -135,9 +145,8 @@ export async function refreshAccountQuota(accountId: string): Promise setTimeout(r, 1000)); const quota = await GoogleAPIService.fetchQuota(accessToken, account.proxy_url); + const previousAICredits = account.quota?.ai_credits; try { const aiCredits = await GoogleAPIService.fetchAICredits(accessToken, account.proxy_url); if (aiCredits) { quota.ai_credits = aiCredits; + } else if (previousAICredits) { + quota.ai_credits = previousAICredits; } } catch (creditError) { logger.warn(`Monitor: Failed to fetch credits for ${account.email}`, creditError); + if (previousAICredits) { + quota.ai_credits = previousAICredits; + } } // 3. Update DB