import React, { useState, useEffect } from 'react'; import { useApp } from '../../context/AppContext'; import { TelegramBaglanti } from './TelegramBaglanti'; import { getToken } from '../../services/auth'; 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, 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 }); // 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 = () => { if (!authUser) return; fetch('/api/notify/subscriptions', { headers: { Authorization: `Bearer ${getToken()}` } }) .then((r) => r.json()) .then((d) => setAbonelikler(d.abonelikler || [])) .catch(() => setAbonelikler([])); }; useEffect(yukle, [authUser]); 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 () => { setTaraniyor(true); setTaramaHata(null); setTarama(null); try { const res = await fetch('/api/company/scan', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${getToken()}` }, body: JSON.stringify({ url: site }), }); const d = await res.json(); if (!d.success) throw new Error(d.error); setTarama(d); } catch (e) { setTaramaHata(e.message); } finally { setTaraniyor(false); } }; const kaydet = async () => { if (!konular.length) { setError('En az bir konu seçin.'); return; } setBusy(true); setError(null); try { const res = await fetch('/api/notify/subscriptions', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${getToken()}` }, body: JSON.stringify({ kriter: { konular, sehir: daralt.sehir, alimTuru: daralt.alimTuru, kurumlar: daralt.favoriKurumlar ? favoriteKurumlar : [], }, }), }); const d = await res.json(); if (!d.success) throw new Error(d.error); setAbonelikler(d.abonelikler); setKonular([]); setDaralt({ sehir: '', alimTuru: '', favoriKurumlar: false }); } catch (e) { setError(e.message); } finally { setBusy(false); } }; const sil = async (id) => { setBusy(true); try { const res = await fetch(`/api/notify/subscriptions?id=${id}`, { method: 'DELETE', headers: { Authorization: `Bearer ${getToken()}` }, }); const d = await res.json(); setAbonelikler(d.abonelikler || []); } catch (e) { setError(e.message); } finally { 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, yalnızca size uyan yeni ihaleler {authUser.email} adresine gelir. Gereksiz ilan gönderilmez.

{/* Mevcut kayıtlar */} {abonelikler === null ? (
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'}

))}
)} {/* 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. Aynı ihale iki kez gönderilmez; sonuçlanmış arşiv kayıtları bildirime girmez.

); };