diff --git a/src/lib/sdk/billing.ts b/src/lib/sdk/billing.ts
index 2ee9242aa..93d4023e9 100644
--- a/src/lib/sdk/billing.ts
+++ b/src/lib/sdk/billing.ts
@@ -1,4 +1,4 @@
-import type { Client } from '@appwrite.io/console';
+import type { Client, Query } from '@appwrite.io/console';
import type { Organization } from '../stores/organization';
import type { PaymentMethod } from '@stripe/stripe-js';
@@ -297,7 +297,7 @@ export class Billing {
async listInvoices(
organizationId: string,
- queries: string[] = [],
+ queries: Query[] = [],
search = ''
): Promise {
const path = `/organizations/${organizationId}/invoices`;
diff --git a/src/lib/stores/billing.ts b/src/lib/stores/billing.ts
index e7b11d702..07d2eee5b 100644
--- a/src/lib/stores/billing.ts
+++ b/src/lib/stores/billing.ts
@@ -3,10 +3,11 @@ import { derived, get } from 'svelte/store';
import { sdk } from './sdk';
import { limitRates } from '$lib/constants';
import { organization } from './organization';
+import type { PaymentList } from '$lib/sdk/billing';
export type Tier = 'tier-0' | 'tier-1' | 'tier-2';
-export const paymentMethods = derived(page, ($page) => $page.data.paymentMethods);
+export const paymentMethods = derived(page, ($page) => $page.data.paymentMethods as PaymentList);
export function tierToPlan(tier: Tier) {
switch (tier) {
diff --git a/src/routes/console/account/payments/paymentMethods.svelte b/src/routes/console/account/payments/paymentMethods.svelte
index 23f884d88..2bdd1a7a5 100644
--- a/src/routes/console/account/payments/paymentMethods.svelte
+++ b/src/routes/console/account/payments/paymentMethods.svelte
@@ -17,7 +17,7 @@
TableHeader,
TableRow
} from '$lib/elements/table';
- import { paymentMethods } from './store';
+ import { paymentMethods } from '$lib/stores/billing';
import type { PaymentMethodData } from '$lib/sdk/billing';
import { organizationList, type Organization } from '$lib/stores/organization';
import { tooltip } from '$lib/actions/tooltip';
diff --git a/src/routes/console/account/payments/store.ts b/src/routes/console/account/payments/store.ts
deleted file mode 100644
index c9f2b970f..000000000
--- a/src/routes/console/account/payments/store.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { page } from '$app/stores';
-import { derived } from 'svelte/store';
-
-export const paymentMethods = derived(page, ($page) => $page.data.paymentMethods);
diff --git a/src/routes/console/organization-[organization]/+layout.svelte b/src/routes/console/organization-[organization]/+layout.svelte
index 44af73bde..d3e4e8e2c 100644
--- a/src/routes/console/organization-[organization]/+layout.svelte
+++ b/src/routes/console/organization-[organization]/+layout.svelte
@@ -6,10 +6,14 @@
import { onMount } from 'svelte';
import { addNotification } from '$lib/stores/notifications';
import { toLocaleDate } from '$lib/helpers/date';
+ import { sdk } from '$lib/stores/sdk';
+ import { goto } from '$app/navigation';
+ import { base } from '$app/paths';
onMount(() => {
if (isCloud) {
checkForTrialEnding();
+ paymentExpired();
}
});
@@ -30,6 +34,32 @@
localStorage.setItem('trialEndingNotification', 'true');
}
}
+
+ //TODO: move this function
+ async function paymentExpired() {
+ if (localStorage.getItem('paymentExpiredNotification') === 'true') return;
+ const payment = await sdk.forConsole.billing.getPaymentMethod(
+ $organization.paymentMethodId
+ );
+
+ if (payment.expired) {
+ addNotification({
+ type: 'info',
+ isHtml: true,
+ dismissible: false,
+ message: `The default payment method for ${$organization.name} has expired`,
+ buttons: [
+ {
+ name: 'Update payment details',
+ method: () => {
+ goto(`${base}/console/account/payments`);
+ }
+ }
+ ]
+ });
+ localStorage.setItem('paymentExpiredNotification', 'true');
+ }
+ }
diff --git a/src/routes/console/organization-[organization]/billing/+page.svelte b/src/routes/console/organization-[organization]/billing/+page.svelte
index dd5cd1cfb..95876d97b 100644
--- a/src/routes/console/organization-[organization]/billing/+page.svelte
+++ b/src/routes/console/organization-[organization]/billing/+page.svelte
@@ -8,9 +8,27 @@
import PaymentMethods from './paymentMethods.svelte';
import AvailableCredit from './availableCredit.svelte';
import PaymentHistory from './paymentHistory.svelte';
+ import { Alert, Heading } from '$lib/components';
+ import { paymentMethods } from '$lib/stores/billing';
+ import type { PaymentMethodData } from '$lib/sdk/billing';
+
+ $: defaultPaymentMethod = $paymentMethods.paymentMethods.find(
+ (method: PaymentMethodData) => method.$id === $organization.paymentMethodId
+ );
+ {#if defaultPaymentMethod.failed}
+
+
+ The default payment method for {$organization.name} has expired
+
+ To avoid service disruptions in your projects, please update your payment details.
+
+ {/if}
+
+ Billing
+
diff --git a/src/routes/console/organization-[organization]/billing/+page.ts b/src/routes/console/organization-[organization]/billing/+page.ts
index 7fe1526ce..af559970b 100644
--- a/src/routes/console/organization-[organization]/billing/+page.ts
+++ b/src/routes/console/organization-[organization]/billing/+page.ts
@@ -1,6 +1,5 @@
import { Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
-import { Query } from '@appwrite.io/console';
import type { PageLoad } from './$types';
export const load: PageLoad = async ({ params, parent, depends }) => {
@@ -11,10 +10,6 @@ export const load: PageLoad = async ({ params, parent, depends }) => {
depends(Dependencies.INVOICES);
return {
- paymentMethods: await sdk.forConsole.billing.listPaymentMethods(),
- creditList: await sdk.forConsole.billing.listCredits(params.organization),
- invoiceList: await sdk.forConsole.billing.listInvoices(params.organization, [
- Query.limit(5)
- ])
+ paymentMethods: await sdk.forConsole.billing.listPaymentMethods()
};
};
diff --git a/src/routes/console/organization-[organization]/billing/availableCredit.svelte b/src/routes/console/organization-[organization]/billing/availableCredit.svelte
index 2c2581dea..f09997221 100644
--- a/src/routes/console/organization-[organization]/billing/availableCredit.svelte
+++ b/src/routes/console/organization-[organization]/billing/availableCredit.svelte
@@ -13,15 +13,25 @@
TableRow
} from '$lib/elements/table';
import { toLocaleDate } from '$lib/helpers/date';
- import type { Credit } from '$lib/sdk/billing';
+ import type { Credit, CreditList } from '$lib/sdk/billing';
import { addNotification } from '$lib/stores/notifications';
import { organization } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
import { Query } from '@appwrite.io/console';
- import { creditList } from './store';
+ import { onMount } from 'svelte';
let coupon: string = null;
let offset = 0;
+ let creditList: CreditList = {
+ credits: [],
+ total: 0
+ };
+
+ onMount(async () => {
+ request();
+ });
+
+ const limit = 5;
async function redeem() {
try {
@@ -45,8 +55,8 @@
}
async function request() {
- $creditList = await sdk.forConsole.billing.listCredits($organization.$id, [
- Query.limit(5),
+ creditList = await sdk.forConsole.billing.listCredits($organization.$id, [
+ Query.limit(limit),
Query.offset(offset)
]);
}
@@ -55,7 +65,7 @@
request();
}
- $: balance = $creditList?.credits?.reduce((acc: number, curr: Credit) => acc + curr.credits, 0);
+ $: balance = creditList?.credits?.reduce((acc: number, curr: Credit) => acc + curr.credits, 0);
@@ -80,7 +90,7 @@
- {#if $creditList?.total}
+ {#if creditList?.total}
Date Added
@@ -88,7 +98,7 @@
Amount
- {#each $creditList.credits as credit}
+ {#each creditList.credits as credit}
{toLocaleDate(credit.$createdAt)}
@@ -104,8 +114,8 @@
-
Total results: {$creditList?.total}
-
+
Total results: {creditList?.total}
+
{/if}
diff --git a/src/routes/console/organization-[organization]/billing/paymentHistory.svelte b/src/routes/console/organization-[organization]/billing/paymentHistory.svelte
index b89fb6386..2dd029bc7 100644
--- a/src/routes/console/organization-[organization]/billing/paymentHistory.svelte
+++ b/src/routes/console/organization-[organization]/billing/paymentHistory.svelte
@@ -20,17 +20,28 @@
TableRow
} from '$lib/elements/table';
import { toLocaleDate } from '$lib/helpers/date';
+ import type { InvoiceList } from '$lib/sdk/billing';
import { sdk } from '$lib/stores/sdk';
import { Query } from '@appwrite.io/console';
- import { invoiceList } from './store';
+ import { onMount } from 'svelte';
let showDropdown = [];
let selectedInvoice: string;
- let offset = 0;
+ let offset = 0;
+ let invoiceList: InvoiceList = {
+ invoices: [],
+ total: 0
+ };
let downloadLink: string;
let viewLink: string;
+ const limit = 5;
+
+ onMount(async () => {
+ request();
+ });
+
async function download() {
return await sdk.forConsole.billing.downloadInvoice(
$page.params.organization,
@@ -46,9 +57,10 @@
}
async function request() {
- $invoiceList = await sdk.forConsole.billing.listInvoices($page.params.organization, [
- Query.limit(5),
- Query.offset(offset)
+ invoiceList = await sdk.forConsole.billing.listInvoices($page.params.organization, [
+ Query.limit(limit),
+ Query.offset(offset),
+ Query.orderDesc('$createdAt')
]);
}
@@ -74,7 +86,7 @@
payments.
- {#if $invoiceList.total}
+ {#if invoiceList.total}
Due Date
@@ -84,7 +96,7 @@
- {#each $invoiceList?.invoices as invoice, i}
+ {#each invoiceList?.invoices as invoice, i}
{@const status = invoice.status}
@@ -133,8 +145,8 @@
-
Total results: {$invoiceList?.total}
-
+
Total results: {invoiceList?.total}
+
{:else}
diff --git a/src/routes/console/organization-[organization]/billing/store.ts b/src/routes/console/organization-[organization]/billing/store.ts
deleted file mode 100644
index 24bdfe67b..000000000
--- a/src/routes/console/organization-[organization]/billing/store.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { page } from '$app/stores';
-import type { CreditList, InvoiceList, PaymentList } from '$lib/sdk/billing';
-import { derived, type Readable } from 'svelte/store';
-
-export const paymentMethods: Readable = derived(
- page,
- ($page) => $page.data.paymentMethods
-);
-export const creditList: Readable = derived(page, ($page) => $page.data.creditList);
-export const invoiceList: Readable = derived(page, ($page) => $page.data.invoiceList);
diff --git a/src/routes/console/organization-[organization]/wizard/step2.svelte b/src/routes/console/organization-[organization]/wizard/step2.svelte
index bb4b54fab..893f84692 100644
--- a/src/routes/console/organization-[organization]/wizard/step2.svelte
+++ b/src/routes/console/organization-[organization]/wizard/step2.svelte
@@ -35,7 +35,7 @@