From 096251e5b0e92904f691ef805ee38140174c6211 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 9 Mar 2026 03:30:15 +0100 Subject: [PATCH] fix: federated space icon display/upload in settings, restyle settings panels Fix three federation bugs in Space Settings: icon URL was double-wrapped through home API, upload targeted home instance instead of remote, and updateSpace used home API client. Also restyle settings panels (User, Space, Members, Roles, Connected Instances) with consistent section headers, grouped cards, and improved layout. --- .../components/modals/ConnectedInstances.tsx | 9 +- .../src/components/modals/SpaceSettings.tsx | 287 ++++++++-------- .../src/components/modals/UserSettings.tsx | 157 ++++----- .../spaceSettingsPanels/MembersPanel.tsx | 216 +++++++----- .../spaceSettingsPanels/OverviewPanel.tsx | 49 ++- .../modals/spaceSettingsPanels/RolesPanel.tsx | 311 +++++++++--------- packages/web/src/stores/instanceStore.ts | 46 ++- packages/web/src/stores/spaceStore.ts | 9 +- 8 files changed, 599 insertions(+), 485 deletions(-) diff --git a/packages/web/src/components/modals/ConnectedInstances.tsx b/packages/web/src/components/modals/ConnectedInstances.tsx index 5c4860d9..03dcd18f 100644 --- a/packages/web/src/components/modals/ConnectedInstances.tsx +++ b/packages/web/src/components/modals/ConnectedInstances.tsx @@ -381,12 +381,13 @@ export function ConnectedInstances() { const [showAddForm, setShowAddForm] = useState(false); return ( -
-

+
+
Connected Instances -

+
+

Link accounts across federated Backspace instances.

-
+
{/* Home instance (always shown, non-removable) */}
diff --git a/packages/web/src/components/modals/SpaceSettings.tsx b/packages/web/src/components/modals/SpaceSettings.tsx index 1003d9da..39216545 100644 --- a/packages/web/src/components/modals/SpaceSettings.tsx +++ b/packages/web/src/components/modals/SpaceSettings.tsx @@ -84,107 +84,121 @@ function StreamingLimitsPanel() { const pillOff = 'bg-surface-elevated text-txt-secondary hover:bg-interactive-hover'; return ( -
+
These limits apply to all users on this instance. Users can pick values within these bounds.
- {/* Bitrate Range */} + {/* Bandwidth */}
-
- Bitrate Range -
-
-
- - setDraft({ ...draft, minBitrateKbps: Number(e.target.value) })} - className="w-full h-1.5 accent-accent-primary cursor-pointer appearance-none bg-interactive-muted rounded-full - [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3 - [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-md - [&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:border-0" - /> -
{formatKbps(draft.minBitrateKbps)}
+
Bandwidth
+

Minimum and maximum bitrate bounds, and the step size for the quality slider.

+
+ {/* Bitrate Range */} +
+
+ Bitrate Range +
+
+
+ + setDraft({ ...draft, minBitrateKbps: Number(e.target.value) })} + className="w-full h-1.5 accent-accent-primary cursor-pointer appearance-none bg-interactive-muted rounded-full + [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3 + [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-md + [&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:border-0" + /> +
{formatKbps(draft.minBitrateKbps)}
+
+
+ + setDraft({ ...draft, maxBitrateKbps: Number(e.target.value) })} + className="w-full h-1.5 accent-accent-primary cursor-pointer appearance-none bg-interactive-muted rounded-full + [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3 + [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-md + [&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:border-0" + /> +
{formatKbps(draft.maxBitrateKbps)}
+
+
-
- - setDraft({ ...draft, maxBitrateKbps: Number(e.target.value) })} - className="w-full h-1.5 accent-accent-primary cursor-pointer appearance-none bg-interactive-muted rounded-full - [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3 - [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-md - [&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:border-0" - /> -
{formatKbps(draft.maxBitrateKbps)}
+ + {/* Bitrate Step */} +
+
+ Slider Step +
+
+ { + const v = Number(e.target.value); + if (v >= 50 && v <= 5000) setDraft({ ...draft, bitrateStepKbps: v }); + }} + className="w-24 px-2 py-1 bg-surface-input rounded text-sm text-txt-primary outline-none focus:ring-1 focus:ring-accent-primary" + /> + kbps +
- {/* Bitrate Step */} + {/* Quality */}
-
- Slider Step -
-
- { - const v = Number(e.target.value); - if (v >= 50 && v <= 5000) setDraft({ ...draft, bitrateStepKbps: v }); - }} - className="w-24 px-2 py-1 bg-surface-input rounded text-sm text-txt-primary outline-none focus:ring-1 focus:ring-accent-primary" - /> - kbps -
-
+
Quality
+

Available resolution and frame rate options for screen sharing.

+
+ {/* Allowed Resolutions */} +
+
+ Allowed Resolutions +
+
+ {VALID_RESOLUTIONS.map((res) => ( + + ))} +
+
- {/* Allowed Resolutions */} -
-
- Allowed Resolutions -
-
- {VALID_RESOLUTIONS.map((res) => ( - - ))} -
-
- - {/* Allowed Frame Rates */} -
-
- Allowed Frame Rates -
-
- {VALID_FRAMERATES.map((fps) => ( - - ))} + {/* Allowed Frame Rates */} +
+
+ Allowed Frame Rates +
+
+ {VALID_FRAMERATES.map((fps) => ( + + ))} +
+
@@ -276,7 +290,7 @@ function DiscoveryPanel({ spaceId }: { spaceId: string }) { ]; return ( -
+
{!discoveryEnabled && (
Space discovery is disabled by the instance administrator. Changing visibility will have no effect until discovery is re-enabled. @@ -284,48 +298,50 @@ function DiscoveryPanel({ spaceId }: { spaceId: string }) { )}
-
- Visibility -
-
- {visibilityOptions.map((opt) => ( - - ))} +
Visibility
+

Control who can discover and join this space.

+
+
+ {visibilityOptions.map((opt) => ( + + ))} +
-
- Description +
Description
+

A short summary shown on the Explore page.

+
+