mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 08:50:15 +01:00
* 🎨 feat: improve file display and overflow handling in SidePanel components * 🎨 feat: enhance bookmarks management UI and improve accessibility features * 🎨 feat: enhance BookmarkTable and BookmarkTableRow components for improved layout and performance * 🎨 feat: enhance file display and interaction in FilesView and ImagePreview components * 🎨 feat: adjust minimum width for filename filter input in DataTable component * 🎨 feat: enhance file upload UI with improved layout and styling adjustments * 🎨 feat: add surface-hover-alt color and update FileContainer styling for improved UI * 🎨 feat: update ImagePreview component styling for improved visual consistency * 🎨 feat: add MaximizeChatSpace component and integrate chat space maximization feature * 🎨 feat: enhance DataTable component with transition effects and update Checkbox styling for improved accessibility * fix: enhance a11y for Bookmark buttons by adding space key support, ARIA labels, and correct html role for key presses * fix: return focus back to trigger for BookmarkEditDialog (Edit and new bookmark buttons) * refactor: ShareButton and ExportModal components children prop support; refactor DropdownPopup item handling * refactor: enhance ExportAndShareMenu and ShareButton components with improved props handling and accessibility features * refactor: add ref prop support to MenuItemProps and update ExportAndShareMenu and DropdownPopup components so focus correctly returns to menu item * refactor: enhance ConvoOptions and DeleteButton components with improved props handling and accessibility features * refactor: add triggerRef support to DeleteButton and update ConvoOptions for improved dialog handling * refactor: accessible bookmarks menu * refactor: improve styling and accessibility for bookmarks components * refactor: add focusLoop support to DropdownPopup and update BookmarkMenu with Tooltip * refactor: integrate TooltipAnchor into ExportAndShareMenu for enhanced accessibility --------- Co-authored-by: Danny Avila <danny@librechat.ai>
86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
import { useCallback, useState } from 'react';
|
|
import type { FC } from 'react';
|
|
import { Label, OGDialog, OGDialogTrigger, TooltipAnchor } from '~/components/ui';
|
|
import { useDeleteConversationTagMutation } from '~/data-provider';
|
|
import OGDialogTemplate from '~/components/ui/OGDialogTemplate';
|
|
import { NotificationSeverity } from '~/common';
|
|
import { useToastContext } from '~/Providers';
|
|
import { TrashIcon } from '~/components/svg';
|
|
import { useLocalize } from '~/hooks';
|
|
|
|
const DeleteBookmarkButton: FC<{
|
|
bookmark: string;
|
|
tabIndex?: number;
|
|
onFocus?: () => void;
|
|
onBlur?: () => void;
|
|
}> = ({ bookmark, tabIndex = 0, onFocus, onBlur }) => {
|
|
const localize = useLocalize();
|
|
const { showToast } = useToastContext();
|
|
const [open, setOpen] = useState(false);
|
|
|
|
const deleteBookmarkMutation = useDeleteConversationTagMutation({
|
|
onSuccess: () => {
|
|
showToast({
|
|
message: localize('com_ui_bookmarks_delete_success'),
|
|
});
|
|
},
|
|
onError: () => {
|
|
showToast({
|
|
message: localize('com_ui_bookmarks_delete_error'),
|
|
severity: NotificationSeverity.ERROR,
|
|
});
|
|
},
|
|
});
|
|
|
|
const confirmDelete = useCallback(async () => {
|
|
await deleteBookmarkMutation.mutateAsync(bookmark);
|
|
}, [bookmark, deleteBookmarkMutation]);
|
|
|
|
const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {
|
|
if (event.key === 'Enter' || event.key === ' ') {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
setOpen(!open);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<OGDialog open={open} onOpenChange={setOpen}>
|
|
<OGDialogTrigger asChild>
|
|
<TooltipAnchor
|
|
role="button"
|
|
aria-label={localize('com_ui_bookmarks_delete')}
|
|
description={localize('com_ui_delete')}
|
|
className="flex size-7 items-center justify-center rounded-lg transition-colors duration-200 hover:bg-surface-hover"
|
|
tabIndex={tabIndex}
|
|
onFocus={onFocus}
|
|
onBlur={onBlur}
|
|
onClick={() => setOpen(!open)}
|
|
onKeyDown={handleKeyDown}
|
|
>
|
|
<TrashIcon className="size-4" />
|
|
</TooltipAnchor>
|
|
</OGDialogTrigger>
|
|
<OGDialogTemplate
|
|
showCloseButton={false}
|
|
title={localize('com_ui_bookmarks_delete')}
|
|
className="max-w-[450px]"
|
|
main={
|
|
<Label className="text-left text-sm font-medium">
|
|
{localize('com_ui_bookmark_delete_confirm')} {bookmark}
|
|
</Label>
|
|
}
|
|
selection={{
|
|
selectHandler: confirmDelete,
|
|
selectClasses:
|
|
'bg-red-700 dark:bg-red-600 hover:bg-red-800 dark:hover:bg-red-800 text-white',
|
|
selectText: localize('com_ui_delete'),
|
|
}}
|
|
/>
|
|
</OGDialog>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default DeleteBookmarkButton;
|