From 1ea8e5a81e38929175d94a82cafebce85ee4b2aa Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Fri, 18 Apr 2025 15:25:13 -0700 Subject: [PATCH] Add frontend uniqueness check for ssh hostnames --- .../ssh/SshHostsPage/components/SshHostModal.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frontend/src/pages/ssh/SshHostsPage/components/SshHostModal.tsx b/frontend/src/pages/ssh/SshHostsPage/components/SshHostModal.tsx index a779716d4..249fc1b35 100644 --- a/frontend/src/pages/ssh/SshHostsPage/components/SshHostModal.tsx +++ b/frontend/src/pages/ssh/SshHostsPage/components/SshHostModal.tsx @@ -23,6 +23,7 @@ import { useCreateSshHost, useGetSshHostById, useGetWorkspaceUsers, + useListWorkspaceSshHosts, useUpdateSshHost } from "@app/hooks/api"; import { UsePopUpState } from "@app/hooks/usePopUp"; @@ -58,6 +59,7 @@ export type FormData = z.infer; export const SshHostModal = ({ popUp, handlePopUpToggle }: Props) => { const { currentWorkspace } = useWorkspace(); const projectId = currentWorkspace?.id || ""; + const { data: sshHosts } = useListWorkspaceSshHosts(currentWorkspace.id); const { data: members = [] } = useGetWorkspaceUsers(projectId); const [expandedMappings, setExpandedMappings] = useState>({}); @@ -116,6 +118,18 @@ export const SshHostModal = ({ popUp, handlePopUpToggle }: Props) => { try { if (!projectId) return; + // check if there is already a different host with the same hostname + const existingHostnames = + sshHosts?.filter((h) => h.id !== sshHost?.id).map((h) => h.hostname) || []; + + if (existingHostnames.includes(hostname)) { + createNotification({ + text: "A host with this hostname already exists.", + type: "error" + }); + return; + } + if (sshHost) { await updateMutateAsync({ sshHostId: sshHost.id,