From e96dd636d3f553c64ac4312e7806a0a8b631f22b Mon Sep 17 00:00:00 2001 From: Aliaksandr Kezik Date: Wed, 14 Feb 2024 15:58:18 +0100 Subject: [PATCH 01/10] test mobile and fix always checked discard checkbox --- .../Chat/Migration/MigrationFailedModal.tsx | 56 +++++++++++++------ .../utils/app/data/storages/api-storage.ts | 6 +- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx b/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx index 845ab4777d..7f3672fd9c 100644 --- a/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx +++ b/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx @@ -7,6 +7,8 @@ import { useRouter } from 'next/router'; import classNames from 'classnames'; +import { isMobile, isSmallScreen } from '@/src/utils/app/mobile'; + import { Conversation } from '@/src/types/chat'; import { Prompt } from '@/src/types/prompt'; import { Translation } from '@/src/types/translation'; @@ -230,8 +232,7 @@ export const MigrationFailedWindow = ({ const isSomeItemsSelected = !!conversationsToRetryIds.length || !!promptsToRetryIds.length; const isNothingSelected = - conversationsToRetryIds.length === 0 && - conversationsToRetryIds.length === 0; + !conversationsToRetryIds.length && !promptsToRetryIds.length; return (
@@ -307,20 +308,43 @@ export const MigrationFailedWindow = ({

diff --git a/apps/chat/src/utils/app/data/storages/api-storage.ts b/apps/chat/src/utils/app/data/storages/api-storage.ts index e4ebe3b876..d123d70abe 100644 --- a/apps/chat/src/utils/app/data/storages/api-storage.ts +++ b/apps/chat/src/utils/app/data/storages/api-storage.ts @@ -26,7 +26,7 @@ import { import { ConversationApiStorage } from './api/conversation-api-storage'; import { PromptApiStorage } from './api/prompt-api-storage'; -const MAX_RETRIES_COUNT = 3; +const MAX_RETRIES_COUNT = 0; export class ApiStorage implements DialStorage { private _conversationApiStorage = new ConversationApiStorage(); @@ -75,7 +75,9 @@ export class ApiStorage implements DialStorage { }), ); - return retry(entity, apiStorage); + // it's done to test failed migration window on mobile on review env, don't worry) + return throwError(() => new Error()); + // return retry(entity, apiStorage); } getConversationsFolders(path?: string): Observable { From c72f07d15a445babb812e151c28fc912101ed493 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kezik Date: Wed, 14 Feb 2024 16:25:54 +0100 Subject: [PATCH 02/10] mock data before each migration --- .../conversations/conversations.epics.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/apps/chat/src/store/conversations/conversations.epics.ts b/apps/chat/src/store/conversations/conversations.epics.ts index 537247c25c..7c92b06ab7 100644 --- a/apps/chat/src/store/conversations/conversations.epics.ts +++ b/apps/chat/src/store/conversations/conversations.epics.ts @@ -730,6 +730,41 @@ const migrateConversationsIfRequiredEpic: AppEpic = (action$, state$) => { migratedConversationIds, failedMigratedConversationIds, }) => { + localStorage.setItem( + 'conversationHistory', + JSON.stringify([ + { + id: '45797f7c-a528-46d1-a0c8-714b5cd41f2e', + name: 'Test', + model: { + id: 'gpt-4-1106-preview', + }, + prompt: '', + temperature: 1, + messages: [], + replay: { + isReplay: false, + replayUserMessagesStack: [], + activeReplayIndex: 0, + }, + selectedAddons: [], + assistantModelId: 'gpt-4', + lastActivityDate: 1706876661920, + isMessageStreaming: false, + }, + ]), + ); + localStorage.setItem( + 'prompts', + JSON.stringify([ + { + id: 'fc3a3e85-6f46-4afb-87fc-3af97b048ba3', + name: 'Prompt 1', + description: '', + content: 'sss', + }, + ]), + ); const notMigratedConversations = filterMigratedEntities( conversations, [...failedMigratedConversationIds, ...migratedConversationIds], From 7f6ef03eca22281a6ab0a193b319ab9f040901d9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kezik Date: Thu, 15 Feb 2024 18:40:31 +0100 Subject: [PATCH 03/10] redesign --- .../Chat/Migration/MigrationFailedModal.tsx | 129 ++++++++++++------ .../conversations/conversations.epics.ts | 56 ++------ .../conversations/conversations.reducers.ts | 11 ++ .../conversations/conversations.selectors.ts | 5 + .../conversations/conversations.types.ts | 1 + .../store/import-export/importExport.epics.ts | 45 ++++-- .../import-export/importExport.reducers.ts | 8 +- apps/chat/src/store/prompts/prompts.epics.ts | 22 ++- .../src/store/prompts/prompts.reducers.ts | 11 ++ .../src/store/prompts/prompts.selectors.ts | 5 + apps/chat/src/store/prompts/prompts.types.ts | 1 + apps/chat/src/types/storage.ts | 2 + .../app/data/storages/browser-storage.ts | 16 +++ 13 files changed, 207 insertions(+), 105 deletions(-) diff --git a/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx b/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx index 7f3672fd9c..053afe838f 100644 --- a/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx +++ b/apps/chat/src/components/Chat/Migration/MigrationFailedModal.tsx @@ -1,4 +1,10 @@ -import { IconBulb, IconCheck, IconMinus } from '@tabler/icons-react'; +import { + IconBulb, + IconCheck, + IconCircleCheck, + IconDownload, + IconMinus, +} from '@tabler/icons-react'; import { ReactElement, useCallback, useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; @@ -7,17 +13,25 @@ import { useRouter } from 'next/router'; import classNames from 'classnames'; -import { isMobile, isSmallScreen } from '@/src/utils/app/mobile'; +import { BrowserStorage } from '@/src/utils/app/data/storages/browser-storage'; +import { isSmallScreen } from '@/src/utils/app/mobile'; import { Conversation } from '@/src/types/chat'; import { Prompt } from '@/src/types/prompt'; +import { MigrationStorageKeys } from '@/src/types/storage'; import { Translation } from '@/src/types/translation'; -import { ConversationsActions } from '@/src/store/conversations/conversations.reducers'; +import { + ConversationsActions, + ConversationsSelectors, +} from '@/src/store/conversations/conversations.reducers'; import { useAppSelector } from '@/src/store/hooks'; import { ImportExportActions } from '@/src/store/import-export/importExport.reducers'; import { ModelsSelectors } from '@/src/store/models/models.reducers'; -import { PromptsActions } from '@/src/store/prompts/prompts.reducers'; +import { + PromptsActions, + PromptsSelectors, +} from '@/src/store/prompts/prompts.reducers'; import { SettingsSelectors } from '@/src/store/settings/settings.reducers'; import { ReportIssueDialog } from '@/src/components/Chat/ReportIssueDialog'; @@ -154,13 +168,19 @@ export const MigrationFailedWindow = ({ string[] >([]); const [promptsToRetryIds, setPromptsToRetryIds] = useState([]); - const [isReportIssueDialogOpen, setIsReportIssueDialogOpen] = useState(false); + const [dontWantBackup, setDontWantBackup] = useState(false); const enabledFeatures = useAppSelector( SettingsSelectors.selectEnabledFeatures, ); const modelsMap = useAppSelector(ModelsSelectors.selectModelsMap); + const isPromptsBackedUp = useAppSelector( + PromptsSelectors.selectIsPromptsBackedUp, + ); + const isChatsBackedUp = useAppSelector( + ConversationsSelectors.selectIsChatsBackedUp, + ); useEffect(() => { setConversationsToRetryIds( @@ -205,14 +225,15 @@ export const MigrationFailedWindow = ({ promptsToRetryIds, ]); - const onRetryWithoutBackup = useCallback(() => { - retryMigration(); - }, [retryMigration]); + const onBackupPrompts = useCallback(() => { + dispatch(ImportExportActions.exportLocalStoragePrompts()); + BrowserStorage.setEntityBackedUp(MigrationStorageKeys.PromptsBackedUp); + }, [dispatch]); - const onRetryWithBackup = useCallback(() => { - dispatch(ImportExportActions.exportLocalStorageEntities()); - retryMigration(); - }, [dispatch, retryMigration]); + const onBackupChats = useCallback(() => { + dispatch(ImportExportActions.exportLocalStorageChats()); + BrowserStorage.setEntityBackedUp(MigrationStorageKeys.ChatsBackedUp); + }, [dispatch]); const onSelectAll = useCallback(() => { setConversationsToRetryIds( @@ -307,44 +328,72 @@ export const MigrationFailedWindow = ({ /> -