import { validateProps } from '@msinternal/botframework-webchat-react-valibot'; import { hooks } from 'botframework-webchat'; import { type WebChatActivity } from 'botframework-webchat/internal.js'; import cx from 'classnames'; import React, { memo, useMemo, type CSSProperties } from 'react'; import { custom, is, object, optional, pipe, readonly, string, type InferInput } from 'valibot'; import { useStyles } from '../../styles'; import styles from './CopilotMessageHeader.module.css'; import isAIGeneratedActivity from './private/isAIGeneratedActivity'; import useActivityStyleOptions from './private/useActivityStyleOptions'; import useFirstActivityAuthor from './private/useFirstActivityAuthor'; const { useLocalizer } = hooks; const copilotMessageHeaderPropsSchema = pipe( object({ activity: optional(custom>(value => is(object({}), value))), className: optional(string()) }), readonly() ); type CopilotMessageHeaderProps = InferInput; function CopilotMessageHeader(props: CopilotMessageHeaderProps) { const { activity, className } = validateProps(copilotMessageHeaderPropsSchema, props); const [{ botAvatarImage, botAvatarBackgroundColor }] = useActivityStyleOptions(activity); const classNames = useStyles(styles); const localize = useLocalizer(); const isAIGenerated = isAIGeneratedActivity(activity); const avatarStyle = useMemo( () => ({ '--background-color': botAvatarBackgroundColor }) as CSSProperties, [botAvatarBackgroundColor] ); const author = useFirstActivityAuthor(activity); const avatarImage = author?.image[0] || botAvatarImage; const botTitle = (author?.name[0] || activity?.from?.name) ?? ''; return (
{avatarImage && ( {localize('AVATAR_ALT', )} {botTitle} {isAIGenerated && ( {localize('ACTIVITY_CONTENT_CAUTION')} )}
); } export default memo(CopilotMessageHeader); export { copilotMessageHeaderPropsSchema, type CopilotMessageHeaderProps };