import { Component, JSX } from "preact" import { FoodExcludeTypes } from "./types"; export const FoodItemsContainer = (props: { children: JSX.Element | JSX.Element[] | null title: string, extra?: string, }): JSX.Element => { return ( <div> <h2>{props.title}</h2> {props.extra && <p>{props.extra}</p>} <div class="list-group" role="list"> {props.children} </div> </div> ); } function shouldShowItem(contents, exclude: FoodExcludeTypes): boolean { if (!exclude) return false; for (let key of Object.keys(exclude)) { if (Object.keys(contents).includes(key)) { if (!exclude[key]) return false; } } return true; } type BaseFoodItemProps = { contents?: Partial<FoodExcludeTypes>, exclude?: FoodExcludeTypes, } const HideIfFoodExcluded = (props: BaseFoodItemProps & { children: JSX.Element }) => { if (!props.contents) { return props.children; } else if (shouldShowItem(props.contents, props.exclude)) { return props.children; } else { return <></>; } } type FoodItemProps = BaseFoodItemProps & { title: string, }; export class FoodItem extends Component<FoodItemProps> { render() { return ( <HideIfFoodExcluded {...this.props}> <div class="list-group-item" role="listitem"> <p class="mb-1 h5">{this.props.title}</p> </div> </HideIfFoodExcluded> ) } } export class AdvancedFoodItem extends Component<FoodItemProps & { extra: string }> { render() { return ( <HideIfFoodExcluded {...this.props}> <div class="list-group-item" role="listitem"> <dt class="mb-1 h5">{this.props.title}</dt> <dd class="mb-1">{this.props.extra}</dd> </div> </HideIfFoodExcluded> ) } }