import React, { forwardRef, useContext } from 'react';
import { CheckboxProvider } from './CheckboxProvider';
import { VisuallyHidden } from '@react-aria/visually-hidden';
import { useFocusRing } from '@react-native-aria/focus';
import { useHover } from '@react-native-aria/interactions';
import { useToggleState } from '@react-stately/toggle';
import { useCheckbox, useCheckboxGroupItem } from '@react-native-aria/checkbox';
import { Platform } from 'react-native';
import { CheckboxGroupContext } from './CheckboxGroup';
import { useCheckboxContext } from './context';
import { combineContextAndProps } from '@universa11y/utils';
export const Checkbox = (StyledCheckbox: any) =>
forwardRef(({ children, ...props }: any) => {
const checkboxGroupContext = useContext(CheckboxGroupContext);
const formControlContext = useCheckboxContext();
const _ref = React.useRef(null);
const { isHovered } = useHover({}, _ref);
const state = useToggleState({
...props,
defaultSelected: props.defaultIsChecked,
isSelected: props.isChecked,
});
const { focusProps, isFocusVisible } = useFocusRing();
const { isInvalid, isReadOnly, isIndeterminate, ...combinedProps } =
combineContextAndProps(formControlContext, props);
const { inputProps } = checkboxGroupContext
? // eslint-disable-next-line react-hooks/rules-of-hooks
useCheckboxGroupItem(
{
...combinedProps,
'aria-label': combinedProps.accessibilityLabel,
'value': combinedProps.value,
},
checkboxGroupContext.state,
//@ts-ignore
_ref
)
: // eslint-disable-next-line react-hooks/rules-of-hooks
useCheckbox(
{
...combinedProps,
'aria-label': combinedProps.accessibilityLabel,
},
state,
//@ts-ignore
_ref
);
const contextCombinedProps = { ...checkboxGroupContext, ...combinedProps };
const { checked: isChecked, disabled: isDisabled } = inputProps;
if (Platform.OS === 'web') {
return (
{children}
);
} else {
return (
{children}
);
}
});