import React, { useEffect, useMemo, useState } from "react"; import { View, Text, ScrollView, ActivityIndicator, useColorScheme, TouchableOpacity, } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; import SearchBar from "../components/SearchBar"; import CollapsibleCategory, { CollapsibleCategoryProps } from "../components/CollapsibleCategory"; import { entriesApi } from "../services/api"; // Cycles through as many groups as the API returns const PALETTE: Pick[] = [ { icon: "book-outline", color: "#3B7DD8", darkColor: "#5E9EF4" }, { icon: "book-outline", color: "#2E9E6B", darkColor: "#4EC992" }, { icon: "book-outline", color: "#9B4FB8", darkColor: "#C47CE0" }, { icon: "book-outline", color: "#C4622D", darkColor: "#E07B45" }, { icon: "book-outline", color: "#B8834F", darkColor: "#D4A574" }, { icon: "book-outline", color: "#2E7D9E", darkColor: "#4EA8C9" }, ]; export default function AllFeed() { const dark = useColorScheme() === "dark"; const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [query, setQuery] = useState(""); const loadGroups = () => { setLoading(true); setError(""); entriesApi.getGroups() .then(setGroups) .catch(() => setError("Couldn't load groups.")) .finally(() => setLoading(false)); }; useEffect(() => { loadGroups(); }, []); const visibleGroups = useMemo(() => { if (!query.trim()) return groups; const lower = query.toLowerCase(); return groups.filter((g) => g.toLowerCase().includes(lower)); }, [query, groups]); return ( {/* Header */} Discover {loading ? "Loading…" : `${groups.length} groups`} {/* States */} {loading ? ( ) : error ? ( ⚠️ {error} Retry ) : ( {visibleGroups.length === 0 ? ( 🔍 No groups match "{query}" Try a different search term. ) : ( visibleGroups.map((groupName, index) => ( )) )} )} ); }