@yext/chat-ui-react 0.5.5 → 0.6.0-alpha.38
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/README.md +9 -11
- package/THIRD-PARTY-NOTICES +1 -133
- package/lib/bundle.css +1 -1
- package/lib/commonjs/package.json.js +141 -0
- package/lib/commonjs/package.json.js.map +1 -0
- package/lib/commonjs/src/components/ChatHeader.js +21 -20
- package/lib/commonjs/src/components/ChatHeader.js.map +1 -1
- package/lib/commonjs/src/components/ChatInput.js +25 -27
- package/lib/commonjs/src/components/ChatInput.js.map +1 -1
- package/lib/commonjs/src/components/ChatPanel.d.ts.map +1 -1
- package/lib/commonjs/src/components/ChatPanel.js +30 -30
- package/lib/commonjs/src/components/ChatPanel.js.map +1 -1
- package/lib/commonjs/src/components/ChatPopUp.d.ts.map +1 -1
- package/lib/commonjs/src/components/ChatPopUp.js +24 -23
- package/lib/commonjs/src/components/ChatPopUp.js.map +1 -1
- package/lib/commonjs/src/components/FeedbackButtons.js +21 -20
- package/lib/commonjs/src/components/FeedbackButtons.js.map +1 -1
- package/lib/commonjs/src/components/LoadingDots.js +8 -7
- package/lib/commonjs/src/components/LoadingDots.js.map +1 -1
- package/lib/commonjs/src/components/Markdown.js +19 -21
- package/lib/commonjs/src/components/Markdown.js.map +1 -1
- package/lib/commonjs/src/components/MessageBubble.js +21 -20
- package/lib/commonjs/src/components/MessageBubble.js.map +1 -1
- package/lib/commonjs/src/components/index.d.ts +0 -1
- package/lib/commonjs/src/components/index.d.ts.map +1 -1
- package/lib/commonjs/src/hooks/useComposedCssClasses.js +9 -8
- package/lib/commonjs/src/hooks/useComposedCssClasses.js.map +1 -1
- package/lib/commonjs/src/hooks/useDefaultHandleApiError.js +10 -9
- package/lib/commonjs/src/hooks/useDefaultHandleApiError.js.map +1 -1
- package/lib/commonjs/src/hooks/useReportAnalyticsEvent.js +11 -13
- package/lib/commonjs/src/hooks/useReportAnalyticsEvent.js.map +1 -1
- package/lib/commonjs/src/icons/Arrow.js +7 -6
- package/lib/commonjs/src/icons/Arrow.js.map +1 -1
- package/lib/commonjs/src/icons/Chat.js +7 -6
- package/lib/commonjs/src/icons/Chat.js.map +1 -1
- package/lib/commonjs/src/icons/Cross.js +7 -6
- package/lib/commonjs/src/icons/Cross.js.map +1 -1
- package/lib/commonjs/src/icons/DualSync.js +7 -6
- package/lib/commonjs/src/icons/DualSync.js.map +1 -1
- package/lib/commonjs/src/icons/ThumbsDown.js +7 -6
- package/lib/commonjs/src/icons/ThumbsDown.js.map +1 -1
- package/lib/commonjs/src/icons/ThumbsDownFill.js +7 -6
- package/lib/commonjs/src/icons/ThumbsDownFill.js.map +1 -1
- package/lib/commonjs/src/icons/ThumbsUp.js +7 -6
- package/lib/commonjs/src/icons/ThumbsUp.js.map +1 -1
- package/lib/commonjs/src/icons/ThumbsUpFill.js +7 -6
- package/lib/commonjs/src/icons/ThumbsUpFill.js.map +1 -1
- package/lib/commonjs/src/index.js +18 -19
- package/lib/commonjs/src/index.js.map +1 -1
- package/lib/commonjs/src/utils/withStylelessCssClasses.js +4 -4
- package/lib/commonjs/src/utils/withStylelessCssClasses.js.map +1 -1
- package/lib/esm/index.d.ts +0 -12
- package/lib/esm/package.json.mjs +121 -0
- package/lib/esm/package.json.mjs.map +1 -0
- package/lib/esm/src/components/{ChatHeader.js → ChatHeader.mjs} +14 -11
- package/lib/esm/src/components/ChatHeader.mjs.map +1 -0
- package/lib/esm/src/components/{ChatInput.js → ChatInput.mjs} +15 -12
- package/lib/esm/src/components/ChatInput.mjs.map +1 -0
- package/lib/esm/src/components/ChatPanel.d.ts.map +1 -1
- package/lib/esm/src/components/{ChatPanel.js → ChatPanel.mjs} +18 -16
- package/lib/esm/src/components/ChatPanel.mjs.map +1 -0
- package/lib/esm/src/components/ChatPopUp.d.ts.map +1 -1
- package/lib/esm/src/components/{ChatPopUp.js → ChatPopUp.mjs} +15 -12
- package/lib/esm/src/components/ChatPopUp.mjs.map +1 -0
- package/lib/esm/src/components/{FeedbackButtons.js → FeedbackButtons.mjs} +15 -12
- package/lib/esm/src/components/FeedbackButtons.mjs.map +1 -0
- package/lib/esm/src/components/LoadingDots.mjs +14 -0
- package/lib/esm/src/components/LoadingDots.mjs.map +1 -0
- package/lib/esm/src/components/{Markdown.js → Markdown.mjs} +14 -11
- package/lib/esm/src/components/Markdown.mjs.map +1 -0
- package/lib/esm/src/components/{MessageBubble.js → MessageBubble.mjs} +14 -11
- package/lib/esm/src/components/MessageBubble.mjs.map +1 -0
- package/lib/esm/src/components/index.d.ts +0 -1
- package/lib/esm/src/components/index.d.ts.map +1 -1
- package/lib/esm/src/hooks/{useComposedCssClasses.js → useComposedCssClasses.mjs} +7 -4
- package/lib/esm/src/hooks/useComposedCssClasses.mjs.map +1 -0
- package/lib/esm/src/hooks/{useDefaultHandleApiError.js → useDefaultHandleApiError.mjs} +7 -4
- package/lib/esm/src/hooks/useDefaultHandleApiError.mjs.map +1 -0
- package/lib/esm/src/hooks/{useReportAnalyticsEvent.js → useReportAnalyticsEvent.mjs} +8 -5
- package/lib/esm/src/hooks/useReportAnalyticsEvent.mjs.map +1 -0
- package/lib/esm/src/icons/Arrow.mjs +8 -0
- package/lib/esm/src/icons/Arrow.mjs.map +1 -0
- package/lib/esm/src/icons/Chat.mjs +8 -0
- package/lib/esm/src/icons/Chat.mjs.map +1 -0
- package/lib/esm/src/icons/Cross.mjs +8 -0
- package/lib/esm/src/icons/Cross.mjs.map +1 -0
- package/lib/esm/src/icons/DualSync.mjs +8 -0
- package/lib/esm/src/icons/DualSync.mjs.map +1 -0
- package/lib/esm/src/icons/ThumbsDown.mjs +8 -0
- package/lib/esm/src/icons/ThumbsDown.mjs.map +1 -0
- package/lib/esm/src/icons/ThumbsDownFill.mjs +8 -0
- package/lib/esm/src/icons/ThumbsDownFill.mjs.map +1 -0
- package/lib/esm/src/icons/ThumbsUp.mjs +8 -0
- package/lib/esm/src/icons/ThumbsUp.mjs.map +1 -0
- package/lib/esm/src/icons/ThumbsUpFill.mjs +8 -0
- package/lib/esm/src/icons/ThumbsUpFill.mjs.map +1 -0
- package/lib/esm/src/index.mjs +7 -0
- package/lib/esm/src/index.mjs.map +1 -0
- package/lib/esm/src/utils/{withStylelessCssClasses.js → withStylelessCssClasses.mjs} +4 -2
- package/lib/esm/src/utils/withStylelessCssClasses.mjs.map +1 -0
- package/package.json +9 -7
- package/src/components/ChatInput.tsx +3 -3
- package/src/components/ChatPanel.tsx +20 -18
- package/src/components/ChatPopUp.tsx +26 -22
- package/src/components/MessageBubble.tsx +1 -1
- package/src/components/index.ts +0 -2
- package/lib/commonjs/package.json +0 -100
- package/lib/commonjs/src/components/ChatStyleProvider.d.ts +0 -13
- package/lib/commonjs/src/components/ChatStyleProvider.d.ts.map +0 -1
- package/lib/commonjs/src/components/ChatStyleProvider.js +0 -19
- package/lib/commonjs/src/components/ChatStyleProvider.js.map +0 -1
- package/lib/commonjs/src/components/index.js +0 -16
- package/lib/commonjs/src/components/index.js.map +0 -1
- package/lib/commonjs/src/hooks/index.js +0 -6
- package/lib/commonjs/src/hooks/index.js.map +0 -1
- package/lib/esm/package.json +0 -100
- package/lib/esm/src/components/ChatHeader.js.map +0 -1
- package/lib/esm/src/components/ChatInput.js.map +0 -1
- package/lib/esm/src/components/ChatPanel.js.map +0 -1
- package/lib/esm/src/components/ChatPopUp.js.map +0 -1
- package/lib/esm/src/components/ChatStyleProvider.d.ts +0 -13
- package/lib/esm/src/components/ChatStyleProvider.d.ts.map +0 -1
- package/lib/esm/src/components/ChatStyleProvider.js +0 -15
- package/lib/esm/src/components/ChatStyleProvider.js.map +0 -1
- package/lib/esm/src/components/FeedbackButtons.js.map +0 -1
- package/lib/esm/src/components/LoadingDots.js +0 -11
- package/lib/esm/src/components/LoadingDots.js.map +0 -1
- package/lib/esm/src/components/Markdown.js.map +0 -1
- package/lib/esm/src/components/MessageBubble.js.map +0 -1
- package/lib/esm/src/components/index.js +0 -7
- package/lib/esm/src/components/index.js.map +0 -1
- package/lib/esm/src/hooks/index.js +0 -2
- package/lib/esm/src/hooks/index.js.map +0 -1
- package/lib/esm/src/hooks/useComposedCssClasses.js.map +0 -1
- package/lib/esm/src/hooks/useDefaultHandleApiError.js.map +0 -1
- package/lib/esm/src/hooks/useReportAnalyticsEvent.js.map +0 -1
- package/lib/esm/src/icons/Arrow.js +0 -5
- package/lib/esm/src/icons/Arrow.js.map +0 -1
- package/lib/esm/src/icons/Chat.js +0 -5
- package/lib/esm/src/icons/Chat.js.map +0 -1
- package/lib/esm/src/icons/Cross.js +0 -5
- package/lib/esm/src/icons/Cross.js.map +0 -1
- package/lib/esm/src/icons/DualSync.js +0 -5
- package/lib/esm/src/icons/DualSync.js.map +0 -1
- package/lib/esm/src/icons/ThumbsDown.js +0 -5
- package/lib/esm/src/icons/ThumbsDown.js.map +0 -1
- package/lib/esm/src/icons/ThumbsDownFill.js +0 -5
- package/lib/esm/src/icons/ThumbsDownFill.js.map +0 -1
- package/lib/esm/src/icons/ThumbsUp.js +0 -5
- package/lib/esm/src/icons/ThumbsUp.js.map +0 -1
- package/lib/esm/src/icons/ThumbsUpFill.js +0 -5
- package/lib/esm/src/icons/ThumbsUpFill.js.map +0 -1
- package/lib/esm/src/index.js +0 -3
- package/lib/esm/src/index.js.map +0 -1
- package/lib/esm/src/utils/withStylelessCssClasses.js.map +0 -1
- package/src/components/ChatStyleProvider.tsx +0 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatInput.js","
|
|
1
|
+
{"version":3,"file":"ChatInput.js","sources":["../../../../src/components/ChatInput.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { useChatActions, useChatState } from \"@yext/chat-headless-react\";\nimport { ArrowIcon } from \"../icons/Arrow\";\nimport { useComposedCssClasses } from \"../hooks\";\nimport TextareaAutosize from \"react-textarea-autosize\";\nimport { useDefaultHandleApiError } from \"../hooks/useDefaultHandleApiError\";\nimport { withStylelessCssClasses } from \"../utils/withStylelessCssClasses\";\n\n/**\n * The CSS class interface for the {@link ChatInput} component.\n *\n * @public\n */\nexport interface ChatInputCssClasses {\n container?: string;\n textArea?: string;\n sendButton?: string;\n}\n\nconst builtInCssClasses: ChatInputCssClasses = withStylelessCssClasses(\n \"Input\",\n {\n container: \"w-full h-fit flex flex-row relative @container\",\n textArea:\n \"w-full p-4 pr-12 border border-slate-300 rounded-3xl resize-none text-[13px] @[480px]:text-base placeholder:text-[13px] placeholder:@[480px]:text-base text-slate-900\",\n sendButton:\n \"rounded-full p-1.5 w-8 h-8 stroke-2 text-white bg-blue-600 disabled:bg-slate-200 hover:bg-blue-800 active:scale-90 transition-all absolute right-4 bottom-2.5 @[480px]:bottom-3.5\",\n }\n);\n\n/**\n * The props for the {@link ChatInput} component.\n *\n * @public\n */\nexport interface ChatInputProps {\n /**\n * The input's placeholder text when no text has been entered by the user.\n * Defaults to \"Type a message...\".\n */\n placeholder?: string;\n /**\n * Enable streaming behavior by making a request to Chat Streaming API.\n * This feature is experimental, and is subject to change.\n * Defaults to false.\n */\n stream?: boolean;\n /** Enable auto focus for the input box. Defaults to false. */\n inputAutoFocus?: boolean;\n /**\n * A function which is called when an error occurs from Chat API while processing the user's message.\n * By default, the error is logged to the console and an error message is added to state.\n */\n handleError?: (e: unknown) => void;\n /** Custom icon for the send button. */\n sendButtonIcon?: JSX.Element;\n /** CSS classes for customizing the component styling. */\n customCssClasses?: ChatInputCssClasses;\n}\n\n/**\n * A component that allows user to input message and send to Chat API.\n *\n * @remarks\n * Pressing \"Enter\" key will send the current message.\n * To add a newline, press \"Shift\" and \"Enter\".\n *\n * @public\n *\n * @param props - {@link ChatInputProps}\n */\nexport function ChatInput({\n placeholder = \"Type a message...\",\n stream = false,\n inputAutoFocus = false,\n handleError,\n sendButtonIcon = <ArrowIcon />,\n customCssClasses,\n}: ChatInputProps) {\n const chat = useChatActions();\n const [input, setInput] = useState(\"\");\n const canSendMessage = useChatState(\n (state) => state.conversation.canSendMessage\n );\n const defaultHandleApiError = useDefaultHandleApiError();\n\n const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n const sendMessage = useCallback(async () => {\n const res = stream\n ? chat.streamNextMessage(input)\n : chat.getNextMessage(input);\n setInput(\"\");\n res.catch((e) => (handleError ? handleError(e) : defaultHandleApiError(e)));\n }, [chat, input, handleError, defaultHandleApiError, stream]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!e.shiftKey && e.key === \"Enter\") {\n e.preventDefault();\n if (canSendMessage && input.trim().length !== 0) {\n sendMessage();\n }\n }\n },\n [sendMessage, canSendMessage, input]\n );\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n },\n []\n );\n\n return (\n <div className={cssClasses.container}>\n <TextareaAutosize\n autoFocus={inputAutoFocus}\n onKeyDown={handleKeyDown}\n value={input}\n onChange={onInputChange}\n className={cssClasses.textArea}\n placeholder={placeholder}\n />\n <button\n aria-label=\"Send Message\"\n disabled={!canSendMessage || input.trim().length === 0}\n onClick={sendMessage}\n className={cssClasses.sendButton}\n >\n {sendButtonIcon}\n </button>\n </div>\n );\n}\n"],"names":["withStylelessCssClasses","_jsx","ArrowIcon","useChatActions","useState","useChatState","useDefaultHandleApiError","useComposedCssClasses","useCallback","_jsxs"],"mappings":";;;;;;;;;;;AAmBA,MAAM,iBAAiB,GAAwBA,+CAAuB,CACpE,OAAO,EACP;AACE,IAAA,SAAS,EAAE,gDAAgD;AAC3D,IAAA,QAAQ,EACN,uKAAuK;AACzK,IAAA,UAAU,EACR,mLAAmL;AACtL,CAAA,CACF,CAAC;AAgCF;;;;;;;;;;AAUG;AACG,SAAU,SAAS,CAAC,EACxB,WAAW,GAAG,mBAAmB,EACjC,MAAM,GAAG,KAAK,EACd,cAAc,GAAG,KAAK,EACtB,WAAW,EACX,cAAc,GAAGC,cAAA,CAACC,eAAS,EAAA,EAAA,CAAG,EAC9B,gBAAgB,GACD,EAAA;AACf,IAAA,MAAM,IAAI,GAAGC,gCAAc,EAAE,CAAC;IAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGC,cAAQ,CAAC,EAAE,CAAC,CAAC;AACvC,IAAA,MAAM,cAAc,GAAGC,8BAAY,CACjC,CAAC,KAAK,KAAK,KAAK,CAAC,YAAY,CAAC,cAAc,CAC7C,CAAC;AACF,IAAA,MAAM,qBAAqB,GAAGC,iDAAwB,EAAE,CAAC;IAEzD,MAAM,UAAU,GAAGC,2CAAqB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAE9E,IAAA,MAAM,WAAW,GAAGC,iBAAW,CAAC,YAAW;QACzC,MAAM,GAAG,GAAG,MAAM;AAChB,cAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC/B,cAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/B,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,KAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAC/B,CAAC,CAA2C,KAAI;QAC9C,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;YACpC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,cAAc,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/C,gBAAA,WAAW,EAAE,CAAC;AACf,aAAA;AACF,SAAA;KACF,EACD,CAAC,WAAW,EAAE,cAAc,EAAE,KAAK,CAAC,CACrC,CAAC;AAEF,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAC/B,CAAC,CAAyC,KAAI;AAC5C,QAAA,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1B,EACD,EAAE,CACH,CAAC;AAEF,IAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,SAAS,EAClC,QAAA,EAAA,CAAAR,cAAA,CAAC,gBAAgB,EAAA,EACf,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,UAAU,CAAC,QAAQ,EAC9B,WAAW,EAAE,WAAW,EACxB,CAAA,EACFA,cACa,CAAA,QAAA,EAAA,EAAA,YAAA,EAAA,cAAc,EACzB,QAAQ,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EACtD,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,UAAU,CAAC,UAAU,EAE/B,QAAA,EAAA,cAAc,EACR,CAAA,CAAA,EAAA,CACL,EACN;AACJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/ChatPanel.tsx"],"names":[],"mappings":";AAEA,OAAO,EAEL,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAa,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7E;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACnD;AAeD;;;;GAIG;AACH,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAC,EAC9D,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC1C,kDAAkD;IAClD,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/ChatPanel.tsx"],"names":[],"mappings":";AAEA,OAAO,EAEL,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAa,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7E;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACnD;AAeD;;;;GAIG;AACH,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAC,EAC9D,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC1C,kDAAkD;IAClD,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CA6D9C"}
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
const builtInCssClasses = (0, withStylelessCssClasses_1.withStylelessCssClasses)("Panel", {
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var chatHeadlessReact = require('@yext/chat-headless-react');
|
|
6
|
+
var MessageBubble = require('./MessageBubble.js');
|
|
7
|
+
var ChatInput = require('./ChatInput.js');
|
|
8
|
+
var LoadingDots = require('./LoadingDots.js');
|
|
9
|
+
var useComposedCssClasses = require('../hooks/useComposedCssClasses.js');
|
|
10
|
+
var useDefaultHandleApiError = require('../hooks/useDefaultHandleApiError.js');
|
|
11
|
+
var withStylelessCssClasses = require('../utils/withStylelessCssClasses.js');
|
|
12
|
+
var useReportAnalyticsEvent = require('../hooks/useReportAnalyticsEvent.js');
|
|
13
|
+
|
|
14
|
+
const builtInCssClasses = withStylelessCssClasses.withStylelessCssClasses("Panel", {
|
|
16
15
|
container: "h-full w-full flex flex-col relative shadow-2xl bg-white",
|
|
17
16
|
messagesScrollContainer: "flex flex-col mt-auto overflow-hidden",
|
|
18
|
-
messagesContainer: "flex flex-col gap-y-1 px-4
|
|
19
|
-
inputContainer: "w-full
|
|
17
|
+
messagesContainer: "flex flex-col gap-y-1 px-4 overflow-auto",
|
|
18
|
+
inputContainer: "w-full p-4",
|
|
20
19
|
messageBubbleCssClasses: {
|
|
21
20
|
topContainer: "first:mt-4",
|
|
22
21
|
},
|
|
@@ -32,20 +31,20 @@ const builtInCssClasses = (0, withStylelessCssClasses_1.withStylelessCssClasses)
|
|
|
32
31
|
*/
|
|
33
32
|
function ChatPanel(props) {
|
|
34
33
|
const { header, customCssClasses } = props;
|
|
35
|
-
const chat =
|
|
36
|
-
const messages =
|
|
37
|
-
const loading =
|
|
38
|
-
const canSendMessage =
|
|
39
|
-
const cssClasses =
|
|
40
|
-
const defaultHandleApiError =
|
|
41
|
-
const reportAnalyticsEvent =
|
|
42
|
-
|
|
34
|
+
const chat = chatHeadlessReact.useChatActions();
|
|
35
|
+
const messages = chatHeadlessReact.useChatState((state) => state.conversation.messages);
|
|
36
|
+
const loading = chatHeadlessReact.useChatState((state) => state.conversation.isLoading);
|
|
37
|
+
const canSendMessage = chatHeadlessReact.useChatState((state) => state.conversation.canSendMessage);
|
|
38
|
+
const cssClasses = useComposedCssClasses.useComposedCssClasses(builtInCssClasses, customCssClasses);
|
|
39
|
+
const defaultHandleApiError = useDefaultHandleApiError.useDefaultHandleApiError();
|
|
40
|
+
const reportAnalyticsEvent = useReportAnalyticsEvent.useReportAnalyticsEvent();
|
|
41
|
+
react.useEffect(() => {
|
|
43
42
|
reportAnalyticsEvent({
|
|
44
43
|
action: "CHAT_IMPRESSION",
|
|
45
44
|
});
|
|
46
45
|
}, [reportAnalyticsEvent]);
|
|
47
46
|
// Fetch the first message on load, if there are no existing messages or a request being processed
|
|
48
|
-
|
|
47
|
+
react.useEffect(() => {
|
|
49
48
|
if (messages.length !== 0 || !canSendMessage) {
|
|
50
49
|
return;
|
|
51
50
|
}
|
|
@@ -53,15 +52,16 @@ function ChatPanel(props) {
|
|
|
53
52
|
const res = stream ? chat.streamNextMessage() : chat.getNextMessage();
|
|
54
53
|
res.catch((e) => (handleError ? handleError(e) : defaultHandleApiError(e)));
|
|
55
54
|
}, [chat, props, messages, defaultHandleApiError, canSendMessage]);
|
|
56
|
-
const messagesRef =
|
|
55
|
+
const messagesRef = react.useRef(null);
|
|
57
56
|
// Scroll to the bottom of the chat when the messages change
|
|
58
|
-
|
|
57
|
+
react.useEffect(() => {
|
|
59
58
|
messagesRef.current?.scroll({
|
|
60
59
|
top: messagesRef.current?.scrollHeight,
|
|
61
60
|
behavior: "smooth",
|
|
62
61
|
});
|
|
63
62
|
}, [messages]);
|
|
64
|
-
return ((
|
|
63
|
+
return (jsxRuntime.jsx("div", { className: "yext-chat", children: jsxRuntime.jsxs("div", { className: cssClasses.container, children: [header, jsxRuntime.jsx("div", { className: cssClasses.messagesScrollContainer, children: jsxRuntime.jsxs("div", { ref: messagesRef, className: cssClasses.messagesContainer, children: [messages.map((message, index) => (react.createElement(MessageBubble.MessageBubble, { ...props, customCssClasses: cssClasses.messageBubbleCssClasses, key: index, message: message }))), loading && jsxRuntime.jsx(LoadingDots.LoadingDots, {})] }) }), jsxRuntime.jsx("div", { className: cssClasses.inputContainer, children: jsxRuntime.jsx(ChatInput.ChatInput, { ...props, customCssClasses: cssClasses.inputCssClasses }) })] }) }));
|
|
65
64
|
}
|
|
65
|
+
|
|
66
66
|
exports.ChatPanel = ChatPanel;
|
|
67
|
-
//# sourceMappingURL=ChatPanel.js.map
|
|
67
|
+
//# sourceMappingURL=ChatPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.js","
|
|
1
|
+
{"version":3,"file":"ChatPanel.js","sources":["../../../../src/components/ChatPanel.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useChatState, useChatActions } 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 { useDefaultHandleApiError } from \"../hooks/useDefaultHandleApiError\";\nimport { withStylelessCssClasses } from \"../utils/withStylelessCssClasses\";\nimport { useReportAnalyticsEvent } from \"../hooks/useReportAnalyticsEvent\";\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}\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: \"flex flex-col gap-y-1 px-4 overflow-auto\",\n inputContainer: \"w-full p-4\",\n messageBubbleCssClasses: {\n topContainer: \"first:mt-4\",\n },\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?: JSX.Element;\n /**\n * CSS classes for customizing the component styling.\n */\n customCssClasses?: ChatPanelCssClasses;\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 { header, customCssClasses } = props;\n const chat = useChatActions();\n const messages = useChatState((state) => state.conversation.messages);\n const loading = useChatState((state) => state.conversation.isLoading);\n const canSendMessage = useChatState(\n (state) => state.conversation.canSendMessage\n );\n const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n const defaultHandleApiError = useDefaultHandleApiError();\n const reportAnalyticsEvent = useReportAnalyticsEvent();\n\n useEffect(() => {\n reportAnalyticsEvent({\n action: \"CHAT_IMPRESSION\",\n });\n }, [reportAnalyticsEvent]);\n\n // Fetch the first message on load, if there are no existing messages or a request being processed\n useEffect(() => {\n if (messages.length !== 0 || !canSendMessage) {\n return;\n }\n const { stream = false, handleError } = props;\n const res = stream ? chat.streamNextMessage() : chat.getNextMessage();\n res.catch((e) => (handleError ? handleError(e) : defaultHandleApiError(e)));\n }, [chat, props, messages, defaultHandleApiError, canSendMessage]);\n\n const messagesRef = useRef<HTMLDivElement>(null);\n\n // Scroll to the bottom of the chat when the messages change\n useEffect(() => {\n messagesRef.current?.scroll({\n top: messagesRef.current?.scrollHeight,\n behavior: \"smooth\",\n });\n }, [messages]);\n\n return (\n <div className=\"yext-chat\">\n <div className={cssClasses.container}>\n {header}\n <div className={cssClasses.messagesScrollContainer}>\n <div ref={messagesRef} className={cssClasses.messagesContainer}>\n {messages.map((message, index) => (\n <MessageBubble\n {...props}\n customCssClasses={cssClasses.messageBubbleCssClasses}\n key={index}\n message={message}\n />\n ))}\n {loading && <LoadingDots />}\n </div>\n </div>\n <div className={cssClasses.inputContainer}>\n <ChatInput {...props} customCssClasses={cssClasses.inputCssClasses} />\n </div>\n </div>\n </div>\n );\n}\n"],"names":["withStylelessCssClasses","useChatActions","useChatState","useComposedCssClasses","useDefaultHandleApiError","useReportAnalyticsEvent","useEffect","useRef","_jsx","_jsxs","_createElement","MessageBubble","LoadingDots","ChatInput"],"mappings":";;;;;;;;;;;;;AA4BA,MAAM,iBAAiB,GAAwBA,+CAAuB,CACpE,OAAO,EACP;AACE,IAAA,SAAS,EAAE,0DAA0D;AACrE,IAAA,uBAAuB,EAAE,uCAAuC;AAChE,IAAA,iBAAiB,EAAE,0CAA0C;AAC7D,IAAA,cAAc,EAAE,YAAY;AAC5B,IAAA,uBAAuB,EAAE;AACvB,QAAA,YAAY,EAAE,YAAY;AAC3B,KAAA;AACF,CAAA,CACF,CAAC;AAkBF;;;;;;;;AAQG;AACG,SAAU,SAAS,CAAC,KAAqB,EAAA;AAC7C,IAAA,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;AAC3C,IAAA,MAAM,IAAI,GAAGC,gCAAc,EAAE,CAAC;AAC9B,IAAA,MAAM,QAAQ,GAAGC,8BAAY,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACtE,IAAA,MAAM,OAAO,GAAGA,8BAAY,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AACtE,IAAA,MAAM,cAAc,GAAGA,8BAAY,CACjC,CAAC,KAAK,KAAK,KAAK,CAAC,YAAY,CAAC,cAAc,CAC7C,CAAC;IACF,MAAM,UAAU,GAAGC,2CAAqB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAC9E,IAAA,MAAM,qBAAqB,GAAGC,iDAAwB,EAAE,CAAC;AACzD,IAAA,MAAM,oBAAoB,GAAGC,+CAAuB,EAAE,CAAC;IAEvDC,eAAS,CAAC,MAAK;AACb,QAAA,oBAAoB,CAAC;AACnB,YAAA,MAAM,EAAE,iBAAiB;AAC1B,SAAA,CAAC,CAAC;AACL,KAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;;IAG3BA,eAAS,CAAC,MAAK;QACb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE;YAC5C,OAAO;AACR,SAAA;QACD,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;AAC9C,QAAA,MAAM,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,KAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,cAAc,CAAC,CAAC,CAAC;AAEnE,IAAA,MAAM,WAAW,GAAGC,YAAM,CAAiB,IAAI,CAAC,CAAC;;IAGjDD,eAAS,CAAC,MAAK;AACb,QAAA,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;AAC1B,YAAA,GAAG,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY;AACtC,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC,CAAC;AACL,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,QACEE,wBAAK,SAAS,EAAC,WAAW,EACxB,QAAA,EAAAC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,SAAS,EAAA,QAAA,EAAA,CACjC,MAAM,EACPD,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,uBAAuB,EAChD,QAAA,EAAAC,eAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,iBAAiB,aAC3D,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,MAC3BC,mBAAA,CAACC,2BAAa,EAAA,EAAA,GACR,KAAK,EACT,gBAAgB,EAAE,UAAU,CAAC,uBAAuB,EACpD,GAAG,EAAE,KAAK,EACV,OAAO,EAAE,OAAO,GAChB,CACH,CAAC,EACD,OAAO,IAAIH,cAAC,CAAAI,uBAAW,EAAG,EAAA,CAAA,CAAA,EAAA,CACvB,GACF,EACNJ,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,cAAc,EAAA,QAAA,EACvCA,cAAC,CAAAK,mBAAS,EAAK,EAAA,GAAA,KAAK,EAAE,gBAAgB,EAAE,UAAU,CAAC,eAAe,GAAI,EAClE,CAAA,CAAA,EAAA,CACF,EACF,CAAA,EACN;AACJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPopUp.d.ts","sourceRoot":"","sources":["../../../../src/components/ChatPopUp.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAa,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAEL,oBAAoB,EACpB,eAAe,EAChB,MAAM,cAAc,CAAC;AAMtB;;;;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,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AA8BD;;;;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;;OAEG;IACH,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"ChatPopUp.d.ts","sourceRoot":"","sources":["../../../../src/components/ChatPopUp.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAa,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAEL,oBAAoB,EACpB,eAAe,EAChB,MAAM,cAAc,CAAC;AAMtB;;;;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,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AA8BD;;;;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;;OAEG;IACH,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAkE9C"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var Chat = require('../icons/Chat.js');
|
|
6
|
+
var ChatPanel = require('./ChatPanel.js');
|
|
7
|
+
var ChatHeader = require('./ChatHeader.js');
|
|
8
|
+
var tailwindMerge = require('tailwind-merge');
|
|
9
|
+
var useComposedCssClasses = require('../hooks/useComposedCssClasses.js');
|
|
10
|
+
var withStylelessCssClasses = require('../utils/withStylelessCssClasses.js');
|
|
11
|
+
var useReportAnalyticsEvent = require('../hooks/useReportAnalyticsEvent.js');
|
|
12
|
+
|
|
13
13
|
const fixedPosition = "fixed bottom-6 right-4 lg:bottom-14 lg:right-10 z-50 ";
|
|
14
|
-
const builtInCssClasses =
|
|
14
|
+
const builtInCssClasses = withStylelessCssClasses.withStylelessCssClasses("PopUp", {
|
|
15
15
|
container: "transition-all",
|
|
16
16
|
panel: fixedPosition +
|
|
17
17
|
"w-80 max-[480px]:right-0 max-[480px]:bottom-0 max-[480px]:w-full max-[480px]:h-full lg:w-96 h-[75vh]",
|
|
@@ -41,24 +41,25 @@ const builtInCssClasses = (0, withStylelessCssClasses_1.withStylelessCssClasses)
|
|
|
41
41
|
*/
|
|
42
42
|
function ChatPopUp(props) {
|
|
43
43
|
const { openPanelButtonIcon, customCssClasses, showRestartButton = true, onClose: customOnClose, title, } = props;
|
|
44
|
-
const reportAnalyticsEvent =
|
|
45
|
-
|
|
44
|
+
const reportAnalyticsEvent = useReportAnalyticsEvent.useReportAnalyticsEvent();
|
|
45
|
+
react.useEffect(() => {
|
|
46
46
|
reportAnalyticsEvent({
|
|
47
47
|
action: "CHAT_IMPRESSION",
|
|
48
48
|
});
|
|
49
49
|
}, [reportAnalyticsEvent]);
|
|
50
|
-
const [showChat, setShowChat] =
|
|
51
|
-
const onClick =
|
|
50
|
+
const [showChat, setShowChat] = react.useState(false);
|
|
51
|
+
const onClick = react.useCallback(() => {
|
|
52
52
|
setShowChat(!showChat);
|
|
53
53
|
}, [showChat]);
|
|
54
|
-
const onClose =
|
|
54
|
+
const onClose = react.useCallback(() => {
|
|
55
55
|
setShowChat(false);
|
|
56
56
|
customOnClose?.();
|
|
57
57
|
}, [customOnClose]);
|
|
58
|
-
const cssClasses =
|
|
59
|
-
const panelCssClasses =
|
|
60
|
-
const buttonCssClasses =
|
|
61
|
-
return ((
|
|
58
|
+
const cssClasses = useComposedCssClasses.useComposedCssClasses(builtInCssClasses, customCssClasses);
|
|
59
|
+
const panelCssClasses = tailwindMerge.twMerge(cssClasses.panel, showChat ? cssClasses.panel__display : cssClasses.panel__hidden);
|
|
60
|
+
const buttonCssClasses = tailwindMerge.twMerge(cssClasses.button, showChat ? cssClasses.button__hidden : cssClasses.button__display);
|
|
61
|
+
return (jsxRuntime.jsx("div", { className: "yext-chat", children: jsxRuntime.jsxs("div", { className: cssClasses.container, children: [jsxRuntime.jsx("div", { className: panelCssClasses, "aria-label": "Chat Popup Panel", children: jsxRuntime.jsx(ChatPanel.ChatPanel, { ...props, customCssClasses: cssClasses.panelCssClasses, header: jsxRuntime.jsx(ChatHeader.ChatHeader, { title: title, showRestartButton: showRestartButton, showCloseButton: true, onClose: onClose, customCssClasses: cssClasses.headerCssClasses }) }) }), jsxRuntime.jsx("button", { "aria-label": "Chat Popup Button", onClick: onClick, className: buttonCssClasses, children: openPanelButtonIcon ?? (jsxRuntime.jsx(Chat.ChatIcon, { className: cssClasses.buttonIcon })) })] }) }));
|
|
62
62
|
}
|
|
63
|
+
|
|
63
64
|
exports.ChatPopUp = ChatPopUp;
|
|
64
|
-
//# sourceMappingURL=ChatPopUp.js.map
|
|
65
|
+
//# sourceMappingURL=ChatPopUp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPopUp.js","
|
|
1
|
+
{"version":3,"file":"ChatPopUp.js","sources":["../../../../src/components/ChatPopUp.tsx"],"sourcesContent":["import { 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\";\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 button__display?: string;\n button__hidden?: string;\n buttonIcon?: string;\n headerCssClasses?: ChatHeaderCssClasses;\n panelCssClasses?: ChatPanelCssClasses;\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 button:\n fixedPosition +\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 hover:-translate-y-2 duration-150\",\n button__display: \"duration-300 transform translate-y-0\",\n button__hidden:\n \"duration-300 transform translate-y-[20%] opacity-0 invisible\",\n buttonIcon: \"text-blue-600 w-[28px] h-[28px] lg:w-[40px] lg:h-[40px]\",\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 messagesScrollContainer: \"rounded-b-3xl\",\n },\n }\n);\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 /**\n * CSS classes for customizing the component styling.\n */\n customCssClasses?: ChatPopUpCssClasses;\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 title,\n } = props;\n const reportAnalyticsEvent = useReportAnalyticsEvent();\n\n useEffect(() => {\n reportAnalyticsEvent({\n action: \"CHAT_IMPRESSION\",\n });\n }, [reportAnalyticsEvent]);\n\n const [showChat, setShowChat] = useState(false);\n const onClick = useCallback(() => {\n setShowChat(!showChat);\n }, [showChat]);\n\n const onClose = useCallback(() => {\n setShowChat(false);\n customOnClose?.();\n }, [customOnClose]);\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 buttonCssClasses = twMerge(\n cssClasses.button,\n showChat ? cssClasses.button__hidden : cssClasses.button__display\n );\n\n return (\n <div className=\"yext-chat\">\n <div className={cssClasses.container}>\n <div className={panelCssClasses} aria-label=\"Chat Popup Panel\">\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 />\n </div>\n <button\n aria-label=\"Chat Popup Button\"\n onClick={onClick}\n className={buttonCssClasses}\n >\n {openPanelButtonIcon ?? (\n <ChatIcon className={cssClasses.buttonIcon} />\n )}\n </button>\n </div>\n </div>\n );\n}\n"],"names":["withStylelessCssClasses","useReportAnalyticsEvent","useEffect","useState","useCallback","useComposedCssClasses","twMerge","_jsx","_jsxs","ChatPanel","ChatHeader","ChatIcon"],"mappings":";;;;;;;;;;;;AA+BA,MAAM,aAAa,GAAG,uDAAuD,CAAC;AAC9E,MAAM,iBAAiB,GAAwBA,+CAAuB,CACpE,OAAO,EACP;AACE,IAAA,SAAS,EAAE,gBAAgB;AAC3B,IAAA,KAAK,EACH,aAAa;QACb,sGAAsG;AACxG,IAAA,cAAc,EAAE,4BAA4B;AAC5C,IAAA,aAAa,EAAE,oDAAoD;AACnE,IAAA,MAAM,EACJ,aAAa;QACb,gLAAgL;AAClL,IAAA,eAAe,EAAE,sCAAsC;AACvD,IAAA,cAAc,EACZ,8DAA8D;AAChE,IAAA,UAAU,EAAE,yDAAyD;AACrE,IAAA,gBAAgB,EAAE;AAChB,QAAA,SAAS,EAAE,wCAAwC;AACpD,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,SAAS,EAAE,sCAAsC;AACjD,QAAA,cAAc,EAAE,wCAAwC;AACxD,QAAA,uBAAuB,EAAE,eAAe;AACzC,KAAA;AACF,CAAA,CACF,CAAC;AAkBF;;;;;;;AAOG;AACG,SAAU,SAAS,CAAC,KAAqB,EAAA;AAC7C,IAAA,MAAM,EACJ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAAG,IAAI,EACxB,OAAO,EAAE,aAAa,EACtB,KAAK,GACN,GAAG,KAAK,CAAC;AACV,IAAA,MAAM,oBAAoB,GAAGC,+CAAuB,EAAE,CAAC;IAEvDC,eAAS,CAAC,MAAK;AACb,QAAA,oBAAoB,CAAC;AACnB,YAAA,MAAM,EAAE,iBAAiB;AAC1B,SAAA,CAAC,CAAC;AACL,KAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGC,cAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,IAAA,MAAM,OAAO,GAAGC,iBAAW,CAAC,MAAK;AAC/B,QAAA,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzB,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEf,IAAA,MAAM,OAAO,GAAGA,iBAAW,CAAC,MAAK;QAC/B,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,aAAa,IAAI,CAAC;AACpB,KAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,UAAU,GAAGC,2CAAqB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAGC,qBAAO,CAC7B,UAAU,CAAC,KAAK,EAChB,QAAQ,GAAG,UAAU,CAAC,cAAc,GAAG,UAAU,CAAC,aAAa,CAChE,CAAC;IACF,MAAM,gBAAgB,GAAGA,qBAAO,CAC9B,UAAU,CAAC,MAAM,EACjB,QAAQ,GAAG,UAAU,CAAC,cAAc,GAAG,UAAU,CAAC,eAAe,CAClE,CAAC;AAEF,IAAA,QACEC,cAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,WAAW,EAAA,QAAA,EACxBC,yBAAK,SAAS,EAAE,UAAU,CAAC,SAAS,aAClCD,cAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,eAAe,EAAA,YAAA,EAAa,kBAAkB,EAC5D,QAAA,EAAAA,cAAA,CAACE,mBAAS,EAAA,EAAA,GACJ,KAAK,EACT,gBAAgB,EAAE,UAAU,CAAC,eAAe,EAC5C,MAAM,EACJF,cAAC,CAAAG,qBAAU,IACT,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,IAAI,EACrB,OAAO,EAAE,OAAO,EAChB,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,EAAA,CAC7C,GAEJ,EACE,CAAA,EACNH,yCACa,mBAAmB,EAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,gBAAgB,EAE1B,QAAA,EAAA,mBAAmB,KAClBA,cAAA,CAACI,aAAQ,EAAC,EAAA,SAAS,EAAE,UAAU,CAAC,UAAU,EAAI,CAAA,CAC/C,GACM,CACL,EAAA,CAAA,EAAA,CACF,EACN;AACJ;;;;"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const builtInCssClasses =
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var ThumbsDown = require('../icons/ThumbsDown.js');
|
|
5
|
+
var ThumbsUp = require('../icons/ThumbsUp.js');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var ThumbsUpFill = require('../icons/ThumbsUpFill.js');
|
|
8
|
+
var ThumbsDownFill = require('../icons/ThumbsDownFill.js');
|
|
9
|
+
var withStylelessCssClasses = require('../utils/withStylelessCssClasses.js');
|
|
10
|
+
var useComposedCssClasses = require('../hooks/useComposedCssClasses.js');
|
|
11
|
+
var useReportAnalyticsEvent = require('../hooks/useReportAnalyticsEvent.js');
|
|
12
|
+
|
|
13
|
+
const builtInCssClasses = withStylelessCssClasses.withStylelessCssClasses("FeedbackButtons", {
|
|
14
14
|
container: "flex gap-x-1 absolute -right-1 -top-3 opacity-0 group-hover:opacity-100 duration-200",
|
|
15
15
|
thumbsUpButton: "w-6 h-6 bg-gray-700 rounded-md flex justify-center items-center",
|
|
16
16
|
thumbsUpIcon: "text-white w-[22px] h-[22px] stroke-[0.2]",
|
|
@@ -26,10 +26,10 @@ const builtInCssClasses = (0, withStylelessCssClasses_1.withStylelessCssClasses)
|
|
|
26
26
|
* @internal
|
|
27
27
|
*/
|
|
28
28
|
function FeedbackButtons({ customCssClasses, responseId, }) {
|
|
29
|
-
const reportAnalyticsEvent =
|
|
30
|
-
const cssClasses =
|
|
31
|
-
const [selectedThumb, setSelectedThumb] =
|
|
32
|
-
const onClickThumbsUp =
|
|
29
|
+
const reportAnalyticsEvent = useReportAnalyticsEvent.useReportAnalyticsEvent();
|
|
30
|
+
const cssClasses = useComposedCssClasses.useComposedCssClasses(builtInCssClasses, customCssClasses);
|
|
31
|
+
const [selectedThumb, setSelectedThumb] = react.useState();
|
|
32
|
+
const onClickThumbsUp = react.useCallback(() => {
|
|
33
33
|
setSelectedThumb("UP");
|
|
34
34
|
reportAnalyticsEvent({
|
|
35
35
|
action: "THUMBS_UP",
|
|
@@ -38,7 +38,7 @@ function FeedbackButtons({ customCssClasses, responseId, }) {
|
|
|
38
38
|
},
|
|
39
39
|
});
|
|
40
40
|
}, [reportAnalyticsEvent, responseId]);
|
|
41
|
-
const onClickThumbsDown =
|
|
41
|
+
const onClickThumbsDown = react.useCallback(() => {
|
|
42
42
|
setSelectedThumb("DOWN");
|
|
43
43
|
reportAnalyticsEvent({
|
|
44
44
|
action: "THUMBS_DOWN",
|
|
@@ -47,7 +47,8 @@ function FeedbackButtons({ customCssClasses, responseId, }) {
|
|
|
47
47
|
},
|
|
48
48
|
});
|
|
49
49
|
}, [reportAnalyticsEvent, responseId]);
|
|
50
|
-
return (
|
|
50
|
+
return (jsxRuntime.jsxs("div", { className: cssClasses.container, children: [jsxRuntime.jsx("button", { className: cssClasses.thumbsUpButton, onClick: onClickThumbsUp, children: selectedThumb === "UP" ? (jsxRuntime.jsx(ThumbsUpFill.ThumbsUpFillIcon, { className: cssClasses.thumbsUpFillIcon })) : (jsxRuntime.jsx(ThumbsUp.ThumbsUpIcon, { className: cssClasses.thumbsUpIcon })) }), jsxRuntime.jsx("button", { className: cssClasses.thumbsDownButton, onClick: onClickThumbsDown, children: selectedThumb === "DOWN" ? (jsxRuntime.jsx(ThumbsDownFill.ThumbsDownFillIcon, { className: cssClasses.thumbsDownFillIcon })) : (jsxRuntime.jsx(ThumbsDown.ThumbsDownIcon, { className: cssClasses.thumbsDownIcon })) })] }));
|
|
51
51
|
}
|
|
52
|
+
|
|
52
53
|
exports.FeedbackButtons = FeedbackButtons;
|
|
53
|
-
//# sourceMappingURL=FeedbackButtons.js.map
|
|
54
|
+
//# sourceMappingURL=FeedbackButtons.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButtons.js","
|
|
1
|
+
{"version":3,"file":"FeedbackButtons.js","sources":["../../../../src/components/FeedbackButtons.tsx"],"sourcesContent":["import { ThumbsDownIcon } from \"../icons/ThumbsDown\";\nimport { ThumbsUpIcon } from \"../icons/ThumbsUp\";\nimport { 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 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","_jsxs","_jsx","ThumbsUpFillIcon","ThumbsUpIcon","ThumbsDownFillIcon","ThumbsDownIcon"],"mappings":";;;;;;;;;;;;AAwBA,MAAM,iBAAiB,GACrBA,+CAAuB,CAA4B,iBAAiB,EAAE;AACpE,IAAA,SAAS,EACP,sFAAsF;AACxF,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;IAEvC,QACEC,yBAAK,SAAS,EAAE,UAAU,CAAC,SAAS,aAClCC,cAAQ,CAAA,QAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,OAAO,EAAE,eAAe,EAAA,QAAA,EACnE,aAAa,KAAK,IAAI,IACrBA,eAACC,6BAAgB,EAAA,EAAC,SAAS,EAAE,UAAU,CAAC,gBAAgB,EAAA,CAAI,KAE5DD,cAAA,CAACE,qBAAY,EAAC,EAAA,SAAS,EAAE,UAAU,CAAC,YAAY,GAAI,CACrD,EAAA,CACM,EACTF,cACE,CAAA,QAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,gBAAgB,EACtC,OAAO,EAAE,iBAAiB,EAAA,QAAA,EAEzB,aAAa,KAAK,MAAM,IACvBA,cAAA,CAACG,iCAAkB,EAAA,EAAC,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAA,CAAI,KAEhEH,cAAC,CAAAI,yBAAc,IAAC,SAAS,EAAE,UAAU,CAAC,cAAc,GAAI,CACzD,EAAA,CACM,CACL,EAAA,CAAA,EACN;AACJ;;;;"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var tailwindMerge = require('tailwind-merge');
|
|
5
|
+
|
|
6
6
|
/**
|
|
7
7
|
* A component that signifies loading status.
|
|
8
8
|
*
|
|
9
9
|
* @internal
|
|
10
10
|
*/
|
|
11
11
|
function LoadingDots({ className }) {
|
|
12
|
-
return (
|
|
12
|
+
return (jsxRuntime.jsxs("div", { "aria-label": "Loading Indicator", className: tailwindMerge.twMerge("flex gap-1 p-2 animate-fade-in", className), children: [jsxRuntime.jsx("div", { className: "w-2 h-2 bg-slate-500 rounded-full animate-[bounce_1s_infinite]" }), jsxRuntime.jsx("div", { className: "w-2 h-2 bg-slate-500 rounded-full animate-[bounce_1s_infinite_0.3s]" }), jsxRuntime.jsx("div", { className: "w-2 h-2 bg-slate-500 rounded-full animate-[bounce_1s_infinite_0.6s]" })] }));
|
|
13
13
|
}
|
|
14
|
+
|
|
14
15
|
exports.LoadingDots = LoadingDots;
|
|
15
|
-
//# sourceMappingURL=LoadingDots.js.map
|
|
16
|
+
//# sourceMappingURL=LoadingDots.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingDots.js","
|
|
1
|
+
{"version":3,"file":"LoadingDots.js","sources":["../../../../src/components/LoadingDots.tsx"],"sourcesContent":["import { twMerge } from \"tailwind-merge\";\n\n/**\n * A component that signifies loading status.\n *\n * @internal\n */\nexport function LoadingDots({ className }: { className?: string }) {\n return (\n <div\n aria-label=\"Loading Indicator\"\n className={twMerge(\"flex gap-1 p-2 animate-fade-in\", className)}\n >\n <div className=\"w-2 h-2 bg-slate-500 rounded-full animate-[bounce_1s_infinite]\" />\n <div className=\"w-2 h-2 bg-slate-500 rounded-full animate-[bounce_1s_infinite_0.3s]\" />\n <div className=\"w-2 h-2 bg-slate-500 rounded-full animate-[bounce_1s_infinite_0.6s]\" />\n </div>\n );\n}\n"],"names":["_jsxs","twMerge","_jsx"],"mappings":";;;;;AAEA;;;;AAIG;AACa,SAAA,WAAW,CAAC,EAAE,SAAS,EAA0B,EAAA;AAC/D,IAAA,QACEA,eAAA,CAAA,KAAA,EAAA,EAAA,YAAA,EACa,mBAAmB,EAC9B,SAAS,EAAEC,qBAAO,CAAC,gCAAgC,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,CAE/DC,wBAAK,SAAS,EAAC,gEAAgE,EAAA,CAAG,EAClFA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qEAAqE,EAAG,CAAA,EACvFA,cAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,qEAAqE,EAAG,CAAA,CAAA,EAAA,CACnF,EACN;AACJ;;;;"}
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const rehype_sanitize_1 = __importDefault(require("rehype-sanitize"));
|
|
12
|
-
const react_1 = require("react");
|
|
13
|
-
const useReportAnalyticsEvent_1 = require("../hooks/useReportAnalyticsEvent");
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var ReactMarkdown = require('react-markdown');
|
|
5
|
+
var remarkGfm = require('remark-gfm');
|
|
6
|
+
var rehypeRaw = require('rehype-raw');
|
|
7
|
+
var rehypeSanitize = require('rehype-sanitize');
|
|
8
|
+
var react = require('react');
|
|
9
|
+
var useReportAnalyticsEvent = require('../hooks/useReportAnalyticsEvent.js');
|
|
10
|
+
|
|
14
11
|
// The Remark and Rehype plugins to use in conjunction with ReactMarkdown.
|
|
15
12
|
const unifiedPlugins = {
|
|
16
13
|
remark: [
|
|
17
|
-
|
|
14
|
+
remarkGfm, //renders Github-Flavored Markdown
|
|
18
15
|
],
|
|
19
16
|
rehype: [
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
rehypeRaw,
|
|
18
|
+
rehypeSanitize, //to sanitize HTML content
|
|
22
19
|
],
|
|
23
20
|
};
|
|
24
21
|
/**
|
|
@@ -31,8 +28,8 @@ const unifiedPlugins = {
|
|
|
31
28
|
* @internal
|
|
32
29
|
*/
|
|
33
30
|
function Markdown({ content, responseId, className }) {
|
|
34
|
-
const reportAnalyticsEvent =
|
|
35
|
-
const components =
|
|
31
|
+
const reportAnalyticsEvent = useReportAnalyticsEvent.useReportAnalyticsEvent();
|
|
32
|
+
const components = react.useMemo(() => {
|
|
36
33
|
const createClickHandlerFn = (href) => () => {
|
|
37
34
|
reportAnalyticsEvent({
|
|
38
35
|
action: "CHAT_LINK_CLICK",
|
|
@@ -44,11 +41,12 @@ function Markdown({ content, responseId, className }) {
|
|
|
44
41
|
};
|
|
45
42
|
return {
|
|
46
43
|
a: ({ node: _, children, ...props }) => {
|
|
47
|
-
return (
|
|
44
|
+
return (jsxRuntime.jsx("a", { ...props, onClick: createClickHandlerFn(props.href), target: "_blank", rel: "noopener noreferrer", className: "cursor-pointer", children: children }));
|
|
48
45
|
},
|
|
49
46
|
};
|
|
50
47
|
}, [reportAnalyticsEvent, responseId]);
|
|
51
|
-
return (
|
|
48
|
+
return (jsxRuntime.jsx(ReactMarkdown, { className: className, children: content, remarkPlugins: unifiedPlugins.remark, rehypePlugins: unifiedPlugins.rehype, components: components }));
|
|
52
49
|
}
|
|
50
|
+
|
|
53
51
|
exports.Markdown = Markdown;
|
|
54
|
-
//# sourceMappingURL=Markdown.js.map
|
|
52
|
+
//# sourceMappingURL=Markdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markdown.js","
|
|
1
|
+
{"version":3,"file":"Markdown.js","sources":["../../../../src/components/Markdown.tsx"],"sourcesContent":["import ReactMarkdown, {\n PluggableList,\n ReactMarkdownOptions,\n} from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport { useMemo } from \"react\";\nimport { useReportAnalyticsEvent } from \"../hooks/useReportAnalyticsEvent\";\n\n// The Remark and Rehype plugins to use in conjunction with ReactMarkdown.\nconst unifiedPlugins: { remark?: PluggableList; rehype: PluggableList } = {\n remark: [\n remarkGfm, //renders Github-Flavored Markdown\n ],\n rehype: [\n rehypeRaw, //to support HTML embedded in markdown\n rehypeSanitize, //to sanitize HTML content\n ],\n};\n\ninterface MarkdownProps {\n /** Stringified markdown. */\n content: string;\n /** The response ID correlates to the current message. */\n responseId?: string;\n /** Classnames for the container. */\n className?: string;\n}\n\n/**\n * Renders Github-Flavored Markdown from the Knowledge Graph. This Markdown can include\n * arbitrary HTML. Any HTML will be sanitized according to Rehype's default Schema.\n *\n * @remarks\n * A link click will send a CHAT_LINK_CLICK analytics event\n *\n * @internal\n */\nexport function Markdown({ content, responseId, className }: MarkdownProps) {\n const reportAnalyticsEvent = useReportAnalyticsEvent();\n\n const components: ReactMarkdownOptions[\"components\"] = useMemo(() => {\n const createClickHandlerFn = (href?: string) => () => {\n reportAnalyticsEvent({\n action: \"CHAT_LINK_CLICK\",\n destinationUrl: href,\n chat: {\n responseId,\n },\n });\n };\n return {\n a: ({ node: _, children, ...props }) => {\n return (\n <a\n {...props}\n onClick={createClickHandlerFn(props.href)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cursor-pointer\"\n >\n {children}\n </a>\n );\n },\n };\n }, [reportAnalyticsEvent, responseId]);\n\n return (\n <ReactMarkdown\n className={className}\n children={content}\n remarkPlugins={unifiedPlugins.remark}\n rehypePlugins={unifiedPlugins.rehype}\n components={components}\n />\n );\n}\n"],"names":["useReportAnalyticsEvent","useMemo","_jsx"],"mappings":";;;;;;;;;;AAUA;AACA,MAAM,cAAc,GAAsD;AACxE,IAAA,MAAM,EAAE;AACN,QAAA,SAAS;AACV,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS;AACT,QAAA,cAAc;AACf,KAAA;CACF,CAAC;AAWF;;;;;;;;AAQG;AACG,SAAU,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAiB,EAAA;AACxE,IAAA,MAAM,oBAAoB,GAAGA,+CAAuB,EAAE,CAAC;AAEvD,IAAA,MAAM,UAAU,GAAuCC,aAAO,CAAC,MAAK;QAClE,MAAM,oBAAoB,GAAG,CAAC,IAAa,KAAK,MAAK;AACnD,YAAA,oBAAoB,CAAC;AACnB,gBAAA,MAAM,EAAE,iBAAiB;AACzB,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,IAAI,EAAE;oBACJ,UAAU;AACX,iBAAA;AACF,aAAA,CAAC,CAAC;AACL,SAAC,CAAC;QACF,OAAO;AACL,YAAA,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,KAAI;AACrC,gBAAA,QACEC,cAAA,CAAA,GAAA,EAAA,EAAA,GACM,KAAK,EACT,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,EACzC,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,gBAAgB,EAEzB,QAAA,EAAA,QAAQ,EACP,CAAA,EACJ;aACH;SACF,CAAC;AACJ,KAAC,EAAE,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC;AAEvC,IAAA,QACEA,cAAA,CAAC,aAAa,EAAA,EACZ,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,OAAO,EACjB,aAAa,EAAE,cAAc,CAAC,MAAM,EACpC,aAAa,EAAE,cAAc,CAAC,MAAM,EACpC,UAAU,EAAE,UAAU,EAAA,CACtB,EACF;AACJ;;;;"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const builtInCssClasses =
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var chatHeadlessReact = require('@yext/chat-headless-react');
|
|
5
|
+
var useComposedCssClasses = require('../hooks/useComposedCssClasses.js');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
var Markdown = require('./Markdown.js');
|
|
8
|
+
var withStylelessCssClasses = require('../utils/withStylelessCssClasses.js');
|
|
9
|
+
var FeedbackButtons = require('./FeedbackButtons.js');
|
|
10
|
+
|
|
11
|
+
const builtInCssClasses = withStylelessCssClasses.withStylelessCssClasses("MessageBubble", {
|
|
12
12
|
topContainer: "w-full animate-fade-in @container",
|
|
13
13
|
subContainer: "flex flex-col @lg:flex-row @lg:items-center @lg:gap-x-2 @lg:m-1",
|
|
14
14
|
subContainer__bot: "",
|
|
@@ -18,7 +18,7 @@ const builtInCssClasses = (0, withStylelessCssClasses_1.withStylelessCssClasses)
|
|
|
18
18
|
bubble__user: "ml-auto @lg:ml-0 bg-gradient-to-tr from-blue-600 to-blue-700 text-white",
|
|
19
19
|
text: "text-[13px] @[480px]:text-base prose overflow-x-auto",
|
|
20
20
|
text__bot: "text-slate-900",
|
|
21
|
-
text__user: "text-white",
|
|
21
|
+
text__user: "text-white break-words",
|
|
22
22
|
timestamp: "w-fit my-0.5 ml-4 @lg:ml-0 text-slate-400 text-[10px] @[480px]:text-[13px] opacity-0 peer-hover:opacity-100 duration-200 whitespace-pre-wrap",
|
|
23
23
|
timestamp__bot: "",
|
|
24
24
|
timestamp__user: "ml-auto",
|
|
@@ -32,22 +32,21 @@ const builtInCssClasses = (0, withStylelessCssClasses_1.withStylelessCssClasses)
|
|
|
32
32
|
* @param props - {@link MessageBubbleProps}
|
|
33
33
|
*/
|
|
34
34
|
function MessageBubble({ message, showFeedbackButtons = true, showTimestamp = true, customCssClasses, formatTimestamp = defaultFormatTimestamp, }) {
|
|
35
|
-
const cssClasses =
|
|
36
|
-
const bubbleCssClasses =
|
|
35
|
+
const cssClasses = useComposedCssClasses.useComposedCssClasses(builtInCssClasses, customCssClasses);
|
|
36
|
+
const bubbleCssClasses = tailwindMerge.twMerge(cssClasses.bubble, message.source === chatHeadlessReact.MessageSource.USER
|
|
37
37
|
? cssClasses.bubble__user
|
|
38
38
|
: cssClasses.bubble__bot);
|
|
39
|
-
const textCssClasses =
|
|
39
|
+
const textCssClasses = tailwindMerge.twMerge(cssClasses.text, message.source === chatHeadlessReact.MessageSource.USER
|
|
40
40
|
? cssClasses.text__user
|
|
41
41
|
: cssClasses.text__bot);
|
|
42
|
-
const subContainerCssClasses =
|
|
42
|
+
const subContainerCssClasses = tailwindMerge.twMerge(cssClasses.subContainer, message.source === chatHeadlessReact.MessageSource.USER
|
|
43
43
|
? cssClasses.subContainer__user
|
|
44
44
|
: cssClasses.subContainer__bot);
|
|
45
|
-
const timestampCssClasses =
|
|
45
|
+
const timestampCssClasses = tailwindMerge.twMerge(cssClasses.timestamp, message.source === chatHeadlessReact.MessageSource.USER
|
|
46
46
|
? cssClasses.timestamp__user
|
|
47
47
|
: cssClasses.timestamp__bot);
|
|
48
|
-
return (
|
|
48
|
+
return (jsxRuntime.jsx("div", { className: cssClasses.topContainer, children: jsxRuntime.jsxs("div", { className: subContainerCssClasses, children: [jsxRuntime.jsxs("div", { className: bubbleCssClasses, children: [showFeedbackButtons && message.source === chatHeadlessReact.MessageSource.BOT && (jsxRuntime.jsx(FeedbackButtons.FeedbackButtons, { customCssClasses: cssClasses.feedbackButtonsCssClasses, responseId: message.responseId })), jsxRuntime.jsx(Markdown.Markdown, { content: message.text, responseId: message.responseId, className: textCssClasses })] }), showTimestamp && (jsxRuntime.jsx("div", { className: timestampCssClasses, children: message.timestamp ? formatTimestamp(message.timestamp) : " " }))] }) }));
|
|
49
49
|
}
|
|
50
|
-
exports.MessageBubble = MessageBubble;
|
|
51
50
|
/**
|
|
52
51
|
* Formats message's timestamp from "2023-05-18T19:33:34.553Z" to "7:33 PM"
|
|
53
52
|
*
|
|
@@ -61,4 +60,6 @@ function defaultFormatTimestamp(timestamp) {
|
|
|
61
60
|
hour12: true,
|
|
62
61
|
});
|
|
63
62
|
}
|
|
64
|
-
|
|
63
|
+
|
|
64
|
+
exports.MessageBubble = MessageBubble;
|
|
65
|
+
//# sourceMappingURL=MessageBubble.js.map
|