diff --git a/backend/server/src/SSHSocketClient.ts b/backend/server/src/SSHSocketClient.ts index 0fe4152..db8316d 100644 --- a/backend/server/src/SSHSocketClient.ts +++ b/backend/server/src/SSHSocketClient.ts @@ -13,7 +13,10 @@ export class SSHSocketClient { private conn: Client private config: SSHConfig private socketPath: string - private isConnected: boolean = false + private _isConnected: boolean = false + public get isConnected(): boolean { + return this._isConnected + } // Constructor initializes the SSH client and sets up configuration constructor(config: SSHConfig, socketPath: string) { @@ -34,7 +37,7 @@ export class SSHSocketClient { private closeConnection() { console.log("Closing SSH connection...") this.conn.end() - this.isConnected = false + this._isConnected = false process.exit(0) } @@ -44,17 +47,17 @@ export class SSHSocketClient { this.conn .on("ready", () => { console.log("SSH connection established") - this.isConnected = true + this._isConnected = true resolve() }) .on("error", (err) => { console.error("SSH connection error:", err) - this.isConnected = false + this._isConnected = false reject(err) }) .on("close", () => { console.log("SSH connection closed") - this.isConnected = false + this._isConnected = false }) .connect(this.config) }) diff --git a/backend/server/src/Sandbox.ts b/backend/server/src/Sandbox.ts index 88e5870..52acc9b 100644 --- a/backend/server/src/Sandbox.ts +++ b/backend/server/src/Sandbox.ts @@ -170,8 +170,20 @@ export class Sandbox { // Handle checking if an app exists const handleAppExists: SocketHandler = async ({ appName }) => { - if (!this.dokkuClient) - throw new Error("Failed to check app existence: No Dokku client") + if (!this.dokkuClient) { + console.log("Failed to check app existence: No Dokku client") + return { + success: false, + } + } + if (!this.dokkuClient.isConnected) { + console.log( + "Failed to check app existence: The Dokku client is not connected" + ) + return { + success: false, + } + } return { success: true, exists: await this.dokkuClient.appExists(appName), diff --git a/frontend/components/editor/navbar/deploy.tsx b/frontend/components/editor/navbar/deploy.tsx index f8db036..c1a1f4f 100644 --- a/frontend/components/editor/navbar/deploy.tsx +++ b/frontend/components/editor/navbar/deploy.tsx @@ -21,12 +21,14 @@ export default function DeployButtonModal({ const { deploy, getAppExists } = useTerminal() const [isDeploying, setIsDeploying] = useState(false) const [isDeployed, setIsDeployed] = useState(false) + const [deployButtonVisible, setDeployButtonEnabled] = useState(false) useEffect(() => { const checkDeployment = async () => { if (getAppExists) { const exists = await getAppExists(data.id) - setIsDeployed(exists) + setDeployButtonEnabled(exists.success) + setIsDeployed((exists.success && exists.exists) ?? false) } } checkDeployment() @@ -50,10 +52,12 @@ export default function DeployButtonModal({ <> - + {deployButtonVisible && ( + + )} Promise closeTerminal: (id: string) => void deploy: (callback: () => void) => void - getAppExists: ((appName: string) => Promise) | null + getAppExists: + | ((appName: string) => Promise<{ success: boolean; exists?: boolean }>) + | null } const TerminalContext = createContext( @@ -92,16 +94,18 @@ export const TerminalProvider: React.FC<{ children: React.ReactNode }> = ({ }) } - const getAppExists = async (appName: string): Promise => { + const getAppExists = async ( + appName: string + ): Promise<{ success: boolean; exists?: boolean }> => { console.log("Is there a socket: " + !!socket) if (!socket) { console.error("Couldn't check if app exists: No socket") - return false + return { success: false } } - const response: { exists: boolean } = await new Promise((resolve) => - socket.emit("getAppExists", { appName }, resolve) + const response: { success: boolean; exists?: boolean } = await new Promise( + (resolve) => socket.emit("getAppExists", { appName }, resolve) ) - return response.exists + return response } const value = {