import { ActionFunctionArgs, json, LoaderFunctionArgs } from "@remix-run/node"; import { Form, useActionData, useLoaderData } from "@remix-run/react"; import { useState } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Badge } from "~/components/ui/badge"; import { Separator } from "~/components/ui/separator"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/components/ui/select"; import { Textarea } from "~/components/ui/textarea"; import { Alert, AlertDescription } from "~/components/ui/alert"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "~/components/ui/dialog"; import { MapPin, Plus, Search, Filter, Edit, Trash2, Eye, Layers, Route, Target, Truck, Recycle, Building, Users, Navigation, Download, Info } from "lucide-react"; import { LeafletMap } from "~/components/map/leaflet-map"; // Mock data untuk lokasi const mockLocations = [ { id: "1", name: "TPS Kelurahan Menteng", type: "tps", address: "Jl. Menteng Raya No. 45, Jakarta Pusat", coordinates: [-6.1944, 106.8229] as [number, number], status: "active", capacity: 500, currentLoad: 320, lastPickup: "2024-01-15 08:30", coverage: "Menteng, Gondangdia", population: 15000, schedule: "Senin, Rabu, Jumat" }, { id: "2", name: "TPS Kelurahan Cikini", type: "tps", address: "Jl. Cikini Raya No. 12, Jakarta Pusat", coordinates: [-6.1889, 106.8317] as [number, number], status: "active", capacity: 300, currentLoad: 180, lastPickup: "2024-01-15 09:15", coverage: "Cikini, Pegangsaan", population: 12000, schedule: "Selasa, Kamis, Sabtu" }, { id: "3", name: "Rumah Kompos Kemayoran", type: "composting", address: "Jl. Kemayoran No. 88, Jakarta Pusat", coordinates: [-6.1725, 106.8584] as [number, number], status: "maintenance", capacity: 1000, currentLoad: 450, lastPickup: "2024-01-14 16:00", coverage: "Kemayoran, Senen", population: 25000, schedule: "Harian" }, { id: "4", name: "Bank Sampah Tanah Abang", type: "waste_bank", address: "Jl. Tanah Abang II No. 67, Jakarta Pusat", coordinates: [-6.1822, 106.8142] as [number, number], status: "active", capacity: 200, currentLoad: 95, lastPickup: "2024-01-15 14:20", coverage: "Tanah Abang", population: 8000, schedule: "Senin, Kamis" } ]; export async function loader({ request }: LoaderFunctionArgs) { // Mock statistics const stats = { totalLocations: mockLocations.length, activeLocations: mockLocations.filter((l) => l.status === "active").length, totalPopulation: mockLocations.reduce((sum, l) => sum + l.population, 0), averageLoad: Math.round( mockLocations.reduce( (sum, l) => sum + (l.currentLoad / l.capacity) * 100, 0 ) / mockLocations.length ), coverageArea: "45.2 km²" }; return json({ locations: mockLocations, stats }); } export async function action({ request }: ActionFunctionArgs) { const formData = await request.formData(); const intent = formData.get("intent"); try { switch (intent) { case "add-location": console.log("Adding new location..."); break; case "edit-location": console.log("Editing location..."); break; case "delete-location": console.log("Deleting location..."); break; } return json({ success: true, message: "Operasi berhasil!" }); } catch (error) { return json( { success: false, message: "Terjadi kesalahan." }, { status: 400 } ); } } export default function AreaCoverage() { const { locations, stats } = useLoaderData(); const actionData = useActionData(); const [selectedLocation, setSelectedLocation] = useState< (typeof mockLocations)[0] | null >(null); const [filter, setFilter] = useState("all"); const [searchTerm, setSearchTerm] = useState(""); const [showAddDialog, setShowAddDialog] = useState(false); const filteredLocations = locations.filter((location) => { const matchesFilter = filter === "all" || location.type === filter || location.status === filter; const matchesSearch = location.name.toLowerCase().includes(searchTerm.toLowerCase()) || location.address.toLowerCase().includes(searchTerm.toLowerCase()); return matchesFilter && matchesSearch; }); const getTypeIcon = (type: string) => { switch (type) { case "tps": return ; case "composting": return ; case "waste_bank": return ; default: return ; } }; const getTypeLabel = (type: string) => { switch (type) { case "tps": return "TPS"; case "composting": return "Kompos"; case "waste_bank": return "Bank Sampah"; default: return type; } }; return (

Area Coverage

Kelola dan pantau area cakupan layanan pengelolaan sampah

{actionData && ( {actionData.message} )} {/* Statistics Cards */}
Total Lokasi
{stats.totalLocations}
Lokasi Aktif
{stats.activeLocations}
Total Penduduk
{stats.totalPopulation.toLocaleString()}
Rata-rata Load
{stats.averageLoad}%
Area Cakupan
{stats.coverageArea}
Map View List View Tambah Lokasi Baru Tambahkan lokasi pengelolaan sampah baru