const GIS_SCRIPT = 'https://accounts.google.com/gsi/client'; let scriptPromise; /** WebView consoles print objects as [object Object]; always log a string. */ export function logError(tag, details) { let text; try { text = JSON.stringify(details, errorReplacer, 2); } catch { text = String(details); } console.error(`${tag} ${text}`); } function errorReplacer(_key, value) { if (value instanceof Error) { return { name: value.name, message: value.message, code: value.code, status: value.status, stack: value.stack, cause: value.cause, ...Object.fromEntries(Object.entries(value)), }; } return value; } function loadGoogleScript() { if (window.google?.accounts?.id) return Promise.resolve(); if (scriptPromise) return scriptPromise; scriptPromise = new Promise((resolve, reject) => { const script = document.createElement('script'); script.src = GIS_SCRIPT; script.async = true; script.defer = true; script.onload = () => resolve(); script.onerror = () => { scriptPromise = null; //