import React, { useState, useEffect } from 'react'; import { User, Language, ExerciseDef, ExerciseType } from '../types'; import { createUser, changePassword, updateUserProfile, getCurrentUserProfile, getUsers, deleteUser, toggleBlockUser, adminResetPassword } from '../services/auth'; import { getExercises, saveExercise } from '../services/storage'; import { User as UserIcon, LogOut, Save, Shield, UserPlus, Lock, Calendar, Ruler, Scale, PersonStanding, Globe, ChevronDown, ChevronUp, Trash2, Ban, KeyRound, Dumbbell, Archive, ArchiveRestore, Pencil, X, Plus, Percent } from 'lucide-react'; import { t } from '../services/i18n'; interface ProfileProps { user: User; onLogout: () => void; lang: Language; onLanguageChange: (lang: Language) => void; } const Profile: React.FC = ({ user, onLogout, lang, onLanguageChange }) => { // Profile Data const [weight, setWeight] = useState(''); const [height, setHeight] = useState(''); const [birthDate, setBirthDate] = useState(''); const [gender, setGender] = useState('MALE'); // Admin: Create User const [newUserEmail, setNewUserEmail] = useState(''); const [newUserPass, setNewUserPass] = useState(''); const [createMsg, setCreateMsg] = useState(''); // Admin: User List const [showUserList, setShowUserList] = useState(false); const [allUsers, setAllUsers] = useState([]); const [adminPassResetInput, setAdminPassResetInput] = useState<{[key:string]: string}>({}); // Change Password const [newPassword, setNewPassword] = useState(''); const [passMsg, setPassMsg] = useState(''); // Account Deletion const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); // Exercise Management const [showExercises, setShowExercises] = useState(false); const [exercises, setExercises] = useState([]); const [showArchived, setShowArchived] = useState(false); const [editingExercise, setEditingExercise] = useState(null); const [isCreatingEx, setIsCreatingEx] = useState(false); // New exercise form const [newExName, setNewExName] = useState(''); const [newExType, setNewExType] = useState(ExerciseType.STRENGTH); const [newExBw, setNewExBw] = useState('100'); useEffect(() => { const p = getCurrentUserProfile(user.id); if (p) { if (p.weight) setWeight(p.weight.toString()); if (p.height) setHeight(p.height.toString()); if (p.gender) setGender(p.gender); if (p.birthDate) setBirthDate(new Date(p.birthDate).toISOString().split('T')[0]); } if (user.role === 'ADMIN') { refreshUserList(); } refreshExercises(); }, [user.id, user.role]); const refreshUserList = () => { setAllUsers(getUsers()); }; const refreshExercises = () => { setExercises(getExercises(user.id)); }; const handleSaveProfile = () => { updateUserProfile(user.id, { weight: parseFloat(weight) || undefined, height: parseFloat(height) || undefined, gender: gender as any, birthDate: birthDate ? new Date(birthDate).getTime() : undefined, language: lang }); alert('Saved'); }; const handleChangePassword = () => { if (newPassword.length < 4) { setPassMsg('Password too short'); return; } changePassword(user.id, newPassword); setPassMsg('Password changed'); setNewPassword(''); }; const handleCreateUser = () => { const res = createUser(newUserEmail, newUserPass); if (res.success) { setCreateMsg(`${t('user_created', lang)}: ${newUserEmail}`); setNewUserEmail(''); setNewUserPass(''); refreshUserList(); } else { setCreateMsg(res.error || 'Error'); } }; const handleAdminDeleteUser = (uid: string) => { if (confirm(t('delete_confirm', lang))) { deleteUser(uid); refreshUserList(); } }; const handleAdminBlockUser = (uid: string, isBlocked: boolean) => { toggleBlockUser(uid, isBlocked); refreshUserList(); }; const handleAdminResetPass = (uid: string) => { const pass = adminPassResetInput[uid]; if (pass && pass.length >= 4) { adminResetPassword(uid, pass); alert(t('pass_reset', lang)); setAdminPassResetInput({...adminPassResetInput, [uid]: ''}); } }; const handleDeleteMyAccount = () => { deleteUser(user.id); onLogout(); }; // Exercise Management Handlers const handleArchiveExercise = (ex: ExerciseDef, archive: boolean) => { const updated = { ...ex, isArchived: archive }; saveExercise(user.id, updated); refreshExercises(); }; const handleSaveExerciseEdit = () => { if (editingExercise && editingExercise.name) { saveExercise(user.id, editingExercise); setEditingExercise(null); refreshExercises(); } }; const handleCreateExercise = () => { if (newExName.trim()) { const newEx: ExerciseDef = { id: crypto.randomUUID(), name: newExName.trim(), type: newExType, bodyWeightPercentage: newExType === ExerciseType.BODYWEIGHT ? parseFloat(newExBw) : undefined }; saveExercise(user.id, newEx); setNewExName(''); setIsCreatingEx(false); refreshExercises(); } }; return (

{t('profile_title', lang)}

{/* User Info Card */}
{user.email[0].toUpperCase()}
{user.email}
{user.role === 'ADMIN' && } {user.role}

{t('personal_data', lang)}

setWeight(e.target.value)} className="w-full bg-transparent text-on-surface focus:outline-none" />
setHeight(e.target.value)} className="w-full bg-transparent text-on-surface focus:outline-none" />
setBirthDate(e.target.value)} className="w-full bg-transparent text-on-surface focus:outline-none text-sm py-1" />
{/* EXERCISE MANAGER */}
{showExercises && (
setShowArchived(e.target.checked)} className="accent-primary" />
{exercises .filter(e => showArchived || !e.isArchived) .sort((a, b) => a.name.localeCompare(b.name)) .map(ex => (
{ex.name}
{ex.type}
))}
)}
{/* Change Password */}

{t('change_pass_btn', lang)}

setNewPassword(e.target.value)} className="flex-1 bg-surface-container-high border-b border-outline-variant px-3 py-2 text-on-surface focus:outline-none rounded-t-lg" />
{passMsg &&

{passMsg}

}
{/* User Self Deletion (Not for Admin) */} {user.role !== 'ADMIN' && (

{t('delete_account', lang)}

{!showDeleteConfirm ? ( ) : (

{t('delete_account_confirm', lang)}

)}
)} {/* ADMIN AREA */} {user.role === 'ADMIN' && (

{t('admin_area', lang)}

{/* Create User */}

{t('create_user', lang)}

setNewUserEmail(e.target.value)} className="w-full bg-surface-container-high border-b border-outline-variant px-3 py-2 text-on-surface focus:outline-none rounded-t-lg" /> setNewUserPass(e.target.value)} className="w-full bg-surface-container-high border-b border-outline-variant px-3 py-2 text-on-surface focus:outline-none rounded-t-lg" /> {createMsg &&

{createMsg}

}
{/* User List */}
{showUserList && (
{allUsers.map(u => (
{u.email}
{u.role} {u.isBlocked && {t('block', lang)}}
{u.role !== 'ADMIN' && ( <> )}
{u.role !== 'ADMIN' && (
setAdminPassResetInput({...adminPassResetInput, [u.id]: e.target.value})} />
)}
))}
)}
)} {/* Edit Exercise Modal */} {editingExercise && (

{t('edit', lang)}

setEditingExercise({...editingExercise, name: e.target.value})} className="w-full bg-transparent text-on-surface focus:outline-none" />
{editingExercise.type === ExerciseType.BODYWEIGHT && (
setEditingExercise({...editingExercise, bodyWeightPercentage: parseFloat(e.target.value)})} className="w-full bg-transparent text-on-surface focus:outline-none" />
)}
)} {/* Create Exercise Modal */} {isCreatingEx && (

{t('create_exercise', lang)}

setNewExName(e.target.value)} className="w-full bg-transparent text-on-surface focus:outline-none" autoFocus />
{newExType === ExerciseType.BODYWEIGHT && (
setNewExBw(e.target.value)} className="w-full bg-transparent text-on-surface focus:outline-none" />
)}
)}
); }; export default Profile;