diff --git a/src/features/rapor/components/tercih-degisti-uyarisi.tsx b/src/features/rapor/components/tercih-degisti-uyarisi.tsx deleted file mode 100644 index 47adcc9..0000000 --- a/src/features/rapor/components/tercih-degisti-uyarisi.tsx +++ /dev/null @@ -1,302 +0,0 @@ -"use client"; - -// /listem'deki "tercihlerin değişti" uyarısı: kayıtlı liste hangi tercihlerle -// kurulduysa (rapor params) kullanıcının güncel profili ondan ayrıldığında -// belirir ve listeyi yeni tercihlere göre yeniden kurmayı önerir. -// -// Yeniden kurulum normal üretimle AYNI kapıdan geçer (listeOlustur): 3 kredi, -// aynı requestId idempotency'si, aynı kredi-yetersiz/iade davranışı. Ayrı bir -// "güncelleme" ürünü ya da indirimli yol yok — kullanıcı yeni bir liste alıyor, -// bedeli de yeni liste bedeli. -// -// Uyarı kapatılabilir: kapatma kararı o anki profil imzasına yazılır, tercih -// yeniden değişirse uyarı geri gelir (bkz. profilImzasi). - -import { useMemo, useRef, useState } from "react"; -import Link from "next/link"; -import { useRouter } from "next/navigation"; -import { toast } from "sonner"; -import { ArrowRight, Check, RefreshCcw, SlidersHorizontal, X } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { olay, siraKovasi } from "@/lib/analitik"; -import { useTercihProfili } from "@/features/liste/hooks/use-tercih-profili"; -import { listeOlustur } from "@/features/rapor/rapor-actions"; -import type { RaporParams } from "@/features/rapor/types/rapor"; -import { - farkCumlesi, - farkSatirlari, - profilImzasi, - tercihFarki, -} from "@/features/rapor/tercih-farki"; -import { useUretimMesaji } from "./uretim-mesaji"; - -const GIZLE_ANAHTARI = "kolaytercih.listem-fark-gizle"; - -function gizlenenImzayiOku(): string | null { - if (typeof window === "undefined") return null; - try { - return localStorage.getItem(GIZLE_ANAHTARI); - } catch { - return null; - } -} - -type Durum = - | { ad: "bekliyor" } - | { ad: "uretiliyor" } - | { ad: "tamamlandi" } - | { ad: "kredi-yetersiz" } - | { ad: "hata"; mesaj: string }; - -export function TercihDegistiUyarisi({ - params, - kredi, - raporKredi, - hasPaket, -}: { - /** Kayıtlı listenin üretildiği tercihler */ - params: RaporParams; - kredi: number; - raporKredi: number; - hasPaket: boolean; -}) { - const router = useRouter(); - const profil = useTercihProfili(); - const [durum, setDurum] = useState({ ad: "bekliyor" }); - // Profil client'ta çözüldüğü için bu bileşen SSR'da zaten hiçbir şey - // render etmiyor; gizleme kaydı ilk render'da güvenle okunabilir. - const [gizlenenImza, setGizlenenImza] = useState( - gizlenenImzayiOku, - ); - // Aynı deneme için sabit requestId: cevabı kaybolan istekte retry çifte - // harcamaz (bkz. liste-uretici.tsx ve spendCredits idempotency'si). - const requestIdRef = useRef(null); - - const farklar = useMemo( - () => (profil ? tercihFarki(params, profil) : []), - [params, profil], - ); - const satirlar = useMemo( - () => (profil ? farkSatirlari(params, profil, farklar) : []), - [params, profil, farklar], - ); - - async function guncelle() { - if (!profil) return; - if (!requestIdRef.current) requestIdRef.current = crypto.randomUUID(); - setDurum({ ad: "uretiliyor" }); - - try { - const sonuc = await listeOlustur({ - sira: profil.sira, - tur: profil.tur, - secimler: profil.secimler, - requestId: requestIdRef.current, - }); - requestIdRef.current = null; - if (sonuc.ok) { - olay("liste_guncellendi", { - tur: profil.tur, - sira_kovasi: siraKovasi(profil.sira), - degisen_alan: farklar.length, - }); - toast.success("Listen yeni tercihlerine göre yeniden kuruldu."); - // Sunucu params'ı tazelenince fark kalmaz ve uyarı kendiliğinden - // kaybolur; refresh dönene kadar "güncellendi" hâli görünür. - setDurum({ ad: "tamamlandi" }); - router.refresh(); - return; - } - if (sonuc.code === "KREDI" || sonuc.code === "PAKET") { - olay("kredi_bitti"); - setDurum({ ad: "kredi-yetersiz" }); - } else if (sonuc.code === "AUTH") { - router.push(`/giris?callback=${encodeURIComponent("/listem")}`); - } else { - setDurum({ ad: "hata", mesaj: sonuc.error }); - } - } catch { - setDurum({ - ad: "hata", - mesaj: "Beklenmeyen bir hata oluştu, tekrar dener misin?", - }); - } - } - - function gizle() { - if (!profil) return; - const imza = profilImzasi(profil); - try { - localStorage.setItem(GIZLE_ANAHTARI, imza); - } catch {} - setGizlenenImza(imza); - } - - if (!profil || farklar.length === 0) return null; - if (durum.ad === "tamamlandi") { - return ( -
- - Listen yeni tercihlerine göre güncellendi. -
- ); - } - // Kapatılmış değişiklik: kullanıcı aynı tercihlerle bir daha rahatsız - // edilmez. Üretim/hata hâlleri kapatmadan bağımsız görünür kalır. - if (durum.ad === "bekliyor" && gizlenenImza === profilImzasi(profil)) { - return null; - } - - const krediYeter = kredi >= raporKredi; - - return ( -
-
- - - -
-

- Tercihlerin değişti -

-

- Aşağıdaki liste eski tercihlerinle kuruldu; {farkCumlesi(farklar)}{" "} - o zamandan beri değişti. Yeni tercihlerine göre yeniden kurabilirsin - — yeni liste bunun yerine geçer ve {raporKredi} kredi düşer. -

- -
- {satirlar.map((satir) => ( -
-
- {satir.etiket} -
-
- {satir.eski} - - → - - {satir.yeni} -
-
- ))} -
- - {durum.ad === "uretiliyor" ? ( - - ) : durum.ad === "kredi-yetersiz" ? ( - - ) : ( -
- {durum.ad === "hata" ? ( - <> -

{durum.mesaj}

- - - ) : krediYeter ? ( - - ) : ( - - )} - - {!krediYeter && durum.ad !== "hata" ? ( -

- Güncelleme {raporKredi} kredi; bakiyen {kredi} kredi. -

- ) : null} -
- )} -
- - {durum.ad === "bekliyor" ? ( - - ) : null} -
-
- ); -} - -function UretimSatiri() { - const mesaj = useUretimMesaji(); - return ( -
-

- - Listen yeni tercihlerine göre kuruluyor… -

-

{mesaj}

-

- Bu işlem yarım dakika kadar sürebilir, sayfayı kapatma. -

-
- ); -} - -function KrediYetersiz({ - hasPaket, - raporKredi, -}: { - hasPaket: boolean; - raporKredi: number; -}) { - return ( -
-

- {hasPaket - ? `Güncelleme ${raporKredi} kredi ve bakiyen yetmedi. Kredi yüklediğinde listen ve sohbet geçmişin duruyor, kaldığın yerden devam edersin.` - : `Güncelleme ${raporKredi} kredi ve bakiyen yetmedi. Tercih Dönemi Paketi'yle kredilerin, tam liste, PDF ve revizyon hakları birlikte gelir.`} -

- -
- ); -}