diff --git a/app/activate/page.tsx b/app/activate/page.tsx new file mode 100644 index 0000000..6369e83 --- /dev/null +++ b/app/activate/page.tsx @@ -0,0 +1,108 @@ +"use client"; +import { get } from "@/api/request"; +import { useSearchParams } from "next/navigation"; +import React, { useEffect, useState } from "react"; +import { CheckCircle, XCircle, Loader2 } from "lucide-react"; + +export default function Activate() { + const searchParams = useSearchParams(); + const t = searchParams.get("t") || ''; + const type = searchParams.get("type"); + + if (type === "confirm_email") { + return ; + } + + return <>; +} + +/** + * Email verification confirmation component + * @param {string} t - Verification token + */ +function ConfirmEmail({ t }: { t: string }) { + const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); + const [message, setMessage] = useState(''); + + useEffect(() => { + if (!t) { + setStatus('error'); + setMessage('Invalid verification token'); + return; + } + + get(`${process.env.NEXT_PUBLIC_JAVA_URL}/api/user/activate?t=${t}`) + .then((res) => { + setStatus('success'); + setMessage('Your registration has been verified. Please return to the official website to log in.'); + }) + .catch((err) => { + setStatus('error'); + setMessage('Verification failed. Please try again.'); + }); + }, [t]); + + const renderContent = () => { + switch (status) { + case 'loading': + return ( +
+
+
+ +
+

Verifying email...

+
+ ); + + case 'success': + return ( +
+
+
+ +
+

Verification Successful

+

{message}

+
+ ); + + case 'error': + return ( +
+
+
+ +
+

Verification Failed

+

{message}

+ +
+ ); + } + }; + + return ( +
+
+
+
+ {status === 'loading' && ( +
+

Email Verification

+

Please wait while we verify your email

+
+ )} + + {renderContent()} +
+
+
+ ); +}