normalize session account storage keys
This commit is contained in:
@@ -2170,3 +2170,9 @@ Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesa
|
|||||||
Harici ICS etkinlikleri daha önce ortak `sessionStorage` anahtarında tutuluyordu. Kayıtlar artık normalize edilmiş hesap e-postasına bağlı anahtarda saklanıyor; hesap değişiminde takvim temizlenip yeni hesabın etkinlikleri yükleniyor. Browser QA, anahtarın hesap kapsamlı olduğunu ve sekme değişimi sonrası kalıcılığı doğruluyor.
|
Harici ICS etkinlikleri daha önce ortak `sessionStorage` anahtarında tutuluyordu. Kayıtlar artık normalize edilmiş hesap e-postasına bağlı anahtarda saklanıyor; hesap değişiminde takvim temizlenip yeni hesabın etkinlikleri yükleniyor. Browser QA, anahtarın hesap kapsamlı olduğunu ve sekme değişimi sonrası kalıcılığı doğruluyor.
|
||||||
|
|
||||||
Doğrulama: browser QA başarılı; 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı tarayıcı kabulü ve OAuth takvim senkronizasyonu açık.
|
Doğrulama: browser QA başarılı; 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı tarayıcı kabulü ve OAuth takvim senkronizasyonu açık.
|
||||||
|
|
||||||
|
### 2026-09-06 · Giriş ve belge uyarısı anahtarlarının normalizasyonu
|
||||||
|
|
||||||
|
Son giriş zaman damgası, oturum ziyaret damgası ve belge son kullanma uyarısı anahtarları ortak `hesapAnahtari` yardımcısını kullanıyor. E-posta boşlukları/büyük harfleri normalize ediliyor ve özel karakterler kodlanıyor; hesap kapsamlı istemci kayıtları artık tutarlı anahtar üretir.
|
||||||
|
|
||||||
|
Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı tarayıcı kabulü açık.
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ const AppContext = createContext();
|
|||||||
// İhale önbelleği: tam havuz (10.000+ kayıt) localStorage kotasına sığmaz.
|
// İhale önbelleği: tam havuz (10.000+ kayıt) localStorage kotasına sığmaz.
|
||||||
const TENDER_CACHE_KEY = 'ihaleist_tenders';
|
const TENDER_CACHE_KEY = 'ihaleist_tenders';
|
||||||
const TENDER_CACHE_LIMIT = 300;
|
const TENDER_CACHE_LIMIT = 300;
|
||||||
|
const hesapAnahtari = (prefix, email) => `${prefix}:${encodeURIComponent(String(email || '').trim().toLowerCase())}`;
|
||||||
|
|
||||||
// localStorage her zaman yazılabilir değildir (kota dolu, gizli sekme, site
|
// localStorage her zaman yazılabilir değildir (kota dolu, gizli sekme, site
|
||||||
// verisi kapalı). Yazma hatası uygulamayı çökertmemeli.
|
// verisi kapalı). Yazma hatası uygulamayı çökertmemeli.
|
||||||
@@ -150,15 +151,15 @@ export const AppProvider = ({ children }) => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!authUser) return;
|
if (!authUser) return;
|
||||||
try {
|
try {
|
||||||
const anahtar = 'ihaleist_son_giris:' + authUser.email;
|
const anahtar = hesapAnahtari('ihaleist_son_giris', authUser.email);
|
||||||
const onceki = Number(localStorage.getItem(anahtar)) || null;
|
const onceki = Number(localStorage.getItem(anahtar)) || null;
|
||||||
const oturum = sessionStorage.getItem('ihaleist_oturum_giris:' + authUser.email);
|
const oturum = sessionStorage.getItem(hesapAnahtari('ihaleist_oturum_giris', authUser.email));
|
||||||
if (oturum !== null) { // aynı sekmede yenileme: damga sabit kalır
|
if (oturum !== null) { // aynı sekmede yenileme: damga sabit kalır
|
||||||
setOncekiGiris(Number(oturum) || null);
|
setOncekiGiris(Number(oturum) || null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setOncekiGiris(onceki);
|
setOncekiGiris(onceki);
|
||||||
sessionStorage.setItem('ihaleist_oturum_giris:' + authUser.email, String(onceki || 0));
|
sessionStorage.setItem(hesapAnahtari('ihaleist_oturum_giris', authUser.email), String(onceki || 0));
|
||||||
localStorage.setItem(anahtar, String(Date.now()));
|
localStorage.setItem(anahtar, String(Date.now()));
|
||||||
} catch { /* depolama kapalıysa kart bugünü gösterir */ }
|
} catch { /* depolama kapalıysa kart bugünü gösterir */ }
|
||||||
}, [authUser?.email]);
|
}, [authUser?.email]);
|
||||||
@@ -708,7 +709,7 @@ export const AppProvider = ({ children }) => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!veriSenkron) return;
|
if (!veriSenkron) return;
|
||||||
const session = getToken();
|
const session = getToken();
|
||||||
const uyariAnahtari = 'ihaleist_belge_uyari_gunu:' + authUser?.email;
|
const uyariAnahtari = hesapAnahtari('ihaleist_belge_uyari_gunu', authUser?.email);
|
||||||
const bugun = new Date().toISOString().slice(0, 10);
|
const bugun = new Date().toISOString().slice(0, 10);
|
||||||
try { if (localStorage.getItem(uyariAnahtari) === bugun) return; } catch { /* yoksay */ }
|
try { if (localStorage.getItem(uyariAnahtari) === bugun) return; } catch { /* yoksay */ }
|
||||||
listDocuments().then((d) => {
|
listDocuments().then((d) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user