// form.jsx — анкета мастера (final призыв) + thank-you const { useState } = React; const STATUS = ["Частный мастер","Самозанятый","ИП","Бригада","Компания"]; const WORKS = ["Сантехника","Электрика","Сборка мебели","Двери","Кондиционеры","Мелкий ремонт","Отделка","Другое"]; function formatPhone(v){ let d = v.replace(/\D/g,""); if(d.startsWith("8")) d = "7"+d.slice(1); if(!d.startsWith("7")) d = "7"+d; d = d.slice(0,11); let out = "+7"; if(d.length>1) out += " ("+d.slice(1,4); if(d.length>=4) out += ") "+d.slice(4,7); if(d.length>=7) out += "-"+d.slice(7,9); if(d.length>=9) out += "-"+d.slice(9,11); return out; } function FieldText({label,req,value,onChange,placeholder,err,type="text",inputMode,hint}){ return (
onChange(e.target.value)} /> {err && {err}}
); } function Anketa(){ const [f,setF] = useState({name:"",phone:"",status:"",works:[],region:"",agree:false}); const [errs,setErrs] = useState({}); const [sent,setSent] = useState(false); const [sending,setSending] = useState(false); const set = (k,v)=>{ setF(s=>({...s,[k]:v})); if(errs[k]) setErrs(e=>({...e,[k]:null})); }; const toggleWork = (w)=> set("works", f.works.includes(w)? f.works.filter(x=>x!==w) : [...f.works,w]); const submit = async ()=>{ const e={}; if(!f.name.trim()) e.name="Как к вам обращаться?"; if(f.phone.replace(/\D/g,"").length<11) e.phone="Введите номер телефона полностью"; if(!f.status) e.status="Выберите статус"; if(f.works.length===0) e.works="Отметьте хотя бы одну категорию"; if(!f.region.trim()) e.region="Укажите районы выезда"; if(!f.agree) e.agree="Нужно согласие на обработку данных"; setErrs(e); if(Object.keys(e).length>0) return; setSending(true); try{ const res = await fetch("/api/anketa", { method:"POST", headers:{ "Content-Type":"application/json" }, body:JSON.stringify(f), }); const data = await res.json().catch(()=>({})); if(!res.ok || !data.ok){ setErrs(data.errors || { form:data.error || "Не удалось отправить анкету. Попробуйте ещё раз." }); return; } setSent(true); }catch(_){ setErrs({ form:"Не удалось отправить анкету. Проверьте соединение и попробуйте ещё раз." }); }finally{ setSending(false); } }; if(sent){ return (

Спасибо! Анкета отправлена

Мы проверим профиль и сообщим о следующих шагах подключения. После регистрации вы получите инструкцию по работе с сервисом — как принимать заявки, подтверждать время и закрывать работу.

Профиль на проверке Мы свяжемся с вами
); } return (

Анкета мастера

Заполните данные о себе, укажите виды работ и районы выезда. Это займёт пару минут.

set("name",v)} placeholder="Например, Сергей" err={errs.name} /> set("phone",formatPhone(v))} placeholder="+7 (___) ___-__-__" err={errs.phone} />
{STATUS.map(s=>())}
{errs.status && {errs.status}}
{WORKS.map(w=>())}
{errs.works && {errs.works}}
set("region",v)} placeholder="Краснодар: Центр, ЮМР" err={errs.region} />
{errs.form && {errs.form}} {f.agree && ( )}

После проверки профиля мы сообщим о следующих шагах.

); } function FormSection(){ return (
Начните с анкеты

Подключитесь к VOVO в Краснодаре

Заполните данные о себе, укажите виды работ и районы выезда. Мы проверим профиль и сообщим о следующих шагах подключения.

  • Заявки от клиентов рядом с вами
  • Вы выбираете районы, услуги и заявки
  • Свяжемся и расскажем о следующих шагах
); } Object.assign(window, { FormSection });