import { ChevronRight } from "lucide-react"; import { Link } from "react-router-dom"; import { useEffect, useRef, useState } from "react"; import { getJSON, itemsOrEmpty, type Category, type Resource } from "../api"; import { CategoryIcon } from "../components/CategoryIcon"; import { FigmaBanner } from "../components/FigmaBanner"; import { ComingSoonLatestUpdateRow, LatestUpdateRow, } from "../components/LatestUpdateRow"; import { ComingSoonRecommendedCard, RecommendedCard, } from "../components/RecommendedCard"; import { SectionHeader } from "../components/SectionHeader"; import { useI18n } from "../i18n"; import { categoryCardLines } from "../utils/categoryDisplay"; export function Home() { const { t, lang } = useI18n(); const [cats, setCats] = useState([]); const [rec, setRec] = useState([]); const [latest, setLatest] = useState([]); const [err, setErr] = useState(null); const recRowRef = useRef(null); useEffect(() => { const q = `?lang=${encodeURIComponent(lang)}`; Promise.all([ getJSON(`/api/categories${q}`), getJSON<{ items: Resource[] }>(`/api/resources/recommended${q}&limit=12`), getJSON<{ items: Resource[] }>(`/api/resources/latest${q}&limit=8`), ]) .then(([c, r, l]) => { setCats(itemsOrEmpty(c)); setRec(itemsOrEmpty(r.items)); setLatest(itemsOrEmpty(l.items)); }) .catch((e) => setErr(String(e))); }, [lang]); const iconKeyForResource = (r: Resource) => cats.find((c) => c.id === r.categoryId)?.iconKey ?? "folder"; const scrollRec = (dir: 1 | -1) => { recRowRef.current?.scrollBy({ left: dir * 280, behavior: "smooth" }); }; const recommendedPlaceholderCount = Math.max(0, 5 - rec.length); const latestPlaceholderCount = Math.max(0, 5 - latest.length); if (err) { return (
{err}
); } return (
{cats.map((c) => { const { line1, line2 } = categoryCardLines(c.name); return (
{line1}
{line2 ? (
{line2}
) : null}
); })}
{rec.map((r, index) => (
))} {Array.from({ length: recommendedPlaceholderCount }).map( (_, index) => (
), )}
{latest.map((r) => ( ))} {Array.from({ length: latestPlaceholderCount }).map((_, index) => ( ))}
); }