"use client"; import axios from "axios"; import { ApiServerBaseUrl } from "@/utils/baseurl.utils"; import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/navigation"; import { getSocialAuthStatus } from "@/utils/commonFunction.utils"; import { Image as ImageIcon, Video, Album, Heart, MessageCircle, ExternalLink, BarChart3, Calendar, Filter, Search, RefreshCw, ChevronRight, Eye, MoreVertical, CheckCircle } from "lucide-react"; type MediaItem = { id: string; caption?: string; media_type: string; media_url: string; thumbnail_url?: string; permalink: string; timestamp: string; like_count?: number; comments_count?: number; children?: { data: MediaItem[] }; }; const LIMIT = 12; const Posts = () => { const router = useRouter(); const [media, setMedia] = useState([]); const [loading, setLoading] = useState(true); const [loadingMore, setLoadingMore] = useState(false); const [error, setError] = useState(""); const [afterCursor, setAfterCursor] = useState(null); const [hasMore, setHasMore] = useState(true); const [isInitialLoaded, setIsInitialLoaded] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const [refreshing, setRefreshing] = useState(false); const observerRef = useRef(null); /* 🔐 Validate + first fetch */ useEffect(() => { async function validate() { const userEmail = localStorage.getItem("user_email"); if (!userEmail) { router.push("/social-media-connect"); return; } const storedUser = localStorage.getItem("userDetails"); if (!storedUser) { router.push("/social-media-connect"); return; } const user = JSON.parse(storedUser); const role = user?.role; if (role === "customer") { const session = localStorage.getItem("payment_session"); if (!session) { router.push("/pricing"); return; } } const res = await getSocialAuthStatus(userEmail); if (!res?.connected) { router.push("/social-media-connect"); return; } fetchInitialMedia(); } validate(); }, []); /* ✅ FIRST FETCH ONLY */ const fetchInitialMedia = async () => { try { setLoading(true); const res: any = await axios.get( `${ApiServerBaseUrl}/social/media`, { params: { userId: localStorage.getItem("user_email"), limit: LIMIT, }, } ); setMedia(res.data?.data || []); setAfterCursor(res.data?.paging?.cursors?.after || null); setHasMore(!!res.data?.paging?.cursors?.after); setIsInitialLoaded(true); } catch (err: any) { setError(err.response?.data?.message || err.message); } finally { setLoading(false); } }; /* ➕ NEXT PAGE FETCH */ const fetchMoreMedia = async () => { if (!afterCursor || loadingMore) return; try { setLoadingMore(true); const res: any = await axios.get( `${ApiServerBaseUrl}/social/media`, { params: { userId: localStorage.getItem("user_email"), limit: LIMIT, after: afterCursor, }, } ); setMedia((prev) => [...prev, ...(res.data?.data || [])]); setAfterCursor(res.data?.paging?.cursors?.after || null); setHasMore(!!res.data?.paging?.cursors?.after); } catch (err: any) { setError(err.response?.data?.message || err.message); } finally { setLoadingMore(false); } }; /* 👀 OBSERVER — ONLY AFTER INITIAL LOAD */ useEffect(() => { if (!observerRef.current || !isInitialLoaded || !hasMore) return; const observer = new IntersectionObserver( (entries) => { if (entries[0].isIntersecting) { fetchMoreMedia(); } }, { threshold: 1 } ); observer.observe(observerRef.current); return () => observer.disconnect(); }, [afterCursor, isInitialLoaded, hasMore]); /* 🔄 REFRESH */ const handleRefresh = async () => { setRefreshing(true); await fetchInitialMedia(); setTimeout(() => setRefreshing(false), 1000); }; /* 🔍 FILTERED MEDIA */ const filteredMedia = media.filter(item => !searchQuery || item.caption?.toLowerCase().includes(searchQuery.toLowerCase()) ); /* 📱 GET MEDIA TYPE ICON */ const getMediaTypeIcon = (type: string) => { switch (type) { case "IMAGE": return ; case "VIDEO": return