mirror of
https://github.com/luxfi/explore.git
synced 2026-09-24 00:28:18 +00:00
116 lines
3.8 KiB
TypeScript
116 lines
3.8 KiB
TypeScript
import { Flex, Box, useBreakpointValue, chakra } from '@chakra-ui/react';
|
|
import React, { useCallback, useState, useEffect } from 'react';
|
|
import { keccak256, stringToBytes } from 'viem';
|
|
|
|
import config from 'configs/app';
|
|
import useIsMobile from 'lib/hooks/useIsMobile';
|
|
import { Tooltip } from 'toolkit/chakra/tooltip';
|
|
import IconSvg from 'ui/shared/IconSvg';
|
|
|
|
import NavigationPromoBannerContent from './NavigationPromoBannerContent';
|
|
|
|
const PROMO_BANNER_CLOSED_HASH_KEY = 'nav-promo-banner-closed-hash';
|
|
const promoBanner = config.UI.navigation.promoBanner;
|
|
const isHorizontal = config.UI.navigation.layout === 'horizontal';
|
|
|
|
type Props = {
|
|
isCollapsed?: boolean;
|
|
};
|
|
|
|
const NavigationPromoBanner = ({ isCollapsed }: Props) => {
|
|
const isMobile = useIsMobile();
|
|
const isXLScreen = useBreakpointValue({ base: false, xl: true });
|
|
const isHorizontalNavigation = isHorizontal && !isMobile;
|
|
|
|
const [ isShown, setIsShown ] = useState(false);
|
|
const [ promoBannerHash, setPromoBannerHash ] = useState('');
|
|
|
|
useEffect(() => {
|
|
try {
|
|
const promoBannerClosedHash = window.localStorage.getItem(PROMO_BANNER_CLOSED_HASH_KEY);
|
|
const promoBannerHash = keccak256(stringToBytes(JSON.stringify(promoBanner)));
|
|
setIsShown(promoBannerHash !== promoBannerClosedHash);
|
|
setPromoBannerHash(promoBannerHash);
|
|
} catch {}
|
|
}, []);
|
|
|
|
const handleClose = useCallback((e: React.MouseEvent<HTMLDivElement>) => {
|
|
e.preventDefault();
|
|
localStorage.setItem(PROMO_BANNER_CLOSED_HASH_KEY, promoBannerHash);
|
|
setIsShown(false);
|
|
}, [ promoBannerHash ]);
|
|
|
|
const isTooltipDisabled = isMobile || (!isHorizontalNavigation && (isCollapsed === false || (isCollapsed === undefined && isXLScreen)));
|
|
|
|
if (!promoBanner || !isShown) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<Flex flex={ 1 } mt={ isHorizontalNavigation ? 0 : 3 } pointerEvents="none">
|
|
<chakra.a
|
|
href={ promoBanner.link_url }
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
pointerEvents="auto"
|
|
w="full"
|
|
minW={ isHorizontalNavigation ? 'auto' : '60px' }
|
|
mt="auto"
|
|
position={ isHorizontalNavigation ? undefined : 'sticky' }
|
|
bottom={ isHorizontalNavigation ? undefined : { base: 0, lg: 6 } }
|
|
overflow="hidden"
|
|
_hover={{
|
|
opacity: 0.8,
|
|
_icon: {
|
|
display: 'block',
|
|
},
|
|
}}
|
|
>
|
|
<Tooltip
|
|
content={ !isTooltipDisabled && (
|
|
<NavigationPromoBannerContent
|
|
isCollapsed={ false }
|
|
isHorizontalNavigation={ false }
|
|
/>
|
|
) }
|
|
showArrow={ false }
|
|
positioning={{
|
|
placement: isHorizontalNavigation ? 'bottom' : 'right-end',
|
|
offset: { crossAxis: 0, mainAxis: isHorizontalNavigation ? 8 : 5 },
|
|
}}
|
|
contentProps={{
|
|
p: 0,
|
|
borderRadius: 'base',
|
|
bgColor: 'transparent',
|
|
boxShadow: isHorizontalNavigation ? '2xl' : 'none',
|
|
cursor: 'default',
|
|
}}
|
|
interactive
|
|
>
|
|
<Box w="full" position="relative">
|
|
<NavigationPromoBannerContent
|
|
isCollapsed={ isCollapsed }
|
|
isHorizontalNavigation={ isHorizontalNavigation }
|
|
/>
|
|
<IconSvg
|
|
onClick={ handleClose }
|
|
name="close"
|
|
boxSize={ 3 }
|
|
color={{ _light: 'gray.300', _dark: 'gray.600' }}
|
|
bgColor="bg.primary"
|
|
borderBottomLeftRadius="sm"
|
|
borderTopRightRadius="sm"
|
|
position="absolute"
|
|
top="0"
|
|
right="0"
|
|
display={ isMobile ? 'block' : 'none' }
|
|
/>
|
|
</Box>
|
|
</Tooltip>
|
|
</chakra.a>
|
|
</Flex>
|
|
);
|
|
};
|
|
|
|
export default NavigationPromoBanner;
|