Skip to content

Commit 4f90ce0

Browse files
authored
fix(clerk-js): Implement fixes from core-3 merge of Solana feature (#7500)
Signed-off-by: Kenton Duprey <[email protected]>
1 parent 85fea1d commit 4f90ce0

File tree

8 files changed

+72
-18
lines changed

8 files changed

+72
-18
lines changed

.changeset/tame-icons-know.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -469,13 +469,28 @@ export class SignIn extends BaseResource implements SignInResource {
469469
});
470470
};
471471

472-
public authenticateWithSolana = async (params: SignInAuthenticateWithSolanaParams): Promise<SignInResource> => {
473-
const identifier = await getSolanaIdentifier(params.walletName);
472+
/**
473+
* Authenticates a user using a Solana Web3 wallet during sign-in.
474+
*
475+
* @param params - Configuration for Solana authentication
476+
* @param params.walletName - The name of the Solana wallet to use for authentication
477+
* @returns A promise that resolves to the updated SignIn resource
478+
* @throws {ClerkRuntimeError} If walletName is not provided or wallet connection fails
479+
*
480+
* @example
481+
* ```typescript
482+
* await signIn.authenticateWithSolana({ walletName: 'phantom' });
483+
* ```
484+
*/
485+
public authenticateWithSolana = async ({
486+
walletName,
487+
}: SignInAuthenticateWithSolanaParams): Promise<SignInResource> => {
488+
const identifier = await getSolanaIdentifier(walletName);
474489
return this.authenticateWithWeb3({
475490
identifier,
476-
generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }),
491+
generateSignature: p => generateSignatureWithSolana({ ...p, walletName }),
477492
strategy: 'web3_solana_signature',
478-
walletName: params.walletName,
493+
walletName,
479494
});
480495
};
481496

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

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,15 +366,37 @@ export class SignUp extends BaseResource implements SignUpResource {
366366
});
367367
};
368368

369-
public authenticateWithSolana = async (params: SignUpAuthenticateWithSolanaParams): Promise<SignUpResource> => {
370-
const identifier = await getSolanaIdentifier(params.walletName);
369+
/**
370+
* Authenticates a user using a Solana Web3 wallet during sign-up.
371+
*
372+
* @param params - Configuration for Solana authentication
373+
* @param params.walletName - The name of the Solana wallet to use (e.g., 'phantom')
374+
* @param params.unsafeMetadata - Optional unsafe metadata to attach to the user
375+
* @param params.legalAccepted - Optional flag indicating legal terms acceptance
376+
* @returns A promise that resolves to the updated SignUp resource
377+
* @throws {ClerkRuntimeError} If wallet connection fails
378+
*
379+
* @example
380+
* ```typescript
381+
* await signUp.authenticateWithSolana({
382+
* walletName: 'phantom',
383+
* legalAccepted: true
384+
* });
385+
* ```
386+
*/
387+
public authenticateWithSolana = async ({
388+
walletName,
389+
unsafeMetadata,
390+
legalAccepted,
391+
}: SignUpAuthenticateWithSolanaParams): Promise<SignUpResource> => {
392+
const identifier = await getSolanaIdentifier(walletName);
371393
return this.authenticateWithWeb3({
372394
identifier,
373-
generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }),
374-
unsafeMetadata: params?.unsafeMetadata,
395+
generateSignature: p => generateSignatureWithSolana({ ...p, walletName }),
396+
unsafeMetadata,
375397
strategy: 'web3_solana_signature',
376-
legalAccepted: params?.legalAccepted,
377-
walletName: params.walletName,
398+
legalAccepted,
399+
walletName,
378400
});
379401
};
380402

packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Header } from '@/ui/elements/Header';
1010
import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler';
1111

1212
const Web3SolanaWalletButtons = lazy(() =>
13-
import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
13+
import(/* webpackChunkName: "web3-solana-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
1414
default: m.Web3SolanaWalletButtons,
1515
})),
1616
);
@@ -67,7 +67,7 @@ const SignInFactorOneSolanaWalletsCardInner = () => {
6767
customNavigate: router.navigate,
6868
redirectUrl: ctx.afterSignInUrl || '/',
6969
secondFactorUrl: 'factor-two',
70-
signUpContinueUrl: ctx.isCombinedFlow ? '../create/continue' : ctx.signUpContinueUrl,
70+
signUpContinueUrl: ctx.isCombinedFlow ? 'create/continue' : ctx.signUpContinueUrl,
7171
strategy: 'web3_solana_signature',
7272
walletName,
7373
})

packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Header } from '@/ui/elements/Header';
1010
import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler';
1111

1212
const Web3SolanaWalletButtons = lazy(() =>
13-
import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
13+
import(/* webpackChunkName: "web3-solana-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
1414
default: m.Web3SolanaWalletButtons,
1515
})),
1616
);
@@ -66,7 +66,7 @@ const SignUpStartSolanaWalletsCardInner = () => {
6666
.authenticateWithWeb3({
6767
customNavigate: router.navigate,
6868
redirectUrl: ctx.afterSignUpUrl || '/',
69-
signUpContinueUrl: '../continue',
69+
signUpContinueUrl: 'continue',
7070
strategy: 'web3_solana_signature',
7171
unsafeMetadata: ctx.unsafeMetadata,
7272
walletName,

packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ClerkRuntimeError } from '@clerk/shared/error';
12
import type { Web3Strategy } from '@clerk/shared/types';
23
import { lazy, Suspense } from 'react';
34

@@ -6,11 +7,12 @@ import { useCardState } from '@/ui/elements/contexts';
67
import { Form } from '@/ui/elements/Form';
78
import { FormButtonContainer } from '@/ui/elements/FormButtons';
89
import { FormContainer } from '@/ui/elements/FormContainer';
10+
import { handleError } from '@/ui/utils/errorHandler';
911

1012
import { Button, descriptors, Flex, localizationKeys, Spinner } from '../../customizables';
1113

1214
const Web3SolanaWalletButtons = lazy(() =>
13-
import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
15+
import(/* webpackChunkName: "web3-solana-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
1416
default: m.Web3SolanaWalletButtons,
1517
})),
1618
);
@@ -30,9 +32,15 @@ export const Web3SelectSolanaWalletScreen = ({ onConnect }: Web3SelectWalletProp
3032
card.setIdle();
3133
} catch (err) {
3234
card.setIdle();
33-
console.error(err);
34-
} finally {
35-
close();
35+
if (err instanceof Error) {
36+
handleError(err, [], card.setError);
37+
} else {
38+
const error = new ClerkRuntimeError('An error occurred while generating the Solana signature.', {
39+
code: 'web3_solana_signature_generation_failed',
40+
cause: err instanceof Error ? err : undefined,
41+
});
42+
handleError(error, [], card.setError);
43+
}
3644
}
3745
};
3846

@@ -65,6 +73,7 @@ export const Web3SelectSolanaWalletScreen = ({ onConnect }: Web3SelectWalletProp
6573
</Suspense>
6674
<FormButtonContainer>
6775
<Button
76+
type='button'
6877
variant='ghost'
6978
onClick={() => {
7079
close();

packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ const WalletButtonIcon = forwardRef((props: WalletButtonProps, ref: Ref<HTMLButt
177177
return (
178178
<Button
179179
ref={ref}
180+
aria-label={label}
180181
textVariant='buttonLarge'
181182
variant='outline'
182183
colorScheme='neutral'

packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@ import type { Wallet } from '@wallet-standard/core';
55

66
class InjectedWeb3SolanaProviders {
77
#wallets: readonly Wallet[] | undefined = undefined;
8+
#initialized: boolean = false;
89
static #instance: InjectedWeb3SolanaProviders | null = null;
910

1011
private constructor() {}
1112

1213
async #initialize() {
14+
if (this.#initialized) {
15+
return;
16+
}
17+
this.#initialized = true;
1318
const wallets = await import('@wallet-standard/core').then(mod => mod.getWallets());
1419
this.#wallets = wallets.get();
1520

0 commit comments

Comments
 (0)