"use client" import { useState, useEffect } from "react" import { useRouter } from "next/navigation" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Checkbox } from "@/components/ui/checkbox" import { useAuth } from "@/contexts/auth-context" import { getApiUrl } from "@/lib/api-config" interface Vertical { id: number name: string slug: string description: string | null } const StarIcon = ({ filled }: { filled: boolean }) => ( ) export function BandOnboarding({ onComplete }: { onComplete?: () => void }) { const [verticals, setVerticals] = useState([]) const [loading, setLoading] = useState(true) const [selectedBands, setSelectedBands] = useState([]) const [headliners, setHeadliners] = useState([]) const [step, setStep] = useState<"select" | "tier">("select") const [submitting, setSubmitting] = useState(false) const { token } = useAuth() const router = useRouter() useEffect(() => { async function fetchVerticals() { try { const res = await fetch(`${getApiUrl()}/verticals`) if (res.ok) { const data = await res.json() setVerticals(data) } } catch (error) { console.error("Failed to fetch verticals", error) } finally { setLoading(false) } } fetchVerticals() }, []) const toggleBand = (id: number) => { setSelectedBands(prev => prev.includes(id) ? prev.filter(b => b !== id) : [...prev, id] ) // Remove from headliners if deselected if (headliners.includes(id)) { setHeadliners(prev => prev.filter(h => h !== id)) } } const toggleHeadliner = (id: number) => { setHeadliners(prev => { if (prev.includes(id)) { return prev.filter(h => h !== id) } if (prev.length >= 3) { return prev // Limit 3 } return [...prev, id] }) } const handleContinue = () => { if (step === "select" && selectedBands.length > 0) { setStep("tier") } else { handleSubmit() } } const handleSubmit = async () => { setSubmitting(true) try { // Strategy: // 1. Bulk add all as 'standard' // 2. Update headliners to 'headliner' const bulkRes = await fetch(`${getApiUrl()}/verticals/preferences/bulk`, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` }, body: JSON.stringify({ vertical_ids: selectedBands, display_mode: "standard" }), }) if (!bulkRes.ok) throw new Error("Failed to save preferences") // Now set tiers await Promise.all(headliners.map(async (vid) => { await fetch(`${getApiUrl()}/verticals/preferences/${vid}`, { method: "PUT", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` }, body: JSON.stringify({ tier: "headliner", priority: 100 // High priority }), }) })) if (onComplete) { onComplete() } else { router.push("/") } } catch (error) { console.error("Error saving preferences", error) } finally { setSubmitting(false) } } if (loading) { return (
Loading bands...
) } return (

{step === "select" ? "Pick Your Bands" : "Who are your Headliners?"}

{step === "select" ? "Select the bands you follow. You can change this anytime." : "Pick up to 3 favorites to feature on your home page." }

{verticals.map((vertical) => ( ))}
{step === "select" ? `${selectedBands.length} selected` : `${headliners.length}/3 Headliners selected` }
{step === "tier" && ( )}
) }