import { Person } from "../items"; import { Link } from "react-router-dom"; import { useState, useEffect, useMemo } from "react"; import { get_auth_status, refresh_state, get_is_admin } from "./api"; import type { ToastType } from "./Toast"; import { EmptyState } from "./components/EmptyState"; import "./PersonList.css" interface Props { people: Person[]; loading?: boolean; onShowToast?: (message: string, type?: ToastType) => void; } export const PersonList = ({ people, loading = false, onShowToast }: Props) => { const [current_user, set_current_user] = useState(""); const [isRefreshing, setIsRefreshing] = useState(false); const [searchQuery, setSearchQuery] = useState(""); useEffect(() => { get_auth_status().then((res) => { if (res) { set_current_user(res.username); } }); }, []); const filteredPeople = useMemo(() => { if (!searchQuery) return people; return people.filter(person => person.name.toLowerCase().includes(searchQuery.toLowerCase()) ); }, [people, searchQuery]); const handleRefresh = async () => { setIsRefreshing(true); try { await refresh_state(); onShowToast?.("State refreshed from file successfully", "success"); window.location.reload(); } catch (err) { console.error(err); onShowToast?.("Failed to refresh state from file", "error"); } finally { setIsRefreshing(false); } }; const isAdmin = get_is_admin(); return (

People List {filteredPeople.length > 0 && ({filteredPeople.length})}

setSearchQuery(e.target.value)} style={{ padding: "0.5rem 1rem", fontSize: "0.9rem", minWidth: "200px" }} /> {isAdmin && ( )}
{loading ? (
{Array.from({ length: 6 }).map((_, i) => (
))}
) : filteredPeople.length === 0 ? ( ) : (
{filteredPeople.map((person, index) => { if (person.name.toLowerCase() === current_user.toLowerCase()) { return (

{person.name}

{person.opinion.length} opinion(s)
); } return (

{person.name}

{person.opinion.length} opinion(s)
); })}
)}
); };