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> | |
); | |
} | |