import React, { forwardRef, useState } from "react"; import { BaseComponentProps, User } from "../../types"; import { Button } from "../ui/Button"; import { Input } from "../ui/Input"; import { Card, CardContent, CardHeader, CardTitle } from "../ui/Card"; export interface UserProfileProps extends BaseComponentProps { user: User; editable?: boolean; onSave?: (updatedUser: Partial) => void; onCancel?: () => void; loading?: boolean; fields?: Array<{ key: keyof User; label: string; type?: "text" | "email" | "tel"; editable?: boolean; }>; } const defaultFields = [ { key: "name" as keyof User, label: "Full Name", type: "text" as const, editable: true, }, { key: "email" as keyof User, label: "Email", type: "email" as const, editable: true, }, { key: "role" as keyof User, label: "Role", type: "text" as const, editable: false, }, { key: "created_at" as keyof User, label: "Member Since", type: "text" as const, editable: false, }, ]; export const UserProfile = forwardRef( ( { className = "", user, editable = false, onSave, onCancel, loading = false, fields = defaultFields, ...props }, ref ) => { const [isEditing, setIsEditing] = useState(false); const [formData, setFormData] = useState>(user); const handleEdit = () => { setIsEditing(true); setFormData(user); }; const handleCancel = () => { setIsEditing(false); setFormData(user); onCancel?.(); }; const handleSave = () => { onSave?.(formData); setIsEditing(false); }; const handleInputChange = (key: keyof User, value: string) => { setFormData((prev) => ({ ...prev, [key]: value, })); }; const formatFieldValue = (key: keyof User, value: string | undefined) => { if (key === "created_at" && value) { return new Date(value).toLocaleDateString(); } if (key === "updated_at" && value) { return new Date(value).toLocaleDateString(); } return value || "—"; }; const renderAvatarSection = () => (
{user.avatar_url ? ( {user.name ) : (
{user.name?.charAt(0) || user.email?.charAt(0) || "U"}
)} {editable && isEditing && ( )}

{user.name || "Unnamed User"}

{user.email}

{user.role && ( {user.role.charAt(0).toUpperCase() + user.role.slice(1)} )}
); const renderField = (field: (typeof fields)[0]) => { const value = user[field.key]; if (isEditing && field.editable) { return (
handleInputChange(field.key, e.target.value)} disabled={loading} />
); } return (

{formatFieldValue(field.key, value as string | undefined)}

); }; return (
Profile Information {editable && !isEditing && ( )}
{renderAvatarSection()}
{fields.map(renderField)}
{isEditing && (
)}
); } ); UserProfile.displayName = "UserProfile";