Skip to content

Commit 74787c4

Browse files
authored
Merge branch 'main' into elef/improve-commerce-scenario-coverage
2 parents 9014625 + 9332d94 commit 74787c4

18 files changed

Lines changed: 379 additions & 259 deletions

File tree

.changeset/dry-streets-jog.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
'@clerk/types': patch
4+
---
5+
6+
Get `payment_method_order` for Stripe payment elements from backend
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

.changeset/slow-hats-drum.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/clerk-expo': minor
3+
---
4+
5+
Default token cache `SecureStore` implementation `keychainAccessible` to `AFTER_FIRST_UNLOCK` createResourceCacheStore to align with createTokenCache - The data in the keychain item cannot be accessed after a restart until the device has been unlocked once by the user. This may be useful if you need to access the item when the device is locked.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"@testing-library/user-event": "^14.5.2",
8080
"@types/cross-spawn": "^6.0.6",
8181
"@types/jest": "^29.3.1",
82-
"@types/node": "^22.15.21",
82+
"@types/node": "^22.15.24",
8383
"@types/react": "catalog:react",
8484
"@types/react-dom": "catalog:react",
8585
"@vitest/coverage-v8": "3.0.2",
@@ -132,7 +132,7 @@
132132
"tsup": "catalog:repo",
133133
"turbo": "^2.5.3",
134134
"turbo-ignore": "^2.5.3",
135-
"typedoc": "0.28.4",
135+
"typedoc": "0.28.5",
136136
"typedoc-plugin-markdown": "4.6.3",
137137
"typedoc-plugin-replace-text": "4.2.0",
138138
"typescript": "catalog:repo",

packages/backend/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@
115115
},
116116
"devDependencies": {
117117
"@edge-runtime/vm": "5.0.0",
118-
"msw": "2.8.4",
118+
"msw": "2.8.7",
119119
"npm-run-all": "^4.1.5",
120-
"svix": "^1.65.0",
120+
"svix": "^1.66.0",
121121
"vitest-environment-miniflare": "2.14.4"
122122
},
123123
"peerDependencies": {

packages/clerk-js/src/core/resources/CommercePaymentSource.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export class CommercePaymentSource extends BaseResource implements CommercePayme
7474
export class CommerceInitializedPaymentSource extends BaseResource implements CommerceInitializedPaymentSourceResource {
7575
externalClientSecret!: string;
7676
externalGatewayId!: string;
77+
paymentMethodOrder!: string[];
7778

7879
constructor(data: CommerceInitializedPaymentSourceJSON) {
7980
super();
@@ -87,7 +88,7 @@ export class CommerceInitializedPaymentSource extends BaseResource implements Co
8788

8889
this.externalClientSecret = data.external_client_secret;
8990
this.externalGatewayId = data.external_gateway_id;
90-
91+
this.paymentMethodOrder = data.payment_method_order;
9192
return this;
9293
}
9394
}

packages/clerk-js/src/ui/components/PaymentSources/AddPaymentSource.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const usePaymentSourceUtils = () => {
4141

4242
const externalGatewayId = initializedPaymentSource?.externalGatewayId;
4343
const externalClientSecret = initializedPaymentSource?.externalClientSecret;
44+
const paymentMethodOrder = initializedPaymentSource?.paymentMethodOrder;
4445
const stripePublishableKey = commerceSettings.billing.stripePublishableKey;
4546

4647
const { data: stripe } = useSWR(
@@ -65,13 +66,14 @@ const usePaymentSourceUtils = () => {
6566
stripe,
6667
initializePaymentSource,
6768
externalClientSecret,
69+
paymentMethodOrder,
6870
};
6971
};
7072

7173
const [AddPaymentSourceContext, useAddPaymentSourceContext] = createContextAndHook<any>('AddPaymentSourceRoot');
7274

7375
const AddPaymentSourceRoot = ({ children, ...rest }: PropsWithChildren<AddPaymentSourceProps>) => {
74-
const { initializePaymentSource, externalClientSecret, stripe } = usePaymentSourceUtils();
76+
const { initializePaymentSource, externalClientSecret, stripe, paymentMethodOrder } = usePaymentSourceUtils();
7577
const [headerTitle, setHeaderTitle] = useState<LocalizationKey | undefined>(undefined);
7678
const [headerSubtitle, setHeaderSubtitle] = useState<LocalizationKey | undefined>(undefined);
7779
const [submitLabel, setSubmitLabel] = useState<LocalizationKey | undefined>(undefined);
@@ -93,6 +95,7 @@ const AddPaymentSourceRoot = ({ children, ...rest }: PropsWithChildren<AddPaymen
9395
initializePaymentSource,
9496
externalClientSecret,
9597
stripe,
98+
paymentMethodOrder,
9699
...rest,
97100
},
98101
}}
@@ -212,8 +215,16 @@ const FormButton = ({ text }: { text: LocalizationKey }) => {
212215
};
213216

214217
const AddPaymentSourceForm = ({ children }: PropsWithChildren) => {
215-
const { headerTitle, headerSubtitle, submitLabel, checkout, initializePaymentSource, onSuccess, cancelAction } =
216-
useAddPaymentSourceContext();
218+
const {
219+
headerTitle,
220+
headerSubtitle,
221+
submitLabel,
222+
checkout,
223+
initializePaymentSource,
224+
onSuccess,
225+
cancelAction,
226+
paymentMethodOrder,
227+
} = useAddPaymentSourceContext();
217228
const [isPaymentElementReady, setIsPaymentElementReady] = useState(false);
218229
const stripe = useStripe();
219230
const card = useCardState();
@@ -273,7 +284,7 @@ const AddPaymentSourceForm = ({ children }: PropsWithChildren) => {
273284
defaultCollapsed: false,
274285
},
275286
// TODO(@COMMERCE): Should this be fetched from the fapi?
276-
paymentMethodOrder: ['card', 'apple_pay', 'google_pay'],
287+
paymentMethodOrder: paymentMethodOrder || ['card'],
277288
applePay: checkout
278289
? {
279290
recurringPaymentRequest: {

packages/elements/examples/nextjs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"react-dom": "18.3.1"
2323
},
2424
"devDependencies": {
25-
"@types/node": "^18.19.103",
25+
"@types/node": "^18.19.105",
2626
"@types/react": "catalog:react",
2727
"@types/react-dom": "catalog:react",
2828
"autoprefixer": "^10.4.21",

packages/expo/src/resource-cache/__tests__/secure-store.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ vi.mock('expo-secure-store', () => {
2929
setItemAsync: mocks.setItemAsync,
3030
getItemAsync: mocks.getItemAsync,
3131
deleteItemAsync: mocks.deleteItemAsync,
32+
AFTER_FIRST_UNLOCK: 0,
3233
};
3334
});
3435

packages/expo/src/resource-cache/resource-cache.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,18 @@ export const createResourceCacheStore = (): IStorage => {
3131
let queue: KeyValuePair[] = [];
3232
let isProcessing = false;
3333

34-
const setItem = SecureStore.setItemAsync;
35-
const getItem = SecureStore.getItemAsync;
36-
const deleteItem = SecureStore.deleteItemAsync;
34+
const secureStoreOpts: SecureStore.SecureStoreOptions = {
35+
/**
36+
* The data in the keychain item cannot be accessed after a restart until the
37+
* device has been unlocked once by the user.
38+
*
39+
* This may be useful if you need to access the item when the phone is locked.
40+
*/
41+
keychainAccessible: SecureStore.AFTER_FIRST_UNLOCK,
42+
};
43+
const setItem = (key: string, value: string) => SecureStore.setItemAsync(key, value, secureStoreOpts);
44+
const getItem = (key: string) => SecureStore.getItemAsync(key, secureStoreOpts);
45+
const deleteItem = (key: string) => SecureStore.deleteItemAsync(key, secureStoreOpts);
3746

3847
const set = (key: string, value: string): Promise<void> => {
3948
queue.push({ key, value });

0 commit comments

Comments
 (0)