"use client"; import { useStoreState } from "@hooks/store"; import axios, { AxiosError } from "axios"; import { useRouter } from "next/navigation"; import { useEffect, useState, useRef } from "react"; import { FaUser } from "react-icons/fa6"; import { User } from "@appTypes/Prisma"; import { useStoreActions } from "@hooks/store"; function CustomRoleDropdown({ value, onChange, disabled, }: { value: string; onChange: (role: string) => void; disabled: boolean; }) { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const roles = ["ADMIN", "SCIENTIST", "GUEST"] as const; useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); return (
{isOpen && (
    {roles.map((role) => (
  • ))}
)}
); } export default function Profile() { const router = useRouter(); const user = useStoreState((state) => state.user); const setUser = useStoreActions((actions) => actions.setUser); const [activeTab, setActiveTab] = useState<"profile" | "orders" | "account">("profile"); async function handleLogout() { try { const res = await axios.get("/api/logout"); if (res.status === 200) { setUser(null); router.push("/"); } } catch (error) { const axiosError = error as AxiosError<{ message: string }>; if (axiosError.response && axiosError.response.status === 400) { setUser(null); router.push("/"); } } } useEffect(() => { !user && router.push("/"); }, []); function ProfileTab() { if (!user) return

No user data available

; const isScientistOrAdmin = user.role === "SCIENTIST" || user.role === "ADMIN"; const stats = [ ...(isScientistOrAdmin ? [ { label: "Earthquakes Logged", value: user.earthquakes.length }, { label: "Observatories Logged", value: user.observatories.length }, { label: "Artefacts Logged", value: user.artefacts.length }, ] : []), { label: "Orders Placed", value: user.purchasedOrders.length }, ]; return (

Profile Overview

{user.role !== "GUEST" &&

{user.role}

}

User since {new Date(user.createdAt).toLocaleDateString("en-GB")}

{stats.map((stat) => (

{stat.label}

{stat.value}

))}
{user.scientist && (

Scientist Details

Level

{user.scientist.level}

Superior

{user.scientist.superior?.name || "None"}

Subordinates

{user.scientist.subordinates.length}

)}
); } function OrdersTab() { return (

Previous Orders

{user!.purchasedOrders.length === 0 ? (

No previous orders.

) : ( )}
); } function AccountTab() { const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [requestedRole, setRequestedRole] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const [error, setError] = useState(""); const [successMessage, setSuccessMessage] = useState(""); const router = useRouter(); useEffect(() => { if (user) { setName(user.name); setEmail(user.email); } }, [user]); async function handleSave() { setError(""); setSuccessMessage(""); if (!name || !email) { setError("Name and email are required."); return; } if (password && password !== confirmPassword) { setError("Passwords do not match."); return; } setIsSubmitting(true); try { const res = await axios.post( "/api/update-user", { name, email, password, requestedRole }, { headers: { "Content-Type": "application/json" } } ); if (res.status === 200) { setUser(res.data.user); setSuccessMessage("Account updated successfully."); if (requestedRole) { setSuccessMessage("Account updated and role change request submitted."); setRequestedRole(""); } } else { setError("Unexpected error occurred"); } } catch (error) { const axiosError = error as AxiosError<{ message: string }>; setError(axiosError.response?.data?.message || "Network error occurred"); } finally { setIsSubmitting(false); } } async function handleDeleteAccount() { if (!confirm("Are you sure you want to delete your account? This action cannot be undone.")) { return; } setIsDeleting(true); try { const res = await axios.post( "/api/delete-user", { userId: user!.id }, { headers: { "Content-Type": "application/json" } } ); if (res.status === 200) { setUser(null); router.push("/"); } else { setError("Failed to delete account"); } } catch (error) { setError("Error deleting account"); } finally { setIsDeleting(false); } } function handleClear() { setName(user?.name || ""); setEmail(user?.email || ""); setPassword(""); setConfirmPassword(""); setRequestedRole(""); setError(""); setSuccessMessage(""); } return (

Account Settings

{successMessage &&

{successMessage}

} {error &&

{error}

}
setName(e.target.value)} className="w-full p-2 border border-neutral-300 rounded-md focus:ring-2 focus:ring-blue-500 text-sm" disabled={isSubmitting} />
setEmail(e.target.value)} className="w-full p-2 border border-neutral-300 rounded-md focus:ring-2 focus:ring-blue-500 text-sm" disabled={isSubmitting} />
setPassword(e.target.value)} className="w-full p-2 border border-neutral-300 rounded-md focus:ring-2 focus:ring-blue-500 text-sm" disabled={isSubmitting} />
setConfirmPassword(e.target.value)} className="w-full p-2 border border-neutral-300 rounded-md focus:ring-2 focus:ring-blue-500 text-sm" disabled={isSubmitting} />
); } return (

Hello {user?.name}

{activeTab === "profile" && } {activeTab === "orders" && } {activeTab === "account" && }
); }