diff --git a/packages/webapp/src/CloudApp.tsx b/packages/webapp/src/CloudApp.tsx index 64742a45..cb328114 100644 --- a/packages/webapp/src/CloudApp.tsx +++ b/packages/webapp/src/CloudApp.tsx @@ -35,6 +35,7 @@ import { AccessApprovalDialog } from './AccessApprovalDialog'; import { useAccessProposals } from './use-access-proposals'; import type { ConnectionsFocus, WorkspaceDetailsTab } from './WorkspaceDetailsDialog'; import { ShellNav } from './shell/ShellNav'; +import { routeShowsMobileRail } from './shell/mobile-rail'; import { isSecondaryRoute, SecondaryRoutes } from './shell/SecondaryRoutes'; import { NewTabControl } from './shell/NewTabControl'; import { WorkPanes } from './shell/WorkPanes'; @@ -283,9 +284,10 @@ function CloudAppContent({ client, resolver }: CloudAppProps) { if (!mobileWebApp) setDrawerOpen(false); }, [mobileWebApp]); + const railIsWorkspaceScreen = routeShowsMobileRail(route); useEffect(() => { - setDrawerOpen(false); - }, [route.page, route.workspaceId]); + setDrawerOpen(mobileWebApp && railIsWorkspaceScreen); + }, [mobileWebApp, railIsWorkspaceScreen, route.workspaceId]); useEffect(() => { if (!mobileWebApp) return; @@ -1685,7 +1687,10 @@ function CloudAppContent({ client, resolver }: CloudAppProps) { if (mobileWebApp) setDrawerOpen(false); setDetails({ workspaceId, tab: 'members', focusAddMember: true }); }} - onCreateWorkspace={() => setShowCreateWorkspace(true)} + onCreateWorkspace={() => { + if (mobileWebApp) setDrawerOpen(false); + setShowCreateWorkspace(true); + }} onOpenSettings={() => navigateToSettings('profile')} onSelectSession={selectTtydSession} onCloseSession={closeTtydSession} diff --git a/packages/webapp/src/WorkspaceMembersEditor.tsx b/packages/webapp/src/WorkspaceMembersEditor.tsx index 816b8d25..706650e8 100644 --- a/packages/webapp/src/WorkspaceMembersEditor.tsx +++ b/packages/webapp/src/WorkspaceMembersEditor.tsx @@ -248,47 +248,49 @@ function MemberRow({ }} /> )} - {showMachine && } - {showMachine && ( - - )} - {showVolume && (machine === null ? ( - - ) : ( - // The disk exists, so the row reports it instead of offering a choice - // this route cannot make: how full it is, or that there is none. - - ))} - {showMachine && actions.length > 0 && ( - ({ value: action, label: MACHINE_ACTION_LABELS[action] }))} - onChange={(next) => { - // SAFETY: the options are exactly the MachineAction values above. - onMachineAction?.(next as MachineAction); - }} - /> - )} + )} + {showVolume && (machine === null ? ( + + ) : ( + // The disk exists, so the row reports it instead of offering a choice + // this route cannot make: how full it is, or that there is none. + + ))} + {showMachine && actions.length > 0 && ( + ({ value: action, label: MACHINE_ACTION_LABELS[action] }))} + onChange={(next) => { + // SAFETY: the options are exactly the MachineAction values above. + onMachineAction?.(next as MachineAction); + }} + /> + )} + {!readOnly && !pinned && (