/* 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 { ASRouterUtils } from "../../asrouter-utils.mjs"; import React, { useState, useMemo, useCallback, useEffect, useRef, } from "react"; const stringify = json => JSON.stringify(json, null, 2); export const ImpressionsSection = ({ messageImpressions, groupImpressions, screenImpressions, }) => { const handleSaveMessageImpressions = useCallback(newImpressions => { ASRouterUtils.editState("messageImpressions", newImpressions); }, []); const handleSaveGroupImpressions = useCallback(newImpressions => { ASRouterUtils.editState("groupImpressions", newImpressions); }, []); const handleSaveScreenImpressions = useCallback(newImpressions => { ASRouterUtils.editState("screenImpressions", newImpressions); }, []); const handleResetMessageImpressions = useCallback(() => { ASRouterUtils.sendMessage({ type: "RESET_MESSAGE_STATE" }); }, []); const handleResetGroupImpressions = useCallback(() => { ASRouterUtils.sendMessage({ type: "RESET_GROUPS_STATE" }); }, []); const handleResetScreenImpressions = useCallback(() => { ASRouterUtils.sendMessage({ type: "RESET_SCREEN_IMPRESSIONS" }); }, []); return (
); }; const ImpressionsItem = ({ impressions, label, description, validator, onSave, onReset, }) => { const [json, setJson] = useState(stringify(impressions)); const modified = useRef(false); const isValidJson = useCallback( text => { try { JSON.parse(text); return validator ? validator(text) : true; } catch (e) { return false; } }, [validator] ); const jsonIsInvalid = useMemo(() => !isValidJson(json), [json, isValidJson]); const handleChange = useCallback(e => { setJson(e.target.value); modified.current = true; }, []); const handleSave = useCallback(() => { if (jsonIsInvalid) { return; } const newImpressions = JSON.parse(json); modified.current = false; onSave(newImpressions); }, [json, jsonIsInvalid, onSave]); const handleReset = useCallback(() => { modified.current = false; onReset(); }, [onReset]); useEffect(() => { if (!modified.current) { setJson(stringify(impressions)); } }, [impressions]); return (
{label} {description ? (

{description}

) : null}