import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import Layout from "@/components/Layout"; import SEO from "@/components/SEO"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Music, Download, Radio, Search, Filter } from "lucide-react"; // API Base URL for fetch requests const API_BASE = import.meta.env.VITE_API_BASE || ""; interface Track { id: string; user_id: string; title: string; description?: string; genre: string[]; license_type: string; duration_seconds?: number; download_count: number; created_at: string; user_profiles?: { id: string; full_name: string; avatar_url?: string; }; } const GENRES = [ "All Genres", "Synthwave", "Orchestral", "SFX", "Ambient", "Electronic", "Cinematic", "Jazz", "Hip-Hop", "Folk", ]; export default function TrackLibrary() { const [tracks, setTracks] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(""); const [selectedGenre, setSelectedGenre] = useState("All Genres"); const [licenseFilter, setLicenseFilter] = useState("all"); const [sortBy, setSortBy] = useState("newest"); useEffect(() => { const fetchTracks = async () => { try { const params = new URLSearchParams(); params.append("limit", "100"); if (searchQuery) params.append("search", searchQuery); if (selectedGenre !== "All Genres") params.append("genre", selectedGenre); if (licenseFilter !== "all") params.append("licenseType", licenseFilter); const res = await fetch(`${API_BASE}/api/ethos/tracks?${params}`); const { data } = await res.json(); let sorted = [...data]; if (sortBy === "newest") { sorted.sort( (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime(), ); } else if (sortBy === "popular") { sorted.sort((a, b) => b.download_count - a.download_count); } setTracks(sorted); } catch (error) { console.error("Failed to fetch tracks:", error); } finally { setLoading(false); } }; const timer = setTimeout(fetchTracks, 300); return () => clearTimeout(timer); }, [searchQuery, selectedGenre, licenseFilter, sortBy]); const formatDuration = (seconds?: number) => { if (!seconds) return "—"; const mins = Math.floor(seconds / 60); const secs = seconds % 60; return `${mins}:${secs.toString().padStart(2, "0")}`; }; return ( <>
{/* Hero Section */}
Ethos Track Library

Discover Ethos Music & SFX

Browse original music and sound effects created by Ethos Guild artists. Use freely in your projects or license commercially.

{/* Search & Filters */}
setSearchQuery(e.target.value)} className="pl-12 bg-slate-800 border-slate-700 h-11" />
{/* Tracks Grid */}
{loading ? (

Loading tracks...

) : tracks.length === 0 ? (

No tracks found. Try adjusting your filters.

) : (
{tracks.map((track) => (

{track.title}

{track.user_profiles && ( {track.user_profiles.full_name} )}
{track.license_type === "ecosystem" ? "Free" : "Commercial"}
{track.genre.map((g) => ( {g} ))}
{track.description && (

{track.description}

)}
{track.download_count}
{track.duration_seconds && (
{formatDuration(track.duration_seconds)}
)}
))}
)}
); }