'use client' import { useState, useCallback, useEffect } from 'react' import { useRouter } from 'next/navigation' import PageLayout from '../components/PageLayout' import TutorialModal, { createTutorialSteps } from '../components/TutorialModal' import useAuthStore from '../store/authStore' import { useUserStatus } from '../hooks/useUserStatus' import { CheckCircleIcon, XCircleIcon, EnvelopeOpenIcon, IdentificationIcon, InformationCircleIcon, DocumentCheckIcon, ArrowUpOnSquareIcon, PencilSquareIcon, ClipboardDocumentCheckIcon, AcademicCapIcon } from '@heroicons/react/24/outline' interface StatusItem { key: string label: string description: string complete: boolean icon: React.ComponentType> } export default function QuickActionDashboardPage() { const router = useRouter() const user = useAuthStore(s => s.user) const { userStatus, loading, error, refreshStatus } = useUserStatus() const [isClient, setIsClient] = useState(false) // Tutorial state const [isTutorialOpen, setIsTutorialOpen] = useState(false) const [currentTutorialStep, setCurrentTutorialStep] = useState(1) const [hasSeenTutorial, setHasSeenTutorial] = useState(false) useEffect(() => { setIsClient(true) // Check if user has seen tutorial before const tutorialSeen = localStorage.getItem('tutorial_seen') setHasSeenTutorial(!!tutorialSeen) }, []) // Derive status from real backend data const emailVerified = userStatus?.email_verified || false const idUploaded = userStatus?.documents_uploaded || false const additionalInfo = userStatus?.profile_completed || false const contractSigned = userStatus?.contract_signed || false const statusItems: StatusItem[] = [ { key: 'email', label: 'Email Verification', description: emailVerified ? 'Verified' : 'Missing', complete: emailVerified, icon: EnvelopeOpenIcon }, { key: 'id', label: 'ID Document', description: idUploaded ? 'Uploaded' : 'Missing', complete: idUploaded, icon: IdentificationIcon }, { key: 'info', label: 'Additional Info', description: additionalInfo ? 'Completed' : 'Missing', complete: additionalInfo, icon: InformationCircleIcon }, { key: 'contract', label: 'Contract', description: contractSigned ? 'Signed' : 'Missing', complete: contractSigned, icon: DocumentCheckIcon } ] // Action handlers - navigate to proper QuickAction pages const handleVerifyEmail = useCallback(() => { router.push('/quickaction-dashboard/register-email-verify') }, [router]) const handleUploadId = useCallback(() => { const userType = user?.userType || 'personal' router.push(`/quickaction-dashboard/register-upload-id/${userType}`) }, [router, user]) const handleCompleteInfo = useCallback(() => { const userType = user?.userType || 'personal' router.push(`/quickaction-dashboard/register-additional-information/${userType}`) }, [router, user]) const handleSignContract = useCallback(() => { const userType = user?.userType || 'personal' router.push(`/quickaction-dashboard/register-sign-contract/${userType}`) }, [router, user]) // Tutorial handlers const startTutorial = useCallback(() => { setCurrentTutorialStep(1) setIsTutorialOpen(true) }, []) const closeTutorial = useCallback(() => { setIsTutorialOpen(false) localStorage.setItem('tutorial_seen', 'true') setHasSeenTutorial(true) }, []) const nextTutorialStep = useCallback(() => { setCurrentTutorialStep(prev => prev + 1) }, []) const previousTutorialStep = useCallback(() => { setCurrentTutorialStep(prev => Math.max(1, prev - 1)) }, []) // Auto-start tutorial for new users useEffect(() => { if (isClient && !hasSeenTutorial && !loading && userStatus) { // Auto-start tutorial if user hasn't completed first step if (!emailVerified) { setTimeout(() => setIsTutorialOpen(true), 1000) } } }, [isClient, hasSeenTutorial, loading, userStatus, emailVerified]) // Create tutorial steps const tutorialSteps = createTutorialSteps( emailVerified, idUploaded, additionalInfo, contractSigned, user?.userType || 'personal', handleVerifyEmail, handleUploadId, handleCompleteInfo, handleSignContract, closeTutorial ) const canSignContract = emailVerified && idUploaded && additionalInfo // NEW: resend cooldown tracking (10 minutes like verify page) const RESEND_INTERVAL_MS = 10 * 60 * 1000 const getStorageKey = (email?: string | null) => `emailVerify:lastSent:${email || 'anon'}` const getLastSentAt = (email?: string | null) => { if (typeof window === 'undefined') return 0 try { return parseInt(localStorage.getItem(getStorageKey(email)) || '0', 10) || 0 } catch { return 0 } } const [resendRemainingSec, setResendRemainingSec] = useState(0) const formatMmSs = (total: number) => { const m = Math.floor(total / 60) const s = total % 60 return `${m}:${String(s).padStart(2, '0')}` } useEffect(() => { if (!isClient || emailVerified) return const last = getLastSentAt(user?.email) const remainingMs = Math.max(0, RESEND_INTERVAL_MS - (Date.now() - last)) setResendRemainingSec(Math.ceil(remainingMs / 1000)) if (remainingMs <= 0) return const id = setInterval(() => { setResendRemainingSec(s => (s > 0 ? s - 1 : 0)) }, 1000) return () => clearInterval(id) }, [isClient, emailVerified, user?.email]) return (
{/* Title */}

Welcome{isClient && user?.firstName ? `, ${user.firstName}` : ''}!

{isClient && user?.userType === 'company' ? 'Company Account' : 'Personal Account'}

{loading &&

Loading status...

} {error && (

Error loading account status

{error}

)}
{/* Cards */}
{/* Status Overview */}

Status Overview

{statusItems.map(item => { const CompleteIcon = item.complete ? CheckCircleIcon : XCircleIcon return (
{item.label} {item.description}
) })}
{/* Quick Actions */}
i

Quick Actions

{/* Email Verification */}
{/* NEW: resend feedback (only when not verified) */} {!emailVerified && (

{resendRemainingSec > 0 ? `Resend available in ${formatMmSs(resendRemainingSec)}` : 'You can request a new code now'}

)}
{/* ID Upload */} {/* Additional Info */} {/* Sign Contract */}
{!canSignContract && !contractSigned && (

Complete previous steps (email, ID, profile) before signing the contract.

)}
{/* Latest News */}

Latest News

  • New: Referral system launch – invite friends and earn rewards.
  • Profile completion unlocks more features. Keep progressing!
{/* Tutorial Modal */}
) }