@b3dotfun/sdk 0.1.69-test.0 → 0.1.70-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/anyspend/react/components/AnySpend.d.ts +2 -0
- package/dist/cjs/anyspend/react/components/AnySpend.js +12 -4
- package/dist/cjs/anyspend/react/components/AnySpendCollectorClubPurchase.d.ts +5 -1
- package/dist/cjs/anyspend/react/components/AnySpendCollectorClubPurchase.js +2 -2
- package/dist/cjs/anyspend/react/components/AnySpendCustom.d.ts +2 -0
- package/dist/cjs/anyspend/react/components/AnySpendCustom.js +7 -3
- package/dist/cjs/anyspend/react/components/AnySpendDeposit.d.ts +3 -1
- package/dist/cjs/anyspend/react/components/AnySpendDeposit.js +3 -3
- package/dist/cjs/anyspend/react/components/AnySpendNFT.d.ts +3 -1
- package/dist/cjs/anyspend/react/components/AnySpendNFT.js +2 -2
- package/dist/cjs/anyspend/react/components/AnySpendStakeUpside.d.ts +3 -1
- package/dist/cjs/anyspend/react/components/AnySpendStakeUpside.js +2 -2
- package/dist/cjs/anyspend/react/components/checkout/AnySpendCheckout.js +6 -5
- package/dist/cjs/anyspend/react/components/checkout/CartItemRow.d.ts +2 -1
- package/dist/cjs/anyspend/react/components/checkout/CartSummary.d.ts +6 -4
- package/dist/cjs/anyspend/react/components/checkout/CartSummary.js +13 -11
- package/dist/cjs/anyspend/react/components/checkout/CheckoutCartPanel.d.ts +3 -1
- package/dist/cjs/anyspend/react/components/checkout/CheckoutCartPanel.js +5 -4
- package/dist/cjs/anyspend/react/components/checkout/CheckoutFormPanel.d.ts +3 -1
- package/dist/cjs/anyspend/react/components/checkout/CheckoutFormPanel.js +2 -2
- package/dist/cjs/anyspend/react/components/checkout/DiscountCodeInput.d.ts +3 -1
- package/dist/cjs/anyspend/react/components/checkout/DiscountCodeInput.js +3 -6
- package/dist/cjs/anyspend/react/components/checkout/PriceSkeleton.d.ts +5 -0
- package/dist/cjs/anyspend/react/components/checkout/PriceSkeleton.js +9 -0
- package/dist/cjs/anyspend/react/components/checkout/ShippingSelector.d.ts +3 -1
- package/dist/cjs/anyspend/react/components/checkout/ShippingSelector.js +3 -2
- package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +3 -1
- package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +5 -1
- package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.js +2 -1
- package/dist/cjs/global-account/react/components/B3Provider/B3Provider.d.ts +17 -1
- package/dist/cjs/global-account/react/components/B3Provider/B3Provider.js +3 -2
- package/dist/cjs/global-account/react/components/B3Provider/BetterAuthClientProvider.d.ts +17 -0
- package/dist/cjs/global-account/react/components/B3Provider/BetterAuthClientProvider.js +31 -0
- package/dist/cjs/global-account/react/components/B3Provider/BetterAuthProvider.js +6 -5
- package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.js +4 -2
- package/dist/cjs/global-account/react/components/ManageAccount/Header.js +36 -4
- package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.js +4 -1
- package/dist/cjs/global-account/react/components/ManageAccount/ManageAccount.js +6 -0
- package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +5 -3
- package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +3 -1
- package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +25 -14
- package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthResetPassword.js +3 -2
- package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +6 -1
- package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +15 -5
- package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthVerifyEmail.d.ts +37 -0
- package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthVerifyEmail.js +85 -0
- package/dist/cjs/global-account/react/components/SignInWithB3/SignIn.js +14 -4
- package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.d.ts +1 -1
- package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +2 -2
- package/dist/cjs/global-account/react/components/SignInWithB3/components/PasswordInput.d.ts +10 -0
- package/dist/cjs/global-account/react/components/SignInWithB3/components/PasswordInput.js +10 -0
- package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +3 -1
- package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +8 -5
- package/dist/cjs/global-account/react/components/UserAvatar/UserAvatar.d.ts +18 -0
- package/dist/cjs/global-account/react/components/UserAvatar/UserAvatar.js +27 -0
- package/dist/cjs/global-account/react/components/index.d.ts +3 -0
- package/dist/cjs/global-account/react/components/index.js +10 -3
- package/dist/cjs/global-account/react/hooks/useBetterAuth.d.ts +1 -1
- package/dist/cjs/global-account/react/hooks/useBetterAuth.js +19 -17
- package/dist/cjs/global-account/react/stores/useModalStore.d.ts +4 -0
- package/dist/cjs/shared/constants/index.d.ts +1 -0
- package/dist/cjs/shared/constants/index.js +2 -1
- package/dist/esm/anyspend/react/components/AnySpend.d.ts +2 -0
- package/dist/esm/anyspend/react/components/AnySpend.js +12 -4
- package/dist/esm/anyspend/react/components/AnySpendCollectorClubPurchase.d.ts +5 -1
- package/dist/esm/anyspend/react/components/AnySpendCollectorClubPurchase.js +2 -2
- package/dist/esm/anyspend/react/components/AnySpendCustom.d.ts +2 -0
- package/dist/esm/anyspend/react/components/AnySpendCustom.js +7 -3
- package/dist/esm/anyspend/react/components/AnySpendDeposit.d.ts +3 -1
- package/dist/esm/anyspend/react/components/AnySpendDeposit.js +3 -3
- package/dist/esm/anyspend/react/components/AnySpendNFT.d.ts +3 -1
- package/dist/esm/anyspend/react/components/AnySpendNFT.js +2 -2
- package/dist/esm/anyspend/react/components/AnySpendStakeUpside.d.ts +3 -1
- package/dist/esm/anyspend/react/components/AnySpendStakeUpside.js +2 -2
- package/dist/esm/anyspend/react/components/checkout/AnySpendCheckout.js +6 -5
- package/dist/esm/anyspend/react/components/checkout/CartItemRow.d.ts +2 -1
- package/dist/esm/anyspend/react/components/checkout/CartSummary.d.ts +6 -4
- package/dist/esm/anyspend/react/components/checkout/CartSummary.js +13 -11
- package/dist/esm/anyspend/react/components/checkout/CheckoutCartPanel.d.ts +3 -1
- package/dist/esm/anyspend/react/components/checkout/CheckoutCartPanel.js +5 -4
- package/dist/esm/anyspend/react/components/checkout/CheckoutFormPanel.d.ts +3 -1
- package/dist/esm/anyspend/react/components/checkout/CheckoutFormPanel.js +2 -2
- package/dist/esm/anyspend/react/components/checkout/DiscountCodeInput.d.ts +3 -1
- package/dist/esm/anyspend/react/components/checkout/DiscountCodeInput.js +3 -6
- package/dist/esm/anyspend/react/components/checkout/PriceSkeleton.d.ts +5 -0
- package/dist/esm/anyspend/react/components/checkout/PriceSkeleton.js +6 -0
- package/dist/esm/anyspend/react/components/checkout/ShippingSelector.d.ts +3 -1
- package/dist/esm/anyspend/react/components/checkout/ShippingSelector.js +3 -2
- package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +3 -1
- package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +5 -1
- package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.js +2 -1
- package/dist/esm/global-account/react/components/B3Provider/B3Provider.d.ts +17 -1
- package/dist/esm/global-account/react/components/B3Provider/B3Provider.js +3 -2
- package/dist/esm/global-account/react/components/B3Provider/BetterAuthClientProvider.d.ts +17 -0
- package/dist/esm/global-account/react/components/B3Provider/BetterAuthClientProvider.js +27 -0
- package/dist/esm/global-account/react/components/B3Provider/BetterAuthProvider.js +4 -3
- package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.js +5 -3
- package/dist/esm/global-account/react/components/ManageAccount/Header.js +37 -5
- package/dist/esm/global-account/react/components/ManageAccount/HomeContent.js +4 -1
- package/dist/esm/global-account/react/components/ManageAccount/ManageAccount.js +7 -1
- package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +6 -4
- package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +5 -3
- package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +25 -14
- package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthResetPassword.js +4 -3
- package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +6 -1
- package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +16 -6
- package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthVerifyEmail.d.ts +37 -0
- package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthVerifyEmail.js +82 -0
- package/dist/esm/global-account/react/components/SignInWithB3/SignIn.js +15 -5
- package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.d.ts +1 -1
- package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +2 -2
- package/dist/esm/global-account/react/components/SignInWithB3/components/PasswordInput.d.ts +10 -0
- package/dist/esm/global-account/react/components/SignInWithB3/components/PasswordInput.js +7 -0
- package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +3 -1
- package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +8 -5
- package/dist/esm/global-account/react/components/UserAvatar/UserAvatar.d.ts +18 -0
- package/dist/esm/global-account/react/components/UserAvatar/UserAvatar.js +21 -0
- package/dist/esm/global-account/react/components/index.d.ts +3 -0
- package/dist/esm/global-account/react/components/index.js +4 -0
- package/dist/esm/global-account/react/hooks/useBetterAuth.d.ts +1 -1
- package/dist/esm/global-account/react/hooks/useBetterAuth.js +12 -10
- package/dist/esm/global-account/react/stores/useModalStore.d.ts +4 -0
- package/dist/esm/shared/constants/index.d.ts +1 -0
- package/dist/esm/shared/constants/index.js +1 -0
- package/dist/styles/index.css +1 -1
- package/dist/types/anyspend/react/components/AnySpend.d.ts +2 -0
- package/dist/types/anyspend/react/components/AnySpendCollectorClubPurchase.d.ts +5 -1
- package/dist/types/anyspend/react/components/AnySpendCustom.d.ts +2 -0
- package/dist/types/anyspend/react/components/AnySpendDeposit.d.ts +3 -1
- package/dist/types/anyspend/react/components/AnySpendNFT.d.ts +3 -1
- package/dist/types/anyspend/react/components/AnySpendStakeUpside.d.ts +3 -1
- package/dist/types/anyspend/react/components/checkout/CartItemRow.d.ts +2 -1
- package/dist/types/anyspend/react/components/checkout/CartSummary.d.ts +6 -4
- package/dist/types/anyspend/react/components/checkout/CheckoutCartPanel.d.ts +3 -1
- package/dist/types/anyspend/react/components/checkout/CheckoutFormPanel.d.ts +3 -1
- package/dist/types/anyspend/react/components/checkout/DiscountCodeInput.d.ts +3 -1
- package/dist/types/anyspend/react/components/checkout/PriceSkeleton.d.ts +5 -0
- package/dist/types/anyspend/react/components/checkout/ShippingSelector.d.ts +3 -1
- package/dist/types/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +5 -1
- package/dist/types/global-account/react/components/B3Provider/B3Provider.d.ts +17 -1
- package/dist/types/global-account/react/components/B3Provider/BetterAuthClientProvider.d.ts +17 -0
- package/dist/types/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +6 -1
- package/dist/types/global-account/react/components/SignInWithB3/BetterAuthVerifyEmail.d.ts +37 -0
- package/dist/types/global-account/react/components/SignInWithB3/SignInWithB3Flow.d.ts +1 -1
- package/dist/types/global-account/react/components/SignInWithB3/components/PasswordInput.d.ts +10 -0
- package/dist/types/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +3 -1
- package/dist/types/global-account/react/components/UserAvatar/UserAvatar.d.ts +18 -0
- package/dist/types/global-account/react/components/index.d.ts +3 -0
- package/dist/types/global-account/react/hooks/useBetterAuth.d.ts +1 -1
- package/dist/types/global-account/react/stores/useModalStore.d.ts +4 -0
- package/dist/types/shared/constants/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/anyspend/react/components/AnySpend.tsx +24 -12
- package/src/anyspend/react/components/AnySpendCollectorClubPurchase.tsx +6 -0
- package/src/anyspend/react/components/AnySpendCustom.tsx +12 -2
- package/src/anyspend/react/components/AnySpendDeposit.tsx +38 -31
- package/src/anyspend/react/components/AnySpendNFT.tsx +4 -0
- package/src/anyspend/react/components/AnySpendStakeUpside.tsx +4 -0
- package/src/anyspend/react/components/checkout/AnySpendCheckout.tsx +10 -4
- package/src/anyspend/react/components/checkout/CartItemRow.tsx +2 -1
- package/src/anyspend/react/components/checkout/CartSummary.tsx +24 -20
- package/src/anyspend/react/components/checkout/CheckoutCartPanel.tsx +12 -3
- package/src/anyspend/react/components/checkout/CheckoutFormPanel.tsx +5 -0
- package/src/anyspend/react/components/checkout/DiscountCodeInput.tsx +15 -5
- package/src/anyspend/react/components/checkout/PriceSkeleton.tsx +19 -0
- package/src/anyspend/react/components/checkout/ShippingSelector.tsx +5 -1
- package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +3 -1
- package/src/global-account/react/components/B3Provider/B3ConfigProvider.tsx +6 -0
- package/src/global-account/react/components/B3Provider/B3Provider.tsx +36 -15
- package/src/global-account/react/components/B3Provider/BetterAuthClientProvider.tsx +40 -0
- package/src/global-account/react/components/B3Provider/BetterAuthProvider.tsx +4 -3
- package/src/global-account/react/components/ManageAccount/BottomNavigation.tsx +18 -14
- package/src/global-account/react/components/ManageAccount/Header.tsx +71 -4
- package/src/global-account/react/components/ManageAccount/HomeContent.tsx +25 -19
- package/src/global-account/react/components/ManageAccount/ManageAccount.tsx +13 -0
- package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +14 -7
- package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +15 -32
- package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +29 -20
- package/src/global-account/react/components/SignInWithB3/BetterAuthResetPassword.tsx +6 -7
- package/src/global-account/react/components/SignInWithB3/BetterAuthSignIn.tsx +27 -7
- package/src/global-account/react/components/SignInWithB3/BetterAuthVerifyEmail.tsx +155 -0
- package/src/global-account/react/components/SignInWithB3/SignIn.tsx +42 -13
- package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +8 -1
- package/src/global-account/react/components/SignInWithB3/components/PasswordInput.tsx +62 -0
- package/src/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.tsx +13 -6
- package/src/global-account/react/components/UserAvatar/UserAvatar.tsx +45 -0
- package/src/global-account/react/components/index.ts +9 -0
- package/src/global-account/react/hooks/useBetterAuth.ts +12 -10
- package/src/global-account/react/stores/useModalStore.ts +4 -0
- package/src/shared/constants/index.ts +2 -0
|
@@ -47,6 +47,8 @@ function AvatarEditor({ onSetAvatar, className }) {
|
|
|
47
47
|
const { user, setUser } = (0, react_1.useAuthentication)(partnerId);
|
|
48
48
|
const setB3ModalContentType = (0, stores_1.useModalStore)(state => state.setB3ModalContentType);
|
|
49
49
|
const contentType = (0, stores_1.useModalStore)(state => state.contentType);
|
|
50
|
+
const { authStrategy } = (0, react_1.useB3Config)();
|
|
51
|
+
const isBetterAuth = authStrategy === "better-auth";
|
|
50
52
|
const account = (0, react_3.useActiveAccount)();
|
|
51
53
|
const { data: profile, refetch: refreshProfile } = (0, react_1.useProfile)({
|
|
52
54
|
address: account?.address,
|
|
@@ -124,7 +126,7 @@ function AvatarEditor({ onSetAvatar, className }) {
|
|
|
124
126
|
setCroppedAreaPixels(null);
|
|
125
127
|
};
|
|
126
128
|
const handleSaveChanges = async () => {
|
|
127
|
-
if (!account?.address) {
|
|
129
|
+
if (!isBetterAuth && !account?.address) {
|
|
128
130
|
react_1.toast.error("No account connected");
|
|
129
131
|
return;
|
|
130
132
|
}
|
|
@@ -15,8 +15,10 @@ export interface B3ConfigContextType {
|
|
|
15
15
|
stripePublishableKey?: string;
|
|
16
16
|
createClientReferenceId?: (params: CreateOrderParams | CreateOnrampOrderParams) => Promise<string>;
|
|
17
17
|
authStrategy: AuthStrategy;
|
|
18
|
+
/** Override the API base URL for all auth operations (Better Auth client, Feathers JWT exchange). */
|
|
19
|
+
apiUrl?: string;
|
|
18
20
|
}
|
|
19
|
-
export declare function B3ConfigProvider({ children, accountOverride, environment, defaultPermissions, automaticallySetFirstEoa, theme, clientType, partnerId, stripePublishableKey, createClientReferenceId, authStrategy, }: {
|
|
21
|
+
export declare function B3ConfigProvider({ children, accountOverride, environment, defaultPermissions, automaticallySetFirstEoa, theme, clientType, partnerId, stripePublishableKey, createClientReferenceId, authStrategy, apiUrl, }: {
|
|
20
22
|
children: React.ReactNode;
|
|
21
23
|
accountOverride?: Account;
|
|
22
24
|
environment?: "development" | "production";
|
|
@@ -28,5 +30,7 @@ export declare function B3ConfigProvider({ children, accountOverride, environmen
|
|
|
28
30
|
stripePublishableKey?: string;
|
|
29
31
|
createClientReferenceId?: (params: CreateOrderParams | CreateOnrampOrderParams) => Promise<string>;
|
|
30
32
|
authStrategy?: AuthStrategy;
|
|
33
|
+
/** Override the API base URL for all auth operations (Better Auth client, Feathers JWT exchange). */
|
|
34
|
+
apiUrl?: string;
|
|
31
35
|
}): import("react/jsx-runtime").JSX.Element;
|
|
32
36
|
export declare function useB3Config(): B3ConfigContextType;
|
|
@@ -14,7 +14,7 @@ const DEFAULT_PERMISSIONS = {
|
|
|
14
14
|
endDate: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365), // 1 year from now
|
|
15
15
|
};
|
|
16
16
|
const B3ConfigContext = (0, react_1.createContext)(null);
|
|
17
|
-
function B3ConfigProvider({ children, accountOverride, environment = "development", defaultPermissions = DEFAULT_PERMISSIONS, automaticallySetFirstEoa = false, theme = "light", clientType = "rest", partnerId, stripePublishableKey, createClientReferenceId, authStrategy = "thirdweb", }) {
|
|
17
|
+
function B3ConfigProvider({ children, accountOverride, environment = "development", defaultPermissions = DEFAULT_PERMISSIONS, automaticallySetFirstEoa = false, theme = "light", clientType = "rest", partnerId, stripePublishableKey, createClientReferenceId, authStrategy = "thirdweb", apiUrl, }) {
|
|
18
18
|
return ((0, jsx_runtime_1.jsx)(B3ConfigContext.Provider, { value: {
|
|
19
19
|
accountOverride,
|
|
20
20
|
environment,
|
|
@@ -26,6 +26,7 @@ function B3ConfigProvider({ children, accountOverride, environment = "developmen
|
|
|
26
26
|
stripePublishableKey,
|
|
27
27
|
createClientReferenceId,
|
|
28
28
|
authStrategy,
|
|
29
|
+
apiUrl,
|
|
29
30
|
}, children: children }));
|
|
30
31
|
}
|
|
31
32
|
function useB3Config() {
|
|
@@ -10,7 +10,7 @@ import { ClientType } from "../../../client-manager";
|
|
|
10
10
|
/**
|
|
11
11
|
* Main B3Provider component
|
|
12
12
|
*/
|
|
13
|
-
export declare function B3Provider({ theme, children, accountOverride, environment, automaticallySetFirstEoa, defaultEoaProvider, simDuneApiKey, toaster: _toaster, clientType, rpcUrls, partnerId, stripePublishableKey, onConnect, onLogout, connectors, overrideDefaultConnectors, createClientReferenceId, defaultPermissions, disableBSMNTAuthentication, queryClient, authStrategy, }: {
|
|
13
|
+
export declare function B3Provider({ theme, children, accountOverride, environment, automaticallySetFirstEoa, defaultEoaProvider, simDuneApiKey, toaster: _toaster, clientType, rpcUrls, partnerId, stripePublishableKey, onConnect, onLogout, connectors, overrideDefaultConnectors, createClientReferenceId, defaultPermissions, disableBSMNTAuthentication, queryClient, authStrategy, apiUrl, }: {
|
|
14
14
|
theme: "light" | "dark";
|
|
15
15
|
children: React.ReactNode;
|
|
16
16
|
accountOverride?: Account;
|
|
@@ -39,4 +39,20 @@ export declare function B3Provider({ theme, children, accountOverride, environme
|
|
|
39
39
|
queryClient?: QueryClient;
|
|
40
40
|
/** Auth strategy: "thirdweb" (default, ecosystem wallet) or "better-auth" (email/password via Better Auth) */
|
|
41
41
|
authStrategy?: AuthStrategy;
|
|
42
|
+
/**
|
|
43
|
+
* Override the API base URL for Better Auth operations.
|
|
44
|
+
*
|
|
45
|
+
* When set, the Better Auth client (signIn, signUp, signOut, getSession) will
|
|
46
|
+
* target this URL instead of the default `B3_API_URL` / `NEXT_PUBLIC_B3_API`.
|
|
47
|
+
*
|
|
48
|
+
* Useful for local development where the frontend runs on localhost:3003 and
|
|
49
|
+
* the b3-api runs on localhost:3031 — keeps the entire OAuth flow local so
|
|
50
|
+
* sessions, cookies, and token exchange all hit the same server.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```tsx
|
|
54
|
+
* <B3Provider apiUrl="http://localhost:3031" ... />
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
apiUrl?: string;
|
|
42
58
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -16,6 +16,7 @@ const StyleRoot_1 = require("../StyleRoot");
|
|
|
16
16
|
const index_1 = require("../Toast/index");
|
|
17
17
|
const AuthenticationProvider_1 = __importDefault(require("./AuthenticationProvider"));
|
|
18
18
|
const B3ConfigProvider_1 = require("./B3ConfigProvider");
|
|
19
|
+
const BetterAuthClientProvider_1 = require("./BetterAuthClientProvider");
|
|
19
20
|
const BetterAuthProvider_1 = __importDefault(require("./BetterAuthProvider"));
|
|
20
21
|
const LocalSDKProvider_1 = require("./LocalSDKProvider");
|
|
21
22
|
/**
|
|
@@ -23,7 +24,7 @@ const LocalSDKProvider_1 = require("./LocalSDKProvider");
|
|
|
23
24
|
*/
|
|
24
25
|
function B3Provider({ theme = "light", children, accountOverride, environment, automaticallySetFirstEoa, defaultEoaProvider, simDuneApiKey,
|
|
25
26
|
// deprecated since v0.0.87
|
|
26
|
-
toaster: _toaster, clientType = "rest", rpcUrls, partnerId, stripePublishableKey, onConnect, onLogout, connectors, overrideDefaultConnectors = false, createClientReferenceId, defaultPermissions, disableBSMNTAuthentication = false, queryClient, authStrategy = "thirdweb", }) {
|
|
27
|
+
toaster: _toaster, clientType = "rest", rpcUrls, partnerId, stripePublishableKey, onConnect, onLogout, connectors, overrideDefaultConnectors = false, createClientReferenceId, defaultPermissions, disableBSMNTAuthentication = false, queryClient, authStrategy = "thirdweb", apiUrl, }) {
|
|
27
28
|
// Initialize Google Analytics on mount
|
|
28
29
|
(0, react_3.useEffect)(() => {
|
|
29
30
|
(0, analytics_1.loadGA4Script)();
|
|
@@ -33,7 +34,7 @@ toaster: _toaster, clientType = "rest", rpcUrls, partnerId, stripePublishableKey
|
|
|
33
34
|
(0, client_manager_1.setClientType)(clientType);
|
|
34
35
|
}, [clientType]);
|
|
35
36
|
const wagmiConfig = (0, react_3.useMemo)(() => (0, createWagmiConfig_1.createWagmiConfig)({ partnerId, rpcUrls, connectors, overrideDefaultConnectors }), [partnerId, rpcUrls, connectors, overrideDefaultConnectors]);
|
|
36
|
-
return ((0, jsx_runtime_1.jsx)(react_2.WalletProvider, { wagmiConfig: wagmiConfig, queryClient: queryClient, children: (0, jsx_runtime_1.jsx)(react_1.TooltipProvider, { children: (0, jsx_runtime_1.jsx)(index_1.ToastProvider, { children: (0, jsx_runtime_1.jsx)(LocalSDKProvider_1.LocalSDKProvider, { onConnectCallback: onConnect, onLogoutCallback: onLogout, disableBSMNTAuthentication: disableBSMNTAuthentication, children: (0, jsx_runtime_1.
|
|
37
|
+
return ((0, jsx_runtime_1.jsx)(react_2.WalletProvider, { wagmiConfig: wagmiConfig, queryClient: queryClient, children: (0, jsx_runtime_1.jsx)(react_1.TooltipProvider, { children: (0, jsx_runtime_1.jsx)(index_1.ToastProvider, { children: (0, jsx_runtime_1.jsx)(LocalSDKProvider_1.LocalSDKProvider, { onConnectCallback: onConnect, onLogoutCallback: onLogout, disableBSMNTAuthentication: disableBSMNTAuthentication, children: (0, jsx_runtime_1.jsx)(B3ConfigProvider_1.B3ConfigProvider, { accountOverride: accountOverride, environment: environment, automaticallySetFirstEoa: !!automaticallySetFirstEoa, theme: theme, clientType: clientType, partnerId: partnerId, stripePublishableKey: stripePublishableKey, createClientReferenceId: createClientReferenceId, defaultPermissions: defaultPermissions, authStrategy: authStrategy, apiUrl: apiUrl, children: (0, jsx_runtime_1.jsxs)(BetterAuthClientProvider_1.BetterAuthClientProvider, { apiUrl: apiUrl, children: [(0, jsx_runtime_1.jsx)(ToastContextConnector, {}), (0, jsx_runtime_1.jsxs)(react_1.RelayKitProviderWrapper, { simDuneApiKey: simDuneApiKey, children: [children, (0, jsx_runtime_1.jsx)(StyleRoot_1.StyleRoot, { id: "b3-root" })] }), authStrategy === "better-auth" ? ((0, jsx_runtime_1.jsx)(BetterAuthProvider_1.default, { partnerId: partnerId })) : ((0, jsx_runtime_1.jsx)(AuthenticationProvider_1.default, { partnerId: partnerId, automaticallySetFirstEoa: !!automaticallySetFirstEoa, defaultEoaProvider: defaultEoaProvider }))] }) }) }) }) }) }));
|
|
37
38
|
}
|
|
38
39
|
/**
|
|
39
40
|
* Component to connect the toast context to the global toast API
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type B3BetterAuthClient } from "../../../better-auth-client";
|
|
2
|
+
/**
|
|
3
|
+
* Provides a Better Auth client instance to the subtree.
|
|
4
|
+
*
|
|
5
|
+
* When `apiUrl` is supplied, a custom client targeting that URL is created
|
|
6
|
+
* (e.g. `http://localhost:3031` for local development). Otherwise, the
|
|
7
|
+
* default singleton (which uses `B3_API_URL` / `NEXT_PUBLIC_B3_API`) is used.
|
|
8
|
+
*/
|
|
9
|
+
export declare function BetterAuthClientProvider({ children, apiUrl, }: {
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
apiUrl?: string;
|
|
12
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the Better Auth client from the nearest `BetterAuthClientProvider`.
|
|
15
|
+
* Falls back to the default singleton if no provider is present.
|
|
16
|
+
*/
|
|
17
|
+
export declare function useBetterAuthClient(): B3BetterAuthClient;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BetterAuthClientProvider = BetterAuthClientProvider;
|
|
4
|
+
exports.useBetterAuthClient = useBetterAuthClient;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const better_auth_client_1 = require("../../../better-auth-client");
|
|
8
|
+
const BetterAuthClientContext = (0, react_1.createContext)(better_auth_client_1.betterAuthClient);
|
|
9
|
+
/**
|
|
10
|
+
* Provides a Better Auth client instance to the subtree.
|
|
11
|
+
*
|
|
12
|
+
* When `apiUrl` is supplied, a custom client targeting that URL is created
|
|
13
|
+
* (e.g. `http://localhost:3031` for local development). Otherwise, the
|
|
14
|
+
* default singleton (which uses `B3_API_URL` / `NEXT_PUBLIC_B3_API`) is used.
|
|
15
|
+
*/
|
|
16
|
+
function BetterAuthClientProvider({ children, apiUrl, }) {
|
|
17
|
+
const client = (0, react_1.useMemo)(() => {
|
|
18
|
+
if (apiUrl) {
|
|
19
|
+
return (0, better_auth_client_1.createB3BetterAuthClient)(apiUrl);
|
|
20
|
+
}
|
|
21
|
+
return better_auth_client_1.betterAuthClient;
|
|
22
|
+
}, [apiUrl]);
|
|
23
|
+
return (0, jsx_runtime_1.jsx)(BetterAuthClientContext.Provider, { value: client, children: children });
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns the Better Auth client from the nearest `BetterAuthClientProvider`.
|
|
27
|
+
* Falls back to the default singleton if no provider is present.
|
|
28
|
+
*/
|
|
29
|
+
function useBetterAuthClient() {
|
|
30
|
+
return (0, react_1.useContext)(BetterAuthClientContext);
|
|
31
|
+
}
|
|
@@ -9,8 +9,8 @@ const constants_1 = require("../../../../shared/constants");
|
|
|
9
9
|
const debug_1 = require("../../../../shared/utils/debug");
|
|
10
10
|
const js_cookie_1 = __importDefault(require("js-cookie"));
|
|
11
11
|
const react_2 = require("react");
|
|
12
|
-
const better_auth_client_1 = require("../../../better-auth-client");
|
|
13
12
|
const useUserQuery_1 = require("../../hooks/useUserQuery");
|
|
13
|
+
const BetterAuthClientProvider_1 = require("./BetterAuthClientProvider");
|
|
14
14
|
const debug = (0, debug_1.debugB3React)("BetterAuthProvider");
|
|
15
15
|
/**
|
|
16
16
|
* Parallel to AuthenticationProvider for Better Auth strategy.
|
|
@@ -25,6 +25,7 @@ const debug = (0, debug_1.debugB3React)("BetterAuthProvider");
|
|
|
25
25
|
* useAuth, SignIn component, etc.) automatically clears the Better Auth session.
|
|
26
26
|
*/
|
|
27
27
|
const BetterAuthProvider = ({ partnerId }) => {
|
|
28
|
+
const betterAuthClient = (0, BetterAuthClientProvider_1.useBetterAuthClient)();
|
|
28
29
|
const setIsAuthenticated = (0, react_1.useAuthStore)(state => state.setIsAuthenticated);
|
|
29
30
|
const setIsAuthenticating = (0, react_1.useAuthStore)(state => state.setIsAuthenticating);
|
|
30
31
|
const setIsConnected = (0, react_1.useAuthStore)(state => state.setIsConnected);
|
|
@@ -45,7 +46,7 @@ const BetterAuthProvider = ({ partnerId }) => {
|
|
|
45
46
|
app_1.default.logout = async () => {
|
|
46
47
|
debug("Patched logout: clearing Better Auth session");
|
|
47
48
|
try {
|
|
48
|
-
await
|
|
49
|
+
await betterAuthClient.signOut();
|
|
49
50
|
}
|
|
50
51
|
catch {
|
|
51
52
|
debug("Better Auth signOut failed (non-critical)");
|
|
@@ -56,7 +57,7 @@ const BetterAuthProvider = ({ partnerId }) => {
|
|
|
56
57
|
app_1.default.logout = originalLogout;
|
|
57
58
|
hasPatched.current = false;
|
|
58
59
|
};
|
|
59
|
-
}, []);
|
|
60
|
+
}, [betterAuthClient]);
|
|
60
61
|
// Session restore on mount
|
|
61
62
|
(0, react_2.useEffect)(() => {
|
|
62
63
|
if (hasAttemptedRestore.current)
|
|
@@ -81,7 +82,7 @@ const BetterAuthProvider = ({ partnerId }) => {
|
|
|
81
82
|
}
|
|
82
83
|
// 2. Check for a Better Auth session (e.g. after OAuth redirect sets a cookie)
|
|
83
84
|
try {
|
|
84
|
-
const session = await
|
|
85
|
+
const session = await betterAuthClient.getSession();
|
|
85
86
|
if (session.data?.session?.token) {
|
|
86
87
|
debug("Better Auth session found, exchanging for Feathers JWT", {
|
|
87
88
|
betterAuthUserId: session.data.user?.id,
|
|
@@ -114,7 +115,7 @@ const BetterAuthProvider = ({ partnerId }) => {
|
|
|
114
115
|
setIsAuthenticating(false);
|
|
115
116
|
};
|
|
116
117
|
restoreSession();
|
|
117
|
-
}, [setIsAuthenticated, setIsAuthenticating, setIsConnected, setUser, partnerId]);
|
|
118
|
+
}, [setIsAuthenticated, setIsAuthenticating, setIsConnected, setUser, partnerId, betterAuthClient]);
|
|
118
119
|
return null;
|
|
119
120
|
};
|
|
120
121
|
exports.default = BetterAuthProvider;
|
|
@@ -13,11 +13,13 @@ const SettingsIcon = () => {
|
|
|
13
13
|
};
|
|
14
14
|
const BottomNavigation = () => {
|
|
15
15
|
const setB3ModalContentType = (0, react_1.useModalStore)(state => state.setB3ModalContentType);
|
|
16
|
-
|
|
16
|
+
const { authStrategy } = (0, react_1.useB3Config)();
|
|
17
|
+
const isBetterAuth = authStrategy === "better-auth";
|
|
18
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "b3-modal-bottom-navigation sticky bottom-0 left-0 w-full rounded-b-xl border-t border-gray-200 bg-[#FAFAFA]", children: (0, jsx_runtime_1.jsxs)(react_1.TabsListPrimitive, { className: "flex h-[68px] w-full items-center justify-center gap-4 border-none bg-transparent", children: [(0, jsx_runtime_1.jsxs)(react_1.TabTriggerPrimitive, { value: "home", className: "data-[state=active]:border-b3-primary-blue group flex flex-initial flex-col items-center gap-1 border-r-0 border-t-0 px-6 pb-2 pt-2.5 text-[#a0a0ab] data-[state=active]:border-t-4 data-[state=active]:text-[#18181B] dark:data-[state=active]:text-white", children: [(0, jsx_runtime_1.jsx)(HomeIcon, {}), (0, jsx_runtime_1.jsx)("span", { className: "text-b3-grey font-neue-montreal-semibold text-xs", children: "Home" })] }), !isBetterAuth && ((0, jsx_runtime_1.jsxs)(react_1.TabTriggerPrimitive, { value: "swap", className: "data-[state=active]:border-b3-primary-blue group flex flex-initial flex-col items-center gap-1 border-r-0 border-t-0 px-6 pb-2 pt-2.5 text-[#a0a0ab] data-[state=active]:border-t-4 data-[state=active]:text-[#18181B] dark:data-[state=active]:text-white", onClick: () => {
|
|
17
19
|
setB3ModalContentType({
|
|
18
20
|
type: "anySpend",
|
|
19
21
|
showBackButton: true,
|
|
20
22
|
});
|
|
21
|
-
}, children: [(0, jsx_runtime_1.jsx)(SwapIcon, {}), (0, jsx_runtime_1.jsx)("span", { className: "text-b3-grey font-neue-montreal-semibold text-xs", children: "Swap" })] }), (0, jsx_runtime_1.jsxs)(react_1.TabTriggerPrimitive, { value: "settings", className: "data-[state=active]:border-b3-primary-blue group flex flex-initial flex-col items-center gap-1 border-r-0 border-t-0 px-6 pb-2 pt-2.5 text-[#a0a0ab] data-[state=active]:border-t-4 data-[state=active]:text-[#18181B] dark:data-[state=active]:text-white", children: [(0, jsx_runtime_1.jsx)(SettingsIcon, {}), (0, jsx_runtime_1.jsx)("span", { className: "text-b3-grey font-neue-montreal-semibold text-xs", children: "Settings" })] })] }) }));
|
|
23
|
+
}, children: [(0, jsx_runtime_1.jsx)(SwapIcon, {}), (0, jsx_runtime_1.jsx)("span", { className: "text-b3-grey font-neue-montreal-semibold text-xs", children: "Swap" })] })), (0, jsx_runtime_1.jsxs)(react_1.TabTriggerPrimitive, { value: "settings", className: "data-[state=active]:border-b3-primary-blue group flex flex-initial flex-col items-center gap-1 border-r-0 border-t-0 px-6 pb-2 pt-2.5 text-[#a0a0ab] data-[state=active]:border-t-4 data-[state=active]:text-[#18181B] dark:data-[state=active]:text-white", children: [(0, jsx_runtime_1.jsx)(SettingsIcon, {}), (0, jsx_runtime_1.jsx)("span", { className: "text-b3-grey font-neue-montreal-semibold text-xs", children: "Settings" })] })] }) }));
|
|
22
24
|
};
|
|
23
25
|
exports.default = BottomNavigation;
|
|
@@ -44,6 +44,7 @@ const framer_motion_1 = require("framer-motion");
|
|
|
44
44
|
const lucide_react_1 = require("lucide-react");
|
|
45
45
|
const react_2 = require("react");
|
|
46
46
|
const react_3 = require("thirdweb/react");
|
|
47
|
+
const UserAvatar_1 = require("../UserAvatar/UserAvatar");
|
|
47
48
|
const ChevronDownIcon_1 = require("../icons/ChevronDownIcon");
|
|
48
49
|
const LinkIcon_1 = __importDefault(require("../icons/LinkIcon"));
|
|
49
50
|
const SignOutIcon_1 = __importDefault(require("../icons/SignOutIcon"));
|
|
@@ -78,7 +79,34 @@ function WalletItem({ wallet, isActive, onClick }) {
|
|
|
78
79
|
: "Wallet";
|
|
79
80
|
return ((0, jsx_runtime_1.jsxs)("div", { className: `b3-modal-wallet-item ${isActive ? "b3-modal-wallet-item-active dark:bg-b3-line bg-[#F4F4F5]" : "hover:bg-b3-line/50"} box-border flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 transition-colors`, onClick: onClick, children: [(0, jsx_runtime_1.jsx)("div", { className: "relative size-10 shrink-0 text-clip rounded-full", children: isGlobalAccount ? ((0, jsx_runtime_1.jsx)("div", { className: "flex size-full items-center justify-center p-1", children: (0, jsx_runtime_1.jsx)("img", { src: "https://cdn.b3.fun/b3_logo.svg", alt: "B3", className: "size-full object-contain" }) })) : walletImage ? ((0, jsx_runtime_1.jsx)("img", { src: walletImage, alt: walletName, className: "size-full object-contain p-1" })) : ((0, jsx_runtime_1.jsx)("div", { className: "flex size-full items-center justify-center", children: (0, jsx_runtime_1.jsx)(WalletIcon_1.WalletIcon, {}) })) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-b3-grey font-neue-montreal-semibold truncate text-sm", children: walletName }), (0, jsx_runtime_1.jsx)("p", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: centerTruncate(address, 4) })] }), isActive && ((0, jsx_runtime_1.jsx)("div", { className: "shrink-0", children: (0, jsx_runtime_1.jsx)(CheckIcon, {}) }))] }));
|
|
80
81
|
}
|
|
82
|
+
function BetterAuthHeader({ onLogout }) {
|
|
83
|
+
const contentType = (0, react_1.useModalStore)(state => state.contentType);
|
|
84
|
+
const setB3ModalOpen = (0, react_1.useModalStore)(state => state.setB3ModalOpen);
|
|
85
|
+
const partnerId = contentType?.partnerId;
|
|
86
|
+
const { logout, user } = (0, react_1.useAuthentication)(partnerId);
|
|
87
|
+
const [logoutLoading, setLogoutLoading] = (0, react_2.useState)(false);
|
|
88
|
+
const displayName = user?.username || user?.email || "Account";
|
|
89
|
+
const onLogoutEnhanced = async () => {
|
|
90
|
+
setLogoutLoading(true);
|
|
91
|
+
try {
|
|
92
|
+
await logout();
|
|
93
|
+
onLogout?.();
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
setB3ModalOpen(false);
|
|
97
|
+
setLogoutLoading(false);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-b3-background border-b3-line flex items-center justify-between border-b px-5 py-3", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(UserAvatar_1.UserAvatar, { avatarUrl: user?.avatar, name: displayName, size: 40, className: "shrink-0" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-0.5", children: [user?.username && ((0, jsx_runtime_1.jsx)("p", { className: "text-b3-grey font-neue-montreal-semibold text-left text-sm", children: user.username })), user?.email && ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-1", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: user.email }), (0, jsx_runtime_1.jsx)(react_1.CopyToClipboard, { text: user.email })] }))] })] }), (0, jsx_runtime_1.jsxs)("button", { className: "border-b3-line hover:bg-b3-line flex items-center justify-center gap-1.5 rounded-xl border border-solid px-3 py-2 transition-colors", onClick: onLogoutEnhanced, disabled: logoutLoading, children: [logoutLoading ? ((0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "animate-spin", size: 16 })) : ((0, jsx_runtime_1.jsx)(SignOutIcon_1.default, { size: 16, className: "text-b3-grey" })), (0, jsx_runtime_1.jsx)("p", { className: "text-b3-grey font-neue-montreal-semibold text-sm", children: "Sign out" })] })] }));
|
|
101
|
+
}
|
|
81
102
|
function Header({ onLogout }) {
|
|
103
|
+
const { authStrategy } = (0, react_1.useB3Config)();
|
|
104
|
+
if (authStrategy === "better-auth") {
|
|
105
|
+
return (0, jsx_runtime_1.jsx)(BetterAuthHeader, { onLogout: onLogout });
|
|
106
|
+
}
|
|
107
|
+
return (0, jsx_runtime_1.jsx)(WalletHeader, { onLogout: onLogout });
|
|
108
|
+
}
|
|
109
|
+
function WalletHeader({ onLogout }) {
|
|
82
110
|
const activeWallet = (0, react_3.useActiveWallet)();
|
|
83
111
|
const connectedWallets = (0, react_3.useConnectedWallets)();
|
|
84
112
|
const setActiveWallet = (0, react_3.useSetActiveWallet)();
|
|
@@ -95,10 +123,14 @@ function Header({ onLogout }) {
|
|
|
95
123
|
const isActiveGlobalAccount = activeWallet?.id.includes("ecosystem");
|
|
96
124
|
const onLogoutEnhanced = async () => {
|
|
97
125
|
setLogoutLoading(true);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
126
|
+
try {
|
|
127
|
+
await logout();
|
|
128
|
+
onLogout?.();
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
setB3ModalOpen(false);
|
|
132
|
+
setLogoutLoading(false);
|
|
133
|
+
}
|
|
102
134
|
};
|
|
103
135
|
const handleWalletSwitch = (wallet) => {
|
|
104
136
|
setActiveWallet(wallet);
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.HomeContent = HomeContent;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("../../../../global-account/react");
|
|
8
9
|
const Tabs_1 = require("../ui/Tabs");
|
|
9
10
|
const Header_1 = require("./Header");
|
|
10
11
|
const HomeActions_1 = __importDefault(require("./HomeActions"));
|
|
@@ -12,5 +13,7 @@ const NFTContent_1 = __importDefault(require("./NFTContent"));
|
|
|
12
13
|
const ProfileSection_1 = __importDefault(require("./ProfileSection"));
|
|
13
14
|
const TokenContent_1 = __importDefault(require("./TokenContent"));
|
|
14
15
|
function HomeContent({ showDeposit = false, showSwap = true }) {
|
|
15
|
-
|
|
16
|
+
const { authStrategy } = (0, react_1.useB3Config)();
|
|
17
|
+
const isBetterAuth = authStrategy === "better-auth";
|
|
18
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col", children: [(0, jsx_runtime_1.jsx)(Header_1.Header, {}), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col", children: [(0, jsx_runtime_1.jsx)(ProfileSection_1.default, {}), !isBetterAuth && (0, jsx_runtime_1.jsx)(HomeActions_1.default, { showDeposit: showDeposit, showSwap: showSwap }), !isBetterAuth && ((0, jsx_runtime_1.jsx)("div", { className: "b3-modal-balance-content space-y-2 p-5", children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { defaultValue: "balance", children: [(0, jsx_runtime_1.jsxs)(Tabs_1.TabsList, { className: "b3-modal-balance-tabs-list", children: [(0, jsx_runtime_1.jsx)(Tabs_1.TabTrigger, { value: "balance", className: "font-neue-montreal-semibold p-0 pr-3", children: "Balance" }), (0, jsx_runtime_1.jsx)(Tabs_1.TabTrigger, { value: "nfts", className: "font-neue-montreal-semibold p-0 pr-3", children: "NFTs" })] }), (0, jsx_runtime_1.jsx)(Tabs_1.TabsContent, { value: "balance", className: "px-0 pb-4 pt-2", children: (0, jsx_runtime_1.jsx)(TokenContent_1.default, {}) }), (0, jsx_runtime_1.jsx)(Tabs_1.TabsContent, { value: "nfts", className: "px-0 pb-4 pt-2", children: (0, jsx_runtime_1.jsx)(NFTContent_1.default, {}) })] }) }))] })] }));
|
|
16
19
|
}
|
|
@@ -10,9 +10,15 @@ const BottomNavigation_1 = __importDefault(require("./BottomNavigation"));
|
|
|
10
10
|
const HomeContent_1 = require("./HomeContent");
|
|
11
11
|
const SettingsContent_1 = __importDefault(require("./SettingsContent"));
|
|
12
12
|
function ManageAccount({ onLogout, onSwap: _onSwap, onDeposit: _onDeposit, chain, partnerId, showSwap, showDeposit, }) {
|
|
13
|
+
const { authStrategy } = (0, react_1.useB3Config)();
|
|
14
|
+
const isBetterAuth = authStrategy === "better-auth";
|
|
13
15
|
const contentType = (0, react_1.useModalStore)(state => state.contentType);
|
|
14
16
|
const { activeTab = "home", setActiveTab } = contentType;
|
|
15
17
|
const setB3ModalContentType = (0, react_1.useModalStore)(state => state.setB3ModalContentType);
|
|
18
|
+
// Better Auth: single-view layout — no Home/Swap tabs, just settings content
|
|
19
|
+
if (isBetterAuth) {
|
|
20
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "b3-manage-account flex-1", children: (0, jsx_runtime_1.jsx)(SettingsContent_1.default, { partnerId: partnerId, onLogout: onLogout, chain: chain }) }));
|
|
21
|
+
}
|
|
16
22
|
return ((0, jsx_runtime_1.jsx)("div", { className: "b3-manage-account flex-1", children: (0, jsx_runtime_1.jsxs)(react_1.TabsPrimitive, { defaultValue: activeTab, onValueChange: value => {
|
|
17
23
|
const tab = value;
|
|
18
24
|
if (tab === "swap") {
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
7
|
const react_1 = require("../../../../global-account/react");
|
|
8
8
|
const profileDisplay_1 = require("../../../../global-account/react/utils/profileDisplay");
|
|
9
|
+
const constants_1 = require("../../../../shared/constants");
|
|
9
10
|
const utils_1 = require("../../../../shared/utils");
|
|
10
11
|
const number_1 = require("../../../../shared/utils/number");
|
|
11
12
|
const boring_avatars_1 = __importDefault(require("boring-avatars"));
|
|
@@ -14,8 +15,9 @@ const react_2 = require("react");
|
|
|
14
15
|
const react_3 = require("thirdweb/react");
|
|
15
16
|
const useFirstEOA_1 = require("../../hooks/useFirstEOA");
|
|
16
17
|
const IPFSMediaRenderer_1 = require("../IPFSMediaRenderer/IPFSMediaRenderer");
|
|
17
|
-
const AVATAR_COLORS = ["#3368ef", "#272727", "#6366f1", "#06b6d4", "#eeb0d9", "#ba3fbf", "#ff777b", "#dfbb53"];
|
|
18
18
|
const ProfileSection = () => {
|
|
19
|
+
const { authStrategy } = (0, react_1.useB3Config)();
|
|
20
|
+
const isBetterAuth = authStrategy === "better-auth";
|
|
19
21
|
const account = (0, react_3.useActiveAccount)();
|
|
20
22
|
const { address: eoaAddress } = (0, useFirstEOA_1.useFirstEOA)();
|
|
21
23
|
const { address: smartWalletAddress } = (0, react_1.useAccountWallet)();
|
|
@@ -50,7 +52,7 @@ const ProfileSection = () => {
|
|
|
50
52
|
setImgError(false);
|
|
51
53
|
}, [avatarSrc]);
|
|
52
54
|
const currentUsername = user?.username || profile?.displayName || (0, utils_1.formatUsername)(profile?.name || "");
|
|
53
|
-
const avatarSeed = eoaAddress || account?.address || smartWalletAddress || currentUsername || "user";
|
|
54
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-between px-5 py-6", children: (0, jsx_runtime_1.jsxs)("div", { className: "global-account-profile flex items-center gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "global-account-profile-avatar relative", children: [(0, jsx_runtime_1.jsx)("div", { className: "border-b3-line border-1 bg-b3-primary-wash size-14 overflow-hidden rounded-full border", children: avatarSrc && !imgError ? ((0, jsx_runtime_1.jsx)(IPFSMediaRenderer_1.IPFSMediaRenderer, { src: avatarSrc, alt: "Profile Avatar", className: "h-full w-full object-cover", onError: handleImgError })) : ((0, jsx_runtime_1.jsx)(boring_avatars_1.default, { name: avatarSeed, variant: "beam", size: 56, colors: AVATAR_COLORS })) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleEditAvatar, className: "border-b3-background hover:bg-b3-grey/80 absolute -bottom-1 -right-1 flex size-6 items-center justify-center rounded-full border-4 bg-[#a0a0ab] transition-colors", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Pencil, { size: 10, className: "text-b3-background" }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "global-account-profile-info flex flex-col gap-1", children: [(0, jsx_runtime_1.jsxs)("h2", { className: "text-b3-grey font-neue-montreal-semibold flex h-[38px] items-center gap-1 text-xl", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-b3-foreground-muted", children: " $" }), (0, jsx_runtime_1.jsx)("div", { className: "text-[30px]", children: (0, number_1.formatDisplayNumber)(totalBalanceUsd, { fractionDigits: 2 }) })] }), (0, jsx_runtime_1.jsx)("div", { className: "b3-modal-username font-neue-montreal-semibold text-base leading-none text-[#0B57C2]", children: currentUsername })] })] }) }));
|
|
55
|
+
const avatarSeed = eoaAddress || account?.address || smartWalletAddress || currentUsername || user?.email || "user";
|
|
56
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-between px-5 py-6", children: (0, jsx_runtime_1.jsxs)("div", { className: "global-account-profile flex items-center gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "global-account-profile-avatar relative", children: [(0, jsx_runtime_1.jsx)("div", { className: "border-b3-line border-1 bg-b3-primary-wash size-14 overflow-hidden rounded-full border", children: avatarSrc && !imgError ? ((0, jsx_runtime_1.jsx)(IPFSMediaRenderer_1.IPFSMediaRenderer, { src: avatarSrc, alt: "Profile Avatar", className: "h-full w-full object-cover", onError: handleImgError })) : ((0, jsx_runtime_1.jsx)(boring_avatars_1.default, { name: avatarSeed, variant: "beam", size: 56, colors: constants_1.AVATAR_COLORS })) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleEditAvatar, className: "border-b3-background hover:bg-b3-grey/80 absolute -bottom-1 -right-1 flex size-6 items-center justify-center rounded-full border-4 bg-[#a0a0ab] transition-colors", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Pencil, { size: 10, className: "text-b3-background" }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "global-account-profile-info flex flex-col gap-1", children: [!isBetterAuth && ((0, jsx_runtime_1.jsxs)("h2", { className: "text-b3-grey font-neue-montreal-semibold flex h-[38px] items-center gap-1 text-xl", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-b3-foreground-muted", children: " $" }), (0, jsx_runtime_1.jsx)("div", { className: "text-[30px]", children: (0, number_1.formatDisplayNumber)(totalBalanceUsd, { fractionDigits: 2 }) })] })), (0, jsx_runtime_1.jsx)("div", { className: "b3-modal-username font-neue-montreal-semibold text-base leading-none text-[#0B57C2]", children: currentUsername }), isBetterAuth && user?.email && ((0, jsx_runtime_1.jsx)("div", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: user.email }))] })] }) }));
|
|
55
57
|
};
|
|
56
58
|
exports.default = ProfileSection;
|
|
@@ -15,6 +15,8 @@ const ModalHeader_1 = __importDefault(require("../ModalHeader/ModalHeader"));
|
|
|
15
15
|
const SettingsMenuItem_1 = __importDefault(require("./SettingsMenuItem"));
|
|
16
16
|
const SettingsProfileCard_1 = __importDefault(require("./SettingsProfileCard"));
|
|
17
17
|
const SettingsContent = ({ partnerId, onLogout, chain, }) => {
|
|
18
|
+
const { authStrategy } = (0, react_1.useB3Config)();
|
|
19
|
+
const isBetterAuth = authStrategy === "better-auth";
|
|
18
20
|
const setB3ModalContentType = (0, react_1.useModalStore)(state => state.setB3ModalContentType);
|
|
19
21
|
const setB3ModalOpen = (0, react_1.useModalStore)(state => state.setB3ModalOpen);
|
|
20
22
|
const { logout, user } = (0, react_1.useAuthentication)(partnerId);
|
|
@@ -50,7 +52,7 @@ const SettingsContent = ({ partnerId, onLogout, chain, }) => {
|
|
|
50
52
|
setB3ModalOpen(false);
|
|
51
53
|
setLogoutLoading(false);
|
|
52
54
|
};
|
|
53
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: "flex h-[470px] flex-col", children: [(0, jsx_runtime_1.jsx)(ModalHeader_1.default, { showBackButton: false, showCloseButton: false, title: "Settings" }), (0, jsx_runtime_1.jsx)("div", { className: "p-5", children: (0, jsx_runtime_1.jsx)("div", { className: "b3-modal-settings-profile-card dark:border-b3-line dark:bg-b3-background flex items-center rounded-xl border border-[#e4e4e7] bg-[#f4f4f5] p-4", children: (0, jsx_runtime_1.jsx)(SettingsProfileCard_1.default, {}) }) }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-3 px-5", children: [(0, jsx_runtime_1.jsx)(SettingsMenuItem_1.default, { icon: (0, jsx_runtime_1.jsx)(
|
|
55
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "flex h-[470px] flex-col", children: [!isBetterAuth && (0, jsx_runtime_1.jsx)(ModalHeader_1.default, { showBackButton: false, showCloseButton: false, title: "Settings" }), (0, jsx_runtime_1.jsx)("div", { className: "p-5", children: (0, jsx_runtime_1.jsx)("div", { className: "b3-modal-settings-profile-card dark:border-b3-line dark:bg-b3-background flex items-center rounded-xl border border-[#e4e4e7] bg-[#f4f4f5] p-4", children: (0, jsx_runtime_1.jsx)(SettingsProfileCard_1.default, {}) }) }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-3 px-5", children: [!isBetterAuth && ((0, jsx_runtime_1.jsx)(SettingsMenuItem_1.default, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Link, { size: 18, className: "text-[#51525c]" }), title: "Linked Accounts", subtitle: `${profiles.length} connected account${profiles.length > 1 ? "s" : ""}`, onClick: () => handleNavigate("linkAccount") })), (0, jsx_runtime_1.jsx)(SettingsMenuItem_1.default, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Bell, { size: 18, className: "text-[#51525c]" }), title: "Notifications", subtitle: "Manage your notifications", onClick: () => handleNavigate("notifications") }), (0, jsx_runtime_1.jsx)(SettingsMenuItem_1.default, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Clock, { size: 18, className: "text-[#51525c]" }), title: "Stay signed in", subtitle: session_duration_1.SESSION_DURATION_LABELS[sessionDays] ?? `${sessionDays} days`, onClick: () => handleNavigate("sessionDuration") })] }), (0, jsx_runtime_1.jsx)("div", { className: "mt-auto px-5 pb-5", children: (0, jsx_runtime_1.jsxs)("button", { type: "button", className: "b3-modal-sign-out-button border-b3-line hover:bg-b3-line bg-b3-background dark:bg-b3-background dark:border-b3-line dark:hover:bg-b3-line/80 flex w-full items-center justify-center gap-1.5 rounded-xl border border-solid p-3 transition-colors", onClick: onLogoutEnhanced, disabled: logoutLoading, style: {
|
|
54
56
|
boxShadow: "inset 0px 0px 0px 1px rgba(10,13,18,0.18), inset 0px -2px 0px 0px rgba(10,13,18,0.05)",
|
|
55
57
|
}, children: [logoutLoading ? ((0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "text-b3-grey animate-spin", size: 20 })) : ((0, jsx_runtime_1.jsx)(SignOutIcon_1.default, { size: 20, className: "text-b3-grey", color: "currentColor" })), (0, jsx_runtime_1.jsx)("p", { className: "text-b3-grey dark:text-b3-foreground-muted font-neue-montreal-semibold text-base", children: "Sign out" })] }) })] }));
|
|
56
58
|
};
|
|
@@ -21,7 +21,8 @@ const SettingsProfileCard = () => {
|
|
|
21
21
|
address: eoaAddress || account?.address,
|
|
22
22
|
fresh: true,
|
|
23
23
|
});
|
|
24
|
-
const { partnerId } = (0, react_1.useB3Config)();
|
|
24
|
+
const { partnerId, authStrategy } = (0, react_1.useB3Config)();
|
|
25
|
+
const isBetterAuth = authStrategy === "better-auth";
|
|
25
26
|
const { user, setUser } = (0, react_1.useAuthentication)(partnerId);
|
|
26
27
|
const setB3ModalOpen = (0, react_1.useModalStore)(state => state.setB3ModalOpen);
|
|
27
28
|
const setB3ModalContentType = (0, react_1.useModalStore)(state => state.setB3ModalContentType);
|
|
@@ -71,19 +72,29 @@ const SettingsProfileCard = () => {
|
|
|
71
72
|
}
|
|
72
73
|
setIsSaving(true);
|
|
73
74
|
try {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
75
|
+
let updatedUser;
|
|
76
|
+
if (isBetterAuth) {
|
|
77
|
+
// Better Auth: register username without wallet signing (DB-only, no ENS)
|
|
78
|
+
// Skip ens_normalize — it rejects underscores/mixed-case that are valid non-ENS usernames
|
|
79
|
+
const sanitizedUsername = editedUsername.trim().toLowerCase();
|
|
80
|
+
// Type assertion needed: b3-mono now accepts message/hash as optional for Better Auth users
|
|
81
|
+
updatedUser = (await app_1.default
|
|
82
|
+
.service("users")
|
|
83
|
+
.registerUsername({ username: sanitizedUsername }, {}));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Thirdweb: register username with wallet signature + on-chain ENS
|
|
87
|
+
const sanitizedUsername = (0, ens_normalize_1.ens_normalize)(editedUsername.trim());
|
|
88
|
+
const b3Username = `${sanitizedUsername}.b3.fun`;
|
|
89
|
+
const usernameSignMessage = `Register "${b3Username}"`;
|
|
90
|
+
const usernameSignature = await account?.signMessage({ message: usernameSignMessage });
|
|
91
|
+
if (!usernameSignature) {
|
|
92
|
+
throw new Error("Failed to sign username registration message");
|
|
93
|
+
}
|
|
94
|
+
updatedUser = (await app_1.default
|
|
95
|
+
.service("users")
|
|
96
|
+
.registerUsername({ username: sanitizedUsername, message: usernameSignMessage, hash: usernameSignature }, {}));
|
|
80
97
|
}
|
|
81
|
-
console.log("@@usernameSignature", usernameSignature);
|
|
82
|
-
// Register username with ENS
|
|
83
|
-
// Note: Type assertion needed until @b3dotfun/b3-api package is updated with RegisterUsername type
|
|
84
|
-
const updatedUser = (await app_1.default
|
|
85
|
-
.service("users")
|
|
86
|
-
.registerUsername({ username: sanitizedUsername, message: usernameSignMessage, hash: usernameSignature }, {}));
|
|
87
98
|
// Update user state - registerUsername returns an array with single user
|
|
88
99
|
setUser(Array.isArray(updatedUser) ? updatedUser[0] : updatedUser);
|
|
89
100
|
// Refresh profile to get updated data
|
|
@@ -112,6 +123,6 @@ const SettingsProfileCard = () => {
|
|
|
112
123
|
/* Edit mode - inline input */
|
|
113
124
|
(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("input", { ref: inputRef, type: "text", value: editedUsername, onChange: e => setEditedUsername(e.target.value), onKeyDown: handleKeyDown, disabled: isSaving, className: "border-b3-line bg-b3-background text-b3-grey placeholder:text-b3-foreground-muted font-neue-montreal-medium focus:border-b3-primary-blue text-md w-full rounded-md border px-2 py-1 leading-none transition-colors focus:outline-none disabled:opacity-50", placeholder: "Enter username" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-1", children: [(0, jsx_runtime_1.jsx)("button", { onClick: handleSaveUsername, disabled: isSaving, className: "text-b3-primary-blue hover:text-b3-primary-blue/80 flex items-center justify-center rounded-md p-1 transition-colors disabled:opacity-50", "aria-label": "Save username", children: isSaving ? (0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { size: 18, className: "animate-spin" }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Check, { size: 18, strokeWidth: 2.5 }) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCancelEdit, disabled: isSaving, className: "text-b3-foreground-muted hover:text-b3-grey flex items-center justify-center rounded-md p-1 transition-colors disabled:opacity-50", "aria-label": "Cancel editing", children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 18, strokeWidth: 2.5 }) })] })] })) : (
|
|
114
125
|
/* Display mode */
|
|
115
|
-
(0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "flex items-center gap-1", children: (0, jsx_runtime_1.jsx)("p", { className: "b3-modal-username font-neue-montreal-semibold text-lg leading-none text-[#0B57C2]", children: currentUsername }) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleEditUsername, className: "flex items-center justify-center gap-1 text-left transition-opacity hover:opacity-80", children: (0, jsx_runtime_1.jsx)("p", { className: "font-inter text-sm font-semibold leading-5 text-[#51525C] dark:text-white", children: "Edit Username" }) })] })) })] }));
|
|
126
|
+
(0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "flex items-center gap-1", children: (0, jsx_runtime_1.jsx)("p", { className: "b3-modal-username font-neue-montreal-semibold text-lg leading-none text-[#0B57C2]", children: currentUsername || user?.email }) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleEditUsername, className: "flex items-center justify-center gap-1 text-left transition-opacity hover:opacity-80", children: (0, jsx_runtime_1.jsx)("p", { className: "font-inter text-sm font-semibold leading-5 text-[#51525C] dark:text-white", children: "Edit Username" }) })] })) })] }));
|
|
116
127
|
};
|
|
117
128
|
exports.default = SettingsProfileCard;
|
|
@@ -6,6 +6,7 @@ const react_1 = require("../../../../global-account/react");
|
|
|
6
6
|
const debug_1 = require("../../../../shared/utils/debug");
|
|
7
7
|
const react_2 = require("react");
|
|
8
8
|
const useBetterAuth_1 = require("../../hooks/useBetterAuth");
|
|
9
|
+
const PasswordInput_1 = require("./components/PasswordInput");
|
|
9
10
|
const debug = (0, debug_1.debugB3React)("BetterAuthResetPassword");
|
|
10
11
|
/**
|
|
11
12
|
* Standalone reset password form. Render this on your reset password page.
|
|
@@ -60,8 +61,8 @@ function BetterAuthResetPassword({ token, onSuccess, onError, className }) {
|
|
|
60
61
|
if (!token) {
|
|
61
62
|
return ((0, jsx_runtime_1.jsx)("div", { className: `w-full max-w-[400px] px-6 text-center ${className || ""}`, children: (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-red-500", children: "Invalid or missing reset token." }) }));
|
|
62
63
|
}
|
|
63
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: `w-full max-w-[400px] px-6 ${className || ""}`, children: [(0, jsx_runtime_1.jsxs)("div", { className: "mb-10 text-center", children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-[28px] font-semibold tracking-tight text-gray-900 dark:text-gray-100", children: success ? "Password reset" : "Set new password" }), (0, jsx_runtime_1.jsx)("p", { className: "mt-3 text-[15px] text-gray-500 dark:text-gray-400", children: success ? "Your password has been updated." : "Enter your new password below." })] }), success ? ((0, jsx_runtime_1.jsx)("div", { className: "space-y-4 text-center", children: (0, jsx_runtime_1.jsx)("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: (0, jsx_runtime_1.jsx)("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }) })) : ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-5", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "New password" }), (0, jsx_runtime_1.jsx)(
|
|
64
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: `w-full max-w-[400px] px-6 ${className || ""}`, children: [(0, jsx_runtime_1.jsxs)("div", { className: "mb-10 text-center", children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-[28px] font-semibold tracking-tight text-gray-900 dark:text-gray-100", children: success ? "Password reset" : "Set new password" }), (0, jsx_runtime_1.jsx)("p", { className: "mt-3 text-[15px] text-gray-500 dark:text-gray-400", children: success ? "Your password has been updated." : "Enter your new password below." })] }), success ? ((0, jsx_runtime_1.jsx)("div", { className: "space-y-4 text-center", children: (0, jsx_runtime_1.jsx)("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: (0, jsx_runtime_1.jsx)("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }) })) : ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-5", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "New password" }), (0, jsx_runtime_1.jsx)(PasswordInput_1.PasswordInput, { placeholder: "At least 8 characters", value: password, onChange: e => setPassword(e.target.value), disabled: isLoading, className: "h-11 px-4 pr-11 text-[15px]" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Confirm password" }), (0, jsx_runtime_1.jsx)(PasswordInput_1.PasswordInput, { placeholder: "Repeat your password", value: confirmPassword, onChange: e => setConfirmPassword(e.target.value), disabled: isLoading, onKeyDown: e => {
|
|
64
65
|
if (e.key === "Enter")
|
|
65
66
|
handleSubmit();
|
|
66
|
-
}, className: "h-11 px-4 text-[15px]" })] }), error && (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-red-500", children: error }), (0, jsx_runtime_1.jsx)(react_1.Button, { onClick: handleSubmit, disabled: isLoading, className: "h-11 w-full bg-gray-900 text-[15px] font-medium text-white hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100", children: isLoading ? "Resetting..." : "Reset password" })] }))] }));
|
|
67
|
+
}, className: "h-11 px-4 pr-11 text-[15px]" })] }), error && (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-red-500", children: error }), (0, jsx_runtime_1.jsx)(react_1.Button, { onClick: handleSubmit, disabled: isLoading, className: "h-11 w-full bg-gray-900 text-[15px] font-medium text-white hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100", children: isLoading ? "Resetting..." : "Reset password" })] }))] }));
|
|
67
68
|
}
|
|
@@ -10,6 +10,11 @@ export interface BetterAuthSignInProps {
|
|
|
10
10
|
showEmail?: boolean;
|
|
11
11
|
/** URL to redirect to after password reset link is clicked. Token is appended as ?token=... */
|
|
12
12
|
passwordResetRedirectTo?: string;
|
|
13
|
+
/**
|
|
14
|
+
* URL Better Auth redirects to after server-side email verification. Render
|
|
15
|
+
* `BetterAuthVerifyEmail` at this route so the user gets a confirmation page.
|
|
16
|
+
*/
|
|
17
|
+
verifyEmailRedirectTo?: string;
|
|
13
18
|
/** Called after successful authentication */
|
|
14
19
|
onSuccess?: () => void;
|
|
15
20
|
/** Called on authentication error */
|
|
@@ -31,4 +36,4 @@ export interface BetterAuthSignInProps {
|
|
|
31
36
|
* />
|
|
32
37
|
* ```
|
|
33
38
|
*/
|
|
34
|
-
export declare function BetterAuthSignIn({ title, subtitle, socialProviders, showEmail, passwordResetRedirectTo, onSuccess, onError, className, }: BetterAuthSignInProps): import("react/jsx-runtime").JSX.Element | null;
|
|
39
|
+
export declare function BetterAuthSignIn({ title, subtitle, socialProviders, showEmail, passwordResetRedirectTo, verifyEmailRedirectTo, onSuccess, onError, className, }: BetterAuthSignInProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -6,6 +6,7 @@ const react_1 = require("../../../../global-account/react");
|
|
|
6
6
|
const debug_1 = require("../../../../shared/utils/debug");
|
|
7
7
|
const react_2 = require("react");
|
|
8
8
|
const useBetterAuth_1 = require("../../hooks/useBetterAuth");
|
|
9
|
+
const PasswordInput_1 = require("./components/PasswordInput");
|
|
9
10
|
const signInUtils_1 = require("./utils/signInUtils");
|
|
10
11
|
const debug = (0, debug_1.debugB3React)("BetterAuthSignIn");
|
|
11
12
|
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
@@ -30,9 +31,11 @@ const DEFAULT_SOCIAL_PROVIDERS = [
|
|
|
30
31
|
* />
|
|
31
32
|
* ```
|
|
32
33
|
*/
|
|
33
|
-
function BetterAuthSignIn({ title, subtitle = "Enter your credentials to access your account", socialProviders = DEFAULT_SOCIAL_PROVIDERS.map(p => p.id), showEmail = true, passwordResetRedirectTo, onSuccess, onError, className, }) {
|
|
34
|
+
function BetterAuthSignIn({ title, subtitle = "Enter your credentials to access your account", socialProviders = DEFAULT_SOCIAL_PROVIDERS.map(p => p.id), showEmail = true, passwordResetRedirectTo, verifyEmailRedirectTo, onSuccess, onError, className, }) {
|
|
34
35
|
const { signInWithEmail, signUpWithEmail, signInWithSocial, requestPasswordReset } = (0, useBetterAuth_1.useBetterAuth)();
|
|
35
36
|
const isAuthenticated = (0, react_1.useAuthStore)(state => state.isAuthenticated);
|
|
37
|
+
const isAuthenticating = (0, react_1.useAuthStore)(state => state.isAuthenticating);
|
|
38
|
+
const hasStartedConnecting = (0, react_1.useAuthStore)(state => state.hasStartedConnecting);
|
|
36
39
|
const [mode, setMode] = (0, react_2.useState)("sign-in");
|
|
37
40
|
const [email, setEmail] = (0, react_2.useState)("");
|
|
38
41
|
const [password, setPassword] = (0, react_2.useState)("");
|
|
@@ -45,7 +48,9 @@ function BetterAuthSignIn({ title, subtitle = "Enter your credentials to access
|
|
|
45
48
|
const resolvedTitle = title ||
|
|
46
49
|
(mode === "forgot-password" ? "Reset password" : mode === "sign-in" ? "Welcome back" : "Create an account");
|
|
47
50
|
const resolvedSubtitle = mode === "forgot-password"
|
|
48
|
-
?
|
|
51
|
+
? resetEmailSent
|
|
52
|
+
? "We've sent a password reset link to your email"
|
|
53
|
+
: "Enter your email and we'll send you a reset link"
|
|
49
54
|
: subtitle || "Enter your credentials to access your account";
|
|
50
55
|
const handleForgotPassword = async () => {
|
|
51
56
|
const normalizedEmail = email.trim().toLowerCase();
|
|
@@ -70,6 +75,11 @@ function BetterAuthSignIn({ title, subtitle = "Enter your credentials to access
|
|
|
70
75
|
const providers = socialProviders
|
|
71
76
|
.map(id => DEFAULT_SOCIAL_PROVIDERS.find(p => p.id === id))
|
|
72
77
|
.filter((p) => !!p);
|
|
78
|
+
// Show loading during session restore (before any user interaction) to prevent
|
|
79
|
+
// the login form from flashing briefly after OAuth redirect.
|
|
80
|
+
if (isAuthenticating && !hasStartedConnecting) {
|
|
81
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `flex w-full max-w-[400px] items-center justify-center px-6 py-20 ${className || ""}`, children: (0, jsx_runtime_1.jsx)(react_1.Loading, { variant: "primary", size: "lg" }) }));
|
|
82
|
+
}
|
|
73
83
|
if (isAuthenticated) {
|
|
74
84
|
return null;
|
|
75
85
|
}
|
|
@@ -91,7 +101,7 @@ function BetterAuthSignIn({ title, subtitle = "Enter your credentials to access
|
|
|
91
101
|
setIsLoading(true);
|
|
92
102
|
setError(null);
|
|
93
103
|
if (mode === "sign-up") {
|
|
94
|
-
await signUpWithEmail(normalizedEmail, password, name.trim());
|
|
104
|
+
await signUpWithEmail(normalizedEmail, password, name.trim(), verifyEmailRedirectTo);
|
|
95
105
|
}
|
|
96
106
|
else {
|
|
97
107
|
await signInWithEmail(normalizedEmail, password);
|
|
@@ -148,10 +158,10 @@ function BetterAuthSignIn({ title, subtitle = "Enter your credentials to access
|
|
|
148
158
|
}, className: "font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400", children: "Back to sign in" }) })] })), showEmail && mode !== "forgot-password" && ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-5", children: [mode === "sign-up" && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Name" }), (0, jsx_runtime_1.jsx)(react_1.Input, { type: "text", placeholder: "Your name", value: name, onChange: e => setName(e.target.value), disabled: isLoading, className: "h-11 px-4 text-[15px]" })] })), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Email" }), (0, jsx_runtime_1.jsx)(react_1.Input, { type: "email", placeholder: "name@company.com", value: email, onChange: e => setEmail(e.target.value), disabled: isLoading, className: "h-11 px-4 text-[15px]" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "mb-2 flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("label", { className: "block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Password" }), mode === "sign-in" && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => {
|
|
149
159
|
setMode("forgot-password");
|
|
150
160
|
setError(null);
|
|
151
|
-
}, className: "text-xs font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400", children: "Forgot password?" }))] }), (0, jsx_runtime_1.jsx)(
|
|
161
|
+
}, className: "text-xs font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400", children: "Forgot password?" }))] }), (0, jsx_runtime_1.jsx)(PasswordInput_1.PasswordInput, { value: password, onChange: e => setPassword(e.target.value), disabled: isLoading, onKeyDown: e => {
|
|
152
162
|
if (e.key === "Enter")
|
|
153
163
|
handleEmailSubmit();
|
|
154
|
-
}, className: "h-11 px-4 text-[15px]" })] }), error && (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-red-500", children: error }), (0, jsx_runtime_1.jsx)(react_1.Button, { onClick: handleEmailSubmit, disabled: isLoading, className: "h-11 w-full bg-gray-900 text-[15px] font-medium text-white hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100", children: isLoading ? "Loading..." : mode === "sign-in" ? "Sign in" : "Sign up" })] })), providers.length > 0 && mode !== "forgot-password" && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [showEmail && ((0, jsx_runtime_1.jsxs)("div", { className: "my-8 flex items-center gap-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-px flex-1 bg-gray-200 dark:bg-gray-700" }), (0, jsx_runtime_1.jsx)("span", { className: "text-xs text-gray-400", children: "Or continue with" }), (0, jsx_runtime_1.jsx)("div", { className: "h-px flex-1 bg-gray-200 dark:bg-gray-700" })] })), (0, jsx_runtime_1.jsx)("div", { className: "space-y-4", children: providers.map(provider => {
|
|
164
|
+
}, className: "h-11 px-4 pr-11 text-[15px]" }, mode)] }), error && (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-red-500", children: error }), (0, jsx_runtime_1.jsx)(react_1.Button, { onClick: handleEmailSubmit, disabled: isLoading, className: "h-11 w-full bg-gray-900 text-[15px] font-medium text-white hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100", children: isLoading ? "Loading..." : mode === "sign-in" ? "Sign in" : "Sign up" })] })), providers.length > 0 && mode !== "forgot-password" && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [showEmail && ((0, jsx_runtime_1.jsxs)("div", { className: "my-8 flex items-center gap-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-px flex-1 bg-gray-200 dark:bg-gray-700" }), (0, jsx_runtime_1.jsx)("span", { className: "text-xs text-gray-400", children: "Or continue with" }), (0, jsx_runtime_1.jsx)("div", { className: "h-px flex-1 bg-gray-200 dark:bg-gray-700" })] })), (0, jsx_runtime_1.jsx)("div", { className: "space-y-4", children: providers.map(provider => {
|
|
155
165
|
const icon = signInUtils_1.strategyIcons[provider.id];
|
|
156
166
|
const label = signInUtils_1.strategyLabels[provider.id] || provider.label;
|
|
157
167
|
const isProviderLoading = loadingProvider === provider.id;
|