import { json, redirect, type LoaderFunctionArgs } from "@remix-run/node";
import { useLoaderData, Link } from "@remix-run/react";
import { useState, useEffect } from "react";
import { Card, CardContent, CardHeader } from "~/components/ui/card";
import { Button } from "~/components/ui/button";
import { Progress } from "~/components/ui/progress";
import {
Clock,
CheckCircle,
Phone,
Mail,
MessageSquare,
RefreshCw,
FileText,
Shield,
AlertCircle,
Users
} from "lucide-react";
// Progress Indicator Component
const ProgressIndicator = ({ currentStep = 4, totalSteps = 5 }) => {
return (
{Array.from({ length: totalSteps }, (_, index) => {
const stepNumber = index + 1;
const isActive = stepNumber === currentStep;
const isCompleted = stepNumber < currentStep;
return (
{isCompleted ? : stepNumber}
{stepNumber < totalSteps && (
)}
);
})}
);
};
// Interface
interface LoaderData {
phone: string;
submittedAt: string;
estimatedApprovalTime: string; // "1-3 hari kerja"
applicationId: string;
}
export const loader = async ({
request
}: LoaderFunctionArgs): Promise => {
const url = new URL(request.url);
const phone = url.searchParams.get("phone");
if (!phone) {
return redirect("/authpengelola/requestotpforregister");
}
// Simulasi data - dalam implementasi nyata, ambil dari database
return json({
phone,
submittedAt: new Date().toISOString(),
estimatedApprovalTime: "1-3 hari kerja",
applicationId: "WF" + Date.now().toString().slice(-6)
});
};
export default function WaitingApprovalFromAdministrator() {
const { phone, submittedAt, estimatedApprovalTime, applicationId } =
useLoaderData();
const [timeElapsed, setTimeElapsed] = useState(0);
// Timer untuk menunjukkan berapa lama sudah menunggu
useEffect(() => {
const interval = setInterval(() => {
const now = new Date().getTime();
const submitted = new Date(submittedAt).getTime();
const elapsed = Math.floor((now - submitted) / 1000 / 60); // minutes
setTimeElapsed(elapsed);
}, 60000); // Update setiap menit
return () => clearInterval(interval);
}, [submittedAt]);
// Format phone display
const formatPhone = (phoneNumber: string) => {
if (phoneNumber.length <= 2) return phoneNumber;
if (phoneNumber.length <= 5)
return `${phoneNumber.substring(0, 2)} ${phoneNumber.substring(2)}`;
if (phoneNumber.length <= 9)
return `${phoneNumber.substring(0, 2)} ${phoneNumber.substring(
2,
5
)} ${phoneNumber.substring(5)}`;
return `${phoneNumber.substring(0, 2)} ${phoneNumber.substring(
2,
5
)} ${phoneNumber.substring(5, 9)} ${phoneNumber.substring(9)}`;
};
// Format elapsed time
const formatElapsedTime = (minutes: number) => {
if (minutes < 60) return `${minutes} menit yang lalu`;
const hours = Math.floor(minutes / 60);
if (hours < 24) return `${hours} jam yang lalu`;
const days = Math.floor(hours / 24);
return `${days} hari yang lalu`;
};
// Simulasi status checker - dalam implementasi nyata, polling ke server
const checkStatus = () => {
// Untuk demo, redirect ke step berikutnya setelah beberapa detik
setTimeout(() => {
window.location.href = `/authpengelola/createanewpin?phone=${encodeURIComponent(
phone
)}`;
}, 2000);
};
return (
{/* Progress Indicator */}
{/* Main Card */}
Menunggu Persetujuan Administrator
Aplikasi Anda sedang dalam proses verifikasi
{/* Status Info */}
ID Aplikasi:{" "}
{applicationId}
{/* Progress Bar */}
Progress Verifikasi
75%
Estimasi waktu: {estimatedApprovalTime}
{/* Submitted Info */}
Aplikasi Berhasil Dikirim
Nomor WhatsApp: {formatPhone(phone)}
Waktu Kirim: {formatElapsedTime(timeElapsed)}
{/* Next Steps */}
Proses Selanjutnya
1
Verifikasi Data Perusahaan
Administrator akan memverifikasi informasi yang Anda berikan
2
Pengecekan Dokumen
Validasi legalitas dan kredibilitas perusahaan
3
Persetujuan & Aktivasi
Akun akan diaktivasi dan Anda bisa membuat PIN
{/* Contact Info */}
Butuh Bantuan atau Informasi?
{/* Action Buttons */}
{/* Important Note */}
Penting untuk Diingat
-
• Jangan tutup aplikasi ini, bookmark halaman untuk akses
mudah
-
• Anda akan mendapat notifikasi WhatsApp saat disetujui
-
• Proses verifikasi dilakukan pada hari kerja (Senin-Jumat)
-
• Pastikan nomor WhatsApp aktif untuk menerima notifikasi
{/* Demo Card */}
Demo Mode:
Klik "Cek Status Persetujuan" untuk simulasi approval dan lanjut
ke step terakhir
);
}