import React, { useEffect, useState } from 'react'; import { useSearchParams, useNavigate } from 'react-router-dom'; import { motion } from 'framer-motion'; import { Shield, CheckCircle, AlertCircle, ChevronRight, KeyRound, Eye, EyeOff } from 'lucide-react'; import { axiosInstance } from '../services/axios'; import { useAuthStore } from '../hooks/use-auth'; import { useToast } from '../hooks/use-toast'; export const InvitePage: React.FC = () => { const { success } = useToast(); const [searchParams] = useSearchParams(); const token = searchParams.get('token'); const navigate = useNavigate(); const { setAuth } = useAuthStore(); const [status, setStatus] = useState<'loading' | 'valid' | 'invalid'>('loading'); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!token) { setStatus('invalid'); return; } // verify token on mount const verifyToken = async () => { try { const response = await axiosInstance.get(`/auth/invite/${token}`); setEmail(response.data.email); setStatus('valid'); } catch (err) { setStatus('invalid'); } }; verifyToken(); }, [token]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (password !== confirmPassword) { setError('Passwords do not match'); return; } if (password.length < 8) { setError('Password must be at least 8 characters long'); return; } setIsSubmitting(true); try { const response = await axiosInstance.post('/auth/invite/accept', { token, password }); // Show success toast success('Account activated successfully!'); // Set auth store setAuth({ user: response.data.user, accessToken: response.data.token }); // Redirect based on role / status setTimeout(() => { if (response.data.user.role === 'ADMIN') { navigate('/admin'); } else if (response.data.user.onboardingStatus === 'APPROVED') { navigate('/client'); } else { navigate('/onboarding'); } }, 1000); } catch (err: any) { setError(err.response?.data?.detail || err.response?.data?.error || 'Activation failed'); setIsSubmitting(false); } }; if (status === 'loading') { return (
); } if (status === 'invalid') { return (

Invalid or Expired Link

The onboarding invitation link is invalid, expired, or has already been used. Please request a new invitation from your administrator.

); } return (
{/* Monochromatic background accent */}

Welcome to Tech4Biz

Set up your partner account for {email}

{error && (

{error}

)}
setPassword(e.target.value)} className="w-full pl-11 pr-10 py-3.5 bg-ink-50 border border-ink-200 rounded-xl text-sm font-medium focus:ring-4 focus:ring-ink-900/10 outline-none transition-all placeholder-ink-400 text-ink-900" placeholder="Enter a secure password" required />
setConfirmPassword(e.target.value)} className="w-full pl-11 pr-10 py-3.5 bg-ink-50 border border-ink-200 rounded-xl text-sm font-medium focus:ring-4 focus:ring-ink-900/10 outline-none transition-all placeholder-ink-400 text-ink-900" placeholder="Confirm your password" required />
); }; export default InvitePage;