Skip to content

Commit 91d2927

Browse files
committed
fix:correct project limit warnings for multi-organization users
1 parent a016214 commit 91d2927

File tree

5 files changed

+41
-10
lines changed

5 files changed

+41
-10
lines changed

src/lib/components/billing/alerts/selectProjectCloud.svelte

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import { page } from '$app/state';
1212
import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date';
1313
import { currentPlan } from '$lib/stores/organization';
14+
import { Query } from '@appwrite.io/console';
1415
1516
let {
1617
showSelectProject = $bindable(false),
@@ -23,8 +24,21 @@
2324
let projects = $state<Array<Models.Project>>([]);
2425
let error = $state<string | null>(null);
2526
26-
onMount(() => {
27-
projects = page.data.allProjects?.projects || [];
27+
onMount(async () => {
28+
if (page.data.organization?.$id) {
29+
try {
30+
const orgProjects = await sdk.forConsole.projects.list([
31+
Query.equal('teamId', page.data.organization.$id),
32+
Query.limit(1000)
33+
]);
34+
projects = orgProjects.projects;
35+
} catch (e) {
36+
error = 'Failed to load projects';
37+
projects = [];
38+
}
39+
} else {
40+
projects = [];
41+
}
2842
});
2943
3044
let projectsToArchive = $derived(
@@ -34,7 +48,7 @@
3448
async function updateSelected() {
3549
try {
3650
await sdk.forConsole.billing.updateSelectedProjects(
37-
projects[0].teamId,
51+
page.data.organization.$id,
3852
selectedProjects
3953
);
4054
showSelectProject = false;
@@ -71,7 +85,8 @@
7185

7286
<Modal bind:show={showSelectProject} title={'Manage projects'} onSubmit={updateSelected}>
7387
<svelte:fragment slot="description">
74-
Choose which two projects to keep. Projects over the limit will be blocked after this date.
88+
Choose which {$currentPlan?.projects || 2} projects to keep. Projects over the limit will be
89+
blocked after this date.
7590
</svelte:fragment>
7691
{#if error}
7792
<Alert.Inline status="error" title="Error">{error}</Alert.Inline>

src/lib/layout/createProject.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@
4747
<Typography.Title size="l">Create your project</Typography.Title>
4848
{/if}
4949
{#if projectsLimited}
50-
<Alert.Inline status="warning" title="You've reached your limit of 2 projects">
50+
<Alert.Inline
51+
status="warning"
52+
title={`You've reached your limit of ${$currentPlan?.projects || 2} projects`}>
5153
Extra projects are available on paid plans for an additional fee
5254
<svelte:fragment slot="actions">
5355
<Button

src/lib/stores/billing.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,15 +317,24 @@ export function calculateTrialDay(org: Organization) {
317317
return days;
318318
}
319319

320-
export async function checkForProjectsLimit(org: Organization, projects: number) {
320+
export async function checkForProjectsLimit(org: Organization, orgProjectCount?: number) {
321321
if (!isCloud) return;
322-
if (!org || !projects) return;
322+
if (!org) return;
323323
const plan = await sdk.forConsole.billing.getOrganizationPlan(org.$id);
324324
if (!plan) return;
325325
if (plan.$id !== BillingPlan.FREE) return;
326326
if (org.projects?.length > 0) return;
327327

328-
if (plan.projects > 0 && projects > plan.projects) {
328+
let projectCount = orgProjectCount;
329+
if (projectCount === undefined) {
330+
const orgProjects = await sdk.forConsole.projects.list([
331+
Query.equal('teamId', org.$id),
332+
Query.limit(1000)
333+
]);
334+
projectCount = orgProjects.projects.length;
335+
}
336+
337+
if (plan.projects > 0 && projectCount > plan.projects) {
329338
headerAlert.add({
330339
id: 'projectsLimitReached',
331340
component: ProjectsLimit,

src/routes/(console)/+layout.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,11 @@
297297
if (currentOrganizationId === org.$id) return;
298298
if (isCloud) {
299299
currentOrganizationId = org.$id;
300-
checkForProjectsLimit(org, data.allProjects?.projects?.length || 0);
300+
const orgProjectCount =
301+
data.allProjects && data.currentOrgId === org.$id
302+
? data.allProjects.projects.length
303+
: undefined;
304+
checkForProjectsLimit(org, orgProjectCount);
301305
checkForEnterpriseTrial(org);
302306
await checkForUsageLimit(org);
303307
checkForMarkedForDeletion(org);

src/routes/(console)/organization-[organization]/+page.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import { currentPlan, regions as regionsStore } from '$lib/stores/organization';
4242
import SelectProjectCloud from '$lib/components/billing/alerts/selectProjectCloud.svelte';
4343
import { toLocaleDate } from '$lib/helpers/date';
44+
import { BillingPlan } from '$lib/constants';
4445
4546
export let data;
4647
@@ -167,7 +168,7 @@
167168
</DropList>
168169
</div>
169170

170-
{#if isCloud && $currentPlan?.projects && $currentPlan?.projects > 0 && data.organization.projects.length > 0 && data.projects.total > 2 && $canWriteProjects}
171+
{#if isCloud && $currentPlan?.projects && $currentPlan?.projects > 0 && data.organization.projects.length > 0 && data.projects.total > $currentPlan.projects && $canWriteProjects && data.organization.billingPlan === BillingPlan.FREE}
171172
<Alert.Inline
172173
title={`${data.projects.total - data.organization.projects.length} projects will be archived on ${toLocaleDate(billingProjectsLimitDate)}`}>
173174
<Typography.Text>

0 commit comments

Comments
 (0)