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