"use client"; import { useEffect, useState } from "react"; import { AppShell } from "../../../components/app-shell"; import { apiFetch } from "@/lib/api"; type ProfileData = { user: { id: string; email: string; fullName?: string | null; phone?: string | null; companyName?: string | null; addressLine1?: string | null; addressLine2?: string | null; city?: string | null; state?: string | null; postalCode?: string | null; country?: string | null; }; }; export default function ProfilePage() { const [status, setStatus] = useState(""); const [isError, setIsError] = useState(false); const [fullName, setFullName] = useState(""); const [phone, setPhone] = useState(""); const [companyName, setCompanyName] = useState(""); const [addressLine1, setAddressLine1] = useState(""); const [addressLine2, setAddressLine2] = useState(""); const [city, setCity] = useState(""); const [state, setState] = useState(""); const [postalCode, setPostalCode] = useState(""); const [country, setCountry] = useState(""); useEffect(() => { apiFetch("/api/auth/me") .then((res) => { if (!res.error && res.data) { const u = (res.data as unknown as ProfileData).user; if (u) { setFullName(u.fullName ?? ""); setPhone(u.phone ?? ""); setCompanyName(u.companyName ?? ""); setAddressLine1(u.addressLine1 ?? ""); setAddressLine2(u.addressLine2 ?? ""); setCity(u.city ?? ""); setState(u.state ?? ""); setPostalCode(u.postalCode ?? ""); setCountry(u.country ?? ""); } } }) .catch(() => {}); }, []); const onSubmit = async (event: React.FormEvent) => { event.preventDefault(); setStatus("Saving profile..."); setIsError(false); const res = await apiFetch("/api/auth/profile", { method: "PATCH", body: JSON.stringify({ fullName: fullName || undefined, phone: phone || undefined, companyName: companyName || undefined, addressLine1: addressLine1 || undefined, addressLine2: addressLine2 || undefined, city: city || undefined, state: state || undefined, postalCode: postalCode || undefined, country: country || undefined, }), }); if (res.error) { setStatus(res.error.message ?? "Profile update failed."); setIsError(true); return; } setStatus("Profile saved successfully."); }; const inputCls = "w-full rounded-lg border border-border bg-background/50 px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-primary transition-all"; const labelCls = "block text-xs font-medium text-muted-foreground mb-1 uppercase tracking-wide"; return (

Personal & Business Details

These details appear on tax exports and CSV reports.

setFullName(e.target.value)} required />
setPhone(e.target.value)} />
setCompanyName(e.target.value)} />
setAddressLine1(e.target.value)} />
setAddressLine2(e.target.value)} />
setCity(e.target.value)} />
setState(e.target.value)} />
setPostalCode(e.target.value)} />
setCountry(e.target.value)} />
{status && (
{status}
)}
); }