11import React , { useEffect , useState } from "react" ;
2- import { Anchor , Flex , Button } from "@mantine/core" ;
2+ import { Anchor , Flex , Button , ActionIcon } from "@mantine/core" ;
3+ import { useSessionStorage } from "@mantine/hooks" ;
4+ import { MdClose } from "react-icons/md" ;
35
46export const BANNER_HEIGHT =
57 process . env . NEXT_PUBLIC_DISABLE_EXTERNAL_MODE === "true" ? "0px" : "40px" ;
@@ -19,8 +21,14 @@ export const Banner = () => {
1921
2022 const [ index , setIndex ] = useState ( 0 ) ;
2123 const [ visible , setVisible ] = useState ( true ) ;
24+ const [ dismissed , setDismissed ] = useSessionStorage ( {
25+ key : "jsoncrack_banner_dismissed" ,
26+ defaultValue : false ,
27+ } ) ;
2228
2329 useEffect ( ( ) => {
30+ if ( dismissed ) return ;
31+
2432 let fadeTimeout : ReturnType < typeof setTimeout > | undefined ;
2533 const intervalId = setInterval ( ( ) => {
2634 setVisible ( false ) ;
@@ -34,14 +42,23 @@ export const Banner = () => {
3442 clearInterval ( intervalId ) ;
3543 if ( fadeTimeout ) clearTimeout ( fadeTimeout ) ;
3644 } ;
37- } , [ ] ) ;
45+ } , [ dismissed ] ) ;
46+
47+ const handleDismiss = ( e : React . MouseEvent ) => {
48+ e . preventDefault ( ) ;
49+ e . stopPropagation ( ) ;
50+ setDismissed ( true ) ;
51+ } ;
52+
53+ if ( dismissed ) return null ;
3854
3955 return (
4056 < Anchor
4157 href = "https://todiagram.com/editor?utm_source=jsoncrack& utm_medium = top_banner "
4258 target = "_blank"
4359 rel = "noopener"
4460 underline = "never"
61+ style = { { position : "relative" } }
4562 >
4663 < Flex
4764 h = { BANNER_HEIGHT }
@@ -67,6 +84,19 @@ export const Banner = () => {
6784 < Button size = "xs" color = "gray" >
6885 Try now
6986 </ Button >
87+ < ActionIcon
88+ onClick = { handleDismiss }
89+ size = "sm"
90+ variant = "transparent"
91+ style = { {
92+ position : "absolute" ,
93+ right : "8px" ,
94+ color : "black" ,
95+ } }
96+ aria-label = "Close banner"
97+ >
98+ < MdClose size = { 18 } />
99+ </ ActionIcon >
70100 </ Flex >
71101 </ Anchor >
72102 ) ;
0 commit comments