import { ExternalLinkIcon } from "@chakra-ui/icons"; import { Button, Checkbox, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Text, Tooltip, } from "@chakra-ui/react"; import { ChangeEventHandler, FunctionComponent, MouseEventHandler, useState, } from "react"; import { ExternalLinkPromptOptions, PREFERS_WARN_ON_EXTERNAL_LINK_CLICK, } from "./constants"; import { ExternalLink } from "../../components/ExternalLink"; export interface ExternalLinkWarningModalProps extends ExternalLinkPromptOptions { isOpen: boolean; onClose: () => void; setShouldWarn: (shouldWarn: boolean) => void; } export const ExternalLinkWarningModal: FunctionComponent< ExternalLinkWarningModalProps > = ({ href, isOpen, onClick, onClose, setShouldWarn }) => { // Track a final state for showing warnings that will only be updated if a user chooses to proceed const [finalShouldWarn, setFinalShouldWarn] = useState(true); // Update intermediate state when preference checkmark is updated const onPreferenceUpdated: ChangeEventHandler = (e) => { const shouldWarn = !e.target.checked; setFinalShouldWarn(shouldWarn); }; const onCancel = () => { // If user cancelled the navigation, reset final warning state setFinalShouldWarn(true); onClose(); }; const onProceed: MouseEventHandler = (e) => { // If a user decided to not show warnings in the future, update localStorage & state to reflect their decision if (!finalShouldWarn) { setShouldWarn(finalShouldWarn); try { localStorage.setItem( PREFERS_WARN_ON_EXTERNAL_LINK_CLICK, JSON.stringify(finalShouldWarn) ); } catch {} } onClick?.(e); onClose(); }; return ( Confirm This link is taking you to an external site {href} Do not show this warning again. ); };