diff --git a/src/renderer/contexts/SchemaProvider.tsx b/src/renderer/contexts/SchemaProvider.tsx index dc04846..fa852a4 100644 --- a/src/renderer/contexts/SchemaProvider.tsx +++ b/src/renderer/contexts/SchemaProvider.tsx @@ -1,16 +1,17 @@ -import React, { useState, PropsWithChildren, useContext } from 'react'; +import React, { useState, PropsWithChildren, useContext, useMemo } from 'react'; import { useDatabaseSetting } from './DatabaseSettingProvider'; import { DatabaseSchemas } from 'types/SqlSchema'; +import NotImplementCallback from 'libs/NotImplementCallback'; const SchemaContext = React.createContext<{ schema?: DatabaseSchemas; currentDatabase?: string; setCurrentDatabase: (v: string) => void; + reloadSchema: () => void; }>({ schema: {}, - setCurrentDatabase: () => { - throw 'Not implemented'; - }, + setCurrentDatabase: NotImplementCallback, + reloadSchema: NotImplementCallback, }); export function useSchema() { @@ -20,16 +21,25 @@ export function useSchema() { export function SchemaProvider({ children, schema, -}: PropsWithChildren<{ schema?: DatabaseSchemas }>) { + reloadSchema, +}: PropsWithChildren<{ schema?: DatabaseSchemas; reloadSchema: () => void }>) { const { setting } = useDatabaseSetting(); const [currentDatabase, setCurrentDatabase] = useState( setting?.config?.database ); + const providerValuesMemo = useMemo( + () => ({ + schema, + currentDatabase, + setCurrentDatabase, + reloadSchema, + }), + [schema, currentDatabase, setCurrentDatabase, reloadSchema] + ); + return ( - + {children} ); diff --git a/src/renderer/contexts/SwitchDatabaseProvider.tsx b/src/renderer/contexts/SwitchDatabaseProvider.tsx index 155894c..df0a31d 100644 --- a/src/renderer/contexts/SwitchDatabaseProvider.tsx +++ b/src/renderer/contexts/SwitchDatabaseProvider.tsx @@ -6,7 +6,7 @@ import { useSqlExecute } from './SqlExecuteProvider'; export default function SwitchDatabaseProvider({ children, }: PropsWithChildren) { - const { setCurrentDatabase } = useSchema(); + const { setCurrentDatabase, reloadSchema } = useSchema(); const { runner } = useSqlExecute(); useEffect(() => { @@ -15,6 +15,15 @@ export default function SwitchDatabaseProvider({ if (statement.analyze.type === 'use') { setCurrentDatabase(statement.analyze.db); } + if ( + statement.analyze.type === 'create' || + // only has delete, while drop is fired instead + // @ts-expect-error TODO: fix this + statement.analyze.type === 'drop' || + statement.analyze.type === 'alter' + ) { + reloadSchema(); + } } return true; }; diff --git a/src/renderer/screens/DatabaseScreen/index.tsx b/src/renderer/screens/DatabaseScreen/index.tsx index 419021c..cce3bb4 100644 --- a/src/renderer/screens/DatabaseScreen/index.tsx +++ b/src/renderer/screens/DatabaseScreen/index.tsx @@ -46,6 +46,16 @@ function DatabaseScreenBody() { }); }, [setSchema, setError, setErrorMessage, common, setLoading]); + const reloadSchema = useCallback(() => { + common + .getSchema() + .then(setSchema) + .catch((e) => { + setError(true); + setErrorMessage(e.message); + }); + }, [setSchema, setError, setErrorMessage, common]); + useEffect(() => { fetchSchema(); }, [fetchSchema]); @@ -92,7 +102,7 @@ function DatabaseScreenBody() { } return ( - +