Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(TileGroup): add TypeScript types #15430

Merged
merged 4 commits into from
Jan 3, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
chore: yarn format
  • Loading branch information
alisonjoseph committed Jan 2, 2024
commit 22fe1097eca1460ae4c8e74a3dc163163c88b4c2
142 changes: 70 additions & 72 deletions packages/react/src/components/TileGroup/TileGroup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,85 +58,83 @@ export interface TileGroupProps
valueSelected?: string | number;
}

const TileGroup =
(props) => {
const {
children,
className,
defaultSelected,
disabled,
legend,
name,
onChange = noopFn,
valueSelected,
} = props;
const prefix = usePrefix();

const [selected, setSelected] = useState(valueSelected ?? defaultSelected);
const [prevValueSelected, setPrevValueSelected] = useState(valueSelected);

/**
* prop + state alignment - getDerivedStateFromProps
* only update if selected prop changes
*/
if (valueSelected !== prevValueSelected) {
setSelected(valueSelected);
setPrevValueSelected(valueSelected);
}

const getRadioTiles = () => {
const childrenArray = React.Children.toArray(children);
const radioTiles = childrenArray.map((tileRadio) => {
const tileRadioProps =
(tileRadio as ReactElementLike).props ?? undefined;
const { value, ...other } = tileRadioProps;
/* istanbul ignore if */
if (typeof tileRadioProps.checked !== 'undefined') {
warning(
false,
`Instead of using the checked property on the RadioTile, set
const TileGroup = (props) => {
const {
children,
className,
defaultSelected,
disabled,
legend,
name,
onChange = noopFn,
valueSelected,
} = props;
const prefix = usePrefix();

const [selected, setSelected] = useState(valueSelected ?? defaultSelected);
const [prevValueSelected, setPrevValueSelected] = useState(valueSelected);

/**
* prop + state alignment - getDerivedStateFromProps
* only update if selected prop changes
*/
if (valueSelected !== prevValueSelected) {
setSelected(valueSelected);
setPrevValueSelected(valueSelected);
}

const getRadioTiles = () => {
const childrenArray = React.Children.toArray(children);
const radioTiles = childrenArray.map((tileRadio) => {
const tileRadioProps = (tileRadio as ReactElementLike).props ?? undefined;
const { value, ...other } = tileRadioProps;
/* istanbul ignore if */
if (typeof tileRadioProps.checked !== 'undefined') {
warning(
false,
`Instead of using the checked property on the RadioTile, set
the defaultSelected property or valueSelected property on the TileGroup.`
);
}

return (
<RadioTile
{...other}
name={name}
key={value}
value={value}
onChange={handleChange}
checked={value === selected}
/>
);
});
}

return radioTiles;
};
return (
<RadioTile
{...other}
name={name}
key={value}
value={value}
onChange={handleChange}
checked={value === selected}
/>
);
});

return radioTiles;
};

const handleChange = (newSelection, value, evt) => {
if (newSelection !== selected) {
setSelected(newSelection);
onChange(newSelection, name, evt);
}
};
const handleChange = (newSelection, value, evt) => {
if (newSelection !== selected) {
setSelected(newSelection);
onChange(newSelection, name, evt);
}
};

const renderLegend = (legend) => {
if (legend) {
return <legend className={`${prefix}--label`}>{legend}</legend>;
}
};

return (
<fieldset
className={className ?? `${prefix}--tile-group`}
disabled={disabled}>
{renderLegend(legend)}
<div>{getRadioTiles()}</div>
</fieldset>
);
const renderLegend = (legend) => {
if (legend) {
return <legend className={`${prefix}--label`}>{legend}</legend>;
}
};

return (
<fieldset
className={className ?? `${prefix}--tile-group`}
disabled={disabled}>
{renderLegend(legend)}
<div>{getRadioTiles()}</div>
</fieldset>
);
};

TileGroup.propTypes = {
/**
* Provide a collection of <RadioTile> components to render in the group
Expand Down