@appbuckets/react-ui
Version:
Just Another React UI Framework
122 lines (119 loc) • 3.44 kB
JavaScript
import { __rest, __read, __assign } from 'tslib';
import * as React from 'react';
import clsx from 'clsx';
import {
useAutoControlledValue,
childrenUtils,
} from '@appbuckets/react-ui-core';
import '../BucketTheme/BucketTheme.js';
import { useWithDefaultProps } from '../BucketTheme/BucketContext.js';
import { useField } from '../hooks/useField.js';
import { useSharedClassName } from '../utils/customHook.js';
import Field from '../Field/Field.js';
import RadioOption from './RadioOption.js';
import { RadioContextProvider } from './Radio.context.js';
var Radio = function (receivedProps) {
var props = useWithDefaultProps('radio', receivedProps);
var _a = useSharedClassName(props),
className = _a.className,
_b = _a.rest,
/** Strict RadioGroup Props */
children = _b.children;
_b.columnsCount;
var content = _b.content,
userDefinedDefaultValue = _b.defaultValue,
userDefinedOnChangeHandler = _b.onChange,
options = _b.options,
stacked = _b.stacked,
userDefinedValue = _b.value,
rawRest = __rest(_b, [
'children',
'columnsCount',
'content',
'defaultValue',
'onChange',
'options',
'stacked',
'value',
]);
// ----
// AutoController Radio Value
// ----
var _c = __read(
useAutoControlledValue(undefined, {
prop: userDefinedValue,
defaultProp: userDefinedDefaultValue,
}),
2
),
value = _c[0],
trySetValue = _c[1];
// ----
// Build Field and Helpers
// ----
var _d = useField(rawRest),
fieldRef = _d.fieldRef,
fieldProps = _d.fieldProps;
_d.rest;
var helpers = __rest(_d, ['fieldRef', 'fieldProps', 'rest']);
// ----
// Context Value
// ----
var ctx = {
currentValue: value,
setValue: function (event, newValue) {
/** Set the field as touched and dirty */
helpers.setFieldChanged();
helpers.setFieldClicked();
/** Call user defined handler if exists */
if (typeof userDefinedOnChangeHandler === 'function') {
userDefinedOnChangeHandler(
event,
__assign(__assign({}, props), { value: newValue })
);
}
/** Try to change the value */
trySetValue(newValue);
},
};
// ----
// Render the Component
// ----
var classes = clsx('radio-group', { stacked: stacked }, className);
if (Array.isArray(options)) {
return React.createElement(
RadioContextProvider,
{ value: ctx },
React.createElement(
Field,
__assign({ ref: fieldRef }, fieldProps, { className: classes }),
options.map(function (option) {
return RadioOption.create(option, {
autoGenerateKey: false,
defaultProps: {
appearance: fieldProps.appearance,
danger: fieldProps.danger,
info: fieldProps.info,
primary: fieldProps.primary,
secondary: fieldProps.secondary,
success: fieldProps.success,
warning: fieldProps.warning,
},
});
})
)
);
}
return React.createElement(
RadioContextProvider,
{ value: ctx },
React.createElement(
Field,
__assign({ ref: fieldRef }, fieldProps, { className: classes }),
childrenUtils.isNil(children) ? content : children
)
);
};
Radio.Option = RadioOption;
Radio.displayName = 'Radio';
export { Radio as default };