import React, { useState, useEffect, useRef } from 'react'; import { useApp } from '../../context/AppContext'; import { TelegramBaglanti } from './TelegramBaglanti'; import { BriefTercihi } from './BriefTercihi'; import { getToken } from '../../services/auth'; import {accountRequest,requireArray} from '../../services/accountRequest'; import { BellRing, Plus, Trash2, Loader2, AlertTriangle, Info, Globe, Sparkles, ChevronDown, ChevronUp, X } from 'lucide-react'; /** * Otomatik e-posta bildirimi — KONU odaklı. * Kullanıcı hangi konularda ihale alabildiğini seçer; il/kurum gibi daraltmalar * isteğe bağlıdır (varsayılan: tüm Türkiye). */ export const NotifySubscriptions = () => { const {authUser}=useApp(); return authUser ? : null; }; const SubscriptionForm = () => { const { authUser, favoriteKurumlar, userProfile, sektorListesi } = useApp(); const [abonelikler, setAbonelikler] = useState(null); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [konular, setKonular] = useState([]); const [ozelKonu, setOzelKonu] = useState(''); const [gelismis, setGelismis] = useState(false); const [daralt, setDaralt] = useState({ sehir: '', alimTuru: '', favoriKurumlar: false }); const alive=useRef(true),mutation=useRef(false),scan=useRef(false); // Site tarama const [site, setSite] = useState(userProfile?.website || ''); const [tarama, setTarama] = useState(null); const [taraniyor, setTaraniyor] = useState(false); const [taramaHata, setTaramaHata] = useState(null); const yukle=async()=>{ if(mutation.current)return; mutation.current=true;setBusy(true);setError(null); try {const data=await accountRequest('/api/notify/subscriptions');const rows=requireArray(data,'abonelikler');if(alive.current)setAbonelikler(rows);} catch(e){if(alive.current)setError(e.message);} finally {mutation.current=false;if(alive.current)setBusy(false);} }; useEffect(()=>{alive.current=true;void yukle();return()=>{alive.current=false;};},[]); const konuEkle = (k) => { const t = String(k || '').trim(); if (!t || konular.some((x) => x.toLocaleLowerCase('tr-TR') === t.toLocaleLowerCase('tr-TR'))) return; setKonular([...konular, t]); }; const konuCikar = (k) => setKonular(konular.filter((x) => x !== k)); const siteyiTara=async()=>{ if(scan.current)return;scan.current=true;setTaraniyor(true);setTaramaHata(null);setTarama(null); try { const data=await accountRequest('/api/company/scan',{method:'POST',timeoutMs:120000,body:JSON.stringify({url:site})}); if(!Number.isFinite(data.karakter)||!Number.isFinite(data.tarananSayfa)||!Array.isArray(data.sonuc?.ihaleKonulari))throw new Error('Site tarama sonucu geçersiz.'); if(alive.current)setTarama(data); }catch(e){if(alive.current)setTaramaHata(e.message);} finally {scan.current=false;if(alive.current)setTaraniyor(false);} }; const kaydet=async()=>{ if(mutation.current)return; if(!konular.length){setError('En az bir konu seçin.');return;} mutation.current=true;setBusy(true);setError(null); try { const data=await accountRequest('/api/notify/subscriptions',{method:'POST',body:JSON.stringify({kriter:{konular,sehir:daralt.sehir,alimTuru:daralt.alimTuru,kurumlar:daralt.favoriKurumlar?favoriteKurumlar:[]}})}); const rows=requireArray(data,'abonelikler'); if(alive.current){setAbonelikler(rows);setKonular([]);setDaralt({sehir:'',alimTuru:'',favoriKurumlar:false});} }catch(e){if(alive.current)setError(e.message);} finally {mutation.current=false;if(alive.current)setBusy(false);} }; const sil=async id=>{ if(mutation.current)return;mutation.current=true;setBusy(true);setError(null); try { const data=await accountRequest('/api/notify/subscriptions?'+new URLSearchParams({id}),{method:'DELETE'}); const rows=requireArray(data,'abonelikler');if(alive.current)setAbonelikler(rows); }catch(e){if(alive.current)setError(e.message);} finally {mutation.current=false;if(alive.current)setBusy(false);} }; const ozet = (a) => [ a.konular?.length ? a.konular.join(' · ') : null, a.sehir && `📍 ${a.sehir}`, a.alimTuru && `(${a.alimTuru})`, a.kurumlar?.length && `${a.kurumlar.length} favori kurum`, ].filter(Boolean).join(' ') || 'Tüm ihaleler'; if (!authUser) return null; const oneriler = tarama?.sonuc?.ihaleKonulari || []; return ( <>

Otomatik E-posta Bildirimi

{abonelikler && ( {abonelikler.length} kayıt )}

Hangi konularda ihale alabiliyorsanız onları seçin — tüm Türkiye taranır, E-posta gönderim hizmeti etkin olduğunda, eşleşen yeni ihaleler {authUser.email} adresine gönderilir.

{/* Mevcut kayıtlar */} {abonelikler === null ? (!error && (
yükleniyor…
)) : abonelikler.length > 0 && (
{abonelikler.map((a) => (

{ozet(a)}

{a.sonGonderim ? `son gönderim: ${new Date(a.sonGonderim).toLocaleString('tr-TR')}` : 'ilk tur bekleniyor'} {a.deliveryStatus && {a.deliveryStatus.state==='uncertain'?'Gönderim sonucu belirsiz. Uygulama yöneticisinin sağlayıcı kaydını kontrol etmesi gerekiyor.':'E-posta gönderimi bekliyor.'}}

))}
)} {/* Site tarama → konu önerisi */}

Sitenizi tarayıp konuları otomatik önerelim

setSite(e.target.value)} placeholder="firmasitesi.com" className="flex-1 bg-white border border-blue-200 rounded-lg px-2.5 py-2 text-xs" />
{taramaHata &&

⚠ {taramaHata}

} {tarama && (

{tarama.tarananSayfa} sayfa tarandı ({tarama.karakter.toLocaleString('tr-TR')} karakter). {tarama.sonuc?.ozet && <> {tarama.sonuc.ozet}}

{oneriler.length > 0 && ( <>

Önerilen konular — eklemek için tıklayın:

{oneriler.map((k) => ( ))}
)}
)}
{/* Seçilen konular */}

Seçilen konular

{konular.length === 0 ? (

Henüz konu seçilmedi.

) : (
{konular.map((k) => ( {k} ))}
)}
setOzelKonu(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { konuEkle(ozelKonu); setOzelKonu(''); } }} placeholder="Kendi konunuzu yazın ve Enter'a basın" className="flex-1 bg-slate-50 border border-slate-200 rounded-lg px-2.5 py-2 text-xs" />

Hazır sektörler:

{sektorListesi.map((s) => ( ))}
{/* Gelişmiş daraltma (isteğe bağlı) */}
{gelismis && (
setDaralt({ ...daralt, sehir: e.target.value })} placeholder="Yalnızca bu il" className="bg-slate-50 border border-slate-200 rounded-lg px-2.5 py-2 text-xs" /> setDaralt({ ...daralt, alimTuru: e.target.value })} placeholder="Alım türü (ör. Doğrudan Temin)" className="bg-slate-50 border border-slate-200 rounded-lg px-2.5 py-2 text-xs" /> {favoriteKurumlar?.length > 0 && ( )}
)}
{error && (

{error}

)}

İlk kayıtta mevcut ihaleler bildirilmez — yalnızca temel alınır, sonrasında çıkan yeni ihaleler gönderilir. Sonuçlanmış arşiv kayıtları bildirime girmez. Aboneliği kaydetmek, e-postanın teslim edildiği anlamına gelmez.

); };