feat: organize network settings into tabs #264

Merged
talksik merged 3 commits from worktree-virtual-floating-hamster into main 2026-06-11 17:21:19 +00:00
talksik commented 2026-06-11 16:06:25 +00:00 (Migrated from github.com)

Closes #258

Summary by CodeRabbit

  • New Features

    • Added a tabbed interface to network settings with Members and Plan & Billing sections.
    • Introduced a dialog for inviting members to networks via email addresses.
  • Improvements

    • Network creation workflow now routes directly to the members invitation screen.
Closes #258 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a tabbed interface to network settings with Members and Plan & Billing sections. * Introduced a dialog for inviting members to networks via email addresses. * **Improvements** * Network creation workflow now routes directly to the members invitation screen. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2026-06-11 16:06:39 +00:00 (Migrated from github.com)

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 02bd8d23-012b-465f-b779-e4e016783942

📥 Commits

Reviewing files that changed from the base of the PR and between c8233c6f0f and aa33622750.

📒 Files selected for processing (2)
  • js/desktop/src/features/network-settings.tsx
  • js/desktop/src/features/network-settings/add-members-dialog.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • js/desktop/src/features/network-settings/add-members-dialog.tsx
  • js/desktop/src/features/network-settings.tsx

📝 Walkthrough

Walkthrough

This PR refactors network settings from a single-column layout into a tabbed UI controlled by the URL section query parameter, adds a new AddMembersDialog component for inviting members by email, and routes newly created networks to the Members tab with a one-shot onboarding flag that opens the invitation dialog automatically.

Changes

Network Settings Tabbed UI with Member Invitation Onboarding

Layer / File(s) Summary
Add Members Dialog component
js/desktop/src/features/network-settings/add-members-dialog.tsx
New dialog component with email chip input, Zod validation, Enter/comma/backspace control, and submit handler that calls useInviteMembers and shows a success toast before closing and resetting state.
Settings page tabbed layout and integration
js/desktop/src/features/network-settings.tsx
Refactors page from single column into vertical Tabs UI controlled by the section URL param (defaults to members). Adds one-shot addOpen onboarding initialized from ?add=1 that strips the param after mount. Removes inline InviteForm, moves pending invitations into Members tab, renders Billing in Plan & Billing tab. Updates UI components with SectionHeading and Panel wrapper for consistent styling. Wires "Add members" button to AddMembersDialog.
Post-create navigation to members tab
js/desktop/src/features/network-selector.tsx
Routes newly created networks to the members settings page with section=members&add=1 query parameters to trigger the invitation dialog onboarding.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant EmailInput as Email Input
  participant Validator as Zod Validator
  participant DialogState as AddMembersDialog State
  participant API as useInviteMembers
  participant Toast

  User->>EmailInput: Type email
  EmailInput->>EmailInput: Commit on Enter/Comma or Blur
  EmailInput->>Validator: Validate email
  Validator-->>DialogState: Add chip or set error
  User->>DialogState: Click Add
  DialogState->>API: mutate(emails)
  API->>Toast: Return success
  Toast->>DialogState: Close and reset

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A tabbed settings home, so neat,
Members invited with emails sweet,
Chips and fields that dance and validate,
From create to onboard—a guided state!
Billing tabs, no more scroll to find,
Network settings, now redesigned!

🚥 Pre-merge checks | 3 | 2

Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Linked Issues check Inconclusive The pull request implements the tabbed UI organization for network settings as required by issue #258, with no accessible issue details to validate specific coding requirements against. Provide the detailed requirements from issue #258 to fully validate that all coding objectives have been met.
Passed checks (3 passed)
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title 'feat: organize network settings into tabs' directly and concisely describes the main change in the pull request, which refactors the settings layout from single-column to a tabbed UI.
Out of Scope Changes check Passed All changes are focused on organizing network settings into tabs and adding the AddMembersDialog component, which are directly related to the stated objective of implementing tabbed UI.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch worktree-virtual-floating-hamster

Comment @coderabbitai help to get the list of available commands and usage tips.

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- review_stack_entry_start --> [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/flowy-live/llink/pull/264?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> No actionable comments were generated in the recent review. 🎉 <details> <summary>ℹ️ Recent review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro Plus **Run ID**: `02bd8d23-012b-465f-b779-e4e016783942` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between c8233c6f0f80aac0f9d522748f7fd454db5372c6 and aa336227505ed99f54b5c06e54b21caec6a6061b. </details> <details> <summary>📒 Files selected for processing (2)</summary> * `js/desktop/src/features/network-settings.tsx` * `js/desktop/src/features/network-settings/add-members-dialog.tsx` </details> <details> <summary>🚧 Files skipped from review as they are similar to previous changes (2)</summary> * js/desktop/src/features/network-settings/add-members-dialog.tsx * js/desktop/src/features/network-settings.tsx </details> </details> --- <!-- walkthrough_start --> <details> <summary>📝 Walkthrough</summary> ## Walkthrough This PR refactors network settings from a single-column layout into a tabbed UI controlled by the URL `section` query parameter, adds a new `AddMembersDialog` component for inviting members by email, and routes newly created networks to the Members tab with a one-shot onboarding flag that opens the invitation dialog automatically. ## Changes **Network Settings Tabbed UI with Member Invitation Onboarding** |Layer / File(s)|Summary| |---|---| |**Add Members Dialog component** <br> `js/desktop/src/features/network-settings/add-members-dialog.tsx`|New dialog component with email chip input, Zod validation, Enter/comma/backspace control, and submit handler that calls `useInviteMembers` and shows a success toast before closing and resetting state.| |**Settings page tabbed layout and integration** <br> `js/desktop/src/features/network-settings.tsx`|Refactors page from single column into vertical `Tabs` UI controlled by the `section` URL param (defaults to `members`). Adds one-shot `addOpen` onboarding initialized from `?add=1` that strips the param after mount. Removes inline `InviteForm`, moves pending invitations into Members tab, renders Billing in Plan & Billing tab. Updates UI components with `SectionHeading` and `Panel` wrapper for consistent styling. Wires "Add members" button to `AddMembersDialog`.| |**Post-create navigation to members tab** <br> `js/desktop/src/features/network-selector.tsx`|Routes newly created networks to the members settings page with `section=members&add=1` query parameters to trigger the invitation dialog onboarding.| ## Sequence Diagram(s) ```mermaid sequenceDiagram participant User participant EmailInput as Email Input participant Validator as Zod Validator participant DialogState as AddMembersDialog State participant API as useInviteMembers participant Toast User->>EmailInput: Type email EmailInput->>EmailInput: Commit on Enter/Comma or Blur EmailInput->>Validator: Validate email Validator-->>DialogState: Add chip or set error User->>DialogState: Click Add DialogState->>API: mutate(emails) API->>Toast: Return success Toast->>DialogState: Close and reset ``` ## Estimated code review effort 🎯 3 (Moderate) | ⏱️ ~25 minutes ## Poem > 🐰 A tabbed settings home, so neat, > Members invited with emails sweet, > Chips and fields that dance and validate, > From create to onboard—a guided state! > Billing tabs, no more scroll to find, > Network settings, now redesigned! ✨ </details> <!-- walkthrough_end --> <!-- pre_merge_checks_walkthrough_start --> <details> <summary>🚥 Pre-merge checks | ✅ 3 | ❌ 2</summary> ### ❌ Failed checks (1 warning, 1 inconclusive) | Check name | Status | Explanation | Resolution | | :-----------------: | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------ | | Docstring Coverage | ⚠️ Warning | Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. | | Linked Issues check | ❓ Inconclusive | The pull request implements the tabbed UI organization for network settings as required by issue `#258`, with no accessible issue details to validate specific coding requirements against. | Provide the detailed requirements from issue `#258` to fully validate that all coding objectives have been met. | <details> <summary>✅ Passed checks (3 passed)</summary> | Check name | Status | Explanation | | :------------------------: | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. | | Title check | ✅ Passed | The title 'feat: organize network settings into tabs' directly and concisely describes the main change in the pull request, which refactors the settings layout from single-column to a tabbed UI. | | Out of Scope Changes check | ✅ Passed | All changes are focused on organizing network settings into tabs and adding the AddMembersDialog component, which are directly related to the stated objective of implementing tabbed UI. | </details> <sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub> </details> <!-- pre_merge_checks_walkthrough_end --> <!-- finishing_touch_checkbox_start --> <details> <summary>✨ Finishing Touches</summary> <details> <summary>📝 Generate docstrings</summary> - [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> Create stacked PR - [ ] <!-- {"checkboxId": "3e1879ae-f29b-4d0d-8e06-d12b7ba33d98"} --> Commit on current branch </details> <details> <summary>🧪 Generate unit tests (beta)</summary> - [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Create PR with unit tests - [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Commit unit tests in branch `worktree-virtual-floating-hamster` </details> </details> <!-- finishing_touch_checkbox_end --> <!-- tips_start --> --- <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end --> <!-- internal state start --> <!-- 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= --> <!-- internal state end -->
coderabbitai[bot] (Migrated from github.com) reviewed 2026-06-11 16:13:44 +00:00
coderabbitai[bot] (Migrated from github.com) left a comment

Actionable comments posted: 1

🧹 Nitpick comments (2)
js/desktop/src/features/network-settings/add-members-dialog.tsx (2)

30-37: Quick win

Use the shared Button for the chip remove control.

This icon-only action is still an app button, and the raw element skips the standard focus/interaction treatment the design system already gives you. As per coding guidelines, "Use design system components from shadcn whenever possible; add new shadcn components to the design system before using them in the app."

Possible refactor
-      <button
-        type="button"
-        onClick={onRemove}
-        aria-label={`Remove ${email}`}
-        className="text-muted-foreground hover:text-foreground"
-      >
+      <Button
+        type="button"
+        variant="ghost"
+        size="icon-sm"
+        onClick={onRemove}
+        aria-label={`Remove ${email}`}
+        className="text-muted-foreground hover:text-foreground size-5"
+      >
         <X className="size-3" />
-      </button>
+      </Button>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@js/desktop/src/features/network-settings/add-members-dialog.tsx` around lines
30 - 37, Replace the raw HTML button used for removing a chip with the shared
design-system Button component: keep the onRemove handler (onClick={onRemove}),
aria-label={`Remove ${email}`}, and the <X /> icon as its child, and apply the
equivalent visual/tactile props (e.g., ghost/icon variant or appropriate size
and text-muted-foreground/hover styles) to the Button so it receives the
standard focus and interaction behavior; add the Button import at the top of
add-members-dialog.tsx and remove the raw <button> element.

Source: Coding guidelines


102-111: Don’t add local onError for invites; refactor the chip remove affordance to use Button.

  • Invite failures should already surface via the global React Query mutationCache.onError toast from createQueryClient() (wired in App.tsx), so handling only onSuccess here isn’t silent.
  • EmailChip uses a raw <button> for the remove action even though the shared shadcn Button exists; switch the remove affordance to Button for design-system consistency.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@js/desktop/src/features/network-settings/add-members-dialog.tsx` around lines
102 - 111, Remove any local onError handling from the inviteMembers.mutate call
and keep only onSuccess as shown (letting the global React Query
mutationCache.onError handle failures); then update the EmailChip component so
its remove affordance uses the shared shadcn Button component instead of a raw
<button>—replace the raw button in EmailChip with Button and wire its onClick to
the existing remove handler, keeping prop names and behavior unchanged
(references: inviteMembers.mutate, EmailChip, Button, handleOpenChange).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@js/desktop/src/features/network-settings.tsx`:
- Around line 185-190: The cleanup effect currently captures the render-time
searchParams and mutates that snapshot which can clobber newer URL state (e.g.,
updated section tabs); change the setSearchParams call inside the useEffect to
the functional form setSearchParams(prev => ...) so you operate on the latest
params, create a new URLSearchParams from prev, call delete('add') on that new
instance, and return it (preserving { replace: true } behavior) — follow the
same pattern used in network-root.tsx and update the useEffect that references
searchParams and setSearchParams accordingly.

---

Nitpick comments:
In `@js/desktop/src/features/network-settings/add-members-dialog.tsx`:
- Around line 30-37: Replace the raw HTML button used for removing a chip with
the shared design-system Button component: keep the onRemove handler
(onClick={onRemove}), aria-label={`Remove ${email}`}, and the <X /> icon as its
child, and apply the equivalent visual/tactile props (e.g., ghost/icon variant
or appropriate size and text-muted-foreground/hover styles) to the Button so it
receives the standard focus and interaction behavior; add the Button import at
the top of add-members-dialog.tsx and remove the raw <button> element.
- Around line 102-111: Remove any local onError handling from the
inviteMembers.mutate call and keep only onSuccess as shown (letting the global
React Query mutationCache.onError handle failures); then update the EmailChip
component so its remove affordance uses the shared shadcn Button component
instead of a raw <button>—replace the raw button in EmailChip with Button and
wire its onClick to the existing remove handler, keeping prop names and behavior
unchanged (references: inviteMembers.mutate, EmailChip, Button,
handleOpenChange).
🪄 Autofix (Beta)

Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d1b2267-8eb8-4ac6-b48e-b571052d4d05

📥 Commits

Reviewing files that changed from the base of the PR and between cf94003b3f and b46df94124.

📒 Files selected for processing (3)
  • js/desktop/src/features/network-selector.tsx
  • js/desktop/src/features/network-settings.tsx
  • js/desktop/src/features/network-settings/add-members-dialog.tsx
**Actionable comments posted: 1** <details> <summary>🧹 Nitpick comments (2)</summary><blockquote> <details> <summary>js/desktop/src/features/network-settings/add-members-dialog.tsx (2)</summary><blockquote> `30-37`: _⚡ Quick win_ **Use the shared `Button` for the chip remove control.** This icon-only action is still an app button, and the raw element skips the standard focus/interaction treatment the design system already gives you. As per coding guidelines, "Use design system components from shadcn whenever possible; add new shadcn components to the design system before using them in the app." <details> <summary>Possible refactor</summary> ```diff - <button - type="button" - onClick={onRemove} - aria-label={`Remove ${email}`} - className="text-muted-foreground hover:text-foreground" - > + <Button + type="button" + variant="ghost" + size="icon-sm" + onClick={onRemove} + aria-label={`Remove ${email}`} + className="text-muted-foreground hover:text-foreground size-5" + > <X className="size-3" /> - </button> + </Button> ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@js/desktop/src/features/network-settings/add-members-dialog.tsx` around lines 30 - 37, Replace the raw HTML button used for removing a chip with the shared design-system Button component: keep the onRemove handler (onClick={onRemove}), aria-label={`Remove ${email}`}, and the <X /> icon as its child, and apply the equivalent visual/tactile props (e.g., ghost/icon variant or appropriate size and text-muted-foreground/hover styles) to the Button so it receives the standard focus and interaction behavior; add the Button import at the top of add-members-dialog.tsx and remove the raw <button> element. ``` </details> <!-- cr-comment:v1:81b0b4ffb19146a87eb671e8 --> _Source: Coding guidelines_ --- `102-111`: **Don’t add local `onError` for invites; refactor the chip remove affordance to use `Button`.** - Invite failures should already surface via the global React Query `mutationCache.onError` toast from `createQueryClient()` (wired in `App.tsx`), so handling only `onSuccess` here isn’t silent. - `EmailChip` uses a raw `<button>` for the remove action even though the shared shadcn `Button` exists; switch the remove affordance to `Button` for design-system consistency. <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@js/desktop/src/features/network-settings/add-members-dialog.tsx` around lines 102 - 111, Remove any local onError handling from the inviteMembers.mutate call and keep only onSuccess as shown (letting the global React Query mutationCache.onError handle failures); then update the EmailChip component so its remove affordance uses the shared shadcn Button component instead of a raw <button>—replace the raw button in EmailChip with Button and wire its onClick to the existing remove handler, keeping prop names and behavior unchanged (references: inviteMembers.mutate, EmailChip, Button, handleOpenChange). ``` </details> <!-- cr-comment:v1:8dfbfab18c87def078e5eeda --> </blockquote></details> </blockquote></details> <details> <summary>🤖 Prompt for all review comments with AI agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. Inline comments: In `@js/desktop/src/features/network-settings.tsx`: - Around line 185-190: The cleanup effect currently captures the render-time searchParams and mutates that snapshot which can clobber newer URL state (e.g., updated section tabs); change the setSearchParams call inside the useEffect to the functional form setSearchParams(prev => ...) so you operate on the latest params, create a new URLSearchParams from prev, call delete('add') on that new instance, and return it (preserving { replace: true } behavior) — follow the same pattern used in network-root.tsx and update the useEffect that references searchParams and setSearchParams accordingly. --- Nitpick comments: In `@js/desktop/src/features/network-settings/add-members-dialog.tsx`: - Around line 30-37: Replace the raw HTML button used for removing a chip with the shared design-system Button component: keep the onRemove handler (onClick={onRemove}), aria-label={`Remove ${email}`}, and the <X /> icon as its child, and apply the equivalent visual/tactile props (e.g., ghost/icon variant or appropriate size and text-muted-foreground/hover styles) to the Button so it receives the standard focus and interaction behavior; add the Button import at the top of add-members-dialog.tsx and remove the raw <button> element. - Around line 102-111: Remove any local onError handling from the inviteMembers.mutate call and keep only onSuccess as shown (letting the global React Query mutationCache.onError handle failures); then update the EmailChip component so its remove affordance uses the shared shadcn Button component instead of a raw <button>—replace the raw button in EmailChip with Button and wire its onClick to the existing remove handler, keeping prop names and behavior unchanged (references: inviteMembers.mutate, EmailChip, Button, handleOpenChange). ``` </details> <details> <summary>🪄 Autofix (Beta)</summary> ✅ Autofix completed </details> --- <details> <summary>ℹ️ Review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro Plus **Run ID**: `6d1b2267-8eb8-4ac6-b48e-b571052d4d05` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between cf94003b3fd652a107d52f2a113bdbe54bc94350 and b46df94124e8a4afe7c496fe81165f627c6296b5. </details> <details> <summary>📒 Files selected for processing (3)</summary> * `js/desktop/src/features/network-selector.tsx` * `js/desktop/src/features/network-settings.tsx` * `js/desktop/src/features/network-settings/add-members-dialog.tsx` </details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
@@ -181,7 +156,7 @@ export default function NetworkSettingsPage() {
const { networkId } = useParams<{ networkId: string }>();
coderabbitai[bot] (Migrated from github.com) commented 2026-06-11 16:13:43 +00:00

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="js/desktop/src/features/network-settings.tsx"

# Show the relevant block around the reported lines
sed -n '150,220p' "$FILE" | cat -n

# Find all setSearchParams / useSearchParams usages in this file
rg -n "useSearchParams|setSearchParams|searchParams\.|get\('add'|add=|delete\('add'\)" "$FILE"

# Show any other URL/search-param effects in this file
rg -n "useEffect\\(\\s*\\(\\)\\s*=>|useEffect\\(\\s*\\(" "$FILE"

# Also search in nearby related files for shared query-param conventions
rg -n "network-settings\\.tsx|useSearchParams|setSearchParams|add'|section" js/desktop/src/features

Repository: flowy-live/llink

Length of output: 6719


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the rest of network-settings.tsx around the tabs/dialog and any other search param usage
FILE="js/desktop/src/features/network-settings.tsx"
sed -n '1,260p' "$FILE" | cat -n

# Inspect network-root.tsx where searchParams are also managed
FILE2="js/desktop/src/features/network-root.tsx"
sed -n '1,140p' "$FILE2" | cat -n

# Inspect network-selector usage that navigates with section/add
FILE3="js/desktop/src/features/network-selector.tsx"
sed -n '1,220p' "$FILE3" | cat -n

# Check for any additional setSearchParams in the same feature folder
rg -n "setSearchParams\\(" js/desktop/src/features/network-*.tsx js/desktop/src/features/network-root.tsx

Repository: flowy-live/llink

Length of output: 24667


Avoid clobbering URL state when stripping add=1
In js/desktop/src/features/network-settings.tsx (around lines 185-190), the cleanup effect clones the render-time searchParams before deleting add; if section (tabs) is updated before the effect runs, that newer change can be overwritten. Switch to the functional setSearchParams(prev => ...) pattern (like js/desktop/src/features/network-root.tsx) and delete add from prev instead of the captured snapshot.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@js/desktop/src/features/network-settings.tsx` around lines 185 - 190, The
cleanup effect currently captures the render-time searchParams and mutates that
snapshot which can clobber newer URL state (e.g., updated section tabs); change
the setSearchParams call inside the useEffect to the functional form
setSearchParams(prev => ...) so you operate on the latest params, create a new
URLSearchParams from prev, call delete('add') on that new instance, and return
it (preserving { replace: true } behavior) — follow the same pattern used in
network-root.tsx and update the useEffect that references searchParams and
setSearchParams accordingly.

Addressed in commit c8233c6

_⚠️ Potential issue_ | _🟡 Minor_ <details> <summary>🧩 Analysis chain</summary> 🏁 Script executed: ```shell #!/bin/bash set -euo pipefail FILE="js/desktop/src/features/network-settings.tsx" # Show the relevant block around the reported lines sed -n '150,220p' "$FILE" | cat -n # Find all setSearchParams / useSearchParams usages in this file rg -n "useSearchParams|setSearchParams|searchParams\.|get\('add'|add=|delete\('add'\)" "$FILE" # Show any other URL/search-param effects in this file rg -n "useEffect\\(\\s*\\(\\)\\s*=>|useEffect\\(\\s*\\(" "$FILE" # Also search in nearby related files for shared query-param conventions rg -n "network-settings\\.tsx|useSearchParams|setSearchParams|add'|section" js/desktop/src/features ``` Repository: flowy-live/llink Length of output: 6719 --- 🏁 Script executed: ```shell #!/bin/bash set -euo pipefail # Inspect the rest of network-settings.tsx around the tabs/dialog and any other search param usage FILE="js/desktop/src/features/network-settings.tsx" sed -n '1,260p' "$FILE" | cat -n # Inspect network-root.tsx where searchParams are also managed FILE2="js/desktop/src/features/network-root.tsx" sed -n '1,140p' "$FILE2" | cat -n # Inspect network-selector usage that navigates with section/add FILE3="js/desktop/src/features/network-selector.tsx" sed -n '1,220p' "$FILE3" | cat -n # Check for any additional setSearchParams in the same feature folder rg -n "setSearchParams\\(" js/desktop/src/features/network-*.tsx js/desktop/src/features/network-root.tsx ``` Repository: flowy-live/llink Length of output: 24667 --- </details> **Avoid clobbering URL state when stripping `add=1`** In `js/desktop/src/features/network-settings.tsx` (around lines 185-190), the cleanup effect clones the render-time `searchParams` before deleting `add`; if `section` (tabs) is updated before the effect runs, that newer change can be overwritten. Switch to the functional `setSearchParams(prev => ...)` pattern (like `js/desktop/src/features/network-root.tsx`) and delete `add` from `prev` instead of the captured snapshot. <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@js/desktop/src/features/network-settings.tsx` around lines 185 - 190, The cleanup effect currently captures the render-time searchParams and mutates that snapshot which can clobber newer URL state (e.g., updated section tabs); change the setSearchParams call inside the useEffect to the functional form setSearchParams(prev => ...) so you operate on the latest params, create a new URLSearchParams from prev, call delete('add') on that new instance, and return it (preserving { replace: true } behavior) — follow the same pattern used in network-root.tsx and update the useEffect that references searchParams and setSearchParams accordingly. ``` </details> <!-- fingerprinting:phantom:medusa:grasshopper --> <!-- cr-comment:v1:78c5187cbb5c9bbff3abcce3 --> <!-- This is an auto-generated comment by CodeRabbit --> ✅ Addressed in commit c8233c6
coderabbitai[bot] commented 2026-06-11 16:51:13 +00:00 (Migrated from github.com)

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 2 file(s) based on 1 unresolved review comment.

Files modified:

  • js/desktop/src/features/network-settings.tsx
  • js/desktop/tsconfig.json

Commit: c8233c6f0f80aac0f9d522748f7fd454db5372c6

The changes have been pushed to the worktree-virtual-floating-hamster branch.

Time taken: 5m 33s

<!-- This is an auto-generated comment: autofix status by CodeRabbit --> > [!NOTE] > Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it. ## Fixes Applied Successfully Fixed 2 file(s) based on 1 unresolved review comment. **Files modified:** - `js/desktop/src/features/network-settings.tsx` - `js/desktop/tsconfig.json` **Commit:** `c8233c6f0f80aac0f9d522748f7fd454db5372c6` The changes have been pushed to the `worktree-virtual-floating-hamster` branch. **Time taken:** `5m 33s` <!-- autofix-run-id: ecaf88ac-136e-40b1-b579-89d3f9973794 -->
Sign in to join this conversation.