Skip to content

Commit 7f0ce09

Browse files
committed
update: in-place update.
1 parent cf89a56 commit 7f0ce09

1 file changed

Lines changed: 45 additions & 10 deletions

File tree

src/lib/components/organizationUsageLimits.svelte

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import { BillingPlanGroup, type Models } from '@appwrite.io/console';
1313
import { sdk } from '$lib/stores/sdk';
1414
import { addNotification } from '$lib/stores/notifications';
15+
import { invalidate } from '$app/navigation';
16+
import { Dependencies } from '$lib/constants';
1517
1618
const {
1719
projects = [],
@@ -30,6 +32,7 @@
3032
let hasConfirmedSelection = $state(false);
3133
3234
let isDeletingProjects = $state(false);
35+
let deletedProjectIds = $state<Set<string>>(new Set());
3336
let selectedProjectsToDelete = $state<Array<string>>([]);
3437
const baseFreePlan = getBasePlanFromGroup(BillingPlanGroup.Starter);
3538
@@ -43,8 +46,12 @@
4346
// When preparing to downgrade to Free, enforce Free plan limit locally (2)
4447
const allowedProjectsToKeep = $derived(freePlanLimits.projects);
4548
49+
const filteredProjects = $derived(
50+
projects.filter((project) => !deletedProjectIds.has(project.$id))
51+
);
52+
4653
const currentUsage = $derived({
47-
projects: projects?.length || 0,
54+
projects: filteredProjects?.length || 0,
4855
members: members?.length || 0,
4956
storage: storageUsage || 0
5057
});
@@ -86,18 +93,46 @@
8693
}
8794
8895
if (selectedProjectsToDelete?.length) {
89-
const projectsDeletionPromise = selectedProjectsToDelete.map((projectId) => {
90-
return sdk.forConsole.projects.delete({ projectId });
91-
});
96+
const projectsDeletionPromises = selectedProjectsToDelete.map((projectId) => ({
97+
projectId,
98+
promise: sdk.forConsole.projects.delete({ projectId })
99+
}));
92100
93101
try {
94-
await Promise.all(projectsDeletionPromise);
95-
addNotification({
96-
type: 'success',
97-
message: 'Selected projects were deleted'
102+
const results = await Promise.allSettled(
103+
projectsDeletionPromises.map((p) => p.promise)
104+
);
105+
106+
const failed: string[] = [];
107+
const successfullyDeleted: string[] = [];
108+
109+
results.forEach((result, index) => {
110+
const projectId = projectsDeletionPromises[index].projectId;
111+
if (result.status === 'fulfilled') {
112+
successfullyDeleted.push(projectId);
113+
} else {
114+
failed.push(projectId);
115+
}
98116
});
99-
showSelectProject = false;
100-
showSelectionReminder = false;
117+
118+
if (successfullyDeleted.length > 0) {
119+
deletedProjectIds = new Set([...deletedProjectIds, ...successfullyDeleted]);
120+
await invalidate(Dependencies.ORGANIZATION);
121+
122+
addNotification({
123+
type: 'success',
124+
message: `${successfullyDeleted.length} project${successfullyDeleted.length !== 1 ? 's' : ''} deleted successfully`
125+
});
126+
}
127+
128+
if (failed.length > 0) {
129+
error = `Failed to delete ${failed.length} project${failed.length !== 1 ? 's' : ''}`;
130+
} else {
131+
showSelectProject = false;
132+
selectedProjectsToDelete = [];
133+
hasConfirmedSelection = false;
134+
showSelectionReminder = false;
135+
}
101136
} catch (exception) {
102137
error = exception.message;
103138
} finally {

0 commit comments

Comments
 (0)