'use client' import { useEffect, useState } from 'react' import Link from 'next/link' /* 4-step VIP onboarding wizard — port of vip-onboarding.html step logic (radio choice-grid, next/back, final summary + recommendation). Selections persist in localStorage (faithful to the simulated original). */ const GOALS = [ { value: 'بناء مشروع ذكاء اصطناعي', copy: 'حوّل فكرة إلى نموذج يعمل ويمكن اختباره مع مستخدمين.' }, { value: 'تطوير مساري المهني', copy: 'ابنِ خبرة عملية ومشروعات تشرح قيمتك بوضوح.' }, { value: 'أتمتة العمل', copy: 'حدد مهمة متكررة وابنِ لها سير عمل يمكن مراقبته.' }, { value: 'فهم الوكلاء بعمق', copy: 'صمم التخطيط والتنفيذ والتحقق وحدود التوقف بأمان.' }, ] const LEVELS = [ { value: 'مبتدئ', label: 'أبدأ من الأساسيات', copy: 'استخدمت أدوات الذكاء الاصطناعي، لكنني لم أبنِ مشروعاً بعد.' }, { value: 'متوسط', label: 'بنيت تجارب بسيطة', copy: 'جرّبت واجهات برمجة التطبيقات (API) أو أتمتة أو تطبيقاً صغيراً.' }, { value: 'متقدم', label: 'أعمل على أنظمة فعلية', copy: 'أحتاج أنماطاً أعمق للقياس والموثوقية والتشغيل.' }, ] const LABELS = ['الخطوة 1 من 4', 'الخطوة 2 من 4', 'الخطوة 3 من 4', 'الخطوة 4 من 4'] const PERCENTAGES = ['25٪', '50٪', '75٪', '100٪'] const STEP_TITLES = ['هدفك الآن', 'مستواك العملي', 'رسائلك', 'ابدأ مسارك'] type State = { goal: string level: string weekly: boolean trackUpdates: boolean replies: boolean step: number } function recommendation(goal: string): [string, string, string] { if (goal === 'أتمتة العمل') return ['راقب قبل أن تؤتمت', 'ابدأ بتحديد إشارات النجاح والفشل قبل بناء سير العمل، ثم استخدم قائمة المراقبة في أول تجربة.', '/articles?topic=automation'] if (goal === 'بناء مشروع ذكاء اصطناعي') return ['من الفكرة إلى نموذج قابل للاختبار', 'اختر مشكلة واحدة ومستخدمًا واحدًا، ثم حوّل الفرضية إلى نموذج صغير يمكن اختباره هذا الأسبوع.', '/posts/prototype-to-production'] if (goal === 'تطوير مساري المهني') return ['تشريح وكيل ناجح', 'ابنِ نموذجاً صغيراً يوضح التخطيط والتنفيذ والتحقق، ثم وثّق قراراتك كدراسة حالة.', '/posts/agent-loop-stop-condition'] return ['تشريح وكيل ناجح', 'ابدأ بفصل التخطيط عن التنفيذ والتحقق، ثم استخدم قالب حالة الوكيل في مشروع صغير.', '/posts/agent-loop-stop-condition'] } export default function OnboardingWizard({ viewerId }: { viewerId: number | null }) { const [state, setState] = useState({ goal: '', level: '', weekly: true, trackUpdates: true, replies: true, step: 0 }) const [goalStatus, setGoalStatus] = useState('') const [levelStatus, setLevelStatus] = useState('') const [restored, setRestored] = useState(false) /* Backend persistence — goal/level/prefs live on the user record. */ useEffect(() => { if (!viewerId || !state.goal || !state.level) return fetch(`/api/users/${viewerId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ goal: state.goal, level: state.level, prefs: { weekly: state.weekly, trackUpdates: state.trackUpdates, replies: state.replies }, }), }).catch(() => null) }, [viewerId, state.goal, state.level, state.weekly, state.trackUpdates, state.replies]) useEffect(() => { try { const raw = localStorage.getItem('anwarpi:vip-onboarding') if (raw) { const s = JSON.parse(raw) as Partial setState(prev => ({ ...prev, goal: s.goal || '', level: s.level && LEVELS.some(l => l.value === s.level) ? s.level : '', weekly: typeof s.weekly === 'boolean' ? s.weekly : true, trackUpdates: typeof s.trackUpdates === 'boolean' ? s.trackUpdates : true, replies: typeof s.replies === 'boolean' ? s.replies : true, step: Math.max(0, Math.min(3, Number(s.step) || 0)), })) } } catch { /* ignore */ } setRestored(true) }, []) useEffect(() => { if (!restored) return try { localStorage.setItem('anwarpi:vip-onboarding', JSON.stringify(state)) } catch { /* ignore */ } }, [state, restored]) function next() { if (state.step === 0 && !state.goal) { setGoalStatus('اختر هدفاً واحداً للمتابعة.'); return } if (state.step === 1 && !state.level) { setLevelStatus('اختر مستوى واحداً للمتابعة.'); return } setState(s => ({ ...s, step: Math.min(3, s.step + 1) })) } const notices = [ state.weekly && 'خلاصة الأحد', state.trackUpdates && 'تحديثات المسار', state.replies && 'الردود', ].filter(Boolean) as string[] const rec = recommendation(state.goal) return ( <>

عضو جديد · إعداد سريع

مرحباً بك. لنبدأ بما يخدم هدفك.

أجب عن سؤالين وحدد رسائلك المفضلة. سنقترح نقطة بداية واضحة بدلاً من تركك أمام مكتبة كبيرة.

{LABELS[state.step]}{PERCENTAGES[state.step]}
e.preventDefault()}>

ما النتيجة التي تريدها أولاً؟

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

{GOALS.map(g => ( ))}

{goalStatus}

ما مستوى خبرتك العملية؟

لا نختبرك. الإجابة تضبط ترتيب المواد وكمية الشرح في اقتراح البداية.

{LEVELS.map(l => ( ))}

{levelStatus}

اختر ما يستحق الوصول إلى بريدك.

كل الخيارات قابلة للتغيير. لا يؤثر إيقافها على وصولك إلى محتوى العضوية.

خلاصة الأحد

أفضل ما نُشر هذا الأسبوع مع نقطة تطبيق واحدة.

تحديثات المسار

رسالة عندما نضيف جزءاً جديداً إلى المسار الذي تتبعه.

الردود على تعليقاتك

تنبيه فقط عندما يرد عضو أو فريق أنور على سؤالك.

مسارك جاهز.

ابدأ بمادة واحدة، طبّق ملفها العملي، ثم عد إلى المكتبة. لا حاجة لفتح كل شيء اليوم.

هدفك
{state.goal || '—'}
مستواك
{state.level || '—'}
الرسائل
{notices.length ? notices.join('، ') : 'لا رسائل بريدية'}

نقطة البداية المقترحة

{rec[0]}

{rec[1]}

ابدأ الدليل الأول
اذهب إلى المكتبة
) }