import { Drawer } from "@mui/material"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import TextareaAutosize from "react-textarea-autosize"; import { useQueryStore } from "@/store"; import { ExecutionResult, ResponseObject } from "@/types"; import { checkStatementIsSelect, getMessageFromExecutionResult } from "@/utils"; import Tooltip from "./kit/Tooltip"; import Icon from "./Icon"; import EngineIcon from "./EngineIcon"; import DataTableView from "./ExecutionView/DataTableView"; import NotificationView from "./ExecutionView/NotificationView"; import ExecutionWarningBanner from "./ExecutionView/ExecutionWarningBanner"; const QueryDrawer = () => { const { t } = useTranslation(); const queryStore = useQueryStore(); const [executionResult, setExecutionResult] = useState(undefined); const [statement, setStatement] = useState(""); const [isLoading, setIsLoading] = useState(false); const context = queryStore.context; const executionMessage = executionResult ? getMessageFromExecutionResult(executionResult) : ""; const showExecutionWarningBanner = !checkStatementIsSelect(statement); useEffect(() => { if (!queryStore.showDrawer) { return; } const statement = context?.statement || ""; setStatement(statement); if (statement !== "" && checkStatementIsSelect(statement)) { executeStatement(statement); } setExecutionResult(undefined); }, [context, queryStore.showDrawer]); const executeStatement = async (statement: string) => { if (!statement) { toast.error("Please enter a statement."); return; } if (!context) { toast.error("No execution context found."); setIsLoading(false); setExecutionResult(undefined); return; } setIsLoading(true); setExecutionResult(undefined); const { connection, database } = context; try { const response = await fetch("/api/connection/execute", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ connection, db: database?.name, statement, }), }); const result = (await response.json()) as ResponseObject; if (result.message) { setExecutionResult({ rawResult: [], error: result.message, }); } else { setExecutionResult(result.data); } } catch (error) { console.error(error); toast.error("Failed to execute statement"); } finally { setIsLoading(false); } }; const close = () => queryStore.toggleDrawer(false); return (

{t("execution.title")}

{!context ? (
{t("execution.message.no-connection")}
) : ( <>
{t("connection.self")}: {context.database?.name}
{showExecutionWarningBanner && }
setStatement(e.target.value)} />
{isLoading ? (
{t("execution.message.executing")}
) : ( <> {executionResult ? ( executionMessage ? ( ) : ( ) ) : ( <> )} )}
)}
); }; export default QueryDrawer;