import { MessageCard } from 'domains/store/store.types' import { className } from 'lib/css' import { FunctionalComponent } from 'preact' import { useCallback, useEffect, useMemo, useRef } from 'preact/hooks' import { useGeneratedId, useSeamlyCommands } from 'ui/hooks/seamly-hooks' import { actionTypes, cardTypes } from 'ui/utils/seamly-utils' type CardComponentProps = Partial & { id?: string hasFocus?: boolean isCarouselItem?: boolean } const CardComponent: FunctionalComponent = ({ id, action, buttonText, description, hasFocus, image, title, isCarouselItem, }) => { const cardRef = useRef(null) const { sendMessage, sendAction, emitEvent } = useSeamlyCommands() const descriptionId = useGeneratedId() const isMounted = useRef(false) const CardActionComponent = action?.type === cardTypes.navigate ? 'a' : 'button' const emitCardEvent = useCallback( () => emitEvent(`action.${actionTypes.clickCard}`, { type: actionTypes.clickCard, originMessage: id, action, }), [emitEvent, id, action], ) const handleClick = useCallback(() => { emitCardEvent() if (action?.type === cardTypes.ask) { sendMessage({ body: action?.ask }) } else if (action?.type === cardTypes.topic) { const { topic: name, fallbackMessage } = action sendAction({ type: actionTypes.setTopic, body: { name, fallbackMessage }, }) } }, [sendMessage, action, sendAction, emitCardEvent]) const actionProps = useMemo( () => action?.type === cardTypes.navigate ? { href: action?.link, rel: 'noopener noreferrer', target: action?.newTab ? '_blank' : '_self', onClick: emitCardEvent, } : { onClick: handleClick, }, [action, handleClick, emitCardEvent], ) useEffect(() => { if (isCarouselItem) { if (hasFocus && isMounted.current) { window.requestAnimationFrame(() => cardRef.current?.focus()) } else { cardRef.current?.blur() } } isMounted.current = true }, [hasFocus, isCarouselItem]) return (
{image ? ( ) : null}
{title &&

{title}

} {description && (
)} {buttonText}
) } export default CardComponent