normalize account scoped firm storage

This commit is contained in:
2026-09-06 19:06:44 +03:00
parent dd21bcbda2
commit 0435b46d13
2 changed files with 10 additions and 3 deletions
+6
View File
@@ -2158,3 +2158,9 @@ Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesa
AI fallback zinciri daha önce ortak `localStorage` anahtarında tutuluyordu. Ayar artık normalize edilmiş hesap e-postasına bağlı anahtarda saklanıyor; oturum değişiminde yeni hesabın zinciri yeniden yükleniyor ve önceki hesabın değeri yazılmıyor. Depolama erişimi olmayan ortamlarda varsayılan zincir kullanılıyor. AI fallback zinciri daha önce ortak `localStorage` anahtarında tutuluyordu. Ayar artık normalize edilmiş hesap e-postasına bağlı anahtarda saklanıyor; oturum değişiminde yeni hesabın zinciri yeniden yükleniyor ve önceki hesabın değeri yazılmıyor. Depolama erişimi olmayan ortamlarda varsayılan zincir kullanılıyor.
Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı AI ayarı tarayıcı kabulü ve canlı sağlayıcı testi ayrıca yapılmalı. Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı AI ayarı tarayıcı kabulü ve canlı sağlayıcı testi ayrıca yapılmalı.
### 2026-09-06 · Firma bilgilerinin yerel hesap anahtarı
Teklif dosyası hazırlama ekranındaki firma bilgileri artık ham e-posta yerine normalize edilip URL kodlanmış hesap anahtarında tutuluyor. Büyük/küçük harf farkı aynı hesabı farklı yerel kayda bölmüyor; özel karakterler anahtar yapısını bozamıyor. Eski ortak/normalize edilmemiş anahtarlardan otomatik veri alınmıyor.
Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı tarayıcı kabulü ve canlı deployment ayrıca yapılmalı.
+4 -3
View File
@@ -34,6 +34,7 @@ import {
const FIRMA_ANAHTAR = 'ihaleist_firma_bilgi'; const FIRMA_ANAHTAR = 'ihaleist_firma_bilgi';
const firmaAnahtari = email => `${FIRMA_ANAHTAR}:${encodeURIComponent(String(email || '').trim().toLowerCase())}`;
const bosFirma = () => Object.fromEntries(ALANLAR.map((a) => [a.k, ''])); const bosFirma = () => Object.fromEntries(ALANLAR.map((a) => [a.k, '']));
@@ -70,7 +71,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender, initialFocu
const [firma, setFirma] = useState(() => { const [firma, setFirma] = useState(() => {
let kayitli = {}; let kayitli = {};
try { kayitli = JSON.parse(localStorage.getItem(FIRMA_ANAHTAR + ':' + authUser?.email) || '{}'); } catch { /* yoksay */ } try { kayitli = JSON.parse(localStorage.getItem(firmaAnahtari(authUser?.email)) || '{}'); } catch { /* yoksay */ }
return { return {
...bosFirma(), ...bosFirma(),
firmaUnvan: userProfile?.company || '', firmaUnvan: userProfile?.company || '',
@@ -81,7 +82,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender, initialFocu
useEffect(() => { useEffect(() => {
if (!authUser?.email || dirty) return; if (!authUser?.email || dirty) return;
let kayitli = {}; let kayitli = {};
try { kayitli = JSON.parse(localStorage.getItem(FIRMA_ANAHTAR + ':' + authUser.email) || '{}'); } catch { /* bozuk yerel kayıt yoksayılır */ } try { kayitli = JSON.parse(localStorage.getItem(firmaAnahtari(authUser.email)) || '{}'); } catch { /* bozuk yerel kayıt yoksayılır */ }
setFirma((onceki) => ({ setFirma((onceki) => ({
...bosFirma(), ...bosFirma(),
firmaUnvan: userProfile?.company || '', firmaUnvan: userProfile?.company || '',
@@ -118,7 +119,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender, initialFocu
const alanYaz = (k, v) => { const alanYaz = (k, v) => {
const yeni = { ...firma, [k]: v }; const yeni = { ...firma, [k]: v };
setFirma(yeni); setFirma(yeni);
try { localStorage.setItem(FIRMA_ANAHTAR + ':' + authUser?.email, JSON.stringify(yeni)); } catch { /* kota */ } try { localStorage.setItem(firmaAnahtari(authUser?.email), JSON.stringify(yeni)); } catch { /* kota */ }
}; };
const satirlar = useMemo( const satirlar = useMemo(