// extras3.jsx — Hakkında + 404 + skeleton + hover preview helpers const { useState: _x3S, useEffect: _x3E } = React; // ═══════════════════════════════════════════════════════════════ // 1) HAKKINDA — kim olduğumuzu, neden güvenli olduğumuzu anlatır // ═══════════════════════════════════════════════════════════════ function AboutScreen({ L, lang, theme }) { const stats = [ { v: '6.4K+', l: lang === 'tr' ? 'Tamamlanan satış' : 'Completed sales' }, { v: '%99.2', l: lang === 'tr' ? 'Memnuniyet' : 'Satisfaction' }, { v: '4 dk', l: lang === 'tr' ? 'Ortalama yanıt' : 'Avg response' }, { v: '2022', l: lang === 'tr' ? 'Kuruluş' : 'Founded' }, ]; const principles = lang === 'tr' ? [ { t: 'Emanet model', d: 'Ödemen biz devir tamamlanana kadar emanet hesapta bekler. Sorun çıkarsa iadesi 24 saatte yapılır.' }, { t: 'Her hesap doğrulanır', d: '3 katmanlı kontrol — yaş, organik takipçi oranı, içerik geçmişi. Sahte metrikleri filtreleyen iç skorlama sistemimiz var.' }, { t: 'Şifre & e-posta devri', d: 'Wizard ile adım adım yönlendiriyoruz. 2FA dahil tüm bağlı her şeyi sıfırdan kuruyorsun. Eski sahip geri dönemiyor.' }, { t: 'Şeffaf komisyon', d: 'İlan başına %8 + KDV. Gizli ücret yok. Satıcı ve alıcı her ikisi de neye ödediğini görür.' }, ] : [ { t: 'Escrow model', d: 'Your payment is held in escrow until the transfer is complete. Refund within 24h on issues.' }, { t: 'Every account verified', d: '3-layer check — age, organic follower ratio, content history. Internal scoring filters fake metrics.' }, { t: 'Password & email handover', d: 'Step-by-step wizard. You set up everything from scratch including 2FA. The seller can never come back.' }, { t: 'Transparent commission', d: '8% + VAT per listing. No hidden fees. Both buyer and seller see what they pay for.' }, ]; return (
{/* HERO */}
{lang === 'tr' ? 'INSTASATIŞ HAKKINDA' : 'ABOUT INSTASATIŞ'}

{lang === 'tr' ? <>Instagram hesabı satışını dürüst yaparız. : <>We make Instagram sales honest.}

{lang === 'tr' ? 'InstaSatış 2022\'de DM\'lerde dolaşan dolandırıcılığa son vermek için kuruldu. Her hesap insan eliyle doğrulanır, ödemen emanette bekler, devir bizim wizard\'ımızla yapılır. Karanlık piyasayı aydınlatıyoruz.' : 'InstaSatış launched in 2022 to end DM-based scams. Every account is human-verified, your payment sits in escrow, the transfer happens via our wizard. Lighting up the dark market.'}

{stats.map((s, i) => (
{s.v}
{s.l}
))}
{/* PRENSIPLER */}
{lang === 'tr' ? 'NASIL ÇALIŞIYORUZ' : 'HOW WE OPERATE'}

{lang === 'tr' ? 'Dört prensip, sıfır tolerans' : 'Four principles, zero tolerance'}

{principles.map((p, i) => (
0{i + 1}
{p.t}

{p.d}

))}
{/* CTA */}
{lang === 'tr' ? 'BAŞLAMAYA HAZIR MISIN?' : 'READY TO START?'}
{lang === 'tr' ? 'Hesabını saatler içinde sat veya al.' : 'Buy or sell in hours.'}
); } // ═══════════════════════════════════════════════════════════════ // 2) 404 — eğlenceli, marka-uyumlu // ═══════════════════════════════════════════════════════════════ function NotFoundScreen({ L, lang, theme }) { return (
{/* Arkaplan grad */}
{/* Big 404 */}
404
{lang === 'tr' ? 'KAYIP HESAP' : 'LOST ACCOUNT'}

{lang === 'tr' ? 'Bu sayfa unfollowed.' : 'This page unfollowed.'}

{lang === 'tr' ? 'Aradığın sayfa kaldırılmış, taşınmış veya hiç var olmamış olabilir. Belki ilanı sahibi geri çekmiştir.' : 'The page you\'re looking for moved, was removed, or never existed. Maybe the seller pulled the listing.'}

{lang === 'tr' ? 'Ana sayfaya dön' : 'Back to home'} {lang === 'tr' ? 'Hesap ara' : 'Search'}
); } // ═══════════════════════════════════════════════════════════════ // 3) PASSWORD RESET — sifre-sifirla.html için // 3-step: e-posta → kod → yeni şifre. Mock akış (backend hazır). // ═══════════════════════════════════════════════════════════════ function PasswordResetScreen({ L, lang, theme }) { const [step, setStep] = _x3S(1); const [email, setEmail] = _x3S(''); const [code, setCode] = _x3S(''); const [newPw, setNewPw] = _x3S(''); const [newPw2, setNewPw2] = _x3S(''); const [busy, setBusy] = _x3S(false); const [err, setErr] = _x3S(''); const submitEmail = async (e) => { e.preventDefault(); if (!email.match(/^[^@]+@[^@]+\.[^@]+$/)) { setErr(lang === 'tr' ? 'Geçerli bir e-posta gir.' : 'Enter a valid email.'); return; } setErr(''); setBusy(true); try { if (window.api?.auth?.requestReset) { await window.api.auth.requestReset(email); } } catch (e) { /* silent — always show success to avoid email enumeration */ } setBusy(false); setStep(2); }; const submitCode = (e) => { e.preventDefault(); if (code.length !== 6) { setErr(lang === 'tr' ? '6 haneli kodu gir.' : 'Enter 6-digit code.'); return; } setErr(''); setStep(3); }; const submitNewPw = async (e) => { e.preventDefault(); if (newPw.length < 8) { setErr(lang === 'tr' ? 'En az 8 karakter olmalı.' : 'Min 8 chars.'); return; } if (newPw !== newPw2) { setErr(lang === 'tr' ? 'Şifreler eşleşmiyor.' : 'Passwords do not match.'); return; } setErr(''); setBusy(true); try { if (window.api?.auth?.resetPassword) { await window.api.auth.resetPassword(email, code, newPw); } } catch (e) { setErr(e.message || 'Hata'); setBusy(false); return; } setBusy(false); setStep(4); }; const Card = ({ children }) => (
{children}
); return (
{/* Step indicator */}
{[1, 2, 3].map(s => (
= s ? 'var(--grad)' : 'var(--line-2)', transition: 'background .3s', }}/> ))}
{step === 1 && (
{lang === 'tr' ? 'ADIM 1 / 3' : 'STEP 1 / 3'}

{lang === 'tr' ? 'Şifreni mi unuttun?' : 'Forgot password?'}

{lang === 'tr' ? 'Kayıtlı e-postanı gir, 6 haneli sıfırlama kodu gönderelim.' : 'Enter your email — we\'ll send a 6-digit reset code.'}

setEmail(e.target.value)} className="is-input" placeholder="ornek@mail.com" style={{ marginTop: 6, marginBottom: 16 }}/> {err &&
{err}
} ← {lang === 'tr' ? 'Girişe dön' : 'Back to login'}
)} {step === 2 && (
{lang === 'tr' ? 'ADIM 2 / 3' : 'STEP 2 / 3'}

{lang === 'tr' ? 'Kodunu gir' : 'Enter the code'}

{lang === 'tr' ? <>{email} adresine 6 haneli kod gönderdik. Spam klasörünü de kontrol et. : <>We sent a 6-digit code to {email}. Check spam too.}

setCode(e.target.value.replace(/\D/g, '').slice(0, 6))} inputMode="numeric" autoFocus className="is-input" style={{ marginBottom: 16, fontSize: 28, textAlign: 'center', letterSpacing: '0.4em', fontFamily: 'var(--font-mono)', padding: '18px', }} placeholder="000000" maxLength={6}/> {err &&
{err}
}
)} {step === 3 && (
{lang === 'tr' ? 'ADIM 3 / 3' : 'STEP 3 / 3'}

{lang === 'tr' ? 'Yeni şifre belirle' : 'Set new password'}

{lang === 'tr' ? 'En az 8 karakter, harf ve rakam.' : 'Min 8 chars, letter + number.'}

setNewPw(e.target.value)} className="is-input" style={{ marginTop: 6, marginBottom: 14 }}/> setNewPw2(e.target.value)} className="is-input" style={{ marginTop: 6, marginBottom: 16 }}/> {err &&
{err}
}
)} {step === 4 && (

{lang === 'tr' ? 'Şifren güncellendi' : 'Password updated'}

{lang === 'tr' ? 'Yeni şifrenle giriş yapabilirsin.' : 'You can sign in with the new password.'}

{lang === 'tr' ? 'Giriş yap' : 'Sign in'}
)}
); } // ═══════════════════════════════════════════════════════════════ // 4) SELLER VERIFICATION WIZARD — satici-dogrulama.html için // 4 adımlı: kimlik + Instagram giriş kanıtı + iletişim + onay // ═══════════════════════════════════════════════════════════════ function SellerVerifyWizard({ L, lang, theme }) { const [step, setStep] = _x3S(1); const [data, setData] = _x3S({ fullName: '', tckn: '', phone: '', idFrontFile: null, idBackFile: null, igHandle: '', igProofFile: null, address: '', iban: '', accept: false, }); const [submitted, setSubmitted] = _x3S(false); const set = (k, v) => setData(d => ({ ...d, [k]: v })); const steps = [ { n: 1, label: lang === 'tr' ? 'Kimlik' : 'Identity' }, { n: 2, label: lang === 'tr' ? 'Hesap kanıtı' : 'Account proof' }, { n: 3, label: lang === 'tr' ? 'İletişim' : 'Contact' }, { n: 4, label: lang === 'tr' ? 'Gönder' : 'Submit' }, ]; const canNext = () => { if (step === 1) return data.fullName.length >= 4 && data.tckn.length === 11 && data.idFrontFile && data.idBackFile; if (step === 2) return data.igHandle.length >= 2 && data.igProofFile; if (step === 3) return data.phone.length >= 10 && data.address.length >= 10 && data.iban.length >= 16; return data.accept; }; const submit = async () => { try { if (window.api?.seller?.requestVerification) { // Backend FormData bekliyor (dosya yüklemesi var) const fd = new FormData(); fd.append('fullName', data.fullName); fd.append('tckn', data.tckn); fd.append('phone', data.phone); fd.append('igHandle', data.igHandle); fd.append('address', data.address); fd.append('iban', data.iban); if (data.idFrontFile) fd.append('idFrontFile', data.idFrontFile); if (data.idBackFile) fd.append('idBackFile', data.idBackFile); if (data.igProofFile) fd.append('igProofFile', data.igProofFile); await window.api.seller.requestVerification(fd); } } catch (e) { /* fallback to local */ } saveJson('is:seller_verify', { // dosyaları localStorage'a JSON olarak kaydedemeyiz — sadece metadata sakla fullName: data.fullName, tckn: data.tckn, phone: data.phone, igHandle: data.igHandle, address: data.address, iban: data.iban, hasIdFront: !!data.idFrontFile, hasIdBack: !!data.idBackFile, hasIgProof: !!data.igProofFile, status: 'pending', submittedAt: Date.now(), }); setSubmitted(true); }; const FileInput = ({ label, value, onChange, accept = 'image/*,application/pdf' }) => ( ); if (submitted) { return (

{lang === 'tr' ? 'Başvurun bize ulaştı' : 'We received your request'}

{lang === 'tr' ? '24 saat içinde ekibimiz belgelerini inceleyip e-posta ile dönüş yapacak. Onaylandıktan sonra ilan ver butonuyla hesabını listeleyebilirsin.' : 'Our team will review your documents within 24 hours and reply via email. Once approved, you can list your account.'}

{lang === 'tr' ? 'BAŞVURU NUMARASI' : 'REFERENCE'}
#SV-{Date.now().toString(36).toUpperCase().slice(-8)}
{lang === 'tr' ? 'Panele dön' : 'Back to panel'}
); } return (
{/* Header */}
{lang === 'tr' ? 'SATICI DOĞRULAMA' : 'SELLER VERIFICATION'}

{lang === 'tr' ? 'Satışa hazırlık' : 'Get verified to sell'}

{lang === 'tr' ? 'KVKK ve MASAK uyumu için kimlik + hesap sahipliği kanıtı istiyoruz. Tüm belgeler şifrelenir, sadece doğrulama ekibi görür.' : 'For KYC compliance, we need your ID + proof of account ownership. All documents are encrypted; only the verification team sees them.'}

{/* Steps */}
{steps.map((s) => (
= s.n ? 'var(--grad)' : 'var(--line-2)', transition: 'background .3s', }}/>
= s.n ? 'var(--ink)' : 'var(--ink-3)', fontFamily: 'var(--font-mono)', textTransform: 'uppercase', letterSpacing: '.06em', }}>{s.n}. {s.label}
))}
{step === 1 && (

{lang === 'tr' ? 'Kimlik bilgileri' : 'Identity'}

set('fullName', e.target.value)} placeholder={lang === 'tr' ? 'Nüfusta yazdığı gibi' : 'As on ID'} style={{ marginTop: 6 }}/>
set('tckn', e.target.value.replace(/\D/g, '').slice(0, 11))} inputMode="numeric" placeholder="11 hane" style={{ marginTop: 6, fontFamily: 'var(--font-mono)' }}/>
set('idFrontFile', f)}/> set('idBackFile', f)}/>
)} {step === 2 && (

{lang === 'tr' ? 'Hesap sahipliği' : 'Account ownership'}

set('igHandle', e.target.value.replace(/[^@a-zA-Z0-9._]/g, ''))} placeholder="@kullaniciadi" style={{ marginTop: 6, fontFamily: 'var(--font-mono)' }}/>
{lang === 'tr' ? '📸 Yapman gereken:' : '📸 What to do:'}
  1. {lang === 'tr' ? `Instagram’da Ayarlar → Hesap Bilgileri ekranını aç` : 'Open Settings → Account info on Instagram'}
  2. {lang === 'tr' ? 'Bu sayfanın ekran görüntüsünü al (URL’deki kullanıcı adı görünmeli)' : 'Take a screenshot (handle in URL must be visible)'}
  3. {lang === 'tr' ? 'Aşağıya yükle' : 'Upload below'}
set('igProofFile', f)}/>
)} {step === 3 && (

{lang === 'tr' ? 'İletişim & ödeme' : 'Contact & payout'}

set('phone', e.target.value)} placeholder="+90 555 ..." style={{ marginTop: 6, fontFamily: 'var(--font-mono)' }}/>