@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
JavaScript
"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