import React, { useState, useEffect } from 'react'; import { useApp } from '../../context/AppContext'; import { getToken } from '../../services/auth'; import { Check, Sparkles, CreditCard, Loader2, Info, ShieldCheck, XCircle } from 'lucide-react'; import { CancelSubscriptionModal } from '../CancelSubscriptionModal'; export const Pricing = () => { const { authUser, plan, planYenile } = useApp(); const [data, setData] = useState(null); const [busy, setBusy] = useState(null); const [error, setError] = useState(null); const [yillik, setYillik] = useState(true); // yıllık varsayılan (indirimli) const [iptalAcik, setIptalAcik] = useState(false); const [iptalSonuc, setIptalSonuc] = useState(null); useEffect(() => { fetch('/api/billing/plans') .then((r) => r.json()) .then(setData) .catch(() => setData({ configured: false, plans: [] })); }, []); const upgrade = async (planId) => { setBusy(planId); setError(null); try { const res = await fetch('/api/billing/checkout', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${getToken()}` }, body: JSON.stringify({ planId, periyot: yillik ? 'yillik' : 'aylik' }), }); const d = await res.json(); if (d.success && d.url) window.location.href = d.url; else setError(d.error || 'Ödeme başlatılamadı'); } catch (e) { setError(e.message); } finally { setBusy(null); } }; const plans = data?.plans || []; // Yıllık tutar Stripe'taki fiyatla birebir aynı olsun diye plandan gelir const fiyatla = (p) => (yillik ? (p.fiyatYillik ?? Math.round(p.fiyat * 12 * 0.83)) : p.fiyat); const aylikKarsiligi = (p) => (p.fiyatYillik ? Math.round(p.fiyatYillik / 12) : p.fiyat); return (

Planlar & Fiyatlandırma

İhtiyacınıza uygun planı seçin. İstediğiniz zaman iptal edebilirsiniz.

{/* Aylık / Yıllık */}
{error && (
{error}
)} {data && !data.configured && (

Ödeme altyapısı henüz bağlanmadı. Satın alma için sunucuya STRIPE_SECRET_KEY ve plan fiyat kimlikleri (STRIPE_PRICE_PRO, STRIPE_PRICE_KURUMSAL) eklenmeli. Planlar aşağıda görüntülenebilir.

)} {/* Mevcut abonelik — gerçek /api/me/plan verisi */} {plan && (

Mevcut aboneliğiniz

{plan.abonelikVar ? plan.abonelikAdi : 'Ücretsiz'} {plan.yonetici && ( yönetici erişimi: {plan.planAdi} )}

{plan.iptalEdilebilir && ( )}
{plan.yonetici && (

Yönetici hesapları tüm özelliklere erişir; bu, satın aldığınız aboneliğin yerine geçmez.

)} {iptalSonuc && (
Aboneliğiniz iptal edildi. Erişiminiz{' '} {iptalSonuc.bitis ? new Date(iptalSonuc.bitis).toLocaleDateString('tr-TR') : 'dönem sonuna'}{' '} kadar açık kalacak, sonrasında yenileme yapılmayacak.
)}
)}
{plans.map((p) => (

{p.ad}

{p.rozet && ( {p.rozet} )}

{p.ozet}

{p.fiyat === 0 ? 'Ücretsiz' : `₺${fiyatla(p).toLocaleString('tr-TR')}`} {p.fiyat > 0 && /{yillik ? 'yıl' : 'ay'}} {p.fiyat > 0 && (

KDV hariç {yillik && ( <> · ayda ₺{aylikKarsiligi(p).toLocaleString('tr-TR')} · yılda{' '} ₺{(p.fiyat * 12 - fiyatla(p)).toLocaleString('tr-TR')} tasarruf )}

)}
    {p.ozellikler.map((o, i) => (
  • {o}
  • ))}
{p.fiyat === 0 ? (
Mevcut planınız
) : ( )}
))}
{iptalAcik && ( setIptalAcik(false)} onIptalEdildi={(out) => { setIptalAcik(false); setIptalSonuc(out); planYenile(); }} /> )}

Ödemeler Stripe üzerinden güvenli şekilde alınır; kart bilgileriniz İhaleist sunucularında saklanmaz. Aboneliğinizi istediğiniz zaman iptal edebilirsiniz.

); };