/* 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/. */ // @nova-cleanup(move-directory): Move to components/CustomizeMenu/WidgetsManagementPanel/ after Nova ships import React, { useEffect, useRef } from "react"; import { batch, useDispatch } from "react-redux"; import { actionCreators as ac, actionTypes as at } from "common/Actions.mjs"; // eslint-disable-next-line no-shadow import { CSSTransition } from "react-transition-group"; function WidgetsManagementPanel({ exitEventFired, onSubpanelToggle, togglePanel, showPanel, enabledSections, enabledWidgets, mayHaveWeather, mayHaveTimerWidget, mayHaveListsWidget, mayHaveWeatherForecast, weatherDisplay, setPref, }) { const arrowButtonRef = useRef(null); const panelRef = useRef(null); const dispatch = useDispatch(); // Close widget subpanel when parent menu is closed useEffect(() => { if (exitEventFired && showPanel) { togglePanel(); } }, [exitEventFired, showPanel, togglePanel]); // Notify parent menu when subpanel opens/closes useEffect(() => { if (onSubpanelToggle) { onSubpanelToggle(showPanel); } }, [showPanel, onSubpanelToggle]); const handlePanelEntered = () => { arrowButtonRef.current?.focus(); }; const onToggleWidget = e => { const { preference, eventSource } = e.target.dataset; const value = e.target.pressed; batch(() => { dispatch( ac.UserEvent({ event: "PREF_CHANGED", source: eventSource, value: { status: value, menu_source: "CUSTOMIZE_MENU" }, }) ); let widgetName; switch (eventSource) { case "WEATHER": widgetName = "weather"; break; case "WIDGET_LISTS": widgetName = "lists"; break; case "WIDGET_TIMER": widgetName = "focus_timer"; break; } if (widgetName) { const { widgetsMaximized, widgetsMayBeMaximized } = enabledWidgets; let widgetSize; if (widgetName === "weather") { if (mayHaveWeatherForecast && weatherDisplay === "detailed") { widgetSize = widgetsMayBeMaximized && !widgetsMaximized ? "small" : "medium"; } else { widgetSize = "mini"; } } else { widgetSize = widgetsMayBeMaximized && !widgetsMaximized ? "small" : "medium"; } dispatch( ac.OnlyToMain({ type: at.WIDGETS_ENABLED, data: { widget_name: widgetName, widget_source: "customize_panel", enabled: value, widget_size: widgetSize, }, }) ); } setPref(preference, value); }); }; const { weatherEnabled } = enabledSections; const { timerEnabled, listsEnabled } = enabledWidgets; return (