Wait for saved filter persistence before reporting success

This commit is contained in:
2026-09-06 13:38:08 +03:00
parent 65efd981c5
commit 2a9281c9a5
5 changed files with 61 additions and 31 deletions
+3 -2
View File
@@ -14,6 +14,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
setActiveTab,
savedFilters,
deleteSavedFilter,
savingCount,
selectedAlimTuru,
setSelectedAlimTuru,
selectedSektorler,
@@ -138,7 +139,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
<Bot className="w-4 h-4 text-blue-600" /> Kayıtlı Filtrelerim
</span>
<span className="text-[10px] bg-blue-100 text-blue-800 font-bold px-2 py-0.5 rounded-full">
{savedFilters.length} Bot
{savedFilters.length} filtre
</span>
</div>
@@ -161,7 +162,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
</p>
</div>
<button
onClick={() => deleteSavedFilter(filter.id)}
disabled={savingCount > 0} aria-label={`${filter.name} filtresini sil`} onClick={() => deleteSavedFilter(filter.id)}
title="Filtreyi Sil"
className="text-slate-400 hover:text-red-600 p-1 opacity-60 group-hover:opacity-100 transition-opacity"
>
+23 -15
View File
@@ -4,7 +4,7 @@ import { INSTITUTION_TYPES_LIST, CITIES_LIST } from '../data/constants';
import { Bot, ArrowLeft, CheckCircle2, HelpCircle, Building2, MapPin, Tag } from 'lucide-react';
export const SmartFilterBuilder = () => {
const { savedFilters, addSavedFilter, deleteSavedFilter, setActiveTab, sektorListesi } = useApp();
const { savedFilters, addSavedFilter, deleteSavedFilter, setActiveTab, sektorListesi, savingCount, saveError } = useApp();
const [filterName, setFilterName] = useState('');
const [selectedKurumTip, setSelectedKurumTip] = useState('');
@@ -23,14 +23,15 @@ export const SmartFilterBuilder = () => {
'Açık İhale', 'Dış Alım', 'Doğrudan Temin', 'İstisna', 'Pazarlık Usulü', 'Yaklaşık Maliyet'
];
const handleCreateFilter = (e) => {
const handleCreateFilter = async (e) => {
e.preventDefault();
if (!filterName.trim()) {
alert('Lütfen bir filtre adı giriniz.');
setSuccessMessage('');
return;
}
addSavedFilter({
setSuccessMessage('');
const saved=await addSavedFilter({
name: filterName.trim(),
kurumTipi: selectedKurumTip,
usul: selectedUsul,
@@ -39,9 +40,10 @@ export const SmartFilterBuilder = () => {
sektor: selectedSektor
});
setSuccessMessage('Yeni akıllı filtre başarıyla oluşturuldu.');
if(!saved)return;
setSuccessMessage('Filtre sunucuya kaydedildi. Bu kayıt bildirim aboneliği oluşturmaz.');
setFilterName('');
setTimeout(() => setSuccessMessage(''), 4000);
};
return (
@@ -54,8 +56,8 @@ export const SmartFilterBuilder = () => {
<Bot className="w-6 h-6" />
</div>
<div>
<h1 className="text-xl font-black text-slate-900">Akıllı Filtre (Bot) Kurulumu</h1>
<p className="text-xs text-slate-500">Sektör veya şehrinize uygun yeni ihale eklendiğinde anında haberiniz olsun.</p>
<h1 className="text-xl font-black text-slate-900">Kayıtlı Filtreler</h1>
<p className="text-xs text-slate-500">Arama ölçütlerinizi hesabınıza kaydedin. E-posta bildirimleri Yönetim → Mobil PWA bölümünden ayrıca kurulur.</p>
</div>
</div>
<button
@@ -63,12 +65,14 @@ export const SmartFilterBuilder = () => {
className="bg-slate-800 hover:bg-slate-700 text-white font-semibold text-xs px-4 py-2 rounded-lg flex items-center gap-2 transition-colors shadow-xs"
>
<HelpCircle className="w-4 h-4" />
<span>Nasıl Çalışır?</span>
<span>İhale listesine dön</span>
</button>
</div>
{savingCount > 0 && <p role="status" className="text-sm">Filtre işlemi kaydediliyor…</p>}
{saveError && <p role="alert" className="text-sm text-red-700">{saveError}</p>}
{successMessage && (
<div className="bg-emerald-50 border border-emerald-200 text-emerald-800 px-4 py-3 rounded-xl text-xs font-semibold flex items-center gap-2 animate-fade-in shadow-xs">
<div role="status" className="bg-emerald-50 border border-emerald-200 text-emerald-800 px-4 py-3 rounded-xl text-xs font-semibold flex items-center gap-2 animate-fade-in shadow-xs">
<CheckCircle2 className="w-5 h-5 text-emerald-600 shrink-0" />
<span>{successMessage}</span>
</div>
@@ -94,7 +98,7 @@ export const SmartFilterBuilder = () => {
<div className="flex items-center justify-between font-bold text-slate-900">
<span>🤖 {f.name}</span>
<button
onClick={() => deleteSavedFilter(f.id)}
disabled={savingCount > 0} aria-label={`${f.name} filtresini sil`} onClick={async()=>{setSuccessMessage('');await deleteSavedFilter(f.id);}}
className="text-slate-400 hover:text-red-600 text-xs"
>
🗑️
@@ -116,7 +120,7 @@ export const SmartFilterBuilder = () => {
{/* Right 3 Columns: Filter Form */}
<div className="lg:col-span-3 space-y-6">
<form onSubmit={handleCreateFilter} className="space-y-6">
<form onSubmit={handleCreateFilter}><fieldset disabled={savingCount > 0} className="space-y-6">
{/* Filter Name Card */}
<div className="bg-white rounded-xl border border-slate-200 shadow-xs p-5 space-y-2">
@@ -126,12 +130,13 @@ export const SmartFilterBuilder = () => {
<input
type="text"
required
aria-label="Filtre adı"
value={filterName}
onChange={(e) => setFilterName(e.target.value)}
placeholder="Örn: Ege Bölgesi Cihaz İhaleleri"
className="w-full bg-slate-50 border border-slate-300 rounded-lg px-4 py-2.5 text-sm text-slate-800 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-blue-500"
/>
<p className="text-[11px] text-slate-400">Bu isim sadece sizin takip ve bildirim akışınızda gösterilecektir.</p>
<p className="text-[11px] text-slate-400">Bu ad kayıtlı filtre listenizde görünür.</p>
</div>
{/* Middle Grid */}
@@ -205,6 +210,7 @@ export const SmartFilterBuilder = () => {
<div>
<label className="block text-xs font-semibold text-slate-600 mb-1.5">BÖLGELER</label>
<select
aria-label="Filtre bölgesi"
value={selectedRegion}
onChange={(e) => setSelectedRegion(e.target.value)}
className="w-full bg-slate-50 border border-slate-300 rounded-lg px-3 py-2 text-xs text-slate-800"
@@ -219,6 +225,7 @@ export const SmartFilterBuilder = () => {
<div>
<label className="block text-xs font-semibold text-slate-600 mb-1.5">ŞEHİRLER</label>
<select
aria-label="Filtre şehri"
value={selectedCity}
onChange={(e) => setSelectedCity(e.target.value)}
className="w-full bg-slate-50 border border-slate-300 rounded-lg px-3 py-2 text-xs text-slate-800"
@@ -233,6 +240,7 @@ export const SmartFilterBuilder = () => {
<div>
<label className="block text-xs font-semibold text-slate-600 mb-1.5">SEKTÖR</label>
<select
aria-label="Filtre sektörü"
value={selectedSektor}
onChange={(e) => setSelectedSektor(e.target.value)}
className="w-full bg-slate-50 border border-slate-300 rounded-lg px-3 py-2 text-xs text-slate-800"
@@ -261,11 +269,11 @@ export const SmartFilterBuilder = () => {
className="bg-blue-600 hover:bg-blue-500 text-white font-bold px-6 py-2.5 rounded-lg text-xs transition-colors shadow-md flex items-center gap-2"
>
<Bot className="w-4 h-4" />
<span>Akıllı Filtre Botunu Kaydet & Çalıştır</span>
<span>Filtreyi kaydet</span>
</button>
</div>
</form>
</fieldset></form>
</div>
</div>