import { HttpError } from "./api"; import { markReported } from "./api/core"; import { notify } from "./notifications"; import { notifyActionError } from "./actionErrors"; import i18n from "../i18n"; // A YouTube-gated action (subscribe, sync, backfill, unsubscribe) that 403s means the user hasn't // granted the write scope — surface a "Connect" affordance instead of a vague failure. Pass // `onConnect` to offer the connect-wizard button (callers that have no wizard handle, e.g. the // channel page, just get the message). `fallbackMessage` is the already-translated non-403 error. export function notifyYouTubeActionError( err: unknown, fallbackMessage: string, onConnect?: () => void, ): void { const httpErr = err instanceof HttpError ? err : null; if (httpErr?.status === 403) { // A 403 on a YouTube write action means the write scope isn't granted — offer to connect. notify({ level: "error", message: i18n.t("channels.notify.needYouTube"), action: onConnect ? { label: i18n.t("channels.notify.connect"), onClick: onConnect } : undefined, }); markReported(err); return; } // Any other error: prefer the server's own reason (e.g. "Not enough quota left today") over the // caller's generic fallback — the useful detail was being discarded (U-3.2.8). notifyActionError(err, fallbackMessage); }