{
  "version": 3,
  "sources": ["../../../src/tools-panel/tools-panel-item/hook.ts"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { usePrevious } from '@wordpress/compose';\nimport { useCallback, useEffect, useLayoutEffect, useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport * as styles from '../styles';\nimport { useToolsPanelContext } from '../context';\nimport { useContextSystem } from '../../context';\nimport { useCx } from '../../utils/hooks/use-cx';\nconst noop = () => {};\nexport function useToolsPanelItem(props) {\n  const {\n    className,\n    hasValue,\n    isShownByDefault = false,\n    label,\n    panelId,\n    resetAllFilter = noop,\n    onDeselect,\n    onSelect,\n    ...otherProps\n  } = useContextSystem(props, 'ToolsPanelItem');\n  const {\n    panelId: currentPanelId,\n    menuItems,\n    registerResetAllFilter,\n    deregisterResetAllFilter,\n    registerPanelItem,\n    deregisterPanelItem,\n    flagItemCustomization,\n    isResetting,\n    shouldRenderPlaceholderItems: shouldRenderPlaceholder,\n    firstDisplayedItem,\n    lastDisplayedItem,\n    __experimentalFirstVisibleItemClass,\n    __experimentalLastVisibleItemClass\n  } = useToolsPanelContext();\n\n  // hasValue is a new function on every render, so do not add it as a\n  // dependency to the useCallback hook! If needed, we should use a ref.\n  const hasValueCallback = useCallback(hasValue, [panelId]);\n  // resetAllFilter is a new function on every render, so do not add it as a\n  // dependency to the useCallback hook! If needed, we should use a ref.\n  const resetAllFilterCallback = useCallback(resetAllFilter, [panelId]);\n  const previousPanelId = usePrevious(currentPanelId);\n  const hasMatchingPanel = currentPanelId === panelId || currentPanelId === null;\n\n  // Registering the panel item allows the panel to include it in its\n  // automatically generated menu and determine its initial checked status.\n  //\n  // This is performed in a layout effect to ensure that the panel item\n  // is registered before it is rendered preventing a rendering glitch.\n  // See: https://github.com/WordPress/gutenberg/issues/56470\n  useLayoutEffect(() => {\n    if (hasMatchingPanel && previousPanelId !== null) {\n      registerPanelItem({\n        hasValue: hasValueCallback,\n        isShownByDefault,\n        label,\n        panelId\n      });\n    }\n    return () => {\n      if (previousPanelId === null && !!currentPanelId || currentPanelId === panelId) {\n        deregisterPanelItem(label);\n      }\n    };\n  }, [currentPanelId, hasMatchingPanel, isShownByDefault, label, hasValueCallback, panelId, previousPanelId, registerPanelItem, deregisterPanelItem]);\n  useEffect(() => {\n    if (hasMatchingPanel) {\n      registerResetAllFilter(resetAllFilterCallback);\n    }\n    return () => {\n      if (hasMatchingPanel) {\n        deregisterResetAllFilter(resetAllFilterCallback);\n      }\n    };\n  }, [registerResetAllFilter, deregisterResetAllFilter, resetAllFilterCallback, hasMatchingPanel]);\n\n  // Note: `label` is used as a key when building menu item state in\n  // `ToolsPanel`.\n  const menuGroup = isShownByDefault ? 'default' : 'optional';\n  const isMenuItemChecked = menuItems?.[menuGroup]?.[label];\n  const wasMenuItemChecked = usePrevious(isMenuItemChecked);\n  const isRegistered = menuItems?.[menuGroup]?.[label] !== undefined;\n  const isValueSet = hasValue();\n  // Notify the panel when an item's value has changed except for optional\n  // items without value because the item should not cause itself to hide.\n  useEffect(() => {\n    if (!isShownByDefault && !isValueSet) {\n      return;\n    }\n    flagItemCustomization(isValueSet, label, menuGroup);\n  }, [isValueSet, menuGroup, label, flagItemCustomization, isShownByDefault]);\n\n  // Determine if the panel item's corresponding menu is being toggled and\n  // trigger appropriate callback if it is.\n  useEffect(() => {\n    // We check whether this item is currently registered as items rendered\n    // via fills can persist through the parent panel being remounted.\n    // See: https://github.com/WordPress/gutenberg/pull/45673\n    if (!isRegistered || isResetting || !hasMatchingPanel) {\n      return;\n    }\n    if (isMenuItemChecked && !isValueSet && !wasMenuItemChecked) {\n      onSelect?.();\n    }\n    if (!isMenuItemChecked && isValueSet && wasMenuItemChecked) {\n      onDeselect?.();\n    }\n  }, [hasMatchingPanel, isMenuItemChecked, isRegistered, isResetting, isValueSet, wasMenuItemChecked, onSelect, onDeselect]);\n\n  // The item is shown if it is a default control regardless of whether it\n  // has a value. Optional items are shown when they are checked or have\n  // a value.\n  const isShown = isShownByDefault ? menuItems?.[menuGroup]?.[label] !== undefined : isMenuItemChecked;\n  const cx = useCx();\n  const classes = useMemo(() => {\n    const shouldApplyPlaceholderStyles = shouldRenderPlaceholder && !isShown;\n    const firstItemStyle = firstDisplayedItem === label && __experimentalFirstVisibleItemClass;\n    const lastItemStyle = lastDisplayedItem === label && __experimentalLastVisibleItemClass;\n    return cx(styles.ToolsPanelItem, shouldApplyPlaceholderStyles && styles.ToolsPanelItemPlaceholder, !shouldApplyPlaceholderStyles && className, firstItemStyle, lastItemStyle);\n  }, [isShown, shouldRenderPlaceholder, className, cx, firstDisplayedItem, lastDisplayedItem, __experimentalFirstVisibleItemClass, __experimentalLastVisibleItemClass, label]);\n  return {\n    ...otherProps,\n    isShown,\n    shouldRenderPlaceholder,\n    className: classes\n  };\n}"],
  "mappings": "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",
  "names": ["import_context"]
}
