mirror of
https://github.com/luxfi/explore.git
synced 2026-09-24 00:28:18 +00:00
* 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
65 lines
1.8 KiB
TypeScript
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);
|