@yext/chat-ui-react 0.12.1 → 0.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +14 -3
- package/lib/bundle.css +0 -1
- package/lib/commonjs/package.json.js +0 -6
- package/lib/commonjs/package.json.js.map +0 -1
- package/lib/commonjs/src/components/ChatHeader.d.ts +0 -53
- package/lib/commonjs/src/components/ChatHeader.d.ts.map +0 -1
- package/lib/commonjs/src/components/ChatHeader.js +0 -52
- package/lib/commonjs/src/components/ChatHeader.js.map +0 -1
- package/lib/commonjs/src/components/ChatInput.d.ts +0 -60
- package/lib/commonjs/src/components/ChatInput.d.ts.map +0 -1
- package/lib/commonjs/src/components/ChatInput.js +0 -76
- package/lib/commonjs/src/components/ChatInput.js.map +0 -1
- package/lib/commonjs/src/components/ChatPanel.d.ts +0 -74
- package/lib/commonjs/src/components/ChatPanel.d.ts.map +0 -1
- package/lib/commonjs/src/components/ChatPanel.js +0 -178
- package/lib/commonjs/src/components/ChatPanel.js.map +0 -1
- package/lib/commonjs/src/components/ChatPopUp.d.ts +0 -76
- package/lib/commonjs/src/components/ChatPopUp.d.ts.map +0 -1
- package/lib/commonjs/src/components/ChatPopUp.js +0 -160
- package/lib/commonjs/src/components/ChatPopUp.js.map +0 -1
- package/lib/commonjs/src/components/FeedbackButtons.d.ts +0 -35
- package/lib/commonjs/src/components/FeedbackButtons.d.ts.map +0 -1
- package/lib/commonjs/src/components/FeedbackButtons.js +0 -59
- package/lib/commonjs/src/components/FeedbackButtons.js.map +0 -1
- package/lib/commonjs/src/components/InitialMessagePopUp.d.ts +0 -33
- package/lib/commonjs/src/components/InitialMessagePopUp.d.ts.map +0 -1
- package/lib/commonjs/src/components/InitialMessagePopUp.js +0 -44
- package/lib/commonjs/src/components/InitialMessagePopUp.js.map +0 -1
- package/lib/commonjs/src/components/LoadingDots.d.ts +0 -10
- package/lib/commonjs/src/components/LoadingDots.d.ts.map +0 -1
- package/lib/commonjs/src/components/LoadingDots.js +0 -23
- package/lib/commonjs/src/components/LoadingDots.js.map +0 -1
- package/lib/commonjs/src/components/Markdown.d.ts +0 -39
- package/lib/commonjs/src/components/Markdown.d.ts.map +0 -1
- package/lib/commonjs/src/components/Markdown.js +0 -72
- package/lib/commonjs/src/components/Markdown.js.map +0 -1
- package/lib/commonjs/src/components/MessageBubble.d.ts +0 -64
- package/lib/commonjs/src/components/MessageBubble.d.ts.map +0 -1
- package/lib/commonjs/src/components/MessageBubble.js +0 -77
- package/lib/commonjs/src/components/MessageBubble.js.map +0 -1
- package/lib/commonjs/src/components/MessageSuggestions.d.ts +0 -37
- package/lib/commonjs/src/components/MessageSuggestions.d.ts.map +0 -1
- package/lib/commonjs/src/components/MessageSuggestions.js +0 -55
- package/lib/commonjs/src/components/MessageSuggestions.js.map +0 -1
- package/lib/commonjs/src/components/index.d.ts +0 -14
- package/lib/commonjs/src/components/index.d.ts.map +0 -1
- package/lib/commonjs/src/hooks/index.d.ts +0 -3
- package/lib/commonjs/src/hooks/index.d.ts.map +0 -1
- package/lib/commonjs/src/hooks/useComposedCssClasses.d.ts +0 -30
- package/lib/commonjs/src/hooks/useComposedCssClasses.d.ts.map +0 -1
- package/lib/commonjs/src/hooks/useComposedCssClasses.js +0 -61
- package/lib/commonjs/src/hooks/useComposedCssClasses.js.map +0 -1
- package/lib/commonjs/src/hooks/useDefaultHandleApiError.d.ts +0 -8
- package/lib/commonjs/src/hooks/useDefaultHandleApiError.d.ts.map +0 -1
- package/lib/commonjs/src/hooks/useDefaultHandleApiError.js +0 -25
- package/lib/commonjs/src/hooks/useDefaultHandleApiError.js.map +0 -1
- package/lib/commonjs/src/hooks/useFetchInitialMessage.d.ts +0 -13
- package/lib/commonjs/src/hooks/useFetchInitialMessage.d.ts.map +0 -1
- package/lib/commonjs/src/hooks/useFetchInitialMessage.js +0 -41
- package/lib/commonjs/src/hooks/useFetchInitialMessage.js.map +0 -1
- package/lib/commonjs/src/hooks/useReportAnalyticsEvent.d.ts +0 -8
- package/lib/commonjs/src/hooks/useReportAnalyticsEvent.d.ts.map +0 -1
- package/lib/commonjs/src/hooks/useReportAnalyticsEvent.js +0 -21
- package/lib/commonjs/src/hooks/useReportAnalyticsEvent.js.map +0 -1
- package/lib/commonjs/src/hooks/useSendMessageWithRetries.d.ts +0 -17
- package/lib/commonjs/src/hooks/useSendMessageWithRetries.d.ts.map +0 -1
- package/lib/commonjs/src/hooks/useSendMessageWithRetries.js +0 -54
- package/lib/commonjs/src/hooks/useSendMessageWithRetries.js.map +0 -1
- package/lib/commonjs/src/icons/Arrow.d.ts +0 -3
- package/lib/commonjs/src/icons/Arrow.d.ts.map +0 -1
- package/lib/commonjs/src/icons/Arrow.js +0 -16
- package/lib/commonjs/src/icons/Arrow.js.map +0 -1
- package/lib/commonjs/src/icons/Chat.d.ts +0 -5
- package/lib/commonjs/src/icons/Chat.d.ts.map +0 -1
- package/lib/commonjs/src/icons/Chat.js +0 -20
- package/lib/commonjs/src/icons/Chat.js.map +0 -1
- package/lib/commonjs/src/icons/Cross.d.ts +0 -5
- package/lib/commonjs/src/icons/Cross.d.ts.map +0 -1
- package/lib/commonjs/src/icons/Cross.js +0 -16
- package/lib/commonjs/src/icons/Cross.js.map +0 -1
- package/lib/commonjs/src/icons/DualSync.d.ts +0 -5
- package/lib/commonjs/src/icons/DualSync.d.ts.map +0 -1
- package/lib/commonjs/src/icons/DualSync.js +0 -16
- package/lib/commonjs/src/icons/DualSync.js.map +0 -1
- package/lib/commonjs/src/icons/ThumbsDown.d.ts +0 -5
- package/lib/commonjs/src/icons/ThumbsDown.d.ts.map +0 -1
- package/lib/commonjs/src/icons/ThumbsDown.js +0 -15
- package/lib/commonjs/src/icons/ThumbsDown.js.map +0 -1
- package/lib/commonjs/src/icons/ThumbsDownFill.d.ts +0 -5
- package/lib/commonjs/src/icons/ThumbsDownFill.d.ts.map +0 -1
- package/lib/commonjs/src/icons/ThumbsDownFill.js +0 -15
- package/lib/commonjs/src/icons/ThumbsDownFill.js.map +0 -1
- package/lib/commonjs/src/icons/ThumbsUp.d.ts +0 -5
- package/lib/commonjs/src/icons/ThumbsUp.d.ts.map +0 -1
- package/lib/commonjs/src/icons/ThumbsUp.js +0 -15
- package/lib/commonjs/src/icons/ThumbsUp.js.map +0 -1
- package/lib/commonjs/src/icons/ThumbsUpFill.d.ts +0 -5
- package/lib/commonjs/src/icons/ThumbsUpFill.d.ts.map +0 -1
- package/lib/commonjs/src/icons/ThumbsUpFill.js +0 -15
- package/lib/commonjs/src/icons/ThumbsUpFill.js.map +0 -1
- package/lib/commonjs/src/index.d.ts +0 -3
- package/lib/commonjs/src/index.d.ts.map +0 -1
- package/lib/commonjs/src/index.js +0 -20
- package/lib/commonjs/src/index.js.map +0 -1
- package/lib/commonjs/src/tsdoc-metadata.json +0 -11
- package/lib/commonjs/src/utils/withStylelessCssClasses.d.ts +0 -17
- package/lib/commonjs/src/utils/withStylelessCssClasses.d.ts.map +0 -1
- package/lib/commonjs/src/utils/withStylelessCssClasses.js +0 -30
- package/lib/commonjs/src/utils/withStylelessCssClasses.js.map +0 -1
- package/lib/esm/index.d.ts +0 -411
- package/lib/esm/package.json.mjs +0 -4
- package/lib/esm/package.json.mjs.map +0 -1
- package/lib/esm/src/components/ChatHeader.d.ts +0 -53
- package/lib/esm/src/components/ChatHeader.d.ts.map +0 -1
- package/lib/esm/src/components/ChatHeader.mjs +0 -46
- package/lib/esm/src/components/ChatHeader.mjs.map +0 -1
- package/lib/esm/src/components/ChatInput.d.ts +0 -60
- package/lib/esm/src/components/ChatInput.d.ts.map +0 -1
- package/lib/esm/src/components/ChatInput.mjs +0 -69
- package/lib/esm/src/components/ChatInput.mjs.map +0 -1
- package/lib/esm/src/components/ChatPanel.d.ts +0 -74
- package/lib/esm/src/components/ChatPanel.d.ts.map +0 -1
- package/lib/esm/src/components/ChatPanel.mjs +0 -169
- package/lib/esm/src/components/ChatPanel.mjs.map +0 -1
- package/lib/esm/src/components/ChatPopUp.d.ts +0 -76
- package/lib/esm/src/components/ChatPopUp.d.ts.map +0 -1
- package/lib/esm/src/components/ChatPopUp.mjs +0 -154
- package/lib/esm/src/components/ChatPopUp.mjs.map +0 -1
- package/lib/esm/src/components/FeedbackButtons.d.ts +0 -35
- package/lib/esm/src/components/FeedbackButtons.d.ts.map +0 -1
- package/lib/esm/src/components/FeedbackButtons.mjs +0 -53
- package/lib/esm/src/components/FeedbackButtons.mjs.map +0 -1
- package/lib/esm/src/components/InitialMessagePopUp.d.ts +0 -33
- package/lib/esm/src/components/InitialMessagePopUp.d.ts.map +0 -1
- package/lib/esm/src/components/InitialMessagePopUp.mjs +0 -38
- package/lib/esm/src/components/InitialMessagePopUp.mjs.map +0 -1
- package/lib/esm/src/components/LoadingDots.d.ts +0 -10
- package/lib/esm/src/components/LoadingDots.d.ts.map +0 -1
- package/lib/esm/src/components/LoadingDots.mjs +0 -17
- package/lib/esm/src/components/LoadingDots.mjs.map +0 -1
- package/lib/esm/src/components/Markdown.d.ts +0 -39
- package/lib/esm/src/components/Markdown.d.ts.map +0 -1
- package/lib/esm/src/components/Markdown.mjs +0 -62
- package/lib/esm/src/components/Markdown.mjs.map +0 -1
- package/lib/esm/src/components/MessageBubble.d.ts +0 -64
- package/lib/esm/src/components/MessageBubble.d.ts.map +0 -1
- package/lib/esm/src/components/MessageBubble.mjs +0 -71
- package/lib/esm/src/components/MessageBubble.mjs.map +0 -1
- package/lib/esm/src/components/MessageSuggestions.d.ts +0 -37
- package/lib/esm/src/components/MessageSuggestions.d.ts.map +0 -1
- package/lib/esm/src/components/MessageSuggestions.mjs +0 -49
- package/lib/esm/src/components/MessageSuggestions.mjs.map +0 -1
- package/lib/esm/src/components/index.d.ts +0 -14
- package/lib/esm/src/components/index.d.ts.map +0 -1
- package/lib/esm/src/hooks/index.d.ts +0 -3
- package/lib/esm/src/hooks/index.d.ts.map +0 -1
- package/lib/esm/src/hooks/useComposedCssClasses.d.ts +0 -30
- package/lib/esm/src/hooks/useComposedCssClasses.d.ts.map +0 -1
- package/lib/esm/src/hooks/useComposedCssClasses.mjs +0 -59
- package/lib/esm/src/hooks/useComposedCssClasses.mjs.map +0 -1
- package/lib/esm/src/hooks/useDefaultHandleApiError.d.ts +0 -8
- package/lib/esm/src/hooks/useDefaultHandleApiError.d.ts.map +0 -1
- package/lib/esm/src/hooks/useDefaultHandleApiError.mjs +0 -23
- package/lib/esm/src/hooks/useDefaultHandleApiError.mjs.map +0 -1
- package/lib/esm/src/hooks/useFetchInitialMessage.d.ts +0 -13
- package/lib/esm/src/hooks/useFetchInitialMessage.d.ts.map +0 -1
- package/lib/esm/src/hooks/useFetchInitialMessage.mjs +0 -39
- package/lib/esm/src/hooks/useFetchInitialMessage.mjs.map +0 -1
- package/lib/esm/src/hooks/useReportAnalyticsEvent.d.ts +0 -8
- package/lib/esm/src/hooks/useReportAnalyticsEvent.d.ts.map +0 -1
- package/lib/esm/src/hooks/useReportAnalyticsEvent.mjs +0 -19
- package/lib/esm/src/hooks/useReportAnalyticsEvent.mjs.map +0 -1
- package/lib/esm/src/hooks/useSendMessageWithRetries.d.ts +0 -17
- package/lib/esm/src/hooks/useSendMessageWithRetries.d.ts.map +0 -1
- package/lib/esm/src/hooks/useSendMessageWithRetries.mjs +0 -52
- package/lib/esm/src/hooks/useSendMessageWithRetries.mjs.map +0 -1
- package/lib/esm/src/icons/Arrow.d.ts +0 -3
- package/lib/esm/src/icons/Arrow.d.ts.map +0 -1
- package/lib/esm/src/icons/Arrow.mjs +0 -10
- package/lib/esm/src/icons/Arrow.mjs.map +0 -1
- package/lib/esm/src/icons/Chat.d.ts +0 -5
- package/lib/esm/src/icons/Chat.d.ts.map +0 -1
- package/lib/esm/src/icons/Chat.mjs +0 -14
- package/lib/esm/src/icons/Chat.mjs.map +0 -1
- package/lib/esm/src/icons/Cross.d.ts +0 -5
- package/lib/esm/src/icons/Cross.d.ts.map +0 -1
- package/lib/esm/src/icons/Cross.mjs +0 -10
- package/lib/esm/src/icons/Cross.mjs.map +0 -1
- package/lib/esm/src/icons/DualSync.d.ts +0 -5
- package/lib/esm/src/icons/DualSync.d.ts.map +0 -1
- package/lib/esm/src/icons/DualSync.mjs +0 -10
- package/lib/esm/src/icons/DualSync.mjs.map +0 -1
- package/lib/esm/src/icons/ThumbsDown.d.ts +0 -5
- package/lib/esm/src/icons/ThumbsDown.d.ts.map +0 -1
- package/lib/esm/src/icons/ThumbsDown.mjs +0 -9
- package/lib/esm/src/icons/ThumbsDown.mjs.map +0 -1
- package/lib/esm/src/icons/ThumbsDownFill.d.ts +0 -5
- package/lib/esm/src/icons/ThumbsDownFill.d.ts.map +0 -1
- package/lib/esm/src/icons/ThumbsDownFill.mjs +0 -9
- package/lib/esm/src/icons/ThumbsDownFill.mjs.map +0 -1
- package/lib/esm/src/icons/ThumbsUp.d.ts +0 -5
- package/lib/esm/src/icons/ThumbsUp.d.ts.map +0 -1
- package/lib/esm/src/icons/ThumbsUp.mjs +0 -9
- package/lib/esm/src/icons/ThumbsUp.mjs.map +0 -1
- package/lib/esm/src/icons/ThumbsUpFill.d.ts +0 -5
- package/lib/esm/src/icons/ThumbsUpFill.d.ts.map +0 -1
- package/lib/esm/src/icons/ThumbsUpFill.mjs +0 -9
- package/lib/esm/src/icons/ThumbsUpFill.mjs.map +0 -1
- package/lib/esm/src/index.d.ts +0 -3
- package/lib/esm/src/index.d.ts.map +0 -1
- package/lib/esm/src/index.mjs +0 -8
- package/lib/esm/src/index.mjs.map +0 -1
- package/lib/esm/src/utils/withStylelessCssClasses.d.ts +0 -17
- package/lib/esm/src/utils/withStylelessCssClasses.d.ts.map +0 -1
- package/lib/esm/src/utils/withStylelessCssClasses.mjs +0 -28
- package/lib/esm/src/utils/withStylelessCssClasses.mjs.map +0 -1
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var React = require('react');
|
|
4
|
-
var chatHeadlessReact = require('@yext/chat-headless-react');
|
|
5
|
-
var MessageBubble = require('./MessageBubble.js');
|
|
6
|
-
var ChatInput = require('./ChatInput.js');
|
|
7
|
-
var LoadingDots = require('./LoadingDots.js');
|
|
8
|
-
var useComposedCssClasses = require('../hooks/useComposedCssClasses.js');
|
|
9
|
-
var useReportAnalyticsEvent = require('../hooks/useReportAnalyticsEvent.js');
|
|
10
|
-
var withStylelessCssClasses = require('../utils/withStylelessCssClasses.js');
|
|
11
|
-
var useFetchInitialMessage = require('../hooks/useFetchInitialMessage.js');
|
|
12
|
-
var MessageSuggestions = require('./MessageSuggestions.js');
|
|
13
|
-
var Markdown = require('./Markdown.js');
|
|
14
|
-
|
|
15
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
-
|
|
17
|
-
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
18
|
-
|
|
19
|
-
const builtInCssClasses = withStylelessCssClasses.withStylelessCssClasses("Panel", {
|
|
20
|
-
container: "h-full w-full flex flex-col relative shadow-2xl bg-white",
|
|
21
|
-
messagesScrollContainer: "flex flex-col mt-auto overflow-hidden",
|
|
22
|
-
messagesContainer: "flex flex-col gap-y-1 px-4 overflow-auto [&>*:first-child]:mt-3",
|
|
23
|
-
inputContainer: "w-full p-4",
|
|
24
|
-
messageBubbleCssClasses: {
|
|
25
|
-
topContainer: "mt-1",
|
|
26
|
-
},
|
|
27
|
-
footer: "text-center text-slate-400 rounded-b-3xl px-4 pb-4 text-[12px]",
|
|
28
|
-
});
|
|
29
|
-
/**
|
|
30
|
-
* A component that renders a full panel for chat bot interactions. This includes
|
|
31
|
-
* the message bubbles for the conversation, input box with send button, and header
|
|
32
|
-
* (if provided).
|
|
33
|
-
*
|
|
34
|
-
* @public
|
|
35
|
-
*
|
|
36
|
-
* @param props - {@link ChatPanelProps}
|
|
37
|
-
*/
|
|
38
|
-
function ChatPanel(props) {
|
|
39
|
-
const { header, footer, customCssClasses, stream, handleError, messageSuggestions, linkTarget = "_blank", onLinkClick, onSend: onSendProp, onRetry: onRetryProp, retryText = "Error occurred. Retrying", } = props;
|
|
40
|
-
const messages = chatHeadlessReact.useChatState((state) => state.conversation.messages);
|
|
41
|
-
const loading = chatHeadlessReact.useChatState((state) => state.conversation.isLoading);
|
|
42
|
-
const suggestedReplies = chatHeadlessReact.useChatState((state) => state.conversation.notes?.suggestedReplies);
|
|
43
|
-
const conversationId = chatHeadlessReact.useChatState((state) => state.conversation.conversationId);
|
|
44
|
-
const cssClasses = useComposedCssClasses.useComposedCssClasses(builtInCssClasses, customCssClasses);
|
|
45
|
-
const reportAnalyticsEvent = useReportAnalyticsEvent.useReportAnalyticsEvent();
|
|
46
|
-
useFetchInitialMessage.useFetchInitialMessage(handleError, stream);
|
|
47
|
-
const [retry, setRetry] = React.useState(false);
|
|
48
|
-
const onSend = React.useCallback((message) => {
|
|
49
|
-
onSendProp?.(message);
|
|
50
|
-
setRetry(false);
|
|
51
|
-
}, [onSendProp]);
|
|
52
|
-
const onRetry = React.useCallback((e) => {
|
|
53
|
-
onRetryProp?.(e);
|
|
54
|
-
setRetry(true);
|
|
55
|
-
}, [onRetryProp]);
|
|
56
|
-
React.useEffect(() => {
|
|
57
|
-
reportAnalyticsEvent({
|
|
58
|
-
action: "CHAT_IMPRESSION",
|
|
59
|
-
});
|
|
60
|
-
}, [reportAnalyticsEvent]);
|
|
61
|
-
const suggestions = React.useMemo(() => {
|
|
62
|
-
if (messages.length === 0 ||
|
|
63
|
-
(messages.length === 1 && messages[0].source === "BOT")) {
|
|
64
|
-
return messageSuggestions;
|
|
65
|
-
}
|
|
66
|
-
return suggestedReplies;
|
|
67
|
-
}, [messages, suggestedReplies, messageSuggestions]);
|
|
68
|
-
const messagesRef = React.useRef([]);
|
|
69
|
-
const messagesContainer = React.useRef(null);
|
|
70
|
-
// State to help detect initial messages rendering
|
|
71
|
-
const [initialMessagesLength] = React.useState(messages.length);
|
|
72
|
-
const savedPanelState = React.useMemo(() => {
|
|
73
|
-
if (!conversationId) {
|
|
74
|
-
return {};
|
|
75
|
-
}
|
|
76
|
-
return loadSessionState(conversationId);
|
|
77
|
-
}, [conversationId]);
|
|
78
|
-
// Handle scrolling when messages change
|
|
79
|
-
React.useEffect(() => {
|
|
80
|
-
const isInitialRender = messages.length === initialMessagesLength;
|
|
81
|
-
let scrollPos = 0;
|
|
82
|
-
if (isInitialRender && savedPanelState.scrollPosition !== undefined) {
|
|
83
|
-
// memorized position
|
|
84
|
-
scrollPos = savedPanelState?.scrollPosition;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
messagesRef.current = messagesRef.current.slice(0, messages.length);
|
|
88
|
-
// Sums up scroll heights of all messages except the last one
|
|
89
|
-
if (messagesRef?.current.length > 1) {
|
|
90
|
-
// position of the top of the last message
|
|
91
|
-
scrollPos = messagesRef.current
|
|
92
|
-
.slice(0, -1)
|
|
93
|
-
.map((elem, _) => elem?.scrollHeight ?? 0)
|
|
94
|
-
.reduce((total, height) => total + height);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
messagesContainer.current?.scroll({
|
|
98
|
-
top: scrollPos,
|
|
99
|
-
behavior: "smooth",
|
|
100
|
-
});
|
|
101
|
-
}, [messages, initialMessagesLength, savedPanelState.scrollPosition]);
|
|
102
|
-
const setMessagesRef = React.useCallback((index) => {
|
|
103
|
-
if (!messagesRef?.current)
|
|
104
|
-
return null;
|
|
105
|
-
return (message) => (messagesRef.current[index] = message);
|
|
106
|
-
}, []);
|
|
107
|
-
const footerCssClasses = React.useMemo(() => ({
|
|
108
|
-
container: cssClasses.footer,
|
|
109
|
-
link: "cursor-pointer hover:underline text-blue-600",
|
|
110
|
-
}), [cssClasses]);
|
|
111
|
-
React.useLayoutEffect(() => {
|
|
112
|
-
const curr = messagesContainer.current;
|
|
113
|
-
const onScroll = () => {
|
|
114
|
-
if (!conversationId) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
saveSessionState(conversationId, {
|
|
118
|
-
scrollPosition: curr?.scrollTop,
|
|
119
|
-
});
|
|
120
|
-
};
|
|
121
|
-
curr?.addEventListener("scroll", onScroll);
|
|
122
|
-
return () => {
|
|
123
|
-
curr?.removeEventListener("scroll", onScroll);
|
|
124
|
-
};
|
|
125
|
-
}, [messagesContainer, conversationId]);
|
|
126
|
-
return (React__default.default.createElement("div", { className: "yext-chat w-full h-full" },
|
|
127
|
-
React__default.default.createElement("div", { className: cssClasses.container },
|
|
128
|
-
header,
|
|
129
|
-
React__default.default.createElement("div", { className: cssClasses.messagesScrollContainer },
|
|
130
|
-
React__default.default.createElement("div", { ref: messagesContainer, className: cssClasses.messagesContainer, "aria-label": "Chat Panel Messages Container" },
|
|
131
|
-
messages.map((message, index) => (React__default.default.createElement("div", { key: index, ref: setMessagesRef(index) },
|
|
132
|
-
React__default.default.createElement(MessageBubble.MessageBubble, { ...props, customCssClasses: cssClasses.messageBubbleCssClasses, message: message, linkTarget: linkTarget, onLinkClick: onLinkClick })))),
|
|
133
|
-
loading && (React__default.default.createElement("div", { className: "flex" },
|
|
134
|
-
React__default.default.createElement(LoadingDots.LoadingDots, null),
|
|
135
|
-
retry && (React__default.default.createElement("p", { className: "text-slate-500 text-[13px] font-bold" }, retryText)))))),
|
|
136
|
-
React__default.default.createElement("div", { className: cssClasses.inputContainer },
|
|
137
|
-
suggestions && (React__default.default.createElement(MessageSuggestions.MessageSuggestions, { stream: stream, onSend: onSend, onRetry: onRetry, handleError: handleError, suggestions: suggestions, customCssClasses: cssClasses.messageSuggestionClasses })),
|
|
138
|
-
React__default.default.createElement(ChatInput.ChatInput, { ...props, onSend: onSend, onRetry: onRetry, customCssClasses: cssClasses.inputCssClasses })),
|
|
139
|
-
footer && (React__default.default.createElement(Markdown.Markdown, { content: footer, linkClickEvent: "WEBSITE", linkTarget: linkTarget, onLinkClick: onLinkClick, customCssClasses: footerCssClasses })))));
|
|
140
|
-
}
|
|
141
|
-
const BASE_STATE_LOCAL_STORAGE_KEY = "yext_chat_panel_state";
|
|
142
|
-
function getStateLocalStorageKey(hostname, conversationId) {
|
|
143
|
-
return `${BASE_STATE_LOCAL_STORAGE_KEY}__${hostname}__${conversationId}`;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Loads the {@link PanelState} from local storage.
|
|
147
|
-
*/
|
|
148
|
-
const loadSessionState = (conversationId) => {
|
|
149
|
-
const hostname = window?.location?.hostname;
|
|
150
|
-
if (!localStorage || !hostname) {
|
|
151
|
-
return {};
|
|
152
|
-
}
|
|
153
|
-
const savedState = localStorage.getItem(getStateLocalStorageKey(hostname, conversationId));
|
|
154
|
-
if (savedState) {
|
|
155
|
-
try {
|
|
156
|
-
const parsedState = JSON.parse(savedState);
|
|
157
|
-
return parsedState;
|
|
158
|
-
}
|
|
159
|
-
catch (e) {
|
|
160
|
-
console.warn("Unabled to load saved panel state: error parsing state.");
|
|
161
|
-
localStorage.removeItem(getStateLocalStorageKey(hostname, conversationId));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return {};
|
|
165
|
-
};
|
|
166
|
-
const saveSessionState = (conversationId, state) => {
|
|
167
|
-
const hostname = window?.location?.hostname;
|
|
168
|
-
if (!localStorage || !hostname) {
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
localStorage.setItem(getStateLocalStorageKey(hostname, conversationId), JSON.stringify(state));
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
exports.ChatPanel = ChatPanel;
|
|
175
|
-
exports.getStateLocalStorageKey = getStateLocalStorageKey;
|
|
176
|
-
exports.loadSessionState = loadSessionState;
|
|
177
|
-
exports.saveSessionState = saveSessionState;
|
|
178
|
-
//# sourceMappingURL=ChatPanel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.js","sources":["../../../../src/components/ChatPanel.tsx"],"sourcesContent":["import React, {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useLayoutEffect,\n} from \"react\";\nimport { useChatState } from \"@yext/chat-headless-react\";\nimport {\n MessageBubble,\n MessageBubbleCssClasses,\n MessageBubbleProps,\n} from \"./MessageBubble\";\nimport { ChatInput, ChatInputCssClasses, ChatInputProps } from \"./ChatInput\";\nimport { LoadingDots } from \"./LoadingDots\";\nimport { useComposedCssClasses } from \"../hooks\";\nimport { withStylelessCssClasses } from \"../utils/withStylelessCssClasses\";\nimport { useReportAnalyticsEvent } from \"../hooks/useReportAnalyticsEvent\";\nimport { useFetchInitialMessage } from \"../hooks/useFetchInitialMessage\";\nimport {\n MessageSuggestionCssClasses,\n MessageSuggestions,\n} from \"./MessageSuggestions\";\nimport { Markdown, MarkdownCssClasses } from \"./Markdown\";\n\n/**\n * The CSS class interface for the {@link ChatPanel} component.\n *\n * @public\n */\nexport interface ChatPanelCssClasses {\n container?: string;\n messagesContainer?: string;\n messagesScrollContainer?: string;\n inputContainer?: string;\n inputCssClasses?: ChatInputCssClasses;\n messageBubbleCssClasses?: MessageBubbleCssClasses;\n messageSuggestionClasses?: MessageSuggestionCssClasses;\n footer?: string;\n}\n\nconst builtInCssClasses: ChatPanelCssClasses = withStylelessCssClasses(\n \"Panel\",\n {\n container: \"h-full w-full flex flex-col relative shadow-2xl bg-white\",\n messagesScrollContainer: \"flex flex-col mt-auto overflow-hidden\",\n messagesContainer:\n \"flex flex-col gap-y-1 px-4 overflow-auto [&>*:first-child]:mt-3\",\n inputContainer: \"w-full p-4\",\n messageBubbleCssClasses: {\n topContainer: \"mt-1\",\n },\n footer: \"text-center text-slate-400 rounded-b-3xl px-4 pb-4 text-[12px]\",\n }\n);\n\n/**\n * The props for the {@link ChatPanel} component.\n *\n * @public\n */\nexport interface ChatPanelProps\n extends Omit<MessageBubbleProps, \"customCssClasses\" | \"message\">,\n Omit<ChatInputProps, \"customCssClasses\"> {\n /** A header to render at the top of the panel. */\n header?: ReactNode;\n /** A footer markdown string to render at the bottom of the panel. */\n footer?: string;\n /**\n * CSS classes for customizing the component styling.\n */\n customCssClasses?: ChatPanelCssClasses;\n /**\n * A set of pre-written initial messages that the user\n * can click on instead of typing their own.\n */\n messageSuggestions?: string[];\n /** Link target open behavior on click.\n * Defaults to \"_blank\".\n */\n linkTarget?: string;\n /** A callback which is called when user clicks a link. */\n onLinkClick?: (href?: string) => void;\n /**\n * Text to display when retrying.\n * Defaults to \"Error occurred. Retrying\".\n */\n retryText?: string;\n}\n\n/**\n * A component that renders a full panel for chat bot interactions. This includes\n * the message bubbles for the conversation, input box with send button, and header\n * (if provided).\n *\n * @public\n *\n * @param props - {@link ChatPanelProps}\n */\nexport function ChatPanel(props: ChatPanelProps) {\n const {\n header,\n footer,\n customCssClasses,\n stream,\n handleError,\n messageSuggestions,\n linkTarget = \"_blank\",\n onLinkClick,\n onSend: onSendProp,\n onRetry: onRetryProp,\n retryText = \"Error occurred. Retrying\",\n } = props;\n const messages = useChatState((state) => state.conversation.messages);\n const loading = useChatState((state) => state.conversation.isLoading);\n const suggestedReplies = useChatState(\n (state) => state.conversation.notes?.suggestedReplies\n );\n const conversationId = useChatState(\n (state) => state.conversation.conversationId\n );\n const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n const reportAnalyticsEvent = useReportAnalyticsEvent();\n useFetchInitialMessage(handleError, stream);\n\n const [retry, setRetry] = useState(false);\n const onSend = useCallback(\n (message: string) => {\n onSendProp?.(message);\n setRetry(false);\n },\n [onSendProp]\n );\n\n const onRetry = useCallback(\n (e: unknown) => {\n onRetryProp?.(e);\n setRetry(true);\n },\n [onRetryProp]\n );\n\n useEffect(() => {\n reportAnalyticsEvent({\n action: \"CHAT_IMPRESSION\",\n });\n }, [reportAnalyticsEvent]);\n\n const suggestions = useMemo(() => {\n if (\n messages.length === 0 ||\n (messages.length === 1 && messages[0].source === \"BOT\")\n ) {\n return messageSuggestions;\n }\n return suggestedReplies;\n }, [messages, suggestedReplies, messageSuggestions]);\n\n const messagesRef = useRef<Array<HTMLDivElement | null>>([]);\n const messagesContainer = useRef<HTMLDivElement>(null);\n\n // State to help detect initial messages rendering\n const [initialMessagesLength] = useState(messages.length);\n\n const savedPanelState = useMemo(() => {\n if (!conversationId) {\n return {};\n }\n return loadSessionState(conversationId);\n }, [conversationId]);\n\n // Handle scrolling when messages change\n useEffect(() => {\n const isInitialRender = messages.length === initialMessagesLength;\n let scrollPos = 0;\n if (isInitialRender && savedPanelState.scrollPosition !== undefined) {\n // memorized position\n scrollPos = savedPanelState?.scrollPosition;\n } else {\n messagesRef.current = messagesRef.current.slice(0, messages.length);\n // Sums up scroll heights of all messages except the last one\n if (messagesRef?.current.length > 1) {\n // position of the top of the last message\n scrollPos = messagesRef.current\n .slice(0, -1)\n .map((elem, _) => elem?.scrollHeight ?? 0)\n .reduce((total, height) => total + height);\n }\n }\n\n messagesContainer.current?.scroll({\n top: scrollPos,\n behavior: \"smooth\",\n });\n }, [messages, initialMessagesLength, savedPanelState.scrollPosition]);\n\n const setMessagesRef = useCallback((index) => {\n if (!messagesRef?.current) return null;\n return (message) => (messagesRef.current[index] = message);\n }, []);\n\n const footerCssClasses: MarkdownCssClasses = useMemo(\n () => ({\n container: cssClasses.footer,\n link: \"cursor-pointer hover:underline text-blue-600\",\n }),\n [cssClasses]\n );\n\n useLayoutEffect(() => {\n const curr = messagesContainer.current;\n const onScroll = () => {\n if (!conversationId) {\n return;\n }\n saveSessionState(conversationId, {\n scrollPosition: curr?.scrollTop,\n });\n };\n curr?.addEventListener(\"scroll\", onScroll);\n return () => {\n curr?.removeEventListener(\"scroll\", onScroll);\n };\n }, [messagesContainer, conversationId]);\n\n return (\n <div className=\"yext-chat w-full h-full\">\n <div className={cssClasses.container}>\n {header}\n <div className={cssClasses.messagesScrollContainer}>\n <div\n ref={messagesContainer}\n className={cssClasses.messagesContainer}\n aria-label=\"Chat Panel Messages Container\"\n >\n {messages.map((message, index) => (\n <div key={index} ref={setMessagesRef(index)}>\n <MessageBubble\n {...props}\n customCssClasses={cssClasses.messageBubbleCssClasses}\n message={message}\n linkTarget={linkTarget}\n onLinkClick={onLinkClick}\n />\n </div>\n ))}\n {loading && (\n <div className=\"flex\">\n <LoadingDots />\n {retry && (\n <p className=\"text-slate-500 text-[13px] font-bold\">\n {retryText}\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n <div className={cssClasses.inputContainer}>\n {suggestions && (\n <MessageSuggestions\n stream={stream}\n onSend={onSend}\n onRetry={onRetry}\n handleError={handleError}\n suggestions={suggestions}\n customCssClasses={cssClasses.messageSuggestionClasses}\n />\n )}\n <ChatInput\n {...props}\n onSend={onSend}\n onRetry={onRetry}\n customCssClasses={cssClasses.inputCssClasses}\n />\n </div>\n {footer && (\n <Markdown\n content={footer}\n linkClickEvent=\"WEBSITE\"\n linkTarget={linkTarget}\n onLinkClick={onLinkClick}\n customCssClasses={footerCssClasses}\n />\n )}\n </div>\n </div>\n );\n}\n\nconst BASE_STATE_LOCAL_STORAGE_KEY = \"yext_chat_panel_state\";\n\nexport function getStateLocalStorageKey(\n hostname: string,\n conversationId: string\n): string {\n return `${BASE_STATE_LOCAL_STORAGE_KEY}__${hostname}__${conversationId}`;\n}\n\n/**\n * Maintains the panel state of the session.\n */\nexport interface PanelState {\n /** The scroll position of the panel. */\n scrollPosition?: number;\n}\n\n/**\n * Loads the {@link PanelState} from local storage.\n */\nexport const loadSessionState = (conversationId: string): PanelState => {\n const hostname = window?.location?.hostname;\n if (!localStorage || !hostname) {\n return {};\n }\n const savedState = localStorage.getItem(\n getStateLocalStorageKey(hostname, conversationId)\n );\n\n if (savedState) {\n try {\n const parsedState: PanelState = JSON.parse(savedState);\n return parsedState;\n } catch (e) {\n console.warn(\"Unabled to load saved panel state: error parsing state.\");\n localStorage.removeItem(\n getStateLocalStorageKey(hostname, conversationId)\n );\n }\n }\n\n return {};\n};\n\nexport const saveSessionState = (conversationId: string, state: PanelState) => {\n const hostname = window?.location?.hostname;\n if (!localStorage || !hostname) {\n return;\n }\n localStorage.setItem(\n getStateLocalStorageKey(hostname, conversationId),\n JSON.stringify(state)\n );\n};\n"],"names":["withStylelessCssClasses","useChatState","useComposedCssClasses","useReportAnalyticsEvent","useFetchInitialMessage","useState","useCallback","useEffect","useMemo","useRef","useLayoutEffect","React","MessageBubble","LoadingDots","MessageSuggestions","ChatInput","Markdown"],"mappings":"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"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { ChatPanelCssClasses, ChatPanelProps } from "./ChatPanel";
|
|
3
|
-
import { ChatHeaderCssClasses, ChatHeaderProps } from "./ChatHeader";
|
|
4
|
-
import { InitialMessagePopUpCssClasses } from "./InitialMessagePopUp";
|
|
5
|
-
/**
|
|
6
|
-
* The CSS class interface for the {@link ChatPopUp} component.
|
|
7
|
-
*
|
|
8
|
-
* @public
|
|
9
|
-
*/
|
|
10
|
-
export interface ChatPopUpCssClasses {
|
|
11
|
-
container?: string;
|
|
12
|
-
panel?: string;
|
|
13
|
-
panel__display?: string;
|
|
14
|
-
panel__hidden?: string;
|
|
15
|
-
button?: string;
|
|
16
|
-
buttonIcon?: string;
|
|
17
|
-
ctaLabelContainer?: string;
|
|
18
|
-
ctaLabel?: string;
|
|
19
|
-
notification?: string;
|
|
20
|
-
closedPopupContainer?: string;
|
|
21
|
-
closedPopupContainer__display?: string;
|
|
22
|
-
closedPopupContainer__hidden?: string;
|
|
23
|
-
headerCssClasses?: ChatHeaderCssClasses;
|
|
24
|
-
panelCssClasses?: ChatPanelCssClasses;
|
|
25
|
-
initialMessagePopUpCssClasses?: InitialMessagePopUpCssClasses;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* The props for the {@link ChatPopUp} component.
|
|
29
|
-
*
|
|
30
|
-
* @public
|
|
31
|
-
*/
|
|
32
|
-
export interface ChatPopUpProps extends Omit<ChatHeaderProps, "showCloseButton" | "customCssClasses">, Omit<ChatPanelProps, "header" | "customCssClasses"> {
|
|
33
|
-
/** Custom icon for the popup button to open the panel. */
|
|
34
|
-
openPanelButtonIcon?: JSX.Element;
|
|
35
|
-
/** CSS classes for customizing the component styling. */
|
|
36
|
-
customCssClasses?: ChatPopUpCssClasses;
|
|
37
|
-
/** Whether to show the panel on load. Defaults to false. */
|
|
38
|
-
openOnLoad?: boolean;
|
|
39
|
-
/**
|
|
40
|
-
* Whether to show the initial message popup when the panel is hidden on load.
|
|
41
|
-
* Defaults to false.
|
|
42
|
-
*/
|
|
43
|
-
showInitialMessagePopUp?: boolean;
|
|
44
|
-
/**
|
|
45
|
-
* Whether to show a heartbeat animation on the popup button when the panel is hidden.
|
|
46
|
-
* Defaults to false.
|
|
47
|
-
*/
|
|
48
|
-
showHeartBeatAnimation?: boolean;
|
|
49
|
-
/**
|
|
50
|
-
* Whether to show notification showing number of unread messages.
|
|
51
|
-
* Defaults to false.
|
|
52
|
-
*/
|
|
53
|
-
showUnreadNotification?: boolean;
|
|
54
|
-
/**
|
|
55
|
-
* The "Call to Action" label to be displayed next to the popup button.
|
|
56
|
-
* By default, the CTA is not shown.
|
|
57
|
-
* This prop will override the "showInitialMessagePopUp" prop, if specified.
|
|
58
|
-
*/
|
|
59
|
-
ctaLabel?: string;
|
|
60
|
-
/**
|
|
61
|
-
* A controlled prop to open or close the panel. If provided, the prop
|
|
62
|
-
* will override the openOnLoad prop and the panel will be controlled
|
|
63
|
-
* by the parent component.
|
|
64
|
-
*/
|
|
65
|
-
isOpen?: boolean;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* A component that renders a popup button that displays and hides
|
|
69
|
-
* a panel for chat bot interactions.
|
|
70
|
-
*
|
|
71
|
-
* @public
|
|
72
|
-
*
|
|
73
|
-
* @param props - {@link ChatPanelProps}
|
|
74
|
-
*/
|
|
75
|
-
export declare function ChatPopUp(props: ChatPopUpProps): React.JSX.Element;
|
|
76
|
-
//# sourceMappingURL=ChatPopUp.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPopUp.d.ts","sourceRoot":"","sources":["../../../../src/components/ChatPopUp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAa,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAEL,oBAAoB,EACpB,eAAe,EAChB,MAAM,cAAc,CAAC;AAKtB,OAAO,EAEL,6BAA6B,EAC9B,MAAM,uBAAuB,CAAC;AAI/B;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,6BAA6B,CAAC,EAAE,6BAA6B,CAAC;CAC/D;AAqCD;;;;GAIG;AACH,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,kBAAkB,CAAC,EACnE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,kBAAkB,CAAC;IACrD,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IAClC,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,qBAgK9C"}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var React = require('react');
|
|
4
|
-
var Chat = require('../icons/Chat.js');
|
|
5
|
-
var ChatPanel = require('./ChatPanel.js');
|
|
6
|
-
var ChatHeader = require('./ChatHeader.js');
|
|
7
|
-
var tailwindMerge = require('tailwind-merge');
|
|
8
|
-
var useComposedCssClasses = require('../hooks/useComposedCssClasses.js');
|
|
9
|
-
var useReportAnalyticsEvent = require('../hooks/useReportAnalyticsEvent.js');
|
|
10
|
-
var withStylelessCssClasses = require('../utils/withStylelessCssClasses.js');
|
|
11
|
-
var InitialMessagePopUp = require('./InitialMessagePopUp.js');
|
|
12
|
-
var chatHeadlessReact = require('@yext/chat-headless-react');
|
|
13
|
-
var useFetchInitialMessage = require('../hooks/useFetchInitialMessage.js');
|
|
14
|
-
|
|
15
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
-
|
|
17
|
-
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
18
|
-
|
|
19
|
-
const fixedPosition = "fixed bottom-6 right-4 lg:bottom-14 lg:right-10 z-50 ";
|
|
20
|
-
const builtInCssClasses = withStylelessCssClasses.withStylelessCssClasses("PopUp", {
|
|
21
|
-
container: "transition-all",
|
|
22
|
-
panel: fixedPosition +
|
|
23
|
-
"w-80 max-[480px]:right-0 max-[480px]:bottom-0 max-[480px]:w-full max-[480px]:h-full lg:w-96 h-[75vh]",
|
|
24
|
-
panel__display: "duration-300 translate-y-0",
|
|
25
|
-
panel__hidden: "duration-300 translate-y-[20%] opacity-0 invisible",
|
|
26
|
-
closedPopupContainer: fixedPosition +
|
|
27
|
-
"flex gap-x-2.5 items-center hover:-translate-y-2 duration-150",
|
|
28
|
-
closedPopupContainer__display: "duration-300 transform translate-y-0",
|
|
29
|
-
closedPopupContainer__hidden: "duration-300 transform translate-y-[20%] opacity-0 invisible",
|
|
30
|
-
button: "p-2 w-12 h-12 lg:w-16 lg:h-16 flex justify-center items-center text-white shadow-xl rounded-full bg-gradient-to-br from-blue-600 to-blue-700",
|
|
31
|
-
buttonIcon: "text-blue-600 w-[28px] h-[28px] lg:w-[40px] lg:h-[40px]",
|
|
32
|
-
ctaLabelContainer: "max-w-60 -mr-8 line-clamp-1",
|
|
33
|
-
ctaLabel: "p-3 pr-8 flex items-center whitespace-nowrap animate-expand-left font-bold rounded-l-full bg-white text-blue-700 h-10 lg:h-14 text-sm lg:text-base",
|
|
34
|
-
notification: "fixed animate-fade-in bg-red-700 -right-1 top-0 rounded-full w-5 lg:w-6 h-5 lg:h-6 items-center flex justify-center text-sm lg:text-base text-white",
|
|
35
|
-
headerCssClasses: {
|
|
36
|
-
container: "max-[480px]:rounded-none rounded-t-3xl",
|
|
37
|
-
},
|
|
38
|
-
panelCssClasses: {
|
|
39
|
-
container: "max-[480px]:rounded-none rounded-3xl",
|
|
40
|
-
inputContainer: "max-[480px]:rounded-none rounded-b-3xl",
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
const popupLocalStorageKey = "YEXT_CHAT_OPEN_ON_LOAD";
|
|
44
|
-
/**
|
|
45
|
-
* A component that renders a popup button that displays and hides
|
|
46
|
-
* a panel for chat bot interactions.
|
|
47
|
-
*
|
|
48
|
-
* @public
|
|
49
|
-
*
|
|
50
|
-
* @param props - {@link ChatPanelProps}
|
|
51
|
-
*/
|
|
52
|
-
function ChatPopUp(props) {
|
|
53
|
-
const { openPanelButtonIcon, customCssClasses, showRestartButton = true, onClose: customOnClose, handleError, openOnLoad = false, showInitialMessagePopUp = false, showHeartBeatAnimation = false, showUnreadNotification = false, ctaLabel, title, footer, isOpen, } = props;
|
|
54
|
-
const reportAnalyticsEvent = useReportAnalyticsEvent.useReportAnalyticsEvent();
|
|
55
|
-
React.useEffect(() => {
|
|
56
|
-
reportAnalyticsEvent({
|
|
57
|
-
action: "CHAT_IMPRESSION",
|
|
58
|
-
});
|
|
59
|
-
}, [reportAnalyticsEvent]);
|
|
60
|
-
const messages = chatHeadlessReact.useChatState((s) => s.conversation.messages);
|
|
61
|
-
const [numReadMessages, setNumReadMessagesLength] = React.useState(0);
|
|
62
|
-
const [numUnreadMessages, setNumUnreadMessagesLength] = React.useState(0);
|
|
63
|
-
// Set the initial value of the local storage flag for opening on load only if it doesn't already exist
|
|
64
|
-
if (window.localStorage.getItem(popupLocalStorageKey) === null) {
|
|
65
|
-
window.localStorage.setItem(popupLocalStorageKey, openOnLoad ? "true" : "false");
|
|
66
|
-
}
|
|
67
|
-
const openOnLoadLocalStorage = window.localStorage.getItem(popupLocalStorageKey);
|
|
68
|
-
/* Open panel on load if:
|
|
69
|
-
- openOnLoad prop is true or there are messages in state (from browser storage), and local storage flag is true */
|
|
70
|
-
const isOpenOnLoad = (messages.length > 1 && openOnLoadLocalStorage === "true") || openOnLoad;
|
|
71
|
-
const { renderChat, showChat, showInitialMessage, toggleChat, closeChat, closeInitialMessage, } = usePanelState(isOpen, isOpenOnLoad, !ctaLabel && showInitialMessagePopUp);
|
|
72
|
-
// only fetch initial message when ChatPanel is closed on load (otherwise, it will be fetched in ChatPanel)
|
|
73
|
-
useFetchInitialMessage.useFetchInitialMessage(showInitialMessagePopUp ? console.error : handleError, false, (showUnreadNotification || showInitialMessagePopUp) &&
|
|
74
|
-
!renderChat &&
|
|
75
|
-
!isOpenOnLoad);
|
|
76
|
-
const onClick = React.useCallback(() => {
|
|
77
|
-
toggleChat();
|
|
78
|
-
window.localStorage.setItem(popupLocalStorageKey, "true");
|
|
79
|
-
}, [toggleChat]);
|
|
80
|
-
const onClose = React.useCallback(() => {
|
|
81
|
-
closeChat();
|
|
82
|
-
customOnClose?.();
|
|
83
|
-
// consider all the messages are read while the panel was open
|
|
84
|
-
setNumReadMessagesLength(messages.length);
|
|
85
|
-
window.localStorage.setItem(popupLocalStorageKey, "false");
|
|
86
|
-
}, [closeChat, customOnClose, messages.length]);
|
|
87
|
-
React.useEffect(() => {
|
|
88
|
-
// update number of unread messages if there are new messages added while the panel is closed
|
|
89
|
-
setNumUnreadMessagesLength(messages.length - numReadMessages);
|
|
90
|
-
}, [messages.length, numReadMessages]);
|
|
91
|
-
const cssClasses = useComposedCssClasses.useComposedCssClasses(builtInCssClasses, customCssClasses);
|
|
92
|
-
const panelCssClasses = tailwindMerge.twMerge(cssClasses.panel, showChat ? cssClasses.panel__display : cssClasses.panel__hidden);
|
|
93
|
-
const closedPopupContainerCssClasses = tailwindMerge.twMerge(cssClasses.closedPopupContainer, showChat
|
|
94
|
-
? cssClasses.closedPopupContainer__hidden
|
|
95
|
-
: cssClasses.closedPopupContainer__display);
|
|
96
|
-
return (React__default.default.createElement("div", { className: "yext-chat w-full h-full" },
|
|
97
|
-
React__default.default.createElement("div", { className: cssClasses.container },
|
|
98
|
-
React__default.default.createElement("div", { className: panelCssClasses, "aria-label": "Chat Popup Panel" }, renderChat && (React__default.default.createElement(ChatPanel.ChatPanel, { ...props, customCssClasses: cssClasses.panelCssClasses, header: React__default.default.createElement(ChatHeader.ChatHeader, { title: title, showRestartButton: showRestartButton, showCloseButton: true, onClose: onClose, customCssClasses: cssClasses.headerCssClasses }), footer: footer }))),
|
|
99
|
-
React__default.default.createElement("div", { className: closedPopupContainerCssClasses, "aria-label": "Chat Closed Popup Container" },
|
|
100
|
-
showInitialMessage && (React__default.default.createElement(InitialMessagePopUp.InitialMessagePopUp, { onClose: closeInitialMessage, customCssClasses: cssClasses.initialMessagePopUpCssClasses })),
|
|
101
|
-
ctaLabel && (
|
|
102
|
-
// the div container is needed to islate the expand CSS animation
|
|
103
|
-
React__default.default.createElement("div", { className: cssClasses.ctaLabelContainer },
|
|
104
|
-
React__default.default.createElement("button", { onClick: onClick, "aria-label": "CTA Label", className: cssClasses.ctaLabel }, ctaLabel))),
|
|
105
|
-
React__default.default.createElement("button", { "aria-label": "Chat Popup Button", onClick: onClick, className: cssClasses.button +
|
|
106
|
-
(showHeartBeatAnimation && !!numUnreadMessages
|
|
107
|
-
? " animate-heartbeat"
|
|
108
|
-
: "") },
|
|
109
|
-
openPanelButtonIcon ?? (React__default.default.createElement(Chat.ChatIcon, { className: cssClasses.buttonIcon })),
|
|
110
|
-
showUnreadNotification && !!numUnreadMessages && (React__default.default.createElement("div", { "aria-label": "Unread Messages Notification", className: cssClasses.notification }, numUnreadMessages)))))));
|
|
111
|
-
}
|
|
112
|
-
function usePanelState(isOpen, isOpenOnLoad, initialMessageVisible) {
|
|
113
|
-
// control CSS behavior (fade-in/out animation) on open/close state of the panel.
|
|
114
|
-
const [showChat, setShowChat] = React.useState(false);
|
|
115
|
-
// control the actual DOM rendering of the panel. Start rendering on first open state
|
|
116
|
-
// to avoid message requests immediately on load while the popup is still "hidden"
|
|
117
|
-
const [renderChat, setRenderChat] = React.useState(false);
|
|
118
|
-
const [showInitialMessage, setshowInitialMessage] = React.useState(initialMessageVisible);
|
|
119
|
-
React.useEffect(() => {
|
|
120
|
-
if (isOpen !== undefined) {
|
|
121
|
-
setShowChat(isOpen);
|
|
122
|
-
setRenderChat(isOpen);
|
|
123
|
-
}
|
|
124
|
-
}, [isOpen]);
|
|
125
|
-
React.useEffect(() => {
|
|
126
|
-
if (!renderChat && isOpenOnLoad && isOpen === undefined) {
|
|
127
|
-
setShowChat(true);
|
|
128
|
-
setRenderChat(true);
|
|
129
|
-
setshowInitialMessage(false);
|
|
130
|
-
}
|
|
131
|
-
}, [renderChat, isOpen, isOpenOnLoad]);
|
|
132
|
-
const toggleChat = React.useCallback(() => {
|
|
133
|
-
if (isOpen !== undefined) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
setShowChat((prev) => !prev);
|
|
137
|
-
setRenderChat(true);
|
|
138
|
-
setshowInitialMessage(false);
|
|
139
|
-
}, [isOpen]);
|
|
140
|
-
const closeChat = React.useCallback(() => {
|
|
141
|
-
if (isOpen !== undefined) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
setShowChat(false);
|
|
145
|
-
}, [isOpen]);
|
|
146
|
-
const closeInitialMessage = React.useCallback(() => {
|
|
147
|
-
setshowInitialMessage(false);
|
|
148
|
-
}, []);
|
|
149
|
-
return {
|
|
150
|
-
showChat,
|
|
151
|
-
renderChat,
|
|
152
|
-
showInitialMessage,
|
|
153
|
-
toggleChat,
|
|
154
|
-
closeChat,
|
|
155
|
-
closeInitialMessage,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
exports.ChatPopUp = ChatPopUp;
|
|
160
|
-
//# sourceMappingURL=ChatPopUp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPopUp.js","sources":["../../../../src/components/ChatPopUp.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from \"react\";\nimport { ChatIcon } from \"../icons/Chat\";\nimport { ChatPanel, ChatPanelCssClasses, ChatPanelProps } from \"./ChatPanel\";\nimport {\n ChatHeader,\n ChatHeaderCssClasses,\n ChatHeaderProps,\n} from \"./ChatHeader\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useComposedCssClasses } from \"../hooks\";\nimport { withStylelessCssClasses } from \"../utils/withStylelessCssClasses\";\nimport { useReportAnalyticsEvent } from \"../hooks/useReportAnalyticsEvent\";\nimport {\n InitialMessagePopUp,\n InitialMessagePopUpCssClasses,\n} from \"./InitialMessagePopUp\";\nimport { useChatState } from \"@yext/chat-headless-react\";\nimport { useFetchInitialMessage } from \"../hooks/useFetchInitialMessage\";\n\n/**\n * The CSS class interface for the {@link ChatPopUp} component.\n *\n * @public\n */\nexport interface ChatPopUpCssClasses {\n container?: string;\n panel?: string;\n panel__display?: string;\n panel__hidden?: string;\n button?: string;\n buttonIcon?: string;\n ctaLabelContainer?: string;\n ctaLabel?: string;\n notification?: string;\n closedPopupContainer?: string;\n closedPopupContainer__display?: string;\n closedPopupContainer__hidden?: string;\n headerCssClasses?: ChatHeaderCssClasses;\n panelCssClasses?: ChatPanelCssClasses;\n initialMessagePopUpCssClasses?: InitialMessagePopUpCssClasses;\n}\n\nconst fixedPosition = \"fixed bottom-6 right-4 lg:bottom-14 lg:right-10 z-50 \";\nconst builtInCssClasses: ChatPopUpCssClasses = withStylelessCssClasses(\n \"PopUp\",\n {\n container: \"transition-all\",\n panel:\n fixedPosition +\n \"w-80 max-[480px]:right-0 max-[480px]:bottom-0 max-[480px]:w-full max-[480px]:h-full lg:w-96 h-[75vh]\",\n panel__display: \"duration-300 translate-y-0\",\n panel__hidden: \"duration-300 translate-y-[20%] opacity-0 invisible\",\n closedPopupContainer:\n fixedPosition +\n \"flex gap-x-2.5 items-center hover:-translate-y-2 duration-150\",\n closedPopupContainer__display: \"duration-300 transform translate-y-0\",\n closedPopupContainer__hidden:\n \"duration-300 transform translate-y-[20%] opacity-0 invisible\",\n button:\n \"p-2 w-12 h-12 lg:w-16 lg:h-16 flex justify-center items-center text-white shadow-xl rounded-full bg-gradient-to-br from-blue-600 to-blue-700\",\n buttonIcon: \"text-blue-600 w-[28px] h-[28px] lg:w-[40px] lg:h-[40px]\",\n ctaLabelContainer: \"max-w-60 -mr-8 line-clamp-1\",\n ctaLabel:\n \"p-3 pr-8 flex items-center whitespace-nowrap animate-expand-left font-bold rounded-l-full bg-white text-blue-700 h-10 lg:h-14 text-sm lg:text-base\",\n notification:\n \"fixed animate-fade-in bg-red-700 -right-1 top-0 rounded-full w-5 lg:w-6 h-5 lg:h-6 items-center flex justify-center text-sm lg:text-base text-white\",\n headerCssClasses: {\n container: \"max-[480px]:rounded-none rounded-t-3xl\",\n },\n panelCssClasses: {\n container: \"max-[480px]:rounded-none rounded-3xl\",\n inputContainer: \"max-[480px]:rounded-none rounded-b-3xl\",\n },\n }\n);\nconst popupLocalStorageKey = \"YEXT_CHAT_OPEN_ON_LOAD\";\n\n/**\n * The props for the {@link ChatPopUp} component.\n *\n * @public\n */\nexport interface ChatPopUpProps\n extends Omit<ChatHeaderProps, \"showCloseButton\" | \"customCssClasses\">,\n Omit<ChatPanelProps, \"header\" | \"customCssClasses\"> {\n /** Custom icon for the popup button to open the panel. */\n openPanelButtonIcon?: JSX.Element;\n /** CSS classes for customizing the component styling. */\n customCssClasses?: ChatPopUpCssClasses;\n /** Whether to show the panel on load. Defaults to false. */\n openOnLoad?: boolean;\n /**\n * Whether to show the initial message popup when the panel is hidden on load.\n * Defaults to false.\n */\n showInitialMessagePopUp?: boolean;\n /**\n * Whether to show a heartbeat animation on the popup button when the panel is hidden.\n * Defaults to false.\n */\n showHeartBeatAnimation?: boolean;\n /**\n * Whether to show notification showing number of unread messages.\n * Defaults to false.\n */\n showUnreadNotification?: boolean;\n /**\n * The \"Call to Action\" label to be displayed next to the popup button.\n * By default, the CTA is not shown.\n * This prop will override the \"showInitialMessagePopUp\" prop, if specified.\n */\n ctaLabel?: string;\n /**\n * A controlled prop to open or close the panel. If provided, the prop\n * will override the openOnLoad prop and the panel will be controlled\n * by the parent component.\n */\n isOpen?: boolean;\n}\n\n/**\n * A component that renders a popup button that displays and hides\n * a panel for chat bot interactions.\n *\n * @public\n *\n * @param props - {@link ChatPanelProps}\n */\nexport function ChatPopUp(props: ChatPopUpProps) {\n const {\n openPanelButtonIcon,\n customCssClasses,\n showRestartButton = true,\n onClose: customOnClose,\n handleError,\n openOnLoad = false,\n showInitialMessagePopUp = false,\n showHeartBeatAnimation = false,\n showUnreadNotification = false,\n ctaLabel,\n title,\n footer,\n isOpen,\n } = props;\n\n const reportAnalyticsEvent = useReportAnalyticsEvent();\n useEffect(() => {\n reportAnalyticsEvent({\n action: \"CHAT_IMPRESSION\",\n });\n }, [reportAnalyticsEvent]);\n\n const messages = useChatState((s) => s.conversation.messages);\n const [numReadMessages, setNumReadMessagesLength] = useState<number>(0);\n const [numUnreadMessages, setNumUnreadMessagesLength] = useState<number>(0);\n\n // Set the initial value of the local storage flag for opening on load only if it doesn't already exist\n if (window.localStorage.getItem(popupLocalStorageKey) === null) {\n window.localStorage.setItem(\n popupLocalStorageKey,\n openOnLoad ? \"true\" : \"false\"\n );\n }\n const openOnLoadLocalStorage =\n window.localStorage.getItem(popupLocalStorageKey);\n\n /* Open panel on load if: \n - openOnLoad prop is true or there are messages in state (from browser storage), and local storage flag is true */\n const isOpenOnLoad =\n (messages.length > 1 && openOnLoadLocalStorage === \"true\") || openOnLoad;\n\n const {\n renderChat,\n showChat,\n showInitialMessage,\n toggleChat,\n closeChat,\n closeInitialMessage,\n } = usePanelState(isOpen, isOpenOnLoad, !ctaLabel && showInitialMessagePopUp);\n\n // only fetch initial message when ChatPanel is closed on load (otherwise, it will be fetched in ChatPanel)\n useFetchInitialMessage(\n showInitialMessagePopUp ? console.error : handleError,\n false,\n (showUnreadNotification || showInitialMessagePopUp) &&\n !renderChat &&\n !isOpenOnLoad\n );\n\n const onClick = useCallback(() => {\n toggleChat();\n window.localStorage.setItem(popupLocalStorageKey, \"true\");\n }, [toggleChat]);\n\n const onClose = useCallback(() => {\n closeChat();\n customOnClose?.();\n // consider all the messages are read while the panel was open\n setNumReadMessagesLength(messages.length);\n window.localStorage.setItem(popupLocalStorageKey, \"false\");\n }, [closeChat, customOnClose, messages.length]);\n\n useEffect(() => {\n // update number of unread messages if there are new messages added while the panel is closed\n setNumUnreadMessagesLength(messages.length - numReadMessages);\n }, [messages.length, numReadMessages]);\n\n const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n const panelCssClasses = twMerge(\n cssClasses.panel,\n showChat ? cssClasses.panel__display : cssClasses.panel__hidden\n );\n const closedPopupContainerCssClasses = twMerge(\n cssClasses.closedPopupContainer,\n showChat\n ? cssClasses.closedPopupContainer__hidden\n : cssClasses.closedPopupContainer__display\n );\n\n return (\n <div className=\"yext-chat w-full h-full\">\n <div className={cssClasses.container}>\n <div className={panelCssClasses} aria-label=\"Chat Popup Panel\">\n {renderChat && (\n <ChatPanel\n {...props}\n customCssClasses={cssClasses.panelCssClasses}\n header={\n <ChatHeader\n title={title}\n showRestartButton={showRestartButton}\n showCloseButton={true}\n onClose={onClose}\n customCssClasses={cssClasses.headerCssClasses}\n />\n }\n footer={footer}\n />\n )}\n </div>\n <div\n className={closedPopupContainerCssClasses}\n aria-label=\"Chat Closed Popup Container\"\n >\n {showInitialMessage && (\n <InitialMessagePopUp\n onClose={closeInitialMessage}\n customCssClasses={cssClasses.initialMessagePopUpCssClasses}\n />\n )}\n {ctaLabel && (\n // the div container is needed to islate the expand CSS animation\n <div className={cssClasses.ctaLabelContainer}>\n <button\n onClick={onClick}\n aria-label=\"CTA Label\"\n className={cssClasses.ctaLabel}\n >\n {ctaLabel}\n </button>\n </div>\n )}\n <button\n aria-label=\"Chat Popup Button\"\n onClick={onClick}\n className={\n cssClasses.button +\n (showHeartBeatAnimation && !!numUnreadMessages\n ? \" animate-heartbeat\"\n : \"\")\n }\n >\n {openPanelButtonIcon ?? (\n <ChatIcon className={cssClasses.buttonIcon} />\n )}\n {showUnreadNotification && !!numUnreadMessages && (\n <div\n aria-label=\"Unread Messages Notification\"\n className={cssClasses.notification}\n >\n {numUnreadMessages}\n </div>\n )}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction usePanelState(\n isOpen: boolean | undefined,\n isOpenOnLoad: boolean | undefined,\n initialMessageVisible: boolean | undefined\n) {\n // control CSS behavior (fade-in/out animation) on open/close state of the panel.\n const [showChat, setShowChat] = useState(false);\n // control the actual DOM rendering of the panel. Start rendering on first open state\n // to avoid message requests immediately on load while the popup is still \"hidden\"\n const [renderChat, setRenderChat] = useState(false);\n const [showInitialMessage, setshowInitialMessage] = useState(\n initialMessageVisible\n );\n\n useEffect(() => {\n if (isOpen !== undefined) {\n setShowChat(isOpen);\n setRenderChat(isOpen);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!renderChat && isOpenOnLoad && isOpen === undefined) {\n setShowChat(true);\n setRenderChat(true);\n setshowInitialMessage(false);\n }\n }, [renderChat, isOpen, isOpenOnLoad]);\n\n const toggleChat = useCallback(() => {\n if (isOpen !== undefined) {\n return;\n }\n setShowChat((prev) => !prev);\n setRenderChat(true);\n setshowInitialMessage(false);\n }, [isOpen]);\n\n const closeChat = useCallback(() => {\n if (isOpen !== undefined) {\n return;\n }\n setShowChat(false);\n }, [isOpen]);\n\n const closeInitialMessage = useCallback(() => {\n setshowInitialMessage(false);\n }, []);\n\n return {\n showChat,\n renderChat,\n showInitialMessage,\n toggleChat,\n closeChat,\n closeInitialMessage,\n };\n}\n"],"names":["withStylelessCssClasses","useReportAnalyticsEvent","useEffect","useChatState","useState","useFetchInitialMessage","useCallback","useComposedCssClasses","twMerge","React","ChatPanel","ChatHeader","InitialMessagePopUp","ChatIcon"],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
/**
|
|
3
|
-
* The CSS class interface for the FeedbackButtons component.
|
|
4
|
-
*
|
|
5
|
-
* @public
|
|
6
|
-
*/
|
|
7
|
-
export interface FeedbackButtonsCssClasses {
|
|
8
|
-
container?: string;
|
|
9
|
-
thumbsUpButton?: string;
|
|
10
|
-
thumbsUpIcon?: string;
|
|
11
|
-
thumbsUpFillIcon?: string;
|
|
12
|
-
thumbsDownButton?: string;
|
|
13
|
-
thumbsDownIcon?: string;
|
|
14
|
-
thumbsDownFillIcon?: string;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* The props for the FeedbackButtons component.
|
|
18
|
-
*
|
|
19
|
-
* @internal
|
|
20
|
-
*/
|
|
21
|
-
interface FeedbackButtonsProps {
|
|
22
|
-
/** The response ID correlates to the current message to give feedback on. */
|
|
23
|
-
responseId?: string;
|
|
24
|
-
/** CSS classes for customizing the component styling. */
|
|
25
|
-
customCssClasses?: FeedbackButtonsCssClasses;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Displays feedback buttons (e.g. thumbs up and thumbs down) that will
|
|
29
|
-
* report analytic events on click.
|
|
30
|
-
*
|
|
31
|
-
* @internal
|
|
32
|
-
*/
|
|
33
|
-
export declare function FeedbackButtons({ customCssClasses, responseId, }: FeedbackButtonsProps): React.JSX.Element;
|
|
34
|
-
export {};
|
|
35
|
-
//# sourceMappingURL=FeedbackButtons.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButtons.d.ts","sourceRoot":"","sources":["../../../../src/components/FeedbackButtons.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAOrD;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAgBD;;;;GAIG;AACH,UAAU,oBAAoB;IAC5B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;CAC9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAC9B,gBAAgB,EAChB,UAAU,GACX,EAAE,oBAAoB,qBA+CtB"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var ThumbsDown = require('../icons/ThumbsDown.js');
|
|
4
|
-
var ThumbsUp = require('../icons/ThumbsUp.js');
|
|
5
|
-
var React = require('react');
|
|
6
|
-
var ThumbsUpFill = require('../icons/ThumbsUpFill.js');
|
|
7
|
-
var ThumbsDownFill = require('../icons/ThumbsDownFill.js');
|
|
8
|
-
var withStylelessCssClasses = require('../utils/withStylelessCssClasses.js');
|
|
9
|
-
var useComposedCssClasses = require('../hooks/useComposedCssClasses.js');
|
|
10
|
-
var useReportAnalyticsEvent = require('../hooks/useReportAnalyticsEvent.js');
|
|
11
|
-
|
|
12
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
|
|
14
|
-
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
15
|
-
|
|
16
|
-
const builtInCssClasses = withStylelessCssClasses.withStylelessCssClasses("FeedbackButtons", {
|
|
17
|
-
container: "flex gap-x-1 absolute -right-1 -top-3 [@media(hover:hover)]:opacity-0 group-hover:opacity-100 duration-200",
|
|
18
|
-
thumbsUpButton: "w-6 h-6 bg-gray-700 rounded-md flex justify-center items-center",
|
|
19
|
-
thumbsUpIcon: "text-white w-[22px] h-[22px] stroke-[0.2]",
|
|
20
|
-
thumbsUpFillIcon: "text-white w-[22px] h-[22px] stroke-[0.2]",
|
|
21
|
-
thumbsDownButton: "w-6 h-6 bg-gray-700 rounded-md flex justify-center items-center",
|
|
22
|
-
thumbsDownIcon: "text-white w-[22px] h-[22px] stroke-[0.2]",
|
|
23
|
-
thumbsDownFillIcon: "text-white w-[22px] h-[22px] stroke-[0.2]",
|
|
24
|
-
});
|
|
25
|
-
/**
|
|
26
|
-
* Displays feedback buttons (e.g. thumbs up and thumbs down) that will
|
|
27
|
-
* report analytic events on click.
|
|
28
|
-
*
|
|
29
|
-
* @internal
|
|
30
|
-
*/
|
|
31
|
-
function FeedbackButtons({ customCssClasses, responseId, }) {
|
|
32
|
-
const reportAnalyticsEvent = useReportAnalyticsEvent.useReportAnalyticsEvent();
|
|
33
|
-
const cssClasses = useComposedCssClasses.useComposedCssClasses(builtInCssClasses, customCssClasses);
|
|
34
|
-
const [selectedThumb, setSelectedThumb] = React.useState();
|
|
35
|
-
const onClickThumbsUp = React.useCallback(() => {
|
|
36
|
-
setSelectedThumb("UP");
|
|
37
|
-
reportAnalyticsEvent({
|
|
38
|
-
action: "THUMBS_UP",
|
|
39
|
-
chat: {
|
|
40
|
-
responseId,
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
}, [reportAnalyticsEvent, responseId]);
|
|
44
|
-
const onClickThumbsDown = React.useCallback(() => {
|
|
45
|
-
setSelectedThumb("DOWN");
|
|
46
|
-
reportAnalyticsEvent({
|
|
47
|
-
action: "THUMBS_DOWN",
|
|
48
|
-
chat: {
|
|
49
|
-
responseId,
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
}, [reportAnalyticsEvent, responseId]);
|
|
53
|
-
return (React__default.default.createElement("div", { className: cssClasses.container },
|
|
54
|
-
React__default.default.createElement("button", { className: cssClasses.thumbsUpButton, onClick: onClickThumbsUp }, selectedThumb === "UP" ? (React__default.default.createElement(ThumbsUpFill.ThumbsUpFillIcon, { className: cssClasses.thumbsUpFillIcon })) : (React__default.default.createElement(ThumbsUp.ThumbsUpIcon, { className: cssClasses.thumbsUpIcon }))),
|
|
55
|
-
React__default.default.createElement("button", { className: cssClasses.thumbsDownButton, onClick: onClickThumbsDown }, selectedThumb === "DOWN" ? (React__default.default.createElement(ThumbsDownFill.ThumbsDownFillIcon, { className: cssClasses.thumbsDownFillIcon })) : (React__default.default.createElement(ThumbsDown.ThumbsDownIcon, { className: cssClasses.thumbsDownIcon })))));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
exports.FeedbackButtons = FeedbackButtons;
|
|
59
|
-
//# sourceMappingURL=FeedbackButtons.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButtons.js","sources":["../../../../src/components/FeedbackButtons.tsx"],"sourcesContent":["import { ThumbsDownIcon } from \"../icons/ThumbsDown\";\nimport { ThumbsUpIcon } from \"../icons/ThumbsUp\";\nimport React, { useCallback, useState } from \"react\";\nimport { ThumbsUpFillIcon } from \"../icons/ThumbsUpFill\";\nimport { ThumbsDownFillIcon } from \"../icons/ThumbsDownFill\";\nimport { withStylelessCssClasses } from \"../utils/withStylelessCssClasses\";\nimport { useComposedCssClasses } from \"../hooks\";\nimport { useReportAnalyticsEvent } from \"../hooks/useReportAnalyticsEvent\";\n\n/**\n * The CSS class interface for the FeedbackButtons component.\n *\n * @public\n */\nexport interface FeedbackButtonsCssClasses {\n container?: string;\n thumbsUpButton?: string;\n thumbsUpIcon?: string;\n thumbsUpFillIcon?: string;\n thumbsDownButton?: string;\n thumbsDownIcon?: string;\n thumbsDownFillIcon?: string;\n}\n\nconst builtInCssClasses: FeedbackButtonsCssClasses =\n withStylelessCssClasses<FeedbackButtonsCssClasses>(\"FeedbackButtons\", {\n container:\n \"flex gap-x-1 absolute -right-1 -top-3 [@media(hover:hover)]:opacity-0 group-hover:opacity-100 duration-200\",\n thumbsUpButton:\n \"w-6 h-6 bg-gray-700 rounded-md flex justify-center items-center\",\n thumbsUpIcon: \"text-white w-[22px] h-[22px] stroke-[0.2]\",\n thumbsUpFillIcon: \"text-white w-[22px] h-[22px] stroke-[0.2]\",\n thumbsDownButton:\n \"w-6 h-6 bg-gray-700 rounded-md flex justify-center items-center\",\n thumbsDownIcon: \"text-white w-[22px] h-[22px] stroke-[0.2]\",\n thumbsDownFillIcon: \"text-white w-[22px] h-[22px] stroke-[0.2]\",\n });\n\n/**\n * The props for the FeedbackButtons component.\n *\n * @internal\n */\ninterface FeedbackButtonsProps {\n /** The response ID correlates to the current message to give feedback on. */\n responseId?: string;\n /** CSS classes for customizing the component styling. */\n customCssClasses?: FeedbackButtonsCssClasses;\n}\n\n/**\n * Displays feedback buttons (e.g. thumbs up and thumbs down) that will\n * report analytic events on click.\n *\n * @internal\n */\nexport function FeedbackButtons({\n customCssClasses,\n responseId,\n}: FeedbackButtonsProps) {\n const reportAnalyticsEvent = useReportAnalyticsEvent();\n const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n const [selectedThumb, setSelectedThumb] = useState<\n \"UP\" | \"DOWN\" | undefined\n >();\n const onClickThumbsUp = useCallback(() => {\n setSelectedThumb(\"UP\");\n reportAnalyticsEvent({\n action: \"THUMBS_UP\",\n chat: {\n responseId,\n },\n });\n }, [reportAnalyticsEvent, responseId]);\n\n const onClickThumbsDown = useCallback(() => {\n setSelectedThumb(\"DOWN\");\n reportAnalyticsEvent({\n action: \"THUMBS_DOWN\",\n chat: {\n responseId,\n },\n });\n }, [reportAnalyticsEvent, responseId]);\n\n return (\n <div className={cssClasses.container}>\n <button className={cssClasses.thumbsUpButton} onClick={onClickThumbsUp}>\n {selectedThumb === \"UP\" ? (\n <ThumbsUpFillIcon className={cssClasses.thumbsUpFillIcon} />\n ) : (\n <ThumbsUpIcon className={cssClasses.thumbsUpIcon} />\n )}\n </button>\n <button\n className={cssClasses.thumbsDownButton}\n onClick={onClickThumbsDown}\n >\n {selectedThumb === \"DOWN\" ? (\n <ThumbsDownFillIcon className={cssClasses.thumbsDownFillIcon} />\n ) : (\n <ThumbsDownIcon className={cssClasses.thumbsDownIcon} />\n )}\n </button>\n </div>\n );\n}\n"],"names":["withStylelessCssClasses","useReportAnalyticsEvent","useComposedCssClasses","useState","useCallback","React","ThumbsUpFillIcon","ThumbsUpIcon","ThumbsDownFillIcon","ThumbsDownIcon"],"mappings":";;;;;;;;;;;;;;;AAwBA,MAAM,iBAAiB,GACrBA,+CAAuB,CAA4B,iBAAiB,EAAE;AACpE,IAAA,SAAS,EACP,4GAA4G;AAC9G,IAAA,cAAc,EACZ,iEAAiE;AACnE,IAAA,YAAY,EAAE,2CAA2C;AACzD,IAAA,gBAAgB,EAAE,2CAA2C;AAC7D,IAAA,gBAAgB,EACd,iEAAiE;AACnE,IAAA,cAAc,EAAE,2CAA2C;AAC3D,IAAA,kBAAkB,EAAE,2CAA2C;AAChE,CAAA,CAAC,CAAC;AAcL;;;;;AAKG;SACa,eAAe,CAAC,EAC9B,gBAAgB,EAChB,UAAU,GACW,EAAA;AACrB,IAAA,MAAM,oBAAoB,GAAGC,+CAAuB,EAAE,CAAC;IACvD,MAAM,UAAU,GAAGC,2CAAqB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC9E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGC,cAAQ,EAE/C,CAAC;AACJ,IAAA,MAAM,eAAe,GAAGC,iBAAW,CAAC,MAAK;QACvC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACvB,QAAA,oBAAoB,CAAC;AACnB,YAAA,MAAM,EAAE,WAAW;AACnB,YAAA,IAAI,EAAE;gBACJ,UAAU;AACX,aAAA;AACF,SAAA,CAAC,CAAC;AACL,KAAC,EAAE,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC;AAEvC,IAAA,MAAM,iBAAiB,GAAGA,iBAAW,CAAC,MAAK;QACzC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,QAAA,oBAAoB,CAAC;AACnB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,IAAI,EAAE;gBACJ,UAAU;AACX,aAAA;AACF,SAAA,CAAC,CAAC;AACL,KAAC,EAAE,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC;AAEvC,IAAA,QACEC,sBAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,SAAS,EAAA;AAClC,QAAAA,sBAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,OAAO,EAAE,eAAe,EACnE,EAAA,aAAa,KAAK,IAAI,IACrBA,qCAACC,6BAAgB,EAAA,EAAC,SAAS,EAAE,UAAU,CAAC,gBAAgB,GAAI,KAE5DD,qCAACE,qBAAY,EAAA,EAAC,SAAS,EAAE,UAAU,CAAC,YAAY,EAAA,CAAI,CACrD,CACM;QACTF,sBACE,CAAA,aAAA,CAAA,QAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,gBAAgB,EACtC,OAAO,EAAE,iBAAiB,EAAA,EAEzB,aAAa,KAAK,MAAM,IACvBA,sBAAC,CAAA,aAAA,CAAAG,iCAAkB,IAAC,SAAS,EAAE,UAAU,CAAC,kBAAkB,GAAI,KAEhEH,qCAACI,yBAAc,EAAA,EAAC,SAAS,EAAE,UAAU,CAAC,cAAc,EAAA,CAAI,CACzD,CACM,CACL,EACN;AACJ;;;;"}
|