Skip to content

Commit 85a49a0

Browse files
committed
fix: resolve frontend display inconsistencies in mobile clients and preferences
- Fix error showing empty clients state: when an error occurs on initial load, suppress the EmptyMobileClients placeholder since the error banner already communicates the failure. - Fix false empty before relay session: treat missing accountId (relay session not yet established) as initial loading state to show the skeleton instead of a misleading 'No mobile clients' message. - Fix preference switch stale after update: use optimistic local state for publishAgentActivity so the switch immediately reflects the new value after a successful update, rather than waiting for the async refresh to complete.
1 parent 5c536c8 commit 85a49a0

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

apps/web/src/components/clerk/MobileClientsUserProfilePage.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ function EmptyMobileClients() {
107107
export function MobileClientsUserProfilePage() {
108108
const devicesState = useManagedRelayDevices();
109109
const devices = devicesState.data ?? [];
110-
const isInitialLoad = devicesState.data === null && !devicesState.error;
110+
const isInitialLoad =
111+
!devicesState.accountId || (devicesState.data === null && !devicesState.error);
112+
const hasErrorWithoutData = devicesState.error !== null && devicesState.data === null;
111113

112114
return (
113115
<div className="flex min-h-[30rem] w-full flex-col bg-background text-foreground">
@@ -149,7 +151,7 @@ export function MobileClientsUserProfilePage() {
149151

150152
{isInitialLoad ? (
151153
<MobileClientsSkeleton />
152-
) : devices.length > 0 ? (
154+
) : hasErrorWithoutData ? null : devices.length > 0 ? (
153155
<ul className="space-y-3">
154156
{devices.map((device) => (
155157
<MobileClientRow key={device.deviceId} device={device} />

apps/web/src/components/settings/ConnectionsSettings.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1586,6 +1586,14 @@ function ConfiguredCloudLinkRow({ canManageRelay }: { readonly canManageRelay: b
15861586
const [operationError, setOperationError] = useState<string | null>(null);
15871587
const [isUpdating, setIsUpdating] = useState(false);
15881588
const [isUpdatingPreference, setIsUpdatingPreference] = useState(false);
1589+
const [optimisticPublishActivity, setOptimisticPublishActivity] = useState<boolean | null>(null);
1590+
1591+
const serverPublishActivity = primaryCloudLinkState.data?.publishAgentActivity ?? null;
1592+
useEffect(() => {
1593+
if (optimisticPublishActivity !== null && serverPublishActivity === optimisticPublishActivity) {
1594+
setOptimisticPublishActivity(null);
1595+
}
1596+
}, [serverPublishActivity, optimisticPublishActivity]);
15891597

15901598
const reportUpdateFailure = (cause: unknown) => {
15911599
const message = cause instanceof Error ? cause.message : "Could not update T3 Connect access.";
@@ -1689,6 +1697,7 @@ function ConfiguredCloudLinkRow({ canManageRelay }: { readonly canManageRelay: b
16891697
}
16901698

16911699
primaryCloudLinkState.refresh();
1700+
setOptimisticPublishActivity(enabled);
16921701
toastManager.add({
16931702
type: "success",
16941703
title: enabled ? "Agent activity enabled" : "Agent activity disabled",
@@ -1734,7 +1743,11 @@ function ConfiguredCloudLinkRow({ canManageRelay }: { readonly canManageRelay: b
17341743
control={
17351744
<Switch
17361745
aria-label="Publish agent activity to mobile clients"
1737-
checked={primaryCloudLinkState.data?.publishAgentActivity ?? false}
1746+
checked={
1747+
optimisticPublishActivity ??
1748+
primaryCloudLinkState.data?.publishAgentActivity ??
1749+
false
1750+
}
17381751
disabled={
17391752
!canManageRelay ||
17401753
!isSignedIn ||

0 commit comments

Comments
 (0)