Commit a53d893d authored by tom goriunov's avatar tom goriunov Committed by GitHub

Merge pull request #934 from blockscout/bugfix/email-verification-logout

show profile menu if email is not confirmed
parents 46e795fe 63a7e7bd
...@@ -8,31 +8,37 @@ import useNavItems from 'lib/hooks/useNavItems'; ...@@ -8,31 +8,37 @@ import useNavItems from 'lib/hooks/useNavItems';
import getDefaultTransitionProps from 'theme/utils/getDefaultTransitionProps'; import getDefaultTransitionProps from 'theme/utils/getDefaultTransitionProps';
import NavLink from 'ui/snippets/navigation/NavLink'; import NavLink from 'ui/snippets/navigation/NavLink';
type Props = UserInfo; type Props = {
data?: UserInfo;
};
const ProfileMenuContent = ({ name, nickname, email }: Props) => { const ProfileMenuContent = ({ data }: Props) => {
const { accountNavItems, profileItem } = useNavItems(); const { accountNavItems, profileItem } = useNavItems();
const primaryTextColor = useColorModeValue('blackAlpha.800', 'whiteAlpha.800'); const primaryTextColor = useColorModeValue('blackAlpha.800', 'whiteAlpha.800');
return ( return (
<Box> <Box>
<Text { (data?.name || data?.nickname) && (
fontSize="sm" <Text
fontWeight={ 500 } fontSize="sm"
color={ primaryTextColor } fontWeight={ 500 }
{ ...getDefaultTransitionProps() } color={ primaryTextColor }
> { ...getDefaultTransitionProps() }
Signed in as { name || nickname } >
</Text> Signed in as { data.name || data.nickname }
<Text </Text>
fontSize="sm" ) }
mb={ 1 } { data?.email && (
fontWeight={ 500 } <Text
color="gray.500" fontSize="sm"
{ ...getDefaultTransitionProps() } mb={ 1 }
> fontWeight={ 500 }
{ email } color="gray.500"
</Text> { ...getDefaultTransitionProps() }
>
{ data.email }
</Text>
) }
<NavLink item={ profileItem } isActive={ undefined } px="0px" isCollapsed={ false }/> <NavLink item={ profileItem } isActive={ undefined } px="0px" isCollapsed={ false }/>
<Box as="nav" mt={ 2 } pt={ 2 } borderTopColor="divider" borderTopWidth="1px" { ...getDefaultTransitionProps() }> <Box as="nav" mt={ 2 } pt={ 2 } borderTopColor="divider" borderTopWidth="1px" { ...getDefaultTransitionProps() }>
<VStack as="ul" spacing="0" alignItems="flex-start" overflow="hidden"> <VStack as="ul" spacing="0" alignItems="flex-start" overflow="hidden">
......
import type { ButtonProps } from '@chakra-ui/react'; import type { ButtonProps } from '@chakra-ui/react';
import { Popover, PopoverContent, PopoverBody, PopoverTrigger, Button } from '@chakra-ui/react'; import { Popover, PopoverContent, PopoverBody, PopoverTrigger, Button } from '@chakra-ui/react';
import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import useFetchProfileInfo from 'lib/hooks/useFetchProfileInfo'; import useFetchProfileInfo from 'lib/hooks/useFetchProfileInfo';
...@@ -9,25 +8,25 @@ import UserAvatar from 'ui/shared/UserAvatar'; ...@@ -9,25 +8,25 @@ import UserAvatar from 'ui/shared/UserAvatar';
import ProfileMenuContent from 'ui/snippets/profileMenu/ProfileMenuContent'; import ProfileMenuContent from 'ui/snippets/profileMenu/ProfileMenuContent';
const ProfileMenuDesktop = () => { const ProfileMenuDesktop = () => {
const { data, error } = useFetchProfileInfo(); const { data, error, isLoading } = useFetchProfileInfo();
const loginUrl = useLoginUrl(); const loginUrl = useLoginUrl();
const [ hasMenu, setHasMenu ] = React.useState(false);
const buttonProps: Partial<ButtonProps> = (() => { React.useEffect(() => {
if (error?.status === 403) { if (!isLoading) {
return { setHasMenu(Boolean(data) || error?.status === 403);
as: 'a',
href: route({ pathname: '/auth/profile' }),
};
} }
}, [ data, error?.status, isLoading ]);
if (!data) { const buttonProps: Partial<ButtonProps> = (() => {
return { if (hasMenu) {
as: 'a', return {};
href: loginUrl,
};
} }
return {}; return {
as: 'a',
href: loginUrl,
};
})(); })();
return ( return (
...@@ -43,10 +42,10 @@ const ProfileMenuDesktop = () => { ...@@ -43,10 +42,10 @@ const ProfileMenuDesktop = () => {
<UserAvatar size={ 50 }/> <UserAvatar size={ 50 }/>
</Button> </Button>
</PopoverTrigger> </PopoverTrigger>
{ data && ( { hasMenu && (
<PopoverContent w="212px"> <PopoverContent w="212px">
<PopoverBody padding="24px 16px 16px 16px"> <PopoverBody padding="24px 16px 16px 16px">
<ProfileMenuContent { ...data }/> <ProfileMenuContent data={ data }/>
</PopoverBody> </PopoverBody>
</PopoverContent> </PopoverContent>
) } ) }
......
import { Box, Drawer, DrawerOverlay, DrawerContent, DrawerBody, useDisclosure, Button } from '@chakra-ui/react'; import { Box, Drawer, DrawerOverlay, DrawerContent, DrawerBody, useDisclosure, Button } from '@chakra-ui/react';
import type { ButtonProps } from '@chakra-ui/react'; import type { ButtonProps } from '@chakra-ui/react';
import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import useFetchProfileInfo from 'lib/hooks/useFetchProfileInfo'; import useFetchProfileInfo from 'lib/hooks/useFetchProfileInfo';
...@@ -11,30 +10,30 @@ import ProfileMenuContent from 'ui/snippets/profileMenu/ProfileMenuContent'; ...@@ -11,30 +10,30 @@ import ProfileMenuContent from 'ui/snippets/profileMenu/ProfileMenuContent';
const ProfileMenuMobile = () => { const ProfileMenuMobile = () => {
const { isOpen, onOpen, onClose } = useDisclosure(); const { isOpen, onOpen, onClose } = useDisclosure();
const { data, error } = useFetchProfileInfo(); const { data, error, isLoading } = useFetchProfileInfo();
const loginUrl = useLoginUrl(); const loginUrl = useLoginUrl();
const [ hasMenu, setHasMenu ] = React.useState(false);
const buttonProps: Partial<ButtonProps> = (() => { React.useEffect(() => {
if (error?.status === 403) { if (!isLoading) {
return { setHasMenu(Boolean(data) || error?.status === 403);
as: 'a',
href: route({ pathname: '/auth/profile' }),
};
} }
}, [ data, error?.status, isLoading ]);
if (!data) { const buttonProps: Partial<ButtonProps> = (() => {
return { if (hasMenu) {
as: 'a', return {};
href: loginUrl,
};
} }
return {}; return {
as: 'a',
href: loginUrl,
};
})(); })();
return ( return (
<> <>
<Box padding={ 2 } onClick={ data ? onOpen : undefined }> <Box padding={ 2 } onClick={ hasMenu ? onOpen : undefined }>
<Button <Button
variant="unstyled" variant="unstyled"
height="auto" height="auto"
...@@ -43,7 +42,7 @@ const ProfileMenuMobile = () => { ...@@ -43,7 +42,7 @@ const ProfileMenuMobile = () => {
<UserAvatar size={ 24 }/> <UserAvatar size={ 24 }/>
</Button> </Button>
</Box> </Box>
{ data && ( { hasMenu && (
<Drawer <Drawer
isOpen={ isOpen } isOpen={ isOpen }
placement="right" placement="right"
...@@ -53,7 +52,7 @@ const ProfileMenuMobile = () => { ...@@ -53,7 +52,7 @@ const ProfileMenuMobile = () => {
<DrawerOverlay/> <DrawerOverlay/>
<DrawerContent maxWidth="260px"> <DrawerContent maxWidth="260px">
<DrawerBody p={ 6 }> <DrawerBody p={ 6 }>
<ProfileMenuContent { ...data }/> <ProfileMenuContent data={ data }/>
</DrawerBody> </DrawerBody>
</DrawerContent> </DrawerContent>
</Drawer> </Drawer>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment