refactor page to use services
This commit is contained in:
101
apps/website/lib/services/ServiceProvider.tsx
Normal file
101
apps/website/lib/services/ServiceProvider.tsx
Normal file
@@ -0,0 +1,101 @@
|
||||
'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 { 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 { 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';
|
||||
|
||||
export interface Services {
|
||||
raceService: RaceService;
|
||||
raceResultsService: RaceResultsService;
|
||||
driverService: DriverService;
|
||||
driverRegistrationService: DriverRegistrationService;
|
||||
teamService: TeamService;
|
||||
teamJoinService: TeamJoinService;
|
||||
leagueService: LeagueService;
|
||||
leagueMembershipService: LeagueMembershipService;
|
||||
leagueSettingsService: LeagueSettingsService;
|
||||
sponsorService: SponsorService;
|
||||
sponsorshipService: SponsorshipService;
|
||||
paymentService: PaymentService;
|
||||
analyticsService: AnalyticsService;
|
||||
dashboardService: DashboardService;
|
||||
mediaService: MediaService;
|
||||
avatarService: AvatarService;
|
||||
walletService: WalletService;
|
||||
membershipFeeService: MembershipFeeService;
|
||||
authService: AuthService;
|
||||
sessionService: SessionService;
|
||||
protestService: ProtestService;
|
||||
}
|
||||
|
||||
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(),
|
||||
driverService: serviceFactory.createDriverService(),
|
||||
driverRegistrationService: serviceFactory.createDriverRegistrationService(),
|
||||
teamService: serviceFactory.createTeamService(),
|
||||
teamJoinService: serviceFactory.createTeamJoinService(),
|
||||
leagueService: serviceFactory.createLeagueService(),
|
||||
leagueMembershipService: serviceFactory.createLeagueMembershipService(),
|
||||
leagueSettingsService: serviceFactory.createLeagueSettingsService(),
|
||||
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(),
|
||||
};
|
||||
}, []);
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -7,6 +7,10 @@ export class LeagueMembershipService {
|
||||
// In-memory cache for memberships (populated via API calls)
|
||||
private static leagueMemberships = new Map<string, LeagueMembership[]>();
|
||||
|
||||
constructor() {
|
||||
// Constructor for dependency injection, but this service uses static methods
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a specific membership from cache.
|
||||
*/
|
||||
@@ -65,4 +69,41 @@ export class LeagueMembershipService {
|
||||
static getCachedMembershipsIterator(): IterableIterator<[string, LeagueMembership[]]> {
|
||||
return this.leagueMemberships.entries();
|
||||
}
|
||||
|
||||
// Instance methods that delegate to static methods for consistency with service pattern
|
||||
|
||||
/**
|
||||
* Get a specific membership from cache.
|
||||
*/
|
||||
getMembership(leagueId: string, driverId: string): LeagueMembership | null {
|
||||
return LeagueMembershipService.getMembership(leagueId, driverId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all members of a league from cache.
|
||||
*/
|
||||
getLeagueMembers(leagueId: string): LeagueMembership[] {
|
||||
return LeagueMembershipService.getLeagueMembers(leagueId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch and cache memberships for a league via API.
|
||||
*/
|
||||
async fetchLeagueMemberships(leagueId: string): Promise<LeagueMembership[]> {
|
||||
return LeagueMembershipService.fetchLeagueMemberships(leagueId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set memberships in cache (for use after API calls).
|
||||
*/
|
||||
setLeagueMemberships(leagueId: string, memberships: LeagueMembership[]): void {
|
||||
LeagueMembershipService.setLeagueMemberships(leagueId, memberships);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear cached memberships for a league.
|
||||
*/
|
||||
clearLeagueMemberships(leagueId: string): void {
|
||||
LeagueMembershipService.clearLeagueMemberships(leagueId);
|
||||
}
|
||||
}
|
||||
@@ -26,8 +26,8 @@ export class SponsorshipService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get sponsor sponsorships with view model transformation
|
||||
*/
|
||||
* Get sponsor sponsorships with view model transformation
|
||||
*/
|
||||
async getSponsorSponsorships(sponsorId: string): Promise<SponsorSponsorshipsViewModel | null> {
|
||||
const dto = await this.apiClient.getSponsorships(sponsorId);
|
||||
if (!dto) {
|
||||
@@ -35,4 +35,13 @@ export class SponsorshipService {
|
||||
}
|
||||
return new SponsorSponsorshipsViewModel(dto);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get pending sponsorship requests for an entity
|
||||
*/
|
||||
async getPendingSponsorshipRequests(params: { entityType: string; entityId: string }): Promise<{ requests: any[] }> {
|
||||
// TODO: Implement API call
|
||||
// For now, return empty
|
||||
return { requests: [] };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user