@yamada-ui/menu
Version:
Yamada UI menu component
69 lines (67 loc) • 2.11 kB
JavaScript
"use client"
import {
MenuGroup
} from "./chunk-AGHG37SL.mjs";
import {
MenuOptionItem
} from "./chunk-D2UJVOJ7.mjs";
// src/menu-option-group.tsx
import { useControllableState } from "@yamada-ui/use-controllable-state";
import { cx, getValidChildren, isArray, isString } from "@yamada-ui/utils";
import { cloneElement, forwardRef, useCallback } from "react";
import { jsx } from "react/jsx-runtime";
var MenuOptionGroup = forwardRef(
({
type,
className,
children,
defaultValue,
value: valueProp,
onChange: onChangeProp,
...rest
}, ref) => {
const radio = type === "radio";
defaultValue != null ? defaultValue : defaultValue = radio ? "" : [];
const [value, setValue] = useControllableState({
defaultValue,
value: valueProp,
onChange: onChangeProp
});
const onChange = useCallback(
(selectedValue) => {
if (radio && isString(value)) setValue(selectedValue);
if (!radio && isArray(value)) {
const nextValue = value.includes(selectedValue) ? value.filter((item) => item !== selectedValue) : value.concat(selectedValue);
setValue(nextValue);
}
},
[radio, value, setValue]
);
const validChildren = getValidChildren(children);
const cloneChildren = validChildren.map((child) => {
if (child.type !== MenuOptionItem) return child;
const onClick = (ev) => {
var _a, _b;
onChange(child.props.value);
(_b = (_a = child.props).onClick) == null ? void 0 : _b.call(_a, ev);
};
const checked = !radio && isArray(value) ? value.includes(child.props.value) : child.props.value === value;
return cloneElement(child, { type, checked, onClick });
});
return /* @__PURE__ */ jsx(
MenuGroup,
{
ref,
className: cx("ui-menu__item--group--option", className),
...rest,
children: cloneChildren
}
);
}
);
MenuOptionGroup.displayName = "MenuOptionGroup";
MenuOptionGroup.__ui__ = "MenuOptionGroup";
export {
MenuOptionGroup
};
//# sourceMappingURL=chunk-PHY5XCWA.mjs.map