/* eslint-disable react-hooks/exhaustive-deps */ import { AvatarComp, ButtonCustom, CenterCustom, FloatingButton, Grid, LoaderCustom, Spacing, StackCustom, TextCustom, } from "@/components"; import NewWrapper from "@/components/_ShareComponent/NewWrapper"; import NoDataText from "@/components/_ShareComponent/NoDataText"; import CustomSkeleton from "@/components/_ShareComponent/SkeletonCustom"; import { MainColor } from "@/constants/color-palet"; import { useAuth } from "@/hooks/use-auth"; import Forum_BoxDetailSection from "@/screens/Forum/DiscussionBoxSection"; import { apiForumGetAll } from "@/service/api-client/api-forum"; import { apiUser } from "@/service/api-client/api-user"; import { router, useLocalSearchParams } from "expo-router"; import _ from "lodash"; import { useCallback, useEffect, useState } from "react"; import { RefreshControl, View } from "react-native"; const PAGE_SIZE = 5; export default function View_Forumku2() { const { id } = useLocalSearchParams(); const { user } = useAuth(); const [listData, setListData] = useState([]); const [dataUser, setDataUser] = useState(null); const [loading, setLoading] = useState(false); const [refreshing, setRefreshing] = useState(false); const [hasMore, setHasMore] = useState(true); const [page, setPage] = useState(1); const [count, setCount] = useState(0); useEffect(() => { onLoadDataProfile(id as string); }, [id]); useEffect(() => { setPage(1); setListData([]); setHasMore(true); fetchData(1, true); }, [user?.id]); const onLoadDataProfile = async (id: string) => { try { const response = await apiUser(id); setDataUser(response.data); } catch (error) { console.log("[ERROR]", error); } finally { } }; // 🔹 Fungsi fetch data const fetchData = async (pageNumber: number, clear: boolean) => { if (!user?.id) return; // Cegah multiple call if (!clear && (loading || refreshing)) return; const isRefresh = clear; if (isRefresh) setRefreshing(true); if (!isRefresh) setLoading(true); try { const response = await apiForumGetAll({ category: "forumku", authorId: id as string, userLoginId: user.id, page: String(pageNumber), // API terima string }); const newData = response.data.data || []; setListData((prev) => { const current = Array.isArray(prev) ? prev : []; return clear ? newData : [...current, ...newData]; }); setHasMore(newData.length === PAGE_SIZE); setPage(pageNumber); setCount(response.data.count); } catch (error) { console.error("[ERROR] Fetch forum:", error); setHasMore(false); } finally { setRefreshing(false); setLoading(false); } }; // 🔹 Pull-to-refresh const onRefresh = useCallback(() => { fetchData(1, true); }, [user?.id]); // 🔹 Infinite scroll const loadMore = useCallback(() => { if (hasMore && !loading && !refreshing) { fetchData(page + 1, false); } }, [hasMore, loading, refreshing, page, user?.id]); const randerHeaderComponent = () => ( <> @{dataUser?.username || "-"} {count || "0"} postingan Kunjungi Profile ); const renderList = ({ item }: { item: any }) => ( {}} isTruncate={true} href={`/forum/${item.id}`} isRightComponent={false} /> ); // Skeleton List (untuk initial load) const SkeletonListComponent = () => ( {Array.from({ length: 5 }).map((_, i) => ( ))} ); // Komponen Empty const EmptyComponent = () => ( ); // 🔹 Komponen Footer List (loading indicator) const ListFooterComponent = loading && !refreshing && listData.length > 0 ? ( {/* Memuat diskusi... */} ) : null; return ( <> router.navigate("/(application)/(user)/forum/create") } /> ) } listData={listData} renderItem={renderList} refreshControl={ } onEndReached={loadMore} ListHeaderComponent={randerHeaderComponent()} ListFooterComponent={ListFooterComponent} ListEmptyComponent={ loading && _.isEmpty(listData) ? : } /> ); }