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.'} }
sil(a.id)} disabled={busy} className="text-slate-400 hover:text-red-500 shrink-0 mt-0.5" aria-label={`Aboneliği sil: ${ozet(a)}`} title="Sil">
))}
)}
{/* 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" />
{taraniyor ? : }
{taraniyor ? 'Taranıyor…' : 'Tara'}
{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) => (
konuEkle(k)}
className="text-[11px] bg-white hover:bg-blue-100 border border-blue-300 text-blue-900 px-2 py-1 rounded-md font-medium">
+ {k}
))}
>
)}
)}
{/* Seçilen konular */}
Seçilen konular
{konular.length === 0 ? (
Henüz konu seçilmedi.
) : (
{konular.map((k) => (
{k}
konuCikar(k)} className="text-emerald-700 hover:text-red-600">
))}
)}
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" />
{ konuEkle(ozelKonu); setOzelKonu(''); }}
className="bg-slate-800 hover:bg-slate-700 text-white font-bold text-xs px-3 rounded-lg">Ekle
Hazır sektörler:
{sektorListesi.map((s) => (
konuEkle(s)}
className="text-[11px] bg-slate-100 hover:bg-slate-200 text-slate-700 px-2 py-1 rounded-md">
+ {s}
))}
{/* Gelişmiş daraltma (isteğe bağlı) */}
{busy ? : }
Bildirimi Kaydet
{error && (
{error} Abonelikleri yeniden yükle
)}
İ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.
>
);
};