import { Drawer } from "@mui/material"; import { head } from "lodash-es"; import { useEffect, useState } from "react"; import DataTable from "react-data-table-component"; import { toast } from "react-hot-toast"; import TextareaAutosize from "react-textarea-autosize"; import { useQueryStore } from "@/store"; import Icon from "./Icon"; import EngineIcon from "./EngineIcon"; type RawQueryResult = { [key: string]: any; }; const QueryDrawer = () => { const queryStore = useQueryStore(); const [rawResults, setRawResults] = useState([]); const context = queryStore.context; const [statement, setStatement] = useState(context?.statement || ""); const [isLoading, setIsLoading] = useState(true); const columns = Object.keys(head(rawResults) || {}).map((key) => { return { name: key, sortable: true, selector: (row: RawQueryResult) => row[key], }; }); useEffect(() => { if (!queryStore.showDrawer) { return; } setStatement(context?.statement || ""); executeStatement(context?.statement || ""); }, [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); setRawResults([]); return; } setIsLoading(true); setRawResults([]); 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(); setIsLoading(false); setRawResults(result); } catch (error) { console.error(error); toast.error("Failed to execute statement"); } }; const close = () => queryStore.toggleDrawer(false); return (

Execute query

{!context ? (
No connection selected.
) : ( <>
Connection: {context.database?.name}
setStatement(e.target.value)} />
{isLoading ? (
Executing
) : rawResults.length === 0 ? (
No data return.
) : (
)}
)}
); }; export default QueryDrawer;