'use client'; import React from 'react'; import { Scale, Users, Clock, Bell, Shield, Vote, UserCheck, AlertTriangle } from 'lucide-react'; import type { LeagueConfigFormModel, LeagueStewardingFormDTO } from '@core/racing/application'; import type { StewardingDecisionMode } from '@core/racing/domain/entities/League'; interface LeagueStewardingSectionProps { form: LeagueConfigFormModel; onChange: (form: LeagueConfigFormModel) => void; readOnly?: boolean; } type DecisionModeOption = { value: StewardingDecisionMode; label: string; description: string; icon: React.ReactNode; requiresVotes: boolean; }; const decisionModeOptions: DecisionModeOption[] = [ { value: 'admin_only', label: 'Admin Decision', description: 'League admins make all penalty decisions', icon: , requiresVotes: false, }, { value: 'steward_vote', label: 'Steward Vote', description: 'Designated stewards vote to uphold protests', icon: , requiresVotes: true, }, { value: 'member_vote', label: 'Member Vote', description: 'All league members vote on protests', icon: , requiresVotes: true, }, { value: 'steward_veto', label: 'Steward Veto', description: 'Protests upheld unless stewards vote against', icon: , requiresVotes: true, }, { value: 'member_veto', label: 'Member Veto', description: 'Protests upheld unless members vote against', icon: , requiresVotes: true, }, ]; export function LeagueStewardingSection({ form, onChange, readOnly = false, }: LeagueStewardingSectionProps) { // Provide default stewarding settings if not present const stewarding = form.stewarding ?? { decisionMode: 'admin_only' as const, requiredVotes: 2, requireDefense: false, defenseTimeLimit: 48, voteTimeLimit: 72, protestDeadlineHours: 48, stewardingClosesHours: 168, notifyAccusedOnProtest: true, notifyOnVoteRequired: true, }; const updateStewarding = (updates: Partial) => { onChange({ ...form, stewarding: { ...stewarding, ...updates, }, }); }; const selectedMode = decisionModeOptions.find((m) => m.value === stewarding.decisionMode); return (
{/* Decision Mode Selection */}

How are protest decisions made?

Choose who has the authority to issue penalties

{decisionModeOptions.map((option) => ( ))}
{/* Vote Requirements (conditional) */} {selectedMode?.requiresVotes && (

Voting Configuration

)} {/* Defense Settings */}

Defense Requirements

Should accused drivers be required to submit a defense?

{stewarding.requireDefense && (

After this time, the decision can proceed without a defense

)}
{/* Deadlines */}

Deadlines

Set time limits for filing protests and closing stewarding

Drivers cannot file protests after this time

All stewarding must be concluded by this time

{/* Notifications */}

Notifications

Configure automatic notifications for involved parties

{/* Warning about strict settings */} {stewarding.requireDefense && stewarding.decisionMode !== 'admin_only' && (

Strict settings enabled

Requiring defense and voting may delay penalty decisions. Make sure your stewards/members are active enough to meet the deadlines.

)}
); }