mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 00:40:14 +01:00
🚀feat: Archive conversations (#2590)
* 🔧chore: add internationalization labels for archive feature * ✨ feat: Add function to useArchiveConversationMutation() This commit adds a new mutation function `useArchiveConversationMutation()` for archiving conversations. This function takes the ID string of the conversation to be archived and returns a mutation result object. Upon successful archiving, it removes and refreshes the conversation from the query data cache. While ChatGPT PATCHes the archived status by sending `{is_archived: true}` to the URL `/backend-api/conversation/$conversation_id`, this implementation uses the `dataService.updateConversation(payload)` with a POST method, aligning with the existing code conventions. * ✨ feat(api): add is_archived field to Conversation schema and update getConvosByPage method This commit adds a new field `is_archived` with a default value of false to the Conversation schema. It also modifies the `getConvosByPage` method within the Conversation API to adjust the query to only target conversations where `is_archived` is set to false or where the `is_archived` field does not exist. The function `getConvosQueried`, which returns conversations for a specified Conversation ID, was determined not to require consideration of whether `is_archived` is true or false, and thus was not modified. * ♻️ refactor: add className prop to DotsIcon component To enhance the versatility of the DotsIcon component, this commit introduces the ability to specify a className prop, allowing for greater customization. * ✨ feat(ui): add Edit Button to group Title change and Conversation delete buttons Added a new Edit Button to the conversations, similar to the ChatGPT UI, which groups options for editing the conversation title and deleting conversations. This grouping is accessible through a dialogue that appears when the three-dot icon is clicked. * ♻️ refactor(ui): enhance Delete Button to accept className and label options Enhanced the Delete Button component to accept a `className` for customization and an optional `appendLabel`. The DeleteButton component is used by both `Convo.tsx` and `Conversation.tsx`, but currently only `Convo.tsx` is active and `Conversation.tsx `is apparently not used; removing `Conversation.tsx` may eliminate the need for the `appendLabel` property in the future. * ♻️ refactor(ui): enhance RenameButton to accept label options Added the ability to optionally display labels; the Rename Button component is used by both `Convo.tsx` and `Conversation.tsx`, but currently only `Convo.tsx` is active and `Conversation.tsx `is apparently not used; removing `Conversation.tsx` may eliminate the need for the `appendLabel` property in the future. * 🔧 chors: additional localization labels * ♻️ refactor: change is_archived property of conversation to camelCase * Refactor the is_archived property of conversation to camelCase (isArchived) to adhere to the existing code conventions * Modify the function that retrieves conversations to accept the isArchived parameter * ♻️ refactor: add archiveConversation mutation I thought I could divert dataService.updateConversation, but added a new archiveConversation because the request types are different. It might be better to make them common, but to avoid side effects, I added a new function this time. Added process to deleteConversationMutation to delete archived conversations * ✨ feat: Add the function to hide a cancel button in DialogTemplate component The Cancel button is not needed when displaying the archive list, so I made the Cancel button optional. * ♻️ refactor: Add support for filtering archived conversations in Nav component This commit modifies the Nav component to add the ability to filter out archived conversations when fetching data. This is done by adding `isArchived: false` to the query parameters for both the `useConversationsInfiniteQuery()` and `useSearchInfiniteQuery()` hooks, effectively excluding any archived conversations from the results returned. * ♻️ refactor: add Tooltip to DeleteButton * Add Tooltip to DeleteButton component * Display Tooltip when DeleteButton only shows an Icon without text * ✨ feat(ui): add ArchiveButton component for archiving conversations To be compatible with the ChatGPT UI, no confirmation dialog is displayed when ArchiveButton is clicked. The basic behavior conforms to DeleteButton and RenameButton. * ✨ feat(ui): add Archive button to list of conversations Modify the Nav of the conversation list to include a dropdown that contains the Rename and Delete options, similar to the ChatGPT UI. Additionally, an Archive button has been added adjacent to the dropdown menu. * ✨ feat: Add ArchivedChatsTable component Adds the `ArchivedChatsTable` component, which displays a table of archived chats. It has been implemented to be as compatible with the ChatGPT UI as possible. * 🚑 fix(tooltip): increase z-index to ensure visibility over Dialog Resolve an issue where tooltips were not visible when displayed over a Dialog. The z-index of `DialogPrimitive.Portal` in `Dialog.tsx` is set to 999. Since the rationale for this value is unclear, the z-index of the tooltip has been increased to 1000 to guarantee its visibility above the Dialog component. * 🔧 chors: add internationalization labels
This commit is contained in:
parent
436f7195b5
commit
89b1e33be0
41 changed files with 792 additions and 66 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -89,6 +89,10 @@ const conversationPreset = {
|
|||
type: String,
|
||||
},
|
||||
stop: { type: [{ type: String }], default: undefined },
|
||||
isArchived: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
/* UI Components */
|
||||
iconURL: {
|
||||
type: String,
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
81
client/src/components/Conversations/ArchiveButton.tsx
Normal file
81
client/src/components/Conversations/ArchiveButton.tsx
Normal file
|
|
@ -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<HTMLButtonElement>
|
||||
| FocusEvent<HTMLInputElement>
|
||||
| KeyboardEvent<HTMLInputElement>,
|
||||
) => {
|
||||
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 (
|
||||
<button type="button" className={classProp.className} onClick={archiveHandler}>
|
||||
<TooltipProvider delayDuration={250}>
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<span>{icon}</span>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent side="top" sideOffset={0}>
|
||||
{localize(`com_ui_${label}`)}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
</TooltipProvider>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
@ -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<HTMLInputElement>;
|
||||
|
||||
|
|
@ -183,14 +186,40 @@ export default function Conversation({ conversation, retainView, toggleNav, isLa
|
|||
<div className="absolute bottom-0 right-0 top-0 w-2 bg-gradient-to-l from-0% to-transparent group-hover:w-1 group-hover:from-60%"></div>
|
||||
)}
|
||||
{activeConvo ? (
|
||||
<div className="visible absolute right-1 z-10 flex from-gray-900 text-gray-500 dark:text-gray-300">
|
||||
<RenameButton renaming={renaming} onRename={onRename} renameHandler={renameHandler} />
|
||||
<DeleteButton
|
||||
conversationId={conversationId}
|
||||
retainView={retainView}
|
||||
renaming={renaming}
|
||||
title={title}
|
||||
/>
|
||||
<div className="visible absolute right-1 z-10 flex items-center from-gray-900 text-gray-500 dark:text-gray-300">
|
||||
{!renaming && (
|
||||
<EditMenuButton>
|
||||
<div className="flex flex-col gap-4 p-3">
|
||||
<div className="flex items-center gap-2">
|
||||
<RenameButton
|
||||
renaming={renaming}
|
||||
onRename={onRename}
|
||||
renameHandler={renameHandler}
|
||||
twcss="flex items-center gap-2"
|
||||
appendLabel={true}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center gap-2 text-red-500">
|
||||
<DeleteButton
|
||||
conversationId={conversationId}
|
||||
retainView={retainView}
|
||||
renaming={renaming}
|
||||
title={title}
|
||||
twcss="flex items-center gap-2"
|
||||
appendLabel={true}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</EditMenuButton>
|
||||
)}
|
||||
{!renaming && (
|
||||
<ArchiveButton
|
||||
conversationId={conversationId}
|
||||
retainView={retainView}
|
||||
shouldArchive={true}
|
||||
icon={<Archive className="h-5 w-5 hover:text-gray-400" />}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
) : (
|
||||
<div className="absolute bottom-0 right-0 top-0 w-14 rounded-lg bg-gradient-to-l from-gray-50 from-0% to-transparent group-hover:from-gray-200 dark:from-gray-750 dark:group-hover:from-gray-800" />
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
<>
|
||||
<TrashIcon /> {localize('com_ui_delete')}
|
||||
</>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<TooltipProvider delayDuration={250}>
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<span>
|
||||
<TrashIcon />
|
||||
</span>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent side="top" sideOffset={0}>
|
||||
{localize('com_ui_delete')}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
</TooltipProvider>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<Dialog>
|
||||
<DialogTrigger asChild>
|
||||
<button className="p-1 hover:text-black dark:hover:text-white">
|
||||
{renaming ? <CrossIcon /> : <TrashIcon />}
|
||||
</button>
|
||||
<button {...classProp}>{renaming ? <CrossIcon /> : renderDeleteButton()}</button>
|
||||
</DialogTrigger>
|
||||
<DialogTemplate
|
||||
showCloseButton={false}
|
||||
|
|
|
|||
54
client/src/components/Conversations/EditMenuButton.tsx
Normal file
54
client/src/components/Conversations/EditMenuButton.tsx
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
import type { FC } from 'react';
|
||||
import { DotsIcon } from '~/components/svg';
|
||||
import { Content, Portal, Root, Trigger } from '@radix-ui/react-popover';
|
||||
import { useLocalize } from '~/hooks';
|
||||
import { cn } from '~/utils';
|
||||
import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '~/components/ui';
|
||||
|
||||
type EditMenuButtonProps = {
|
||||
children: React.ReactNode;
|
||||
};
|
||||
const EditMenuButton: FC<EditMenuButtonProps> = ({ children }: EditMenuButtonProps) => {
|
||||
const localize = useLocalize();
|
||||
|
||||
return (
|
||||
<Root>
|
||||
<Trigger asChild>
|
||||
<div
|
||||
className={cn(
|
||||
'pointer-cursor relative flex flex-col text-left focus:outline-none focus:ring-0 focus:ring-offset-0 sm:text-sm',
|
||||
'hover:text-gray-400 radix-state-open:text-gray-400 dark:hover:text-gray-400 dark:radix-state-open:text-gray-400',
|
||||
'z-50 flex h-[40px] min-w-4 flex-none items-center justify-center pr-2 focus:ring-0 focus:ring-offset-0',
|
||||
)}
|
||||
id="edit-menu-button"
|
||||
data-testid="edit-menu-button"
|
||||
title={localize('com_endpoint_examples')}
|
||||
>
|
||||
<TooltipProvider delayDuration={250}>
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<button type="button" className="">
|
||||
<DotsIcon className="h-4 w-4 flex-shrink-0 text-gray-500 hover:text-gray-400 dark:text-gray-300 dark:hover:text-gray-400" />
|
||||
</button>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent side="top" sideOffset={0}>
|
||||
{localize('com_ui_more_options')}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
</TooltipProvider>
|
||||
</div>
|
||||
</Trigger>
|
||||
<Portal>
|
||||
<Content
|
||||
side="bottom"
|
||||
align="start"
|
||||
className="mt-2 max-h-[495px] overflow-x-hidden rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-700 dark:text-white md:min-w-[200px]"
|
||||
>
|
||||
{children}
|
||||
</Content>
|
||||
</Portal>
|
||||
</Root>
|
||||
);
|
||||
};
|
||||
|
||||
export default EditMenuButton;
|
||||
|
|
@ -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<HTMLButtonElement>) => void;
|
||||
onRename: (e: MouseEvent<HTMLButtonElement>) => 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 (
|
||||
<button {...classProp} onClick={handler}>
|
||||
{renaming ? <CheckMark /> : <EditIcon />}
|
||||
{renaming ? (
|
||||
<CheckMark />
|
||||
) : appendLabel ? (
|
||||
<>
|
||||
<EditIcon /> {localize('com_ui_rename')}
|
||||
</>
|
||||
) : (
|
||||
<EditIcon />
|
||||
)}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
<div className="flex items-center justify-between">
|
||||
<div> {localize('com_nav_archived_chats')} </div>
|
||||
|
||||
<Dialog>
|
||||
<DialogTrigger asChild>
|
||||
<button className="btn btn-neutral relative ">
|
||||
{localize('com_nav_archived_chats_manage')}
|
||||
</button>
|
||||
</DialogTrigger>
|
||||
<DialogTemplate
|
||||
title={localize('com_nav_archived_chats')}
|
||||
className="max-w-[1000px]"
|
||||
showCancelButton={false}
|
||||
main={<ArchivedChatsTable />}
|
||||
/>
|
||||
</Dialog>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -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 <div className="text-gray-300">{localize('com_nav_archived_chats_empty')}</div>;
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'grid w-full gap-2',
|
||||
'-mr-2 flex-1 flex-col overflow-y-auto pr-2 transition-opacity duration-500',
|
||||
'max-h-[350px]',
|
||||
)}
|
||||
ref={containerRef}
|
||||
>
|
||||
<table className="table-fixed text-left">
|
||||
<thead className="sticky top-0 bg-white dark:bg-gray-700">
|
||||
<tr className="border-b border-gray-200 text-sm font-semibold text-gray-500 dark:border-white/10 dark:text-gray-200">
|
||||
<th className="p-3">{localize('com_nav_archive_name')}</th>
|
||||
<th className="p-3">{localize('com_nav_archive_created_at')}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{conversations.map((conversation) => (
|
||||
<tr
|
||||
key={conversation.conversationId}
|
||||
className="border-b border-gray-200 text-sm font-normal dark:border-white/10"
|
||||
>
|
||||
<td className="flex items-center py-3 text-blue-800/70 dark:text-blue-500">
|
||||
<MessageCircle className="mr-1 h-5 w-5" />
|
||||
{conversation.title}
|
||||
</td>
|
||||
<td className="p-3">
|
||||
<div className="flex justify-between">
|
||||
<div className="flex justify-start dark:text-gray-200">
|
||||
{new Date(conversation.createdAt).toLocaleDateString('en-US', {
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
year: 'numeric',
|
||||
})}
|
||||
</div>
|
||||
<div className="flex items-center justify-end gap-1 text-gray-400">
|
||||
{conversation.conversationId && (
|
||||
<>
|
||||
<ArchiveButton
|
||||
conversationId={conversation.conversationId}
|
||||
retainView={moveToTop}
|
||||
shouldArchive={false}
|
||||
icon={<ArchiveRestore className="h-4 w-4 hover:text-gray-300" />}
|
||||
/>
|
||||
|
||||
<div className="h-4 w-4 hover:text-gray-300">
|
||||
<DeleteButton
|
||||
conversationId={conversation.conversationId}
|
||||
retainView={moveToTop}
|
||||
renaming={false}
|
||||
title={conversation.title}
|
||||
twcss="flex items-center gap-2"
|
||||
appendLabel={false}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
{(isFetchingNextPage || showLoading) && (
|
||||
<Spinner className={cn('m-1 mx-auto mb-4 h-4 w-4 text-black dark:text-white')} />
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -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() {
|
|||
<div className="border-b pb-3 last-of-type:border-b-0 dark:border-gray-700">
|
||||
<HideSidePanelSwitch />
|
||||
</div>
|
||||
<div className="border-b pb-3 last-of-type:border-b-0 dark:border-gray-700">
|
||||
<ArchivedChats />
|
||||
</div>
|
||||
{/* <div className="border-b pb-3 last-of-type:border-b-0 dark:border-gray-700">
|
||||
</div> */}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
<svg
|
||||
stroke="currentColor"
|
||||
|
|
@ -9,7 +13,7 @@ export default function DotsIcon() {
|
|||
viewBox="0 0 24 24"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
className="h-4 w-4 flex-shrink-0 text-gray-500"
|
||||
className={className}
|
||||
height="1em"
|
||||
width="1em"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ type DialogTemplateProps = {
|
|||
className?: string;
|
||||
headerClassName?: string;
|
||||
showCloseButton?: boolean;
|
||||
showCancelButton?: boolean;
|
||||
};
|
||||
|
||||
const DialogTemplate = forwardRef((props: DialogTemplateProps, ref: Ref<HTMLDivElement>) => {
|
||||
|
|
@ -40,6 +41,7 @@ const DialogTemplate = forwardRef((props: DialogTemplateProps, ref: Ref<HTMLDivE
|
|||
className,
|
||||
headerClassName,
|
||||
showCloseButton,
|
||||
showCancelButton = true,
|
||||
} = props;
|
||||
const { selectHandler, selectClasses, selectText } = selection || {};
|
||||
const Cancel = localize('com_ui_cancel');
|
||||
|
|
@ -67,9 +69,11 @@ const DialogTemplate = forwardRef((props: DialogTemplateProps, ref: Ref<HTMLDivE
|
|||
<DialogFooter>
|
||||
<div>{leftButtons ? leftButtons : null}</div>
|
||||
<div className="flex h-auto gap-3">
|
||||
<DialogClose className="border-gray-100 hover:bg-gray-100 dark:border-gray-600 dark:hover:bg-gray-600">
|
||||
{Cancel}
|
||||
</DialogClose>
|
||||
{showCancelButton && (
|
||||
<DialogClose className="border-gray-100 hover:bg-gray-100 dark:border-gray-600 dark:hover:bg-gray-600">
|
||||
{Cancel}
|
||||
</DialogClose>
|
||||
)}
|
||||
{buttons ? buttons : null}
|
||||
{selection ? (
|
||||
<DialogClose
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ const TooltipContent = React.forwardRef<
|
|||
<TooltipPortal forceMount={forceMount}>
|
||||
<TooltipPrimitive.Content
|
||||
className={cn(
|
||||
'shadow-xs relative max-w-xs rounded-lg border border-gray-900/10 bg-gray-900 p-1 transition-opacity',
|
||||
'shadow-xs relative z-[1000] max-w-xs rounded-lg border border-gray-900/10 bg-gray-900 p-1 transition-opacity',
|
||||
className,
|
||||
)}
|
||||
ref={ref}
|
||||
|
|
|
|||
|
|
@ -70,6 +70,53 @@ export const useUpdateConversationMutation = (
|
|||
);
|
||||
};
|
||||
|
||||
export const useArchiveConversationMutation = (
|
||||
id: string,
|
||||
): UseMutationResult<
|
||||
t.TArchiveConversationResponse,
|
||||
unknown,
|
||||
t.TArchiveConversationRequest,
|
||||
unknown
|
||||
> => {
|
||||
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<t.ConversationData>([QueryKeys.allConversations], (convoData) => {
|
||||
if (!convoData) {
|
||||
return convoData;
|
||||
}
|
||||
if (vars.isArchived) {
|
||||
return deleteConversation(convoData, id as string);
|
||||
} else {
|
||||
return addConversation(convoData, _data);
|
||||
}
|
||||
});
|
||||
queryClient.setQueryData<t.ConversationData>(
|
||||
[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<t.ConversationData>([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<t.ConversationData>([QueryKeys.allConversations], handleDelete);
|
||||
queryClient.setQueryData<t.ConversationData>(
|
||||
[QueryKeys.archivedConversations],
|
||||
handleDelete,
|
||||
);
|
||||
onSuccess?.(_data, vars, context);
|
||||
},
|
||||
...(_options || {}),
|
||||
|
|
|
|||
|
|
@ -136,9 +136,13 @@ export const useConversationsInfiniteQuery = (
|
|||
config?: UseInfiniteQueryOptions<ConversationListResponse, unknown>,
|
||||
) => {
|
||||
return useInfiniteQuery<ConversationListResponse, unknown>(
|
||||
[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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
'هل أنت متأكد أنك تريد مسح جميع المحادثات؟ هذا لا يمكن التراجع عنه.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
'אתה בטוח שאתה רוצה לנקות את כל השיחות? זה בלתי הפיך.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
'本当にすべての会話を削除しますか? この操作は取り消せません。',
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
'모든 대화를 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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ąć.',
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
'Вы уверены, что хотите удалить все разговоры? Это действие нельзя отменить.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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.',
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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: '帮助',
|
||||
|
|
|
|||
|
|
@ -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: '說明與常見問題',
|
||||
|
|
|
|||
|
|
@ -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}`;
|
||||
|
||||
|
|
|
|||
|
|
@ -279,7 +279,8 @@ export const listConversations = (
|
|||
): Promise<q.ConversationListResponse> => {
|
||||
// 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<t.TArchiveConversationResponse> {
|
||||
return request.post(endpoints.updateConversation(), { arg: payload });
|
||||
}
|
||||
|
||||
export function genTitle(payload: m.TGenTitleRequest): Promise<m.TGenTitleResponse> {
|
||||
return request.post(endpoints.genTitle(), payload);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
export enum QueryKeys {
|
||||
messages = 'messages',
|
||||
allConversations = 'allConversations',
|
||||
archivedConversations = 'archivedConversations',
|
||||
searchConversations = 'searchConversations',
|
||||
conversation = 'conversation',
|
||||
searchEnabled = 'searchEnabled',
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue