"use client"; import { useState, useEffect } from "react"; import { FaPlay, FaMusic, FaSearch, FaKeyboard } from "react-icons/fa"; import { MdLibraryMusic } from "react-icons/md"; import { Root, Navbar, Logo, LogoIcon, NavLink, NavCtaLink } from "./styles/shared"; import { NavLeft, NavCenter, SearchBox, SearchInput, SearchButton, NavRight, ChipsBar, Chip, GridContainer, CardGrid, Card, ThumbnailWrapper, Thumbnail, PlayOverlay, PlayCircle, BadgeRow, Badge, CardMeta, CardInfo, CardTitle, CardSub, EmptyState, CtaSection, SectionHeading, OpenPlayerLink, PlayerDescription, } from "./page.styles"; interface KaraokeEntry { title: string; artist: string; thumbnail: string; has_srv: boolean; has_instrumental: boolean; code: string; } type KaraokeData = Record; function capitalize(s: string) { return s.charAt(0).toUpperCase() + s.slice(1); } export default function HomePage() { const [data, setData] = useState({}); const [activeChip, setActiveChip] = useState("all"); const [search, setSearch] = useState(""); useEffect(() => { fetch("/karaoke.json") .then((r) => r.json()) .then((json: KaraokeData) => setData(json)) .catch(() => {}); }, []); const categories = Object.keys(data); const chips = [ { key: "all", label: "All" }, ...categories.map((category) => ({ key: category, label: capitalize(category), })), ]; const visibleItems: KaraokeEntry[] = activeChip === "all" ? Object.values(data).flat() : data[activeChip] ?? []; const normalizedSearch = search.trim().toLowerCase(); const searchableItems = normalizedSearch ? Object.values(data).flat() : visibleItems; const filtered = normalizedSearch ? searchableItems.filter( (item) => item.title.toLowerCase().includes(normalizedSearch) || item.artist.toLowerCase().includes(normalizedSearch), ) : searchableItems; return ( LRC-Karaoke setSearch(e.target.value)} /> LRC-Type Create {chips.map((chip) => ( setActiveChip(chip.key)} > {chip.label} ))} {filtered.length === 0 ? ( No results found. ) : ( filtered.map((item) => ( {item.thumbnail ? ( ) : ( )} {(item.has_srv || item.has_instrumental) && ( {item.has_srv && SRV} {item.has_instrumental && Inst. Track} )} {item.title} {item.artist} )) )} Custom Player Open Player Load your own video, audio, LRC lyrics ); }