import { StyleSheet, View } from 'react-native'; import { useTheme } from './../../hooks/useTheme'; import ColorUtil from '../../util/Color.util'; import LayoutConfig from '../../config/LayoutConfig'; import ThemeConfig from '../../config/Theme.config'; import type { ThemeType } from '../../literals/Type.literal'; import type { ReactElement } from 'react'; import ZenText from '../themed/ZenText'; import ZenDivider from './../structure/ZenDivider'; /** * @docunator * @title CardHeaderProps * @description Props for the CardHeader component. * @category Structure Components Props */ type CardHeaderProps = { title?: string; type?: ThemeType | undefined; leftAccessory?: ReactElement | ReactElement[] | undefined; rightAccessory?: ReactElement | ReactElement[] | undefined; }; /** * @docunator * @title CardHeader * @author Danilo Ramírez Mattey * @version 1.0.0 * @description A simple header component for the Card component. * @category Structure Components * @param {string} title - The title of the card header. * @param {string} type - The theme type of the card header. * @param {Element} leftAccessory - The left accessory component of the card header. * @param {Element} rightAccessory - The right accessory component of the card header. * @see Card */ export function CardHeader({ title, type = undefined, leftAccessory, rightAccessory, }: CardHeaderProps): ReactElement { const styles = StyleSheet.create({ header: { display: 'flex', flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-start', // marginBottom: LayoutConfig.space / 2, gap: LayoutConfig.space, }, right: { flex: 1, display: 'flex', flexDirection: 'row', justifyContent: 'flex-end', alignItems: 'center', gap: LayoutConfig.space, }, }); return ( <> {leftAccessory} {title} {rightAccessory && {rightAccessory}} {type && } ); } /*******************************************************************************************************************************/ /** * @docunator * @title Card Footer Props * @description Props for the CardFooter component. * @category Structure Components Props */ type CardFooterProps = { type?: ThemeType; children?: any; }; /** * @docunator * @title CardFooter * @description A simple footer component for the Card component. * @author Danilo Ramírez Mattey * @version 1.0.0 * @category Structure Components * @param {string} type - The theme type of the card footer. * @param {Element} children - The children components of the card footer. * @see Card */ export function CardFooter({ type = 'primary', children }: CardFooterProps) { const theme = useTheme(); if (theme[type] === undefined) { throw new Error( `Theme type "${type}" is not defined in the current theme.` ); } const styles = StyleSheet.create({ footer: {}, }); return ( {children} ); } /*******************************************************************************************************************************/ /** * @docunator * @title CardProps * @description Props for the Card component. * @category Structure Components Props */ type CardProps = { children?: any; type?: ThemeType | undefined; title?: string; headerLeftAccessory?: ReactElement | ReactElement[] | undefined; headerRightAccessory?: ReactElement | ReactElement[] | undefined; backColor?: string | undefined; header?: any; footer?: any; }; /** * @docunator * @title Card * @description A simple card component to display content in a card-like container. * @category Structure Components * @author Danilo Ramírez Mattey * @version 1.0.0 * @param {Element} children - The content of the card. * @param {string} type - The theme type of the card. * @param {string} title - The title of the card. * @param {Element} headerLeftAccessory - The left accessory component of the card header. * @param {Element} headerRightAccessory - The right accessory component of the card header. * @param {string} backColor - We can overwrite the background color by passing a custom color here. * @param {Element} header We can overwrite the header by passing a custom component here. * @param {Element} footer We can use this parameter to add a footer component to the card. We recomend using the CardFooter component. * @see CardFooter * @see CardHeader */ export default function Card({ children, type = undefined, title, headerLeftAccessory = undefined, headerRightAccessory = undefined, backColor = undefined, header, footer, }: CardProps) { const theme = useTheme(); const cardBackgroundColor = ColorUtil.shade( theme.background, ThemeConfig.defaultCardBackgroundFactor ); if (type !== undefined && theme[type] === undefined) { throw new Error( `Theme type "${type}" is not defined in the current theme.` ); } const styles = StyleSheet.create({ card: { flex: 1, backgroundColor: backColor ?? cardBackgroundColor, borderRadius: LayoutConfig.border, padding: LayoutConfig.space, marginTop: LayoutConfig.space, marginBottom: LayoutConfig.space, borderWidth: type !== undefined ? 1 : 0, borderColor: type !== undefined ? theme[type] : 'transparent', }, }); return ( {title !== undefined && header === undefined && ( )} {header} {children} {footer} ); }