From 536901b49626d67b5a2dc21a3776a70375d83872 Mon Sep 17 00:00:00 2001 From: Taylor Bantle Date: Mon, 27 Nov 2023 16:21:37 -0800 Subject: [PATCH] web: Improve create/drop database behavior --- web/components/SqlDataTable/index.tsx | 25 ++-------- web/components/SqlDataTable/useSqlQuery.ts | 55 ++++++++++++++++++++++ web/lib/refetchQueries.ts | 1 + 3 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 web/components/SqlDataTable/useSqlQuery.ts diff --git a/web/components/SqlDataTable/index.tsx b/web/components/SqlDataTable/index.tsx index d8e81476..0f731182 100644 --- a/web/components/SqlDataTable/index.tsx +++ b/web/components/SqlDataTable/index.tsx @@ -15,13 +15,12 @@ import { } from "@gen/graphql-types"; import useSessionQueryHistory from "@hooks/useSessionQueryHistory"; import { SqlQueryParams } from "@lib/params"; -import { isMutation } from "@lib/parseSqlQuery"; -import { refetchSqlUpdateQueriesCacheEvict } from "@lib/refetchQueries"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import SqlMessage from "./SqlMessage"; import { isReadOnlyDatabaseRevisionError } from "./SqlMessage/utils"; import WorkingDiff from "./WorkingDiff"; import css from "./index.module.css"; +import useSqlQuery from "./useSqlQuery"; type Props = { params: SqlQueryParams; @@ -37,25 +36,7 @@ type InnerProps = Props & { }; function Inner(props: InnerProps) { - const { addMutation } = useSessionQueryHistory(); - const isMut = isMutation(props.params.q); - - useEffect(() => { - if (!isMut) return; - addMutation(props.params.q); - }, [props.params.q]); - - useEffect(() => { - if (!isMut) return; - if (props.gqlError) return; - // Need timeout here so that queries are not refetched before sql query has - // time to finish - setTimeout(() => { - props.client - .refetchQueries(refetchSqlUpdateQueriesCacheEvict) - .catch(console.error); - }, 300); - }, [props.gqlError, isMut, props.client]); + const isMut = useSqlQuery(props.params, props.client, props.gqlError); const msg = ; return ( diff --git a/web/components/SqlDataTable/useSqlQuery.ts b/web/components/SqlDataTable/useSqlQuery.ts new file mode 100644 index 00000000..f6f9f67d --- /dev/null +++ b/web/components/SqlDataTable/useSqlQuery.ts @@ -0,0 +1,55 @@ +import { + ApolloClient, + ApolloError, + NormalizedCacheObject, +} from "@apollo/client"; +import useSessionQueryHistory from "@hooks/useSessionQueryHistory"; +import { SqlQueryParams } from "@lib/params"; +import { isMutation } from "@lib/parseSqlQuery"; +import { refetchSqlUpdateQueriesCacheEvict } from "@lib/refetchQueries"; +import { databases } from "@lib/urls"; +import { useRouter } from "next/router"; +import { useEffect } from "react"; + +export default function useSqlQuery( + params: SqlQueryParams, + client: ApolloClient, + gqlError?: ApolloError, +): boolean { + const router = useRouter(); + const { addMutation } = useSessionQueryHistory(); + const isMut = isMutation(params.q); + + useEffect(() => { + if (!isMut) return; + addMutation(params.q); + }, [params.q]); + + useEffect(() => { + if (!isMut) return; + if (gqlError) return; + // Need timeout here so that queries are not refetched before sql query has + // time to finish + setTimeout(() => { + client + .refetchQueries(refetchSqlUpdateQueriesCacheEvict) + .catch(console.error); + }, 300); + }, [gqlError, isMut, client]); + + useEffect(() => { + if (gqlError) { + return; + } + const lower = params.q.toLowerCase(); + if ( + lower.includes("drop database") && + lower.includes(params.databaseName) + ) { + router.push(databases.hrefPathname()).catch(console.error); + return; + } + }, [params.q, params.databaseName, gqlError]); + + return isMut; +} diff --git a/web/lib/refetchQueries.ts b/web/lib/refetchQueries.ts index bf870558..3d9aabde 100644 --- a/web/lib/refetchQueries.ts +++ b/web/lib/refetchQueries.ts @@ -122,6 +122,7 @@ export const refetchSqlUpdateQueriesCacheEvict: RefetchOptions = { "schemaDiff", "doltProcedures", "doltSchemas", + "databases", ].forEach(fieldName => { cache.evict({ fieldName }); });