import { json, redirect, type ActionFunctionArgs, type LoaderFunctionArgs } from "@remix-run/node"; import { Form, useActionData, useNavigation } from "@remix-run/react"; import { useState, useEffect } from "react"; import { cn } from "~/lib/utils"; import { Button } from "~/components/ui/button"; import { Card, CardContent } from "~/components/ui/card"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Alert, AlertDescription } from "~/components/ui/alert"; import { Recycle, Mail, Lock, Eye, EyeOff, Shield, AlertCircle, Loader2 } from "lucide-react"; import { Boxes } from "~/components/ui/background-boxes"; import { ThemeFloatingDock } from "~/components/ui/floatingthemeswitch"; // Interface untuk action response interface LoginActionData { errors?: { email?: string; password?: string; general?: string; }; success: boolean; } // Loader - cek apakah user sudah login export const loader = async ({ request }: LoaderFunctionArgs) => { // Dalam implementasi nyata, cek session/cookie // const session = await getSession(request.headers.get("Cookie")); // if (session.has("adminId")) { // return redirect("/admin/dashboard"); // } return json({}); }; // Action untuk handle login export const action = async ({ request }: ActionFunctionArgs): Promise => { const formData = await request.formData(); const email = formData.get("email") as string; const password = formData.get("password") as string; const remember = formData.get("remember") === "on"; // Validation const errors: { email?: string; password?: string; general?: string } = {}; if (!email) { errors.email = "Email wajib diisi"; } else if (!/\S+@\S+\.\S+/.test(email)) { errors.email = "Format email tidak valid"; } if (!password) { errors.password = "Password wajib diisi"; } else if (password.length < 6) { errors.password = "Password minimal 6 karakter"; } if (Object.keys(errors).length > 0) { return json({ errors, success: false }, { status: 400 }); } // Simulasi autentikasi - dalam implementasi nyata, cek ke database if (email === "admin@wastemanagement.com" && password === "admin123") { // Set session dan redirect // const session = await getSession(request.headers.get("Cookie")); // session.set("adminId", "admin-001"); // session.set("adminName", "Administrator"); // session.set("adminEmail", email); // Redirect ke OTP verification return redirect( `/sys-rijig-administator/emailotpverifyrequired?email=${encodeURIComponent( email )}` ); } return json( { errors: { general: "Email atau password salah" }, success: false }, { status: 401 } ); }; export default function AdminLogin() { const actionData = useActionData(); const navigation = useNavigation(); const [showPassword, setShowPassword] = useState(false); const isSubmitting = navigation.state === "submitting"; return (
{/* Background overlay with theme-aware gradient */}
{/* Animated background boxes */} {/* Theme Toggle - Positioned at top-right */} {/* Main content container */}
{/* Form Login */}
{/* Header */}

Portal Administrator

Sistem Pengelolaan Sampah Terpadu

{/* Error Alert */} {actionData?.errors?.general && ( {actionData.errors.general} )} {/* Email Field */}
{actionData?.errors?.email && (

{actionData.errors.email}

)}
{/* Password Field */}
{actionData?.errors?.password && (

{actionData.errors.password}

)}
{/* Remember Me */}
{/* Submit Button */} {/* Demo Credentials */}

Demo Credentials:

Email: admin@wastemanagement.com

Password: admin123

{/* Side Illustration */}

Kelola Sistem Sampah

Platform terpadu untuk mengelola pengumpulan, pengolahan, dan monitoring sampah di seluruh wilayah dengan efisiensi maksimal.

{/* Features List */}
{[ "Monitoring Real-time", "Manajemen Armada", "Laporan Analytics", "Koordinasi Tim" ].map((feature, index) => (
{feature}
))}
{/* Decorative Elements */}
{/* Footer */}

© 2025 Waste Management System. Semua hak dilindungi.

); }