export interface PrivacySettings { telemetry_enabled: boolean; email_enabled: boolean; news_feed_enabled?: boolean; retention_days: number; attribution_enabled: boolean; attribution_available?: boolean; } export const NEWS_FEED_CONSENT_EVENT = 'llmagnet:news-feed-consent'; type AnalyticsHolder = { analyticsData?: { newsFeedConsent?: boolean } }; const NEWS_FEED_CONSENT_GLOBALS = [ 'llmagnetDashboardData', 'llmagnetPagesData', 'llmagnetBotAnalyticsData', 'llmagnetProductsData', 'llmagnetReportsData', 'llmagnetContentSettingsData', 'llmagnetSchemaData', 'llmagnetAgentReadyData', 'llmagnetUcpData', 'llmagnetConnectionsData', 'llmagnetMcpData', 'llmagnetSystemInfoData', 'llmagnetAnalyticsData', ] as const; export function readNewsFeedConsent(): boolean { if (typeof window === 'undefined') { return false; } const w = window as Window & Record; return NEWS_FEED_CONSENT_GLOBALS.some((key) => w[key]?.analyticsData?.newsFeedConsent === true); } export function persistNewsFeedConsent(enabled: boolean): void { if (typeof window === 'undefined') { return; } const w = window as Window & Record; for (const key of NEWS_FEED_CONSENT_GLOBALS) { const holder = w[key]; if (holder?.analyticsData) { holder.analyticsData.newsFeedConsent = enabled; } } window.dispatchEvent(new CustomEvent(NEWS_FEED_CONSENT_EVENT, { detail: { enabled } })); } function getRestConfig(): { root: string; nonce: string } { const root = window.wpApiSettings?.root?.replace(/\/$/, '') || ''; const nonce = window.wpApiSettings?.nonce || ''; return { root, nonce }; } export async function fetchPrivacySettings(): Promise { const { root, nonce } = getRestConfig(); if (!root || !nonce) { throw new Error('REST API not configured'); } const res = await fetch(`${root}/llm-analytics/v1/privacy/settings`, { headers: { 'X-WP-Nonce': nonce }, credentials: 'same-origin', }); if (!res.ok) { throw new Error(`HTTP ${res.status}`); } return (await res.json()) as PrivacySettings; } export type PrivacySettingsUpdate = Partial< Pick< PrivacySettings, 'telemetry_enabled' | 'email_enabled' | 'news_feed_enabled' | 'attribution_enabled' | 'retention_days' > >; export async function updatePrivacySettings( partial: PrivacySettingsUpdate, ): Promise { const { root, nonce } = getRestConfig(); if (!root || !nonce) { throw new Error('REST API not configured'); } const res = await fetch(`${root}/llm-analytics/v1/privacy/settings`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': nonce, }, credentials: 'same-origin', body: JSON.stringify(partial), }); if (!res.ok) { throw new Error(`HTTP ${res.status}`); } return (await res.json()) as PrivacySettings & { success: boolean }; }