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 {