fediversion/frontend/app/[vertical]/venues/page.tsx
fullsizemalt 29c5d30ebb feat: Add multi-vertical frontend infrastructure
Phase 3 - Frontend Multi-Vertical Support:
- Add VerticalContext for band state management
- Add BandSelector dropdown component
- Create dynamic [vertical] routes for shows, songs, venues
- Update navbar to use band selector and vertical-aware links
- Update api-config.ts for Fediversion domain
- Rebrand from Elmeg to Fediversion
2025-12-28 13:56:22 -08:00

75 lines
2.6 KiB
TypeScript

import { VERTICALS } from "@/contexts/vertical-context"
import { notFound } from "next/navigation"
import { getApiUrl } from "@/lib/api-config"
interface Props {
params: { vertical: string }
}
export function generateStaticParams() {
return VERTICALS.map((v) => ({
vertical: v.slug,
}))
}
async function getVenues(verticalSlug: string) {
try {
const res = await fetch(`${getApiUrl()}/venues?vertical=${verticalSlug}`, {
next: { revalidate: 60 }
})
if (!res.ok) return []
return res.json()
} catch {
return []
}
}
export default async function VenuesPage({ params }: Props) {
const vertical = VERTICALS.find((v) => v.slug === params.vertical)
if (!vertical) {
notFound()
}
const venues = await getVenues(vertical.slug)
return (
<div className="space-y-6">
<div className="flex items-center justify-between">
<h1 className="text-3xl font-bold">
<span className="mr-2">{vertical.emoji}</span>
{vertical.name} Venues
</h1>
</div>
{venues.length === 0 ? (
<div className="text-center py-12 text-muted-foreground">
<p>No venues imported yet for {vertical.name}.</p>
<p className="text-sm mt-2">Run the data importer to populate venues.</p>
</div>
) : (
<div className="grid gap-3">
{venues.map((venue: any) => (
<a
key={venue.id}
href={`/${vertical.slug}/venues/${venue.slug}`}
className="flex justify-between items-center p-4 rounded-lg border bg-card hover:bg-accent transition-colors"
>
<div>
<div className="font-semibold">{venue.name}</div>
<div className="text-sm text-muted-foreground">
{venue.city}, {venue.state || venue.country}
</div>
</div>
{venue.capacity && (
<div className="text-sm text-muted-foreground">
Capacity: {venue.capacity.toLocaleString()}
</div>
)}
</a>
))}
</div>
)}
</div>
)
}