import { createContext, ReactNode, useCallback, useMemo } from 'react'; import { useCreateOrganization, useDeleteOrganization, useOrganizations as useOrganizationsAPI, } from '@/hooks/api'; import type { BackendOrganization, CreateOrganizationRequest, } from '@/schemas/backend/organization'; interface OrganizationContextType { organizations: BackendOrganization[]; isLoading: boolean; error: Error | null; addOrganization: (newOrgData: CreateOrganizationRequest) => Promise; updateOrganization: () => Promise; deleteOrganization: (id: string) => Promise; getOrganizationById: (id: string | undefined) => BackendOrganization | undefined; refetch: () => void; } export const OrganizationContext = createContext(undefined); export const OrganizationProvider = ({ children }: { children?: ReactNode }) => { const { data: organizations, isLoading, error, refetch } = useOrganizationsAPI(); const createOrgMutation = useCreateOrganization(); const deleteOrgMutation = useDeleteOrganization(); const addOrganization = useCallback( async (newOrgData: CreateOrganizationRequest) => { await createOrgMutation.mutateAsync(newOrgData); refetch(); }, [createOrgMutation, refetch] ); const updateOrganization = useCallback(async () => { throw new Error( 'Organization updates are not yet supported by the backend API. This feature will be implemented when the backend adds support for organization updates.' ); }, []); const deleteOrganization = useCallback( async (id: string) => { await deleteOrgMutation.mutateAsync(id); refetch(); }, [deleteOrgMutation, refetch] ); const getOrganizationById = useCallback( (id: string | undefined): BackendOrganization | undefined => { if (!id || !organizations || !Array.isArray(organizations)) return undefined; return organizations.find((org) => org.ID === id); }, [organizations] ); const value = useMemo(() => { // Ensure organizations is always an array - don't block on undefined const orgs = Array.isArray(organizations) ? organizations : []; // Only log in development and avoid blocking with console operations if (process.env.NODE_ENV === 'development') { // Use setTimeout to defer logging and not block render setTimeout(() => { console.log(`[OrganizationContext] Loaded ${orgs.length} organizations`, { isLoading, hasError: !!error, error: error?.message, sample: orgs.slice(0, 3).map((org) => ({ id: org?.ID, name: org?.Name })), }); const orgsWithoutIds = orgs.filter((org) => !org?.ID || org.ID.trim() === ''); if (orgsWithoutIds.length > 0) { console.warn(`Found ${orgsWithoutIds.length} organizations without valid IDs`); } }, 0); } return { organizations: orgs, isLoading, error: error instanceof Error ? error : error ? new Error(String(error)) : null, addOrganization, updateOrganization, deleteOrganization, getOrganizationById, refetch, }; }, [ organizations, isLoading, error, addOrganization, updateOrganization, deleteOrganization, getOrganizationById, refetch, ]); return {children}; };