import type { ReactNode } from 'react'; import { createContext, useCallback, useContext, useEffect, useState } from 'react'; import { apiClient } from '@/lib/api-client'; import { LEADS_QUERY, CAMPAIGNS_QUERY, ADS_QUERY, FOLLOW_UPS_QUERY, LEAD_ACTIVITIES_QUERY, CALLS_QUERY, } from '@/lib/queries'; import { transformLeads, transformCampaigns, transformAds, transformFollowUps, transformLeadActivities, transformCalls, } from '@/lib/transforms'; import type { Lead, Campaign, Ad, LeadActivity, FollowUp, WhatsAppTemplate, Agent, Call, LeadIngestionSource } from '@/types/entities'; type DataContextType = { leads: Lead[]; campaigns: Campaign[]; ads: Ad[]; followUps: FollowUp[]; leadActivities: LeadActivity[]; templates: WhatsAppTemplate[]; agents: Agent[]; calls: Call[]; ingestionSources: LeadIngestionSource[]; loading: boolean; error: string | null; updateLead: (id: string, updates: Partial) => void; addCall: (call: Call) => void; refresh: () => void; }; const DataContext = createContext(undefined); export const useData = (): DataContextType => { const context = useContext(DataContext); if (context === undefined) { throw new Error('useData must be used within a DataProvider'); } return context; }; interface DataProviderProps { children: ReactNode; } export const DataProvider = ({ children }: DataProviderProps) => { const [leads, setLeads] = useState([]); const [campaigns, setCampaigns] = useState([]); const [ads, setAds] = useState([]); const [followUps, setFollowUps] = useState([]); const [leadActivities, setLeadActivities] = useState([]); const [calls, setCalls] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // These don't have platform entities yet — empty for now const [templates] = useState([]); const [agents] = useState([]); const [ingestionSources] = useState([]); const fetchData = useCallback(async () => { if (!apiClient.isAuthenticated()) { setLoading(false); return; } setLoading(true); setError(null); try { const [leadsData, campaignsData, adsData, followUpsData, activitiesData, callsData] = await Promise.all([ apiClient.graphql(LEADS_QUERY), apiClient.graphql(CAMPAIGNS_QUERY), apiClient.graphql(ADS_QUERY), apiClient.graphql(FOLLOW_UPS_QUERY), apiClient.graphql(LEAD_ACTIVITIES_QUERY), apiClient.graphql(CALLS_QUERY), ]); setLeads(transformLeads(leadsData)); setCampaigns(transformCampaigns(campaignsData)); setAds(transformAds(adsData)); setFollowUps(transformFollowUps(followUpsData)); setLeadActivities(transformLeadActivities(activitiesData)); setCalls(transformCalls(callsData)); } catch (err: any) { console.error('Failed to fetch platform data:', err); setError(err.message ?? 'Failed to load data'); } finally { setLoading(false); } }, []); useEffect(() => { fetchData(); }, [fetchData]); const updateLead = (id: string, updates: Partial) => { setLeads((prev) => prev.map((lead) => (lead.id === id ? { ...lead, ...updates } : lead))); }; const addCall = (call: Call) => { setCalls((prev) => [call, ...prev]); }; return ( {children} ); };