💬 feat: Temporary Chats (#5493)

* feat: add expiredAt property to Conversation and Message models

Added `expiredAt` property to both Conversation and Message schemas.
Configured `expireAfterSeconds` index in MongoDB to automatically delete documents after a specified period.

* feat(data-provider): add isTemporary and expiredAt properties to support temporary chats

Added `isTemporary` property to TPayload and TSubmission for API calls for temporary chat.
Additionally, added `expiredAt` property to `tConversationSchema` to determine if a chat is temporary.

* feat: implement isTemporary state management

Add Recoil state for tracking temporary conversations, update event handlers to respect temporary chat status

* feat: add configuration to interfaceconfig to hide the temporary chat switch

* feat: add Temporary Chat UI with switch and modify related behaviors

- Added a Temporary Chat switch button at the end of dropdown lists in each model.
- Updated the form background color to black when Temporary Chat is enabled.
- Modified Navigation to exclude Temporary Chats from the chat list.

* fix: exclude Temporary Chats from search results

Updated the getConvosQueried query to ensure that Temporary Chats are not included in the search results.

* fix: hide bookmark button for Temporary Chats

Updated the UI to ensure that the bookmark button is not displayed when a chat is as Temporary Chat.

* chore: update isTemporary state management in ChatRoute

* chore: fix to pass the tests
This commit is contained in:
Yuichi Oneda 2025-02-06 08:11:47 -08:00 committed by GitHub
parent 5f9543f6fc
commit 8c404ae056
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 185 additions and 13 deletions

View file

@ -14,13 +14,22 @@ import { getDefaultModelSpec, getModelSpecIconURL } from '~/utils';
import { ToolCallsMapProvider } from '~/Providers';
import ChatView from '~/components/Chat/ChatView';
import useAuthRedirect from './useAuthRedirect';
import temporaryStore from '~/store/temporary';
import { Spinner } from '~/components/svg';
import { useRecoilCallback } from 'recoil';
import store from '~/store';
export default function ChatRoute() {
useHealthCheck();
const { data: startupConfig } = useGetStartupConfig();
const { isAuthenticated, user } = useAuthRedirect();
const setIsTemporary = useRecoilCallback(
({ set }) =>
(value: boolean) => {
set(temporaryStore.isTemporary, value);
},
[],
);
useAppStartup({ startupConfig, user });
const index = 0;
@ -141,6 +150,14 @@ export default function ChatRoute() {
return null;
}
const isTemporaryChat = conversation && conversation.expiredAt ? true : false;
if (conversationId !== Constants.NEW_CONVO && !isTemporaryChat) {
setIsTemporary(false);
} else if (isTemporaryChat) {
setIsTemporary(isTemporaryChat);
}
return (
<ToolCallsMapProvider conversationId={conversation.conversationId ?? ''}>
<ChatView index={index} />