143 lines
7.1 KiB
TypeScript
143 lines
7.1 KiB
TypeScript
"use client";
|
|
|
|
import React, { useState, useEffect } from "react";
|
|
import { useRouter, useSearchParams } from "next/navigation";
|
|
|
|
export default function OmniPayGateway() {
|
|
const router = useRouter();
|
|
const searchParams = useSearchParams();
|
|
|
|
const [isProcessing, setIsProcessing] = useState(false);
|
|
const [status, setStatus] = useState<"pending" | "scanning" | "success" | "failed">("pending");
|
|
|
|
const amount = searchParams.get("amount") || "0";
|
|
const licenses = searchParams.get("licenses") || "";
|
|
const sessionId = searchParams.get("session_id") || "";
|
|
|
|
// Animasi Inisialisasi
|
|
useEffect(() => {
|
|
setTimeout(() => {
|
|
if (status === "pending") setStatus("scanning");
|
|
}, 1500);
|
|
}, [status]);
|
|
|
|
const handlePay = () => {
|
|
setIsProcessing(true);
|
|
setStatus("scanning");
|
|
|
|
// Simulasi X-RAY Vision AI validasi pembayaran
|
|
setTimeout(() => {
|
|
setStatus("success");
|
|
setTimeout(() => {
|
|
router.push(`/id/admin?payment=success&session_id=${sessionId}`);
|
|
}, 2000);
|
|
}, 3000);
|
|
};
|
|
|
|
const handleCancel = () => {
|
|
router.push(`/id/admin?payment=cancel`);
|
|
};
|
|
|
|
const formattedAmount = new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR' }).format(Number(amount));
|
|
|
|
return (
|
|
<div className="min-h-screen bg-[#050B14] flex items-center justify-center p-4 relative overflow-hidden font-sans">
|
|
{/* Background Kuantum */}
|
|
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,_var(--tw-gradient-stops))] from-blue-900/20 via-[#050B14] to-[#050B14]"></div>
|
|
<div className="absolute inset-0 bg-gradient-to-b from-transparent to-[#00ff88]/5 pointer-events-none"></div>
|
|
|
|
<div className="relative z-10 w-full max-w-md bg-black/60 backdrop-blur-2xl border border-blue-500/30 rounded-3xl p-8 shadow-[0_0_50px_rgba(59,130,246,0.15)]">
|
|
|
|
{/* Header */}
|
|
<div className="text-center mb-10">
|
|
<div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-gradient-to-br from-blue-600 to-indigo-900 mb-4 shadow-[0_0_30px_rgba(37,99,235,0.5)]">
|
|
<svg className="w-8 h-8 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
|
|
</svg>
|
|
</div>
|
|
<h1 className="text-3xl font-extrabold text-transparent bg-clip-text bg-gradient-to-r from-blue-400 to-cyan-300 tracking-tight">
|
|
OMNIPAY X
|
|
</h1>
|
|
<p className="text-blue-400/60 text-sm mt-1 uppercase tracking-widest font-semibold">Sovereign Financial Vault</p>
|
|
</div>
|
|
|
|
{/* Invoice Card */}
|
|
<div className="bg-white/5 border border-white/10 rounded-2xl p-6 mb-8 relative overflow-hidden group hover:border-blue-500/50 transition-colors duration-500">
|
|
<div className="absolute top-0 right-0 w-32 h-32 bg-blue-500/10 rounded-full blur-3xl group-hover:bg-blue-500/20 transition-all duration-500"></div>
|
|
|
|
<div className="flex justify-between items-center mb-6">
|
|
<span className="text-gray-400 text-sm">Sesi Otorisasi</span>
|
|
<span className="text-xs font-mono text-blue-400 bg-blue-500/10 px-2 py-1 rounded border border-blue-500/20">
|
|
{sessionId.substring(0, 12).toUpperCase()}
|
|
</span>
|
|
</div>
|
|
|
|
<div className="mb-6">
|
|
<p className="text-gray-500 text-xs uppercase tracking-wider mb-1">Upgrade Infrastruktur</p>
|
|
<p className="text-white font-medium text-lg">{licenses.split(',').join(' & ')}</p>
|
|
</div>
|
|
|
|
<div className="pt-6 border-t border-white/10 flex justify-between items-end">
|
|
<span className="text-gray-400 text-sm">Total Tagihan</span>
|
|
<span className="text-3xl font-bold text-white tracking-tight">{formattedAmount}</span>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Action Engine */}
|
|
{status === "success" ? (
|
|
<div className="text-center p-6 bg-green-500/10 border border-green-500/30 rounded-2xl">
|
|
<div className="w-12 h-12 rounded-full bg-green-500/20 flex items-center justify-center mx-auto mb-3">
|
|
<svg className="w-6 h-6 text-green-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
|
</svg>
|
|
</div>
|
|
<h3 className="text-green-400 font-bold text-lg mb-1">Otorisasi Kuantum Berhasil</h3>
|
|
<p className="text-green-400/70 text-sm">Lisensi sedang disuntikkan ke simpul Alpha...</p>
|
|
</div>
|
|
) : (
|
|
<div className="space-y-4">
|
|
<button
|
|
onClick={handlePay}
|
|
disabled={isProcessing}
|
|
className={`w-full py-4 rounded-xl font-bold text-white shadow-lg transition-all duration-300 relative overflow-hidden ${
|
|
isProcessing
|
|
? "bg-blue-900/50 cursor-not-allowed border border-blue-500/30"
|
|
: "bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-500 hover:to-indigo-500 border border-transparent shadow-blue-500/20 hover:shadow-blue-500/40 transform hover:-translate-y-0.5"
|
|
}`}
|
|
>
|
|
{isProcessing ? (
|
|
<div className="flex items-center justify-center gap-3">
|
|
<svg className="animate-spin h-5 w-5 text-blue-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
|
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
|
|
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
|
</svg>
|
|
<span className="tracking-wide">Memproses Transmisi Kriptografis...</span>
|
|
</div>
|
|
) : (
|
|
<span className="tracking-wider">OTORISASI PEMBAYARAN</span>
|
|
)}
|
|
</button>
|
|
|
|
<button
|
|
onClick={handleCancel}
|
|
disabled={isProcessing}
|
|
className="w-full py-3 rounded-xl font-medium text-gray-400 hover:text-white hover:bg-white/5 transition-colors text-sm tracking-wide"
|
|
>
|
|
Batalkan Sesi
|
|
</button>
|
|
</div>
|
|
)}
|
|
|
|
{/* Footer */}
|
|
<div className="mt-8 text-center flex items-center justify-center gap-2 text-xs text-gray-600">
|
|
<svg className="w-3 h-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
</svg>
|
|
<span className="uppercase tracking-widest">Diamankan oleh JUMPA.ID Zero-Knowledge Engine</span>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|