Skip to content

Commit

Permalink
fix(chat): refactor init requests (Issue #2598) (#2627)
Browse files Browse the repository at this point in the history
Co-authored-by: Magomed-Elbi Dzhukalaev <[email protected]>
Co-authored-by: Ilya Bondar <[email protected]>
Co-authored-by: Irina_Kartun <[email protected]>
  • Loading branch information
4 people authored Nov 19, 2024
1 parent 2f4a2a0 commit 7f02d2b
Show file tree
Hide file tree
Showing 27 changed files with 157 additions and 28 deletions.
1 change: 1 addition & 0 deletions apps/chat-e2e/src/testData/expectedConstants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ export const API = {
shareListing: '/api/share/listing',
discardShareWithMeItem: '/api/share/discard',
installedDeploymentsHost: 'clientdata/installed_deployments.json',
marketplaceHost: 'marketplace.json',
publicationRequestHost: '/api/publication/create',
publicationRequestCreate: '/api/publication/create',
publicationRequestRejection: '/api/publication/reject',
Expand Down
2 changes: 1 addition & 1 deletion apps/chat-e2e/src/ui/webElements/entitySelector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export class EntitySelector extends BaseElement {

public async searchOnMyAppButton() {
const responsePromise = this.page.waitForResponse((resp) =>
resp.url().includes(API.installedDeploymentsHost),
resp.url().includes(API.marketplaceHost),
);
await this.searchOnMyApplicationsButton.click();
await responsePromise;
Expand Down
9 changes: 1 addition & 8 deletions apps/chat/src/components/Marketplace/Marketplace.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ import {
MarketplaceActions,
MarketplaceSelectors,
} from '@/src/store/marketplace/marketplace.reducers';
import {
ModelsActions,
ModelsSelectors,
} from '@/src/store/models/models.reducers';
import { ModelsSelectors } from '@/src/store/models/models.reducers';
import { UISelectors } from '@/src/store/ui/ui.reducers';

import {
Expand Down Expand Up @@ -55,10 +52,6 @@ export const Marketplace = () => {
return () => resizeObserver.disconnect();
}, []);

useEffect(() => {
dispatch(ModelsActions.getModels());
}, [dispatch]);

useEffect(() => {
dispatch(
MarketplaceActions.setSelectedTab(
Expand Down
7 changes: 6 additions & 1 deletion apps/chat/src/store/addons/addons.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ import { AddonsActions, AddonsSelectors } from './addons.reducers';

const initEpic: AppEpic = (action$, state$) =>
action$.pipe(
filter(AddonsActions.init.match),
filter(
(action) =>
AddonsActions.init.match(action) &&
!AddonsSelectors.selectInitialized(state$.value),
),
switchMap(() => DataService.getRecentAddonsIds()),
switchMap((recentAddonsIds) =>
concat(
Expand All @@ -37,6 +41,7 @@ const initEpic: AppEpic = (action$, state$) =>
}),
),
of(AddonsActions.getAddons()),
of(AddonsActions.initFinish()),
),
),
);
Expand Down
10 changes: 10 additions & 0 deletions apps/chat/src/store/addons/addons.reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { errorsMessages } from '@/src/constants/errors';
import { RootState } from '../index';

export interface AddonsState {
initialized: boolean;
isLoading: boolean;
error: ErrorMessage | undefined;
addons: DialAIEntityAddon[];
Expand All @@ -18,6 +19,7 @@ export interface AddonsState {
}

const initialState: AddonsState = {
initialized: false,
isLoading: false,
error: undefined,
addons: [],
Expand All @@ -30,6 +32,9 @@ export const addonsSlice = createSlice({
initialState,
reducers: {
init: (state) => state,
initFinish: (state) => {
state.initialized = true;
},
getAddons: (state) => {
state.isLoading = true;
},
Expand Down Expand Up @@ -112,13 +117,18 @@ const selectAddonsMap = createSelector([rootSelector], (state) => {
const selectRecentAddonsIds = createSelector([rootSelector], (state) => {
return state.recentAddonsIds;
});
const selectInitialized = createSelector(
[rootSelector],
(state) => state.initialized,
);

export const AddonsSelectors = {
selectAddonsIsLoading,
selectAddonsError,
selectAddons,
selectAddonsMap,
selectRecentAddonsIds,
selectInitialized,
};

export const AddonsActions = addonsSlice.actions;
9 changes: 7 additions & 2 deletions apps/chat/src/store/conversations/conversations.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,13 @@ import {
import omit from 'lodash-es/omit';
import uniq from 'lodash-es/uniq';

const initEpic: AppEpic = (action$) =>
const initEpic: AppEpic = (action$, state$) =>
action$.pipe(
filter((action) => ConversationsActions.init.match(action)),
filter(
(action) =>
ConversationsActions.init.match(action) &&
!ConversationsSelectors.selectInitialized(state$.value),
),
switchMap(() => {
const searchParams = new URLSearchParams(window.location.search);

Expand All @@ -143,6 +147,7 @@ const initEpic: AppEpic = (action$) =>
of(ConversationsActions.initSelectedConversations()),
),
of(ConversationsActions.initFoldersAndConversations()),
of(ConversationsActions.initFinish()),
);
}),
);
Expand Down
4 changes: 4 additions & 0 deletions apps/chat/src/store/conversations/conversations.reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import xor from 'lodash-es/xor';
export { ConversationsSelectors };

const initialState: ConversationsState = {
initialized: false,
conversations: [],
selectedConversationsIds: [],
folders: [],
Expand Down Expand Up @@ -67,6 +68,9 @@ export const conversationsSlice = createSlice({
initialState,
reducers: {
init: (state) => state,
initFinish: (state) => {
state.initialized = true;
},
initSelectedConversations: (state) => state,
initFoldersAndConversations: (state) => state,
initFoldersAndConversationsSuccess: (state) => {
Expand Down
5 changes: 5 additions & 0 deletions apps/chat/src/store/conversations/conversations.selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -842,3 +842,8 @@ export const selectIsNewConversationUpdating = createSelector(
return state.isNewConversationUpdating;
},
);

export const selectInitialized = createSelector(
[rootSelector],
(state) => state.initialized,
);
1 change: 1 addition & 0 deletions apps/chat/src/store/conversations/conversations.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
} from '@epam/ai-dial-shared';

export interface ConversationsState {
initialized: boolean;
conversations: ConversationInfo[];
selectedConversationsIds: string[];
folders: FolderInterface[];
Expand Down
19 changes: 13 additions & 6 deletions apps/chat/src/store/files/files.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,21 @@ import { FilesActions, FilesSelectors } from './files.reducers';

import { UploadStatus } from '@epam/ai-dial-shared';

const initEpic: AppEpic = (action$) =>
const initEpic: AppEpic = (action$, state$) =>
action$.pipe(
filter(FilesActions.init.match),
filter(
(action) =>
FilesActions.init.match(action) &&
!FilesSelectors.selectInitialized(state$.value),
),
switchMap(() =>
of(
PublicationActions.uploadPublishedWithMeItems({
featureType: FeatureType.File,
}),
concat(
of(
PublicationActions.uploadPublishedWithMeItems({
featureType: FeatureType.File,
}),
),
of(FilesActions.initFinish()),
),
),
);
Expand Down
10 changes: 10 additions & 0 deletions apps/chat/src/store/files/files.reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { UploadStatus } from '@epam/ai-dial-shared';
import uniq from 'lodash-es/uniq';

export interface FilesState {
initialized: boolean;
files: DialFile[];
selectedFilesIds: string[];
filesStatus: UploadStatus;
Expand All @@ -36,6 +37,7 @@ export interface FilesState {
}

const initialState: FilesState = {
initialized: false,
files: [],
filesStatus: UploadStatus.UNINITIALIZED,
selectedFilesIds: [],
Expand All @@ -50,6 +52,9 @@ export const filesSlice = createSlice({
initialState,
reducers: {
init: (state) => state,
initFinish: (state) => {
state.initialized = true;
},
uploadFile: (
state,
{
Expand Down Expand Up @@ -527,6 +532,10 @@ const selectPublicationFolders = createSelector(
return state.folders.filter((f) => f.isPublicationFolder);
},
);
const selectInitialized = createSelector(
[rootSelector],
(state) => state.initialized,
);

export const FilesSelectors = {
selectFiles,
Expand All @@ -544,6 +553,7 @@ export const FilesSelectors = {
selectFileById,
selectFoldersWithSearchTerm,
selectPublicationFolders,
selectInitialized,
};

export const FilesActions = filesSlice.actions;
11 changes: 8 additions & 3 deletions apps/chat/src/store/migration/migration.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,24 @@ import { AppEpic } from '@/src/types/store';

import { SettingsSelectors } from '../settings/settings.reducers';
import { UIActions } from '../ui/ui.reducers';
import { MigrationActions } from './migration.reducers';
import { MigrationActions, MigrationSelectors } from './migration.reducers';

import orderBy from 'lodash-es/orderBy';

const browserStorage = new BrowserStorage();

const initEpic: AppEpic = (action$) =>
const initEpic: AppEpic = (action$, state$) =>
action$.pipe(
filter(MigrationActions.init.match),
filter(
(action) =>
MigrationActions.init.match(action) &&
!MigrationSelectors.selectInitialized(state$.value),
),
switchMap(() =>
concat(
of(MigrationActions.migrateConversationsIfRequired()),
of(MigrationActions.migratePromptsIfRequired()),
of(MigrationActions.initFinish()),
),
),
);
Expand Down
4 changes: 4 additions & 0 deletions apps/chat/src/store/migration/migration.reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { MigrationState } from './migration.types';
export { MigrationSelectors };

const initialState: MigrationState = {
initialized: false,
conversationsToMigrateCount: 0,
migratedConversationsCount: 0,
failedMigratedConversations: [],
Expand All @@ -24,6 +25,9 @@ export const migrationSlice = createSlice({
initialState,
reducers: {
init: (state) => state,
initFinish: (state) => {
state.initialized = true;
},
migrateConversationsIfRequired: (state) => state,
initConversationsMigration: (
state,
Expand Down
5 changes: 5 additions & 0 deletions apps/chat/src/store/migration/migration.selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,8 @@ export const selectIsPromptsBackedUp = createSelector(
[rootSelector],
(state) => state.isPromptsBackedUp,
);

export const selectInitialized = createSelector(
[rootSelector],
(state) => state.initialized,
);
1 change: 1 addition & 0 deletions apps/chat/src/store/migration/migration.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Conversation } from '@/src/types/chat';
import { Prompt } from '@/src/types/prompt';

export interface MigrationState {
initialized: boolean;
conversationsToMigrateCount: number;
migratedConversationsCount: number;
failedMigratedConversations: Conversation[];
Expand Down
12 changes: 9 additions & 3 deletions apps/chat/src/store/models/models.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,16 @@ import { ModelsActions, ModelsSelectors } from './models.reducers';
import { Feature } from '@epam/ai-dial-shared';
import uniqBy from 'lodash-es/uniqBy';

const initEpic: AppEpic = (action$) =>
const initEpic: AppEpic = (action$, state$) =>
action$.pipe(
filter(ModelsActions.init.match),
switchMap(() => of(ModelsActions.getModels())),
filter(
(action) =>
ModelsActions.init.match(action) &&
!ModelsSelectors.selectInitialized(state$.value),
),
switchMap(() =>
concat(of(ModelsActions.getModels()), of(ModelsActions.initFinish())),
),
);

const initRecentModelsEpic: AppEpic = (action$, state$) =>
Expand Down
11 changes: 11 additions & 0 deletions apps/chat/src/store/models/models.reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import omit from 'lodash-es/omit';
import uniq from 'lodash-es/uniq';

export interface ModelsState {
initialized: boolean;
status: UploadStatus;
error: ErrorMessage | undefined;
models: DialAIEntityModel[];
Expand All @@ -39,6 +40,7 @@ export interface ModelsState {
}

const initialState: ModelsState = {
initialized: false,
status: UploadStatus.UNINITIALIZED,
error: undefined,
models: [],
Expand All @@ -56,6 +58,9 @@ export const modelsSlice = createSlice({
initialState,
reducers: {
init: (state) => state,
initFinish: (state) => {
state.initialized = true;
},
getModels: (state) => {
state.status = UploadStatus.LOADING;
},
Expand Down Expand Up @@ -360,6 +365,11 @@ const selectRecentWithInstalledModelsIds = createSelector(
},
);

const selectInitialized = createSelector(
[rootSelector],
(state) => state.initialized,
);

export const ModelsSelectors = {
selectIsInstalledModelsInitialized,
selectIsModelsLoaded,
Expand All @@ -378,6 +388,7 @@ export const ModelsSelectors = {
selectPublishedApplicationIds,
selectModelTopics,
selectRecentWithInstalledModelsIds,
selectInitialized,
};

export const ModelsActions = modelsSlice.actions;
9 changes: 7 additions & 2 deletions apps/chat/src/store/prompts/prompts.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,13 @@ import { UploadStatus } from '@epam/ai-dial-shared';
import omit from 'lodash-es/omit';
import uniq from 'lodash-es/uniq';

const initEpic: AppEpic = (action$) =>
const initEpic: AppEpic = (action$, state$) =>
action$.pipe(
filter((action) => PromptsActions.init.match(action)),
filter(
(action) =>
PromptsActions.init.match(action) &&
!PromptsSelectors.selectInitialized(state$.value),
),
switchMap(() =>
PromptService.getPrompts(undefined, true).pipe(
mergeMap((prompts) => {
Expand All @@ -88,6 +92,7 @@ const initEpic: AppEpic = (action$) =>
}),
),
of(PromptsActions.initFoldersAndPromptsSuccess()),
of(PromptsActions.initFinish()),
);
}),
),
Expand Down
Loading

0 comments on commit 7f02d2b

Please sign in to comment.