/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ import React, { useCallback } from "react"; import { useSelector } from "react-redux"; import { actionCreators as ac, actionTypes as at } from "common/Actions.mjs"; import { MessageWrapper } from "content-src/components/MessageWrapper/MessageWrapper"; import { FeatureHighlight } from "./FeatureHighlight"; import { HighlightPopoverBody } from "./HighlightPopoverBody"; import { DISMISS_MODES, SHELLS, getRegistryEntry, } from "./OMCHighlightRegistry.mjs"; // MESSAGE_CLICK telemetry source label for the callout's CTA button. const CTA_CLICK_SOURCE = "cta"; const PopoverShell = ({ entry, content, handleDismiss, handleBlock, handleClick, handleClose, dispatch, }) => { const dismissCallback = useCallback(() => { handleDismiss?.(); if (entry.dismiss === DISMISS_MODES.BLOCK) { handleBlock?.(); } }, [entry.dismiss, handleDismiss, handleBlock]); // The CTA opens content.surveyUrl in a new tab and records the click. Taking // the survey is a conversion, not a dismissal, so we block (to keep the // callout from reappearing) and close the popover, but leave MESSAGE_DISMISS // to the X button and outside clicks. Only wired up when a surveyUrl is // present so we never render a "Take survey" button that just closes. const surveyUrl = content?.surveyUrl; const onCtaClick = useCallback(() => { dispatch( ac.OnlyToMain({ type: at.OPEN_LINK, data: { url: surveyUrl, where: "tab" }, }) ); handleClick?.(CTA_CLICK_SOURCE); if (entry.dismiss === DISMISS_MODES.BLOCK) { handleBlock?.(); } handleClose?.(); }, [ surveyUrl, entry.dismiss, dispatch, handleClick, handleBlock, handleClose, ]); return ( } dismissCallback={dismissCallback} outsideClickCallback={handleDismiss} /> ); }; export const OMCHighlightSlot = ({ slot, dispatch }) => { const { messageData } = useSelector(state => state.Messages); const content = messageData?.content; const entry = getRegistryEntry(content?.messageType); if (!entry || entry.slot !== slot) { return null; } if (entry.shell === SHELLS.POPOVER) { return ( ); } return null; };