diff --git a/frontend/src/lib/components/DBManagerContent.svelte b/frontend/src/lib/components/DBManagerContent.svelte index a353c23ecb..260c4decd9 100644 --- a/frontend/src/lib/components/DBManagerContent.svelte +++ b/frontend/src/lib/components/DBManagerContent.svelte @@ -13,7 +13,7 @@ import { Pane, Splitpanes } from 'svelte-splitpanes' import SqlRepl from './SqlRepl.svelte' import SimpleAgTable from './SimpleAgTable.svelte' - import { untrack, type Snippet } from 'svelte' + import { type Snippet } from 'svelte' import type { DbInput } from './dbTypes' import { getDbSchemas, loadAllTablesMetaData } from './apps/components/display/dbtable/metadata' @@ -25,7 +25,6 @@ input?: DbInput showRepl?: boolean hasReplResult?: boolean - isRefreshing?: boolean selectedSchemaKey?: string | undefined selectedTableKey?: string | undefined dbSelector?: Snippet<[]> @@ -41,7 +40,6 @@ input, showRepl = true, hasReplResult = $bindable(false), - isRefreshing = $bindable(false), selectedSchemaKey = $bindable(undefined), selectedTableKey = $bindable(undefined), dbSelector, @@ -61,50 +59,40 @@ } } - // `refreshCount` is a derived state. `refreshing` is the source of truth - let refreshCount = $state(0) - $effect(() => { - if (refreshing) untrack(() => (refreshCount += 1)) - }) - - let refreshing = $state(false) - $effect(() => { - if (refreshing) getSchema() - }) - // Sync refreshing state with bindable prop - $effect(() => { - isRefreshing = refreshing - }) - export const refresh = () => !refreshing && (refreshing = true) - - // Initial schema load - $effect(() => { - if (input) { - untrack(() => getSchema()) + let colDefs = resource( + () => [input], + async () => { + if (!input) return + return await loadAllTablesMetaData($workspaceStore, input) } - }) - - async function getSchema() { - if (!input) return - const dbSchemasPath = getDbSchemasPath(input) - if ($dbSchemas[dbSchemasPath] && !refreshing) return - - $dbSchemas[dbSchemasPath] - if (input.type == 'database') { - $dbSchemas[dbSchemasPath] = await getDbSchemas( - input.resourceType, - input.resourcePath, - $workspaceStore, - (message: string) => sendUserToast(message, true) - ) - } else if (input.type == 'ducklake') { - $dbSchemas[dbSchemasPath] = await getDucklakeSchema({ - workspace: $workspaceStore!, - ducklake: input.ducklake - }) + ) + let dbSchemasPromise = resource( + () => [input], + async () => { + if (!input) return + const dbSchemasPath = getDbSchemasPath(input) + if (input.type == 'database') { + $dbSchemas[dbSchemasPath] = await getDbSchemas( + input.resourceType, + input.resourcePath, + $workspaceStore, + (message: string) => sendUserToast(message, true) + ) + } else if (input.type == 'ducklake') { + $dbSchemas[dbSchemasPath] = await getDucklakeSchema({ + workspace: $workspaceStore!, + ducklake: input.ducklake + }) + } } - - refreshing = false + ) + export const refresh = () => { + if (isLoading()) return + colDefs.refetch() + dbSchemasPromise.refetch() + } + export function isLoading() { + return colDefs.loading || dbSchemasPromise.loading } let replPanelSize = $state(36) @@ -117,14 +105,6 @@ hasReplResult = !!replResultData }) - let colDefs = resource( - () => [input, refreshCount], - async () => { - if (!input) return - return await loadAllTablesMetaData($workspaceStore, input) - } - ) - // Export for parent components export function clearReplResult() { replResultData = undefined diff --git a/frontend/src/lib/components/DBManagerDrawer.svelte b/frontend/src/lib/components/DBManagerDrawer.svelte index 587f51efc6..afdf8f501b 100644 --- a/frontend/src/lib/components/DBManagerDrawer.svelte +++ b/frontend/src/lib/components/DBManagerDrawer.svelte @@ -85,7 +85,6 @@ let dbManagerContent: DBManagerContent | undefined = $state() let hasReplResult = $state(false) - let isRefreshing = $state(false) @@ -112,12 +111,7 @@ > {#if effectiveInput && $workspaceStore} {#key selectedDatatable} - + {#snippet dbSelector()} {#if isDatatableInput} {#if datatables.loading} @@ -141,7 +135,7 @@ {/if} {#snippet actions()}