From c216cf98f1bd90e3dded70e615f60a299a962ec8 Mon Sep 17 00:00:00 2001 From: Arman Date: Mon, 11 Mar 2024 16:55:20 +0100 Subject: [PATCH 01/10] fix: platform loading issues --- .../overview/platforms/createAndroid.svelte | 6 +----- .../overview/platforms/createApple.svelte | 7 ++----- .../overview/platforms/createFlutter.svelte | 7 ++----- .../project-[project]/overview/platforms/createWeb.svelte | 7 ++----- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/routes/console/project-[project]/overview/platforms/createAndroid.svelte b/src/routes/console/project-[project]/overview/platforms/createAndroid.svelte index 05fcfe438..f2d1e3267 100644 --- a/src/routes/console/project-[project]/overview/platforms/createAndroid.svelte +++ b/src/routes/console/project-[project]/overview/platforms/createAndroid.svelte @@ -4,7 +4,6 @@ import { wizard } from '$lib/stores/wizard'; import { createPlatform } from './wizard/store'; import { Dependencies } from '$lib/constants'; - import { onboarding } from '../../store'; import type { WizardStepsType } from '$lib/layout/wizard.svelte'; import Step1 from './wizard/android/step1.svelte'; import Step2 from './wizard/android/step2.svelte'; @@ -12,10 +11,7 @@ import Step4 from './wizard/step4.svelte'; async function onFinish() { - await Promise.all([ - $onboarding && invalidate(Dependencies.PROJECT), - invalidate(Dependencies.PLATFORMS) - ]); + await Promise.all([invalidate(Dependencies.PROJECT), invalidate(Dependencies.PLATFORMS)]); createPlatform.reset(); wizard.hide(); } diff --git a/src/routes/console/project-[project]/overview/platforms/createApple.svelte b/src/routes/console/project-[project]/overview/platforms/createApple.svelte index 745a9b537..33baa5870 100644 --- a/src/routes/console/project-[project]/overview/platforms/createApple.svelte +++ b/src/routes/console/project-[project]/overview/platforms/createApple.svelte @@ -9,13 +9,10 @@ import Step3 from './wizard/apple/step3.svelte'; import Step4 from './wizard/step4.svelte'; import { Dependencies } from '$lib/constants'; - import { onboarding } from '../../store'; async function onFinish() { - await Promise.all([ - $onboarding && invalidate(Dependencies.PROJECT), - invalidate(Dependencies.PLATFORMS) - ]); + await Promise.all([invalidate(Dependencies.PROJECT), invalidate(Dependencies.PLATFORMS)]); + createPlatform.reset(); wizard.hide(); } diff --git a/src/routes/console/project-[project]/overview/platforms/createFlutter.svelte b/src/routes/console/project-[project]/overview/platforms/createFlutter.svelte index 5be9b2568..f4cd90823 100644 --- a/src/routes/console/project-[project]/overview/platforms/createFlutter.svelte +++ b/src/routes/console/project-[project]/overview/platforms/createFlutter.svelte @@ -9,13 +9,10 @@ import Step3 from './wizard/flutter/step3.svelte'; import Step4 from './wizard/step4.svelte'; import { Dependencies } from '$lib/constants'; - import { onboarding } from '../../store'; async function onFinish() { - await Promise.all([ - $onboarding && invalidate(Dependencies.PROJECT), - invalidate(Dependencies.PLATFORMS) - ]); + await Promise.all([invalidate(Dependencies.PROJECT), invalidate(Dependencies.PLATFORMS)]); + createPlatform.reset(); wizard.hide(); } diff --git a/src/routes/console/project-[project]/overview/platforms/createWeb.svelte b/src/routes/console/project-[project]/overview/platforms/createWeb.svelte index c24248ca3..1fe89255e 100644 --- a/src/routes/console/project-[project]/overview/platforms/createWeb.svelte +++ b/src/routes/console/project-[project]/overview/platforms/createWeb.svelte @@ -9,13 +9,10 @@ import Step3 from './wizard/web/step3.svelte'; import Step4 from './wizard/step4.svelte'; import { Dependencies } from '$lib/constants'; - import { onboarding } from '../../store'; async function onFinish() { - await Promise.all([ - $onboarding && invalidate(Dependencies.PROJECT), - invalidate(Dependencies.PLATFORMS) - ]); + await Promise.all([invalidate(Dependencies.PROJECT), invalidate(Dependencies.PLATFORMS)]); + createPlatform.reset(); wizard.hide(); } From cf82b17fc70ba672840eb328ce0e4589439af90c Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 13 Mar 2024 11:57:00 +0100 Subject: [PATCH 02/10] fix: add payment from account page --- src/routes/console/account/payments/paymentModal.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/console/account/payments/paymentModal.svelte b/src/routes/console/account/payments/paymentModal.svelte index abe6767fe..ddf83bc27 100644 --- a/src/routes/console/account/payments/paymentModal.svelte +++ b/src/routes/console/account/payments/paymentModal.svelte @@ -6,6 +6,7 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { addNotification } from '$lib/stores/notifications'; + import { base } from '$app/paths'; export let show = false; @@ -20,7 +21,7 @@ async function handleSubmit() { try { - const card = await submitStripeCard(name); + const card = await submitStripeCard(name, '/account/payments'); invalidate(Dependencies.PAYMENT_METHODS); dispatch('submit', card); show = false; From 31a4ff88d5a9b2f2edf9da46f3f82f2737eafbd7 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 13 Mar 2024 11:58:34 +0100 Subject: [PATCH 03/10] revert: base import --- src/routes/console/account/payments/paymentModal.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/console/account/payments/paymentModal.svelte b/src/routes/console/account/payments/paymentModal.svelte index ddf83bc27..dfd8b3caf 100644 --- a/src/routes/console/account/payments/paymentModal.svelte +++ b/src/routes/console/account/payments/paymentModal.svelte @@ -6,7 +6,6 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { addNotification } from '$lib/stores/notifications'; - import { base } from '$app/paths'; export let show = false; From 920ec185b23cfef3cc846d53a0265bf2611d2a03 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 13 Mar 2024 18:44:50 +0100 Subject: [PATCH 04/10] fix: confirm payments --- src/lib/stores/stripe.ts | 16 ++++++++++------ src/routes/console/account/payments/+page.svelte | 13 +++++++++++++ .../console/account/payments/paymentModal.svelte | 3 ++- .../billing/replaceCard.svelte | 2 +- .../billing/retryPaymentModal.svelte | 2 +- .../billing/wizard/paymentDetails.svelte | 3 ++- .../paymentDetails.svelte | 3 ++- 7 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/lib/stores/stripe.ts b/src/lib/stores/stripe.ts index 959b46ffc..93b4576ae 100644 --- a/src/lib/stores/stripe.ts +++ b/src/lib/stores/stripe.ts @@ -51,7 +51,7 @@ export async function unmountPaymentElement() { elements = null; } -export async function submitStripeCard(name: string, urlRoute?: string) { +export async function submitStripeCard(name: string, organizationId?: string) { try { // If a payment method was created during initialization, use it, otherwise create a new one if (!paymentMethod) { @@ -62,16 +62,20 @@ export async function submitStripeCard(name: string, urlRoute?: string) { // // Element needs to be submitted before confirming the setup intent elements.submit(); - const baseUrl = 'https://cloud.appwrite.io/console/'; + const baseUrl = 'https://cloud.appwrite.io/console'; + const accountUrl = `${baseUrl}/account/payments?clientSecret=${clientSecret}`; + const orgUrl = `${baseUrl}/organization-${organizationId}/billing?clientSecret=${clientSecret}`; + + const returnUrl = new URL(organizationId ? orgUrl : accountUrl); + + returnUrl.searchParams.append('clientSecret', clientSecret); + returnUrl.searchParams.append('paymentMethodId', paymentMethod.$id); const { setupIntent, error } = await get(stripe).confirmSetup({ elements, clientSecret, confirmParams: { - return_url: `${baseUrl}${ - urlRoute ?? - `organization-${get(organization).$id}/billing?clientSecret=${clientSecret}` - }`, + return_url: returnUrl.toString(), payment_method_data: { billing_details: { name diff --git a/src/routes/console/account/payments/+page.svelte b/src/routes/console/account/payments/+page.svelte index 8cca7e6f8..f4a654ac8 100644 --- a/src/routes/console/account/payments/+page.svelte +++ b/src/routes/console/account/payments/+page.svelte @@ -3,8 +3,21 @@ import { Container } from '$lib/layout'; import PaymentMethods from './paymentMethods.svelte'; import BillingAddress from './billingAddress.svelte'; + import { onMount } from 'svelte'; + import { page } from '$app/stores'; + import { confirmPayment } from '$lib/stores/stripe'; + import { user } from '$lib/stores/user'; let showPayment = false; + user; + + onMount(async () => { + if ($page.url.searchParams.has('clientSecret')) { + const clientSecret = $page.url.searchParams.get('clientSecret'); + const paymentMethodId = $page.url.searchParams.get('paymentMethodId'); + await confirmPayment('', clientSecret, paymentMethodId); + } + }); diff --git a/src/routes/console/account/payments/paymentModal.svelte b/src/routes/console/account/payments/paymentModal.svelte index dfd8b3caf..2ac93e0b2 100644 --- a/src/routes/console/account/payments/paymentModal.svelte +++ b/src/routes/console/account/payments/paymentModal.svelte @@ -6,6 +6,7 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { addNotification } from '$lib/stores/notifications'; + import { page } from '$app/stores'; export let show = false; @@ -20,7 +21,7 @@ async function handleSubmit() { try { - const card = await submitStripeCard(name, '/account/payments'); + const card = await submitStripeCard(name, $page?.params?.organization ?? null); invalidate(Dependencies.PAYMENT_METHODS); dispatch('submit', card); show = false; diff --git a/src/routes/console/organization-[organization]/billing/replaceCard.svelte b/src/routes/console/organization-[organization]/billing/replaceCard.svelte index e25348990..639964119 100644 --- a/src/routes/console/organization-[organization]/billing/replaceCard.svelte +++ b/src/routes/console/organization-[organization]/billing/replaceCard.svelte @@ -33,7 +33,7 @@ async function handleSubmit() { try { if (!selectedPaymentMethodId) { - const method = await submitStripeCard(name); + const method = await submitStripeCard(name, $organization.$id); selectedPaymentMethodId = method.$id; } isBackup diff --git a/src/routes/console/organization-[organization]/billing/retryPaymentModal.svelte b/src/routes/console/organization-[organization]/billing/retryPaymentModal.svelte index 828782773..e0f034029 100644 --- a/src/routes/console/organization-[organization]/billing/retryPaymentModal.svelte +++ b/src/routes/console/organization-[organization]/billing/retryPaymentModal.svelte @@ -39,7 +39,7 @@ try { if (paymentMethodId === null) { try { - const method = await submitStripeCard(name); + const method = await submitStripeCard(name, $organization.$id); const card = await sdk.forConsole.billing.getPaymentMethod(method.$id); if (card?.last4) { paymentMethodId = card.$id; diff --git a/src/routes/console/organization-[organization]/billing/wizard/paymentDetails.svelte b/src/routes/console/organization-[organization]/billing/wizard/paymentDetails.svelte index b4f54264d..f9d34c28e 100644 --- a/src/routes/console/organization-[organization]/billing/wizard/paymentDetails.svelte +++ b/src/routes/console/organization-[organization]/billing/wizard/paymentDetails.svelte @@ -9,6 +9,7 @@ import { sdk } from '$lib/stores/sdk'; import { PaymentBoxes } from '$lib/components/billing'; import { addCreditWizardStore } from '../store'; + import { organization } from '$lib/stores/organization'; let methods: PaymentList; let name: string; @@ -21,7 +22,7 @@ async function handleSubmit() { try { - const method = await submitStripeCard(name); + const method = await submitStripeCard(name, $organization.$id); $addCreditWizardStore.paymentMethodId = method.$id; invalidate(Dependencies.PAYMENT_METHODS); } catch (e) { diff --git a/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte b/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte index b82943719..f03feecca 100644 --- a/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte +++ b/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte @@ -13,6 +13,7 @@ import { symmetricDifference } from '$lib/helpers/array'; import { showUsageRatesModal } from '$lib/stores/billing'; import { PaymentBoxes } from '$lib/components/billing'; + import { page } from '$app/stores'; let methods: PaymentList; let filteredMethods: PaymentMethodData[]; @@ -48,7 +49,7 @@ } } else { try { - await submitStripeCard(name); + await submitStripeCard(name, $page?.params?.organization ?? null); const latestMethods = await sdk.forConsole.billing.listPaymentMethods(); const paymentMethod = symmetricDifference( methods.paymentMethods, From 1fe27cf03cd9e6e1fcbc815f63405c010aa576e0 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 13 Mar 2024 18:45:13 +0100 Subject: [PATCH 05/10] fix: 500 errors! --- src/hooks.client.ts | 13 +++++++++++++ src/routes/+error.svelte | 2 +- src/routes/console/+error.svelte | 8 +++++--- src/routes/console/project-[project]/+error.svelte | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 src/hooks.client.ts diff --git a/src/hooks.client.ts b/src/hooks.client.ts new file mode 100644 index 000000000..2345ffb2c --- /dev/null +++ b/src/hooks.client.ts @@ -0,0 +1,13 @@ +import { AppwriteException } from '@appwrite.io/console'; +import type { HandleClientError } from '@sveltejs/kit'; + +export const handleError: HandleClientError = async ({ error, message, status }) => { + if (error instanceof AppwriteException && error.code === 0) { + status = undefined; + message = error.message; + } + return { + message, + status + }; +}; diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index 4e9d8e540..8b914f299 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -6,7 +6,7 @@ - {$page.status} + {$page.error.status || 'Invalid Argument'} {$page.error.message} diff --git a/src/routes/console/+error.svelte b/src/routes/console/+error.svelte index 9a50e9be7..408a5afaa 100644 --- a/src/routes/console/+error.svelte +++ b/src/routes/console/+error.svelte @@ -6,7 +6,9 @@ - {$page.status} - {$page.error.message} - +
+ {$page.error.status || 'Invalid Argument'} + {$page.error.message} + +
diff --git a/src/routes/console/project-[project]/+error.svelte b/src/routes/console/project-[project]/+error.svelte index 243be6e42..be0053176 100644 --- a/src/routes/console/project-[project]/+error.svelte +++ b/src/routes/console/project-[project]/+error.svelte @@ -5,6 +5,6 @@ - {$page.status} + {$page.error.status || 'Invalid Argument'}

{$page.error.message}

From 355a8628ca264c93ce3126542f352720200928cd Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 13 Mar 2024 18:47:38 +0100 Subject: [PATCH 06/10] fix: remove unused code --- src/routes/console/account/payments/+page.svelte | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/routes/console/account/payments/+page.svelte b/src/routes/console/account/payments/+page.svelte index f4a654ac8..1e00b42eb 100644 --- a/src/routes/console/account/payments/+page.svelte +++ b/src/routes/console/account/payments/+page.svelte @@ -6,10 +6,8 @@ import { onMount } from 'svelte'; import { page } from '$app/stores'; import { confirmPayment } from '$lib/stores/stripe'; - import { user } from '$lib/stores/user'; let showPayment = false; - user; onMount(async () => { if ($page.url.searchParams.has('clientSecret')) { From 8185fab2572d1a24343799c426c2521072aad203 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 14 Mar 2024 21:03:07 +0000 Subject: [PATCH 07/10] chore: fix-upgrade-wizard-flow --- .../paymentDetails.svelte | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte b/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte index f03feecca..99116f394 100644 --- a/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte +++ b/src/routes/console/wizard/cloudOrganizationChangeTier/paymentDetails.svelte @@ -10,7 +10,6 @@ import { Dependencies } from '$lib/constants'; import { initializeStripe, isStripeInitialized, submitStripeCard } from '$lib/stores/stripe'; import { organization } from '$lib/stores/organization'; - import { symmetricDifference } from '$lib/helpers/array'; import { showUsageRatesModal } from '$lib/stores/billing'; import { PaymentBoxes } from '$lib/components/billing'; import { page } from '$app/stores'; @@ -49,15 +48,10 @@ } } else { try { - await submitStripeCard(name, $page?.params?.organization ?? null); - const latestMethods = await sdk.forConsole.billing.listPaymentMethods(); - const paymentMethod = symmetricDifference( - methods.paymentMethods, - latestMethods.paymentMethods - )[0] as PaymentMethodData; - const card = await sdk.forConsole.billing.getPaymentMethod(paymentMethod.$id); + const method = await submitStripeCard(name, $page?.params?.organization ?? null); + const card = await sdk.forConsole.billing.getPaymentMethod(method.$id); if (card?.last4) { - $changeOrganizationTier.paymentMethodId = paymentMethod.$id; + $changeOrganizationTier.paymentMethodId = method.$id; } else { throw new Error( 'The payment method you selected is not valid. Please select a different one.' From 71bb3fc7d4e541fa01273a4a195e25f894bba6a7 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Tue, 19 Mar 2024 11:20:37 +0200 Subject: [PATCH 08/10] fix: state waterfall --- src/routes/+layout.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index 14cb350c0..84fdba79b 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -13,9 +13,10 @@ export const ssr = false; export const load: LayoutLoad = async ({ depends, url }) => { depends(Dependencies.ACCOUNT); - redirectTo.set(url.searchParams.get('forceRedirect') || null); - - url.searchParams.delete('forceRedirect'); + if (url.searchParams.has('forceRedirect')) { + redirectTo.set(url.searchParams.get('forceRedirect') || null); + url.searchParams.delete('forceRedirect'); + } try { const account = await sdk.forConsole.account.get<{ organization?: string }>(); From 636fa27e2f5a9ff7fbdc21cf8aaef42f8e2c6341 Mon Sep 17 00:00:00 2001 From: Arman Date: Tue, 19 Mar 2024 10:53:12 +0100 Subject: [PATCH 09/10] fix: billings checks on load --- src/lib/stores/billing.ts | 1 + src/routes/console/+layout.svelte | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib/stores/billing.ts b/src/lib/stores/billing.ts index b2f00db39..c213a7147 100644 --- a/src/lib/stores/billing.ts +++ b/src/lib/stores/billing.ts @@ -279,6 +279,7 @@ export const paymentMissingMandate = writable(null); export async function checkForMandate(org: Organization) { const paymentId = org.paymentMethodId ?? org.backupPaymentMethodId; + if (!paymentId) return; const paymentMethod = await sdk.forConsole.billing.getPaymentMethod(paymentId); if (paymentMethod.mandateId === null && paymentMethod.country === 'in') { headerAlert.add({ diff --git a/src/routes/console/+layout.svelte b/src/routes/console/+layout.svelte index b12da8a70..6e59612b4 100644 --- a/src/routes/console/+layout.svelte +++ b/src/routes/console/+layout.svelte @@ -1,6 +1,6 @@