UNPKG

@yamada-ui/react

Version:

React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion

124 lines (120 loc) 3.42 kB
"use client"; import { visuallyHiddenAttributes } from "../../utils/dom.js"; import { mergeRefs } from "../../utils/ref.js"; import { utils_exports } from "../../utils/index.js"; import { useControllableState } from "../../hooks/use-controllable-state/index.js"; import { useI18n } from "../../providers/i18n-provider/i18n-provider.js"; import { useFieldProps } from "../field/use-field-props.js"; import { useToggleGroupContext } from "./use-toggle-group.js"; import { useCallback, useMemo, useRef } from "react"; //#region src/components/toggle/use-toggle.ts const useToggle = (props = {}) => { const { t } = useI18n("toggle"); const { disabled: groupDisabled, readOnly: groupReadOnly, value: groupValue, onChange: onChangeGroup, onChangeMapRef } = useToggleGroupContext() ?? {}; const { props: { id, ref, form, name, active, checked: checkedProp, defaultChecked = false, disabled, readOnly, required, value, onChange: onChangeProp,...rest }, ariaProps, dataProps, eventProps } = useFieldProps({ disabled: groupDisabled, readOnly: groupReadOnly, ...props }); const inputRef = useRef(null); const [checked, setChecked] = useControllableState({ defaultValue: defaultChecked, value: checkedProp, onChange: onChangeProp }); const interactive = !(readOnly || disabled); const controlled = !(0, utils_exports.isUndefined)(groupValue); const trulyChecked = useMemo(() => { if (!controlled) return checked; else return (0, utils_exports.isArray)(groupValue) ? groupValue.includes(value ?? "") : value === groupValue; }, [ controlled, groupValue, checked, value ]); if (controlled && (0, utils_exports.isUndefined)(value)) console.warn(`Toggle: value is required. Please set the value.`); if (value) onChangeMapRef?.current.set(value, setChecked); const onClick = useCallback(() => { if (!interactive) return; setChecked((prev) => !prev); onChangeGroup?.(value); }, [ onChangeGroup, setChecked, value, interactive ]); const onChange = useCallback((ev) => { setChecked(ev.target.checked); onChangeGroup?.(value); }, [ onChangeGroup, setChecked, value ]); const getInputProps = useCallback((props$1 = {}) => ({ ...visuallyHiddenAttributes, ...ariaProps, ...dataProps, ...eventProps, id, form, type: "checkbox", name, checked, disabled, readOnly, required, value, ...props$1, ref: mergeRefs(inputRef, ref, props$1.ref), onChange: (0, utils_exports.handlerAll)(props$1.onChange, onChange) }), [ ariaProps, checked, dataProps, disabled, eventProps, form, id, name, onChange, readOnly, ref, required, value ]); return { checked: trulyChecked, setChecked, getButtonProps: useCallback((props$1 = {}) => ({ ...dataProps, type: "button", "aria-disabled": (0, utils_exports.ariaAttr)(!interactive), "aria-label": value?.toString() ?? t("Toggle button"), "aria-pressed": trulyChecked, "data-active": (0, utils_exports.dataAttr)(active), "data-checked": (0, utils_exports.dataAttr)(trulyChecked), disabled, tabIndex: interactive ? void 0 : -1, ...rest, ...props$1, onClick: (0, utils_exports.handlerAll)(rest.onClick, props$1.onClick, onClick) }), [ dataProps, value, trulyChecked, active, disabled, rest, onClick, interactive, t ]), getInputProps }; }; //#endregion export { useToggle }; //# sourceMappingURL=use-toggle.js.map