'use client' import { useEffect, useState } from 'react' import Link from 'next/link' import { safeNext } from '@/lib/next' type Viewer = { id: number; email: string; interest: string | null; level: string | null; onboarded: boolean } | null const COPY = ['الخطوة 1 من 3', 'الخطوة 2 من 3', 'الخطوة 3 من 3'] const PERCENTS = ['33٪', '67٪', '100٪'] /* Wizard markup/steps from member-onboarding.html. Interest + level PATCH the user record when leaving each step (falls back to localStorage if no session). */ export default function OnboardingWizard({ viewer }: { viewer: Viewer }) { const [step, setStep] = useState(0) const [interest, setInterest] = useState(viewer?.interest ?? '') const [level, setLevel] = useState(viewer?.level ?? '') const [status, setStatus] = useState('') const [nextPath, setNextPath] = useState(null) useEffect(() => { try { setNextPath(safeNext(sessionStorage.getItem('anwarpi:signup-next'))) } catch { /* private mode */ } }, []) function show(next: number) { setStep(Math.max(0, Math.min(2, next))) } async function persist(fields: Record) { try { localStorage.setItem('anwarpi:member-onboarding', JSON.stringify({ interest, experience: level })) } catch { /* private mode */ } if (!viewer) return await fetch(`/api/users/${viewer.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(fields), }).catch(() => null) } async function next() { if (step === 0) { if (!interest) { setStatus('اختر مساراً واحداً للمتابعة.'); return } setStatus('') await persist({ interest }) show(1) return } if (step === 1) { if (!level) { setStatus('اختر مستوى واحداً للمتابعة.'); return } setStatus('') await persist({ level, onboarded: true }) show(2) } } const summary = interest && level ? `اخترت مسار ${interest} بمستوى ${level}. حسابك المجاني جاهز، ويمكنك الترقية الآن أو لاحقاً.` : 'حسابك المجاني جاهز. يمكنك الترقية الآن أو لاحقاً من صفحة العضوية.' useEffect(() => { const bar = document.getElementById('progressBar') if (bar) bar.style.width = `${((step + 1) / 3) * 100}%` const label = document.getElementById('progressLabel') if (label) label.textContent = COPY[step] const percent = document.getElementById('progressPercent') if (percent) percent.textContent = PERCENTS[step] }, [step]) return ( <>
e.preventDefault()}>

أي مسار تريد أن يظهر أولاً؟

اختر مساراً واحداً الآن. ستظل بقية المكتبة متاحة لك.

{[ ['الوكلاء', 'الوكلاء وتنسيقهم', 'التخطيط والتنفيذ والتحقق وتنسيق عدة وكلاء.'], ['RAG', 'التوليد المعزّز بالاسترجاع (RAG)', 'اختيار المصادر وقياس جودة الاسترجاع والإجابة.'], ['الأتمتة', 'الأتمتة للأعمال', 'دمج الذكاء الاصطناعي في تدفقات عمل قابلة للمراقبة.'], ['النماذج المفتوحة', 'النماذج المفتوحة', 'التشغيل المحلي والضبط الدقيق واختيار النموذج المناسب.'], ].map(([value, label, desc]) => ( ))}

{step === 0 ? status : ''}

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

سنستخدمه فقط لترتيب نقطة البداية، لا لإخفاء أي محتوى مجاني.

{[ ['مبتدئ', 'أبدأ من الأساسيات', 'أستخدم أدوات الذكاء الاصطناعي ولم أبنِ مشروعاً بعد.'], ['متوسط', 'بنيت تجارب بسيطة', 'جرّبت واجهات برمجة التطبيقات (API) أو أتمتة أو تطبيقاً صغيراً.'], ['متقدم', 'أعمل على أنظمة فعلية', 'أبحث عن أنماط أعمق للقياس والموثوقية والتشغيل.'], ].map(([value, label, desc]) => ( ))}

{step === 1 ? status : ''}

اختيارك، بلا ضغط

ابدأ مجاناً أو افتح محتوى العضوية الكامل.

{summary}

01

الأدلة المتقدمة كاملة

اقرأ ما بعد المعاينة في أدلة الوكلاء وRAG والأتمتة والنماذج.

02

ملفات العمل

نزّل القوالب وقوائم الفحص المرتبطة بكل دليل.

03

نقطة بداية مخصصة

إعداد العضوية ترتّب دليلك الأول ورسائلك بناءً على هدفك.

الحساب المجاني لا يختفي.

يمكنك قراءة الأدلة المجانية وحفظها، والترقية عندما تحتاج الأدلة الحصرية.

{nextPath ? ( تابع إلى وجهتك ) : ( <> ابدأ بالأدلة المجانية شاهد العضوية والأسعار )}
) }