import PropTypes from 'prop-types'
import React, { useContext } from 'react'
import styled, { useTheme } from 'styled-components'
import { cloneAll } from '../helpers/react'
import { textStyle } from '../helpers/theme'
import { ScreenSizeContext } from '../ScreenSizeProvider/ScreenSizeProvider'
import { DataGridContext, getMediaQuery } from './helpers'
import { JustifyContent, TransientProps } from './types'
export interface BottomSectionProps {
justifyContent?: JustifyContent
spacing?: string | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
children?: React.ReactNode
}
const BottomSection = (props: BottomSectionProps): React.ReactElement | null => {
const { children, justifyContent = 'space-between', spacing = 4 } = props
const { isCardView, cardBreakpoint, variant } = useContext(DataGridContext)
const screenSize = useContext(ScreenSizeContext)
const { space } = useTheme()
const margin = typeof spacing === 'number' ? `${space[spacing]}px` : spacing
const isTinyScreen = screenSize.toString() === 'tiny'
return (
{cloneAll(
children,
{
style: isTinyScreen ? { marginTop: margin } : { marginLeft: margin },
},
(element: React.ReactElement, cloneProps: any, index): React.ReactElement => {
if (index === 0) {
return element
}
return React.cloneElement(element, cloneProps)
}
)}
)
}
const StyledBottomSection = styled.div`
// Card view styles
display: flex;
flex-direction: column;
align-items: center;
margin-top: ${(p) => (p.$variant === 'mini' ? `${p.theme.space[3]}px` : `${p.theme.space[7]}px`)};
${(p) => textStyle(p.theme, p.$variant === 'mini' ? 'small' : 'body')}
// Non-card view styles
${getMediaQuery} {
flex-direction: row;
${(p) => `justify-content: ${p.$justifyContent};`}
}
// Card view styles when screen is larger than tiny
${(p) =>
p.$isCardView &&
`${p.theme.mediaQueries.small} {
flex-direction: row;
justify-content: ${p.$justifyContent};
margin-top: 16px;
}`}
`
BottomSection.defaultProps = {
justifyContent: 'space-between',
spacing: 4,
}
BottomSection.propTypes = {
justifyContent: PropTypes.oneOf([
'unset',
'flex-start',
'flex-end',
'center',
'space-between',
'space-around',
'space-evenly',
]),
spacing: PropTypes.oneOfType([PropTypes.string, PropTypes.oneOf([0, 1, 2, 3, 4, 5, 6, 7])]),
children: PropTypes.node,
}
BottomSection.displayName = 'BottomSection'
export default BottomSection