Skip to content

chore(clerk-js): Split <PlanDetails/> and <SubcriptionDetails/> #6148

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
234ce35
wip
panteliselef Jun 17, 2025
2041111
wip 2
panteliselef Jun 17, 2025
e7a3f26
create the layout and functionality
panteliselef Jun 18, 2025
7af1561
display button for annual to switch to monthly as well
panteliselef Jun 18, 2025
a64ed1d
Merge branch 'refs/heads/main' into elef/com-835-split-up-plandetails…
panteliselef Jun 30, 2025
99607d7
implement new UI
panteliselef Jul 1, 2025
0af7fb9
add unit tests
panteliselef Jul 1, 2025
a2303b6
address issue with animation
panteliselef Jul 1, 2025
e0f8e1a
add more test cases
panteliselef Jul 1, 2025
1b75fe1
use box shadow instead of border
panteliselef Jul 1, 2025
a8db78f
Merge branch 'main' into elef/com-835-split-up-plandetails-and-subscr…
panteliselef Jul 1, 2025
3a0907c
remove unnecessary context
panteliselef Jul 1, 2025
1ddd06b
handle missing avatar url
panteliselef Jul 1, 2025
d84f755
add descriptors
panteliselef Jul 1, 2025
99f4342
Merge branch 'refs/heads/main' into elef/com-835-split-up-plandetails…
panteliselef Jul 2, 2025
aaf814c
add more descriptors
panteliselef Jul 2, 2025
55f1ba3
handle localizations
panteliselef Jul 2, 2025
962e8d5
fix issues from conflicts
panteliselef Jul 2, 2025
84528d0
finishing touches on subscription details
panteliselef Jul 2, 2025
dc926ab
add unit tests for PlanDetails
panteliselef Jul 2, 2025
79b3c79
remove old file
panteliselef Jul 2, 2025
958fdd9
replace experimental with internal apis
panteliselef Jul 2, 2025
c5dafc4
Update packages/types/src/clerk.ts
panteliselef Jul 2, 2025
bd9984f
address pr comments
panteliselef Jul 10, 2025
587f2b8
wip
panteliselef Jul 10, 2025
af6a28b
Revert "wip"
panteliselef Jul 13, 2025
1c161cc
address pr feedback
panteliselef Jul 13, 2025
0ed99f1
bump
panteliselef Jul 13, 2025
39100a9
wip subscription items
panteliselef Jul 13, 2025
7db88a9
Revert "wip subscription items"
panteliselef Jul 13, 2025
257a3cc
wip changeset
panteliselef Jul 13, 2025
3753dee
bundlewatch.config.json
panteliselef Jul 13, 2025
477d3f5
Merge branch 'refs/heads/main' into elef/com-835-split-up-plandetails…
panteliselef Jul 14, 2025
28d86b4
fix lint
panteliselef Jul 14, 2025
38fa5f6
fix build issue
panteliselef Jul 14, 2025
6a08920
Merge branch 'main' into elef/com-835-split-up-plandetails-and-subscr…
panteliselef Jul 14, 2025
5421403
patch tests
panteliselef Jul 14, 2025
9c5beac
fix changeset
panteliselef Jul 14, 2025
e0a74b6
Merge branch 'main' into elef/com-835-split-up-plandetails-and-subscr…
panteliselef Jul 14, 2025
6f01802
Merge branch 'main' into elef/com-835-split-up-plandetails-and-subscr…
panteliselef Jul 14, 2025
86de684
use line items
panteliselef Jul 14, 2025
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
8 changes: 8 additions & 0 deletions .changeset/tangy-toes-dress.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/clerk-react': minor
'@clerk/types': minor
---

Extract `SubscriptionDetails`, into its own internal component, out of existing (also internal) `PlanDetails` component.
6 changes: 3 additions & 3 deletions packages/clerk-js/bundlewatch.config.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"files": [
{ "path": "./dist/clerk.js", "maxSize": "614kB" },
{ "path": "./dist/clerk.js", "maxSize": "616kB" },
{ "path": "./dist/clerk.browser.js", "maxSize": "72.2KB" },
{ "path": "./dist/clerk.legacy.browser.js", "maxSize": "115KB" },
{ "path": "./dist/clerk.headless*.js", "maxSize": "55KB" },
{ "path": "./dist/ui-common*.js", "maxSize": "110KB" },
{ "path": "./dist/ui-common*.legacy.*.js", "maxSize": "113.72KB" },
{ "path": "./dist/ui-common*.js", "maxSize": "111KB" },
{ "path": "./dist/ui-common*.legacy.*.js", "maxSize": "115KB" },
{ "path": "./dist/vendors*.js", "maxSize": "40.2KB" },
{ "path": "./dist/coinbase*.js", "maxSize": "38KB" },
{ "path": "./dist/stripe-vendors*.js", "maxSize": "1KB" },
Expand Down
17 changes: 16 additions & 1 deletion packages/clerk-js/src/core/clerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import type {
__internal_ComponentNavigationContext,
__internal_OAuthConsentProps,
__internal_PlanDetailsProps,
__internal_SubscriptionDetailsProps,
__internal_UserVerificationModalProps,
APIKeysNamespace,
APIKeysProps,
Expand Down Expand Up @@ -602,7 +603,7 @@ export class Clerk implements ClerkInterface {
void this.#componentControls.ensureMounted().then(controls => controls.closeDrawer('checkout'));
};

public __internal_openPlanDetails = (props?: __internal_PlanDetailsProps): void => {
public __internal_openPlanDetails = (props: __internal_PlanDetailsProps): void => {
this.assertComponentsReady(this.#componentControls);
if (disabledBillingFeature(this, this.environment)) {
if (this.#instanceType === 'development') {
Expand All @@ -615,13 +616,27 @@ export class Clerk implements ClerkInterface {
void this.#componentControls
.ensureMounted({ preloadHint: 'PlanDetails' })
.then(controls => controls.openDrawer('planDetails', props || {}));

this.telemetry?.record(eventPrebuiltComponentOpened(`PlanDetails`, props));
};

public __internal_closePlanDetails = (): void => {
this.assertComponentsReady(this.#componentControls);
void this.#componentControls.ensureMounted().then(controls => controls.closeDrawer('planDetails'));
};

public __internal_openSubscriptionDetails = (props?: __internal_SubscriptionDetailsProps): void => {
this.assertComponentsReady(this.#componentControls);
void this.#componentControls
.ensureMounted({ preloadHint: 'SubscriptionDetails' })
.then(controls => controls.openDrawer('subscriptionDetails', props || {}));
};

public __internal_closeSubscriptionDetails = (): void => {
this.assertComponentsReady(this.#componentControls);
void this.#componentControls.ensureMounted().then(controls => controls.closeDrawer('subscriptionDetails'));
};

public __internal_openReverification = (props?: __internal_UserVerificationModalProps): void => {
this.assertComponentsReady(this.#componentControls);
if (noUserExists(this)) {
Expand Down
26 changes: 22 additions & 4 deletions packages/clerk-js/src/ui/Components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { createDeferredPromise } from '@clerk/shared/utils';
import type {
__internal_CheckoutProps,
__internal_PlanDetailsProps,
__internal_SubscriptionDetailsProps,
__internal_UserVerificationProps,
Appearance,
Clerk,
Expand Down Expand Up @@ -36,7 +37,7 @@ import {
UserVerificationModal,
WaitlistModal,
} from './lazyModules/components';
import { MountedCheckoutDrawer, MountedPlanDetailDrawer } from './lazyModules/drawers';
import { MountedCheckoutDrawer, MountedPlanDetailDrawer, MountedSubscriptionDetailDrawer } from './lazyModules/drawers';
import {
LazyComponentRenderer,
LazyImpersonationFabProvider,
Expand Down Expand Up @@ -106,16 +107,18 @@ export type ComponentControls = {
notify?: boolean;
},
) => void;
openDrawer: <T extends 'checkout' | 'planDetails'>(
openDrawer: <T extends 'checkout' | 'planDetails' | 'subscriptionDetails'>(
drawer: T,
props: T extends 'checkout'
? __internal_CheckoutProps
: T extends 'planDetails'
? __internal_PlanDetailsProps
: never,
: T extends 'subscriptionDetails'
? __internal_SubscriptionDetailsProps
: never,
) => void;
closeDrawer: (
drawer: 'checkout' | 'planDetails',
drawer: 'checkout' | 'planDetails' | 'subscriptionDetails',
options?: {
notify?: boolean;
},
Expand Down Expand Up @@ -160,6 +163,10 @@ interface ComponentsState {
open: false;
props: null | __internal_PlanDetailsProps;
};
subscriptionDetailsDrawer: {
open: false;
props: null | __internal_SubscriptionDetailsProps;
};
nodes: Map<HTMLDivElement, HtmlNodeOptions>;
impersonationFab: boolean;
}
Expand Down Expand Up @@ -249,6 +256,10 @@ const Components = (props: ComponentsProps) => {
open: false,
props: null,
},
subscriptionDetailsDrawer: {
open: false,
props: null,
},
nodes: new Map(),
impersonationFab: false,
});
Expand All @@ -265,6 +276,7 @@ const Components = (props: ComponentsProps) => {
blankCaptchaModal,
checkoutDrawer,
planDetailsDrawer,
subscriptionDetailsDrawer,
nodes,
} = state;

Expand Down Expand Up @@ -588,6 +600,12 @@ const Components = (props: ComponentsProps) => {
onOpenChange={() => componentsControls.closeDrawer('planDetails')}
/>

<MountedSubscriptionDetailDrawer
appearance={state.appearance}
subscriptionDetailsDrawer={subscriptionDetailsDrawer}
onOpenChange={() => componentsControls.closeDrawer('subscriptionDetails')}
/>

{state.impersonationFab && (
<LazyImpersonationFabProvider globalAppearance={state.appearance}>
<ImpersonationFab />
Expand Down
Loading
Loading