import { Link, useLocation } from "react-router-dom"; import { createPageUrl } from "@/utils"; import { LayoutDashboard, Users, Map, TreePine, CloudOff, Menu, X, ChevronRight, Shield, Wifi, WifiOff, RefreshCw, LogOut } from "lucide-react"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { OfflineService, isOnline as checkIsOnline } from "@/components/common/offlineStorage"; import {useAuth} from '@/lib/AuthContext'; function SyncIndicator() { const [online, setOnline] = useState(checkIsOnline()); const [pendingCount, setPendingCount] = useState(0); useEffect(() => { let mounted = true; const updateStatus = async () => { const isConnected = await checkInternet(); const count = await OfflineService.getPendingCount(); if (mounted) { setOnline(isConnected); setPendingCount(count); } }; updateStatus(); // Event listener untuk perubahan koneksi const handleStatusChange = () => updateStatus(); window.addEventListener("online", handleStatusChange); window.addEventListener("offline", handleStatusChange); const interval = setInterval(updateStatus, 3000); // Polling setiap 3 detik return () => { mounted = false; window.removeEventListener("online", handleStatusChange); window.removeEventListener("offline", handleStatusChange); clearInterval(interval); }; }, []); const isSyncPending = online && pendingCount > 0; return (
{!online && } {online && isSyncPending && } {online && !isSyncPending && }

{!online ? "Offline" : isSyncPending ? "Online (Sinkronisasi...)" : "Online"}

{!online ? "Data disimpan lokal" : isSyncPending ? `${pendingCount} data diproses` : "Data sinkron"}

); } // async function checkInternet() { // if (!navigator.onLine) return false; // try { // const controller = new AbortController(); // setTimeout(() => controller.abort(), 3000); // const res = await fetch("/ping", { // method: "HEAD", // cache: "no-store", // signal: controller.signal, // }); // return res.ok; // } catch { // return false; // } // } async function checkInternet() { if (!navigator.onLine) return false; try { const controller = new AbortController(); setTimeout(() => controller.abort(), 3000); await fetch("https://www.google.com/favicon.ico", { method: "HEAD", mode: "no-cors", cache: "no-store", signal: controller.signal, }); return true; } catch { return false; } } const navigation = [ { name: "Dashboard", page: "Dashboard", icon: LayoutDashboard , roles: ['super_admin','fasilitator']}, { name: "Petani", page: "Farmers", icon: Users, roles: ['super_admin','fasilitator'] }, { name: "Lahan", page: "Lands", icon: Map, roles: ['super_admin','fasilitator'] }, { name: "Tanaman", page: "Plants", icon: TreePine, roles: ['super_admin','fasilitator'] }, { name: "Produktivitas", page: "ProductivityMonitoring", icon: LayoutDashboard, roles: ['super_admin', 'petani','fasilitator'] }, { name: "Facilitator", page: "Validators", icon: Shield, roles: ['super_admin','fasilitator'] }, { name: "Offtaker", page: "Offtakers", icon: Users, roles: ['super_admin','fasilitator'] }, { name: "Portal Petani", page: "FarmerPortal", icon: Users, roles: ['super_admin', 'petani','fasilitator'] }, { name: "Portal Validator", page: "ValidatorPortal", icon: Shield, roles: ['super_admin','fasilitator'] }, { name: "Portal Offtaker", page: "OfftakerPortal", icon: Users, roles: ['super_admin','fasilitator'] }, ]; export default function LayoutCopy({ children, currentPageName }) { const [sidebarOpen, setSidebarOpen] = useState(false); const location = useLocation(); const { user, logout } = useAuth(); // if (!user) { // return
Memuat Sesi...
; // } const filteredNavigation = navigation.filter((item) => { if (!user?.role) return false; return item.roles.includes(user.role); }); const isActivePage = (pageName) => { return currentPageName === pageName || location.pathname.includes(pageName.toLowerCase()); }; return (
{/* Mobile Header */}
{/* */}
AgroMonev
{/* Mobile Sidebar Overlay */} {sidebarOpen && (
setSidebarOpen(false)} /> )} {/* Sidebar */} {/* Main Content */}
{children}
); }