135 lines
5.8 KiB
TypeScript
135 lines
5.8 KiB
TypeScript
'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<Services | null>(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 (
|
|
<QueryClientProvider client={queryClient}>
|
|
<ServicesContext.Provider value={services}>
|
|
{children}
|
|
</ServicesContext.Provider>
|
|
</QueryClientProvider>
|
|
);
|
|
}
|
|
// 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;
|
|
} |