import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useMutation } from '@tanstack/react-query'; import { UserCircleIcon, EyeIcon, EyeSlashIcon, LockClosedIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../lib/api'; import { useAuthStore } from '../stores/authStore'; import SettingsLayout from '../components/layout/SettingsLayout'; const ROLE_LABELS: Record = { admin: 'مدیر', clinic: 'کلینیک', doctor: 'پزشک', secretary: 'منشی', representation: 'نماینده', user: 'کاربر', }; const schema = z.object({ current_password: z.string().min(1, 'رمز فعلی الزامی است'), new_password: z.string().min(8, 'رمز جدید باید حداقل ۸ کاراکتر باشد'), confirm: z.string().min(1, 'تکرار رمز الزامی است'), }).refine((d) => d.new_password === d.confirm, { path: ['confirm'], message: 'تکرار رمز مطابقت ندارد' }) .refine((d) => d.new_password !== d.current_password, { path: ['new_password'], message: 'رمز جدید نباید با رمز فعلی یکسان باشد' }); type Form = z.infer; /** حساب کاربری — profile summary + change-password form, inside the settings shell. */ export default function AccountSettingsPage() { const { userName, primaryRole, context } = useAuthStore(); const [show, setShow] = useState<{ cur: boolean; next: boolean }>({ cur: false, next: false }); const form = useForm
({ resolver: zodResolver(schema) }); const changePassword = useMutation({ mutationFn: (d: Form) => api.post('/api/v1/user/change-password', { current_password: d.current_password, new_password: d.new_password, }), onSuccess: () => { toast.success('رمز عبور با موفقیت تغییر یافت'); form.reset(); }, onError: (e: any) => toast.error(e.message), }); const rows: [string, string][] = [ ['نام', userName || '—'], ['نقش', primaryRole ? (ROLE_LABELS[primaryRole] ?? primaryRole) : '—'], ['محیط فعلی', context?.name || '—'], ]; return (

حساب کاربری

{/* Profile summary */}
{userName || 'کاربر'}
{rows.map(([label, value]) => (
{label} {value}
))}
{/* Change password */} changePassword.mutate(d))} style={{ background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 'var(--r-lg)', padding: 20, display: 'flex', flexDirection: 'column', gap: 16 }} >
تغییر رمز عبور
setShow((s) => ({ ...s, cur: !s.cur }))} register={form.register('current_password')} error={form.formState.errors.current_password?.message} /> setShow((s) => ({ ...s, next: !s.next }))} register={form.register('new_password')} error={form.formState.errors.new_password?.message} /> setShow((s) => ({ ...s, next: !s.next }))} register={form.register('confirm')} error={form.formState.errors.confirm?.message} />
); } function PasswordField({ label, show, onToggle, register, error }: { label: string; show: boolean; onToggle: () => void; register: ReturnType['register']>; error?: string; }) { return (
{error && {error}}
); }