Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/rich-breads-move.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@clerk/clerk-js': minor
'@clerk/shared': patch
'@clerk/types': minor
---

[Billing Beta] Rename payment source to payment method.
7 changes: 7 additions & 0 deletions packages/clerk-js/src/core/modules/billing/namespace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ import {
} from '../../resources/internal';

export class Billing implements BillingNamespace {
static readonly #pathRoot = '/commerce';
static path(subPath: string, param?: { orgId?: string }): string {
const { orgId } = param || {};
const prefix = orgId ? `/organizations/${orgId}` : '/me';
return `${prefix}${Billing.#pathRoot}${subPath}`;
}

getPlans = async (params?: GetPlansParams): Promise<ClerkPaginatedResponse<BillingPlanResource>> => {
const { for: forParam, ...safeParams } = params || {};
const searchParams = { ...safeParams, payer_type: forParam === 'organization' ? 'org' : 'user' };
Expand Down
Original file line number Diff line number Diff line change
@@ -1,55 +1,56 @@
import type {
AddPaymentSourceParams,
BillingInitializedPaymentSourceJSON,
BillingPaymentSourceJSON,
AddPaymentMethodParams,
BillingInitializedPaymentMethodJSON,
BillingPaymentMethodJSON,
ClerkPaginatedResponse,
GetPaymentSourcesParams,
InitializePaymentSourceParams,
GetPaymentMethodsParams,
InitializePaymentMethodParams,
} from '@clerk/types';

import { convertPageToOffsetSearchParams } from '../../../utils/convertPageToOffsetSearchParams';
import { BaseResource, BillingInitializedPaymentSource, BillingPaymentSource } from '../../resources/internal';
import { BaseResource, BillingInitializedPaymentMethod, BillingPaymentMethod } from '../../resources/internal';
import { Billing } from './namespace';

export const initializePaymentSource = async (params: InitializePaymentSourceParams) => {
const PAYMENT_METHODS_PATH = '/payment_methods';

export const initializePaymentMethod = async (params: InitializePaymentMethodParams) => {
const { orgId, ...rest } = params;
const json = (
await BaseResource._fetch({
path: orgId
? `/organizations/${orgId}/commerce/payment_sources/initialize`
: `/me/commerce/payment_sources/initialize`,
path: Billing.path(`${PAYMENT_METHODS_PATH}/initialize`, { orgId }),
method: 'POST',
body: rest as any,
})
)?.response as unknown as BillingInitializedPaymentSourceJSON;
return new BillingInitializedPaymentSource(json);
)?.response as unknown as BillingInitializedPaymentMethodJSON;
return new BillingInitializedPaymentMethod(json);
};

export const addPaymentSource = async (params: AddPaymentSourceParams) => {
export const addPaymentMethod = async (params: AddPaymentMethodParams) => {
const { orgId, ...rest } = params;

const json = (
await BaseResource._fetch({
path: orgId ? `/organizations/${orgId}/commerce/payment_sources` : `/me/commerce/payment_sources`,
path: Billing.path(PAYMENT_METHODS_PATH, { orgId }),
method: 'POST',
body: rest as any,
})
)?.response as unknown as BillingPaymentSourceJSON;
return new BillingPaymentSource(json);
)?.response as unknown as BillingPaymentMethodJSON;
return new BillingPaymentMethod(json);
};

export const getPaymentSources = async (params: GetPaymentSourcesParams) => {
export const getPaymentMethods = async (params: GetPaymentMethodsParams) => {
const { orgId, ...rest } = params;

return await BaseResource._fetch({
path: orgId ? `/organizations/${orgId}/commerce/payment_sources` : `/me/commerce/payment_sources`,
path: Billing.path(PAYMENT_METHODS_PATH, { orgId }),
method: 'GET',
search: convertPageToOffsetSearchParams(rest),
}).then(res => {
const { data: paymentSources, total_count } =
res?.response as unknown as ClerkPaginatedResponse<BillingPaymentSourceJSON>;
res?.response as unknown as ClerkPaginatedResponse<BillingPaymentMethodJSON>;
return {
total_count,
data: paymentSources.map(paymentSource => new BillingPaymentSource(paymentSource)),
data: paymentSources.map(paymentMethod => new BillingPaymentMethod(paymentMethod)),
};
});
};
7 changes: 4 additions & 3 deletions packages/clerk-js/src/core/resources/BillingCheckout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import type {
BillingCheckoutResource,
BillingCheckoutTotals,
BillingPayerResource,
BillingPaymentMethodResource,
BillingSubscriptionPlanPeriod,
ConfirmCheckoutParams,
} from '@clerk/types';
Expand All @@ -13,13 +14,13 @@ import { unixEpochToDate } from '@/utils/date';

import { billingTotalsFromJSON } from '../../utils';
import { BillingPayer } from './BillingPayer';
import { BaseResource, BillingPaymentSource, BillingPlan } from './internal';
import { BaseResource, BillingPaymentMethod, BillingPlan } from './internal';

export class BillingCheckout extends BaseResource implements BillingCheckoutResource {
id!: string;
externalClientSecret!: string;
externalGatewayId!: string;
paymentSource?: BillingPaymentSource;
paymentMethod?: BillingPaymentMethodResource;
plan!: BillingPlan;
planPeriod!: BillingSubscriptionPlanPeriod;
planPeriodStart!: number | undefined;
Expand All @@ -42,7 +43,7 @@ export class BillingCheckout extends BaseResource implements BillingCheckoutReso
this.id = data.id;
this.externalClientSecret = data.external_client_secret;
this.externalGatewayId = data.external_gateway_id;
this.paymentSource = data.payment_source ? new BillingPaymentSource(data.payment_source) : undefined;
this.paymentMethod = data.payment_method ? new BillingPaymentMethod(data.payment_method) : undefined;
this.plan = new BillingPlan(data.plan);
this.planPeriod = data.plan_period;
this.planPeriodStart = data.plan_period_start;
Expand Down
8 changes: 4 additions & 4 deletions packages/clerk-js/src/core/resources/BillingPayment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ import type {
BillingMoneyAmount,
BillingPaymentChargeType,
BillingPaymentJSON,
BillingPaymentMethodResource,
BillingPaymentResource,
BillingPaymentSourceResource,
BillingPaymentStatus,
BillingSubscriptionItemResource,
} from '@clerk/types';

import { billingMoneyAmountFromJSON } from '../../utils';
import { unixEpochToDate } from '../../utils/date';
import { BaseResource, BillingPaymentSource, BillingSubscriptionItem } from './internal';
import { BaseResource, BillingPaymentMethod, BillingSubscriptionItem } from './internal';

export class BillingPayment extends BaseResource implements BillingPaymentResource {
id!: string;
amount!: BillingMoneyAmount;
failedAt?: Date;
paidAt?: Date;
updatedAt!: Date;
paymentSource!: BillingPaymentSourceResource;
paymentMethod!: BillingPaymentMethodResource;
subscriptionItem!: BillingSubscriptionItemResource;
chargeType!: BillingPaymentChargeType;
status!: BillingPaymentStatus;
Expand All @@ -38,7 +38,7 @@ export class BillingPayment extends BaseResource implements BillingPaymentResour
this.paidAt = data.paid_at ? unixEpochToDate(data.paid_at) : undefined;
this.failedAt = data.failed_at ? unixEpochToDate(data.failed_at) : undefined;
this.updatedAt = unixEpochToDate(data.updated_at);
this.paymentSource = new BillingPaymentSource(data.payment_source);
this.paymentMethod = new BillingPaymentMethod(data.payment_method);
this.subscriptionItem = new BillingSubscriptionItem(data.subscription_item);
this.chargeType = data.charge_type;
this.status = data.status;
Expand Down
28 changes: 14 additions & 14 deletions packages/clerk-js/src/core/resources/BillingPaymentSource.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
import type {
BillingInitializedPaymentSourceJSON,
BillingInitializedPaymentSourceResource,
BillingPaymentSourceJSON,
BillingPaymentSourceResource,
BillingPaymentSourceStatus,
BillingInitializedPaymentMethodJSON,
BillingInitializedPaymentMethodResource,
BillingPaymentMethodJSON,
BillingPaymentMethodResource,
BillingPaymentMethodStatus,
DeletedObjectJSON,
MakeDefaultPaymentSourceParams,
RemovePaymentSourceParams,
} from '@clerk/types';

import { BaseResource, DeletedObject } from './internal';

export class BillingPaymentSource extends BaseResource implements BillingPaymentSourceResource {
export class BillingPaymentMethod extends BaseResource implements BillingPaymentMethodResource {
id!: string;
last4!: string;
paymentMethod!: string;
paymentType!: 'card' | 'link';
cardType!: string;
isDefault!: boolean;
isRemovable!: boolean;
status!: BillingPaymentSourceStatus;
status!: BillingPaymentMethodStatus;
walletType: string | undefined;

constructor(data: BillingPaymentSourceJSON) {
constructor(data: BillingPaymentMethodJSON) {
super();
this.fromJSON(data);
}

protected fromJSON(data: BillingPaymentSourceJSON | null): this {
protected fromJSON(data: BillingPaymentMethodJSON | null): this {
if (!data) {
return this;
}

this.id = data.id;
this.last4 = data.last4;
this.paymentMethod = data.payment_method;
this.paymentType = data.payment_type;
this.cardType = data.card_type;
this.isDefault = data.is_default;
this.isRemovable = data.is_removable;
Expand Down Expand Up @@ -71,17 +71,17 @@ export class BillingPaymentSource extends BaseResource implements BillingPayment
}
}

export class BillingInitializedPaymentSource extends BaseResource implements BillingInitializedPaymentSourceResource {
export class BillingInitializedPaymentMethod extends BaseResource implements BillingInitializedPaymentMethodResource {
externalClientSecret!: string;
externalGatewayId!: string;
paymentMethodOrder!: string[];

constructor(data: BillingInitializedPaymentSourceJSON) {
constructor(data: BillingInitializedPaymentMethodJSON) {
super();
this.fromJSON(data);
}

protected fromJSON(data: BillingInitializedPaymentSourceJSON | null): this {
protected fromJSON(data: BillingInitializedPaymentMethodJSON | null): this {
if (!data) {
return this;
}
Expand Down
4 changes: 2 additions & 2 deletions packages/clerk-js/src/core/resources/BillingSubscription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export class BillingSubscription extends BaseResource implements BillingSubscrip

export class BillingSubscriptionItem extends BaseResource implements BillingSubscriptionItemResource {
id!: string;
paymentSourceId!: string;
paymentMethodId!: string;
plan!: BillingPlan;
planPeriod!: BillingSubscriptionPlanPeriod;
status!: BillingSubscriptionStatus;
Expand All @@ -86,7 +86,7 @@ export class BillingSubscriptionItem extends BaseResource implements BillingSubs
}

this.id = data.id;
this.paymentSourceId = data.payment_source_id;
this.paymentMethodId = data.payment_method_id;
this.plan = new BillingPlan(data.plan);
this.planPeriod = data.plan_period;
this.status = data.status;
Expand Down
14 changes: 7 additions & 7 deletions packages/clerk-js/src/core/resources/Organization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import type {

import { convertPageToOffsetSearchParams } from '../../utils/convertPageToOffsetSearchParams';
import { unixEpochToDate } from '../../utils/date';
import { addPaymentSource, getPaymentSources, initializePaymentSource } from '../modules/billing';
import { addPaymentMethod, getPaymentMethods, initializePaymentMethod } from '../modules/billing';
import { BaseResource, OrganizationInvitation, OrganizationMembership } from './internal';
import { OrganizationDomain } from './OrganizationDomain';
import { OrganizationMembershipRequest } from './OrganizationMembershipRequest';
Expand Down Expand Up @@ -262,22 +262,22 @@ export class Organization extends BaseResource implements OrganizationResource {
}).then(res => new Organization(res?.response as OrganizationJSON));
};

initializePaymentSource: typeof initializePaymentSource = params => {
return initializePaymentSource({
initializePaymentMethod: typeof initializePaymentMethod = params => {
return initializePaymentMethod({
...params,
orgId: this.id,
});
};

addPaymentSource: typeof addPaymentSource = params => {
return addPaymentSource({
addPaymentMethod: typeof addPaymentMethod = params => {
return addPaymentMethod({
...params,
orgId: this.id,
});
};

getPaymentSources: typeof getPaymentSources = params => {
return getPaymentSources({
getPaymentMethods: typeof getPaymentMethods = params => {
return getPaymentMethods({
...params,
orgId: this.id,
});
Expand Down
14 changes: 7 additions & 7 deletions packages/clerk-js/src/core/resources/User.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import { unixEpochToDate } from '../../utils/date';
import { normalizeUnsafeMetadata } from '../../utils/resourceParams';
import { getFullName } from '../../utils/user';
import { eventBus, events } from '../events';
import { addPaymentSource, getPaymentSources, initializePaymentSource } from '../modules/billing';
import { addPaymentMethod, getPaymentMethods, initializePaymentMethod } from '../modules/billing';
import { BackupCode } from './BackupCode';
import {
BaseResource,
Expand Down Expand Up @@ -291,16 +291,16 @@ export class User extends BaseResource implements UserResource {
return new DeletedObject(json);
};

initializePaymentSource: typeof initializePaymentSource = params => {
return initializePaymentSource(params);
initializePaymentMethod: typeof initializePaymentMethod = params => {
return initializePaymentMethod(params);
};

addPaymentSource: typeof addPaymentSource = params => {
return addPaymentSource(params);
addPaymentMethod: typeof addPaymentMethod = params => {
return addPaymentMethod(params);
};

getPaymentSources: typeof getPaymentSources = params => {
return getPaymentSources(params);
getPaymentMethods: typeof getPaymentMethods = params => {
return getPaymentMethods(params);
};

get verifiedExternalAccounts() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ export const CheckoutComplete = () => {
const { setIsOpen } = useDrawerContext();
const { newSubscriptionRedirectUrl } = useCheckoutContext();
const { checkout } = useCheckout();
const { totals, paymentSource, planPeriodStart, freeTrialEndsAt } = checkout;
const { totals, paymentMethod, planPeriodStart, freeTrialEndsAt } = checkout;
const [mousePosition, setMousePosition] = useState({ x: 256, y: 256 });

const prefersReducedMotion = usePrefersReducedMotion();
Expand Down Expand Up @@ -438,10 +438,10 @@ export const CheckoutComplete = () => {
<LineItems.Description
text={
totals.totalDueNow.amount > 0 || freeTrialEndsAt !== null
? paymentSource
? paymentSource.paymentMethod !== 'card'
? `${capitalize(paymentSource.paymentMethod)}`
: `${capitalize(paymentSource.cardType)} ⋯ ${paymentSource.last4}`
? paymentMethod
? paymentMethod.paymentType !== 'card'
? `${capitalize(paymentMethod.paymentType)}`
: `${capitalize(paymentMethod.cardType)} ⋯ ${paymentMethod.last4}`
: '–'
: planPeriodStart
? formatDate(new Date(planPeriodStart))
Expand Down
Loading
Loading