{"version":3,"sources":["../../src/hooks/useGoogleCalendarConnect.ts"],"names":[],"mappings":"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","file":"useGoogleCalendarConnect.mjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n  resolveSchedulingBasePath,\n  schedulingGet,\n  schedulingPost,\n  SchedulingClientError,\n} from '../lib/schedulingClient';\nimport type { SchedulingCalendarSummary } from '../types/scheduling';\n\nexport type GoogleCalendarConnectStatus =\n  | 'unknown'\n  | 'disconnected'\n  | 'connected'\n  | 'connecting';\n\nexport interface UseGoogleCalendarConnectOptions {\n  /** Override the API base path. Default: auto-detect via resolveSchedulingBasePath(). */\n  apiBase?: string;\n  /**\n   * Override the path to the calendars list endpoint, relative to apiBase.\n   * Default: '/admin/google/calendars'.\n   *\n   * Per Phase C-2 the per-site UI may instead read availableCalendars from\n   * the project's `/_bffless/integrations` endpoint — consumers that want\n   * that wiring should override this and the `oauthStartPath` below.\n   */\n  calendarsPath?: string;\n  /**\n   * Override the path that initiates the OAuth handoff. Default:\n   * '/admin/google/oauth/start'. The endpoint is expected to return either\n   * a JSON `{ authUrl }` or a 302 redirect; the hook handles both.\n   */\n  oauthStartPath?: string;\n  /** Skip the initial status probe (e.g. SSR). */\n  skipInitialLoad?: boolean;\n}\n\nexport interface UseGoogleCalendarConnectResult {\n  status: GoogleCalendarConnectStatus;\n  connectedEmail: string | null;\n  availableCalendars: SchedulingCalendarSummary[];\n  error: string | null;\n\n  refresh: () => Promise<void>;\n  start: () => Promise<void>;\n}\n\ninterface CalendarsResponse {\n  // Servers are inconsistent — accept whichever shape the per-site or CE\n  // endpoint returns.\n  email?: string | null;\n  connectedEmail?: string | null;\n  calendars?: SchedulingCalendarSummary[];\n  availableCalendars?: SchedulingCalendarSummary[];\n}\n\ninterface OAuthStartResponse {\n  authUrl?: string;\n  url?: string;\n}\n\nexport function useGoogleCalendarConnect(\n  opts: UseGoogleCalendarConnectOptions = {},\n): UseGoogleCalendarConnectResult {\n  const basePath = useMemo(\n    () => opts.apiBase ?? resolveSchedulingBasePath(),\n    [opts.apiBase],\n  );\n  const calendarsPath = opts.calendarsPath ?? '/admin/google/calendars';\n  const oauthStartPath = opts.oauthStartPath ?? '/admin/google/oauth/start';\n\n  const [status, setStatus] = useState<GoogleCalendarConnectStatus>('unknown');\n  const [connectedEmail, setConnectedEmail] = useState<string | null>(null);\n  const [availableCalendars, setAvailableCalendars] = useState<\n    SchedulingCalendarSummary[]\n  >([]);\n  const [error, setError] = useState<string | null>(null);\n\n  const inFlightRef = useRef(false);\n\n  const setErr = useCallback((err: unknown, fallback: string) => {\n    if (err instanceof SchedulingClientError) setError(err.message);\n    else if (err instanceof Error) setError(err.message);\n    else setError(fallback);\n  }, []);\n\n  const refresh = useCallback(async () => {\n    if (inFlightRef.current) return;\n    inFlightRef.current = true;\n    try {\n      const data = await schedulingGet<CalendarsResponse>(\n        basePath,\n        calendarsPath,\n        undefined,\n        // 401 = not connected; 404 = no per-site endpoint at all (Google\n        // managed exclusively in CE Settings — common when consumers pass\n        // externalSetupUrl and never provision a per-site calendars pipeline).\n        // Either way: render the disconnected card, don't throw.\n        { treat401AsEmpty: true, treat404AsEmpty: true },\n      );\n      if (!data) {\n        setStatus('disconnected');\n        setConnectedEmail(null);\n        setAvailableCalendars([]);\n        setError(null);\n        return;\n      }\n      const calendars = data.calendars ?? data.availableCalendars ?? [];\n      const email = data.email ?? data.connectedEmail ?? null;\n      setAvailableCalendars(calendars);\n      setConnectedEmail(email);\n      setStatus(calendars.length > 0 || email ? 'connected' : 'disconnected');\n      setError(null);\n    } catch (err) {\n      // Treat any non-401 error as \"still unknown\" — better than flipping to\n      // disconnected and hiding a transient outage from the consumer.\n      setErr(err, 'Failed to check Google Calendar status.');\n    } finally {\n      inFlightRef.current = false;\n    }\n  }, [basePath, calendarsPath, setErr]);\n\n  useEffect(() => {\n    if (opts.skipInitialLoad) return;\n    refresh();\n  }, [refresh, opts.skipInitialLoad]);\n\n  const start = useCallback(async () => {\n    setStatus('connecting');\n    setError(null);\n    try {\n      const data = await schedulingPost<OAuthStartResponse>(\n        basePath,\n        oauthStartPath,\n      );\n      const url = data?.authUrl ?? data?.url;\n      if (typeof window === 'undefined') {\n        // SSR fallback — surface the URL via error so the caller can render\n        // an anchor instead.\n        if (url) setError(`Open ${url} to connect Google.`);\n        else setError('Could not start Google OAuth.');\n        return;\n      }\n      if (url) {\n        window.location.assign(url);\n      } else {\n        // Some servers redirect directly via 3xx. The fetch above wouldn't\n        // complete in that case, so this branch is best-effort.\n        setError('Could not start Google OAuth.');\n        setStatus('disconnected');\n      }\n    } catch (err) {\n      setStatus('disconnected');\n      setErr(err, 'Could not start Google OAuth.');\n    }\n  }, [basePath, oauthStartPath, setErr]);\n\n  return {\n    status,\n    connectedEmail,\n    availableCalendars,\n    error,\n    refresh,\n    start,\n  };\n}\n"]}