import React, { useState, useEffect, useMemo } from 'react'; import { X, ChevronLeft, ChevronRight, Check } from 'lucide-react'; import { useAppConfig } from '../contexts/AppConfigContext'; const buildSteps = (config) => { const knowledgeLevels = (config?.login?.knowledge_levels || config?.login?.academic_stages || []) .filter((o) => o.value) .map((o) => ({ value: o.value, label: o.label })); const timezones = (config?.login?.timezones || []) .filter((o) => o.value) .map((o) => ({ value: o.value, label: o.label })); return [ { title: 'Background', fields: [ { key: 'knowledge_level', label: 'Where are you on healthy eating?', type: 'select', options: knowledgeLevels.length ? knowledgeLevels : [ { value: 'just_starting', label: 'Just starting out' }, { value: 'some_changes', label: 'Making some changes already' }, { value: 'experienced', label: 'Experienced / refining habits' }, { value: 'curious', label: 'Curious / exploring ideas' }, ], }, { key: 'timezone', label: 'Time zone', type: 'select', options: timezones.length ? timezones : [{ value: 'UTC', label: 'UTC' }], }, ], }, { title: 'Focus & kitchen setup', fields: [ { key: 'cyber_role', label: 'Your healthy-eating focus', type: 'select', options: [ 'Clean eating basics', 'More fruits & vegetables', 'Superfoods exploration', 'Enzymes & digestion', 'Meal prep & recipes', 'Reading & resources', 'Overall diet change', 'Other', ], }, { key: 'organization_type', label: 'Where do you mostly eat / cook?', type: 'select', options: [ 'Home kitchen', 'Dorm / shared kitchen', 'Office / work lunches', 'On the go', 'Mix of home and out', ], }, ], }, { title: 'Preferences & tools', fields: [ { key: 'primary_domains', label: 'Foods or areas you care about most (comma-separated)', type: 'text', placeholder: 'e.g. vegetables, fruit, whole foods, less sugar, superfoods', }, { key: 'certifications', label: 'Dietary preferences or constraints (comma-separated)', type: 'text', placeholder: 'e.g. vegetarian, dairy-free, no medical restrictions', }, { key: 'tools_stack', label: 'Tools you use (comma-separated)', type: 'text', placeholder: 'e.g. Instant Pot, air fryer, grocery list app, blender', }, ], }, { title: 'Goals', fields: [ { key: 'compliance_focus', label: 'Time / budget / household constraints', type: 'text', placeholder: 'e.g. 20 minutes dinner, budget-friendly, cooking for family of 3', }, { key: 'current_goals', label: 'Current goals', type: 'textarea', placeholder: 'Eat more real food, reduce processed snacks, pack better lunches...', }, { key: 'learning_preferences', label: 'How you like advice packaged', type: 'text', placeholder: 'Short checklists, recipes, science explainers, book shortlists...', }, { key: 'advisor_notes', label: 'About you & food story', type: 'textarea', placeholder: 'What you currently eat, what feels hard, what success looks like.', }, ], }, ]; }; const initFormFromProfile = (steps, profile) => { const init = {}; steps.forEach((s) => s.fields.forEach((f) => { const val = profile[f.key]; if (Array.isArray(val)) init[f.key] = val.join(', '); else if (val) init[f.key] = val; })); return init; }; const ProfileWalkthrough = ({ authToken, onClose, existingProfile }) => { const { config } = useAppConfig(); const steps = useMemo(() => buildSteps(config), [config]); const [step, setStep] = useState(0); const [formData, setFormData] = useState({}); const [saving, setSaving] = useState(false); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; const fetchProfile = async () => { try { const resp = await fetch(`${process.env.REACT_APP_API_URL}/api/users/me/profile`, { headers: { 'Authorization': `Bearer ${authToken}` }, }); if (resp.ok && !cancelled) { const profile = await resp.json(); setFormData(initFormFromProfile(steps, profile)); } } catch (e) { if (!cancelled && existingProfile) { setFormData(initFormFromProfile(steps, existingProfile)); } } finally { if (!cancelled) setLoading(false); } }; fetchProfile(); return () => { cancelled = true; }; }, [authToken, existingProfile, steps]); const handleChange = (key, value) => setFormData((prev) => ({ ...prev, [key]: value })); const saveProfile = async () => { const payload = { ...formData }; ['primary_domains', 'certifications', 'tools_stack'].forEach((k) => { if (typeof payload[k] === 'string') { payload[k] = payload[k].split(',').map((s) => s.trim()).filter(Boolean); } }); const hasData = Object.values(payload).some((v) => (Array.isArray(v) ? v.length > 0 : Boolean(v)) ); if (!hasData) return; try { await fetch(`${process.env.REACT_APP_API_URL}/api/users/me/profile`, { method: 'PUT', headers: { 'Authorization': `Bearer ${authToken}`, 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); } catch (e) { console.error('Failed to save profile:', e); } }; const handleSave = async () => { setSaving(true); await saveProfile(); setSaving(false); onClose(); }; const handleClose = async () => { await saveProfile(); onClose(); }; const currentStep = steps[step]; const isLast = step === steps.length - 1; const renderSelectOptions = (options) => options.map((o) => { if (o && typeof o === 'object' && o.value != null) { return ; } return ; }); return (