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 axios from 'axios'; import { axiosInstance } from '../services/axios'; import { useAuthStore } from '../hooks/use-auth'; import { useToast } from '../hooks/use-toast'; export const InvitePage: React.FC = () => { const { success, error: toastError } = 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; } const validateToken = async () => { try { const response = await axios.get(`${import.meta.env.VITE_API_URL || 'http://localhost:5000/api/v1'}/auth/invite/${token}`); setEmail(response.data.email); setStatus('valid'); } catch (err) { setStatus('invalid'); } }; validateToken(); }, [token]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (password !== confirmPassword) { setError('Passwords do not match'); return; } if (password.length < 6) { setError('Password must be at least 6 characters'); return; } setIsSubmitting(true); try { const response = await axiosInstance.post('/auth/invite/accept', { token, password }); setAuth(response.data); success("Account created successfully", "Please complete your partner onboarding profile."); navigate('/onboarding'); } catch (err: any) { const errMsg = err.response?.data?.error || 'Failed to accept invite'; setError(errMsg); toastError("Failed to accept invite", errMsg); setIsSubmitting(false); } }; if (status === 'loading') { return (
); } if (status === 'invalid') { return (

Invalid or Expired Link

This invitation link is no longer valid. 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;