"use client" import { ProfilePictureUpload } from "@/components/profile-picture-upload-v2" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { RichTextEditor } from "@/components/rich-text-editor" import { Save, Loader2, Building2 } from "lucide-react" import { useEffect, useState } from "react" import { profileApi, authApi, adminCompaniesApi, type AdminCompany } from "@/lib/api" import { toast } from "sonner" import { getCurrentUser, isAdminUser } from "@/lib/auth" export default function ProfilePage() { const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) const [savingCompany, setSavingCompany] = useState(false) const [user, setUser] = useState(null) const [company, setCompany] = useState(null) const [isAdmin, setIsAdmin] = useState(false) const [formData, setFormData] = useState({ fullName: "", email: "", phone: "", bio: "", }) const [passwordData, setPasswordData] = useState({ currentPassword: "", newPassword: "", confirmPassword: "", }) const [companyData, setCompanyData] = useState({ name: "", email: "", phone: "", website: "", description: "", }) const getInitials = (name: string) => { const initials = name .trim() .split(/\s+/) .filter(Boolean) .map((word) => word[0]) .join("") .toUpperCase() return initials.slice(0, 2) || "U" } useEffect(() => { const currentUser = getCurrentUser() setIsAdmin(isAdminUser(currentUser)) loadProfile() }, []) const loadProfile = async () => { console.log("[PROFILE_FLOW] Loading profile...") try { const userData = await authApi.getCurrentUser() console.log("[PROFILE_FLOW] Profile loaded:", userData) setUser(userData) setFormData({ fullName: userData.fullName || userData.name || "", email: userData.email || "", phone: userData.phone || "", bio: userData.bio || "" }) // Load company if user has companyId if (userData.companyId) { try { const companiesRes = await adminCompaniesApi.list() const userCompany = companiesRes.data.find(c => c.id === userData.companyId) if (userCompany) { setCompany(userCompany) setCompanyData({ name: userCompany.name || "", email: userCompany.email || "", phone: userCompany.phone || "", website: userCompany.website || "", description: userCompany.description || "", }) } } catch (err) { console.warn("[PROFILE_FLOW] Could not load company:", err) } } } catch (error) { console.error("[PROFILE_FLOW] Error loading profile:", error) toast.error("Failed to load profile") } finally { setLoading(false) } } const handleInputChange = (field: string, value: string) => { setFormData(prev => ({ ...prev, [field]: value })) } const handleCompanyChange = (field: string, value: string) => { setCompanyData(prev => ({ ...prev, [field]: value })) } const handlePasswordChange = (field: string, value: string) => { setPasswordData(prev => ({ ...prev, [field]: value })) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSaving(true) console.log("[PROFILE_FLOW] Updating profile:", formData) try { await profileApi.update({ name: formData.fullName, phone: formData.phone, bio: formData.bio }) console.log("[PROFILE_FLOW] Profile updated successfully") toast.success("Profile updated") } catch (error) { console.error("[PROFILE_FLOW] Error updating profile:", error) toast.error("Failed to update profile") } finally { setSaving(false) } } const handleCompanySubmit = async (e: React.FormEvent) => { e.preventDefault() if (!company) return setSavingCompany(true) console.log("[PROFILE_FLOW] Updating company:", companyData) try { await adminCompaniesApi.update(company.id, { name: companyData.name, email: companyData.email, phone: companyData.phone, website: companyData.website, description: companyData.description, }) console.log("[PROFILE_FLOW] Company updated successfully") toast.success("Company updated") loadProfile() } catch (error) { console.error("[PROFILE_FLOW] Error updating company:", error) toast.error("Failed to update company") } finally { setSavingCompany(false) } } const handlePasswordSubmit = async (e: React.FormEvent) => { e.preventDefault() console.log("[PROFILE_FLOW] Requesting password reset/update") if (passwordData.newPassword !== passwordData.confirmPassword) { toast.error("Passwords do not match") return } try { await profileApi.updatePassword({ currentPassword: passwordData.currentPassword, newPassword: passwordData.newPassword, }) toast.success("Password updated") setPasswordData({ currentPassword: "", newPassword: "", confirmPassword: "", }) } catch (error) { console.error("[PROFILE_FLOW] Error updating password:", error) toast.error("Failed to update password") } } if (loading) { return (
) } return (
{/* Profile Card */} Edit profile
{ if (file) { try { console.log("[PROFILE_FLOW] Uploading avatar:", { name: file.name, size: file.size }) await profileApi.uploadAvatar(file) loadProfile() toast.success("Avatar updated") } catch (err) { console.error("[PROFILE_FLOW] Avatar upload failed:", err) toast.error("Failed to upload avatar") } } }} initialImage={user?.avatarUrl} />
handleInputChange("fullName", e.target.value)} />
handleInputChange("phone", e.target.value)} />
handleInputChange("bio", value)} placeholder="Tell us about yourself..." minHeight="140px" />
Password Reset Update your account password securely.
handlePasswordChange("currentPassword", e.target.value)} />
handlePasswordChange("newPassword", e.target.value)} />
handlePasswordChange("confirmPassword", e.target.value)} />
{/* Company Card - Only for Admin users who have a company */} {isAdmin && company && (
Company Information
Edit your company details
handleCompanyChange("name", e.target.value)} />
handleCompanyChange("email", e.target.value)} />
handleCompanyChange("phone", e.target.value)} />
handleCompanyChange("website", e.target.value)} placeholder="https://example.com" />