website refactor

This commit is contained in:
2026-01-18 23:43:58 +01:00
parent 7c1cf62d4e
commit c0559d8b48
76 changed files with 39 additions and 89 deletions

View File

@@ -1,4 +1,4 @@
import { NotFoundPageClient } from './NotFoundPageClient'; import { NotFoundPageClient } from '@/client-wrapper/NotFoundPageClient';
/** /**
* Custom404Page * Custom404Page

View File

@@ -1,50 +0,0 @@
import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { ServerErrorPageClient } from './ServerErrorPageClient';
import { useRouter } from 'next/navigation';
vi.mock('next/navigation', () => ({
useRouter: vi.fn(),
}));
describe('ServerErrorPageClient', () => {
it('renders the server error page with correct content', () => {
const push = vi.fn();
(useRouter as any).mockReturnValue({ push });
render(<ServerErrorPageClient />);
expect(screen.getByText('CRITICAL_SYSTEM_FAILURE')).toBeDefined();
expect(screen.getByText(/The application engine encountered an unrecoverable state/)).toBeDefined();
expect(screen.getByText(/Internal Server Error/)).toBeDefined();
});
it('handles home navigation', () => {
const push = vi.fn();
(useRouter as any).mockReturnValue({ push });
render(<ServerErrorPageClient />);
const homeButton = screen.getByText('Return to Pits');
fireEvent.click(homeButton);
expect(push).toHaveBeenCalledWith('/');
});
it('handles retry via page reload', () => {
const push = vi.fn();
(useRouter as any).mockReturnValue({ push });
const reloadFn = vi.fn();
vi.stubGlobal('location', { reload: reloadFn });
render(<ServerErrorPageClient />);
const retryButton = screen.getByText('Retry Session');
fireEvent.click(retryButton);
expect(reloadFn).toHaveBeenCalled();
vi.unstubAllGlobals();
});
});

View File

@@ -1,4 +1,4 @@
import { ServerErrorPageClient } from './ServerErrorPageClient'; import { ServerErrorPageClient } from '@/client-wrapper/ServerErrorPageClient';
/** /**
* Custom500Page * Custom500Page

View File

@@ -1,5 +1,5 @@
import { AdminDashboardPageQuery } from '@/lib/page-queries/AdminDashboardPageQuery'; import { AdminDashboardPageQuery } from '@/lib/page-queries/AdminDashboardPageQuery';
import { AdminDashboardWrapper } from './AdminDashboardWrapper'; import { AdminDashboardWrapper } from '@/client-wrapper/AdminDashboardWrapper';
import { ErrorBanner } from '@/ui/ErrorBanner'; import { ErrorBanner } from '@/ui/ErrorBanner';
export default async function AdminPage() { export default async function AdminPage() {

View File

@@ -1,5 +1,5 @@
import { AdminUsersPageQuery } from '@/lib/page-queries/AdminUsersPageQuery'; import { AdminUsersPageQuery } from '@/lib/page-queries/AdminUsersPageQuery';
import { AdminUsersWrapper } from './AdminUsersWrapper'; import { AdminUsersWrapper } from '@/client-wrapper/AdminUsersWrapper';
import { ErrorBanner } from '@/ui/ErrorBanner'; import { ErrorBanner } from '@/ui/ErrorBanner';
export default async function AdminUsersPage() { export default async function AdminUsersPage() {

View File

@@ -8,7 +8,7 @@
import { AuthError } from '@/components/auth/AuthError'; import { AuthError } from '@/components/auth/AuthError';
import { ForgotPasswordPageQuery } from '@/lib/page-queries/auth/ForgotPasswordPageQuery'; import { ForgotPasswordPageQuery } from '@/lib/page-queries/auth/ForgotPasswordPageQuery';
import { ForgotPasswordClient } from './ForgotPasswordClient'; import { ForgotPasswordClient } from '@/client-wrapper/ForgotPasswordClient';
export default async function ForgotPasswordPage({ export default async function ForgotPasswordPage({
searchParams, searchParams,

View File

@@ -8,7 +8,7 @@
import { AuthError } from '@/components/auth/AuthError'; import { AuthError } from '@/components/auth/AuthError';
import { LoginPageQuery } from '@/lib/page-queries/auth/LoginPageQuery'; import { LoginPageQuery } from '@/lib/page-queries/auth/LoginPageQuery';
import { LoginClient } from './LoginClient'; import { LoginClient } from '@/client-wrapper/LoginClient';
export default async function LoginPage({ export default async function LoginPage({
searchParams, searchParams,

View File

@@ -8,7 +8,7 @@
import { AuthError } from '@/components/auth/AuthError'; import { AuthError } from '@/components/auth/AuthError';
import { ResetPasswordPageQuery } from '@/lib/page-queries/auth/ResetPasswordPageQuery'; import { ResetPasswordPageQuery } from '@/lib/page-queries/auth/ResetPasswordPageQuery';
import { ResetPasswordClient } from './ResetPasswordClient'; import { ResetPasswordClient } from '@/client-wrapper/ResetPasswordClient';
export default async function ResetPasswordPage({ export default async function ResetPasswordPage({
searchParams, searchParams,

View File

@@ -8,7 +8,7 @@
import { AuthError } from '@/components/auth/AuthError'; import { AuthError } from '@/components/auth/AuthError';
import { SignupPageQuery } from '@/lib/page-queries/auth/SignupPageQuery'; import { SignupPageQuery } from '@/lib/page-queries/auth/SignupPageQuery';
import { SignupClient } from './SignupClient'; import { SignupClient } from '@/client-wrapper/SignupClient';
export default async function SignupPage({ export default async function SignupPage({
searchParams, searchParams,

View File

@@ -1,7 +1,7 @@
import { redirect } from 'next/navigation'; import { redirect } from 'next/navigation';
import { routes } from '@/lib/routing/RouteConfig'; import { routes } from '@/lib/routing/RouteConfig';
import { DriverProfilePageQuery } from '@/lib/page-queries/DriverProfilePageQuery'; import { DriverProfilePageQuery } from '@/lib/page-queries/DriverProfilePageQuery';
import { DriverProfilePageClient } from './DriverProfilePageClient'; import { DriverProfilePageClient } from '@/client-wrapper/DriverProfilePageClient';
export default async function DriverProfilePage({ params }: { params: Promise<{ id: string }> }) { export default async function DriverProfilePage({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params; const { id } = await params;

View File

@@ -1,7 +1,7 @@
import { redirect } from 'next/navigation'; import { redirect } from 'next/navigation';
import { routes } from '@/lib/routing/RouteConfig'; import { routes } from '@/lib/routing/RouteConfig';
import { DriversPageQuery } from '@/lib/page-queries/DriversPageQuery'; import { DriversPageQuery } from '@/lib/page-queries/DriversPageQuery';
import { DriversPageClient } from './DriversPageClient'; import { DriversPageClient } from '@/client-wrapper/DriversPageClient';
export default async function Page() { export default async function Page() {
const result = await DriversPageQuery.execute(); const result = await DriversPageQuery.execute();

View File

@@ -1,6 +1,6 @@
import { notFound, redirect } from 'next/navigation'; import { notFound, redirect } from 'next/navigation';
import { DriverRankingsPageQuery } from '@/lib/page-queries/DriverRankingsPageQuery'; import { DriverRankingsPageQuery } from '@/lib/page-queries/DriverRankingsPageQuery';
import { DriverRankingsPageClient } from './DriverRankingsPageClient'; import { DriverRankingsPageClient } from '@/client-wrapper/DriverRankingsPageClient';
import { routes } from '@/lib/routing/RouteConfig'; import { routes } from '@/lib/routing/RouteConfig';
import { logger } from '@/lib/infrastructure/logging/logger'; import { logger } from '@/lib/infrastructure/logging/logger';

View File

@@ -1,6 +1,6 @@
import { notFound, redirect } from 'next/navigation'; import { notFound, redirect } from 'next/navigation';
import { LeaderboardsPageQuery } from '@/lib/page-queries/LeaderboardsPageQuery'; import { LeaderboardsPageQuery } from '@/lib/page-queries/LeaderboardsPageQuery';
import { LeaderboardsPageClient } from './LeaderboardsPageClient'; import { LeaderboardsPageClient } from '@/client-wrapper/LeaderboardsPageClient';
import { routes } from '@/lib/routing/RouteConfig'; import { routes } from '@/lib/routing/RouteConfig';
import { logger } from '@/lib/infrastructure/logging/logger'; import { logger } from '@/lib/infrastructure/logging/logger';

View File

@@ -1,6 +1,6 @@
'use client'; 'use client';
import { RosterAdminPage } from './RosterAdminPage'; import { RosterAdminPage } from '@/client-wrapper/RosterAdminPage';
export default function LeagueRosterAdminPage() { export default function LeagueRosterAdminPage() {
return <RosterAdminPage />; return <RosterAdminPage />;

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { LeagueScheduleAdminPageQuery } from '@/lib/page-queries/LeagueScheduleAdminPageQuery'; import { LeagueScheduleAdminPageQuery } from '@/lib/page-queries/LeagueScheduleAdminPageQuery';
import { LeagueAdminSchedulePageClient } from './LeagueAdminSchedulePageClient'; import { LeagueAdminSchedulePageClient } from '@/client-wrapper/LeagueAdminSchedulePageClient';
interface Props { interface Props {
params: Promise<{ id: string }>; params: Promise<{ id: string }>;

View File

@@ -1,5 +1,5 @@
import { LeagueStewardingPageQuery } from '@/lib/page-queries/LeagueStewardingPageQuery'; import { LeagueStewardingPageQuery } from '@/lib/page-queries/LeagueStewardingPageQuery';
import { StewardingPageClient } from './StewardingPageClient'; import { StewardingPageClient } from '@/client-wrapper/StewardingPageClient';
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
interface Props { interface Props {

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { LeagueProtestDetailPageQuery } from '@/lib/page-queries/LeagueProtestDetailPageQuery'; import { LeagueProtestDetailPageQuery } from '@/lib/page-queries/LeagueProtestDetailPageQuery';
import { ProtestDetailPageClient } from './ProtestDetailPageClient'; import { ProtestDetailPageClient } from '@/client-wrapper/ProtestDetailPageClient';
interface Props { interface Props {
params: Promise<{ id: string; protestId: string }>; params: Promise<{ id: string; protestId: string }>;

View File

@@ -1,5 +1,5 @@
import { LeagueWalletPageQuery } from '@/lib/page-queries/LeagueWalletPageQuery'; import { LeagueWalletPageQuery } from '@/lib/page-queries/LeagueWalletPageQuery';
import { LeagueWalletPageClient } from './LeagueWalletPageClient'; import { LeagueWalletPageClient } from '@/client-wrapper/LeagueWalletPageClient';
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
interface Props { interface Props {

View File

@@ -2,7 +2,7 @@
import React from 'react'; import React from 'react';
import { useRouter, useSearchParams } from 'next/navigation'; import { useRouter, useSearchParams } from 'next/navigation';
import { CreateLeagueWizard } from './CreateLeagueWizard'; import { CreateLeagueWizard } from '@/client-wrapper/CreateLeagueWizard';
import { Section } from '@/ui/Section'; import { Section } from '@/ui/Section';
import { Container } from '@/ui/Container'; import { Container } from '@/ui/Container';
import { SearchParamParser } from '@/lib/routing/search-params/SearchParamParser'; import { SearchParamParser } from '@/lib/routing/search-params/SearchParamParser';

View File

@@ -1,5 +1,5 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { LeaguesPageClient } from './LeaguesPageClient'; import { LeaguesPageClient } from '@/client-wrapper/LeaguesPageClient';
import { LeaguesPageQuery } from '@/lib/page-queries/LeaguesPageQuery'; import { LeaguesPageQuery } from '@/lib/page-queries/LeaguesPageQuery';
export default async function Page() { export default async function Page() {

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { MediaPageClient } from '../MediaPageClient'; import { MediaPageClient } from '@/client-wrapper/MediaPageClient';
export default async function AvatarsPage() { export default async function AvatarsPage() {
const assets = [ const assets = [

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { MediaPageClient } from '../MediaPageClient'; import { MediaPageClient } from '@/client-wrapper/MediaPageClient';
export default async function LeaguesMediaPage() { export default async function LeaguesMediaPage() {
const assets = [ const assets = [

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { MediaPageClient } from './MediaPageClient'; import { MediaPageClient } from '@/client-wrapper/MediaPageClient';
export default async function MediaPage() { export default async function MediaPage() {
// In a real app, we would fetch this data from an API or database // In a real app, we would fetch this data from an API or database

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { MediaPageClient } from '../MediaPageClient'; import { MediaPageClient } from '@/client-wrapper/MediaPageClient';
export default async function SponsorsMediaPage() { export default async function SponsorsMediaPage() {
const assets = [ const assets = [

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { MediaPageClient } from '../MediaPageClient'; import { MediaPageClient } from '@/client-wrapper/MediaPageClient';
export default async function TeamsMediaPage() { export default async function TeamsMediaPage() {
const assets = [ const assets = [

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { MediaPageClient } from '../MediaPageClient'; import { MediaPageClient } from '@/client-wrapper/MediaPageClient';
export default async function TracksMediaPage() { export default async function TracksMediaPage() {
const assets = [ const assets = [

View File

@@ -1,5 +1,5 @@
import { redirect } from 'next/navigation'; import { redirect } from 'next/navigation';
import { OnboardingWizardClient } from './OnboardingWizardClient'; import { OnboardingWizardClient } from '@/client-wrapper/OnboardingWizardClient';
import { OnboardingPageQuery } from '@/lib/page-queries/OnboardingPageQuery'; import { OnboardingPageQuery } from '@/lib/page-queries/OnboardingPageQuery';
import { SearchParamBuilder } from '@/lib/routing/search-params/SearchParamBuilder'; import { SearchParamBuilder } from '@/lib/routing/search-params/SearchParamBuilder';
import { routes } from '@/lib/routing/RouteConfig'; import { routes } from '@/lib/routing/RouteConfig';

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { ProfileLiveryUploadPageClient } from './ProfileLiveryUploadPageClient'; import { ProfileLiveryUploadPageClient } from '@/client-wrapper/ProfileLiveryUploadPageClient';
export default async function ProfileLiveryUploadPage() { export default async function ProfileLiveryUploadPage() {
return <ProfileLiveryUploadPageClient />; return <ProfileLiveryUploadPageClient />;

View File

@@ -1,6 +1,6 @@
import { ProfilePageQuery } from '@/lib/page-queries/ProfilePageQuery'; import { ProfilePageQuery } from '@/lib/page-queries/ProfilePageQuery';
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { ProfilePageClient } from './ProfilePageClient'; import { ProfilePageClient } from '@/client-wrapper/ProfilePageClient';
export default async function ProfilePage() { export default async function ProfilePage() {
const query = new ProfilePageQuery(); const query = new ProfilePageQuery();

View File

@@ -1,7 +1,7 @@
import { ProfilePageQuery } from '@/lib/page-queries/ProfilePageQuery'; import { ProfilePageQuery } from '@/lib/page-queries/ProfilePageQuery';
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { updateProfileAction } from '@/app/actions/profileActions'; import { updateProfileAction } from '@/app/actions/profileActions';
import { ProfileSettingsPageClient } from './ProfileSettingsPageClient'; import { ProfileSettingsPageClient } from '@/client-wrapper/ProfileSettingsPageClient';
export default async function ProfileSettingsPage() { export default async function ProfileSettingsPage() {
const query = new ProfilePageQuery(); const query = new ProfilePageQuery();

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { SponsorshipRequestsPageQuery } from '@/lib/page-queries/SponsorshipRequestsPageQuery'; import { SponsorshipRequestsPageQuery } from '@/lib/page-queries/SponsorshipRequestsPageQuery';
import { SponsorshipRequestsClient } from './SponsorshipRequestsClient'; import { SponsorshipRequestsClient } from '@/client-wrapper/SponsorshipRequestsClient';
import { acceptSponsorshipRequest, rejectSponsorshipRequest } from '@/app/actions/sponsorshipActions'; import { acceptSponsorshipRequest, rejectSponsorshipRequest } from '@/app/actions/sponsorshipActions';
export default async function SponsorshipRequestsPage() { export default async function SponsorshipRequestsPage() {

View File

@@ -1,7 +1,7 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { PageWrapper } from '@/ui/PageWrapper'; import { PageWrapper } from '@/ui/PageWrapper';
import { RaceDetailPageQuery } from '@/lib/page-queries/races/RaceDetailPageQuery'; import { RaceDetailPageQuery } from '@/lib/page-queries/races/RaceDetailPageQuery';
import { RaceDetailPageClient } from './RaceDetailPageClient'; import { RaceDetailPageClient } from '@/client-wrapper/RaceDetailPageClient';
interface RaceDetailPageProps { interface RaceDetailPageProps {
params: Promise<{ params: Promise<{

View File

@@ -1,7 +1,7 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { PageWrapper } from '@/ui/PageWrapper'; import { PageWrapper } from '@/ui/PageWrapper';
import { RaceResultsPageQuery } from '@/lib/page-queries/races/RaceResultsPageQuery'; import { RaceResultsPageQuery } from '@/lib/page-queries/races/RaceResultsPageQuery';
import { RaceResultsPageClient } from './RaceResultsPageClient'; import { RaceResultsPageClient } from '@/client-wrapper/RaceResultsPageClient';
interface RaceResultsPageProps { interface RaceResultsPageProps {
params: Promise<{ params: Promise<{

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { RacesAllPageQuery } from '@/lib/page-queries/races/RacesAllPageQuery'; import { RacesAllPageQuery } from '@/lib/page-queries/races/RacesAllPageQuery';
import { RacesAllPageClient } from './RacesAllPageClient'; import { RacesAllPageClient } from '@/client-wrapper/RacesAllPageClient';
export default async function Page() { export default async function Page() {
// Execute the PageQuery // Execute the PageQuery

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { RacesPageQuery } from '@/lib/page-queries/races/RacesPageQuery'; import { RacesPageQuery } from '@/lib/page-queries/races/RacesPageQuery';
import { RacesPageClient } from './RacesPageClient'; import { RacesPageClient } from '@/client-wrapper/RacesPageClient';
export default async function Page() { export default async function Page() {
const query = new RacesPageQuery(); const query = new RacesPageQuery();

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { PageWrapper } from '@/ui/PageWrapper'; import { PageWrapper } from '@/ui/PageWrapper';
import { SponsorLeagueDetailPageClient } from './SponsorLeagueDetailPageClient'; import { SponsorLeagueDetailPageClient } from '@/client-wrapper/SponsorLeagueDetailPageClient';
import { SponsorsApiClient } from '@/lib/api/sponsors/SponsorsApiClient'; import { SponsorsApiClient } from '@/lib/api/sponsors/SponsorsApiClient';
import { EnhancedErrorReporter } from '@/lib/infrastructure/EnhancedErrorReporter'; import { EnhancedErrorReporter } from '@/lib/infrastructure/EnhancedErrorReporter';
import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger'; import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger';

View File

@@ -1,5 +1,5 @@
import { PageWrapper } from '@/ui/PageWrapper'; import { PageWrapper } from '@/ui/PageWrapper';
import { SponsorLeaguesPageClient } from './SponsorLeaguesPageClient'; import { SponsorLeaguesPageClient } from '@/client-wrapper/SponsorLeaguesPageClient';
import { SponsorsApiClient } from '@/lib/api/sponsors/SponsorsApiClient'; import { SponsorsApiClient } from '@/lib/api/sponsors/SponsorsApiClient';
import { EnhancedErrorReporter } from '@/lib/infrastructure/EnhancedErrorReporter'; import { EnhancedErrorReporter } from '@/lib/infrastructure/EnhancedErrorReporter';
import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger'; import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger';

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { TeamDetailPageQuery } from '@/lib/page-queries/TeamDetailPageQuery'; import { TeamDetailPageQuery } from '@/lib/page-queries/TeamDetailPageQuery';
import { TeamDetailPageClient } from './TeamDetailPageClient'; import { TeamDetailPageClient } from '@/client-wrapper/TeamDetailPageClient';
export default async function Page({ params }: { params: Promise<{ id: string }> }) { export default async function Page({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params; const { id } = await params;

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { TeamLeaderboardPageQuery } from '@/lib/page-queries/TeamLeaderboardPageQuery'; import { TeamLeaderboardPageQuery } from '@/lib/page-queries/TeamLeaderboardPageQuery';
import { TeamLeaderboardPageWrapper } from './TeamLeaderboardPageWrapper'; import { TeamLeaderboardPageWrapper } from '@/client-wrapper/TeamLeaderboardPageWrapper';
export default async function TeamLeaderboardPage() { export default async function TeamLeaderboardPage() {
const query = new TeamLeaderboardPageQuery(); const query = new TeamLeaderboardPageQuery();

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'; import { notFound } from 'next/navigation';
import { TeamsPageQuery } from '@/lib/page-queries/TeamsPageQuery'; import { TeamsPageQuery } from '@/lib/page-queries/TeamsPageQuery';
import { TeamsPageClient } from './TeamsPageClient'; import { TeamsPageClient } from '@/client-wrapper/TeamsPageClient';
export default async function Page() { export default async function Page() {
const query = new TeamsPageQuery(); const query = new TeamsPageQuery();