import type { ConnectionsStatus, DashboardPayload, PropertyOption, ConnectionSource } from './types'; import { __ } from '../../lib/i18n'; const NS = 'llm-analytics/v1'; const DEFAULT_TIMEOUT_MS = 15000; const SYNC_TIMEOUT_MS = 90000; function apiRoot(): string { const root = (window as unknown as { wpApiSettings?: { root?: string } }).wpApiSettings?.root || '/wp-json/'; return root.replace(/\/$/, ''); } function nonce(): string { return (window as unknown as { wpApiSettings?: { nonce?: string } }).wpApiSettings?.nonce || ''; } async function request(path: string, init: RequestInit = {}, timeoutMs = DEFAULT_TIMEOUT_MS): Promise { const controller = new AbortController(); const timer = window.setTimeout(() => controller.abort(), timeoutMs); try { const res = await fetch(`${apiRoot()}/${NS}${path}`, { credentials: 'same-origin', signal: controller.signal, ...init, headers: { 'X-WP-Nonce': nonce(), ...(init.body ? { 'Content-Type': 'application/json' } : {}), ...(init.headers || {}), }, }); const data = (await res.json().catch(() => ({}))) as T & { message?: string; code?: string }; if (!res.ok) { throw new Error( typeof data?.message === 'string' && data.message ? data.message : `Request failed (${res.status})`, ); } return data; } catch (error) { if (error instanceof DOMException && error.name === 'AbortError') { throw new Error( __('The request timed out. Try again or check that WordPress REST is responding.', 'llmagnet-llm-txt-generator'), ); } throw error; } finally { window.clearTimeout(timer); } } export function getStatus(): Promise { return request('/connections/status'); } export function getDashboard(): Promise { return request('/connections/dashboard'); } export function syncDashboard(): Promise { return request( '/connections/sync', { method: 'POST', }, SYNC_TIMEOUT_MS, ); } export function startOAuth( source: ConnectionSource, ): Promise<{ start_url: string; source: ConnectionSource; mode: 'broker' | 'direct' }> { return request('/connections/oauth/start', { method: 'POST', body: JSON.stringify({ source }), }); } export function disconnect(source: ConnectionSource): Promise<{ success: boolean }> { return request('/connections/disconnect', { method: 'POST', body: JSON.stringify({ source }), }); } export function setProperty( source: ConnectionSource, propertyId: string, propertyName: string, ): Promise { return request('/connections/property', { method: 'POST', body: JSON.stringify({ source, property_id: propertyId, property_name: propertyName, }), }); } export function listProperties(source: ConnectionSource): Promise<{ items: PropertyOption[] }> { return request(`/connections/properties?source=${encodeURIComponent(source)}`); }