Files
tom goriunovandGitHub 401dc58402 Smart wallet auth (#3220)
* basic login button implementation

* refactoring and add dynamic auth button to the other pages

* connect wallet without authenticating an user

* login and logout user in blockscout account

* refactoring and RPC overrides

* authenticate user with connected wallet

* add ENS to profile button

* override evm chains and fix contract write with waas wallet

* disconnect wallet and fix docker build

* add dynamic imports to components that use web3 wallet packages

* refactor user profile directory

* clean up

* tweaks

* update pw ci script

* fix "connect wallet" button behavior

* handle linking email to profile with dynamic provider

* fix test

* async loading web3 hooks and remove dynamic loading from components that use them

* fix pw tests

* add account navigation in horizontal layout when auth provider is dynamic

* fix address verification modal

* review fixes

* spelling fixes
2026-02-18 19:42:44 +01:00

65 lines
1.8 KiB
TypeScript

import { useDynamicContext, useDynamicEvents } from '@dynamic-labs/sdk-react-core';
import React from 'react';
import useLinkEmailDynamic from '../linkEmail/useLinkEmailDynamic';
import useProfileQuery from '../useProfileQuery';
interface InjectedProps {
onClick: () => void;
}
interface Props {
children: (props: InjectedProps) => React.ReactNode;
onAuthSuccess: () => void;
ensureEmail?: boolean;
}
const AuthGuardDynamic = ({ children, onAuthSuccess, ensureEmail }: Props) => {
const isAuthStartedRef = React.useRef(false);
const profileQuery = useProfileQuery();
const { setShowAuthFlow } = useDynamicContext();
const { user } = useDynamicContext();
const linkEmailToProfile = useLinkEmailDynamic();
const handleClick = React.useCallback(() => {
if (profileQuery.data) {
if (ensureEmail && !profileQuery.data?.email) {
linkEmailToProfile();
} else {
onAuthSuccess();
}
} else {
setShowAuthFlow(true);
isAuthStartedRef.current = true;
}
}, [ profileQuery.data, ensureEmail, linkEmailToProfile, onAuthSuccess, setShowAuthFlow ]);
const onAuthFlowEnd = React.useCallback(() => {
if (!user || !isAuthStartedRef.current) {
return;
}
isAuthStartedRef.current = false;
if (ensureEmail && !user?.email) {
linkEmailToProfile();
} else {
onAuthSuccess();
}
}, [ ensureEmail, linkEmailToProfile, onAuthSuccess, user ]);
// This event is triggered when user is logged in with wallet
useDynamicEvents('authFlowClose', async() => {
onAuthFlowEnd();
});
// This event is triggered when user is logged in with email
useDynamicEvents('emailVerificationResult', () => {
onAuthFlowEnd();
});
return children({ onClick: handleClick });
};
export default React.memo(AuthGuardDynamic);