{"record":{"id":"fe0c70a5ccfa258b","repo":"Molunerfinn/PicGo","slug":"result-error-dynamic-message-propagated-from-rpc-fe0c70","errorCode":null,"errorMessage":"result.error (dynamic message propagated from RPC failure)","messagePattern":"result\\.error \\(dynamic message propagated from RPC failure\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/renderer/queries/picgo-cloud-usage.ts","lineNumber":13,"sourceCode":"import { useQuery } from '@tanstack/react-query'\nimport type { IPicGoCloudUsage } from '#/types/cloud'\nimport { cloudAdapter } from '@/adapters/cloud'\nimport { rendererQueryClient } from './query-client'\n\nexport const PicGoCloudUsageQueryKeys = {\n  usage: ['picgo-cloud', 'usage'] as const\n}\n\nasync function fetchPicGoCloudUsage (): Promise<IPicGoCloudUsage | null> {\n  const result = await cloudAdapter.getUsage()\n  if (!result.success) {\n    throw new Error(result.error)\n  }\n  return result.data\n}\n\nexport function usePicGoCloudUsageQuery () {\n  return useQuery({\n    queryKey: PicGoCloudUsageQueryKeys.usage,\n    queryFn: fetchPicGoCloudUsage,\n    refetchOnWindowFocus: true\n  })\n}\n\nexport async function invalidatePicGoCloudUsageQuery () {\n  await rendererQueryClient.invalidateQueries({\n    queryKey: PicGoCloudUsageQueryKeys.usage\n  })\n}\n","sourceCodeStart":1,"sourceCodeEnd":31,"githubUrl":"https://github.com/Molunerfinn/PicGo/blob/07ec7068a5512344da093d49a8408fa63ba3421e/src/renderer/queries/picgo-cloud-usage.ts#L1-L31","documentation":"fetchPicGoCloudUsage throws Error(result.error) when the PICGO_CLOUD_GET_USAGE RPC via cloudAdapter.getUsage() reports success:false, propagating the dynamic main-process error text into the React Query error state. The fetcher returns IPicGoCloudUsage | null on success, so only real RPC failures throw.","triggerScenarios":"Usage RPC fails: no/expired PicGo Cloud session, quota or lifecycle error codes from picgo-hub (QUOTA_EXCEEDED, ACCOUNT_FROZEN), network failure, or main-process handler error.","commonSituations":"Usage widget polling while offline; frozen/grace-period accounts where usage is restricted; token rotation invalidating the session; server outage.","solutions":["Check query.error.message for the code/message returned by the RPC.","Map known codes with resolveCloudErrorMessage to show the right localized guidance (upgrade vs renew).","Re-login if auth expired, then invalidate ['picgo-cloud','usage'].","Refetch on reconnect; consider a fallback '—' rendering for usage when the query is in error state."],"exampleFix":"null","handlingStrategy":"fallback","validationCode":"const userInfo = rendererQueryClient.getQueryData<IPicGoCloudUserInfo | null>(['picgo-cloud', 'user-info'])\nif (!userInfo) throw new Error('Login required to fetch usage')","typeGuard":"function isUsageResult<T>(r: { success: boolean, data?: T | null, error?: string }): r is { success: true, data: T | null } {\n  return r.success === true\n}","tryCatchPattern":"const usageQuery = usePicGoCloudUsageQuery()\nconst usage = usageQuery.isError ? null : usageQuery.data // fallback rendering\nif (usageQuery.isError) {\n  toast.error(resolveCloudErrorMessage(i18n.t, undefined, undefined, usageQuery.error.message))\n}","preventionTips":["Render '—' or a retry button when the usage query errors instead of assuming data exists.","Map QUOTA_EXCEEDED / lifecycle codes via resolveCloudErrorMessage for clear guidance.","Re-authenticate and invalidate ['picgo-cloud','usage'] after auth errors.","Avoid tight polling; refetch on window focus to reduce transient failures."],"tags":["rpc","react-query","quota","network"],"backgroundTag":"rpc-error-propagation","analyzedSha":"07ec7068a5512344da093d49a8408fa63ba3421e","analyzedAt":"2026-08-30T01:45:22.289Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}