-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy pathStarterPromptsCardAction.tsx
More file actions
78 lines (67 loc) · 3.04 KB
/
StarterPromptsCardAction.tsx
File metadata and controls
78 lines (67 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { hooks } from 'botframework-webchat';
import { type DirectLineCardAction } from 'botframework-webchat/internal';
import cx from 'classnames';
import React, { memo, useCallback, useMemo } from 'react';
import { useRefFrom } from 'use-ref-from';
import { useStyles } from '../../styles/index.js';
import testIds from '../../testIds.js';
import { FluentIcon } from '../icon';
import styles from './StarterPromptsCardAction.module.css';
const { useFocus, useRenderMarkdownAsHTML, useSendBoxValue, useUIState } = hooks;
type Props = Readonly<{
className?: string | undefined;
messageBackAction?: (DirectLineCardAction & { type: 'messageBack' }) | undefined;
}>;
const StarterPromptsCardAction = ({ className, messageBackAction }: Props) => {
const [_, setSendBoxValue] = useSendBoxValue();
const [uiState] = useUIState();
const classNames = useStyles(styles);
const focus = useFocus();
const inputTextRef = useRefFrom(messageBackAction?.displayText || messageBackAction?.text || '');
const renderMarkdownAsHTML = useRenderMarkdownAsHTML('message activity');
const subtitleHTML = useMemo<{ __html: string } | undefined>(
() => (renderMarkdownAsHTML ? { __html: renderMarkdownAsHTML(messageBackAction?.text || '') } : undefined),
[messageBackAction?.text, renderMarkdownAsHTML]
);
const disabled = uiState === 'disabled';
const title = messageBackAction && 'title' in messageBackAction && messageBackAction.title;
// Every starter prompt card action must have "title" field.
const shouldShowBlueprint = uiState === 'blueprint' || !title;
const handleClick = useCallback(() => {
setSendBoxValue(inputTextRef.current);
// Focus on the send box after the value is "pasted."
focus('sendBox');
}, [focus, inputTextRef, setSendBoxValue]);
return shouldShowBlueprint ? (
<div
className={cx(className, classNames['pre-chat-message-activity__card-action-box'])}
data-testid={testIds.preChatMessageActivityStarterPromptsCardAction}
/>
) : (
<button
aria-disabled={disabled ? true : undefined}
className={cx(className, classNames['pre-chat-message-activity__card-action-box'])}
data-testid={testIds.preChatMessageActivityStarterPromptsCardAction}
onClick={disabled ? undefined : handleClick}
// eslint-disable-next-line no-magic-numbers
tabIndex={disabled ? -1 : undefined}
type="button"
>
<div className={classNames['pre-chat-message-activity__card-action-title']}>{title}</div>
{'image' in messageBackAction && messageBackAction.image && (
<FluentIcon
appearance="text"
className={classNames['pre-chat-message-activity__card-action-image']}
mask={messageBackAction.image}
/>
)}
<div
className={classNames['pre-chat-message-activity__card-action-subtitle']}
// eslint-disable-next-line react/no-danger
dangerouslySetInnerHTML={subtitleHTML}
/>
</button>
);
};
StarterPromptsCardAction.displayName = 'StarterPromptsCardAction';
export default memo(StarterPromptsCardAction);