fix(striker-ui): add RadioGroupWithLabel

main
Tsu-ba-me 2 years ago
parent 8fa54b7290
commit e3ebbac07e
  1. 74
      striker-ui/components/RadioGroupWithLabel.tsx
  2. 20
      striker-ui/types/RadioGroupWithLabel.d.ts

@ -0,0 +1,74 @@
import {
FormControl as MUIFormControl,
FormControlLabel as MUIFormControlLabel,
FormLabel as MUIFormLabel,
Radio as MUIRadio,
radioClasses as muiRadioClasses,
RadioGroup as MUIRadioGroup,
} from '@mui/material';
import { FC, useMemo } from 'react';
import { GREY } from '../lib/consts/DEFAULT_THEME';
import { BodyText } from './Text';
const RadioGroupWithLabel: FC<RadioGroupWithLabelProps> = ({
formControlProps,
formControlLabelProps,
formLabelProps,
id,
label,
onChange: onRadioGroupChange,
radioItems,
radioProps: { sx: radioSx, ...restRadioProps } = {},
radioGroupProps,
}) => {
const labelElement = useMemo(
() => (typeof label === 'string' ? <BodyText>{label}</BodyText> : label),
[label],
);
const itemElements = useMemo(() => {
const items = Object.entries(radioItems);
return items.map(([itemId, { label: itemLabel, value }]) => {
const itemLabelElement =
typeof itemLabel === 'string' ? (
<BodyText>{itemLabel}</BodyText>
) : (
itemLabel
);
return (
<MUIFormControlLabel
control={
<MUIRadio
{...restRadioProps}
sx={{
[`&.${muiRadioClasses.root}`]: {
color: GREY,
},
...radioSx,
}}
/>
}
key={`${id}-${itemId}`}
value={value}
label={itemLabelElement}
{...formControlLabelProps}
/>
);
});
}, [formControlLabelProps, id, radioItems, radioSx, restRadioProps]);
return (
<MUIFormControl {...formControlProps}>
<MUIFormLabel {...formLabelProps}>{labelElement}</MUIFormLabel>
<MUIRadioGroup onChange={onRadioGroupChange} row {...radioGroupProps}>
{itemElements}
</MUIRadioGroup>
</MUIFormControl>
);
};
export default RadioGroupWithLabel;

@ -0,0 +1,20 @@
type RadioItem<RadioItemValue> = {
label: import('@mui/material').FormControlLabelProps['label'];
value: RadioItemValue;
};
type RadioGroupWithLabelOptionalProps = {
formControlProps?: import('@mui/material').FormControlProps;
formControlLabelProps?: import('@mui/material').FormControlLabelProps;
formLabelProps?: import('@mui/material').FormLabelProps;
label?: import('react').ReactNode;
onChange?: import('@mui/material').RadioGroupProps['onChange'];
radioProps?: import('@mui/material').RadioProps;
radioGroupProps?: import('@mui/material').RadioGroupProps;
};
type RadioGroupWithLabelProps<RadioItemValue = string> =
RadioGroupWithLabelOptionalProps & {
id: string;
radioItems: { [id: string]: RadioItem<RadioItemValue> };
};
Loading…
Cancel
Save