Spaces:
Build error
Build error
| import React from "react"; | |
| import { NavLink, useParams, useNavigate } from "react-router"; | |
| import { useTranslation } from "react-i18next"; | |
| import { I18nKey } from "#/i18n/declaration"; | |
| import { ConversationCard } from "./conversation-card"; | |
| import { useUserConversations } from "#/hooks/query/use-user-conversations"; | |
| import { useDeleteConversation } from "#/hooks/mutation/use-delete-conversation"; | |
| import { ConfirmDeleteModal } from "./confirm-delete-modal"; | |
| import { LoadingSpinner } from "#/components/shared/loading-spinner"; | |
| import { ExitConversationModal } from "./exit-conversation-modal"; | |
| import { useClickOutsideElement } from "#/hooks/use-click-outside-element"; | |
| interface ConversationPanelProps { | |
| onClose: () => void; | |
| } | |
| export function ConversationPanel({ onClose }: ConversationPanelProps) { | |
| const { t } = useTranslation(); | |
| const { conversationId: currentConversationId } = useParams(); | |
| const ref = useClickOutsideElement<HTMLDivElement>(onClose); | |
| const navigate = useNavigate(); | |
| const [confirmDeleteModalVisible, setConfirmDeleteModalVisible] = | |
| React.useState(false); | |
| const [ | |
| confirmExitConversationModalVisible, | |
| setConfirmExitConversationModalVisible, | |
| ] = React.useState(false); | |
| const [selectedConversationId, setSelectedConversationId] = React.useState< | |
| string | null | |
| >(null); | |
| const { data: conversations, isFetching, error } = useUserConversations(); | |
| const { mutate: deleteConversation } = useDeleteConversation(); | |
| const handleDeleteProject = (conversationId: string) => { | |
| setConfirmDeleteModalVisible(true); | |
| setSelectedConversationId(conversationId); | |
| }; | |
| const handleConfirmDelete = () => { | |
| if (selectedConversationId) { | |
| deleteConversation( | |
| { conversationId: selectedConversationId }, | |
| { | |
| onSuccess: () => { | |
| if (selectedConversationId === currentConversationId) { | |
| navigate("/"); | |
| } | |
| }, | |
| }, | |
| ); | |
| } | |
| }; | |
| return ( | |
| <div | |
| ref={ref} | |
| data-testid="conversation-panel" | |
| className="w-[350px] h-full border border-neutral-700 bg-base-secondary rounded-xl overflow-y-auto absolute" | |
| > | |
| {isFetching && ( | |
| <div className="w-full h-full absolute flex justify-center items-center"> | |
| <LoadingSpinner size="small" /> | |
| </div> | |
| )} | |
| {error && ( | |
| <div className="flex flex-col items-center justify-center h-full"> | |
| <p className="text-danger">{error.message}</p> | |
| </div> | |
| )} | |
| {conversations?.length === 0 && ( | |
| <div className="flex flex-col items-center justify-center h-full"> | |
| <p className="text-neutral-400"> | |
| {t(I18nKey.CONVERSATION$NO_CONVERSATIONS)} | |
| </p> | |
| </div> | |
| )} | |
| {conversations?.map((project) => ( | |
| <NavLink | |
| key={project.conversation_id} | |
| to={`/conversations/${project.conversation_id}`} | |
| onClick={onClose} | |
| > | |
| {({ isActive }) => ( | |
| <ConversationCard | |
| isActive={isActive} | |
| onDelete={() => handleDeleteProject(project.conversation_id)} | |
| title={project.title} | |
| selectedRepository={project.selected_repository} | |
| lastUpdatedAt={project.last_updated_at} | |
| createdAt={project.created_at} | |
| status={project.status} | |
| conversationId={project.conversation_id} | |
| /> | |
| )} | |
| </NavLink> | |
| ))} | |
| {confirmDeleteModalVisible && ( | |
| <ConfirmDeleteModal | |
| onConfirm={() => { | |
| handleConfirmDelete(); | |
| setConfirmDeleteModalVisible(false); | |
| }} | |
| onCancel={() => setConfirmDeleteModalVisible(false)} | |
| /> | |
| )} | |
| {confirmExitConversationModalVisible && ( | |
| <ExitConversationModal | |
| onConfirm={() => { | |
| onClose(); | |
| }} | |
| onClose={() => setConfirmExitConversationModalVisible(false)} | |
| /> | |
| )} | |
| </div> | |
| ); | |
| } | |