'use client' import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' /* 4-tab settings — markup from account-settings.html with the real Payload endpoints wired (PATCH /api/users/me for profile + password). Prefs stay client-side (localStorage) faithful to the original. Stripe is pending: the cancel button renders disabled with a note. */ type Props = { email: string userId: number fullName: string role: string billingEnabled: boolean } type Status = { ok: boolean; text: string } | null const TABS = [ { id: 'profile', label: 'الملف الشخصي' }, { id: 'password', label: 'كلمة المرور' }, { id: 'prefs', label: 'التفضيلات' }, { id: 'membership', label: 'العضوية والفوترة' }, ] export default function AccountSettingsClient({ email, userId, fullName, role, billingEnabled }: Props) { const router = useRouter() const [tab, setTab] = useState('profile') const [name, setName] = useState(fullName) const [profileStatus, setProfileStatus] = useState(null) const [profileBusy, setProfileBusy] = useState(false) const [currentPw, setCurrentPw] = useState('') const [newPw, setNewPw] = useState('') const [confirmPw, setConfirmPw] = useState('') const [pwStatus, setPwStatus] = useState(null) const [pwBusy, setPwBusy] = useState(false) const [prefs, setPrefs] = useState({ weekly: true, replies: true, updates: false }) const [prefsStatus, setPrefsStatus] = useState(null) const [logoutBusy, setLogoutBusy] = useState(false) useEffect(() => { try { const raw = localStorage.getItem('anw-prefs') if (raw) setPrefs(p => ({ ...p, ...JSON.parse(raw) })) } catch { /* ignore */ } }, []) const rulesOk = { len: newPw.length >= 8, num: /\d/.test(newPw), diff: newPw.length > 0 && newPw !== currentPw, } async function saveProfile(e: React.FormEvent) { e.preventDefault() if (name.trim().length < 3) { setProfileStatus({ ok: false, text: 'أدخل اسماً من 3 أحرف على الأقل.' }) return } setProfileBusy(true) const res = await fetch(`/api/users/${userId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ fullName: name.trim() }), }) setProfileStatus(res.ok ? { ok: true, text: 'تم حفظ الاسم ✓' } : { ok: false, text: 'تعذّر الحفظ — أعد المحاولة.' }) setProfileBusy(false) router.refresh() } async function changePassword(e: React.FormEvent) { e.preventDefault() if (!currentPw) { setPwStatus({ ok: false, text: 'أدخل كلمة المرور الحالية.' }); return } if (!(rulesOk.len && rulesOk.num)) { setPwStatus({ ok: false, text: 'كلمة المرور الجديدة لا تحقق الشروط أعلاه.' }); return } if (newPw === currentPw) { setPwStatus({ ok: false, text: 'كلمة المرور الجديدة تطابق الحالية.' }); return } if (newPw !== confirmPw) { setPwStatus({ ok: false, text: 'التأكيد لا يطابق كلمة المرور الجديدة.' }); return } setPwBusy(true) const res = await fetch(`/api/users/${userId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ password: newPw }), }) setPwStatus(res.ok ? { ok: true, text: 'تم تحديث كلمة المرور ✓' } : { ok: false, text: 'تعذّر التحديث — تحقق من كلمة المرور الحالية أو أعد المحاولة.' }) if (res.ok) { setCurrentPw(''); setNewPw(''); setConfirmPw('') } setPwBusy(false) } function savePrefs() { try { localStorage.setItem('anw-prefs', JSON.stringify(prefs)) } catch { /* ignore */ } setPrefsStatus({ ok: true, text: 'تم حفظ التفضيلات ✓' }) } async function logout() { setLogoutBusy(true) await fetch('/api/users/logout', { method: 'POST' }) router.refresh() router.push('/') } const entitled = role === 'vip' || role === 'admin' return ( <>

الملف الشخصي

الاسم كما يظهر في تعليقاتك وقوائم الحفظ. البريد الإلكتروني هو معرّف الدخول ولا يتغير من هنا.

setName(e.target.value)} autoComplete="name" required />
لتغيير البريد تواصل معنا على hello@anwarpy.ai

{profileStatus?.text}

تغيير كلمة المرور

بعد التغيير تبقى جلستك الحالية مفتوحة، وتُطلب كلمة المرور الجديدة عند الدخول من جهاز آخر.

setCurrentPw(e.target.value)} />
setNewPw(e.target.value)} />
  • 8 أحرف على الأقل
  • تحتوي رقماً واحداً على الأقل
  • تختلف عن كلمة المرور الحالية
setConfirmPw(e.target.value)} />

{pwStatus?.text}

التفضيلات

رسائل أنور بآي قليلة ومقصودة. يمكنك إيقاف أي نوع منها من دون التأثير على عضويتك.

الرسالة الأسبوعية

خلاصة ما نُشر من أدلة ومقالات، كل يوم أحد.

إشعارات التعليقات

رسالة عند ردّ أحد الأعضاء على تعليقك.

تحديثات الأدلة المحفوظة

إشعار عندما يُحدَّث دليل حفظته للعودة إليه.

{prefsStatus?.text}

العضوية والفوترة

خطتك وحالة وصولك. الإلغاء يوقف التجديد التالي ويحفظ وصولك حتى نهاية الفترة المدفوعة.

{entitled ? 'عضوية فردية' : 'حساب مجاني'}

الحالة الحقيقية لحسابك
{entitled ? 'نشطة' : role === 'admin' ? 'إداري' : 'مجاني'}
{billingEnabled ?
$10شهرياً
:
وصول مبكر مجاني
}
الوصول
{entitled ? 'كامل — كل الأدلة الحصرية وملفات العمل' : billingEnabled ? 'الأدلة المجانية ومعاينة الأدلة' : 'كل المحتوى المنشور مؤقتاً — الوصول المبكر المجاني'}
طريقة الدفع
{billingEnabled ? 'ستُربط عبر Stripe' : 'لا يوجد — لن يُحصَّل أي مبلغ خلال الوصول المبكر'}
الوصول بعد الإلغاء
حتى نهاية الفترة المدفوعة
{!entitled && billingEnabled && اشترك الآن}

إلغاء الاشتراك

{entitled ? ( <>

ربط الدفع (Stripe) غير مكتمل بعد — الإلغاء الذاتي سيتاح بعد ربط الدفع. حتى ذلك الحين تواصل معنا على hello@anwarpy.ai لأي تغيير.

سيتاح بعد ربط الدفع

) : (

لا يوجد اشتراك مدفوع لإلغائه. يمكنك الترقية في أي وقت من صفحة العضوية.

)}

سجل الفواتير

كل دفعة تُصدر فاتورة ضريبية فور اكتمالها وترسل إلى بريدك المسجّل. الفواتير متاحة للتنزيل في أي وقت.

التاريخالوصفالمبلغالحالةالفاتورة
— لا فواتير بعد — ربط الدفع قادم — — —
) }