'use client'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { createContext, ReactNode, useContext, useMemo } from 'react'; import { getWebsiteApiBaseUrl } from '../config/apiBaseUrl'; import { ServiceFactory } from './ServiceFactory'; // Import all service types import { AnalyticsService } from './analytics/AnalyticsService'; import { AuthService } from './auth/AuthService'; import { SessionService } from './auth/SessionService'; import { DashboardService } from './dashboard/DashboardService'; import { DriverRegistrationService } from './drivers/DriverRegistrationService'; import { DriverService } from './drivers/DriverService'; import { LeagueMembershipService } from './leagues/LeagueMembershipService'; import { LeagueService } from './leagues/LeagueService'; import { LeagueSettingsService } from './leagues/LeagueSettingsService'; import { LeagueStewardingService } from './leagues/LeagueStewardingService'; import { LeagueWalletService } from './leagues/LeagueWalletService'; import { AvatarService } from './media/AvatarService'; import { MediaService } from './media/MediaService'; import { MembershipFeeService } from './payments/MembershipFeeService'; import { PaymentService } from './payments/PaymentService'; import { WalletService } from './payments/WalletService'; import { PenaltyService } from './penalties/PenaltyService'; import { ProtestService } from './protests/ProtestService'; import { RaceResultsService } from './races/RaceResultsService'; import { RaceService } from './races/RaceService'; import { RaceStewardingService } from './races/RaceStewardingService'; import { SponsorService } from './sponsors/SponsorService'; import { SponsorshipService } from './sponsors/SponsorshipService'; import { TeamJoinService } from './teams/TeamJoinService'; import { TeamService } from './teams/TeamService'; import { OnboardingService } from './onboarding/OnboardingService'; import { PolicyService } from './policy/PolicyService'; import { LandingService } from './landing/LandingService'; export interface Services { raceService: RaceService; raceResultsService: RaceResultsService; raceStewardingService: RaceStewardingService; driverService: DriverService; driverRegistrationService: DriverRegistrationService; teamService: TeamService; teamJoinService: TeamJoinService; leagueService: LeagueService; leagueMembershipService: LeagueMembershipService; leagueSettingsService: LeagueSettingsService; leagueStewardingService: LeagueStewardingService; leagueWalletService: LeagueWalletService; sponsorService: SponsorService; sponsorshipService: SponsorshipService; paymentService: PaymentService; analyticsService: AnalyticsService; dashboardService: DashboardService; mediaService: MediaService; avatarService: AvatarService; walletService: WalletService; membershipFeeService: MembershipFeeService; authService: AuthService; sessionService: SessionService; protestService: ProtestService; penaltyService: PenaltyService; onboardingService: OnboardingService; policyService: PolicyService; landingService: LandingService; } const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, // 5 minutes gcTime: 10 * 60 * 1000, // 10 minutes }, }, }); const ServicesContext = createContext(null); interface ServiceProviderProps { children: ReactNode; } export function ServiceProvider({ children }: ServiceProviderProps) { const services = useMemo(() => { const serviceFactory = new ServiceFactory(getWebsiteApiBaseUrl()); return { raceService: serviceFactory.createRaceService(), raceResultsService: serviceFactory.createRaceResultsService(), raceStewardingService: serviceFactory.createRaceStewardingService(), driverService: serviceFactory.createDriverService(), driverRegistrationService: serviceFactory.createDriverRegistrationService(), teamService: serviceFactory.createTeamService(), teamJoinService: serviceFactory.createTeamJoinService(), leagueService: serviceFactory.createLeagueService(), leagueMembershipService: serviceFactory.createLeagueMembershipService(), leagueSettingsService: serviceFactory.createLeagueSettingsService(), leagueStewardingService: serviceFactory.createLeagueStewardingService(), leagueWalletService: serviceFactory.createLeagueWalletService(), sponsorService: serviceFactory.createSponsorService(), sponsorshipService: serviceFactory.createSponsorshipService(), paymentService: serviceFactory.createPaymentService(), analyticsService: serviceFactory.createAnalyticsService(), dashboardService: serviceFactory.createDashboardService(), mediaService: serviceFactory.createMediaService(), avatarService: serviceFactory.createAvatarService(), walletService: serviceFactory.createWalletService(), membershipFeeService: serviceFactory.createMembershipFeeService(), authService: serviceFactory.createAuthService(), sessionService: serviceFactory.createSessionService(), protestService: serviceFactory.createProtestService(), penaltyService: serviceFactory.createPenaltyService(), onboardingService: serviceFactory.createOnboardingService(), policyService: serviceFactory.createPolicyService(), landingService: serviceFactory.createLandingService(), }; }, []); return ( {children} ); } // Before using this check for enhanced hooks that use react-query export function useServices(): Services { const services = useContext(ServicesContext); if (!services) { throw new Error('useServices must be used within a ServiceProvider'); } return services; }