import { useState, FunctionComponent, MouseEvent } from 'react'; import ChatbotToggle from '@patternfly/chatbot/dist/dynamic/ChatbotToggle'; import Chatbot, { ChatbotDisplayMode } from '@patternfly/chatbot/dist/dynamic/Chatbot'; import ChatbotContent from '@patternfly/chatbot/dist/dynamic/ChatbotContent'; import ChatbotWelcomePrompt from '@patternfly/chatbot/dist/dynamic/ChatbotWelcomePrompt'; import ChatbotFooter, { ChatbotFootnote } from '@patternfly/chatbot/dist/dynamic/ChatbotFooter'; import MessageBar from '@patternfly/chatbot/dist/dynamic/MessageBar'; import MessageBox from '@patternfly/chatbot/dist/dynamic/MessageBox'; import Message, { MessageProps } from '@patternfly/chatbot/dist/dynamic/Message'; import FileDropZone from '@patternfly/chatbot/dist/dynamic/FileDropZone'; import { Brand, Bullseye, DropdownGroup, DropdownItem, DropdownList, DropEvent } from '@patternfly/react-core'; import FileDetailsLabel from '@patternfly/chatbot/dist/dynamic/FileDetailsLabel'; import PreviewAttachment from '@patternfly/chatbot/dist/dynamic/PreviewAttachment'; import AttachmentEdit from '@patternfly/chatbot/dist/dynamic/AttachmentEdit'; import ChatbotHeader, { ChatbotHeaderMenu, ChatbotHeaderTitle, ChatbotHeaderActions, ChatbotHeaderOptionsDropdown, ChatbotHeaderMain } from '@patternfly/chatbot/dist/dynamic/ChatbotHeader'; import ChatbotAlert from '@patternfly/chatbot/dist/dynamic/ChatbotAlert'; import ExpandIcon from '@patternfly/react-icons/dist/esm/icons/expand-icon'; import OpenDrawerRightIcon from '@patternfly/react-icons/dist/esm/icons/open-drawer-right-icon'; import OutlinedWindowRestoreIcon from '@patternfly/react-icons/dist/esm/icons/outlined-window-restore-icon'; import PFHorizontalLogoColor from '../UI/PF-HorizontalLogo-Color.svg'; import PFHorizontalLogoReverse from '../UI/PF-HorizontalLogo-Reverse.svg'; import PFIconLogoColor from '../UI/PF-IconLogo-Color.svg'; import PFIconLogoReverse from '../UI/PF-IconLogo-Reverse.svg'; import userAvatar from '../Messages/user_avatar.svg'; import patternflyAvatar from '../Messages/patternfly_avatar.jpg'; import '@patternfly/react-core/dist/styles/base.css'; import '@patternfly/chatbot/dist/css/main.css'; interface ModalData { code: string; fileName: string; } export const BasicDemo: FunctionComponent = () => { const onAttachmentClose = (event, name, id) => { const updatedMessages: MessageProps[] = []; messages.map((message) => { if (message.attachments) { const filteredAttachments = message.attachments.filter((attachment) => attachment.id !== id); message.attachments = filteredAttachments; updatedMessages.push(message); } else { updatedMessages.push(message); } }); setMessages(updatedMessages); }; const onAttachmentClick = () => { setCurrentModalData({ fileName: 'auth-operator.yml', code: 'test' }); setIsEditModalOpen(false); setIsPreviewModalOpen(true); }; const initialMessages: MessageProps[] = [ { role: 'user', content: "I'm referring to this attachment for added context in our conversation.", name: 'User', avatar: userAvatar, avatarProps: { isBordered: true }, attachments: [{ name: 'auth-operator.yml', id: '1', onClick: onAttachmentClick, onClose: onAttachmentClose }] }, { role: 'bot', content: 'Great, I can reference this attachment throughout our conversation.', avatar: patternflyAvatar, name: 'Bot' } ]; const [error, setError] = useState(); const [chatbotVisible, setChatbotVisible] = useState(true); const [file, setFile] = useState(); const [isLoadingFile, setIsLoadingFile] = useState(false); const [messages, setMessages] = useState(initialMessages); const [isPreviewModalOpen, setIsPreviewModalOpen] = useState(false); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [currentModalData, setCurrentModalData] = useState(); const [showAlert, setShowAlert] = useState(false); const [displayMode, setDisplayMode] = useState(ChatbotDisplayMode.default); const onSelectDisplayMode = ( _event: MouseEvent | undefined, value: string | number | undefined ) => { setDisplayMode(value as ChatbotDisplayMode); }; const handleSend = (message) => alert(message); // Attachments // -------------------------------------------------------------------------- // example of how you can read a text file const readFile = (file: File) => new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.onerror = () => reject(reader.error); reader.readAsDataURL(file); // you can use reader.readAsText(file) for human-readable file types; }); // handle file drop/selection const handleFile = (fileArr: File[]) => { setIsLoadingFile(true); // any custom validation you may want if (fileArr.length > 1) { setShowAlert(true); setFile(undefined); setError('Uploaded more than one file.'); return; } // this is 25MB in bytes; size is in bytes if (fileArr[0].size > 25000000) { setShowAlert(true); setFile(undefined); setError('File is larger than 25MB.'); return; } readFile(fileArr[0]) .then((data) => { // eslint-disable-next-line no-console console.log(data); setFile(fileArr[0]); setShowAlert(false); setError(undefined); // this is just for demo purposes, to make the loading state really obvious setTimeout(() => { setIsLoadingFile(false); }, 1000); }) .catch((error: DOMException) => { setShowAlert(true); setError(`Failed to read file: ${error.message}`); }); }; const handleAttachRejected = () => { setFile(undefined); setShowAlert(true); setError('This demo only supports file extensions .txt, .json, .yaml, and .yaml. Please try a different file.'); }; const handleFileDrop = (event: DropEvent, data: File[]) => { handleFile(data); }; const handleAttach = (data: File[]) => { handleFile(data); }; const onClose = () => { setFile(undefined); }; const horizontalLogo = ( ); const iconLogo = ( <> ); return ( <> { setChatbotVisible(!chatbotVisible); setIsEditModalOpen(false); setIsPreviewModalOpen(false); }} /> alert('Menu toggle clicked')} /> } isSelected={displayMode === ChatbotDisplayMode.default} > Overlay } isSelected={displayMode === ChatbotDisplayMode.docked} > Dock to window } isSelected={displayMode === ChatbotDisplayMode.fullscreen} > Fullscreen {showAlert && ( { setShowAlert(false); setError(undefined); }} title="File upload failed" > {error} )} {messages.map((message) => ( ))} {file && (
)}
{currentModalData && ( { setIsPreviewModalOpen(false); setIsEditModalOpen(true); }} onDismiss={() => setCurrentModalData(undefined)} handleModalToggle={() => setIsPreviewModalOpen(false)} displayMode={displayMode} /> )} {currentModalData && ( { setIsEditModalOpen(false); }} onCancel={() => setCurrentModalData(undefined)} handleModalToggle={() => setIsEditModalOpen(false)} displayMode={displayMode} /> )} ); };