From 56c959e90c9a3188e35751e6708676a488617fe1 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 7 Apr 2026 00:47:00 +0000 Subject: [PATCH 1/2] fix: show org payment method for all team members on billing tab Fetch the organization's primary and backup payment methods via organizations.getPaymentMethod() instead of filtering account.listPaymentMethods(). The account endpoint only returns the current user's own cards, so if a different team member added the org's payment method it was invisible and the billing page incorrectly showed "Add a payment method". Co-Authored-By: Claude Opus 4.6 (1M context) --- .../billing/+page.ts | 82 ++++++++++--------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/src/routes/(console)/organization-[organization]/billing/+page.ts b/src/routes/(console)/organization-[organization]/billing/+page.ts index 4c10658caa..b801dfa564 100644 --- a/src/routes/(console)/organization-[organization]/billing/+page.ts +++ b/src/routes/(console)/organization-[organization]/billing/+page.ts @@ -70,26 +70,53 @@ export const load: PageLoad = async ({ parent, depends, url, route }) => { const areCreditsSupported = isCloud ? currentPlan?.supportsCredits : false; - const [paymentMethods, addressList, billingAddress, availableCredit, billingPlanDowngrade] = - await Promise.all([ - sdk.forConsole.account.listPaymentMethods(), - sdk.forConsole.account.listBillingAddresses(), - billingAddressPromise, - areCreditsSupported - ? sdk.forConsole.organizations.getAvailableCredits({ - organizationId: organization.$id - }) - : null, - organization.billingPlanDowngrade - ? sdk.forConsole.console.getPlan({ - planId: organization.billingPlanDowngrade + const primaryPaymentMethodPromise: Promise = organization.paymentMethodId + ? sdk.forConsole.organizations + .getPaymentMethod({ + organizationId: organization.$id, + paymentMethodId: organization.paymentMethodId + }) + .catch(() => null) + : null; + + const backupPaymentMethodPromise: Promise = + organization.backupPaymentMethodId + ? sdk.forConsole.organizations + .getPaymentMethod({ + organizationId: organization.$id, + paymentMethodId: organization.backupPaymentMethodId }) - : null - ]); + .catch(() => null) + : null; + + const [ + paymentMethods, + addressList, + billingAddress, + availableCredit, + billingPlanDowngrade, + primary, + backup + ] = await Promise.all([ + sdk.forConsole.account.listPaymentMethods(), + sdk.forConsole.account.listBillingAddresses(), + billingAddressPromise, + areCreditsSupported + ? sdk.forConsole.organizations.getAvailableCredits({ + organizationId: organization.$id + }) + : null, + organization.billingPlanDowngrade + ? sdk.forConsole.console.getPlan({ + planId: organization.billingPlanDowngrade + }) + : null, + primaryPaymentMethodPromise, + backupPaymentMethodPromise + ]); // make number const credits = availableCredit ? availableCredit.available : null; - const { backup, primary } = getOrganizationPaymentMethods(organization, paymentMethods); return { paymentMethods, @@ -112,26 +139,3 @@ export const load: PageLoad = async ({ parent, depends, url, route }) => { primaryPaymentMethod: primary }; }; - -function getOrganizationPaymentMethods( - organization: Models.Organization, - paymentMethods: Models.PaymentMethodList -): { - backup: Models.PaymentMethod | null; - primary: Models.PaymentMethod | null; -} { - let backup: Models.PaymentMethod | null = null; - let primary: Models.PaymentMethod | null = null; - - for (const paymentMethod of paymentMethods.paymentMethods) { - if (paymentMethod.$id === organization.paymentMethodId) { - primary = paymentMethod; - } else if (paymentMethod.$id === organization.backupPaymentMethodId) { - backup = paymentMethod; - } - - if (primary && backup) break; - } - - return { primary, backup }; -} From 784c4fda8d4820a607bac2033bd659a8c226b2bb Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 7 Apr 2026 01:01:15 +0000 Subject: [PATCH 2/2] fix: correct type annotations for payment method promises Promise type should include null for both the resolved value (.catch(() => null)) and the ternary false branch (null). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../billing/+page.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/routes/(console)/organization-[organization]/billing/+page.ts b/src/routes/(console)/organization-[organization]/billing/+page.ts index b801dfa564..e3c18073ae 100644 --- a/src/routes/(console)/organization-[organization]/billing/+page.ts +++ b/src/routes/(console)/organization-[organization]/billing/+page.ts @@ -70,16 +70,17 @@ export const load: PageLoad = async ({ parent, depends, url, route }) => { const areCreditsSupported = isCloud ? currentPlan?.supportsCredits : false; - const primaryPaymentMethodPromise: Promise = organization.paymentMethodId - ? sdk.forConsole.organizations - .getPaymentMethod({ - organizationId: organization.$id, - paymentMethodId: organization.paymentMethodId - }) - .catch(() => null) - : null; + const primaryPaymentMethodPromise: Promise | null = + organization.paymentMethodId + ? sdk.forConsole.organizations + .getPaymentMethod({ + organizationId: organization.$id, + paymentMethodId: organization.paymentMethodId + }) + .catch(() => null) + : null; - const backupPaymentMethodPromise: Promise = + const backupPaymentMethodPromise: Promise | null = organization.backupPaymentMethodId ? sdk.forConsole.organizations .getPaymentMethod({