'use client' import { Suspense, useState } from 'react' import Link from 'next/link' import { useRouter, useSearchParams } from 'next/navigation' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Skeleton } from '@/components/ui/skeleton' import { TagInput } from '@/components/shared/tag-input' import { CountrySelect } from '@/components/ui/country-select' import { PhoneInput } from '@/components/ui/phone-input' import { toast } from 'sonner' import { ArrowLeft, Save, Loader2, AlertCircle, FolderPlus, } from 'lucide-react' function NewProjectPageContent() { const router = useRouter() const searchParams = useSearchParams() const roundIdParam = searchParams.get('round') const programIdParam = searchParams.get('program') const [selectedProgramId, setSelectedProgramId] = useState(programIdParam || '') const [selectedRoundId, setSelectedRoundId] = useState(roundIdParam || '') // Form state const [title, setTitle] = useState('') const [teamName, setTeamName] = useState('') const [description, setDescription] = useState('') const [tags, setTags] = useState([]) const [contactEmail, setContactEmail] = useState('') const [contactName, setContactName] = useState('') const [contactPhone, setContactPhone] = useState('') const [country, setCountry] = useState('') const [city, setCity] = useState('') const [institution, setInstitution] = useState('') const [competitionCategory, setCompetitionCategory] = useState('') const [oceanIssue, setOceanIssue] = useState('') // Fetch programs const { data: programs, isLoading: loadingPrograms } = trpc.program.list.useQuery({ status: 'ACTIVE', includeRounds: true, }) // Fetch wizard config for selected program (dropdown options) const { data: wizardConfig } = trpc.program.getWizardConfig.useQuery( { programId: selectedProgramId }, { enabled: !!selectedProgramId } ) // Create mutation const utils = trpc.useUtils() const createProject = trpc.project.create.useMutation({ onSuccess: () => { toast.success('Project created successfully') utils.project.list.invalidate() utils.round.get.invalidate() router.push('/admin/projects') }, onError: (error) => { toast.error(error.message) }, }) // Get rounds for selected program const selectedProgram = programs?.find((p) => p.id === selectedProgramId) const rounds = selectedProgram?.rounds || [] // Get dropdown options from wizard config const categoryOptions = wizardConfig?.competitionCategories || [] const oceanIssueOptions = wizardConfig?.oceanIssues || [] const handleSubmit = () => { if (!title.trim()) { toast.error('Please enter a project title') return } if (!selectedProgramId) { toast.error('Please select a program') return } createProject.mutate({ programId: selectedProgramId, roundId: selectedRoundId || undefined, title: title.trim(), teamName: teamName.trim() || undefined, description: description.trim() || undefined, tags: tags.length > 0 ? tags : undefined, country: country || undefined, competitionCategory: competitionCategory as 'STARTUP' | 'BUSINESS_CONCEPT' | undefined || undefined, oceanIssue: oceanIssue as 'POLLUTION_REDUCTION' | 'CLIMATE_MITIGATION' | 'TECHNOLOGY_INNOVATION' | 'SUSTAINABLE_SHIPPING' | 'BLUE_CARBON' | 'HABITAT_RESTORATION' | 'COMMUNITY_CAPACITY' | 'SUSTAINABLE_FISHING' | 'CONSUMER_AWARENESS' | 'OCEAN_ACIDIFICATION' | 'OTHER' | undefined || undefined, institution: institution.trim() || undefined, contactPhone: contactPhone.trim() || undefined, contactEmail: contactEmail.trim() || undefined, contactName: contactName.trim() || undefined, city: city.trim() || undefined, }) } if (loadingPrograms) { return } return (
{/* Header */}

Add Project

Manually create a new project submission

{/* Program & Round selection */} Program & Round Select the program for this project. Round assignment is optional. {!programs || programs.length === 0 ? (

No Active Programs

Create a program first before adding projects

) : (
)}
{selectedProgramId && ( <>
{/* Basic Info */} Project Details Basic information about the project
setTitle(e.target.value)} placeholder="e.g., Ocean Cleanup Initiative" />
setTeamName(e.target.value)} placeholder="e.g., Blue Ocean Foundation" />