From 2c1654c072a917b7127b429e0a66e9551c563372 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Fri, 10 Apr 2026 08:44:31 +0200 Subject: [PATCH] feat(frontend): clear CDN --- .../components/satellites/cdn/list/Cdn.svelte | 6 +- .../satellites/cdn/list/CdnClear.svelte | 60 +++++++++++++++++++ .../satellites/data/DataActions.svelte | 5 +- src/frontend/src/lib/i18n/en.json | 4 +- src/frontend/src/lib/i18n/zh-cn.json | 4 +- .../satellite/functions/cdn.services.ts | 22 ++++++- src/frontend/src/lib/types/i18n.d.ts | 2 + 7 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 src/frontend/src/lib/components/satellites/cdn/list/CdnClear.svelte diff --git a/src/frontend/src/lib/components/satellites/cdn/list/Cdn.svelte b/src/frontend/src/lib/components/satellites/cdn/list/Cdn.svelte index 53ca5cb06..bc885eedf 100644 --- a/src/frontend/src/lib/components/satellites/cdn/list/Cdn.svelte +++ b/src/frontend/src/lib/components/satellites/cdn/list/Cdn.svelte @@ -2,8 +2,10 @@ import { nonNullish } from '@dfinity/utils'; import { getContext } from 'svelte'; import type { SatelliteDid } from '$declarations'; + import Confirmation from '$lib/components/app/core/Confirmation.svelte'; import IconRefresh from '$lib/components/icons/IconRefresh.svelte'; import CdnAsset from '$lib/components/satellites/cdn/list/CdnAsset.svelte'; + import CdnClear from '$lib/components/satellites/cdn/list/CdnClear.svelte'; import CdnFilter from '$lib/components/satellites/cdn/list/CdnFilter.svelte'; import DataActions from '$lib/components/satellites/data/DataActions.svelte'; import DataCount from '$lib/components/satellites/data/DataCount.svelte'; @@ -43,10 +45,12 @@ - + + + diff --git a/src/frontend/src/lib/components/satellites/cdn/list/CdnClear.svelte b/src/frontend/src/lib/components/satellites/cdn/list/CdnClear.svelte new file mode 100644 index 000000000..cac526762 --- /dev/null +++ b/src/frontend/src/lib/components/satellites/cdn/list/CdnClear.svelte @@ -0,0 +1,60 @@ + + + + + + {#snippet title()} + {$i18n.cdn.clear_cdn} + {/snippet} + +

+
+ + diff --git a/src/frontend/src/lib/components/satellites/data/DataActions.svelte b/src/frontend/src/lib/components/satellites/data/DataActions.svelte index 94804b2ce..67eee774d 100644 --- a/src/frontend/src/lib/components/satellites/data/DataActions.svelte +++ b/src/frontend/src/lib/components/satellites/data/DataActions.svelte @@ -7,9 +7,10 @@ interface Props { visible?: boolean | undefined; children: Snippet; + direction?: 'ltr' | 'rtl'; } - let { visible = $bindable(false), children }: Props = $props(); + let { visible = $bindable(false), children, direction = 'rtl' }: Props = $props(); let button: HTMLButtonElement | undefined = $state(); @@ -24,7 +25,7 @@ type="button"> - +
{@render children()}
diff --git a/src/frontend/src/lib/i18n/en.json b/src/frontend/src/lib/i18n/en.json index 3744b8bbf..491c4e311 100644 --- a/src/frontend/src/lib/i18n/en.json +++ b/src/frontend/src/lib/i18n/en.json @@ -1065,7 +1065,9 @@ "title": "CDN", "empty": "No WASM found for your serverless functions.", "delete_asset": "Delete asset", - "delete_question": "Are you sure you want to delete {0} from your CDN?" + "delete_question": "Are you sure you want to delete {0} from your CDN?", + "clear_cdn": "Clear CDN", + "clear_cdn_question": "Are you sure you want to delete all assets from your CDN?" }, "notifications": { "title": "Notifications", diff --git a/src/frontend/src/lib/i18n/zh-cn.json b/src/frontend/src/lib/i18n/zh-cn.json index 33dde19b4..0cc059db8 100644 --- a/src/frontend/src/lib/i18n/zh-cn.json +++ b/src/frontend/src/lib/i18n/zh-cn.json @@ -1067,7 +1067,9 @@ "title": "CDN", "empty": "未找到无服务器函数的WASM", "delete_asset": "删除资源", - "delete_question": "您确定要从 CDN 中删除 {0} 吗?" + "delete_question": "您确定要从 CDN 中删除 {0} 吗?", + "clear_cdn": "清除 CDN", + "clear_cdn_question": "您确定要从 CDN 中删除所有资源吗?" }, "notifications": { "title": "通知", diff --git a/src/frontend/src/lib/services/satellite/functions/cdn.services.ts b/src/frontend/src/lib/services/satellite/functions/cdn.services.ts index ec8b7d372..3203dbe0c 100644 --- a/src/frontend/src/lib/services/satellite/functions/cdn.services.ts +++ b/src/frontend/src/lib/services/satellite/functions/cdn.services.ts @@ -1,5 +1,5 @@ import type { SatelliteDid } from '$declarations'; -import { deleteAsset, listAssets } from '$lib/api/satellites.api'; +import { deleteAsset, deleteAssets, listAssets } from '$lib/api/satellites.api'; import { COLLECTION_CDN_RELEASES } from '$lib/constants/storage.constants'; import type { ListDocsParams, ListDocsResult } from '$lib/services/satellite/_list-docs.services'; import type { NullishIdentity } from '$lib/types/itentity'; @@ -47,3 +47,23 @@ export const deleteWasmAsset = async ({ return { status: 'error', err }; } }; + +export const deleteWasmAssets = async ({ + satellite, + identity +}: { + satellite: Satellite; + identity: NullishIdentity; +}): Promise> => { + try { + await deleteAssets({ + satelliteId: satellite.satellite_id, + collection: COLLECTION_CDN_RELEASES, + identity + }); + + return { status: 'success', result: undefined }; + } catch (err: unknown) { + return { status: 'error', err }; + } +}; diff --git a/src/frontend/src/lib/types/i18n.d.ts b/src/frontend/src/lib/types/i18n.d.ts index a61146c87..6b90842f4 100644 --- a/src/frontend/src/lib/types/i18n.d.ts +++ b/src/frontend/src/lib/types/i18n.d.ts @@ -1100,6 +1100,8 @@ interface I18nCdn { empty: string; delete_asset: string; delete_question: string; + clear_cdn: string; + clear_cdn_question: string; } interface I18nNotifications {