Skip to content
Snippets Groups Projects
Commit 54821043 authored by mateusz-winiarczyk's avatar mateusz-winiarczyk
Browse files

feat(project): deploy and project adjustments (MIN-304)

parent 3edc9180
No related branches found
No related tags found
2 merge requests!223reset the pin numbers before search results are fetch (so the results will be...,!159feat(project): deploy and project adjustments (MIN-304)
...@@ -14,6 +14,7 @@ import { PluginsEventBus } from '@/services/pluginsManager/pluginsEventBus'; ...@@ -14,6 +14,7 @@ import { PluginsEventBus } from '@/services/pluginsManager/pluginsEventBus';
import { showToast } from '@/utils/showToast'; import { showToast } from '@/utils/showToast';
import { getErrorMessage } from '@/utils/getErrorMessage'; import { getErrorMessage } from '@/utils/getErrorMessage';
import { ThunkConfig } from '@/types/store'; import { ThunkConfig } from '@/types/store';
import { BASE_API_URL } from '@/constants';
import { apiPath } from '../apiPath'; import { apiPath } from '../apiPath';
import { import {
CHUNK_SIZE, CHUNK_SIZE,
...@@ -124,7 +125,7 @@ const uploadContent = async ({ createdFile, overlayContent }: UploadContentArgs) ...@@ -124,7 +125,7 @@ const uploadContent = async ({ createdFile, overlayContent }: UploadContentArgs)
const chunk = data.slice(uploadedLength, uploadedLength + CHUNK_SIZE); const chunk = data.slice(uploadedLength, uploadedLength + CHUNK_SIZE);
const responeJSON = await fetch( const responeJSON = await fetch(
`${process.env.NEXT_PUBLIC_BASE_API_URL}/${apiPath.uploadOverlayFileContent(createdFile.id)}`, `${BASE_API_URL}/${apiPath.uploadOverlayFileContent(createdFile.id)}`,
{ {
method: 'POST', method: 'POST',
credentials: 'include', credentials: 'include',
......
...@@ -6,9 +6,10 @@ export const PROJECT_STATE_INITIAL_MOCK: ProjectState = { ...@@ -6,9 +6,10 @@ export const PROJECT_STATE_INITIAL_MOCK: ProjectState = {
data: undefined, data: undefined,
loading: 'idle', loading: 'idle',
error: DEFAULT_ERROR, error: DEFAULT_ERROR,
projectId: '',
}; };
export const PROJECT_OVERVIEW_IMAGE_MOCK: OverviewImageView = { export const PROJECT_OVERVIEW_IMAGE_MOCK: NonNullable<OverviewImageView> = {
idObject: 440, idObject: 440,
filename: '9d4911bdeeea752f076e57a91d9b1f45/biolayout_main_root.png', filename: '9d4911bdeeea752f076e57a91d9b1f45/biolayout_main_root.png',
width: 5776, width: 5776,
......
...@@ -17,6 +17,7 @@ const INITIAL_STATE: ProjectState = { ...@@ -17,6 +17,7 @@ const INITIAL_STATE: ProjectState = {
data: undefined, data: undefined,
loading: 'idle', loading: 'idle',
error: { name: '', message: '' }, error: { name: '', message: '' },
projectId: '',
}; };
describe('project reducer', () => { describe('project reducer', () => {
......
import { getProjectById } from '@/redux/project/project.thunks'; import { getProjectById, setProjectId } from '@/redux/project/project.thunks';
import { ProjectState } from '@/redux/project/project.types'; import { ProjectState } from '@/redux/project/project.types';
import { ActionReducerMapBuilder } from '@reduxjs/toolkit'; import { ActionReducerMapBuilder } from '@reduxjs/toolkit';
...@@ -15,3 +15,9 @@ export const getProjectByIdReducer = (builder: ActionReducerMapBuilder<ProjectSt ...@@ -15,3 +15,9 @@ export const getProjectByIdReducer = (builder: ActionReducerMapBuilder<ProjectSt
// TODO to discuss manage state of failure // TODO to discuss manage state of failure
}); });
}; };
export const setProjectIdReducer = (builder: ActionReducerMapBuilder<ProjectState>): void => {
builder.addCase(setProjectId.fulfilled, (state, action) => {
state.projectId = action.payload;
});
};
...@@ -10,7 +10,7 @@ export const projectDataSelector = createSelector(projectSelector, project => pr ...@@ -10,7 +10,7 @@ export const projectDataSelector = createSelector(projectSelector, project => pr
export const projectDefaultOverviewImageIdSelector = createSelector( export const projectDefaultOverviewImageIdSelector = createSelector(
projectDataSelector, projectDataSelector,
projectData => projectData?.topOverviewImage.idObject || OVERVIEW_IMAGE_ID_DEFAULT, projectData => projectData?.topOverviewImage?.idObject || OVERVIEW_IMAGE_ID_DEFAULT,
); );
export const currentOverviewImageSelector = createSelector( export const currentOverviewImageSelector = createSelector(
...@@ -63,3 +63,5 @@ export const organismNameSelector = createSelector( ...@@ -63,3 +63,5 @@ export const organismNameSelector = createSelector(
); );
export const versionSelector = createSelector(projectDataSelector, state => state?.version); export const versionSelector = createSelector(projectDataSelector, state => state?.version);
export const projectMainIdSelector = createSelector(projectSelector, project => project.projectId);
import { ProjectState } from '@/redux/project/project.types'; import { ProjectState } from '@/redux/project/project.types';
import { createSlice } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit';
import { getProjectByIdReducer } from './project.reducers'; import { getProjectByIdReducer, setProjectIdReducer } from './project.reducers';
const initialState: ProjectState = { const initialState: ProjectState = {
data: undefined, data: undefined,
loading: 'idle', loading: 'idle',
error: { name: '', message: '' }, error: { name: '', message: '' },
projectId: '',
}; };
const projectSlice = createSlice({ const projectSlice = createSlice({
...@@ -14,6 +15,7 @@ const projectSlice = createSlice({ ...@@ -14,6 +15,7 @@ const projectSlice = createSlice({
reducers: {}, reducers: {},
extraReducers: builder => { extraReducers: builder => {
getProjectByIdReducer(builder); getProjectByIdReducer(builder);
setProjectIdReducer(builder);
}, },
}); });
......
...@@ -5,8 +5,10 @@ import { validateDataUsingZodSchema } from '@/utils/validateDataUsingZodSchema'; ...@@ -5,8 +5,10 @@ import { validateDataUsingZodSchema } from '@/utils/validateDataUsingZodSchema';
import { createAsyncThunk } from '@reduxjs/toolkit'; import { createAsyncThunk } from '@reduxjs/toolkit';
import { getErrorMessage } from '@/utils/getErrorMessage'; import { getErrorMessage } from '@/utils/getErrorMessage';
import { ThunkConfig } from '@/types/store'; import { ThunkConfig } from '@/types/store';
import { DEFAULT_PROJECT_ID } from '@/constants';
import { apiPath } from '../apiPath'; import { apiPath } from '../apiPath';
import { PROJECT_FETCHING_ERROR_PREFIX } from './project.constants'; import { PROJECT_FETCHING_ERROR_PREFIX } from './project.constants';
import { SetProjectIdParams } from './project.types';
export const getProjectById = createAsyncThunk<Project | undefined, string, ThunkConfig>( export const getProjectById = createAsyncThunk<Project | undefined, string, ThunkConfig>(
'project/getProjectById', 'project/getProjectById',
...@@ -23,3 +25,12 @@ export const getProjectById = createAsyncThunk<Project | undefined, string, Thun ...@@ -23,3 +25,12 @@ export const getProjectById = createAsyncThunk<Project | undefined, string, Thun
} }
}, },
); );
export const setProjectId = createAsyncThunk<string, SetProjectIdParams, ThunkConfig>(
'project/setProjectId',
async ({ queryData }) => {
const projectId = queryData?.id || DEFAULT_PROJECT_ID;
return projectId;
},
);
import { Loading } from '@/types/loadingState'; import { Loading } from '@/types/loadingState';
import { Project } from '@/types/models'; import { Project } from '@/types/models';
import { QueryData } from '@/types/query';
export type ProjectState = { export type ProjectState = {
projectId: string;
data: Project | undefined; data: Project | undefined;
loading: Loading; loading: Loading;
error: Error; error: Error;
}; };
export type SetProjectIdParams = { queryData: QueryData };
...@@ -20,7 +20,7 @@ import { ...@@ -20,7 +20,7 @@ import {
getAllUserOverlaysByCreator, getAllUserOverlaysByCreator,
} from '../overlays/overlays.thunks'; } from '../overlays/overlays.thunks';
import { getAllPlugins, getInitPlugins } from '../plugins/plugins.thunks'; import { getAllPlugins, getInitPlugins } from '../plugins/plugins.thunks';
import { getProjectById } from '../project/project.thunks'; import { getProjectById, setProjectId } from '../project/project.thunks';
import { setPerfectMatch } from '../search/search.slice'; import { setPerfectMatch } from '../search/search.slice';
import { getSearchData } from '../search/search.thunks'; import { getSearchData } from '../search/search.thunks';
import { getStatisticsById } from '../statistics/statistics.thunks'; import { getStatisticsById } from '../statistics/statistics.thunks';
...@@ -35,6 +35,8 @@ export const fetchInitialAppData = createAsyncThunk< ...@@ -35,6 +35,8 @@ export const fetchInitialAppData = createAsyncThunk<
InitializeAppParams, InitializeAppParams,
{ dispatch: AppDispatch } { dispatch: AppDispatch }
>('appInit/fetchInitialAppData', async ({ queryData }, { dispatch }): Promise<void> => { >('appInit/fetchInitialAppData', async ({ queryData }, { dispatch }): Promise<void> => {
dispatch(setProjectId({ queryData }));
if (queryData.pluginsId) { if (queryData.pluginsId) {
await dispatch( await dispatch(
getInitPlugins({ getInitPlugins({
......
...@@ -5,6 +5,7 @@ import { mapDataSelector } from '../map/map.selectors'; ...@@ -5,6 +5,7 @@ import { mapDataSelector } from '../map/map.selectors';
import { perfectMatchSelector, searchValueSelector } from '../search/search.selectors'; import { perfectMatchSelector, searchValueSelector } from '../search/search.selectors';
import { activeOverlaysIdSelector } from '../overlayBioEntity/overlayBioEntity.selector'; import { activeOverlaysIdSelector } from '../overlayBioEntity/overlayBioEntity.selector';
import { activePluginsIdSelector } from '../plugins/plugins.selectors'; import { activePluginsIdSelector } from '../plugins/plugins.selectors';
import { projectMainIdSelector } from '../project/project.selectors';
export const queryDataParamsSelector = createSelector( export const queryDataParamsSelector = createSelector(
searchValueSelector, searchValueSelector,
...@@ -12,12 +13,14 @@ export const queryDataParamsSelector = createSelector( ...@@ -12,12 +13,14 @@ export const queryDataParamsSelector = createSelector(
mapDataSelector, mapDataSelector,
activeOverlaysIdSelector, activeOverlaysIdSelector,
activePluginsIdSelector, activePluginsIdSelector,
projectMainIdSelector,
( (
searchValue, searchValue,
perfectMatch, perfectMatch,
{ modelId, backgroundId, position }, { modelId, backgroundId, position },
activeOverlaysId, activeOverlaysId,
activePluginsId, activePluginsId,
id,
): QueryDataParams => { ): QueryDataParams => {
const joinedSearchValue = searchValue.join(';'); const joinedSearchValue = searchValue.join(';');
const shouldIncludeSearchValue = searchValue.length > ZERO && joinedSearchValue; const shouldIncludeSearchValue = searchValue.length > ZERO && joinedSearchValue;
...@@ -26,6 +29,7 @@ export const queryDataParamsSelector = createSelector( ...@@ -26,6 +29,7 @@ export const queryDataParamsSelector = createSelector(
const shouldIncludePluginsId = activePluginsId.length > ZERO; const shouldIncludePluginsId = activePluginsId.length > ZERO;
const queryDataParams: QueryDataParams = { const queryDataParams: QueryDataParams = {
id,
perfectMatch, perfectMatch,
modelId, modelId,
backgroundId, backgroundId,
......
import { Point } from './map'; import { Point } from './map';
export interface QueryData { export interface QueryData {
id?: string;
searchValue?: string[]; searchValue?: string[];
perfectMatch: boolean; perfectMatch: boolean;
modelId?: number; modelId?: number;
...@@ -11,6 +12,7 @@ export interface QueryData { ...@@ -11,6 +12,7 @@ export interface QueryData {
} }
export interface QueryDataParams { export interface QueryDataParams {
id?: string;
searchValue?: string; searchValue?: string;
perfectMatch: boolean; perfectMatch: boolean;
modelId?: number; modelId?: number;
...@@ -23,6 +25,7 @@ export interface QueryDataParams { ...@@ -23,6 +25,7 @@ export interface QueryDataParams {
} }
export interface QueryDataRouterParams { export interface QueryDataRouterParams {
id?: string;
searchValue?: string; searchValue?: string;
perfectMatch?: string; perfectMatch?: string;
modelId?: string; modelId?: string;
......
import { QueryData, QueryDataRouterParams } from '@/types/query'; import { QueryData, QueryDataRouterParams } from '@/types/query';
export const parseQueryToTypes = (query: QueryDataRouterParams): QueryData => ({ export const parseQueryToTypes = (query: QueryDataRouterParams): QueryData => ({
id: query.id,
searchValue: query.searchValue?.split(';'), searchValue: query.searchValue?.split(';'),
perfectMatch: query?.perfectMatch === 'true' || false, perfectMatch: query?.perfectMatch === 'true' || false,
modelId: Number(query.modelId) || undefined, modelId: Number(query.modelId) || undefined,
......
...@@ -48,6 +48,7 @@ describe('useReduxBusQueryManager - util', () => { ...@@ -48,6 +48,7 @@ describe('useReduxBusQueryManager - util', () => {
project: { project: {
...loadedDataMock, ...loadedDataMock,
data: undefined, data: undefined,
projectId: '',
}, },
map: { map: {
...loadedDataMock, ...loadedDataMock,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment