Problem
Load test şu an modal dialog olarak açılıyor. Dialog açıkken:
- Diğer request tab'larına geçilemiyor
- Request builder'daki diğer sekmeler (Headers, Body, Code vb.) kullanılamıyor
- Load test arka planda çalışırken bile UI kilitli kalıyor
Çözüm
Load test'i Request Builder'daki tab bar'a yeni bir "Load Test" sekmesi olarak ekle (Params / Headers / Auth / Body / Settings / Code'un yanına). Dialog tamamen kalkar.
Implementation planı
1. Tab type güncelle
apps/desktop/src/renderer/src/components/RequestBuilder.tsx:
type Tab = 'params' | 'headers' | 'auth' | 'body' | 'settings' | 'code' | 'load';
2. LoadTestDialog → LoadTestPanel dönüşümü
apps/desktop/src/renderer/src/components/LoadTestDialog.tsx → LoadTestPanel.tsx olarak rename veya yeni component
- Radix Dialog wrapper'ını tamamen kaldır
- İçerik aynı kalır: config form (total, concurrency, delay, validator) + live metrics + console log
- Panel, RequestBuilder'ın body'sinde
{tab === 'load' && <LoadTestPanel />} olarak render edilir
3. RequestBuilder'daki tab bar'a "Load Test" ekle
- "Code" tab'ının yanına "Load Test" tab butonu
- Tab'da load test çalışıyorsa küçük bir animated indicator (mevcut
pulse-dot pattern'i reuse)
4. Dialog trigger'ları temizle
- RequestBuilder header'daki "Load test" butonu artık
setTab('load') çağırır (dialog açmak yerine)
LoadTestDialog import'ları ve state'i (loadTestOpen, setLoadTestOpen) kaldırılır
importCurlTick / loadTestTick tick pattern'i varsa kaldırılır veya tab set'e dönüştürülür
5. State korunması
- Load test çalışırken başka tab'a geçip geri dönüldüğünde:
runId, progress, events state'i korunur (component unmount olmaz çünkü {tab === 'load' && ...} yerine display:none veya state'i yukarı taşı)
- Ya da en temizi: load test state'ini store'a taşı (per-tab
loadRunId, loadProgress)
Edge case'ler
| Durum |
Davranış |
| Load test çalışırken başka request tab'ına geç |
Load test arka planda devam eder (main process), geri dönünce metrics güncellenir |
| Load test çalışırken URL değiştir |
Mevcut run etkilenmez, yeni run başlatılırsa yeni config kullanılır |
| Birden fazla tab'da load test |
Her tab'ın kendi runId'si var, main process loadRuns Map ile izole |
| Load test çalışırken tab kapat |
loadStop(runId) çağrılır, run abort edilir |
Dokunulacak dosyalar
apps/desktop/src/renderer/src/components/LoadTestDialog.tsx → LoadTestPanel.tsx (rename + refactor)
apps/desktop/src/renderer/src/components/RequestBuilder.tsx (tab type + render + header button)
Out of scope
Priority
High — günlük kullanımda UX friction'ı.
Problem
Load test şu an modal dialog olarak açılıyor. Dialog açıkken:
Çözüm
Load test'i Request Builder'daki tab bar'a yeni bir "Load Test" sekmesi olarak ekle (Params / Headers / Auth / Body / Settings / Code'un yanına). Dialog tamamen kalkar.
Implementation planı
1. Tab type güncelle
apps/desktop/src/renderer/src/components/RequestBuilder.tsx:2. LoadTestDialog → LoadTestPanel dönüşümü
apps/desktop/src/renderer/src/components/LoadTestDialog.tsx→LoadTestPanel.tsxolarak rename veya yeni component{tab === 'load' && <LoadTestPanel />}olarak render edilir3. RequestBuilder'daki tab bar'a "Load Test" ekle
pulse-dotpattern'i reuse)4. Dialog trigger'ları temizle
setTab('load')çağırır (dialog açmak yerine)LoadTestDialogimport'ları ve state'i (loadTestOpen,setLoadTestOpen) kaldırılırimportCurlTick/loadTestTicktick pattern'i varsa kaldırılır veya tab set'e dönüştürülür5. State korunması
runId,progress,eventsstate'i korunur (component unmount olmaz çünkü{tab === 'load' && ...}yerine display:none veya state'i yukarı taşı)loadRunId,loadProgress)Edge case'ler
loadRunsMap ile izoleloadStop(runId)çağrılır, run abort edilirDokunulacak dosyalar
Out of scope
Priority
High — günlük kullanımda UX friction'ı.