import { View, Text, TextInput, ScrollView, RefreshControl, Pressable } from "react-native"; import { useState, useCallback } from "react"; import { useRouter } from "expo-router"; import { Ionicons } from "@expo/vector-icons"; import { useTheme } from "../../../components/theme"; import { useQuery, usePaginatedQuery } from "convex/react"; import { api } from "../../../convex/_generated/api"; import { useAuth } from "../../_layout"; import { CategoryGrid } from "../../../components/category-grid"; import { AdCard } from "../../../components/ad-card"; import { Loading } from "../../../components/ui/loading"; import { CATEGORIES } from "../../../lib/constants"; export default function HomeScreen() { const theme = useTheme(); const router = useRouter(); const { isAuthenticated } = useAuth(); const [search, setSearch] = useState(""); const [refreshing, setRefreshing] = useState(false); const categories = useQuery(api.categories.list); const adsResult = usePaginatedQuery(api.ads.listPaginated, {}, { initialNumItems: 20 }); const ads = adsResult.results; const loadMoreAds = adsResult.loadMore; const adsStatus = adsResult.status; const searchResults = useQuery( api.ads.search, search.trim() ? { query: search.trim() } : "skip" ); const onRefresh = useCallback(() => { setRefreshing(true); setTimeout(() => setRefreshing(false), 800); }, []); const displayCategories = categories ?? CATEGORIES; const displayAds = search.trim() ? (searchResults ?? []) : ads; const isLoading = !search.trim() && adsStatus === "LoadingFirstPage"; return ( } contentContainerStyle={{ paddingBottom: 100 }} > МојМајстор Најдете мајстор за секоја работа {search.length > 0 && ( setSearch("")} style={{ padding: 4 }}> )} {!search.trim() && ( <> Категории router.push("/(tabs)/(explore)")} style={{ flexDirection: "row", alignItems: "center", gap: 2 }}> Види ги сите )} {search.trim() ? "Резултати" : "Неодамна додадени"} {!search.trim() && ( {ads.length}+ )} {(search.trim() ? searchResults === undefined : isLoading) ? ( ) : displayAds.length === 0 ? ( {search.trim() ? "Нема резултати" : "Нема огласи"} {search.trim() ? "Обидете се со друга пребарувачка фраза" : "Сè уште нема објавено огласи"} ) : ( displayAds.map((ad) => ( )) )} {!search.trim() && adsStatus === "CanLoadMore" && ( loadMoreAds(20)} style={{ backgroundColor: theme.colors.surface, borderRadius: theme.radius.lg, paddingVertical: 14, alignItems: "center", borderWidth: 1, borderColor: theme.colors.border, marginTop: theme.spacing.sm, ...theme.shadows.xs, }} > Вчитај повеќе )} {isAuthenticated && !search.trim() && ( router.push("/ad/create" as any)} style={{ width: 58, height: 58, borderRadius: 29, backgroundColor: theme.colors.primary, alignItems: "center", justifyContent: "center", ...theme.shadows.lg, }} > )} ); }