Molunerfinn/PicGo · error

result.error (dynamic message propagated from RPC failure)

Error message

result.error (dynamic message propagated from RPC failure)

What it means

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.

Source

Thrown at src/renderer/queries/picgo-cloud-usage.ts:13

import { useQuery } from '@tanstack/react-query'
import type { IPicGoCloudUsage } from '#/types/cloud'
import { cloudAdapter } from '@/adapters/cloud'
import { rendererQueryClient } from './query-client'

export const PicGoCloudUsageQueryKeys = {
  usage: ['picgo-cloud', 'usage'] as const
}

async function fetchPicGoCloudUsage (): Promise<IPicGoCloudUsage | null> {
  const result = await cloudAdapter.getUsage()
  if (!result.success) {
    throw new Error(result.error)
  }
  return result.data
}

export function usePicGoCloudUsageQuery () {
  return useQuery({
    queryKey: PicGoCloudUsageQueryKeys.usage,
    queryFn: fetchPicGoCloudUsage,
    refetchOnWindowFocus: true
  })
}

export async function invalidatePicGoCloudUsageQuery () {
  await rendererQueryClient.invalidateQueries({
    queryKey: PicGoCloudUsageQueryKeys.usage
  })
}

View on GitHub (pinned to 07ec7068a5)

Solutions

  1. Check query.error.message for the code/message returned by the RPC.
  2. Map known codes with resolveCloudErrorMessage to show the right localized guidance (upgrade vs renew).
  3. Re-login if auth expired, then invalidate ['picgo-cloud','usage'].
  4. Refetch on reconnect; consider a fallback '—' rendering for usage when the query is in error state.

Example fix

null
Defensive patterns

Strategy: fallback

Validate before calling

const userInfo = rendererQueryClient.getQueryData<IPicGoCloudUserInfo | null>(['picgo-cloud', 'user-info'])
if (!userInfo) throw new Error('Login required to fetch usage')

Type guard

function isUsageResult<T>(r: { success: boolean, data?: T | null, error?: string }): r is { success: true, data: T | null } {
  return r.success === true
}

Try / catch

const usageQuery = usePicGoCloudUsageQuery()
const usage = usageQuery.isError ? null : usageQuery.data // fallback rendering
if (usageQuery.isError) {
  toast.error(resolveCloudErrorMessage(i18n.t, undefined, undefined, usageQuery.error.message))
}

Prevention

When it happens

Trigger: 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.

Common situations: Usage widget polling while offline; frozen/grace-period accounts where usage is restricted; token rotation invalidating the session; server outage.

Related errors


AI-assisted analysis of Molunerfinn/PicGo@07ec7068a5 (2026-08-30). Data as JSON: /api/errors/fe0c70a5ccfa258b. Report an issue: GitHub.