Files
gridpilot.gg/apps/website/lib/services/ServiceProvider.tsx
2025-12-19 21:58:03 +01:00

113 lines
4.9 KiB
TypeScript

'use client';
import React, { createContext, useContext, useMemo, ReactNode } from 'react';
import { ServiceFactory } from './ServiceFactory';
// Import all service types
import { RaceService } from './races/RaceService';
import { RaceResultsService } from './races/RaceResultsService';
import { RaceStewardingService } from './races/RaceStewardingService';
import { DriverService } from './drivers/DriverService';
import { DriverRegistrationService } from './drivers/DriverRegistrationService';
import { TeamService } from './teams/TeamService';
import { TeamJoinService } from './teams/TeamJoinService';
import { LeagueService } from './leagues/LeagueService';
import { LeagueMembershipService } from './leagues/LeagueMembershipService';
import { LeagueSettingsService } from './leagues/LeagueSettingsService';
import { LeagueStewardingService } from './leagues/LeagueStewardingService';
import { LeagueWalletService } from './leagues/LeagueWalletService';
import { SponsorService } from './sponsors/SponsorService';
import { SponsorshipService } from './sponsors/SponsorshipService';
import { PaymentService } from './payments/PaymentService';
import { AnalyticsService } from './analytics/AnalyticsService';
import { DashboardService } from './dashboard/DashboardService';
import { MediaService } from './media/MediaService';
import { AvatarService } from './media/AvatarService';
import { WalletService } from './payments/WalletService';
import { MembershipFeeService } from './payments/MembershipFeeService';
import { AuthService } from './auth/AuthService';
import { SessionService } from './auth/SessionService';
import { ProtestService } from './protests/ProtestService';
import { PenaltyService } from './penalties/PenaltyService';
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;
}
const ServicesContext = createContext<Services | null>(null);
interface ServiceProviderProps {
children: ReactNode;
}
export function ServiceProvider({ children }: ServiceProviderProps) {
const services = useMemo(() => {
const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
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(),
};
}, []);
return (
<ServicesContext.Provider value={services}>
{children}
</ServicesContext.Provider>
);
}
export function useServices(): Services {
const services = useContext(ServicesContext);
if (!services) {
throw new Error('useServices must be used within a ServiceProvider');
}
return services;
}