diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx index aa16976228..23102204c6 100644 --- a/packages/app/src/components/dialog-select-server.tsx +++ b/packages/app/src/components/dialog-select-server.tsx @@ -562,6 +562,7 @@ export function useServerManagementController(options: { onSelect?: () => void; startEdit, resetForm, submitForm, + canRemove: server.canRemove, handleRemove, handleFormChange: () => (isAddMode() ? handleAddChange : handleEditChange), handleFormNameChange: () => (isAddMode() ? handleAddNameChange : handleEditNameChange), @@ -649,13 +650,15 @@ export function ServerConnectionList(props: { controller: ReturnType - - props.controller.handleRemove(ServerConnection.key(i))} - class="text-text-on-critical-base hover:bg-surface-critical-weak" - > - {language.t("dialog.server.menu.delete")} - + + + props.controller.handleRemove(ServerConnection.key(i))} + class="text-text-on-critical-base hover:bg-surface-critical-weak" + > + {language.t("dialog.server.menu.delete")} + + diff --git a/packages/app/src/components/server/server-row-menu.tsx b/packages/app/src/components/server/server-row-menu.tsx index 0a2920dec7..ee4a46db07 100644 --- a/packages/app/src/components/server/server-row-menu.tsx +++ b/packages/app/src/components/server/server-row-menu.tsx @@ -21,6 +21,7 @@ export const ServerRowMenu: Component<{ labels={serverMenuLabels(language)} canDefault={props.controller.canDefault()} isDefault={props.controller.defaultKey() === key} + canRemove={props.controller.canRemove(key)} onEdit={props.onEdit} onSetDefault={() => props.controller.setDefault(key)} onRemoveDefault={() => props.controller.setDefault(null)} @@ -47,6 +48,7 @@ export const ServerRowMenuView: Component<{ labels: ReturnType canDefault: boolean isDefault: boolean + canRemove: boolean onEdit: (server: ServerConnection.Http) => void onSetDefault: () => void onRemoveDefault: () => void @@ -84,10 +86,10 @@ export const ServerRowMenuView: Component<{ {props.labels.defaultRemove} - - - {props.labels.delete} - + + + {props.labels.delete} + diff --git a/packages/app/src/context/server.tsx b/packages/app/src/context/server.tsx index 450129f458..818bdf69b5 100644 --- a/packages/app/src/context/server.tsx +++ b/packages/app/src/context/server.tsx @@ -178,6 +178,17 @@ export function resolveServerList(input: { return [...deduped.values()] } +export function canRemoveServer(input: { + key: ServerConnection.Key + provided?: Array + stored: StoredServer[] +}) { + if (input.provided?.some((server) => ServerConnection.key(server) === input.key)) return false + return input.stored.some((server) => + typeof server === "string" ? server === input.key : ("type" in server ? server.http.url : server.url) === input.key, + ) +} + export namespace ServerConnection { type Base = { displayName?: string; label?: string } @@ -312,6 +323,10 @@ export const { use: useServer, provider: ServerProvider } = createSimpleContext( }) } + function canRemove(key: ServerConnection.Key) { + return canRemoveServer({ key, provided: props.servers, stored: store.list }) + } + const isReady = Object.assign( createMemo(() => ready() && !!state.active), { promise: ready.promise }, @@ -350,6 +365,7 @@ export const { use: useServer, provider: ServerProvider } = createSimpleContext( setActive, add, remove, + canRemove, scope, projects: { ...projects, diff --git a/packages/app/src/pages/home/home-projects-controller.tsx b/packages/app/src/pages/home/home-projects-controller.tsx index 3e6b6d306b..888f4ede72 100644 --- a/packages/app/src/pages/home/home-projects-controller.tsx +++ b/packages/app/src/pages/home/home-projects-controller.tsx @@ -60,6 +60,7 @@ export function createHomeProjectsController(home: HomeController) { defaultKey: serverManagement.defaultKey, setDefault: (conn: ServerConnection.Any | undefined) => serverManagement.setDefault(conn ? ServerConnection.key(conn) : null), + canRemove: (conn: ServerConnection.Any) => serverManagement.canRemove(ServerConnection.key(conn)), remove: (conn: ServerConnection.Any) => serverManagement.handleRemove(ServerConnection.key(conn)), edit: (conn: ServerConnection.Http) => dialog.show(() => ), focus: home.selection.focusServer, diff --git a/packages/app/src/pages/home/home-projects-view.tsx b/packages/app/src/pages/home/home-projects-view.tsx index 7ec01bd75f..d8cd64aa18 100644 --- a/packages/app/src/pages/home/home-projects-view.tsx +++ b/packages/app/src/pages/home/home-projects-view.tsx @@ -47,6 +47,7 @@ export type HomeProjectsViewProps = { onToggleCollapsed: (server: ServerConnection.Any) => void onEditServer: (server: ServerConnection.Http) => void onSetDefaultServer: (server: ServerConnection.Any | undefined) => void + canRemoveServer: (server: ServerConnection.Any) => boolean onRemoveServer: (server: ServerConnection.Any) => void onMoveProject: (server: ServerConnection.Any, worktree: string, index: number) => void onSelectProject: (server: ServerConnection.Any, directory: string) => void @@ -192,6 +193,7 @@ function HomeServerRow(props: { onToggleCollapsed: HomeProjectsViewProps["onToggleCollapsed"] onEditServer: HomeProjectsViewProps["onEditServer"] onSetDefaultServer: HomeProjectsViewProps["onSetDefaultServer"] + canRemoveServer: HomeProjectsViewProps["canRemoveServer"] onRemoveServer: HomeProjectsViewProps["onRemoveServer"] onSetContextMenuOpen: HomeProjectsContextMenuProps["onSetContextMenuOpen"] onChooseProject: HomeProjectsViewProps["onChooseProject"] @@ -277,6 +279,7 @@ function HomeServerRow(props: { labels={serverMenuLabels(props.language)} canDefault={props.canDefaultServer()} isDefault={props.defaultServerKey() === ServerConnection.key(props.server)} + canRemove={props.canRemoveServer(props.server)} onEdit={props.onEditServer} onSetDefault={() => props.onSetDefaultServer(props.server)} onRemoveDefault={() => props.onSetDefaultServer(undefined)} diff --git a/packages/app/src/pages/home/home-projects.tsx b/packages/app/src/pages/home/home-projects.tsx index ff2abf7c16..32495403bc 100644 --- a/packages/app/src/pages/home/home-projects.tsx +++ b/packages/app/src/pages/home/home-projects.tsx @@ -24,6 +24,7 @@ export function HomeProjects(props: { projects: HomeProjectsController; scroll: onToggleCollapsed={props.projects.server.toggleCollapsed} onEditServer={props.projects.server.edit} onSetDefaultServer={props.projects.server.setDefault} + canRemoveServer={props.projects.server.canRemove} onRemoveServer={props.projects.server.remove} onMoveProject={props.projects.project.move} onSelectProject={props.projects.project.select}