import { json, redirect, type ActionFunctionArgs, type LoaderFunctionArgs } from "@remix-run/node"; import { Form, useActionData, useNavigation } from "@remix-run/react"; import { useState } 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"; // ✅ Import services and utils import adminAuthService from "~/services/auth/admin.service"; import { generateDeviceId, validateEmail, validatePassword } from "~/utils/auth-utils"; import { getUserSession } from "~/sessions.server"; interface LoginActionData { errors?: { email?: string; password?: string; general?: string; }; success?: boolean; otpData?: { email: string; message: string; remaining_time: string; }; } // ✅ Proper loader with session check export const loader = async ({ request }: LoaderFunctionArgs) => { const userSession = await getUserSession(request); // Redirect if already logged in if (userSession && userSession.role === "administrator") { return redirect("/sys-rijig-adminpanel/dashboard"); } return json({}); }; // ✅ Action integrated with API service 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 using utils const errors: { email?: string; password?: string; general?: string } = {}; if (!email) { errors.email = "Email wajib diisi"; } else if (!validateEmail(email)) { errors.email = "Format email tidak valid"; } if (!password) { errors.password = "Password wajib diisi"; } else if (!validatePassword(password)) { errors.password = "Password harus minimal 8 karakter, mengandung huruf kapital, angka, dan simbol"; } if (Object.keys(errors).length > 0) { return json({ errors, success: false }, { status: 400 }); } try { // ✅ Generate device ID const deviceId = generateDeviceId("Admin"); // ✅ Call API service const response = await adminAuthService.login({ device_id: deviceId, email, password }); if (response.meta.status === 200 && response.data) { // ✅ Success - redirect to OTP verification with data const searchParams = new URLSearchParams({ email: response.data.email || email, device_id: deviceId, remaining_time: response.data.remaining_time || "5:00" }); return redirect( `/sys-rijig-administrator/emailotpverifyrequired?${searchParams.toString()}` ); } return json( { errors: { general: "Login gagal. Periksa email dan password Anda." }, success: false }, { status: 401 } ); } catch (error: any) { console.error("Login error:", error); // ✅ Handle API errors if (error.response?.data?.meta?.message) { return json( { errors: { general: error.response.data.meta.message }, success: false }, { status: error.response.status || 500 } ); } return json( { errors: { general: "Terjadi kesalahan server. Silakan coba lagi." }, success: false }, { status: 500 } ); } }; 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 */} {/* ✅ Updated demo credentials */}

Demo Credentials:

Email: pahmilucu123@gmail.com

Password: Halo12345,

⚠️ OTP akan dikirim ke email setelah login

{/* 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.

); }