import type { ForwardedRef, HTMLAttributes, ReactNode } from 'react'; import React, { forwardRef } from 'react'; import { RequireContext } from '../../hooks/useRequireContext'; import { onlyAllowedComponentsFactory } from '../../utils/onlyAllowedComponents'; import { type AvatarProps } from '../Avatar/Avatar'; import { ReviewCardContent } from './ReviewCardContent'; import { ReviewCardFooter } from './ReviewCardFooter'; import { ReviewCardHeader } from './ReviewCardHeader'; const onlyAllowedComponents = onlyAllowedComponentsFactory( new Set([ReviewCardHeader, ReviewCardContent, ReviewCardFooter]) ); export interface ReviewCardOwnPropsWithChildren { children: ReactNode; } /** @inheritdoc */ export interface ReviewCardOwnPropsWithoutChildren extends Pick< AvatarProps, 'description' | 'lazy' | 'name' | 'src' | 'srcSet' > { /** * The title of the review. */ title?: string; /** * The content of the review. */ content: ReactNode; } /** @inheritdoc */ export type ReviewCardProps = HTMLAttributes & (ReviewCardOwnPropsWithChildren | ReviewCardOwnPropsWithoutChildren); export const ReviewCard = Object.assign( forwardRef(function ReviewCard(props: ReviewCardProps, forwardedRef: ForwardedRef) { let children: ReactNode; let rest: HTMLAttributes; if ('children' in props) { ({ children, ...rest } = props); } else { const { title, content, description, lazy, name, src, srcSet, ...remainingProps } = props; children = ( <> {title} {content} ); rest = remainingProps; } return (
{onlyAllowedComponents(children)}
); }), { Header: ReviewCardHeader, Content: ReviewCardContent, Footer: ReviewCardFooter, } );