diff --git a/api/models/Conversation.js b/api/models/Conversation.js index 4c700425fe..2dfe8d51cd 100644 --- a/api/models/Conversation.js +++ b/api/models/Conversation.js @@ -54,11 +54,17 @@ module.exports = { throw new Error('Failed to save conversations in bulk.'); } }, - getConvosByPage: async (user, pageNumber = 1, pageSize = 25) => { + getConvosByPage: async (user, pageNumber = 1, pageSize = 25, isArchived = false) => { + const query = { user }; + if (isArchived) { + query.isArchived = true; + } else { + query.$or = [{ isArchived: false }, { isArchived: { $exists: false } }]; + } try { - const totalConvos = (await Conversation.countDocuments({ user })) || 1; + const totalConvos = (await Conversation.countDocuments(query)) || 1; const totalPages = Math.ceil(totalConvos / pageSize); - const convos = await Conversation.find({ user }) + const convos = await Conversation.find(query) .sort({ updatedAt: -1 }) .skip((pageNumber - 1) * pageSize) .limit(pageSize) diff --git a/api/models/schema/defaults.js b/api/models/schema/defaults.js index 775251d082..7e786d1c49 100644 --- a/api/models/schema/defaults.js +++ b/api/models/schema/defaults.js @@ -89,6 +89,10 @@ const conversationPreset = { type: String, }, stop: { type: [{ type: String }], default: undefined }, + isArchived: { + type: Boolean, + default: false, + }, /* UI Components */ iconURL: { type: String, diff --git a/api/server/routes/convos.js b/api/server/routes/convos.js index e478e48e5e..275f5a9755 100644 --- a/api/server/routes/convos.js +++ b/api/server/routes/convos.js @@ -24,7 +24,15 @@ router.get('/', async (req, res) => { return res.status(400).json({ error: 'Invalid page number' }); } - res.status(200).send(await getConvosByPage(req.user.id, pageNumber)); + let pageSize = req.query.pageSize || 25; + pageSize = parseInt(pageSize, 10); + + if (isNaN(pageSize) || pageSize < 1) { + return res.status(400).json({ error: 'Invalid page size' }); + } + const isArchived = req.query.isArchived === 'true'; + + res.status(200).send(await getConvosByPage(req.user.id, pageNumber, pageSize, isArchived)); }); router.get('/:conversationId', async (req, res) => { diff --git a/client/src/components/Conversations/ArchiveButton.tsx b/client/src/components/Conversations/ArchiveButton.tsx new file mode 100644 index 0000000000..ad535ca57b --- /dev/null +++ b/client/src/components/Conversations/ArchiveButton.tsx @@ -0,0 +1,81 @@ +import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '~/components/ui'; +import type { MouseEvent, FocusEvent, KeyboardEvent } from 'react'; +import { useParams } from 'react-router-dom'; + +import { useArchiveConversationMutation } from '~/data-provider'; + +import { useConversations, useLocalize, useNewConvo } from '~/hooks'; +import { useToastContext } from '~/Providers'; +import { NotificationSeverity } from '~/common'; + +type ArchiveButtonProps = { + conversationId: string; + retainView: () => void; + shouldArchive: boolean; + icon: React.ReactNode; + twcss?: string; +}; +export default function ArchiveButton({ + conversationId, + retainView, + shouldArchive, + icon, + twcss = undefined, +}: ArchiveButtonProps) { + const localize = useLocalize(); + const { newConversation } = useNewConvo(); + const { showToast } = useToastContext(); + const { refreshConversations } = useConversations(); + const { conversationId: currentConvoId } = useParams(); + + const archiveConvoMutation = useArchiveConversationMutation(conversationId); + + const label = shouldArchive ? 'archive' : 'unarchive'; + const archiveHandler = ( + e: + | MouseEvent + | FocusEvent + | KeyboardEvent, + ) => { + e.preventDefault(); + archiveConvoMutation.mutate( + { conversationId, isArchived: shouldArchive }, + { + onSuccess: () => { + if (currentConvoId === conversationId) { + newConversation(); + } + refreshConversations(); + retainView(); + }, + onError: () => { + showToast({ + message: localize(`com_ui_${label}_error`), + severity: NotificationSeverity.ERROR, + showIcon: true, + }); + }, + }, + ); + }; + const classProp: { className?: string } = { + className: 'p-1 hover:text-black dark:hover:text-white', + }; + if (twcss) { + classProp.className = twcss; + } + return ( + + ); +} diff --git a/client/src/components/Conversations/Convo.tsx b/client/src/components/Conversations/Convo.tsx index 49e2f40f4f..7e4d7092e2 100644 --- a/client/src/components/Conversations/Convo.tsx +++ b/client/src/components/Conversations/Convo.tsx @@ -13,6 +13,9 @@ import { useToastContext } from '~/Providers'; import DeleteButton from './DeleteButton'; import RenameButton from './RenameButton'; import store from '~/store'; +import EditMenuButton from './EditMenuButton'; +import ArchiveButton from './ArchiveButton'; +import { Archive } from 'lucide-react'; type KeyEvent = KeyboardEvent; @@ -183,14 +186,40 @@ export default function Conversation({ conversation, retainView, toggleNav, isLa
)} {activeConvo ? ( -
- - +
+ {!renaming && ( + +
+
+ +
+
+ +
+
+
+ )} + {!renaming && ( + } + /> + )}
) : (
diff --git a/client/src/components/Conversations/DeleteButton.tsx b/client/src/components/Conversations/DeleteButton.tsx index c664fc3818..0e30fc42cd 100644 --- a/client/src/components/Conversations/DeleteButton.tsx +++ b/client/src/components/Conversations/DeleteButton.tsx @@ -4,12 +4,27 @@ import { QueryKeys } from 'librechat-data-provider'; import { useQueryClient } from '@tanstack/react-query'; import type { TMessage } from 'librechat-data-provider'; import { useDeleteConversationMutation } from '~/data-provider'; -import { Dialog, DialogTrigger, Label } from '~/components/ui'; +import { + Dialog, + DialogTrigger, + Label, + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '~/components/ui'; import DialogTemplate from '~/components/ui/DialogTemplate'; import { TrashIcon, CrossIcon } from '~/components/svg'; import { useLocalize, useNewConvo } from '~/hooks'; -export default function DeleteButton({ conversationId, renaming, retainView, title }) { +export default function DeleteButton({ + conversationId, + renaming, + retainView, + title, + twcss, + appendLabel = false, +}) { const localize = useLocalize(); const queryClient = useQueryClient(); const { newConversation } = useNewConvo(); @@ -30,12 +45,41 @@ export default function DeleteButton({ conversationId, renaming, retainView, tit deleteConvoMutation.mutate({ conversationId, thread_id, source: 'button' }); }, [conversationId, deleteConvoMutation, queryClient]); + const classProp: { className?: string } = { + className: 'p-1 hover:text-black dark:hover:text-white', + }; + if (twcss) { + classProp.className = twcss; + } + + const renderDeleteButton = () => { + if (appendLabel) { + return ( + <> + {localize('com_ui_delete')} + + ); + } + return ( + + + + + + + + + {localize('com_ui_delete')} + + + + ); + }; + return ( - + = ({ children }: EditMenuButtonProps) => { + const localize = useLocalize(); + + return ( + + +
+ + + + + + + {localize('com_ui_more_options')} + + + +
+
+ + + {children} + + +
+ ); +}; + +export default EditMenuButton; diff --git a/client/src/components/Conversations/RenameButton.tsx b/client/src/components/Conversations/RenameButton.tsx index b18d2199fe..ddca75a964 100644 --- a/client/src/components/Conversations/RenameButton.tsx +++ b/client/src/components/Conversations/RenameButton.tsx @@ -1,11 +1,13 @@ import type { MouseEvent, ReactElement } from 'react'; import { EditIcon, CheckMark } from '~/components/svg'; +import { useLocalize } from '~/hooks'; interface RenameButtonProps { renaming: boolean; renameHandler: (e: MouseEvent) => void; onRename: (e: MouseEvent) => void; twcss?: string; + appendLabel?: boolean; } export default function RenameButton({ @@ -13,7 +15,9 @@ export default function RenameButton({ renameHandler, onRename, twcss, + appendLabel = false, }: RenameButtonProps): ReactElement { + const localize = useLocalize(); const handler = renaming ? onRename : renameHandler; const classProp: { className?: string } = { className: 'p-1 hover:text-black dark:hover:text-white', @@ -23,7 +27,15 @@ export default function RenameButton({ } return ( ); } diff --git a/client/src/components/Nav/Nav.tsx b/client/src/components/Nav/Nav.tsx index 813ac9ea35..f096622eca 100644 --- a/client/src/components/Nav/Nav.tsx +++ b/client/src/components/Nav/Nav.tsx @@ -58,12 +58,12 @@ const Nav = ({ navVisible, setNavVisible }) => { const setSearchResultMessages = useSetRecoilState(store.searchResultMessages); const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useConversationsInfiniteQuery( - { pageNumber: pageNumber.toString() }, + { pageNumber: pageNumber.toString(), isArchived: false }, { enabled: isAuthenticated }, ); const searchQueryRes = useSearchInfiniteQuery( - { pageNumber: pageNumber.toString(), searchQuery: searchQuery }, + { pageNumber: pageNumber.toString(), searchQuery: searchQuery, isArchived: false }, { enabled: isAuthenticated && !!searchQuery.length }, ); diff --git a/client/src/components/Nav/SettingsTabs/General/ArchivedChats.tsx b/client/src/components/Nav/SettingsTabs/General/ArchivedChats.tsx new file mode 100644 index 0000000000..d033e0ddb5 --- /dev/null +++ b/client/src/components/Nav/SettingsTabs/General/ArchivedChats.tsx @@ -0,0 +1,29 @@ +import { useLocalize } from '~/hooks'; +import { Dialog, DialogTrigger } from '~/components/ui'; +import DialogTemplate from '~/components/ui/DialogTemplate'; + +import ArchivedChatsTable from './ArchivedChatsTable'; + +export default function ArchivedChats() { + const localize = useLocalize(); + + return ( +
+
{localize('com_nav_archived_chats')}
+ + + + + + } + /> + +
+ ); +} diff --git a/client/src/components/Nav/SettingsTabs/General/ArchivedChatsTable.tsx b/client/src/components/Nav/SettingsTabs/General/ArchivedChatsTable.tsx new file mode 100644 index 0000000000..ea87a539d9 --- /dev/null +++ b/client/src/components/Nav/SettingsTabs/General/ArchivedChatsTable.tsx @@ -0,0 +1,112 @@ +import { useAuthContext, useLocalize, useNavScrolling } from '~/hooks'; +import { MessageCircle, ArchiveRestore, Archive } from 'lucide-react'; +import { useMemo, useState } from 'react'; +import { useConversationsInfiniteQuery } from '~/data-provider'; +import DeleteButton from '~/components/Conversations/DeleteButton'; +import { cn } from '~/utils'; +import { Spinner } from '~/components'; +import ArchiveButton from '~/components/Conversations/ArchiveButton'; + +export default function ArchivedChatsTable({ className }: { className?: string }) { + const localize = useLocalize(); + const { isAuthenticated } = useAuthContext(); + const [showLoading, setShowLoading] = useState(false); + + const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useConversationsInfiniteQuery( + { pageNumber: '1', isArchived: true }, + { enabled: isAuthenticated }, + ); + + const { containerRef, moveToTop } = useNavScrolling({ + setShowLoading, + hasNextPage: hasNextPage, + fetchNextPage: fetchNextPage, + isFetchingNextPage: isFetchingNextPage, + }); + + const conversations = useMemo( + () => data?.pages.flatMap((page) => page.conversations) || [], + [data], + ); + + const classProp: { className?: string } = { + className: 'p-1 hover:text-black dark:hover:text-white', + }; + if (className) { + classProp.className = className; + } + + if (!conversations || conversations.length === 0) { + return
{localize('com_nav_archived_chats_empty')}
; + } + + return ( +
+ + + + + + + + + {conversations.map((conversation) => ( + + + + + ))} + +
{localize('com_nav_archive_name')}{localize('com_nav_archive_created_at')}
+ + {conversation.title} + +
+
+ {new Date(conversation.createdAt).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric', + })} +
+
+ {conversation.conversationId && ( + <> + } + /> + +
+ +
+ + )} +
+
+
+ {(isFetchingNextPage || showLoading) && ( + + )} +
+ ); +} diff --git a/client/src/components/Nav/SettingsTabs/General/General.tsx b/client/src/components/Nav/SettingsTabs/General/General.tsx index 8c09cdf3d9..2c3cb643e8 100644 --- a/client/src/components/Nav/SettingsTabs/General/General.tsx +++ b/client/src/components/Nav/SettingsTabs/General/General.tsx @@ -9,6 +9,7 @@ import AutoScrollSwitch from './AutoScrollSwitch'; import { Dropdown } from '~/components/ui'; import DangerButton from '../DangerButton'; import store from '~/store'; +import ArchivedChats from './ArchivedChats'; export const ThemeSelector = ({ theme, @@ -157,6 +158,9 @@ function General() {
+
+ +
{/*
*/}
diff --git a/client/src/components/svg/DotsIcon.tsx b/client/src/components/svg/DotsIcon.tsx index 6afff1ae30..731c9be8a9 100644 --- a/client/src/components/svg/DotsIcon.tsx +++ b/client/src/components/svg/DotsIcon.tsx @@ -1,6 +1,10 @@ import React from 'react'; -export default function DotsIcon() { +export default function DotsIcon({ + className = 'h-4 w-4 flex-shrink-0 text-gray-500', +}: { + className?: string; +}) { return ( ) => { @@ -40,6 +41,7 @@ const DialogTemplate = forwardRef((props: DialogTemplateProps, ref: Ref
{leftButtons ? leftButtons : null}
- - {Cancel} - + {showCancelButton && ( + + {Cancel} + + )} {buttons ? buttons : null} {selection ? ( => { + const queryClient = useQueryClient(); + return useMutation( + (payload: t.TArchiveConversationRequest) => dataService.archiveConversation(payload), + { + onSuccess: (_data, vars) => { + if (vars.isArchived) { + queryClient.setQueryData([QueryKeys.conversation, id], null); + } else { + queryClient.setQueryData([QueryKeys.conversation, id], _data); + } + + queryClient.setQueryData([QueryKeys.allConversations], (convoData) => { + if (!convoData) { + return convoData; + } + if (vars.isArchived) { + return deleteConversation(convoData, id as string); + } else { + return addConversation(convoData, _data); + } + }); + queryClient.setQueryData( + [QueryKeys.archivedConversations], + (convoData) => { + if (!convoData) { + return convoData; + } + if (vars.isArchived) { + return addConversation(convoData, _data); + } else { + return deleteConversation(convoData, id as string); + } + }, + ); + }, + }, + ); +}; + export const useDeleteConversationMutation = ( options?: t.DeleteConversationOptions, ): UseMutationResult< @@ -87,14 +134,20 @@ export const useDeleteConversationMutation = ( if (!vars.conversationId) { return; } - queryClient.setQueryData([QueryKeys.conversation, vars.conversationId], null); - queryClient.setQueryData([QueryKeys.allConversations], (convoData) => { + + const handleDelete = (convoData) => { if (!convoData) { return convoData; } - const update = deleteConversation(convoData, vars.conversationId as string); - return update; - }); + return deleteConversation(convoData, vars.conversationId as string); + }; + + queryClient.setQueryData([QueryKeys.conversation, vars.conversationId], null); + queryClient.setQueryData([QueryKeys.allConversations], handleDelete); + queryClient.setQueryData( + [QueryKeys.archivedConversations], + handleDelete, + ); onSuccess?.(_data, vars, context); }, ...(_options || {}), diff --git a/client/src/data-provider/queries.ts b/client/src/data-provider/queries.ts index 7de2d9c2de..feb8b9227e 100644 --- a/client/src/data-provider/queries.ts +++ b/client/src/data-provider/queries.ts @@ -136,9 +136,13 @@ export const useConversationsInfiniteQuery = ( config?: UseInfiniteQueryOptions, ) => { return useInfiniteQuery( - [QueryKeys.allConversations], + params?.isArchived ? [QueryKeys.archivedConversations] : [QueryKeys.allConversations], ({ pageParam = '' }) => - dataService.listConversations({ ...params, pageNumber: pageParam?.toString() }), + dataService.listConversations({ + ...params, + pageNumber: pageParam?.toString(), + isArchived: params?.isArchived || false, + }), { getNextPageParam: (lastPage) => { const currentPageNumber = Number(lastPage.pageNumber); diff --git a/client/src/localization/languages/Ar.ts b/client/src/localization/languages/Ar.ts index 8488d503e5..0c853f9353 100644 --- a/client/src/localization/languages/Ar.ts +++ b/client/src/localization/languages/Ar.ts @@ -54,6 +54,12 @@ export default { com_ui_delete: 'حذف', com_ui_delete_conversation: 'حذف الدردشة؟', com_ui_delete_conversation_confirm: 'سيتم حذف هذا', + com_ui_rename: 'إعادة تسمية', + com_ui_archive: 'أرشفة', + com_ui_archive_error: 'فشل في أرشفة المحادثة', + com_ui_unarchive: 'إلغاء الأرشفة', + com_ui_unarchive_error: 'فشل في إلغاء الأرشفة', + com_ui_more_options: 'المزيد', com_auth_error_login: 'تعذر تسجيل الدخول باستخدام المعلومات المقدمة. يرجى التحقق من بيانات الاعتماد الخاصة بك والمحاولة مرة أخرى.', com_auth_error_login_rl: @@ -258,6 +264,13 @@ export default { com_nav_open_sidebar: 'افتح القائمة الجانبية', com_nav_log_out: 'تسجيل الخروج', com_nav_user: 'المستخدم', + com_nav_archived_chats: 'الدردشات المؤرشفة', + com_nav_archived_chats_manage: 'إدارة', + com_nav_archived_chats_empty: 'ليس لديك أي دردشات مؤرشفة.', + com_nav_archive_all_chats: 'الأرشفة على كل الدردشات', + com_nav_archive_all: 'الأرشفة على كل الدردشات', + com_nav_archive_name: 'الاسم', + com_nav_archive_created_at: 'تاريخ الإنشاء', com_nav_clear_conversation: 'مسح المحادثات', com_nav_clear_conversation_confirm_message: 'هل أنت متأكد أنك تريد مسح جميع المحادثات؟ هذا لا يمكن التراجع عنه.', diff --git a/client/src/localization/languages/Br.ts b/client/src/localization/languages/Br.ts index 9b4faaac6a..1765c22a7b 100644 --- a/client/src/localization/languages/Br.ts +++ b/client/src/localization/languages/Br.ts @@ -139,6 +139,12 @@ export default { com_ui_delete_conversation_confirm: 'Isso excluirá', com_ui_delete_assistant_confirm: 'Tem certeza de que deseja excluir este Assistente? Esta ação não pode ser desfeita.', + com_ui_rename: 'Renomear', + com_ui_archive: 'Arquivar', + com_ui_archive_error: 'Ocorreu um erro ao arquivar a conversa.', + com_ui_unarchive: 'Desarquivar', + com_ui_unarchive_error: 'Ocorreu um erro ao desarquivar a conversa.', + com_ui_more_options: 'Mais', com_ui_preview: 'Visualizar', com_ui_upload: 'Carregar', com_ui_connect: 'Conectar', @@ -425,6 +431,13 @@ export default { com_nav_send_message: 'Enviar mensagem', com_nav_log_out: 'Sair', com_nav_user: 'USUÁRIO', + com_nav_archived_chats: 'Conversas Arquivadas', + com_nav_archived_chats_manage: 'Gerenciar', + com_nav_archived_chats_empty: 'Você não tem nenhuma conversa arquivada.', + com_nav_archive_all_chats: 'Arquivar todas as conversas', + com_nav_archive_all: 'Arquivar todas', + com_nav_archive_name: 'Nome', + com_nav_archive_created_at: 'CriadoEm', com_nav_clear_conversation: 'Limpar conversas', com_nav_clear_conversation_confirm_message: 'Tem certeza de que deseja limpar todas as conversas? Isso é irreversível.', diff --git a/client/src/localization/languages/De.ts b/client/src/localization/languages/De.ts index 14ea051d05..79545fb34a 100644 --- a/client/src/localization/languages/De.ts +++ b/client/src/localization/languages/De.ts @@ -36,19 +36,23 @@ export default { com_assistants_domain_info: 'Assistent hat diese Info an {0} gesendet', com_assistants_delete_actions_success: 'Aktion vom Assistant erfolgreich gelöscht', com_assistants_update_actions_success: 'Erfolgreich erstellte oder aktualisierte Aktion', - com_assistants_update_actions_error: 'Beim Erstellen oder Aktualisieren der Aktion ist ein Fehler aufgetreten.', + com_assistants_update_actions_error: + 'Beim Erstellen oder Aktualisieren der Aktion ist ein Fehler aufgetreten.', com_assistants_delete_actions_error: 'Beim Löschen der Aktion ist ein Fehler aufgetreten.', - com_assistants_actions_info: 'Lass deinen Assistenten Informationen abrufen oder Aktionen über API\'s ausführen', + com_assistants_actions_info: + 'Lass deinen Assistenten Informationen abrufen oder Aktionen über API\'s ausführen', com_assistants_name_placeholder: 'Optional: Der Name des Assistenten', com_assistants_instructions_placeholder: 'Die Systemanweisungen, die der Assistent verwendet', com_assistants_description_placeholder: 'Optional: Beschreibe hier deinen Assistenten', - com_assistants_actions_disabled: 'Du musst einen Assistenten erstellen, bevor du Aktionen hinzufügen kannst.', + com_assistants_actions_disabled: + 'Du musst einen Assistenten erstellen, bevor du Aktionen hinzufügen kannst.', com_assistants_update_success: 'Erfolgreich aktualisiert', com_assistants_update_error: 'Beim Aktualisieren deines Assistenten ist ein Fehler aufgetreten.', com_assistants_create_success: 'Erfolgreich erstellt', com_assistants_create_error: 'Bei der Erstellung deines Assistenten ist ein Fehler aufgetreten.', com_ui_field_required: 'Dieses Feld ist erforderlich', - com_ui_download_error: 'Fehler beim Herunterladen der Datei. Die Datei wurde möglicherweise gelöscht.', + com_ui_download_error: + 'Fehler beim Herunterladen der Datei. Die Datei wurde möglicherweise gelöscht.', com_ui_attach_error_type: 'Nicht unterstützter Dateityp für Endpunkt:', com_ui_attach_error_size: 'Dateigrößenlimit für den Endpunkt überschritten:', com_ui_attach_error: @@ -57,10 +61,12 @@ export default { com_ui_new_chat: 'Neuer Chat', com_ui_happy_birthday: 'Es ist mein 1. Geburtstag!', com_ui_example_quantum_computing: 'Erkläre Quantencomputing in einfachen Worten', - com_ui_example_10_year_old_b_day: 'Hast du eine kreative Idee für den Geburtstag eines 10-Jährigen?', + com_ui_example_10_year_old_b_day: + 'Hast du eine kreative Idee für den Geburtstag eines 10-Jährigen?', com_ui_example_http_in_js: 'Wie stelle ich eine HTTP-Anfrage in Javascript?', com_ui_capabilities: 'Funktionen', - com_ui_capability_remember: 'Erinnert sich daran, was der Benutzer zu einem früheren Zeitpunkt in der Konversation gesagt hat', + com_ui_capability_remember: + 'Erinnert sich daran, was der Benutzer zu einem früheren Zeitpunkt in der Konversation gesagt hat', com_ui_capability_correction: 'Ermöglicht es dem Benutzer, nachträgliche Korrekturen vorzunehmen', com_ui_capability_decline_requests: 'Ermöglicht es, unangemessene Anfragen abzulehnen', com_ui_limitations: 'Limitationen', @@ -110,7 +116,8 @@ export default { com_ui_submit: 'Abschicken', com_ui_upload_success: 'Erfolgreich hochgeladene Datei', com_ui_upload_error: 'Beim Hochladen deiner Datei ist ein Fehler aufgetreten', - com_ui_upload_invalid: 'Ungültige Datei zum Hochladen. Muss ein Bild sein, das nicht größer als 2 MB ist', + com_ui_upload_invalid: + 'Ungültige Datei zum Hochladen. Muss ein Bild sein, das nicht größer als 2 MB ist', com_ui_cancel: 'Abbrechen', com_ui_save: 'Speichern', com_ui_save_submit: 'Speichern & Absenden', @@ -145,6 +152,12 @@ export default { com_ui_delete_conversation_confirm: 'Damit wird gelöscht', com_ui_delete_assistant_confirm: 'Bist du sicher, dass du diesen Assistenten löschen willst? Dies kann nicht rückgängig gemacht werden.', + com_ui_rename: 'Umbenennen', + com_ui_archive: 'Archiv', + com_ui_archive_error: 'Fehler beim Archivieren der Konversation', + com_ui_unarchive: 'Entarchivieren', + com_ui_unarchive_error: 'Fehler beim Entarchivieren der Konversation', + com_ui_more_options: 'Mehr', com_ui_preview: 'Vorschau', com_ui_upload: 'Hochladen', com_ui_connect: 'Verbinden', @@ -240,7 +253,8 @@ export default { com_endpoint_google_maxoutputtokens: ' Maximale Anzahl von Token, die in der Antwort erzeugt werden können. Gib einen niedrigeren Wert für kürzere Antworten und einen höheren Wert für längere Antworten an.', com_endpoint_google_custom_name_placeholder: 'Setze einen benutzerdefinierten Namen für Google', - com_endpoint_prompt_prefix_placeholder: 'Setze benutzerdefinierte Anweisungen oder Kontext. Ignoriert, wenn leer.', + com_endpoint_prompt_prefix_placeholder: + 'Setze benutzerdefinierte Anweisungen oder Kontext. Ignoriert, wenn leer.', com_endpoint_instructions_assistants_placeholder: 'Setzt die Anweisungen des Assistenten außer Kraft. Dies ist nützlich, um das Verhalten pro Lauf zu ändern.', com_endpoint_prompt_prefix_assistants_placeholder: @@ -294,13 +308,18 @@ export default { com_endpoint_plug_set_custom_instructions_for_gpt_placeholder: 'Setzt benutzerdefinierte Anweisungen, die in die Systemaufforderung aufgenommen werden. Standard: keine', com_endpoint_import: 'Importieren', - com_endpoint_set_custom_name: 'Lege einen benutzerdefinierten Namen fest, für den Fall, dass du diese Vorgabe finden kannst', + com_endpoint_set_custom_name: + 'Lege einen benutzerdefinierten Namen fest, für den Fall, dass du diese Vorgabe finden kannst', com_endpoint_preset_delete_confirm: 'Bist du sicher, dass du diese Vorgabe löschen willst?', - com_endpoint_preset_clear_all_confirm: 'Bist du sicher, dass du alle deine Voreinstellungen löschen willst?', + com_endpoint_preset_clear_all_confirm: + 'Bist du sicher, dass du alle deine Voreinstellungen löschen willst?', com_endpoint_preset_import: 'Voreinstellung importiert!', - com_endpoint_preset_import_error: 'Beim Import deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es erneut.', - com_endpoint_preset_save_error: 'Es ist ein Fehler beim Speichern deiner Voreinstellung aufgetreten. Bitte versuche es noch einmal.', - com_endpoint_preset_delete_error: 'Beim Löschen deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.', + com_endpoint_preset_import_error: + 'Beim Import deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es erneut.', + com_endpoint_preset_save_error: + 'Es ist ein Fehler beim Speichern deiner Voreinstellung aufgetreten. Bitte versuche es noch einmal.', + com_endpoint_preset_delete_error: + 'Beim Löschen deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.', com_endpoint_preset_default_removed: 'ist nicht mehr die Standardvorgabe.', com_endpoint_preset_default_item: 'Standard:', com_endpoint_preset_default_none: 'Keine Standardvoreinstellung aktiv.', @@ -328,7 +347,8 @@ export default { com_endpoint_presets_clear_warning: 'Bist du sicher, dass du alle Voreinstellungen löschen willst? Dies ist nicht umkehrbar.', com_endpoint_not_implemented: 'Nicht implementiert', - com_endpoint_no_presets: 'Es gibt noch keine Voreinstellungen, verwende die Schaltfläche Einstellungen, um eine zu erstellen', + com_endpoint_no_presets: + 'Es gibt noch keine Voreinstellungen, verwende die Schaltfläche Einstellungen, um eine zu erstellen', com_endpoint_not_available: 'Kein Endpunkt verfügbar', com_endpoint_view_options: 'Ansichtsoptionen', com_endpoint_save_convo_as_preset: 'Konversation als Voreinstellung speichern', @@ -339,7 +359,8 @@ export default { com_endpoint_skip_hover: 'Aktiviere das Überspringen des Abschlussschritts, der die endgültige Antwort und die generierten Schritte überprüft', com_endpoint_config_key: 'API-Schlüssel festlegen', - com_endpoint_assistant_placeholder: 'Bitte wähle einen Assistenten aus dem rechter Seitenleiste aus', + com_endpoint_assistant_placeholder: + 'Bitte wähle einen Assistenten aus dem rechter Seitenleiste aus', com_endpoint_config_placeholder: 'Setze deinen Schlüssel im Header-Menü ein, um zu chatten.', com_endpoint_config_key_for: 'Setze den API-Schlüssel für', com_endpoint_config_key_name: 'Schlüssel', @@ -352,17 +373,22 @@ export default { com_endpoint_config_google_cloud_platform: '(von Google Cloud Platform)', com_endpoint_config_google_api_key: 'Google API Key', com_endpoint_config_google_gemini_api: '(Gemini API)', - com_endpoint_config_google_api_info: 'Um deinen Generative Language API-Schlüssel (für Gemini) zu erhalten,', + com_endpoint_config_google_api_info: + 'Um deinen Generative Language API-Schlüssel (für Gemini) zu erhalten,', com_endpoint_config_key_import_json_key: 'Import Service Account JSON Key.', - com_endpoint_config_key_import_json_key_success: 'Erfolgreich importierter Service Account JSON Key', + com_endpoint_config_key_import_json_key_success: + 'Erfolgreich importierter Service Account JSON Key', com_endpoint_config_key_import_json_key_invalid: 'Ungültiger Service Account JSON Key, Hast du die richtige Datei importiert?', - com_endpoint_config_key_get_edge_key: 'Um dein Access Token für Bing zu erhalten, melde dich an bei', + com_endpoint_config_key_get_edge_key: + 'Um dein Access Token für Bing zu erhalten, melde dich an bei', com_endpoint_config_key_get_edge_key_dev_tool: 'Verwende Dev-Tools oder eine Erweiterung, während du auf der Website angemeldet bist, um den Inhalt des _U-Cookies zu kopieren. Wenn dies fehlschlägt, befolge die folgenden Anweisungen', com_endpoint_config_key_edge_instructions: 'Anweisungen', - com_endpoint_config_key_edge_full_key_string: 'um die vollständigen Cookie-Strings bereitzustellen.', - com_endpoint_config_key_chatgpt: 'Um dein Zugangstoken für ChatGPT \'Free Version\' zu erhalten, melde dich bei', + com_endpoint_config_key_edge_full_key_string: + 'um die vollständigen Cookie-Strings bereitzustellen.', + com_endpoint_config_key_chatgpt: + 'Um dein Zugangstoken für ChatGPT \'Free Version\' zu erhalten, melde dich bei', com_endpoint_config_key_chatgpt_then_visit: 'dann besuche', com_endpoint_config_key_chatgpt_copy_token: 'Kopiere das Zugangstoken.', com_endpoint_config_key_google_need_to: 'Du musst', @@ -385,7 +411,8 @@ export default { com_nav_tool_add: 'Hinzufügen', com_nav_tool_remove: 'Löschen', com_nav_tool_dialog: 'Assistententools', - com_nav_tool_dialog_description: 'Der Assistent muss gespeichert werden, um die Werkzeugauswahl beizubehalten.', + com_nav_tool_dialog_description: + 'Der Assistent muss gespeichert werden, um die Werkzeugauswahl beizubehalten.', com_show_agent_settings: 'Agent-Einstellungen anzeigen', com_show_completion_settings: 'Fertigstellungseinstellungen anzeigen', com_hide_examples: 'Beispiele ausblenden', @@ -418,6 +445,13 @@ export default { com_nav_send_message: 'Nachricht senden', com_nav_log_out: 'Abmelden', com_nav_user: 'NUTZER', + com_nav_archived_chats: 'Archivierte Chats', + com_nav_archived_chats_manage: 'Verwalten', + com_nav_archived_chats_empty: 'Keine archivierten Chats', + com_nav_archive_all_chats: 'Alle Chats archivieren', + com_nav_archive_all: 'Archivieren', + com_nav_archive_name: 'Name', + com_nav_archive_created_at: 'ErstelltAm', com_nav_clear_conversation: 'Unterhaltungen löschen', com_nav_clear_conversation_confirm_message: 'Bist du sicher, dass du alle Unterhaltungen löschen willst? Dies ist unumkehrbar.', @@ -429,4 +463,4 @@ export default { com_nav_setting_data: 'Datenkontrollen', com_nav_setting_account: 'Konto', com_nav_language: 'Sprache', -}; \ No newline at end of file +}; diff --git a/client/src/localization/languages/Eng.ts b/client/src/localization/languages/Eng.ts index 792a7ecb64..6bdd2257a5 100644 --- a/client/src/localization/languages/Eng.ts +++ b/client/src/localization/languages/Eng.ts @@ -183,6 +183,12 @@ export default { com_ui_delete_conversation_confirm: 'This will delete', com_ui_delete_assistant_confirm: 'Are you sure you want to delete this Assistant? This cannot be undone.', + com_ui_rename: 'Rename', + com_ui_archive: 'Archive', + com_ui_archive_error: 'Failed to archive conversation', + com_ui_unarchive: 'Unarchive', + com_ui_unarchive_error: 'Failed to unarchive conversation', + com_ui_more_options: 'More', com_ui_preview: 'Preview', com_ui_upload: 'Upload', com_ui_connect: 'Connect', @@ -463,6 +469,13 @@ export default { com_nav_send_message: 'Send message', com_nav_log_out: 'Log out', com_nav_user: 'USER', + com_nav_archived_chats: 'Archived chats', + com_nav_archived_chats_manage: 'Manage', + com_nav_archived_chats_empty: 'You have no archived conversations.', + com_nav_archive_all_chats: 'Archive all chats', + com_nav_archive_all: 'Archive all', + com_nav_archive_name: 'Name', + com_nav_archive_created_at: 'DateCreated', com_nav_clear_conversation: 'Clear conversations', com_nav_clear_conversation_confirm_message: 'Are you sure you want to clear all conversations? This is irreversible.', diff --git a/client/src/localization/languages/Es.ts b/client/src/localization/languages/Es.ts index 19e87ba540..01b423745d 100644 --- a/client/src/localization/languages/Es.ts +++ b/client/src/localization/languages/Es.ts @@ -141,6 +141,12 @@ export default { com_ui_delete_conversation_confirm: 'Esto eliminará', com_ui_delete_assistant_confirm: '¿Está seguro de que desea eliminar este Asistente? Esta acción no se puede deshacer.', + com_ui_rename: 'Renombrar', + com_ui_archive: 'Archivar', + com_ui_archive_error: 'Error al archivar la conversación', + com_ui_unarchive: 'Desarchivar', + com_ui_unarchive_error: 'Error al desarchivar la conversación', + com_ui_more_options: 'Más', com_ui_preview: 'Previsualizar', com_ui_upload: 'Subir', com_ui_connect: 'Conectar', @@ -431,6 +437,13 @@ export default { com_nav_send_message: 'Enviar mensaje', com_nav_log_out: 'Cerrar sesión', com_nav_user: 'USUARIO', + com_nav_archived_chats: 'Archivadas', + com_nav_archived_chats_manage: 'Gestionar', + com_nav_archived_chats_empty: 'No tienes conversaciones archivadas.', + com_nav_archive_all_chats: 'Archivar todas las conversaciones', + com_nav_archive_all: 'Archivar todas', + com_nav_archive_name: 'Nombre', + com_nav_archive_created_at: 'CreadoEn', com_nav_clear_conversation: 'Borrar conversaciones', com_nav_clear_conversation_confirm_message: '¿Estás seguro de que quieres borrar todas las conversaciones? Esta acción es irreversible.', diff --git a/client/src/localization/languages/Fr.ts b/client/src/localization/languages/Fr.ts index 56a6a3aef8..a2a99c1884 100644 --- a/client/src/localization/languages/Fr.ts +++ b/client/src/localization/languages/Fr.ts @@ -68,6 +68,12 @@ export default { com_ui_delete: 'Supprimer', com_ui_delete_conversation: 'Supprimer la discussions?', com_ui_delete_conversation_confirm: 'Cela supprimera', + com_ui_rename: 'Renombrar', + com_ui_archive: 'Archiver', + com_ui_archive_error: 'échec de l\'archivage de la conversation', + com_ui_unarchive: 'Désarchiver', + com_ui_unarchive_error: 'Échec de la désarchivage de la conversation', + com_ui_more_options: 'Plus', com_ui_preview: 'Aperçu', com_ui_upload: 'Téléverser', com_ui_connect: 'Connecter', @@ -324,6 +330,12 @@ export default { com_nav_send_message: 'Envoyer un message', com_nav_log_out: 'Se déconnecter', com_nav_user: 'UTILISATEUR', + com_nav_archived_chats: 'Conversations archivées', + com_nav_archived_chats_manage: 'Gérer', + com_nav_archive_all_chats: 'Archiver toutes les conversations', + com_nav_archive_all: 'Archiver tout', + com_nav_archive_name: 'Nom', + com_nav_archive_created_at: 'CréééLe', com_nav_clear_conversation: 'Effacer les conversations', com_nav_clear_conversation_confirm_message: 'Êtes-vous sûr de vouloir effacer toutes les conversations ? Ceci est irréversible.', diff --git a/client/src/localization/languages/He.ts b/client/src/localization/languages/He.ts index c8a16c6b06..849a4f96c6 100644 --- a/client/src/localization/languages/He.ts +++ b/client/src/localization/languages/He.ts @@ -95,6 +95,12 @@ export default { com_ui_delete_conversation_confirm: 'זה ימחק', com_ui_delete_assistant_confirm: 'האם אתה בטוח שאתה רוצה למחוק את הסייען הזה? אי אפשר לבטל את זה.', + com_ui_rename: 'שם מחדש', + com_ui_archive: 'ארכיון', + com_ui_archive_error: 'אירעה שגיאה בארכיון השיחה', + com_ui_unarchive: 'לארכיון', + com_ui_unarchive_error: 'אירעה שגיאה בארכיון השיחה', + com_ui_more_options: 'עוד', _ui_preview: 'תצוגה מקדימה', com_ui_upload: 'העלה', com_ui_connect: 'התחבר', @@ -351,6 +357,13 @@ export default { com_nav_send_message: 'שלח הודעה', com_nav_log_out: 'צא', com_nav_user: 'USER', + com_nav_archived_chats: 'שיחות מארכיון', + com_nav_archived_chats_manage: 'ניהול', + com_nav_archived_chats_empty: 'אין שיחות מארכיון.', + com_nav_archive_all_chats: 'ארכין כל השיחות', + com_nav_archive_all: 'ארכין כל', + com_nav_archive_name: 'שם', + com_nav_archive_created_at: 'תאריך יצרן', com_nav_clear_conversation: 'נקה שיחות', com_nav_clear_conversation_confirm_message: 'אתה בטוח שאתה רוצה לנקות את כל השיחות? זה בלתי הפיך.', diff --git a/client/src/localization/languages/Id.ts b/client/src/localization/languages/Id.ts index d86f95885b..39e61ce7fd 100644 --- a/client/src/localization/languages/Id.ts +++ b/client/src/localization/languages/Id.ts @@ -64,6 +64,12 @@ export default { com_ui_delete: 'Hapus', com_ui_delete_conversation: 'Hapus chat?', com_ui_delete_conversation_confirm: 'Ini akan menghapus', + com_ui_rename: 'Renombrar', + com_ui_archive: 'Arsip', + com_ui_archive_error: 'Gagal mengarsipkan percakapan', + com_ui_unarchive: 'Buka Arsip', + com_ui_unarchive_error: 'Gagal membuka arsip', + com_ui_more_options: 'Lebih', com_ui_preview: 'Pratinjau', com_ui_upload: 'Unggah', com_ui_connect: 'Hubungkan', @@ -310,6 +316,13 @@ export default { com_nav_send_message: 'Kirim pesan', com_nav_log_out: 'Keluar', com_nav_user: 'PENGGUNA', + com_nav_archived_chats: 'Percakapan Arsip', + com_nav_archived_chats_manage: 'Pengelolaan', + com_nav_archived_chats_empty: 'Tidak ada percakapan yang diarsipkan.', + com_nav_archive_all_chats: 'Arsipkan semua percakapan', + com_nav_archive_all: 'Arsipkan semua', + com_nav_archive_name: 'Nama', + com_nav_archive_created_at: 'TanggalDibuat', com_nav_clear_conversation: 'Hapus percakapan', com_nav_clear_conversation_confirm_message: 'Anda yakin ingin menghapus semua percakapan? Ini tidak dapat dibatalkan.', diff --git a/client/src/localization/languages/It.ts b/client/src/localization/languages/It.ts index 8ec6d6b7d9..522782bdfc 100644 --- a/client/src/localization/languages/It.ts +++ b/client/src/localization/languages/It.ts @@ -190,6 +190,12 @@ export default { com_ui_create: 'Crea', com_ui_delete_conversation: 'Eliminare la chat?', com_ui_delete_conversation_confirm: 'Questo eliminerà', + com_ui_rename: 'Rinominare', + com_ui_archive: 'Arsip', + com_ui_archive_error: 'Errore durante l\'archiviazione della conversazione', + com_ui_unarchive: 'Disarchivia', + com_ui_unarchive_error: 'Impossibile disarchiviare la conversazione', + com_ui_more_options: 'Pi', com_ui_delete_assistant_confirm: 'Sei sicuro di voler eliminare questo Assistente? Questa operazione non può essere annullata.', com_ui_preview: 'Anteprima', @@ -484,6 +490,13 @@ export default { com_nav_send_message: 'Invia messaggio', com_nav_log_out: 'Disconnetti', com_nav_user: 'UTENTE', + com_nav_archived_chats: 'Chat archiviate', + com_nav_archived_chats_manage: 'Gestisci', + com_nav_archived_chats_empty: 'Non hai chat archiviate.', + com_nav_archive_all_chats: 'Archivia tutte le chat', + com_nav_archive_all: 'Archivia tutto', + com_nav_archive_name: 'Nome', + com_nav_archive_created_at: 'DateCreated', com_nav_clear_conversation: 'Cancella conversazioni', com_nav_clear_conversation_confirm_message: 'Sei sicuro di voler cancellare tutte le conversazioni? Questa azione è irreversibile.', diff --git a/client/src/localization/languages/Jp.ts b/client/src/localization/languages/Jp.ts index 27454691ed..d6bc148de4 100644 --- a/client/src/localization/languages/Jp.ts +++ b/client/src/localization/languages/Jp.ts @@ -26,8 +26,7 @@ export default { 'ファイルをナレッジとしてアップロードする前に、アシスタントを作成し、Code InterpreterまたはRetrievalを有効にして保存する必要があります。', com_assistants_image_vision: 'Image Vision', com_assistants_code_interpreter: 'Code Interpreter', - com_assistants_code_interpreter_files: - '次のファイルはCode Interpreterでのみ使用できます。', + com_assistants_code_interpreter_files: '次のファイルはCode Interpreterでのみ使用できます。', com_assistants_retrieval: 'Retrieval', com_assistants_search_name: 'Assistantの名前で検索', com_assistants_tools: 'Tools', @@ -44,7 +43,8 @@ export default { com_assistants_update_actions_success: 'アクションが作成または更新されました', com_assistants_update_actions_error: 'アクションの作成または更新中にエラーが発生しました。', com_assistants_delete_actions_error: 'アクションの削除中にエラーが発生しました。', - com_assistants_actions_info: 'アシスタントが API を介して情報を取得したり、アクションを実行したりできるようにします\'s', + com_assistants_actions_info: + 'アシスタントが API を介して情報を取得したり、アクションを実行したりできるようにします\'s', com_assistants_name_placeholder: 'オプション: アシスタントの名前', com_assistants_instructions_placeholder: 'アシスタントが使用するシステム指示', com_assistants_description_placeholder: 'オプション: ここにアシスタントについて説明します', @@ -54,7 +54,8 @@ export default { com_assistants_create_success: 'アシスタントが正常に作成されました。', com_assistants_create_error: 'アシスタントの作成中にエラーが発生しました。', com_ui_field_required: '必須入力項目です', - com_ui_download_error: 'ファイルのダウンロード中にエラーが発生しました。ファイルが削除された可能性があります。', + com_ui_download_error: + 'ファイルのダウンロード中にエラーが発生しました。ファイルが削除された可能性があります。', com_ui_attach_error_type: 'エンドポイントでサポートされていないファイル タイプ:', com_ui_attach_error_size: 'エンドポイントのファイル サイズ制限を超えました:', com_ui_attach_error: @@ -148,8 +149,13 @@ export default { com_ui_create: '作成', com_ui_delete_conversation: 'チャットを削除しますか?', com_ui_delete_conversation_confirm: 'このチャットは削除されます。', - com_ui_delete_assistant_confirm: - 'このアシスタントを削除しますか? この操作は元に戻せません。', + com_ui_delete_assistant_confirm: 'このアシスタントを削除しますか? この操作は元に戻せません。', + com_ui_rename: 'タイトル変更', + com_ui_archive: 'アーカイブ', + com_ui_archive_error: 'アーカイブに失敗しました。', + com_ui_unarchive: 'アーカイブ解除', + com_ui_unarchive_error: 'アーカイブ解除に失敗しました。', + com_ui_more_options: 'More', com_ui_preview: 'プレビュー', com_ui_upload: 'アップロード', com_ui_connect: '接続', @@ -344,7 +350,8 @@ export default { 'コンプリーションのステップをスキップする。(最終的な回答と生成されたステップをレビューする機能)', com_endpoint_stop: 'シーケンスを停止', com_endpoint_stop_placeholder: 'Enterキー押下で値を区切ります', - com_endpoint_openai_stop: 'APIがさらにトークンを生成するのを止めるため、最大で4つのシーケンスを設定可能', + com_endpoint_openai_stop: + 'APIがさらにトークンを生成するのを止めるため、最大で4つのシーケンスを設定可能', com_endpoint_config_key: 'API Keyを設定', com_endpoint_assistant_placeholder: '右側のサイドパネルからアシスタントを選択してください', com_endpoint_config_placeholder: 'ヘッダーメニューからAPI Keyを設定してください。', @@ -395,7 +402,8 @@ export default { com_nav_plugin_uninstall: 'アンインストール', com_nav_tool_add: '追加', com_nav_tool_dialog: 'アシスタントツール', - com_nav_tool_dialog_description: 'ツールの選択を維持するには、アシスタントを保存する必要があります。', + com_nav_tool_dialog_description: + 'ツールの選択を維持するには、アシスタントを保存する必要があります。', com_nav_tool_remove: '削除', com_nav_tool_search: 'ツールを検索', com_show_agent_settings: 'エージェント設定を表示', @@ -429,6 +437,13 @@ export default { com_nav_send_message: 'メッセージを送信する', com_nav_log_out: 'ログアウト', com_nav_user: 'ユーザー', + com_nav_archived_chats: 'アーカイブされたチャット', + com_nav_archived_chats_manage: '管理', + com_nav_archived_chats_empty: 'アーカイブされたチャットはありません', + com_nav_archive_all_chats: 'すべてのチャットをアーカイブ', + com_nav_archive_all: 'すべてアーカイブする', + com_nav_archive_name: '名前', + com_nav_archive_created_at: '作成日', com_nav_clear_conversation: '会話を削除する', com_nav_clear_conversation_confirm_message: '本当にすべての会話を削除しますか? この操作は取り消せません。', diff --git a/client/src/localization/languages/Ko.ts b/client/src/localization/languages/Ko.ts index a76d62b0b8..b545e3e676 100644 --- a/client/src/localization/languages/Ko.ts +++ b/client/src/localization/languages/Ko.ts @@ -53,6 +53,12 @@ export default { com_ui_delete: '삭제', com_ui_delete_conversation: '채팅을 삭제하시겠습니까?', com_ui_delete_conversation_confirm: '이 채팅이 삭제됩니다', + com_ui_rename: '이름 바꾸기', + com_ui_archive: '아카이브', + com_ui_archive_error: '대화 아카이브 실패', + com_ui_unarchive: '아카이브 해제', + com_ui_unarchive_error: '대화 아카이브 해제 실패', + com_ui_more_options: '더 보기', com_auth_error_login: '제공된 정보로 로그인할 수 없습니다. 자격 증명을 확인하고 다시 시도하세요.', com_auth_no_account: '계정이 없으신가요?', com_auth_sign_up: '가입하기', @@ -239,6 +245,13 @@ export default { com_nav_send_message: '메시지 보내기', com_nav_log_out: '로그아웃', com_nav_user: '사용자', + com_nav_archived_chats: '아카이브된 채팅', + com_nav_archived_chats_manage: '관리', + com_nav_archived_chats_empty: '아카이브된 채팅이 없습니다', + com_nav_archive_all_chats: '모든 채팅 아카이브', + com_nav_archive_all: '모든 채팅 아카이브', + com_nav_archive_name: '이름', + com_nav_archive_created_at: '생성 날짜', com_nav_clear_conversation: '대화 지우기', com_nav_clear_conversation_confirm_message: '모든 대화를 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.', diff --git a/client/src/localization/languages/Nl.ts b/client/src/localization/languages/Nl.ts index 50cc8da858..4f723a5664 100644 --- a/client/src/localization/languages/Nl.ts +++ b/client/src/localization/languages/Nl.ts @@ -57,6 +57,12 @@ export default { com_ui_delete: 'Verwijderen', com_ui_delete_conversation: 'Chat verwijderen?', com_ui_delete_conversation_confirm: 'Hiermee wordt', + com_ui_rename: 'Hernoemen', + com_ui_archive: 'Archiveren', + com_ui_archive_error: 'Kan conversatie niet archiveren', + com_ui_unarchive: 'Uit archiveren', + com_ui_unarchive_error: 'Kan conversatie niet uit archiveren', + com_ui_more_options: 'Meer', com_auth_error_login: 'Kan niet inloggen met de verstrekte informatie. Controleer uw referenties en probeer het opnieuw.', com_auth_error_login_rl: 'Te veel inlogpogingen in een korte tijd. Probeer het later nog eens.', @@ -266,6 +272,13 @@ export default { com_nav_send_message: 'Bericht verzenden', com_nav_log_out: 'Uitloggen', com_nav_user: 'GEBRUIKER', + com_nav_archived_chats: 'Gearchiveerde chats', + com_nav_archived_chats_manage: 'Beheren', + com_nav_archived_chats_empty: 'Geen gearchiveerde chats', + com_nav_archive_all_chats: 'Alle chats archiveren', + com_nav_archive_all: 'Alle archiveren', + com_nav_archive_name: 'Naam', + com_nav_archive_created_at: 'Gemaakt op', com_nav_clear_conversation: 'Conversaties wissen', com_nav_clear_conversation_confirm_message: 'Weet u zeker dat u alle conversaties wilt wissen? Dit is onomkeerbaar.', diff --git a/client/src/localization/languages/Pl.ts b/client/src/localization/languages/Pl.ts index 6743664579..61deaaca1e 100644 --- a/client/src/localization/languages/Pl.ts +++ b/client/src/localization/languages/Pl.ts @@ -30,6 +30,12 @@ export default { com_ui_entries: 'wpisów', com_ui_pay_per_call: 'Wszystkie rozmowy z AI w jednym miejscu. Płatność za połączenie, a nie za miesiąc', + com_ui_rename: 'Zmień nazwę', + com_ui_archive: 'Archiwum', + com_ui_archive_error: 'Nie udało się archiwizować rozmowy', + com_ui_unarchive: 'Przywróć z archiwum', + com_ui_unarchive_error: 'Nie udało się odtworzyć rozmowy z archiwum', + com_ui_more_options: 'Więcej', com_auth_error_login: 'Nie udało się zalogować przy użyciu podanych danych. Sprawdź swoje dane logowania i spróbuj ponownie.', com_auth_no_account: 'Nie masz konta?', @@ -198,6 +204,13 @@ export default { com_nav_send_message: 'Wyślij wiadomość', com_nav_log_out: 'Wyloguj', com_nav_user: 'Użytkownik', + com_nav_archived_chats: 'Zarchiwizowane rozmowy', + com_nav_archived_chats_manage: 'Zarządzaj', + com_nav_archived_chats_empty: 'Nie masz żadnych zarchiwizowanych rozmów.', + com_nav_archive_all_chats: 'Archiwizuj wszystkie rozmowy', + com_nav_archive_all: 'Archiwizuj wszystkie', + com_nav_archive_name: 'Nazwa', + com_nav_archive_created_at: 'Utworzono', com_nav_clear_conversation: 'Wyczyść rozmowę', com_nav_clear_conversation_confirm_message: 'Czy na pewno chcesz usunąć wszystkie konwersacje? Tej operacji nie można cofnąć.', diff --git a/client/src/localization/languages/Ru.ts b/client/src/localization/languages/Ru.ts index 5ae0a3d7c9..cefe577ba9 100644 --- a/client/src/localization/languages/Ru.ts +++ b/client/src/localization/languages/Ru.ts @@ -68,6 +68,12 @@ export default { com_ui_connect: 'Подключить', com_ui_delete_conversation: 'Удалить чат?', com_ui_delete_conversation_confirm: 'Будет удален следующий чат: ', + com_ui_rename: 'Переименовать', + com_ui_archive: 'Архивировать', + com_ui_archive_error: 'Nie udało się archiwizować rozmowy', + com_ui_unarchive: 'разархивировать', + com_ui_unarchive_error: 'Nie udało się odtworzyć rozmowy z archiwum', + com_ui_more_options: 'Еще', com_auth_error_login: 'Не удалось войти с предоставленной информацией. Пожалуйста, проверьте ваши учетные данные и попробуйте снова.', com_auth_error_login_rl: @@ -315,6 +321,13 @@ export default { com_nav_send_message: 'Отправить сообщение', com_nav_log_out: 'Выйти', com_nav_user: 'ПОЛЬЗОВАТЕЛЬ', + com_nav_archived_chats: 'Архивированные чаты', + com_nav_archived_chats_manage: 'Управление', + com_nav_archived_chats_empty: 'У вас нет архивированных разговоров.', + com_nav_archive_all_chats: 'Архивировать все чаты', + com_nav_archive_all: 'Архивировать все', + com_nav_archive_name: 'Имя', + com_nav_archive_created_at: 'Дата создания', com_nav_clear_conversation: 'Удалить разговоры', com_nav_clear_conversation_confirm_message: 'Вы уверены, что хотите удалить все разговоры? Это действие нельзя отменить.', diff --git a/client/src/localization/languages/Sv.ts b/client/src/localization/languages/Sv.ts index c4fbe36862..d08db64412 100644 --- a/client/src/localization/languages/Sv.ts +++ b/client/src/localization/languages/Sv.ts @@ -54,6 +54,12 @@ export default { com_ui_delete: 'Radera', com_ui_delete_conversation: 'Radera chatt?', com_ui_delete_conversation_confirm: 'Detta kommer att radera', + com_ui_rename: 'byta namn på', + com_ui_archive: 'Arkiv', + com_ui_archive_error: 'Kunde inte arkivera chatt', + com_ui_unarchive: 'Avarkivera', + com_ui_unarchive_error: 'Kunde inte avarkivera chatt', + com_ui_more_options: 'Mer', com_auth_error_login: 'Kunde inte logga in med den angivna informationen. Kontrollera dina uppgifter och försök igen.', com_auth_error_login_rl: @@ -254,6 +260,13 @@ export default { com_nav_send_message: 'Skicka meddelande', com_nav_log_out: 'Logga ut', com_nav_user: 'ANVÄNDARE', + com_nav_archived_chats: 'Arkiverade chattar', + com_nav_archived_chats_manage: 'Hantera', + com_nav_archived_chats_empty: 'Du har inga arkiverade chattar.', + com_nav_archive_all_chats: 'Arkivera alla chattar', + com_nav_archive_all: 'Arkivera alla', + com_nav_archive_name: 'Namn', + com_nav_archive_created_at: 'Skapad', com_nav_clear_conversation: 'Rensa konversationer', com_nav_clear_conversation_confirm_message: 'Är du säker på att du vill rensa alla konversationer? Detta går inte att ångra.', diff --git a/client/src/localization/languages/Tr.ts b/client/src/localization/languages/Tr.ts index 3c9da3c0bf..b4dd07f9cc 100644 --- a/client/src/localization/languages/Tr.ts +++ b/client/src/localization/languages/Tr.ts @@ -56,6 +56,12 @@ export default { com_ui_delete: 'Sil', com_ui_delete_conversation: 'Sohbet silinecek?', com_ui_delete_conversation_confirm: 'Bu silinecek', + com_ui_rename: 'Yeniden adlandır', + com_ui_archive: 'Arşivle', + com_ui_archive_error: 'Sohbet arşivlemeye çalışırken bir hata oluştu', + com_ui_unarchive: 'Arşivden Çıkar', + com_ui_unarchive_error: 'Sohbet arşivden çıkarılamadı', + com_ui_more_options: 'Daha fazla', com_auth_error_login: 'Sağlanan bilgilerle giriş yapılamıyor. Lütfen kimlik bilgilerinizi kontrol edip tekrar deneyin.', com_auth_error_login_rl: @@ -282,6 +288,13 @@ export default { com_nav_send_message: 'Mesaj gönder', com_nav_log_out: 'Çıkış yap', com_nav_user: 'KULLANICI', + com_nav_archived_chats: 'Arşivlenmiş Sohbetler', + com_nav_archived_chats_manage: 'Ynetmek', + com_nav_archived_chats_empty: 'Sizin hiçbir arşivlenmiş sohbetiniz yok.', + com_nav_archive_all_chats: 'Tm sohbetleri arşivle', + com_nav_archive_all: 'Tmn arşivle', + com_nav_archive_name: 'İsim', + com_nav_archive_created_at: 'DateCreated', com_nav_clear_conversation: 'Sohbetleri Temizle', com_nav_clear_conversation_confirm_message: 'Tüm sohbetleri temizlemek istediğinizden emin misiniz? Bu geri alınamaz.', diff --git a/client/src/localization/languages/Vi.ts b/client/src/localization/languages/Vi.ts index 013b7c3891..b600400d04 100644 --- a/client/src/localization/languages/Vi.ts +++ b/client/src/localization/languages/Vi.ts @@ -56,6 +56,12 @@ export default { com_ui_delete: 'Xóa', com_ui_delete_conversation: 'Xóa cuộc trò chuyện?', com_ui_delete_conversation_confirm: 'Điều này sẽ xóa', + com_ui_rename: 'Đổi tên', + com_ui_archive: 'Lưu trữ', + com_ui_archive_error: 'Không thể lưu trữ cuộc trò chuyện', + com_ui_unarchive: 'Bỏ lưu trữ', + com_ui_unarchive_error: 'Không thể bỏ lưu trữ cuộc trò chuyện', + com_ui_more_options: 'Thêm', com_auth_error_login: 'Không thể đăng nhập với thông tin được cung cấp. Vui lòng kiểm tra thông tin đăng nhập và thử lại.', com_auth_error_login_rl: diff --git a/client/src/localization/languages/Zh.ts b/client/src/localization/languages/Zh.ts index 2109841ff5..da2722dfb1 100644 --- a/client/src/localization/languages/Zh.ts +++ b/client/src/localization/languages/Zh.ts @@ -135,6 +135,12 @@ export default { com_ui_delete_conversation: '删除对话?', com_ui_delete_conversation_confirm: '这将删除', com_ui_delete_assistant_confirm: '确定要删除此助手吗?该操作无法撤销。', + com_ui_rename: '重命名', + com_ui_archive: '归档', + com_ui_archive_error: '归档对话失败', + com_ui_unarchive: '取消归档', + com_ui_unarchive_error: '取消归档对话失败', + com_ui_more_options: '更多', com_ui_preview: '预览', com_ui_upload: '上传', com_ui_connect: '连接', @@ -394,6 +400,13 @@ export default { com_nav_send_message: '发送消息', com_nav_log_out: '注销', com_nav_user: '默认用户', + com_nav_archived_chats: '归档的对话', + com_nav_archived_chats_manage: '管理', + com_nav_archived_chats_empty: '您没有归档的对话。', + com_nav_archive_all_chats: '归档所有对话', + com_nav_archive_all: '归档所有', + com_nav_archive_name: '名称', + com_nav_archive_created_at: '创建时间', com_nav_clear_conversation: '清空对话', com_nav_clear_conversation_confirm_message: '请是否清空所有对话?该操作无法撤销', com_nav_help_faq: '帮助', diff --git a/client/src/localization/languages/ZhTraditional.ts b/client/src/localization/languages/ZhTraditional.ts index 73c2f215fc..b9ab42185a 100644 --- a/client/src/localization/languages/ZhTraditional.ts +++ b/client/src/localization/languages/ZhTraditional.ts @@ -53,6 +53,12 @@ export default { com_ui_delete: '刪除', com_ui_delete_conversation: '刪除對話?', com_ui_delete_conversation_confirm: '這將刪除', + com_ui_rename: '重新命名', + com_ui_archive: '封存', + com_ui_archive_error: '封存對話時發生錯誤', + com_ui_unarchive: '取消封存', + com_ui_unarchive_error: '取消封存對話時發生錯誤', + com_ui_more_options: '更多', com_auth_error_login: '無法使用提供的資訊登入。請檢查您的登入資訊後重試。', com_auth_error_login_rl: '短時間內嘗試登入的次數過多。請稍後再試。', com_auth_error_login_ban: '由於違反我們的服務條款,您的帳號已被暫時停用。', @@ -245,6 +251,13 @@ export default { com_nav_send_message: '傳送訊息', com_nav_log_out: '登出', com_nav_user: '使用者', + com_nav_archived_chats: '封存的對話', + com_nav_archived_chats_manage: '管理', + com_nav_archived_chats_empty: '您沒有任何封存的對話。', + com_nav_archive_all_chats: '封存所有對話', + com_nav_archive_all: '封存所有', + com_nav_archive_name: '名稱', + com_nav_archive_created_at: '建立時間', com_nav_clear_conversation: '清除對話', com_nav_clear_conversation_confirm_message: '您確定要清除所有對話嗎?此操作無法復原。', com_nav_help_faq: '說明與常見問題', diff --git a/packages/data-provider/src/api-endpoints.ts b/packages/data-provider/src/api-endpoints.ts index 9b0b41a8f5..2e56efb8d0 100644 --- a/packages/data-provider/src/api-endpoints.ts +++ b/packages/data-provider/src/api-endpoints.ts @@ -21,8 +21,8 @@ export const abortRequest = (endpoint: string) => `/api/ask/${endpoint}/abort`; export const conversationsRoot = '/api/convos'; -export const conversations = (pageNumber: string) => - `${conversationsRoot}?pageNumber=${pageNumber}`; +export const conversations = (pageNumber: string, isArchived?: boolean) => + `${conversationsRoot}?pageNumber=${pageNumber}${isArchived ? '&isArchived=true' : ''}`; export const conversationById = (id: string) => `${conversationsRoot}/${id}`; diff --git a/packages/data-provider/src/data-service.ts b/packages/data-provider/src/data-service.ts index af6a6ba4c7..b334619096 100644 --- a/packages/data-provider/src/data-service.ts +++ b/packages/data-provider/src/data-service.ts @@ -279,7 +279,8 @@ export const listConversations = ( ): Promise => { // Assuming params has a pageNumber property const pageNumber = params?.pageNumber || '1'; // Default to page 1 if not provided - return request.get(endpoints.conversations(pageNumber)); + const isArchived = params?.isArchived || false; // Default to false if not provided + return request.get(endpoints.conversations(pageNumber, isArchived)); }; export const listConversationsByQuery = ( @@ -316,6 +317,12 @@ export function updateConversation( return request.post(endpoints.updateConversation(), { arg: payload }); } +export function archiveConversation( + payload: t.TArchiveConversationRequest, +): Promise { + return request.post(endpoints.updateConversation(), { arg: payload }); +} + export function genTitle(payload: m.TGenTitleRequest): Promise { return request.post(endpoints.genTitle(), payload); } diff --git a/packages/data-provider/src/keys.ts b/packages/data-provider/src/keys.ts index abb46c2dfb..aa664f8c39 100644 --- a/packages/data-provider/src/keys.ts +++ b/packages/data-provider/src/keys.ts @@ -1,6 +1,7 @@ export enum QueryKeys { messages = 'messages', allConversations = 'allConversations', + archivedConversations = 'archivedConversations', searchConversations = 'searchConversations', conversation = 'conversation', searchEnabled = 'searchEnabled', diff --git a/packages/data-provider/src/types.ts b/packages/data-provider/src/types.ts index a6c0b9a98a..901730336d 100644 --- a/packages/data-provider/src/types.ts +++ b/packages/data-provider/src/types.ts @@ -125,6 +125,13 @@ export type TDeleteConversationResponse = { }; }; +export type TArchiveConversationRequest = { + conversationId: string; + isArchived: boolean; +}; + +export type TArchiveConversationResponse = TConversation; + export type TForkConvoRequest = { messageId: string; conversationId: string; diff --git a/packages/data-provider/src/types/queries.ts b/packages/data-provider/src/types/queries.ts index 81196f00e4..18e56ecca1 100644 --- a/packages/data-provider/src/types/queries.ts +++ b/packages/data-provider/src/types/queries.ts @@ -16,6 +16,7 @@ export type ConversationListParams = { order?: 'asc' | 'desc'; pageNumber: string; // Add this line conversationId?: string; + isArchived: boolean; }; // Type for the response from the conversation list API