import { Form, Link, redirect } from "react-router"; import type { Route } from "./+types/admin.sports-seasons.new"; import { createSportsSeason } from "~/models/sports-season"; import { findAllSports } from "~/models/sport"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { useState } from "react"; export function meta(): Route.MetaDescriptors { return [{ title: "New Sports Season - Brackt Admin" }]; } export async function loader() { const sports = await findAllSports(); return { sports }; } export async function action({ request }: Route.ActionArgs) { const formData = await request.formData(); const sportId = formData.get("sportId"); const name = formData.get("name"); const year = formData.get("year"); const startDate = formData.get("startDate"); const endDate = formData.get("endDate"); const status = formData.get("status"); const scoringType = formData.get("scoringType"); const scoringPattern = formData.get("scoringPattern"); const totalMajors = formData.get("totalMajors"); // Validation if (typeof sportId !== "string" || !sportId) { return { error: "Sport is required" }; } if (typeof name !== "string" || !name.trim()) { return { error: "Season name is required" }; } if (typeof year !== "string") { return { error: "Year is required" }; } const yearNum = parseInt(year, 10); if (isNaN(yearNum) || yearNum < 2000 || yearNum > 2100) { return { error: "Year must be between 2000 and 2100" }; } if (status !== "upcoming" && status !== "active" && status !== "completed") { return { error: "Invalid status" }; } if (scoringType !== "playoffs" && scoringType !== "regular_season" && scoringType !== "majors") { return { error: "Invalid scoring type" }; } const validScoringPatterns = ["playoff_bracket", "season_standings", "qualifying_points"]; if (scoringPattern && typeof scoringPattern === "string" && !validScoringPatterns.includes(scoringPattern)) { return { error: "Invalid scoring pattern" }; } try { const seasonData: any = { sportId, name: name.trim(), year: yearNum, startDate: typeof startDate === "string" && startDate ? startDate : null, endDate: typeof endDate === "string" && endDate ? endDate : null, status, scoringType, }; if (scoringPattern && typeof scoringPattern === "string") { seasonData.scoringPattern = scoringPattern; } if (totalMajors && typeof totalMajors === "string") { const totalMajorsNum = parseInt(totalMajors, 10); if (!isNaN(totalMajorsNum) && totalMajorsNum > 0) { seasonData.totalMajors = totalMajorsNum; } } await createSportsSeason(seasonData); return redirect("/admin/sports-seasons"); } catch (error) { console.error("Error creating sports season:", error); return { error: "Failed to create sports season. Please try again." }; } } export default function NewSportsSeason({ loaderData, actionData }: Route.ComponentProps) { const { sports } = loaderData; const currentYear = new Date().getFullYear(); const [scoringPattern, setScoringPattern] = useState(""); return (

Create New Sports Season

Add a new season for a sport

Sports Season Details Enter the information for the new sports season
{sports.length === 0 && (

No sports available. Create a sport first.

)}

Playoffs: Team sports playoffs. Regular Season: Full season standings. Majors: Individual sport majors.

Qualifying Points: For sports like Golf/Tennis where participants earn points across majors, then top 8 get fantasy points.

{scoringPattern === "qualifying_points" && (

How many major tournaments will be tracked? (e.g., Golf has 4 majors, Tennis has 4 Grand Slams)

)} {actionData?.error && (
{actionData.error}
)}
); }