import { useState, useEffect } from "react"; import { Link } from "wouter"; import Layout from "@/components/Layout"; import SEO from "@/components/SEO"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Progress } from "@/components/ui/progress"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Rocket, CheckCircle2, Clock, Users, BookOpen, MessageSquare, Calendar, ArrowRight, Sparkles, Target, Coffee, Loader2, } from "lucide-react"; import { useAuth } from "@/contexts/AuthContext"; import { aethexToast } from "@/lib/aethex-toast"; interface OnboardingData { progress: { day1: ChecklistItem[]; week1: ChecklistItem[]; month1: ChecklistItem[]; }; metadata: { start_date: string; manager_id: string | null; department: string | null; role_title: string | null; onboarding_completed: boolean; }; staff_member: { full_name: string; department: string; role: string; avatar_url: string | null; } | null; manager: { full_name: string; email: string; avatar_url: string | null; } | null; summary: { completed: number; total: number; percentage: number; }; } interface ChecklistItem { id: string; checklist_item: string; phase: string; completed: boolean; completed_at: string | null; } export default function StaffOnboarding() { const { session } = useAuth(); const [loading, setLoading] = useState(true); const [data, setData] = useState(null); useEffect(() => { if (session?.access_token) { fetchOnboardingData(); } }, [session?.access_token]); const fetchOnboardingData = async () => { try { const response = await fetch("/api/staff/onboarding", { headers: { Authorization: `Bearer ${session?.access_token}`, }, }); if (!response.ok) throw new Error("Failed to fetch onboarding data"); const result = await response.json(); setData(result); } catch (error) { console.error("Error fetching onboarding:", error); aethexToast.error("Failed to load onboarding data"); } finally { setLoading(false); } }; const getCurrentPhase = () => { if (!data) return "day1"; const { day1, week1 } = data.progress; const day1Complete = day1.every((item) => item.completed); const week1Complete = week1.every((item) => item.completed); if (!day1Complete) return "day1"; if (!week1Complete) return "week1"; return "month1"; }; const getPhaseLabel = (phase: string) => { switch (phase) { case "day1": return "Day 1"; case "week1": return "Week 1"; case "month1": return "Month 1"; default: return phase; } }; const getDaysSinceStart = () => { if (!data?.metadata?.start_date) return 0; const start = new Date(data.metadata.start_date); const now = new Date(); const diff = Math.floor( (now.getTime() - start.getTime()) / (1000 * 60 * 60 * 24), ); return diff; }; const getInitials = (name: string) => { return name .split(" ") .map((n) => n[0]) .join("") .toUpperCase(); }; if (loading) { return (
); } const currentPhase = getCurrentPhase(); const daysSinceStart = getDaysSinceStart(); return (
{/* Background effects */}
{/* Welcome Header */}
{currentPhase === "day1" ? "Getting Started" : currentPhase === "week1" ? "Week 1" : "Month 1"}

Welcome to AeThex {data?.staff_member?.full_name ? `, ${data.staff_member.full_name.split(" ")[0]}!` : "!"}

{data?.summary?.percentage === 100 ? "Congratulations! You've completed your onboarding journey." : `Day ${daysSinceStart + 1} of your onboarding journey. Let's make it great!`}

{/* Progress Overview */}
{/* Progress Ring */}
{data?.summary?.percentage || 0}%

Onboarding Progress

{data?.summary?.completed || 0} of{" "} {data?.summary?.total || 0} tasks completed

{/* Phase Progress */}
{["day1", "week1", "month1"].map((phase) => { const items = data?.progress?.[phase as keyof typeof data.progress] || []; const completed = items.filter((i) => i.completed).length; const total = items.length; const isComplete = completed === total && total > 0; const isCurrent = phase === currentPhase; return (
{isComplete ? ( ) : ( )}

{getPhaseLabel(phase)}

{completed}/{total}

); })}
{/* Quick Actions Grid */}

Complete Checklist

Track your onboarding tasks

Meet Your Team

Browse the staff directory

Learning Portal

Training courses & resources

Team Handbook

Policies & guidelines

{/* Main Content Grid */}
{/* Current Phase Tasks */}
Current Tasks - {getPhaseLabel(currentPhase)} Focus on completing these tasks first
{data?.progress?.[currentPhase as keyof typeof data.progress] ?.slice(0, 5) .map((item) => (
{item.completed ? ( ) : (
)} {item.checklist_item}
))}
{/* Sidebar */}
{/* Manager Card */} {data?.manager && ( Your Manager
{getInitials(data.manager.full_name)}

{data.manager.full_name}

{data.manager.email}

)} {/* Important Links */} Quick Links Join Discord Server Knowledge Base Documentation Announcements {/* Achievement */} {data?.summary?.percentage === 100 && (

Onboarding Complete!

You've completed all onboarding tasks. Welcome to the team!

)}
); }