// screen-home.jsx — fetches ideas from the real API const { useState: useHomeState, useEffect: useHomeEffect } = React; function HomeScreen({ search, currentUser, votes, onVote, openIdea }) { const Icon = window.Icon; const [cats, setCats] = useHomeState(['All']); const [cat, setCat] = useHomeState('All'); const [sort, setSort] = useHomeState('rank'); const [sortOpen, setSortOpen] = useHomeState(false); const [page, setPage] = useHomeState(1); const [perPage, setPerPage] = useHomeState(6); const [ideas, setIdeas] = useHomeState([]); const [total, setTotal] = useHomeState(0); const [loading, setLoading] = useHomeState(false); useHomeEffect(() => { window.API.getCategories() .then(cs => setCats(['All', ...cs.map(c => c.name)])) .catch(() => setCats(['All', ...window.CATEGORIES.map(c => c.name)])); }, []); useHomeEffect(() => { let cancelled = false; setLoading(true); const params = { page, per: perPage, sort }; if (cat !== 'All') params.category = cat; if (search.trim()) params.search = search.trim(); window.API.getIdeas(params) .then(res => { if (!cancelled) { setIdeas(res.ideas); setTotal(res.total); } }) .catch(() => {}) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [cat, sort, page, perPage, search]); const pages = Math.max(1, Math.ceil(total / perPage)); const cur = Math.min(page, pages); const sortLabels = { rank: 'Default order', top: 'Most upvoted', views: 'Most viewed' }; const norm = (i) => ({ ...i, up: Number(i.up_votes ?? i.up ?? 0), down: Number(i.down_votes ?? i.down ?? 0), comments: Number(i.comment_count ?? i.comments ?? 0), date: i.date || (i.created_at ? new Date(i.created_at).toLocaleDateString('en-GB') : ''), rank: Number(i.rank ?? i.id), desc: i.description || i.desc || '', }); const firstName = currentUser?.name?.split(' ')[0] || 'there'; return (
Welcome back, {firstName}
Here's what's happening across the idea pool this week.
This week
{window.STATS_HOME.map(s => )}
Ideas
{cats.map(c => ( ))}
{sortOpen && (
{Object.entries(sortLabels).map(([k, v]) => ( ))}
)}
{loading && ( )} {!loading && ideas.map(raw => { const i = norm(raw); return ( openIdea(i)}> ); })} {!loading && ideas.length === 0 && ( )}
#UsernameIdea title CategoryDescriptionStatistics
Loading…
#{i.rank}
{i.author}
{i.title}
{i.desc}
onVote(i.id, d)} />
No ideas match your filters.
Per page:
{Array.from({ length: pages }).map((_, idx) => ( ))}
); } window.HomeScreen = HomeScreen;