avoid render state updates on account switch

This commit is contained in:
2026-09-06 20:20:13 +03:00
parent fb6489259f
commit 81794568d0
2 changed files with 10 additions and 2 deletions
+6
View File
@@ -2344,3 +2344,9 @@ Doğrulama: `calendarMissingTimeGuard` içinde iki provider seçeneği pasif ve
`https://ihaleist.com` salt okunur probe'u 17:18 İstanbul kontrolünde yeniden çalıştırıldı. Ana sayfa ve `/api/health` 200/`ok:true`; `/api/ready` 404 ve home/health yanıtlarında altı zorunlu güvenlik başlığının tamamı eksik. Bu nedenle production kabul durumu değişmedi ve deploy edilmemiş düzeltmeler için kanıt güncellendi. `https://ihaleist.com` salt okunur probe'u 17:18 İstanbul kontrolünde yeniden çalıştırıldı. Ana sayfa ve `/api/health` 200/`ok:true`; `/api/ready` 404 ve home/health yanıtlarında altı zorunlu güvenlik başlığının tamamı eksik. Bu nedenle production kabul durumu değişmedi ve deploy edilmemiş düzeltmeler için kanıt güncellendi.
Kanıt [`qa-live-runtime.json`](evidence/qa-live-runtime.json) içinde; ödeme, giriş, veri yazma veya teklif gönderme isteği yapılmadı. Kanıt [`qa-live-runtime.json`](evidence/qa-live-runtime.json) içinde; ödeme, giriş, veri yazma veya teklif gönderme isteği yapılmadı.
### 2026-09-06 · Hesap değişiminde not taslağı render güvenliği
İhale detayındaki özel not taslakları hesap değişiminde artık render sırasında `setState` ile temizlenmiyor; değişim bir effect ile uygulanıyor. Böylece React render uyarısı ve hesap geçişi sırasında eski özel notun kısa süreli görünmesi riski azaltıldı. Mevcut owner/acknowledgement kontrolleri korunuyor.
Doğrulama: `npm test` 301/301, `npm run build` ve `npm run qa:browser` başarılı; browser QA iki hesaplı analitik/ICS izolasyonunu da geçti.
+4 -2
View File
@@ -24,8 +24,10 @@ export const TenderDetailModal = () => {
useEffect(()=>{setActiveTab(activeTenderDetail?.preparationTarget ? 'pdf_stamp' : 'details');},[activeTenderDetail?.id,activeTenderDetail?.preparationTarget]); useEffect(()=>{setActiveTab(activeTenderDetail?.preparationTarget ? 'pdf_stamp' : 'details');},[activeTenderDetail?.id,activeTenderDetail?.preparationTarget]);
const noteOwner = authUser?.email || ''; const noteOwner = authUser?.email || '';
const [noteDrafts, setNoteDrafts] = useState(() => ({ owner: noteOwner, drafts: {} })); const [noteDrafts, setNoteDrafts] = useState(() => ({ owner: noteOwner, drafts: {} }));
// Discard private drafts on account changes, before rendering another account. // Discard private drafts after an account change without updating state during render.
if (noteDrafts.owner !== noteOwner) setNoteDrafts({ owner: noteOwner, drafts: {} }); useEffect(() => {
if (noteDrafts.owner !== noteOwner) setNoteDrafts({ owner: noteOwner, drafts: {} });
}, [noteOwner, noteDrafts.owner]);
const noteKey = tenderStateKey(activeTenderDetail); const noteKey = tenderStateKey(activeTenderDetail);
const noteDraft = noteDrafts.owner === noteOwner ? noteDrafts.drafts[noteKey] : undefined; const noteDraft = noteDrafts.owner === noteOwner ? noteDrafts.drafts[noteKey] : undefined;
const noteText = noteDraft?.text || ''; const noteText = noteDraft?.text || '';