// seller.jsx — İlan Oluşturma Wizard'ı (4 adımlı satıcı akışı) // Adımlar: // 1) Hesap Bilgileri (kullanıcı adı, ülke, dil, hesap yaşı, kategori) // 2) Metrikler & Görseller (takipçi, ER, screenshot upload, sample posts) // 3) Fiyatlandırma (sabit fiyat, pazarlık, açık artırma) // 4) Önizleme & Yayınla (kart preview + onay) // localStorage'a kaydeder; admin panel "Onay Bekleyen" sekmesinde görür. const { useState: _slS, useEffect: _slE, useMemo: _slM } = React; const SELLER_DRAFT_KEY = 'is:seller:draft'; const SELLER_PENDING_KEY = 'is:seller:pending'; const STEPS = [ { id: 1, key: 'about', tr: 'Hesap', en: 'Account' }, { id: 2, key: 'metrics', tr: 'Metrikler', en: 'Metrics' }, { id: 3, key: 'price', tr: 'Fiyat', en: 'Price' }, { id: 4, key: 'review', tr: 'Önizleme', en: 'Review' }, ]; const NICHES = [ { id: 'travel', tr: 'Seyahat', en: 'Travel' }, { id: 'fashion', tr: 'Moda', en: 'Fashion' }, { id: 'food', tr: 'Yemek', en: 'Food' }, { id: 'fitness', tr: 'Fitness', en: 'Fitness' }, { id: 'beauty', tr: 'Güzellik', en: 'Beauty' }, { id: 'gaming', tr: 'Oyun', en: 'Gaming' }, { id: 'meme', tr: 'Mizah / Meme', en: 'Meme' }, { id: 'auto', tr: 'Otomotiv', en: 'Auto' }, { id: 'pets', tr: 'Evcil Hayvan', en: 'Pets' }, { id: 'art', tr: 'Sanat', en: 'Art' }, { id: 'music', tr: 'Müzik', en: 'Music' }, { id: 'tech', tr: 'Teknoloji', en: 'Tech' }, ]; const COUNTRIES = [ { c: 'tr', tr: 'Türkiye', en: 'Turkey', flag: '🇹🇷' }, { c: 'us', tr: 'ABD', en: 'USA', flag: '🇺🇸' }, { c: 'gb', tr: 'İngiltere', en: 'UK', flag: '🇬🇧' }, { c: 'de', tr: 'Almanya', en: 'Germany', flag: '🇩🇪' }, { c: 'fr', tr: 'Fransa', en: 'France', flag: '🇫🇷' }, { c: 'br', tr: 'Brezilya', en: 'Brazil', flag: '🇧🇷' }, { c: 'mx', tr: 'Meksika', en: 'Mexico', flag: '🇲🇽' }, { c: 'ww', tr: 'Karışık', en: 'Worldwide', flag: '🌍' }, ]; const initialDraft = () => ({ username: '', niche: 'travel', country: 'tr', lang: 'tr', ageMonths: 12, verified: false, original: false, bio: '', followers: 5000, posts: 100, er: 4.0, screenshots: [], samplePosts: [], priceMode: 'fixed', price: 1000, offerOpen: true, minPrice: 800, auctionDays: 7, includesEmail: true, includesPhone: false, }); // ───────────────────────────────────────────────────────────── // SellerWizard — desktop // ───────────────────────────────────────────────────────────── function SellerWizard({ L, lang, theme }) { const [step, setStep] = _slS(1); const [draft, setDraft] = _slS(() => loadJson(SELLER_DRAFT_KEY, initialDraft())); const [submitted, setSubmitted] = _slS(false); const [touched, setTouched] = _slS(false); _slE(() => { saveJson(SELLER_DRAFT_KEY, draft); }, [draft]); const set = (k, v) => { setTouched(true); setDraft(d => ({ ...d, [k]: v })); }; const errors = validate(draft, step); const showErrors = touched; const canNext = Object.keys(errors).length === 0; const submit = async () => { // API varsa gerçek backend'e gönder if (window.api && window.api.isLoggedIn()) { try { const payload = { username: (draft.handle || '').replace(/^@/, ''), category: draft.niche || 'lifestyle', niche: draft.niche || null, followers: parseInt(draft.followers) || 0, engagement: parseFloat(draft.er) || null, country: draft.country || 'TR', account_age_months: parseInt(draft.age) || null, is_aged: (parseInt(draft.age) || 0) >= 24, description: draft.description || '', price: parseInt(draft.price) || 0, gallery: draft.images || [], proof_images: draft.proofs || [], tags: draft.tags || [], }; await window.api.listings.create(payload); saveJson(SELLER_DRAFT_KEY, initialDraft()); setSubmitted(true); return; } catch (e) { if (e.status === 401) { alert('Önce giriş yapmalısın. Giriş sayfasına yönlendiriliyorsun...'); window.location.href = 'giris.html'; return; } alert('Hata: ' + e.message + '\n(Yerel taslak olarak kaydediliyor)'); } } // Fallback: localStorage const pending = loadJson(SELLER_PENDING_KEY, []); const id = 'pl_' + Date.now().toString(36); const item = { id, ...draft, status: 'pending', submittedAt: new Date().toISOString(), }; saveJson(SELLER_PENDING_KEY, [item, ...pending]); saveJson(SELLER_DRAFT_KEY, initialDraft()); setSubmitted(true); }; if (submitted) { return ; } return (
{lang === 'tr' ? 'SATICI · İLAN VER' : 'SELLER · LIST ACCOUNT'}

{lang === 'tr' ? 'Hesabını sat. 4 adımda yayında.' : 'Sell your account. Live in 4 steps.'}

{/* Stepper */}
{step === 1 && } {step === 2 && } {step === 3 && } {step === 4 && }
{step < 4 ? ( ) : ( )}
{/* Sidebar — preview + tips */}
); } // ───────────────────────────────────────────────────────────── // Stepper // ───────────────────────────────────────────────────────────── function Stepper({ step, lang }) { return (
{STEPS.map((s, i) => { const done = step > s.id; const active = step === s.id; return (
{done ? '✓' : s.id} {lang === 'tr' ? s.tr : s.en}
{i < STEPS.length - 1 && (
)} ); })}
); } // ───────────────────────────────────────────────────────────── // Step 1 — Hesap Bilgileri // ───────────────────────────────────────────────────────────── function StepAbout({ draft, set, lang, errors }) { return (
@ set('username', e.target.value.toLowerCase().replace(/[^a-z0-9_.]/g, ''))} style={{ borderRadius: '0 12px 12px 0', flex: 1 }}/>
{NICHES.map(n => ( ))}
set('ageMonths', parseInt(e.target.value))} style={{ flex: 1, accentColor: 'var(--accent)' }}/>
{fmtAge(draft.ageMonths, lang, { age_year: lang === 'tr' ? 'yıl' : 'yr', age_month: lang === 'tr' ? 'ay' : 'mo' })}
set('verified', v)} label={lang === 'tr' ? 'Mavi tikli (verified)' : 'Verified (blue check)'} hint={lang === 'tr' ? 'Onaylama gerekir' : 'Requires verification'}/> set('original', v)} label={lang === 'tr' ? 'Orijinal kurucu hesap' : 'Original founder account'} hint={lang === 'tr' ? 'İlk sahibi sensin' : 'You are the original owner'}/>