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}
);
}