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 -->
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 -->
[](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
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."
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.
**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 -->
#!/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 usageFILE="js/desktop/src/features/network-settings.tsx"
sed -n '1,260p'"$FILE"| cat -n
# Inspect network-root.tsx where searchParams are also managedFILE2="js/desktop/src/features/network-root.tsx"
sed -n '1,140p'"$FILE2"| cat -n
# Inspect network-selector usage that navigates with section/addFILE3="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.
_⚠️ 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
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 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #258
Summary by CodeRabbit
New Features
Improvements
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
c8233c6f0fandaa33622750.📒 Files selected for processing (2)
js/desktop/src/features/network-settings.tsxjs/desktop/src/features/network-settings/add-members-dialog.tsx🚧 Files skipped from review as they are similar to previous changes (2)
📝 Walkthrough
Walkthrough
This PR refactors network settings from a single-column layout into a tabbed UI controlled by the URL
sectionquery parameter, adds a newAddMembersDialogcomponent 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
js/desktop/src/features/network-settings/add-members-dialog.tsxuseInviteMembersand shows a success toast before closing and resetting state.js/desktop/src/features/network-settings.tsxTabsUI controlled by thesectionURL param (defaults tomembers). Adds one-shotaddOpenonboarding initialized from?add=1that strips the param after mount. Removes inlineInviteForm, moves pending invitations into Members tab, renders Billing in Plan & Billing tab. Updates UI components withSectionHeadingandPanelwrapper for consistent styling. Wires "Add members" button toAddMembersDialog.js/desktop/src/features/network-selector.tsxsection=members&add=1query parameters to trigger the invitation dialog onboarding.Sequence Diagram(s)
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
#258, with no accessible issue details to validate specific coding requirements against.#258to fully validate that all coding objectives have been met.✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings.
✨ Finishing Touches
📝 Generate docstrings
🧪 Generate unit tests (beta)
worktree-virtual-floating-hamsterComment
@coderabbitai helpto get the list of available commands and usage tips.Actionable comments posted: 1
🧹 Nitpick comments (2)
🤖 Prompt for all review comments with AI agents
🪄 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
cf94003b3fandb46df94124.📒 Files selected for processing (3)
js/desktop/src/features/network-selector.tsxjs/desktop/src/features/network-settings.tsxjs/desktop/src/features/network-settings/add-members-dialog.tsx@@ -181,7 +156,7 @@ export default function NetworkSettingsPage() {const { networkId } = useParams<{ networkId: string }>();⚠️ Potential issue | 🟡 Minor
🧩 Analysis chain
🏁 Script executed:
Repository: flowy-live/llink
Length of output: 6719
🏁 Script executed:
Repository: flowy-live/llink
Length of output: 24667
Avoid clobbering URL state when stripping
add=1In
js/desktop/src/features/network-settings.tsx(around lines 185-190), the cleanup effect clones the render-timesearchParamsbefore deletingadd; ifsection(tabs) is updated before the effect runs, that newer change can be overwritten. Switch to the functionalsetSearchParams(prev => ...)pattern (likejs/desktop/src/features/network-root.tsx) and deleteaddfromprevinstead of the captured snapshot.🤖 Prompt for AI Agents
✅ Addressed in commit
c8233c6Fixes Applied Successfully
Fixed 2 file(s) based on 1 unresolved review comment.
Files modified:
js/desktop/src/features/network-settings.tsxjs/desktop/tsconfig.jsonCommit:
c8233c6f0f80aac0f9d522748f7fd454db5372c6The changes have been pushed to the
worktree-virtual-floating-hamsterbranch.Time taken:
5m 33s