💬 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

@ -71,6 +71,7 @@ export default function useChatFunctions({
const setShowStopButton = useSetRecoilState(store.showStopButtonByIndex(index));
const setFilesToDelete = useSetFilesToDelete();
const getSender = useGetSender();
const isTemporary = useRecoilValue(store.isTemporary);
const queryClient = useQueryClient();
const { getExpiry } = useUserKey(conversation?.endpoint ?? '');
@ -293,6 +294,7 @@ export default function useChatFunctions({
isContinued,
isRegenerate,
initialResponse,
isTemporary,
};
if (isRegenerate) {

View file

@ -275,7 +275,7 @@ export default function useEventHandlers({
const createdHandler = useCallback(
(data: TResData, submission: EventSubmission) => {
const { messages, userMessage, isRegenerate = false } = submission;
const { messages, userMessage, isRegenerate = false, isTemporary = false } = submission;
const initialResponse = {
...submission.initialResponse,
parentMessageId: userMessage.messageId,
@ -317,6 +317,9 @@ export default function useEventHandlers({
return update;
});
if (isTemporary) {
return;
}
queryClient.setQueryData<ConversationData>([QueryKeys.allConversations], (convoData) => {
if (!convoData) {
return convoData;
@ -357,7 +360,12 @@ export default function useEventHandlers({
const finalHandler = useCallback(
(data: TFinalResData, submission: EventSubmission) => {
const { requestMessage, responseMessage, conversation, runMessages } = data;
const { messages, conversation: submissionConvo, isRegenerate = false } = submission;
const {
messages,
conversation: submissionConvo,
isRegenerate = false,
isTemporary = false,
} = submission;
setShowStopButton(false);
setCompleted((prev) => new Set(prev.add(submission.initialResponse.messageId)));
@ -401,6 +409,7 @@ export default function useEventHandlers({
if (
genTitle &&
isNewConvo &&
!isTemporary &&
requestMessage &&
requestMessage.parentMessageId === Constants.NO_PARENT
) {

View file

@ -38,6 +38,7 @@ const useNewConvo = (index = 0) => {
const clearAllConversations = store.useClearConvoState();
const defaultPreset = useRecoilValue(store.defaultPreset);
const { setConversation } = store.useCreateConversationAtom(index);
const [isTemporary, setIsTemporary] = useRecoilState(store.isTemporary);
const [files, setFiles] = useRecoilState(store.filesByIndex(index));
const clearAllLatestMessages = store.useClearLatestMessages(`useNewConvo ${index}`);
const setSubmission = useSetRecoilState<TSubmission | null>(store.submissionByIndex(index));
@ -195,6 +196,9 @@ const useNewConvo = (index = 0) => {
keepAddedConvos?: boolean;
} = {}) {
pauseGlobalAudio();
if (isTemporary) {
setIsTemporary(false);
}
const templateConvoId = _template.conversationId ?? '';
const paramEndpoint =