import * as React from 'react' import {__, _x, sprintf} from '@wordpress/i18n' import { useContext, useState, useMemo, useCallback, } from '@wordpress/element' import { __experimentalVStack as VStack, __experimentalNavigatorBackButton as NavigatorBackButton, __experimentalUseNavigator as useNavigator, MenuGroup, MenuItem, Slot, } from '@wordpress/components' import { chevronLeft, trash as trashIcon, } from '@wordpress/icons' import { ActionInput, JsonView, } from '@ska/components' import { sanitizeURIComponent, } from '@ska/utils' import { SelectorNav, } from '.' import SkaBlocks from '../../../SkaBlocks' import { usePluginPreference, } from '../../../store' import { sanitizeVariant, } from '../../../tailwind/attributes' import { useSkaBlocksDispatch, } from '../../../tailwind/reducer' import { Panel, PanelHeader, PanelBody, CopyItem, ResetItem, CopyValueItem, CopySelectorItem, Search, InspectorControlsContext, FeatureGroupInspectorControls, TailwindFeatureGroupContext, } from '../../../tailwind/inspector-controls' import type { tBlockAttributes, tBlockEditProps, } from '@ska/shared' export interface SelectorEditProps { selector: string attributes: tBlockAttributes setAttributes: tBlockEditProps['setAttributes'] } const SelectorEdit: React.FC = ({ selector, attributes, setAttributes, }) => { const [selectorName, setSelectorName] = useState(selector) const navigator = useNavigator() const [showNestedSelectors] = usePluginPreference('showNestedSelectors') const { name: blockName, groups, } = useContext(InspectorControlsContext) const dispatch = useSkaBlocksDispatch(attributes, setAttributes) const {setAttributes: dispatchSetAttributes} = dispatch const { skaBlocksSelectors = {}, } = attributes const selectors = Object.keys(skaBlocksSelectors) const { [selector]: selectorAttributes = {}, } = skaBlocksSelectors const setSelectorAttributes = useCallback((nextAttributes: tBlockAttributes) => { dispatchSetAttributes({ skaBlocksSelectors: { ...skaBlocksSelectors, [selector]: { ...selectorAttributes, ...nextAttributes, }, }, }) }, [dispatchSetAttributes, skaBlocksSelectors, selector, selectorAttributes]) const groupControls = groups.filter(group => group.hasValue(selectorAttributes, showNestedSelectors)).map(group => ( )) const fillProps = useMemo(() => ({ selector, attributes: selectorAttributes, setAttributes: setSelectorAttributes, }), [selector, selectorAttributes, setSelectorAttributes]) return <> ({ selector, classNames: SkaBlocks.tailwind.getClassNames({skaBlocksSelectors: {[selector]: selectorAttributes}}), attributes: selectorAttributes, })} /> } actions={({onClose}) => [ { onClose() navigator.goBack() dispatch.removeSelector(selector) }} /> { onClose() navigator.goBack() dispatch.removeSelector(selector) }} /> , , ]} /> { const nextSelector = sanitizeVariant(nextValue) if(!nextSelector) { return } if(selectors.includes(nextSelector)) { return } dispatch.updateSelectorName({selector, nextSelector}) const location = navigator?.location?.path || '' if(!location) { navigator.goTo('/') } const parts = location.split('/') parts[parts.length - 1] = sanitizeURIComponent(nextSelector) const nextLocation = parts.join('/') navigator.goTo(nextLocation, {replace: true, skipFocus: true}) }} /> {groupControls.length > 0 && {groupControls}} } export default SelectorEdit