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 @@