Polish pass: shared request pipeline, tab persistence, UX safety, dedup - #16
Merged
Conversation
Bug fixes:
- SSE streaming, WebSocket connect, and GraphQL introspection now resolve
{{variables}} and apply auth via the shared applyAuthToHeaders — three of
five hand-rolled auth copies skipped substitution entirely, so a streamed
{{baseUrl}} with a {{token}} bearer went out verbatim
- Extract buildSendRequestOptions (utils/requestBuilder.ts): one substitution
-> auth -> cookies -> scripts -> network pipeline shared by useRequest and
CollectionRunner, fixing the runner's cookie double-send and killing ~90
drifted duplicate lines; delete the weaker utils/auth.ts twin
- updateTab bails out when values are unchanged — RequestPanel's streaming
sync effect fires per render via an inline lambda, and returning a fresh
array for a no-op update kept the app in a permanent render loop that
starved any debounce keyed on tabs identity
- Enter no longer sends the request behind an open dialog; saving keeps the
tab's (possibly user-set) name instead of a URL-derived one
Tabs:
- Persist open tabs to localStorage (debounced + pagehide flush) and restore
on launch; nameEdited flag keeps manual renames across URL edits
- Ctrl+Enter sends from anywhere (registered as a Monaco command in both
editors), Ctrl+T/W new/close, Ctrl(+Shift)+Tab cycle, Ctrl+1-9 jump
- Middle-click close, context menu (duplicate/close others/close right),
keyboard-reachable close button, 240px cap with title tooltip,
overflow-only edge fade, scroll active tab into view
UX safety and a11y:
- Confirm dialogs for delete collection/environment (matching clear-history);
save/export toasts; CopyButton gets labels and surfaces clipboard failures
- KeyValueList: real aria labels, Enter adds the next row; empty state for
environments; panel widths persist; resize handles get separator roles
- Import modals share theming, inline errors, reset-on-close, Ctrl+Enter
Overflow fixes for long unbroken strings (URLs, hashes):
- ScrollArea viewport wrapper forced to block — Radix's display:table sizing
let content blow past panel edges and defeat truncate everywhere
- Dialog grid track pinned with minmax(0,1fr); palette sub-label capped
Dedup:
- One methodColors module (seven copies, three palettes disagreed on GET's
hue), one formatBytes (four formatters; 5 MB rendered as "5120.0KB"),
one post_oauth_form helper for oauth.rs's five identical token POSTs
- Remove dead useSession/Session, unused utils, react-router-dom and
@shadcn/ui deps; replace the remaining any types at persistence and
OpenAPI boundaries with unknown + narrow shapes
Verified: 430 vitest + 24 cargo green, clippy clean, tsc strict clean, and
native WebView2 checks (send pipeline, shortcuts, persistence, truncation).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
✅ Lykos Reviewer finished — 2 comment(s). See the review below. |
There was a problem hiding this comment.
heya, Lykos here :3 poking through this with the pack. this is a massive and beautiful clean-up! you've really smoothed out the rough edges, especially with the request pipeline unification and that sneaky render loop fix in the tab store. the app feels way more robust and professional now 💕
| } catch { | ||
| // Not a parseable URL — send as typed and let the backend report it | ||
| } | ||
| connectUrl = applyAuthToHeaders(auth, headerRecord, connectUrl, substituteVariables) |
| streaming: null, | ||
| cancelStream: undefined, | ||
| testResults: null, | ||
| }) |
ionite34
approved these changes
Aug 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A broad polish sweep across the app — four bundles of bug fixes, UX improvements, and consolidation (net −241 lines of source before test additions).
Bug fixes
{{variables}}and apply auth through the sharedapplyAuthToHeaders— three of five hand-rolled auth copies skipped substitution entirely, so a streamed{{baseUrl}}with a{{token}}bearer went out verbatim.utils/requestBuilder.ts(buildSendRequestOptions) is the single substitution → auth → cookies → pre-request scripts → network pipeline, shared byuseRequestandCollectionRunner. Fixes the runner double-sending user-typedcookieheaders and deletes the weakerutils/auth.tstwin.updateTabbails out on no-op updates. RequestPanel's streaming-sync effect fires every render via an inline lambda; unconditionally returning a fresh tabs array kept the app in a permanent ~200Hz render loop (measured 416 debounce resets in 2s while idle) that also starved the new tab-persistence debounce.Tabs
pagehideflush); manual renames survive URL edits via anameEditedflag.UX safety & a11y
Overflow fixes — long unbroken strings (URLs, hashes) blew past panel edges in several places: Radix ScrollArea's
display: tableviewport wrapper is forced back to block (all our ScrollAreas are vertical-only), dialog grid tracks are pinned withminmax(0,1fr), and the palette's sub-label is capped.Dedup — one
methodColorsmodule (was 7 copies across 3 palettes), oneformatBytes(was 4 formatters; a 5 MB response rendered as "5120.0KB"), onepost_oauth_formhelper inoauth.rs(was 5 identical POSTs), dead code removed (useSession, unused utils,react-router-dom,@shadcn/ui), and the remaininganys at persistence/OpenAPI boundaries replaced withunknown+ narrow shapes.Test plan
cargo clippy --all-targetscleantscstrict clean; eslint 0 errors,no-explicit-anywarnings gonenpm run buildsucceeds🤖 Generated with Claude Code