diff --git a/src/lib/utils/environment-delete.ts b/src/lib/utils/environment-delete.ts new file mode 100644 index 0000000..5448534 --- /dev/null +++ b/src/lib/utils/environment-delete.ts @@ -0,0 +1,42 @@ +export interface EnvironmentDeleteCounts { + stackCount: number; + gitStackCount: number; + unknown: boolean; +} + +type FetchEnvironmentDeleteCounts = (input: string) => Promise; + +async function readArray(response: Response | null): Promise<{ count: number; unknown: boolean }> { + if (!response?.ok) { + return { count: 0, unknown: true }; + } + + try { + const value: unknown = await response.json(); + return Array.isArray(value) + ? { count: value.length, unknown: false } + : { count: 0, unknown: true }; + } catch { + return { count: 0, unknown: true }; + } +} + +export async function fetchEnvironmentDeleteCounts( + environmentId: number, + fetcher: FetchEnvironmentDeleteCounts = fetch +): Promise { + const [stacksResponse, gitStacksResponse] = await Promise.all([ + fetcher(`/api/stacks?env=${environmentId}`).catch(() => null), + fetcher(`/api/git/stacks?env=${environmentId}`).catch(() => null) + ]); + const [stacks, gitStacks] = await Promise.all([ + readArray(stacksResponse), + readArray(gitStacksResponse) + ]); + + return { + stackCount: stacks.count, + gitStackCount: gitStacks.count, + unknown: stacks.unknown || gitStacks.unknown + }; +} diff --git a/src/routes/settings/environments/EnvironmentsTab.svelte b/src/routes/settings/environments/EnvironmentsTab.svelte index c5721cf..20d72a0 100644 --- a/src/routes/settings/environments/EnvironmentsTab.svelte +++ b/src/routes/settings/environments/EnvironmentsTab.svelte @@ -37,6 +37,7 @@ import EnvironmentModal from './EnvironmentModal.svelte'; import { environments as environmentsStore } from '$lib/stores/environment'; import { dashboardData } from '$lib/stores/dashboard'; + import { fetchEnvironmentDeleteCounts } from '$lib/utils/environment-delete'; interface Props { editEnvId?: string | null; @@ -110,6 +111,7 @@ let deleteStackCount = $state(0); let deleteGitStackCount = $state(0); let deleteCountsUnknown = $state(false); + let deleteCountsLoading = $state(false); // Track which environments have scanner enabled (for shield indicator) let envScannerStatus = $state<{ [id: number]: boolean }>({}); @@ -208,40 +210,38 @@ const env = environments.find(e => e.id === id); if (!env) return; - const [stacksRes, gitRes] = await Promise.all([ - fetch(`/api/stacks?env=${id}`).catch(() => null), - fetch(`/api/git/stacks?env=${id}`).catch(() => null) - ]); - - let unknown = false; - let stacks: unknown[] = []; - let gitStacks: unknown[] = []; - if (stacksRes?.ok) { - try { stacks = await stacksRes.json(); } catch { unknown = true; } - } else { - unknown = true; - } - if (gitRes?.ok) { - try { gitStacks = await gitRes.json(); } catch { unknown = true; } - } else { - unknown = true; - } - deleteStackCount = Array.isArray(stacks) ? stacks.length : 0; - deleteGitStackCount = Array.isArray(gitStacks) ? gitStacks.length : 0; - deleteCountsUnknown = unknown; deleteEnvTarget = env; + deleteStackCount = 0; + deleteGitStackCount = 0; + deleteCountsUnknown = true; + deleteCountsLoading = true; showDeleteConfirm = true; + + const counts = await fetchEnvironmentDeleteCounts(id); + if (deleteEnvTarget?.id !== id || !showDeleteConfirm) return; + + deleteStackCount = counts.stackCount; + deleteGitStackCount = counts.gitStackCount; + deleteCountsUnknown = counts.unknown; + deleteCountsLoading = false; } async function confirmAndDelete() { const target = deleteEnvTarget; showDeleteConfirm = false; deleteEnvTarget = null; + deleteCountsLoading = false; if (target) { await deleteEnvironment(target.id); } } + function cancelDelete() { + showDeleteConfirm = false; + deleteEnvTarget = null; + deleteCountsLoading = false; + } + async function testConnection(id: number) { testingEnvs.add(id); testingEnvs = new Set(testingEnvs); @@ -718,7 +718,12 @@ $DATA_DIR/git-repos/{deleteEnvTarget.name}/ - {#if deleteCountsUnknown} + {#if deleteCountsLoading} +

+ + Checking tracked stacks… +

+ {:else if deleteCountsUnknown}

Couldn't list the stacks on this environment — proceed only if you're sure what's deployed here. @@ -748,7 +753,7 @@

-