2024-08-30 13:39:30 -04:00
|
|
|
import { useState, useId } from 'react';
|
|
|
|
|
import * as Ariakit from '@ariakit/react';
|
2024-08-16 10:30:14 +02:00
|
|
|
import { Ellipsis, Share2, Archive, Pen, Trash } from 'lucide-react';
|
|
|
|
|
import { useGetStartupConfig } from 'librechat-data-provider/react-query';
|
2024-09-13 08:59:09 -04:00
|
|
|
import { useLocalize, useArchiveHandler } from '~/hooks';
|
2024-08-16 10:30:14 +02:00
|
|
|
import { DropdownPopup } from '~/components/ui';
|
|
|
|
|
import DeleteButton from './DeleteButton';
|
|
|
|
|
import ShareButton from './ShareButton';
|
2024-08-30 13:39:30 -04:00
|
|
|
import { cn } from '~/utils';
|
2024-08-16 10:30:14 +02:00
|
|
|
|
|
|
|
|
export default function ConvoOptions({
|
|
|
|
|
conversation,
|
|
|
|
|
retainView,
|
|
|
|
|
renameHandler,
|
|
|
|
|
isPopoverActive,
|
|
|
|
|
setIsPopoverActive,
|
|
|
|
|
isActiveConvo,
|
|
|
|
|
}) {
|
|
|
|
|
const localize = useLocalize();
|
|
|
|
|
const { data: startupConfig } = useGetStartupConfig();
|
|
|
|
|
const { conversationId, title } = conversation;
|
|
|
|
|
const [showShareDialog, setShowShareDialog] = useState(false);
|
|
|
|
|
const [showDeleteDialog, setShowDeleteDialog] = useState(false);
|
|
|
|
|
const archiveHandler = useArchiveHandler(conversationId, true, retainView);
|
|
|
|
|
|
|
|
|
|
const shareHandler = () => {
|
|
|
|
|
setIsPopoverActive(false);
|
|
|
|
|
setShowShareDialog(true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const deleteHandler = () => {
|
|
|
|
|
setIsPopoverActive(false);
|
|
|
|
|
setShowDeleteDialog(true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const dropdownItems = [
|
|
|
|
|
{
|
|
|
|
|
label: localize('com_ui_rename'),
|
|
|
|
|
onClick: renameHandler,
|
|
|
|
|
icon: <Pen className="icon-md mr-2 text-text-secondary" />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: localize('com_ui_share'),
|
|
|
|
|
onClick: shareHandler,
|
|
|
|
|
icon: <Share2 className="icon-md mr-2 text-text-secondary" />,
|
|
|
|
|
show: startupConfig && startupConfig.sharedLinksEnabled,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: localize('com_ui_archive'),
|
|
|
|
|
onClick: archiveHandler,
|
|
|
|
|
icon: <Archive className="icon-md mr-2 text-text-secondary" />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: localize('com_ui_delete'),
|
|
|
|
|
onClick: deleteHandler,
|
|
|
|
|
icon: <Trash className="icon-md mr-2 text-text-secondary" />,
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
2024-08-30 13:39:30 -04:00
|
|
|
const menuId = useId();
|
|
|
|
|
|
2024-08-16 10:30:14 +02:00
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<DropdownPopup
|
|
|
|
|
isOpen={isPopoverActive}
|
|
|
|
|
setIsOpen={setIsPopoverActive}
|
|
|
|
|
trigger={
|
2024-08-30 13:39:30 -04:00
|
|
|
<Ariakit.MenuButton
|
2024-08-16 10:30:14 +02:00
|
|
|
id="conversation-menu-button"
|
2024-08-30 13:39:30 -04:00
|
|
|
aria-label={localize('com_nav_convo_menu_options')}
|
|
|
|
|
className={cn(
|
2024-09-10 10:11:39 -09:00
|
|
|
'z-30 inline-flex h-7 w-7 items-center justify-center gap-2 rounded-md border-none p-0 text-sm font-medium ring-ring-primary transition-all duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
|
2024-08-30 13:39:30 -04:00
|
|
|
isActiveConvo === true
|
|
|
|
|
? 'opacity-100'
|
|
|
|
|
: 'opacity-0 focus:opacity-100 group-focus-within:opacity-100 group-hover:opacity-100 data-[open]:opacity-100',
|
|
|
|
|
)}
|
2024-08-16 10:30:14 +02:00
|
|
|
>
|
2024-09-10 10:11:39 -09:00
|
|
|
<Ellipsis className="icon-md text-text-secondary" aria-hidden={true} />
|
2024-08-30 13:39:30 -04:00
|
|
|
</Ariakit.MenuButton>
|
2024-08-16 10:30:14 +02:00
|
|
|
}
|
|
|
|
|
items={dropdownItems}
|
2024-08-30 13:39:30 -04:00
|
|
|
menuId={menuId}
|
2024-08-16 10:30:14 +02:00
|
|
|
/>
|
|
|
|
|
{showShareDialog && (
|
|
|
|
|
<ShareButton
|
|
|
|
|
conversationId={conversationId}
|
|
|
|
|
title={title}
|
|
|
|
|
showShareDialog={showShareDialog}
|
|
|
|
|
setShowShareDialog={setShowShareDialog}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{showDeleteDialog && (
|
|
|
|
|
<DeleteButton
|
|
|
|
|
conversationId={conversationId}
|
|
|
|
|
retainView={retainView}
|
|
|
|
|
title={title}
|
|
|
|
|
showDeleteDialog={showDeleteDialog}
|
|
|
|
|
setShowDeleteDialog={setShowDeleteDialog}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|