wix-style-react
Version:
81 lines (70 loc) • 2.29 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import Start from './Start';
import Center from './Center';
import End from './End';
import { st, classes } from './PageFooter.st.css';
import Divider from '../Divider';
import { buildChildrenObject } from 'wix-ui-core/dist/src/utils';
/** Layout footer component of 3 columns */
const PageFooter = ({ divider, className, children, dataHook }) => {
const childrenObj = buildChildrenObject(children, {
Start: <Start key="start" />,
Center: <Center key="center" />,
End: <End key="end" />,
});
return (
<div className={classes.root}>
{divider && (
<div className={classes.divider}>
<Divider />
</div>
)}
<div
className={st(classes.container, className)}
children={Object.values(childrenObj)}
data-hook={dataHook}
>
{Object.values(childrenObj)}
</div>
</div>
);
};
PageFooter.displayName = 'PageFooter';
PageFooter.propTypes = {
/** Either `<PageFooter.Start />`, `<PageFooter.Center />` or `<PageFooter.End />` components. */
children: (props, propName) => {
const childrenArr = React.Children.toArray(props[propName]);
return childrenArr.reduce((err, child) => {
if (
!err &&
child.type.displayName !== 'PageFooter.Start' &&
child.type.displayName !== 'PageFooter.Center' &&
child.type.displayName !== 'PageFooter.End'
) {
return new Error(
`Invalid children provided, unknown child <${
child.type.displayName || child.type
} /> supplied`,
);
}
return err;
}, false);
},
/** Applied as data-hook HTML attribute that can be used in the tests */
dataHook: PropTypes.string,
/** A css class to be applied to the component's root element */
className: PropTypes.string,
/** A boolean to to determine whether to render a divider element */
divider: PropTypes.bool,
};
PageFooter.defaultProps = {
divider: false,
};
PageFooter.Start = Start;
PageFooter.Center = Center;
PageFooter.End = End;
PageFooter.Start.displayName = 'PageFooter.Start';
PageFooter.Center.displayName = 'PageFooter.Center';
PageFooter.End.displayName = 'PageFooter.End';
export default PageFooter;