@clikvn/agent-widget-embedded 1.1.5-dev-16 → 1.1.5-dev-18
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/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/components/Chat/Simplified/MultimodalInputSimplified.d.ts.map +1 -1
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/components/Chat/Simplified/MultimodalInputSimplified.js +46 -64
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/components/Chat/Simplified/MultimodalInputSimplified.js.map +1 -1
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/constants/toolNames.d.ts +2 -2
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/constants/toolNames.d.ts.map +1 -1
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/constants/toolNames.js +2 -2
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/constants/toolNames.js.map +1 -1
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/utils/toolUtils.js +2 -2
- package/.rollup.cache/Users/tungthai/Desktop/Develop/clik-ai-chatbot-embedded/dist/utils/toolUtils.js.map +1 -1
- package/dist/components/Chat/Simplified/MultimodalInputSimplified.d.ts.map +1 -1
- package/dist/constants/toolNames.d.ts +2 -2
- package/dist/constants/toolNames.d.ts.map +1 -1
- package/dist/index.html +1 -1
- package/dist/web.js +1 -1
- package/dist/web.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultimodalInputSimplified.d.ts","sourceRoot":"","sources":["../../../../src/components/Chat/Simplified/MultimodalInputSimplified.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,EAAE,EAKH,MAAM,OAAO,CAAC;AAMf,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"MultimodalInputSimplified.d.ts","sourceRoot":"","sources":["../../../../src/components/Chat/Simplified/MultimodalInputSimplified.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,EAAE,EAKH,MAAM,OAAO,CAAC;AAMf,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAc3E,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CACZ,KAAK,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,EACvC,KAAK,CAAC,EAAE,WAAW,EAAE,KAClB,IAAI,CAAC;IACV,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAeF,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,SAAS,CAwdnD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { AnimatePresence, motion } from 'framer-motion';
|
|
3
3
|
import { useCallback, useEffect, useRef, useState, } from 'react';
|
|
4
4
|
import { useWindowSize } from 'usehooks-ts';
|
|
@@ -8,15 +8,16 @@ import { useConfiguration } from '../../../hooks/useConfiguration';
|
|
|
8
8
|
import { getAudioTranscript } from '../../../services/chat.service';
|
|
9
9
|
import { cn, generateUUID, sleep } from '../../../utils/commonUtils';
|
|
10
10
|
import { getBestMimeType, getFileExtension } from '../../../utils/fileUtils';
|
|
11
|
-
import {
|
|
11
|
+
import { ArrowUpIcon, ClikAIIcon, ClikChatIcon, ClikMicrophoneIcon, PlusIcon, } from '../Icons';
|
|
12
12
|
import { Button } from '../ui/Button';
|
|
13
|
-
import
|
|
13
|
+
import { VoiceRecordingUI } from '../VoiceRecordingUI';
|
|
14
|
+
import { Textarea } from '../ui/Textarea';
|
|
14
15
|
export const MultimodalInputSimplified = (props) => {
|
|
15
|
-
const { input, setInput,
|
|
16
|
+
const { input, setInput, message, handleSubmit, className, apiHost, setEnableTTS, } = props;
|
|
16
17
|
const { onLoaded, theme = {} } = useConfiguration();
|
|
17
18
|
const { modeButtonChat = false, gapInput = 16 } = theme;
|
|
18
19
|
const { listeners } = useChatData();
|
|
19
|
-
const { isRecording, onRecordingCancelled, onRecordingStopped, onRecordingStarted,
|
|
20
|
+
const { isRecording, onRecordingCancelled, onRecordingStopped, onRecordingStarted, audioData, elapsedTime, updateMaxHistoryLength, } = useAudioRecording();
|
|
20
21
|
const { width } = useWindowSize();
|
|
21
22
|
const language = theme?.language?.options
|
|
22
23
|
?.find((option) => option.code === theme?.language?.code)
|
|
@@ -124,6 +125,7 @@ export const MultimodalInputSimplified = (props) => {
|
|
|
124
125
|
}
|
|
125
126
|
}, [onRecordingStarted, handleSetInput, listeners]);
|
|
126
127
|
const handleCancelRecording = () => {
|
|
128
|
+
handleOnClick('CancelRecording');
|
|
127
129
|
onRecordingCancelled();
|
|
128
130
|
handleSetInput('');
|
|
129
131
|
if (listeners?.['ON_CANCEL_RECORDING']) {
|
|
@@ -190,6 +192,9 @@ export const MultimodalInputSimplified = (props) => {
|
|
|
190
192
|
}
|
|
191
193
|
}
|
|
192
194
|
}, [message, submitting, listeners]);
|
|
195
|
+
const handleWidthChange = useCallback((maxBars) => {
|
|
196
|
+
updateMaxHistoryLength(maxBars);
|
|
197
|
+
}, [updateMaxHistoryLength]);
|
|
193
198
|
const recordingPlaceholder = isRecording && !transcribing
|
|
194
199
|
? theme?.input?.recordingPlaceholder || 'Recording...'
|
|
195
200
|
: '';
|
|
@@ -210,7 +215,7 @@ export const MultimodalInputSimplified = (props) => {
|
|
|
210
215
|
borderRadius: '28px',
|
|
211
216
|
},
|
|
212
217
|
expanded: {
|
|
213
|
-
width: width ? `${width - gapInput}px` : '
|
|
218
|
+
width: width ? `${width - gapInput}px` : '100%',
|
|
214
219
|
height: 'auto',
|
|
215
220
|
opacity: 1,
|
|
216
221
|
borderRadius: '16px',
|
|
@@ -232,70 +237,47 @@ export const MultimodalInputSimplified = (props) => {
|
|
|
232
237
|
!processing &&
|
|
233
238
|
!submitting &&
|
|
234
239
|
!transcribing;
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
centerWidthOffset = 80; // left: 24px, right: 40px, gap: 8px x 2, padding: 12px
|
|
239
|
-
}
|
|
240
|
-
if (showToggleChatIcon) {
|
|
241
|
-
centerWidthOffset = 108; // left: 24px, right: 68px, gap: 8px x 2, padding: 12px
|
|
242
|
-
}
|
|
243
|
-
return (_jsxs("div", { className: "flex justify-end", children: [showButtonAI && (_jsx("div", { className: cn('absolute z-20 transition-all duration-300 top-1 right-1'), children: _jsx(Button, { className: cn('rounded-full bg-[#fff] hover:bg-[#fff] text-white border-none shadow-lg w-[40px] h-[40px] p-0 flex items-center justify-center', expanded && 'bg-[#595959] hover:bg-[#595959] text-white'), onClick: handleToggleExpand, children: expanded ? (_jsx(ClikChatIcon, { size: 24, style: { width: '24px', height: '24px' } })) : (_jsx(ClikAIIcon, { size: 24, style: { width: '24px', height: '24px' } })) }) })), _jsxs(motion.div, { variants: containerVariants, initial: "collapsed", animate: expanded ? 'expanded' : 'collapsed', transition: { duration: 0.3, ease: 'easeInOut' }, className: cn('relative flex gap-4 bg-[#ffffff] py-[8px] px-[12px] scrollbar-hidden border border-[#E5E5E5] shadow-[0px_2px_6px_0px_rgba(0,0,0,0.08)] backdrop-blur-[50px]', className, {
|
|
244
|
-
'flex-col min-h-[48px]': !canShowAudioPlayer && expanded,
|
|
245
|
-
'flex-row min-h-[48px]': canShowAudioPlayer && expanded,
|
|
240
|
+
return (_jsxs("div", { className: "flex justify-end", children: [showButtonAI && (_jsx("div", { className: cn('absolute z-20 transition-all duration-300 top-1 right-1'), children: _jsx(Button, { className: cn('rounded-full bg-[#fff] hover:bg-[#fff] text-white border-none shadow-lg w-[32px] h-[32px] p-0 flex items-center justify-center', expanded && 'bg-[#595959] hover:bg-[#595959] text-white'), onClick: handleToggleExpand, children: expanded ? (_jsx(ClikChatIcon, { size: 20, style: { width: '20px', height: '20px' } })) : (_jsx(ClikAIIcon, { size: 20, style: { width: '20px', height: '20px' } })) }) })), _jsx(motion.div, { variants: containerVariants, initial: "collapsed", animate: expanded ? 'expanded' : 'collapsed', transition: { duration: 0.3, ease: 'easeInOut' }, className: cn('relative flex gap-4 scrollbar-hidden ', className, {
|
|
241
|
+
'flex-col min-h-[40px]': !canShowAudioPlayer && expanded,
|
|
242
|
+
'flex-row min-h-[40px]': canShowAudioPlayer && expanded,
|
|
246
243
|
'items-center justify-center': !expanded,
|
|
247
|
-
}), children:
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
? { width: '40px', height: '40px', padding: '4px' }
|
|
278
|
-
: undefined, children: [(transcribing || submitting) && (_jsx("div", { className: "absolute rounded-full left-0 top-0 w-[40px] h-[40px] animate-spin z-[1]", style: {
|
|
279
|
-
background: 'conic-gradient(from 180deg at 50% 50%, #1E6EB4 0deg, rgba(30, 110, 180, 0) 360deg)',
|
|
280
|
-
} })), (!isRecording || transcribing) && (_jsxs(Button, { className: "relative rounded-full z-[2] w-[32px] h-[32px] m-0 text-[#18181B] disabled:opacity-100", onClick: (event) => {
|
|
281
|
-
event.preventDefault();
|
|
282
|
-
handleOnClick('StartRecording');
|
|
283
|
-
handleStartRecording();
|
|
284
|
-
}, variant: "outline", size: "icon", disabled: loadingChat || isRecording || submitting, children: [!submitting && _jsx(ClikMicrophoneIcon, { size: 20 }), submitting && _jsx(ArrowUpIcon, { size: 20 })] }))] })), !input?.length && isRecording && !isLoadingRecording && (_jsx(Button, { className: "rounded-full dark:border-zinc-700 p-0 w-[32px] h-[32px] border-none flex-shrink-0", variant: "outline", onClick: (event) => {
|
|
285
|
-
event.preventDefault();
|
|
286
|
-
handleOnClick('FinishRecording');
|
|
287
|
-
handleFinishRecording();
|
|
288
|
-
}, children: _jsx(CheckCirclFillIcon, { className: "!w-full !h-full" }) })), !!input?.length && (_jsxs("div", { className: "relative flex gap-[4px]", children: [_jsx(Button, { className: "rounded-full z-[2] p-1.5 w-[32px] h-[32px] m-0 px-2 py-1 text-[#18181B]", onClick: (event) => {
|
|
244
|
+
}), children: _jsx(AnimatePresence, { children: expanded && (_jsx(motion.div, { variants: contentVariants, initial: "collapsed", animate: "expanded", exit: "collapsed", transition: { duration: 0.2, delay: 0 }, onAnimationComplete: () => setAnimationCompleted(true), className: `w-full `, children: !canShowAudioPlayer && (_jsx(_Fragment, { children: _jsxs("div", { className: " w-full flex gap-4 justify-end items-end", children: [isRecording ? (_jsx(Button, { className: ` rounded-full w-[40px] h-[40px] flex items-center justify-center bg-white hover:bg-white`, onClick: (event) => {
|
|
245
|
+
event.preventDefault();
|
|
246
|
+
handleFinishRecording();
|
|
247
|
+
}, children: _jsx("div", { className: "w-[12px] h-[12px] bg-muted-foreground rounded-full" }) })) : (_jsx(Button, { className: ` rounded-full w-[40px] h-[40px] flex items-center justify-center bg-white hover:bg-white`, onClick: (event) => {
|
|
248
|
+
event.preventDefault();
|
|
249
|
+
handleOnClick('AddFile');
|
|
250
|
+
}, children: _jsx(PlusIcon, { size: 20, color: '#71717A' }) })), _jsxs("div", { className: "block flex-1 min-w-0 min-h-[40px] relative bg-white rounded-[24px] border border-[#E5E5E5] shadow-[0px_2px_6px_0px_rgba(0,0,0,0.08)] backdrop-blur-[50px]", children: [_jsx(AnimatePresence, { mode: "wait", children: _jsx(_Fragment, { children: _jsx(motion.div, { initial: { opacity: 0, height: 40 }, animate: { opacity: 1, height: 'auto' }, exit: { opacity: 0, height: 40 }, transition: {
|
|
251
|
+
duration: 0.2,
|
|
252
|
+
ease: 'easeInOut',
|
|
253
|
+
}, style: {
|
|
254
|
+
display: input.length || transcribing
|
|
255
|
+
? 'block'
|
|
256
|
+
: 'none',
|
|
257
|
+
}, children: _jsx(Textarea, { readOnly: readonly, ref: textareaRef, placeholder: transcribing
|
|
258
|
+
? transcribingPlaceholder
|
|
259
|
+
: 'Nhập tin nhắn của bạn...', value: input, onChange: handleInput, className: cn(`min-h-[24px] max-h-[120px] resize-none text-base bg-muted bg-[#ffffff] scrollbar-hidden p-[12px] pb-[32px] rounded-[24px] border border-[#E5E5E5] shadow-[0px_2px_6px_0px_rgba(0,0,0,0.08)] backdrop-blur-[50px] `, className), style: {
|
|
260
|
+
height: 60,
|
|
261
|
+
}, autoFocus: true, onKeyDown: (event) => {
|
|
262
|
+
if (event.key === 'Enter' &&
|
|
263
|
+
!event.shiftKey) {
|
|
264
|
+
event.preventDefault();
|
|
265
|
+
handleOnClick('Submit');
|
|
266
|
+
handleSend();
|
|
267
|
+
}
|
|
268
|
+
} }) }, "textarea") }) }), !isRecording &&
|
|
269
|
+
!input?.length &&
|
|
270
|
+
!transcribing &&
|
|
271
|
+
animationCompleted && (_jsx("div", { className: "p-[10px] text-[14px] text-muted-foreground cursor-pointer w-full text-ellipsis overflow-hidden whitespace-nowrap", onClick: handleOnClickOpenChatmode, children: welcomeMessage })), _jsx("div", { className: "w-full ", children: _jsx(VoiceRecordingUI, { isRecording: isRecording, elapsedTime: elapsedTime, onCancel: handleCancelRecording, transcribing: transcribing, audioData: audioData, label: transcribing
|
|
272
|
+
? transcribingPlaceholder
|
|
273
|
+
: recordingPlaceholder, onWidthChange: handleWidthChange }) }), _jsxs("div", { className: "button-voice right-[4px] absolute bottom-[4px] flex gap-[12px]", children: [!isRecording && (_jsx(Button, { className: "rounded-full z-[2] p-1.5 h-[32px] w-[32px] m-0 bg-transparent", onClick: (event) => {
|
|
289
274
|
event.preventDefault();
|
|
290
275
|
handleOnClick('StartRecording');
|
|
291
276
|
handleStartRecording();
|
|
292
|
-
},
|
|
277
|
+
}, children: _jsx(ClikMicrophoneIcon, { size: 20 }) })), _jsx(Button, { className: "rounded-full z-[2] p-1.5 h-[32px] w-[32px] m-0 border bg-[#71717A]", onClick: (event) => {
|
|
293
278
|
event.preventDefault();
|
|
294
279
|
handleOnClick('Submit');
|
|
295
280
|
handleSend();
|
|
296
|
-
}, disabled: isRecording ||
|
|
297
|
-
setShowAudioPlayer(false);
|
|
298
|
-
onAudioEnded();
|
|
299
|
-
} }) }))] })] }));
|
|
281
|
+
}, disabled: isRecording || input.length === 0, children: _jsx(ArrowUpIcon, { size: 20 }) })] })] })] }) })) })) }) })] }));
|
|
300
282
|
};
|
|
301
283
|
//# sourceMappingURL=MultimodalInputSimplified.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultimodalInputSimplified.js","sourceRoot":"","sources":["../../../../src/components/Chat/Simplified/MultimodalInputSimplified.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AnimatePresence, motion } from 'framer-motion';\nimport {\n type ChangeEvent,\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useWindowSize } from 'usehooks-ts';\nimport { useAudioRecording } from '../../../hooks/useAudioRecording';\nimport { useChatData } from '../../../hooks/useChatData';\nimport { useConfiguration } from '../../../hooks/useConfiguration';\nimport { getAudioTranscript } from '../../../services/chat.service';\nimport { BotType } from '../../../types/bot.type';\nimport { ChatMessageType, IFileUpload } from '../../../types/flowise.type';\nimport { cn, generateUUID, sleep } from '../../../utils/commonUtils';\nimport { getBestMimeType, getFileExtension } from '../../../utils/fileUtils';\nimport {\n AnimatedRecordingIcon,\n ArrowUpIcon,\n CheckCirclFillIcon,\n ClikAIIcon,\n ClikChatIcon,\n ClikCloseIcon,\n ClikMicrophoneIcon,\n} from '../Icons';\nimport { Button } from '../ui/Button';\nimport AudioPlayerSimplified from './AudioPlayerSimplified';\n\ntype PropsType = {\n input: string;\n setInput: (value: string) => void;\n loadingChat: boolean;\n message: ChatMessageType | null;\n chatId: string;\n handleSubmit: (\n event?: { preventDefault?: () => void },\n files?: IFileUpload[]\n ) => void;\n className?: string;\n bot: BotType | null;\n apiHost: string;\n setEnableTTS: (value: boolean) => void;\n enableTTS: boolean;\n onAudioEnded: () => void;\n};\n\ntype ClickType =\n | 'ChangeLanguage'\n | 'WelcomeMsg'\n | 'StartRecording'\n | 'CancelRecording'\n | 'FinishRecording'\n | 'PauseAudio'\n | 'PlayAudio'\n | 'CloseAudio'\n | 'Submit'\n | 'ClickButtonAI';\n\nexport const MultimodalInputSimplified: FC<PropsType> = (props) => {\n const {\n input,\n setInput,\n loadingChat,\n message,\n chatId,\n handleSubmit,\n className,\n bot,\n apiHost,\n setEnableTTS,\n onAudioEnded,\n } = props;\n const { onLoaded, theme = {} } = useConfiguration();\n const { modeButtonChat = false, gapInput = 16 } = theme;\n const { listeners } = useChatData();\n const {\n isRecording,\n onRecordingCancelled,\n onRecordingStopped,\n onRecordingStarted,\n isLoadingRecording,\n audioData,\n } = useAudioRecording();\n const { width } = useWindowSize();\n\n const language =\n theme?.language?.options\n ?.find((option) => option.code === theme?.language?.code)\n ?.name?.toUpperCase() || 'EN';\n\n const [transcribing, setTranscribing] = useState<boolean>(false);\n const [showAudioPlayer, setShowAudioPlayer] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [expanded, setExpanded] = useState(!modeButtonChat);\n const [animationCompleted, setAnimationCompleted] = useState(false);\n\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const setInputRef = useRef<((input: string) => void) | null>(null);\n\n const welcomeMessage =\n theme.welcomeMessage || \"Hi, I'm your showroom assistant\";\n const adjustHeight = () => {\n if (textareaRef.current) {\n (textareaRef.current as HTMLTextAreaElement).style.height = '24px';\n (textareaRef.current as HTMLTextAreaElement).style.height =\n `${textareaRef.current?.scrollHeight}px`;\n }\n };\n\n const readonly = isRecording || transcribing;\n const handleSetInput = useCallback(\n (value: string) => {\n setInput(value);\n },\n [setInput]\n );\n\n const handleInput = (event: ChangeEvent<HTMLTextAreaElement>) => {\n handleSetInput(event.target.value);\n\n if (textareaRef.current) {\n textareaRef.current.scrollTop = textareaRef.current.scrollHeight;\n }\n };\n\n const submitForm = useCallback(async () => {\n setSubmitting(true);\n if (listeners?.['ON_SUBMIT_MESSAGE']) {\n listeners['ON_SUBMIT_MESSAGE']();\n }\n handleSubmit(undefined);\n await sleep(500);\n setShowAudioPlayer(true);\n }, [handleSubmit, listeners]);\n\n const toAudioBase64 = (blob: Blob) => {\n return new Promise<IFileUpload>((resolve) => {\n let mimeType = getBestMimeType();\n const pos = blob.type.indexOf(';');\n if (pos === -1) {\n mimeType = blob.type;\n } else {\n mimeType = blob.type.substring(0, pos);\n }\n\n // read blob and add to previews\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n reader.onloadend = () => {\n const base64data = reader.result as string;\n const upload: IFileUpload = {\n tempId: generateUUID(),\n data: base64data,\n type: 'audio',\n name: `audio_${Date.now()}.${getFileExtension(mimeType)}`,\n mime: mimeType,\n };\n resolve(upload);\n };\n });\n };\n\n const speechToText = async (blob: Blob) => {\n try {\n setTranscribing(true);\n const fileUpload = await toAudioBase64(blob);\n const base64Data = fileUpload.data!.replace(/^data:.+;base64,/, '');\n const byteCharacters = atob(base64Data); // Decode Base64 string\n const byteNumbers = new Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n const file = new File([byteArray], fileUpload.name, {\n lastModified: new Date().getTime(),\n type: fileUpload.type,\n });\n\n const text = await getAudioTranscript({ file, apiHost, language });\n if (text) {\n handleSetInput(text);\n }\n } catch (error) {\n console.error('Error getting audio transcript!', error);\n } finally {\n setTranscribing(false);\n }\n };\n\n const handleFinishRecording = () => {\n if (isRecording) {\n onRecordingStopped(speechToText);\n }\n if (listeners?.['ON_FINISHED_RECORDING']) {\n listeners['ON_FINISHED_RECORDING']();\n }\n };\n\n const handleStartRecording = useCallback(() => {\n onRecordingStarted();\n handleSetInput('');\n if (listeners?.['ON_START_RECORDING']) {\n listeners['ON_START_RECORDING']();\n }\n }, [onRecordingStarted, handleSetInput, listeners]);\n\n const handleCancelRecording = () => {\n onRecordingCancelled();\n handleSetInput('');\n if (listeners?.['ON_CANCEL_RECORDING']) {\n listeners['ON_CANCEL_RECORDING']();\n }\n };\n\n const handleSend = useCallback(async () => {\n if (!isRecording) {\n submitForm();\n }\n }, [submitForm, isRecording]);\n\n const handleOnClickOpenChatmode = () => {\n handleOnClick('WelcomeMsg');\n };\n\n const handleOnClick = (type?: ClickType) => {\n if (listeners?.['ON_CLICK']) {\n listeners['ON_CLICK'](type);\n }\n };\n\n const handleToggleExpand = () => {\n handleOnClick('ClickButtonAI');\n setExpanded(!expanded);\n setAnimationCompleted(false);\n if (!expanded) {\n // Focus vào textarea khi expand\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.focus();\n }\n }, 300);\n }\n };\n\n useEffect(() => {\n adjustHeight();\n }, [input, readonly]);\n\n useEffect(() => {\n setInputRef.current = setInput;\n }, [setInput]);\n\n useEffect(() => {\n if (onLoaded) {\n onLoaded({\n setInput: (txt): void => {\n if (setInputRef.current) {\n setInputRef.current(txt || '');\n }\n },\n startRecording: async () => {\n handleStartRecording();\n },\n });\n }\n }, []);\n\n useEffect(() => {\n setEnableTTS(true);\n return () => {\n setEnableTTS(false);\n };\n }, [setEnableTTS]);\n\n useEffect(() => {\n if (message && submitting) {\n setSubmitting(false);\n if (listeners?.['ON_FINISHED_SUBMITTING_MESSAGE']) {\n listeners['ON_FINISHED_SUBMITTING_MESSAGE']();\n }\n }\n }, [message, submitting, listeners]);\n\n const recordingPlaceholder =\n isRecording && !transcribing\n ? theme?.input?.recordingPlaceholder || 'Recording...'\n : '';\n\n const transcribingPlaceholder = transcribing\n ? theme?.input?.transcribingPlaceholder || 'Transcribing...'\n : '';\n\n const processing = isRecording || transcribing;\n const canShowAudioPlayer =\n !theme?.noAutoplayMessage &&\n showAudioPlayer &&\n message?.new &&\n message?.tts;\n\n // Animation variants\n const containerVariants = {\n collapsed: {\n width: '0px',\n height: '0px',\n opacity: 0,\n borderRadius: '28px',\n },\n expanded: {\n width: width ? `${width - gapInput}px` : '400px',\n height: 'auto',\n opacity: 1,\n borderRadius: '16px',\n },\n };\n\n const contentVariants = {\n collapsed: {\n opacity: 0,\n scale: 0.8,\n },\n expanded: {\n opacity: 1,\n scale: 1,\n },\n };\n\n const showButtonAI =\n !isRecording &&\n modeButtonChat &&\n !input?.length &&\n !processing &&\n !submitting &&\n !transcribing;\n\n const showToggleChatIcon = showButtonAI && expanded;\n let centerWidthOffset = 72; // left: 24px, right: 32px, gap: 8px x 2, padding: 12px\n if (transcribing || submitting) {\n centerWidthOffset = 80; // left: 24px, right: 40px, gap: 8px x 2, padding: 12px\n }\n if (showToggleChatIcon) {\n centerWidthOffset = 108; // left: 24px, right: 68px, gap: 8px x 2, padding: 12px\n }\n\n return (\n <div className=\"flex justify-end\">\n {showButtonAI && (\n <div\n className={cn(\n 'absolute z-20 transition-all duration-300 top-1 right-1'\n )}\n >\n <Button\n className={cn(\n 'rounded-full bg-[#fff] hover:bg-[#fff] text-white border-none shadow-lg w-[40px] h-[40px] p-0 flex items-center justify-center',\n expanded && 'bg-[#595959] hover:bg-[#595959] text-white'\n )}\n onClick={handleToggleExpand}\n >\n {expanded ? (\n <ClikChatIcon\n size={24}\n style={{ width: '24px', height: '24px' }}\n />\n ) : (\n <ClikAIIcon size={24} style={{ width: '24px', height: '24px' }} />\n )}\n </Button>\n </div>\n )}\n <motion.div\n variants={containerVariants}\n initial=\"collapsed\"\n animate={expanded ? 'expanded' : 'collapsed'}\n transition={{ duration: 0.3, ease: 'easeInOut' }}\n className={cn(\n 'relative flex gap-4 bg-[#ffffff] py-[8px] px-[12px] scrollbar-hidden border border-[#E5E5E5] shadow-[0px_2px_6px_0px_rgba(0,0,0,0.08)] backdrop-blur-[50px]',\n className,\n {\n 'flex-col min-h-[48px]': !canShowAudioPlayer && expanded,\n 'flex-row min-h-[48px]': canShowAudioPlayer && expanded,\n 'items-center justify-center': !expanded,\n }\n )}\n >\n <AnimatePresence>\n {expanded && (\n <motion.div\n variants={contentVariants}\n initial=\"collapsed\"\n animate=\"expanded\"\n exit=\"collapsed\"\n transition={{ duration: 0.2, delay: 0 }}\n onAnimationComplete={() => setAnimationCompleted(true)}\n className={`w-full ${showButtonAI ? 'pr-9' : ''}`}\n >\n {!canShowAudioPlayer && (\n <>\n {!processing && !!input?.length && (\n <textarea\n readOnly={readonly}\n ref={textareaRef}\n value={input}\n onChange={handleInput}\n placeholder=\"Nhập tin nhắn của bạn...\"\n className={cn(\n `resize-none text-base bg-muted bg-[#ffffff] scrollbar-hidden ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 w-full mb-3`\n )}\n style={{\n fontSize: '16px',\n }}\n onKeyDown={(event) => {\n if (isRecording) {\n return;\n }\n\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (loadingChat) {\n console.error(\n 'Please wait for the model to finish its response!'\n );\n } else {\n handleSend();\n }\n }\n }}\n />\n )}\n {processing && (\n <div\n className={cn(\n `placeholder:text-muted-foreground focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 resize-none text-base scrollbar-hidden mb-3`,\n className\n )}\n style={{\n fontSize: '16px',\n }}\n >\n <div className=\"animate-pulse\">\n {recordingPlaceholder}\n {transcribingPlaceholder}\n </div>\n </div>\n )}\n <div className=\"flex flex-row gap-[8px] items-center justify-between\">\n <div className=\"w-[24px] h-[24px]\">\n {!isRecording && (\n <button\n className=\"w-[24px] h-[24px] opacity-100\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleOnClick('ChangeLanguage');\n }}\n aria-label=\"Change language\"\n >\n <span className=\"text-[#595959] text-center text-[12px] border-[1px] font-bold rounded-[4px] border-[#595959] px-[2px]\">\n {language}\n </span>\n </button>\n )}\n {isRecording && (\n <Button\n disabled={isLoadingRecording}\n className=\"rounded-full dark:border-zinc-700 h-[24px] w-[24px] px-0 py-0\"\n variant=\"outline\"\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('CancelRecording');\n handleCancelRecording();\n }}\n >\n <ClikCloseIcon className=\"!w-full !h-full\" />\n </Button>\n )}\n </div>\n <div\n className=\"min-h-[24px] flex items-center justify-center text-ellipsis overflow-hidden whitespace-nowrap\"\n style={{ width: `calc(100% - ${centerWidthOffset}px)` }}\n >\n {!isRecording &&\n !input?.length &&\n !loadingChat &&\n !transcribing &&\n animationCompleted && (\n <div\n className=\"text-center text-[14px] text-muted-foreground cursor-pointer w-full text-ellipsis overflow-hidden whitespace-nowrap\"\n onClick={handleOnClickOpenChatmode}\n >\n {welcomeMessage}\n </div>\n )}\n {isRecording && (\n <AnimatedRecordingIcon\n frequencies={audioData?.frequencies}\n isActive={true}\n />\n )}\n </div>\n {!input?.length && (\n <div\n className=\"relative\"\n style={\n transcribing || submitting\n ? { width: '40px', height: '40px', padding: '4px' }\n : undefined\n }\n >\n {(transcribing || submitting) && (\n <div\n className=\"absolute rounded-full left-0 top-0 w-[40px] h-[40px] animate-spin z-[1]\"\n style={{\n background:\n 'conic-gradient(from 180deg at 50% 50%, #1E6EB4 0deg, rgba(30, 110, 180, 0) 360deg)',\n }}\n ></div>\n )}\n {(!isRecording || transcribing) && (\n <Button\n className=\"relative rounded-full z-[2] w-[32px] h-[32px] m-0 text-[#18181B] disabled:opacity-100\"\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('StartRecording');\n handleStartRecording();\n }}\n variant=\"outline\"\n size=\"icon\"\n disabled={loadingChat || isRecording || submitting}\n >\n {!submitting && <ClikMicrophoneIcon size={20} />}\n {submitting && <ArrowUpIcon size={20} />}\n </Button>\n )}\n </div>\n )}\n\n {!input?.length && isRecording && !isLoadingRecording && (\n <Button\n className=\"rounded-full dark:border-zinc-700 p-0 w-[32px] h-[32px] border-none flex-shrink-0\"\n variant=\"outline\"\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('FinishRecording');\n handleFinishRecording();\n }}\n >\n <CheckCirclFillIcon className=\"!w-full !h-full\" />\n </Button>\n )}\n\n {!!input?.length && (\n <div className=\"relative flex gap-[4px]\">\n <Button\n className=\"rounded-full z-[2] p-1.5 w-[32px] h-[32px] m-0 px-2 py-1 text-[#18181B]\"\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('StartRecording');\n handleStartRecording();\n }}\n variant=\"outline\"\n disabled={loadingChat}\n >\n <ClikMicrophoneIcon size={16} />\n </Button>\n <Button\n className=\"rounded-full z-[2] p-1.5 w-[32px] h-[32px] m-0 bg-zinc-900 hover:bg-zinc-900 px-2 py-1 text-[#FFF]\"\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('Submit');\n handleSend();\n }}\n disabled={\n isRecording || !input?.length || loadingChat\n }\n >\n <ArrowUpIcon size={16} />\n </Button>\n </div>\n )}\n </div>\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Audio Player */}\n {canShowAudioPlayer && expanded && (\n <motion.div\n variants={contentVariants}\n initial=\"collapsed\"\n animate=\"expanded\"\n exit=\"collapsed\"\n transition={{ duration: 0.2, delay: 0 }}\n className=\"w-full\"\n >\n <AudioPlayerSimplified\n message={message}\n chatId={chatId}\n autoplay\n onClose={() => {\n setShowAudioPlayer(false);\n onAudioEnded();\n }}\n />\n </motion.div>\n )}\n </motion.div>\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"MultimodalInputSimplified.js","sourceRoot":"","sources":["../../../../src/components/Chat/Simplified/MultimodalInputSimplified.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAGL,WAAW,EACX,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,QAAQ,GACT,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiC1C,MAAM,CAAC,MAAM,yBAAyB,GAAkB,CAAC,KAAK,EAAE,EAAE;IAChE,MAAM,EACJ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,SAAS,EACT,OAAO,EACP,YAAY,GACb,GAAG,KAAK,CAAC;IACV,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACpD,MAAM,EAAE,cAAc,GAAG,KAAK,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;IACxD,MAAM,EAAE,SAAS,EAAE,GAAG,WAAW,EAAE,CAAC;IACpC,MAAM,EACJ,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,sBAAsB,GACvB,GAAG,iBAAiB,EAAE,CAAC;IACxB,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;IAElC,MAAM,QAAQ,GACZ,KAAK,EAAE,QAAQ,EAAE,OAAO;QACtB,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;QACzD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC;IAElC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACjE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,MAAM,CAA6B,IAAI,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,MAAM,CAAmC,IAAI,CAAC,CAAC;IAEnE,MAAM,cAAc,GAClB,KAAK,CAAC,cAAc,IAAI,iCAAiC,CAAC;IAC5D,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACvB,WAAW,CAAC,OAA+B,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAClE,WAAW,CAAC,OAA+B,CAAC,KAAK,CAAC,MAAM;gBACvD,GAAG,WAAW,CAAC,OAAO,EAAE,YAAY,IAAI,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,IAAI,YAAY,CAAC;IAC7C,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAAa,EAAE,EAAE;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAuC,EAAE,EAAE;QAC9D,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,WAAW,CAAC,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC;QACnE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,SAAS,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACrC,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnC,CAAC;QACD,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9B,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,EAAE;QACnC,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;YAC1C,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,CAAC;YAED,gCAAgC;YAChC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE;gBACtB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAgB,CAAC;gBAC3C,MAAM,MAAM,GAAgB;oBAC1B,MAAM,EAAE,YAAY,EAAE;oBACtB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;oBACzD,IAAI,EAAE,QAAQ;iBACf,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,IAAU,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACpE,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB;YAChE,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAErD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,WAAW,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE;gBAClD,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;gBAClC,IAAI,EAAE,UAAU,CAAC,IAAI;aACtB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnE,IAAI,IAAI,EAAE,CAAC;gBACT,cAAc,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,IAAI,WAAW,EAAE,CAAC;YAChB,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,SAAS,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACzC,SAAS,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,kBAAkB,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,SAAS,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACpC,CAAC;IACH,CAAC,EAAE,CAAC,kBAAkB,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAEpD,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACjC,oBAAoB,EAAE,CAAC;QACvB,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,SAAS,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvC,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAE9B,MAAM,yBAAyB,GAAG,GAAG,EAAE;QACrC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,IAAgB,EAAE,EAAE;QACzC,IAAI,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvB,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,gCAAgC;YAChC,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACxB,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9B,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtB,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IACjC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC;gBACP,QAAQ,EAAE,CAAC,GAAG,EAAQ,EAAE;oBACtB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACxB,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;gBACD,cAAc,EAAE,KAAK,IAAI,EAAE;oBACzB,oBAAoB,EAAE,CAAC;gBACzB,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;YAC1B,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,SAAS,EAAE,CAAC,gCAAgC,CAAC,EAAE,CAAC;gBAClD,SAAS,CAAC,gCAAgC,CAAC,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAErC,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,OAAe,EAAE,EAAE;QAClB,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,EACD,CAAC,sBAAsB,CAAC,CACzB,CAAC;IAEF,MAAM,oBAAoB,GACxB,WAAW,IAAI,CAAC,YAAY;QAC1B,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,oBAAoB,IAAI,cAAc;QACtD,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,uBAAuB,GAAG,YAAY;QAC1C,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,uBAAuB,IAAI,iBAAiB;QAC5D,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,IAAI,YAAY,CAAC;IAC/C,MAAM,kBAAkB,GACtB,CAAC,KAAK,EAAE,iBAAiB;QACzB,eAAe;QACf,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,GAAG,CAAC;IAEf,qBAAqB;IACrB,MAAM,iBAAiB,GAAG;QACxB,SAAS,EAAE;YACT,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,CAAC;YACV,YAAY,EAAE,MAAM;SACrB;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,CAAC;YACV,YAAY,EAAE,MAAM;SACrB;KACF,CAAC;IAEF,MAAM,eAAe,GAAG;QACtB,SAAS,EAAE;YACT,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,GAAG;SACX;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;SACT;KACF,CAAC;IAEF,MAAM,YAAY,GAChB,CAAC,WAAW;QACZ,cAAc;QACd,CAAC,KAAK,EAAE,MAAM;QACd,CAAC,UAAU;QACX,CAAC,UAAU;QACX,CAAC,YAAY,CAAC;IAEhB,OAAO,CACL,eAAK,SAAS,EAAC,kBAAkB,aAC9B,YAAY,IAAI,CACf,cACE,SAAS,EAAE,EAAE,CACX,yDAAyD,CAC1D,YAED,KAAC,MAAM,IACL,SAAS,EAAE,EAAE,CACX,gIAAgI,EAChI,QAAQ,IAAI,4CAA4C,CACzD,EACD,OAAO,EAAE,kBAAkB,YAE1B,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,YAAY,IACX,IAAI,EAAE,EAAE,EACR,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GACxC,CACH,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,CACnE,GACM,GACL,CACP,EACD,KAAC,MAAM,CAAC,GAAG,IACT,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAC5C,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAChD,SAAS,EAAE,EAAE,CAAC,yCAAyC,EAAE,SAAS,EAAE;oBAClE,uBAAuB,EAAE,CAAC,kBAAkB,IAAI,QAAQ;oBACxD,uBAAuB,EAAE,kBAAkB,IAAI,QAAQ;oBACvD,6BAA6B,EAAE,CAAC,QAAQ;iBACzC,CAAC,YAEF,KAAC,eAAe,cACb,QAAQ,IAAI,CACX,KAAC,MAAM,CAAC,GAAG,IACT,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAC,WAAW,EACnB,OAAO,EAAC,UAAU,EAClB,IAAI,EAAC,WAAW,EAChB,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EACvC,mBAAmB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EACtD,SAAS,EAAE,UAAU,YAEpB,CAAC,kBAAkB,IAAI,CACtB,4BACE,eAAK,SAAS,EAAC,0CAA0C,aACtD,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,MAAM,IACL,SAAS,EAAE,2FAA2F,EACtG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4CACjB,KAAK,CAAC,cAAc,EAAE,CAAC;4CACvB,qBAAqB,EAAE,CAAC;wCAC1B,CAAC,YAED,cAAK,SAAS,EAAC,oDAAoD,GAAO,GACnE,CACV,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IACL,SAAS,EAAE,0FAA0F,EACrG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4CACjB,KAAK,CAAC,cAAc,EAAE,CAAC;4CACvB,aAAa,CAAC,SAAS,CAAC,CAAC;wCAC3B,CAAC,YAED,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,GAAI,GACjC,CACV,EACD,eAAK,SAAS,EAAC,2JAA2J,aAExK,KAAC,eAAe,IAAC,IAAI,EAAC,MAAM,YAExB,4BACE,KAAC,MAAM,CAAC,GAAG,IAET,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EACnC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EACvC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAChC,UAAU,EAAE;4DACV,QAAQ,EAAE,GAAG;4DACb,IAAI,EAAE,WAAW;yDAClB,EACD,KAAK,EAAE;4DACL,OAAO,EACL,KAAK,CAAC,MAAM,IAAI,YAAY;gEAC1B,CAAC,CAAC,OAAO;gEACT,CAAC,CAAC,MAAM;yDACb,YAED,KAAC,QAAQ,IACP,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,WAAW,EAChB,WAAW,EACT,YAAY;gEACV,CAAC,CAAC,uBAAuB;gEACzB,CAAC,CAAC,0BAA0B,EAEhC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,EAAE,CACX,oNAAoN,EACpN,SAAS,CACV,EACD,KAAK,EAAE;gEACL,MAAM,EAAE,EAAE;6DACX,EACD,SAAS,QACT,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gEACnB,IACE,KAAK,CAAC,GAAG,KAAK,OAAO;oEACrB,CAAC,KAAK,CAAC,QAAQ,EACf,CAAC;oEACD,KAAK,CAAC,cAAc,EAAE,CAAC;oEACvB,aAAa,CAAC,QAAQ,CAAC,CAAC;oEACxB,UAAU,EAAE,CAAC;gEACf,CAAC;4DACH,CAAC,GACD,IA3CE,UAAU,CA4CH,GACZ,GAEW,EACjB,CAAC,WAAW;gDACX,CAAC,KAAK,EAAE,MAAM;gDACd,CAAC,YAAY;gDACb,kBAAkB,IAAI,CACpB,cACE,SAAS,EAAC,mHAAmH,EAC7H,OAAO,EAAE,yBAAyB,YAEjC,cAAc,GACX,CACP,EAEH,cAAK,SAAS,EAAC,SAAS,YACtB,KAAC,gBAAgB,IACf,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,qBAAqB,EAC/B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,KAAK,EACH,YAAY;wDACV,CAAC,CAAC,uBAAuB;wDACzB,CAAC,CAAC,oBAAoB,EAE1B,aAAa,EAAE,iBAAiB,GAChC,GACE,EAEN,eAAK,SAAS,EAAC,gEAAgE,aAC5E,CAAC,WAAW,IAAI,CACf,KAAC,MAAM,IACL,SAAS,EAAC,+DAA+D,EACzE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4DACjB,KAAK,CAAC,cAAc,EAAE,CAAC;4DACvB,aAAa,CAAC,gBAAgB,CAAC,CAAC;4DAChC,oBAAoB,EAAE,CAAC;wDACzB,CAAC,YAED,KAAC,kBAAkB,IAAC,IAAI,EAAE,EAAE,GAAI,GACzB,CACV,EACD,KAAC,MAAM,IACL,SAAS,EAAC,oEAAoE,EAC9E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4DACjB,KAAK,CAAC,cAAc,EAAE,CAAC;4DACvB,aAAa,CAAC,QAAQ,CAAC,CAAC;4DACxB,UAAU,EAAE,CAAC;wDACf,CAAC,EACD,QAAQ,EAAE,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,YAE3C,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,GAClB,IACL,IACF,IACF,GACL,CACJ,GACU,CACd,GACe,GACP,IACT,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { AnimatePresence, motion } from 'framer-motion';\nimport {\n type ChangeEvent,\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useWindowSize } from 'usehooks-ts';\nimport { useAudioRecording } from '../../../hooks/useAudioRecording';\nimport { useChatData } from '../../../hooks/useChatData';\nimport { useConfiguration } from '../../../hooks/useConfiguration';\nimport { getAudioTranscript } from '../../../services/chat.service';\nimport { BotType } from '../../../types/bot.type';\nimport { ChatMessageType, IFileUpload } from '../../../types/flowise.type';\nimport { cn, generateUUID, sleep } from '../../../utils/commonUtils';\nimport { getBestMimeType, getFileExtension } from '../../../utils/fileUtils';\nimport {\n ArrowUpIcon,\n ClikAIIcon,\n ClikChatIcon,\n ClikMicrophoneIcon,\n PlusIcon,\n} from '../Icons';\nimport { Button } from '../ui/Button';\nimport { VoiceRecordingUI } from '../VoiceRecordingUI';\nimport { Textarea } from '../ui/Textarea';\n\ntype PropsType = {\n input: string;\n setInput: (value: string) => void;\n loadingChat: boolean;\n message: ChatMessageType | null;\n chatId: string;\n handleSubmit: (\n event?: { preventDefault?: () => void },\n files?: IFileUpload[]\n ) => void;\n className?: string;\n bot: BotType | null;\n apiHost: string;\n setEnableTTS: (value: boolean) => void;\n enableTTS: boolean;\n onAudioEnded: () => void;\n};\n\ntype ClickType =\n | 'ChangeLanguage'\n | 'WelcomeMsg'\n | 'StartRecording'\n | 'CancelRecording'\n | 'FinishRecording'\n | 'PauseAudio'\n | 'PlayAudio'\n | 'CloseAudio'\n | 'Submit'\n | 'ClickButtonAI'\n | 'AddFile';\n\nexport const MultimodalInputSimplified: FC<PropsType> = (props) => {\n const {\n input,\n setInput,\n message,\n handleSubmit,\n className,\n apiHost,\n setEnableTTS,\n } = props;\n const { onLoaded, theme = {} } = useConfiguration();\n const { modeButtonChat = false, gapInput = 16 } = theme;\n const { listeners } = useChatData();\n const {\n isRecording,\n onRecordingCancelled,\n onRecordingStopped,\n onRecordingStarted,\n audioData,\n elapsedTime,\n updateMaxHistoryLength,\n } = useAudioRecording();\n const { width } = useWindowSize();\n\n const language =\n theme?.language?.options\n ?.find((option) => option.code === theme?.language?.code)\n ?.name?.toUpperCase() || 'EN';\n\n const [transcribing, setTranscribing] = useState<boolean>(false);\n const [showAudioPlayer, setShowAudioPlayer] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [expanded, setExpanded] = useState(!modeButtonChat);\n const [animationCompleted, setAnimationCompleted] = useState(false);\n\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const setInputRef = useRef<((input: string) => void) | null>(null);\n\n const welcomeMessage =\n theme.welcomeMessage || \"Hi, I'm your showroom assistant\";\n const adjustHeight = () => {\n if (textareaRef.current) {\n (textareaRef.current as HTMLTextAreaElement).style.height = '24px';\n (textareaRef.current as HTMLTextAreaElement).style.height =\n `${textareaRef.current?.scrollHeight}px`;\n }\n };\n\n const readonly = isRecording || transcribing;\n const handleSetInput = useCallback(\n (value: string) => {\n setInput(value);\n },\n [setInput]\n );\n\n const handleInput = (event: ChangeEvent<HTMLTextAreaElement>) => {\n handleSetInput(event.target.value);\n\n if (textareaRef.current) {\n textareaRef.current.scrollTop = textareaRef.current.scrollHeight;\n }\n };\n\n const submitForm = useCallback(async () => {\n setSubmitting(true);\n if (listeners?.['ON_SUBMIT_MESSAGE']) {\n listeners['ON_SUBMIT_MESSAGE']();\n }\n handleSubmit(undefined);\n await sleep(500);\n setShowAudioPlayer(true);\n }, [handleSubmit, listeners]);\n\n const toAudioBase64 = (blob: Blob) => {\n return new Promise<IFileUpload>((resolve) => {\n let mimeType = getBestMimeType();\n const pos = blob.type.indexOf(';');\n if (pos === -1) {\n mimeType = blob.type;\n } else {\n mimeType = blob.type.substring(0, pos);\n }\n\n // read blob and add to previews\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n reader.onloadend = () => {\n const base64data = reader.result as string;\n const upload: IFileUpload = {\n tempId: generateUUID(),\n data: base64data,\n type: 'audio',\n name: `audio_${Date.now()}.${getFileExtension(mimeType)}`,\n mime: mimeType,\n };\n resolve(upload);\n };\n });\n };\n\n const speechToText = async (blob: Blob) => {\n try {\n setTranscribing(true);\n const fileUpload = await toAudioBase64(blob);\n const base64Data = fileUpload.data!.replace(/^data:.+;base64,/, '');\n const byteCharacters = atob(base64Data); // Decode Base64 string\n const byteNumbers = new Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n const file = new File([byteArray], fileUpload.name, {\n lastModified: new Date().getTime(),\n type: fileUpload.type,\n });\n\n const text = await getAudioTranscript({ file, apiHost, language });\n if (text) {\n handleSetInput(text);\n }\n } catch (error) {\n console.error('Error getting audio transcript!', error);\n } finally {\n setTranscribing(false);\n }\n };\n\n const handleFinishRecording = () => {\n if (isRecording) {\n onRecordingStopped(speechToText);\n }\n if (listeners?.['ON_FINISHED_RECORDING']) {\n listeners['ON_FINISHED_RECORDING']();\n }\n };\n\n const handleStartRecording = useCallback(() => {\n onRecordingStarted();\n handleSetInput('');\n if (listeners?.['ON_START_RECORDING']) {\n listeners['ON_START_RECORDING']();\n }\n }, [onRecordingStarted, handleSetInput, listeners]);\n\n const handleCancelRecording = () => {\n handleOnClick('CancelRecording');\n onRecordingCancelled();\n handleSetInput('');\n if (listeners?.['ON_CANCEL_RECORDING']) {\n listeners['ON_CANCEL_RECORDING']();\n }\n };\n\n const handleSend = useCallback(async () => {\n if (!isRecording) {\n submitForm();\n }\n }, [submitForm, isRecording]);\n\n const handleOnClickOpenChatmode = () => {\n handleOnClick('WelcomeMsg');\n };\n\n const handleOnClick = (type?: ClickType) => {\n if (listeners?.['ON_CLICK']) {\n listeners['ON_CLICK'](type);\n }\n };\n\n const handleToggleExpand = () => {\n handleOnClick('ClickButtonAI');\n setExpanded(!expanded);\n setAnimationCompleted(false);\n if (!expanded) {\n // Focus vào textarea khi expand\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.focus();\n }\n }, 300);\n }\n };\n\n useEffect(() => {\n adjustHeight();\n }, [input, readonly]);\n\n useEffect(() => {\n setInputRef.current = setInput;\n }, [setInput]);\n\n useEffect(() => {\n if (onLoaded) {\n onLoaded({\n setInput: (txt): void => {\n if (setInputRef.current) {\n setInputRef.current(txt || '');\n }\n },\n startRecording: async () => {\n handleStartRecording();\n },\n });\n }\n }, []);\n\n useEffect(() => {\n setEnableTTS(true);\n return () => {\n setEnableTTS(false);\n };\n }, [setEnableTTS]);\n\n useEffect(() => {\n if (message && submitting) {\n setSubmitting(false);\n if (listeners?.['ON_FINISHED_SUBMITTING_MESSAGE']) {\n listeners['ON_FINISHED_SUBMITTING_MESSAGE']();\n }\n }\n }, [message, submitting, listeners]);\n\n const handleWidthChange = useCallback(\n (maxBars: number) => {\n updateMaxHistoryLength(maxBars);\n },\n [updateMaxHistoryLength]\n );\n\n const recordingPlaceholder =\n isRecording && !transcribing\n ? theme?.input?.recordingPlaceholder || 'Recording...'\n : '';\n\n const transcribingPlaceholder = transcribing\n ? theme?.input?.transcribingPlaceholder || 'Transcribing...'\n : '';\n\n const processing = isRecording || transcribing;\n const canShowAudioPlayer =\n !theme?.noAutoplayMessage &&\n showAudioPlayer &&\n message?.new &&\n message?.tts;\n\n // Animation variants\n const containerVariants = {\n collapsed: {\n width: '0px',\n height: '0px',\n opacity: 0,\n borderRadius: '28px',\n },\n expanded: {\n width: width ? `${width - gapInput}px` : '100%',\n height: 'auto',\n opacity: 1,\n borderRadius: '16px',\n },\n };\n\n const contentVariants = {\n collapsed: {\n opacity: 0,\n scale: 0.8,\n },\n expanded: {\n opacity: 1,\n scale: 1,\n },\n };\n\n const showButtonAI =\n !isRecording &&\n modeButtonChat &&\n !input?.length &&\n !processing &&\n !submitting &&\n !transcribing;\n\n return (\n <div className=\"flex justify-end\">\n {showButtonAI && (\n <div\n className={cn(\n 'absolute z-20 transition-all duration-300 top-1 right-1'\n )}\n >\n <Button\n className={cn(\n 'rounded-full bg-[#fff] hover:bg-[#fff] text-white border-none shadow-lg w-[32px] h-[32px] p-0 flex items-center justify-center',\n expanded && 'bg-[#595959] hover:bg-[#595959] text-white'\n )}\n onClick={handleToggleExpand}\n >\n {expanded ? (\n <ClikChatIcon\n size={20}\n style={{ width: '20px', height: '20px' }}\n />\n ) : (\n <ClikAIIcon size={20} style={{ width: '20px', height: '20px' }} />\n )}\n </Button>\n </div>\n )}\n <motion.div\n variants={containerVariants}\n initial=\"collapsed\"\n animate={expanded ? 'expanded' : 'collapsed'}\n transition={{ duration: 0.3, ease: 'easeInOut' }}\n className={cn('relative flex gap-4 scrollbar-hidden ', className, {\n 'flex-col min-h-[40px]': !canShowAudioPlayer && expanded,\n 'flex-row min-h-[40px]': canShowAudioPlayer && expanded,\n 'items-center justify-center': !expanded,\n })}\n >\n <AnimatePresence>\n {expanded && (\n <motion.div\n variants={contentVariants}\n initial=\"collapsed\"\n animate=\"expanded\"\n exit=\"collapsed\"\n transition={{ duration: 0.2, delay: 0 }}\n onAnimationComplete={() => setAnimationCompleted(true)}\n className={`w-full `}\n >\n {!canShowAudioPlayer && (\n <>\n <div className=\" w-full flex gap-4 justify-end items-end\">\n {isRecording ? (\n <Button\n className={` rounded-full w-[40px] h-[40px] flex items-center justify-center bg-white hover:bg-white`}\n onClick={(event) => {\n event.preventDefault();\n handleFinishRecording();\n }}\n >\n <div className=\"w-[12px] h-[12px] bg-muted-foreground rounded-full\"></div>\n </Button>\n ) : (\n <Button\n className={` rounded-full w-[40px] h-[40px] flex items-center justify-center bg-white hover:bg-white`}\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('AddFile');\n }}\n >\n <PlusIcon size={20} color={'#71717A'} />\n </Button>\n )}\n <div className=\"block flex-1 min-w-0 min-h-[40px] relative bg-white rounded-[24px] border border-[#E5E5E5] shadow-[0px_2px_6px_0px_rgba(0,0,0,0.08)] backdrop-blur-[50px]\">\n {/* Animated Input/Textarea Container */}\n <AnimatePresence mode=\"wait\">\n {\n <>\n <motion.div\n key=\"textarea\"\n initial={{ opacity: 0, height: 40 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 40 }}\n transition={{\n duration: 0.2,\n ease: 'easeInOut',\n }}\n style={{\n display:\n input.length || transcribing\n ? 'block'\n : 'none',\n }}\n >\n <Textarea\n readOnly={readonly}\n ref={textareaRef}\n placeholder={\n transcribing\n ? transcribingPlaceholder\n : 'Nhập tin nhắn của bạn...'\n }\n value={input}\n onChange={handleInput}\n className={cn(\n `min-h-[24px] max-h-[120px] resize-none text-base bg-muted bg-[#ffffff] scrollbar-hidden p-[12px] pb-[32px] rounded-[24px] border border-[#E5E5E5] shadow-[0px_2px_6px_0px_rgba(0,0,0,0.08)] backdrop-blur-[50px] `,\n className\n )}\n style={{\n height: 60,\n }}\n autoFocus\n onKeyDown={(event) => {\n if (\n event.key === 'Enter' &&\n !event.shiftKey\n ) {\n event.preventDefault();\n handleOnClick('Submit');\n handleSend();\n }\n }}\n />\n </motion.div>\n </>\n }\n </AnimatePresence>\n {!isRecording &&\n !input?.length &&\n !transcribing &&\n animationCompleted && (\n <div\n className=\"p-[10px] text-[14px] text-muted-foreground cursor-pointer w-full text-ellipsis overflow-hidden whitespace-nowrap\"\n onClick={handleOnClickOpenChatmode}\n >\n {welcomeMessage}\n </div>\n )}\n {/* Voice Recording UI Overlay */}\n <div className=\"w-full \">\n <VoiceRecordingUI\n isRecording={isRecording}\n elapsedTime={elapsedTime}\n onCancel={handleCancelRecording}\n transcribing={transcribing}\n audioData={audioData}\n label={\n transcribing\n ? transcribingPlaceholder\n : recordingPlaceholder\n }\n onWidthChange={handleWidthChange}\n />\n </div>\n\n <div className=\"button-voice right-[4px] absolute bottom-[4px] flex gap-[12px]\">\n {!isRecording && (\n <Button\n className=\"rounded-full z-[2] p-1.5 h-[32px] w-[32px] m-0 bg-transparent\"\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('StartRecording');\n handleStartRecording();\n }}\n >\n <ClikMicrophoneIcon size={20} />\n </Button>\n )}\n <Button\n className=\"rounded-full z-[2] p-1.5 h-[32px] w-[32px] m-0 border bg-[#71717A]\"\n onClick={(event) => {\n event.preventDefault();\n handleOnClick('Submit');\n handleSend();\n }}\n disabled={isRecording || input.length === 0}\n >\n <ArrowUpIcon size={20} />\n </Button>\n </div>\n </div>\n </div>\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n </div>\n );\n};\n"]}
|
|
@@ -11,8 +11,8 @@ export declare const DISPLAY_PRODUCT_LIST_TOOL_PREFIXES: {
|
|
|
11
11
|
export declare const DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES: {
|
|
12
12
|
readonly DISPLAY_PRODUCT: "display_product";
|
|
13
13
|
};
|
|
14
|
-
export declare const
|
|
15
|
-
readonly
|
|
14
|
+
export declare const DISPLAY_GUIDED_TOURS_TOOL_PREFIXES: {
|
|
15
|
+
readonly DISPLAY_GUIDED_TOURS: "display_guided_tours";
|
|
16
16
|
};
|
|
17
17
|
export declare const DISPLAY_BOOKING_FORM_TOOL_PREFIXES: {
|
|
18
18
|
readonly DISPLAY_BOOKING_FORM: "display_booking_form";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolNames.d.ts","sourceRoot":"","sources":["../../src/constants/toolNames.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;CAEhB,CAAC;AAGX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,oCAAoC;;CAEvC,CAAC;AAGX,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"toolNames.d.ts","sourceRoot":"","sources":["../../src/constants/toolNames.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;CAEhB,CAAC;AAGX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,oCAAoC;;CAEvC,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,QAAA,MAAM,qBAAqB;;;;;;CAMjB,CAAC;AAcX,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;CAYhB,CAAC;AAGX,eAAO,MAAM,mBAAmB,gBAA+B,CAAC;AAChE,eAAO,MAAM,oBAAoB,gEAAgC,CAAC;AAClE,eAAO,MAAM,mBAAmB,UAA+B,CAAC;AAChE,eAAO,MAAM,2BAA2B,oIAAuC,CAAC;AAGhF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;CAKZ,CAAC;AAGX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAC7E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAChF,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAC7E,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC;AACrE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAElE,oBAAY,IAAI;IACd,YAAY,WAAW;IACvB,WAAW,WAAW;IACtB,QAAQ,OAAO;IACf,UAAU,OAAO;IACjB,IAAI,MAAM;IACV,KAAK,MAAM;IACX,KAAK,MAAM;CACZ;AAED,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,UAAU,eAAe;IACzB,EAAE,OAAO;CACV"}
|
|
@@ -17,8 +17,8 @@ export const DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES = {
|
|
|
17
17
|
DISPLAY_PRODUCT: 'display_product',
|
|
18
18
|
};
|
|
19
19
|
// Scenario Tools
|
|
20
|
-
export const
|
|
21
|
-
|
|
20
|
+
export const DISPLAY_GUIDED_TOURS_TOOL_PREFIXES = {
|
|
21
|
+
DISPLAY_GUIDED_TOURS: 'display_guided_tours',
|
|
22
22
|
};
|
|
23
23
|
// Display booking form Tools
|
|
24
24
|
export const DISPLAY_BOOKING_FORM_TOOL_PREFIXES = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolNames.js","sourceRoot":"","sources":["../../src/constants/toolNames.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,gBAAgB;AAChB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW,EAAE,YAAY;CACjB,CAAC;AAEX,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4BAA4B,EAAE,8BAA8B;IAC5D,uBAAuB,EAAE,yBAAyB;CAC1C,CAAC;AAEX,wDAAwD;AACxD,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC;AAEX,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oCAAoC,GAAG;IAClD,eAAe,EAAE,iBAAiB;CAC1B,CAAC;AAEX,iBAAiB;AACjB,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"toolNames.js","sourceRoot":"","sources":["../../src/constants/toolNames.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,gBAAgB;AAChB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW,EAAE,YAAY;CACjB,CAAC;AAEX,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4BAA4B,EAAE,8BAA8B;IAC5D,uBAAuB,EAAE,yBAAyB;CAC1C,CAAC;AAEX,wDAAwD;AACxD,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC;AAEX,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oCAAoC,GAAG;IAClD,eAAe,EAAE,iBAAiB;CAC1B,CAAC;AAEX,iBAAiB;AACjB,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,oBAAoB,EAAE,sBAAsB;CACpC,CAAC;AAEX,6BAA6B;AAC7B,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,oBAAoB,EAAE,sBAAsB;CACpC,CAAC;AAEX,6BAA6B;AAC7B,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,oBAAoB,EAAE,sBAAsB;CACpC,CAAC;AAEX,wBAAwB;AACxB,MAAM,qBAAqB,GAAG;IAC5B,wBAAwB,EAAE,0BAA0B;IACpD,eAAe,EAAE,iBAAiB;IAClC,sBAAsB,EAAE,wBAAwB;IAChD,0BAA0B,EAAE,4BAA4B;IACxD,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC;AAEX,0BAA0B;AAC1B,MAAM,mBAAmB,GAAG;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,qBAAqB,EAAE,uBAAuB;IAC9C,eAAe,EAAE,iBAAiB;IAClC,oBAAoB,EAAE,sBAAsB;IAC5C,uBAAuB,EAAE,yBAAyB;IAClD,sBAAsB,EAAE,wBAAwB;CACjD,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,gBAAgB;IAChB,iBAAiB,EAAE,mBAAmB;IAEtC,kBAAkB;IAClB,eAAe,EAAE,iBAAiB;IAElC,wBAAwB;IACxB,GAAG,qBAAqB;IAExB,0BAA0B;IAC1B,GAAG,mBAAmB;CACd,CAAC;AAEX,qCAAqC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEhF,0BAA0B;AAC1B,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,GAAG,aAAa;IAChB,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,qBAAqB;CAChB,CAAC;AAUX,MAAM,CAAN,IAAY,IAQX;AARD,WAAY,IAAI;IACd,+BAAuB,CAAA;IACvB,8BAAsB,CAAA;IACtB,uBAAe,CAAA;IACf,yBAAiB,CAAA;IACjB,kBAAU,CAAA;IACV,mBAAW,CAAA;IACX,mBAAW,CAAA;AACb,CAAC,EARW,IAAI,KAAJ,IAAI,QAQf;AAED,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,+BAAe,CAAA;IACf,+BAAe,CAAA;IACf,yCAAyB,CAAA;IACzB,yBAAS,CAAA;AACX,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB","sourcesContent":["// Tool name constants for easier maintenance and type safety\n\n// Weather Tools\nexport const WEATHER_TOOLS = {\n GET_WEATHER: 'getWeather',\n} as const;\n\n// Location Tools\nexport const LOCATION_TOOLS = {\n GET_ASSIGNED_LOCATION_DETAIL: 'get_assigned_location_detail',\n SEARCH_TRAVELING_PLACES: 'search-traveling-places',\n} as const;\n\n// Product list tool name prefixes for flexible matching\nexport const DISPLAY_PRODUCT_LIST_TOOL_PREFIXES = {\n DISPLAY_PRODUCTS: 'display_products',\n} as const;\n\n// Product detail tool name prefixes for flexible matching\nexport const DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES = {\n DISPLAY_PRODUCT: 'display_product',\n} as const;\n\n// Scenario Tools\nexport const DISPLAY_GUIDED_TOURS_TOOL_PREFIXES = {\n DISPLAY_GUIDED_TOURS: 'display_guided_tours',\n} as const;\n\n// Display booking form Tools\nexport const DISPLAY_BOOKING_FORM_TOOL_PREFIXES = {\n DISPLAY_BOOKING_FORM: 'display_booking_form',\n} as const;\n\n// display contact form Tools\nexport const DISPLAY_CONTACT_FORM_TOOL_PREFIXES = {\n DISPLAY_CONTACT_FORM: 'display_contact_form',\n} as const;\n\n// Product command Tools\nconst PRODUCT_COMMAND_TOOLS = {\n SHOW_HOTSPOT_GUIDED_TOUR: 'show_hotspot_guided_tour',\n SHOW_PRODUCT_AR: 'show_product_AR',\n SHOW_PRODUCT_360_IMAGE: 'show_product_360_image',\n SHOW_PRODUCT_IMAGE_GALLERY: 'show_product_image_gallery',\n SHOW_PRODUCT_INFO: 'show_product_info',\n} as const;\n\n// Scene Interaction Tools\nconst SCENE_COMMAND_TOOLS = {\n UPDATE_SCENE_VIEW: 'update_scene_view',\n CHANGE_ROOM_STYLE: 'change_room_style',\n SWAP_PRODUCT_MATERIAL: 'swap_product_material',\n OPEN_CLOSE_DOOR: 'open_close_door',\n CHANGE_ROOM_LIGHTING: 'change_room_lighting',\n OPEN_SCENE_PRODUCT_LIST: 'open_scene_product_list',\n PLAY_SCENE_GUIDED_TOUR: 'play_scene_guided_tour',\n};\n\n// Command Tools\nexport const COMMAND_TOOLS = {\n // play scenario\n START_GUIDED_TOUR: 'start_guided_tour',\n\n // move to hotspot\n MOVE_TO_HOTSPOT: 'move_to_hotspot',\n\n // Product Display Tools\n ...PRODUCT_COMMAND_TOOLS,\n\n // Scene Interaction Tools\n ...SCENE_COMMAND_TOOLS,\n} as const;\n\n// Helper arrays for easier iteration\nexport const WEATHER_TOOL_VALUES = Object.values(WEATHER_TOOLS);\nexport const LOCATION_TOOL_VALUES = Object.values(LOCATION_TOOLS);\nexport const COMMAND_TOOL_VALUES = Object.values(COMMAND_TOOLS);\nexport const PRODUCT_COMMAND_TOOL_VALUES = Object.values(PRODUCT_COMMAND_TOOLS);\n\n// All tool names combined\nexport const ALL_TOOLS = {\n ...WEATHER_TOOLS,\n ...LOCATION_TOOLS,\n ...COMMAND_TOOLS,\n ...PRODUCT_COMMAND_TOOLS,\n} as const;\n\n// Type definitions for better TypeScript support\nexport type WeatherTool = (typeof WEATHER_TOOLS)[keyof typeof WEATHER_TOOLS];\nexport type LocationTool = (typeof LOCATION_TOOLS)[keyof typeof LOCATION_TOOLS];\nexport type CommandTool = (typeof COMMAND_TOOLS)[keyof typeof COMMAND_TOOLS];\nexport type ProductCommandTool =\n (typeof PRODUCT_COMMAND_TOOLS)[keyof typeof PRODUCT_COMMAND_TOOLS];\nexport type AllTools = (typeof ALL_TOOLS)[keyof typeof ALL_TOOLS];\n\nexport enum UNIT {\n SQUARE_METER = '\\u33A1',\n CUBIC_METER = '\\u33A5',\n KILOGRAM = 'kg',\n CENTIMETER = 'cm',\n GRAM = 'g',\n LITER = 'l',\n METER = 'm',\n}\n\nexport enum GALLERY_TYPE {\n IMAGE = 'IMAGE',\n VIDEO = 'VIDEO',\n WEB_ROTATE = 'WEB_ROTATE',\n AR = 'AR',\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { COMMAND_TOOL_VALUES, DISPLAY_BOOKING_FORM_TOOL_PREFIXES, DISPLAY_CONTACT_FORM_TOOL_PREFIXES, DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES, DISPLAY_PRODUCT_LIST_TOOL_PREFIXES,
|
|
1
|
+
import { COMMAND_TOOL_VALUES, DISPLAY_BOOKING_FORM_TOOL_PREFIXES, DISPLAY_CONTACT_FORM_TOOL_PREFIXES, DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES, DISPLAY_PRODUCT_LIST_TOOL_PREFIXES, DISPLAY_GUIDED_TOURS_TOOL_PREFIXES, LOCATION_TOOLS, WEATHER_TOOLS, } from '../constants/toolNames';
|
|
2
2
|
/**
|
|
3
3
|
* Parse tool output data from JSON string
|
|
4
4
|
* @param outputData - The tool output data to parse
|
|
@@ -54,7 +54,7 @@ export const isDisplayProductDetailTool = (toolName) => {
|
|
|
54
54
|
* @returns True if the tool is a scenarios tool
|
|
55
55
|
*/
|
|
56
56
|
export const isDisplayScenariosTool = (toolName) => {
|
|
57
|
-
return (hasToolPrefix(toolName,
|
|
57
|
+
return (hasToolPrefix(toolName, DISPLAY_GUIDED_TOURS_TOOL_PREFIXES.DISPLAY_GUIDED_TOURS));
|
|
58
58
|
};
|
|
59
59
|
/**
|
|
60
60
|
* Check if a tool is a display contact form tool by prefix
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolUtils.js","sourceRoot":"","sources":["../../src/utils/toolUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n COMMAND_TOOL_VALUES,\n DISPLAY_BOOKING_FORM_TOOL_PREFIXES,\n DISPLAY_CONTACT_FORM_TOOL_PREFIXES,\n DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES,\n DISPLAY_PRODUCT_LIST_TOOL_PREFIXES,\n DISPLAY_SCENARIOS_LIST_TOOL_PREFIXES,\n LOCATION_TOOLS,\n WEATHER_TOOLS,\n} from '../constants/toolNames';\nimport { ToolUsage } from '../types/flowise.type';\n\n/**\n * Parse tool output data from JSON string\n * @param outputData - The tool output data to parse\n * @returns Parsed JSON object or null if parsing fails\n */\nexport const parseToolOutput = (outputData: any) => {\n try {\n if (!outputData) {\n return null;\n }\n \n const jsonData = JSON.parse(outputData);\n let data = jsonData;\n if (Array.isArray(jsonData)) {\n data = jsonData[0];\n }\n if (data.type === 'text') {\n return JSON.parse(data.text);\n }\n return data;\n } catch (e) {\n return null;\n }\n};\n\n/**\n * Check if a tool name matches a specific prefix\n * @param toolName - Tool name to check\n * @param prefix - Prefix to match against\n * @returns True if the tool name starts with the prefix\n */\nexport const hasToolPrefix = (toolName: string, prefix: string): boolean => {\n return toolName.startsWith(prefix);\n};\n\n/**\n * Check if a tool is a product list tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a product list tool\n */\nexport const isDisplayProductListTool = (toolName: string): boolean => {\n return (\n hasToolPrefix(toolName, DISPLAY_PRODUCT_LIST_TOOL_PREFIXES.DISPLAY_PRODUCTS)\n );\n};\n\n/**\n * Check if a tool is a product detail tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a product detail tool\n */\nexport const isDisplayProductDetailTool = (toolName: string): boolean => {\n return (\n hasToolPrefix(\n toolName,\n DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES.DISPLAY_PRODUCT\n )\n );\n};\n\n/**\n * Check if a tool is a scenarios tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a scenarios tool\n */\nexport const isDisplayScenariosTool = (toolName: string): boolean => {\n return (\n hasToolPrefix(\n toolName,\n DISPLAY_SCENARIOS_LIST_TOOL_PREFIXES.DISPLAY_SCENARIOS\n )\n );\n};\n\n/**\n * Check if a tool is a display contact form tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a display contact form tool\n */\nexport const isDisplayContactFormTool = (toolName: string): boolean => {\n return hasToolPrefix(\n toolName,\n DISPLAY_CONTACT_FORM_TOOL_PREFIXES.DISPLAY_CONTACT_FORM\n );\n};\n\n/**\n * Check if a tool is a display booking form tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the is a display booking form tool\n */\nexport const isDisplayBookingFormTool = (toolName: string): boolean => {\n return hasToolPrefix(\n toolName,\n DISPLAY_BOOKING_FORM_TOOL_PREFIXES.DISPLAY_BOOKING_FORM\n );\n};\n\n/**\n * Check if a tool is a command tool\n * @param tool - Tool name to check\n * @returns True if the tool is a command tool\n */\nexport const isCommandTool = (tool: string): boolean => {\n return COMMAND_TOOL_VALUES.includes(tool as any);\n};\n\n/**\n * Check if a tool is a weather tool\n * @param tool - Tool name to check\n * @returns True if the tool is a weather tool\n */\nexport const isWeatherTool = (tool: string): boolean => {\n return tool === WEATHER_TOOLS.GET_WEATHER;\n};\n\n/**\n * Check if a tool is a location tool\n * @param tool - Tool name to check\n * @returns True if the tool is a location tool\n */\nexport const isLocationTool = (tool: string): boolean => {\n return (\n tool === LOCATION_TOOLS.GET_ASSIGNED_LOCATION_DETAIL ||\n tool === LOCATION_TOOLS.SEARCH_TRAVELING_PLACES\n );\n};\n\n/**\n * Check if a tool usage contains HTML content\n * @param toolUsage - The tool usage object to check\n * @returns True if the tool contains HTML content\n */\nexport const isHtmlContent = (toolUsage: ToolUsage): boolean => {\n const outputData = parseToolOutput(toolUsage.toolOutput);\n return outputData?.type === 'HTML';\n};\n\n/**\n * Check if a tool should be treated as a custom tool result\n * @param tool - Tool name to check\n * @returns True if the tool is a custom tool\n */\nexport const isCustomTool = (tool: string): boolean => {\n return (\n isWeatherTool(tool) ||\n isLocationTool(tool) ||\n isDisplayProductListTool(tool) ||\n isDisplayProductDetailTool(tool) ||\n isDisplayScenariosTool(tool) ||\n isDisplayBookingFormTool(tool) ||\n isDisplayContactFormTool(tool)\n );\n};\n\n/**\n * Check if a tool should focus the tool output (hide message content)\n * @param tool - Tool name to check\n * @returns True if the tool should focus output\n */\nexport const shouldFocusToolOutput = (tool: string): boolean => {\n return (\n isCommandTool(tool) ||\n isDisplayProductListTool(tool) ||\n isDisplayProductDetailTool(tool) ||\n isDisplayScenariosTool(tool)\n );\n};\n\n/**\n * Categorize tools from a list of tool usages\n * @param usedTools - Array of tool usages\n * @param isNewMessage - Whether this is a new message\n * @returns Categorized tools object\n */\nexport const categorizeTools = (\n usedTools: ToolUsage[],\n isNewMessage: boolean = false\n) => {\n const customToolResults: ToolUsage[] = [];\n const toolResults: ToolUsage[] = [];\n let cmdToolResult: ToolUsage | null = null;\n\n usedTools.forEach((usedTool) => {\n if (isCommandTool(usedTool.tool)) {\n if (isNewMessage) {\n cmdToolResult = usedTool;\n }\n } else if (isCustomTool(usedTool.tool) || isHtmlContent(usedTool)) {\n customToolResults.push(usedTool);\n } else {\n toolResults.push(usedTool);\n }\n });\n return {\n customToolResults,\n toolResults,\n cmdToolResult,\n };\n};\n\n/**\n * Check if any tool in the list should focus output\n * @param usedTools - Array of tool usages\n * @returns True if any tool should focus output\n */\nexport const hasFocusToolOutput = (usedTools: ToolUsage[]): boolean => {\n return usedTools.some(\n (usedTool) =>\n shouldFocusToolOutput(usedTool.tool) || isHtmlContent(usedTool)\n );\n};\n\n/**\n * Remove tool output from message content\n * @param content - Original message content (can be undefined)\n * @param usedTools - Array of tool usages\n * @returns Content with tool outputs removed, or empty string if content is undefined\n */\nexport const removeToolOutputFromContent = (\n content: string | undefined,\n usedTools: ToolUsage[]\n): string => {\n if (!content) {\n return '';\n }\n\n let cleanedContent = content;\n\n usedTools.forEach((tool) => {\n const { toolOutput } = tool;\n cleanedContent = cleanedContent?.replaceAll(toolOutput, '');\n });\n\n return cleanedContent;\n};"]}
|
|
1
|
+
{"version":3,"file":"toolUtils.js","sourceRoot":"","sources":["../../src/utils/toolUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n COMMAND_TOOL_VALUES,\n DISPLAY_BOOKING_FORM_TOOL_PREFIXES,\n DISPLAY_CONTACT_FORM_TOOL_PREFIXES,\n DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES,\n DISPLAY_PRODUCT_LIST_TOOL_PREFIXES,\n DISPLAY_GUIDED_TOURS_TOOL_PREFIXES,\n LOCATION_TOOLS,\n WEATHER_TOOLS,\n} from '../constants/toolNames';\nimport { ToolUsage } from '../types/flowise.type';\n\n/**\n * Parse tool output data from JSON string\n * @param outputData - The tool output data to parse\n * @returns Parsed JSON object or null if parsing fails\n */\nexport const parseToolOutput = (outputData: any) => {\n try {\n if (!outputData) {\n return null;\n }\n \n const jsonData = JSON.parse(outputData);\n let data = jsonData;\n if (Array.isArray(jsonData)) {\n data = jsonData[0];\n }\n if (data.type === 'text') {\n return JSON.parse(data.text);\n }\n return data;\n } catch (e) {\n return null;\n }\n};\n\n/**\n * Check if a tool name matches a specific prefix\n * @param toolName - Tool name to check\n * @param prefix - Prefix to match against\n * @returns True if the tool name starts with the prefix\n */\nexport const hasToolPrefix = (toolName: string, prefix: string): boolean => {\n return toolName.startsWith(prefix);\n};\n\n/**\n * Check if a tool is a product list tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a product list tool\n */\nexport const isDisplayProductListTool = (toolName: string): boolean => {\n return (\n hasToolPrefix(toolName, DISPLAY_PRODUCT_LIST_TOOL_PREFIXES.DISPLAY_PRODUCTS)\n );\n};\n\n/**\n * Check if a tool is a product detail tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a product detail tool\n */\nexport const isDisplayProductDetailTool = (toolName: string): boolean => {\n return (\n hasToolPrefix(\n toolName,\n DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES.DISPLAY_PRODUCT\n )\n );\n};\n\n/**\n * Check if a tool is a scenarios tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a scenarios tool\n */\nexport const isDisplayScenariosTool = (toolName: string): boolean => {\n return (\n hasToolPrefix(\n toolName,\n DISPLAY_GUIDED_TOURS_TOOL_PREFIXES.DISPLAY_GUIDED_TOURS\n )\n );\n};\n\n/**\n * Check if a tool is a display contact form tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the tool is a display contact form tool\n */\nexport const isDisplayContactFormTool = (toolName: string): boolean => {\n return hasToolPrefix(\n toolName,\n DISPLAY_CONTACT_FORM_TOOL_PREFIXES.DISPLAY_CONTACT_FORM\n );\n};\n\n/**\n * Check if a tool is a display booking form tool by prefix\n * @param toolName - Tool name to check\n * @returns True if the is a display booking form tool\n */\nexport const isDisplayBookingFormTool = (toolName: string): boolean => {\n return hasToolPrefix(\n toolName,\n DISPLAY_BOOKING_FORM_TOOL_PREFIXES.DISPLAY_BOOKING_FORM\n );\n};\n\n/**\n * Check if a tool is a command tool\n * @param tool - Tool name to check\n * @returns True if the tool is a command tool\n */\nexport const isCommandTool = (tool: string): boolean => {\n return COMMAND_TOOL_VALUES.includes(tool as any);\n};\n\n/**\n * Check if a tool is a weather tool\n * @param tool - Tool name to check\n * @returns True if the tool is a weather tool\n */\nexport const isWeatherTool = (tool: string): boolean => {\n return tool === WEATHER_TOOLS.GET_WEATHER;\n};\n\n/**\n * Check if a tool is a location tool\n * @param tool - Tool name to check\n * @returns True if the tool is a location tool\n */\nexport const isLocationTool = (tool: string): boolean => {\n return (\n tool === LOCATION_TOOLS.GET_ASSIGNED_LOCATION_DETAIL ||\n tool === LOCATION_TOOLS.SEARCH_TRAVELING_PLACES\n );\n};\n\n/**\n * Check if a tool usage contains HTML content\n * @param toolUsage - The tool usage object to check\n * @returns True if the tool contains HTML content\n */\nexport const isHtmlContent = (toolUsage: ToolUsage): boolean => {\n const outputData = parseToolOutput(toolUsage.toolOutput);\n return outputData?.type === 'HTML';\n};\n\n/**\n * Check if a tool should be treated as a custom tool result\n * @param tool - Tool name to check\n * @returns True if the tool is a custom tool\n */\nexport const isCustomTool = (tool: string): boolean => {\n return (\n isWeatherTool(tool) ||\n isLocationTool(tool) ||\n isDisplayProductListTool(tool) ||\n isDisplayProductDetailTool(tool) ||\n isDisplayScenariosTool(tool) ||\n isDisplayBookingFormTool(tool) ||\n isDisplayContactFormTool(tool)\n );\n};\n\n/**\n * Check if a tool should focus the tool output (hide message content)\n * @param tool - Tool name to check\n * @returns True if the tool should focus output\n */\nexport const shouldFocusToolOutput = (tool: string): boolean => {\n return (\n isCommandTool(tool) ||\n isDisplayProductListTool(tool) ||\n isDisplayProductDetailTool(tool) ||\n isDisplayScenariosTool(tool)\n );\n};\n\n/**\n * Categorize tools from a list of tool usages\n * @param usedTools - Array of tool usages\n * @param isNewMessage - Whether this is a new message\n * @returns Categorized tools object\n */\nexport const categorizeTools = (\n usedTools: ToolUsage[],\n isNewMessage: boolean = false\n) => {\n const customToolResults: ToolUsage[] = [];\n const toolResults: ToolUsage[] = [];\n let cmdToolResult: ToolUsage | null = null;\n\n usedTools.forEach((usedTool) => {\n if (isCommandTool(usedTool.tool)) {\n if (isNewMessage) {\n cmdToolResult = usedTool;\n }\n } else if (isCustomTool(usedTool.tool) || isHtmlContent(usedTool)) {\n customToolResults.push(usedTool);\n } else {\n toolResults.push(usedTool);\n }\n });\n return {\n customToolResults,\n toolResults,\n cmdToolResult,\n };\n};\n\n/**\n * Check if any tool in the list should focus output\n * @param usedTools - Array of tool usages\n * @returns True if any tool should focus output\n */\nexport const hasFocusToolOutput = (usedTools: ToolUsage[]): boolean => {\n return usedTools.some(\n (usedTool) =>\n shouldFocusToolOutput(usedTool.tool) || isHtmlContent(usedTool)\n );\n};\n\n/**\n * Remove tool output from message content\n * @param content - Original message content (can be undefined)\n * @param usedTools - Array of tool usages\n * @returns Content with tool outputs removed, or empty string if content is undefined\n */\nexport const removeToolOutputFromContent = (\n content: string | undefined,\n usedTools: ToolUsage[]\n): string => {\n if (!content) {\n return '';\n }\n\n let cleanedContent = content;\n\n usedTools.forEach((tool) => {\n const { toolOutput } = tool;\n cleanedContent = cleanedContent?.replaceAll(toolOutput, '');\n });\n\n return cleanedContent;\n};"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultimodalInputSimplified.d.ts","sourceRoot":"","sources":["../../../../src/components/Chat/Simplified/MultimodalInputSimplified.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,EAAE,EAKH,MAAM,OAAO,CAAC;AAMf,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"MultimodalInputSimplified.d.ts","sourceRoot":"","sources":["../../../../src/components/Chat/Simplified/MultimodalInputSimplified.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,EAAE,EAKH,MAAM,OAAO,CAAC;AAMf,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAc3E,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CACZ,KAAK,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,EACvC,KAAK,CAAC,EAAE,WAAW,EAAE,KAClB,IAAI,CAAC;IACV,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAeF,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,SAAS,CAwdnD,CAAC"}
|
|
@@ -11,8 +11,8 @@ export declare const DISPLAY_PRODUCT_LIST_TOOL_PREFIXES: {
|
|
|
11
11
|
export declare const DISPLAY_PRODUCT_DETAIL_TOOL_PREFIXES: {
|
|
12
12
|
readonly DISPLAY_PRODUCT: "display_product";
|
|
13
13
|
};
|
|
14
|
-
export declare const
|
|
15
|
-
readonly
|
|
14
|
+
export declare const DISPLAY_GUIDED_TOURS_TOOL_PREFIXES: {
|
|
15
|
+
readonly DISPLAY_GUIDED_TOURS: "display_guided_tours";
|
|
16
16
|
};
|
|
17
17
|
export declare const DISPLAY_BOOKING_FORM_TOOL_PREFIXES: {
|
|
18
18
|
readonly DISPLAY_BOOKING_FORM: "display_booking_form";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolNames.d.ts","sourceRoot":"","sources":["../../src/constants/toolNames.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;CAEhB,CAAC;AAGX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,oCAAoC;;CAEvC,CAAC;AAGX,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"toolNames.d.ts","sourceRoot":"","sources":["../../src/constants/toolNames.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;CAEhB,CAAC;AAGX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,oCAAoC;;CAEvC,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAGX,QAAA,MAAM,qBAAqB;;;;;;CAMjB,CAAC;AAcX,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;CAYhB,CAAC;AAGX,eAAO,MAAM,mBAAmB,gBAA+B,CAAC;AAChE,eAAO,MAAM,oBAAoB,gEAAgC,CAAC;AAClE,eAAO,MAAM,mBAAmB,UAA+B,CAAC;AAChE,eAAO,MAAM,2BAA2B,oIAAuC,CAAC;AAGhF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;CAKZ,CAAC;AAGX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAC7E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAChF,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAC7E,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC;AACrE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAElE,oBAAY,IAAI;IACd,YAAY,WAAW;IACvB,WAAW,WAAW;IACtB,QAAQ,OAAO;IACf,UAAU,OAAO;IACjB,IAAI,MAAM;IACV,KAAK,MAAM;IACX,KAAK,MAAM;CACZ;AAED,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,UAAU,eAAe;IACzB,EAAE,OAAO;CACV"}
|