Skip to content

Commit 224e097

Browse files
Taras-Hlukhovetskyiilan7empest
authored andcommitted
Impl [Redirection] Wrong link redirection with invalid project name (#2209)
1 parent ad44cbe commit 224e097

File tree

7 files changed

+31
-43
lines changed

7 files changed

+31
-43
lines changed

src/components/ConsumerGroupsWrapper/ConsumerGroupsWrapper.js

+2-9
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@ import Loader from '../../common/Loader/Loader'
2828
import nuclioActions from '../../actions/nuclio'
2929
import { GROUP_BY_NONE } from '../../constants'
3030
import { areNuclioStreamsEnabled } from '../../utils/helper'
31-
import { isProjectValid } from '../../utils/handleRedirect'
3231
import { setFilters } from '../../reducers/filtersReducer'
3332
import { showErrorNotification } from '../../utils/notifications.util'
3433

3534
const ConsumerGroupsWrapper = ({
3635
fetchNuclioV3ioStreams,
3736
frontendSpec,
38-
projectsNames,
3937
resetV3ioStreamsError,
4038
v3ioStreams
4139
}) => {
@@ -48,10 +46,6 @@ const ConsumerGroupsWrapper = ({
4846
[frontendSpec]
4947
)
5048

51-
useEffect(() => {
52-
isProjectValid(navigate, projectsNames.data, params.projectName)
53-
}, [navigate, params.projectName, projectsNames.data])
54-
5549
useEffect(() => {
5650
dispatch(setFilters({ groupBy: GROUP_BY_NONE }))
5751
}, [dispatch])
@@ -99,10 +93,9 @@ const ConsumerGroupsWrapper = ({
9993
}
10094

10195
export default connect(
102-
({ appStore, nuclioStore, projectStore }) => ({
96+
({ appStore, nuclioStore }) => ({
10397
frontendSpec: appStore.frontendSpec,
104-
v3ioStreams: nuclioStore.v3ioStreams,
105-
projectsNames: projectStore.projectsNames
98+
v3ioStreams: nuclioStore.v3ioStreams
10699
}),
107100
{
108101
...nuclioActions

src/components/CreateJobPage/CreateJobPage.js

+1-7
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ under the Apache 2.0 license is conditioned upon your compliance with
1818
such restriction.
1919
*/
2020
import React, { useState, useEffect } from 'react'
21-
import { useNavigate, useParams } from 'react-router-dom'
21+
import { useParams } from 'react-router-dom'
2222
import { connect } from 'react-redux'
2323
import { includes, isEmpty } from 'lodash'
2424

@@ -30,7 +30,6 @@ import jobsActions from '../../actions/jobs'
3030
import projectsAction from '../../actions/projects'
3131
import { PANEL_CREATE_MODE } from '../../constants'
3232
import { generateProjectsList } from '../../utils/projects'
33-
import { isProjectValid } from '../../utils/handleRedirect'
3433
import { functionRunKinds } from '../Jobs/jobs.util'
3534

3635
const CreateJobPage = ({
@@ -42,7 +41,6 @@ const CreateJobPage = ({
4241
removeNewJob
4342
}) => {
4443
const params = useParams()
45-
const navigate = useNavigate()
4644
const [filterByName, setFilterByName] = useState('')
4745
const [filterMatches, setFilterMatches] = useState([])
4846
const [filteredFunctions, setFilteredFunctions] = useState([])
@@ -57,10 +55,6 @@ const CreateJobPage = ({
5755
const [templates, setTemplates] = useState([])
5856
const [showPanel, setShowPanel] = useState(false)
5957

60-
useEffect(() => {
61-
isProjectValid(navigate, projectStore.projectsNames.data, params.projectName)
62-
}, [navigate, params.projectName, projectStore.projectsNames.data])
63-
6458
useEffect(() => {
6559
if (!selectedProject) {
6660
setSelectedProject(params.projectName)

src/components/Jobs/Jobs.js

+1-6
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import {
3939
} from '../../constants'
4040
import { TERTIARY_BUTTON } from 'igz-controls/constants'
4141
import { actionCreator, actionsMenuHeader, monitorJob, rerunJob, tabs } from './jobs.util'
42-
import { isPageTabValid, isProjectValid } from '../../utils/handleRedirect'
42+
import { isPageTabValid } from '../../utils/handleRedirect'
4343

4444
export const JobsContext = React.createContext({})
4545

@@ -53,7 +53,6 @@ const Jobs = ({ fetchJobFunction }) => {
5353
const location = useLocation()
5454
const dispatch = useDispatch()
5555
const functionsStore = useSelector(store => store.functionsStore)
56-
const projectStore = useSelector(store => store.projectStore)
5756
const jobsStore = useSelector(store => store.jobsStore)
5857
const workflowsStore = useSelector(store => store.workflowsStore)
5958
const appStore = useSelector(store => store.appStore)
@@ -99,10 +98,6 @@ const Jobs = ({ fetchJobFunction }) => {
9998
}
10099
}, [navigate, params.pageTab, location])
101100

102-
useEffect(() => {
103-
isProjectValid(navigate, projectStore.projectsNames.data, params.projectName)
104-
}, [navigate, params.projectName, projectStore.projectsNames.data])
105-
106101
return (
107102
<>
108103
<div className="content-wrapper">

src/components/Project/ProjectMonitor.js

+8-10
Original file line numberDiff line numberDiff line change
@@ -115,28 +115,27 @@ const ProjectMonitor = ({
115115
}
116116
}, [isDemoMode, navigate, params, openRegisterArtifactModal, openRegisterModelModal])
117117

118-
const fetchProjectData = useCallback(() => {
119-
fetchProject(params.projectName).catch(error => {
118+
const fetchProjectDataAndSummary = useCallback(() => {
119+
Promise.all([fetchProject(params.projectName), fetchProjectSummary(params.projectName)]).catch(error => {
120120
handleFetchProjectError(error, navigate, setConfirmData)
121121
})
122-
}, [fetchProject, navigate, params.projectName])
122+
}, [fetchProject, fetchProjectSummary, navigate, params.projectName])
123+
124+
123125

124126
const resetProjectData = useCallback(() => {
125127
removeProjectData()
126128
}, [removeProjectData])
127129

128130
useEffect(() => {
129-
fetchProjectData()
130-
fetchProjectSummary(params.projectName)
131+
fetchProjectDataAndSummary()
131132

132133
return () => {
133134
resetProjectData()
134135
removeProjectSummary()
135136
}
136137
}, [
137-
fetchProjectSummary,
138-
fetchProjectData,
139-
params.projectName,
138+
fetchProjectDataAndSummary,
140139
removeProjectSummary,
141140
resetProjectData
142141
])
@@ -260,8 +259,7 @@ const ProjectMonitor = ({
260259
const handleRefresh = () => {
261260
removeProjectData()
262261
removeProjectSummary()
263-
fetchProjectData()
264-
fetchProjectSummary(params.projectName)
262+
fetchProjectDataAndSummary()
265263

266264
if (nuclioStreamsAreEnabled && !isNuclioModeDisabled) {
267265
fetchNuclioV3ioStreams(params.projectName)

src/components/ProjectSettings/ProjectSettings.js

+2-8
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,12 @@ import {
4242
} from '../../elements/MembersPopUp/membersReducer'
4343
import projectsIguazioApi from '../../api/projects-iguazio-api'
4444
import { PROJECTS_SETTINGS_MEMBERS_TAB, PROJECTS_SETTINGS_SECRETS_TAB } from '../../constants'
45-
import { isProjectValid } from '../../utils/handleRedirect'
4645
import { setNotification } from '../../reducers/notificationReducer'
4746
import { showErrorNotification } from '../../utils/notifications.util'
4847

4948
import './projectSettings.scss'
5049

51-
const ProjectSettings = ({ frontendSpec, projectStore }) => {
50+
const ProjectSettings = ({ frontendSpec }) => {
5251
const [projectMembersIsShown, setProjectMembersIsShown] = useState(false)
5352
const [projectOwnerIsShown, setProjectOwnerIsShown] = useState(false)
5453
const [membersState, membersDispatch] = useReducer(membersReducer, initialMembersState)
@@ -211,10 +210,6 @@ const ProjectSettings = ({ frontendSpec, projectStore }) => {
211210
}
212211
}, [fetchProjectUsersData, resetProjectData])
213212

214-
useEffect(() => {
215-
isProjectValid(navigate, projectStore.projectsNames.data, params.projectName)
216-
}, [navigate, params.projectName, projectStore.projectsNames.data])
217-
218213
useEffect(() => {
219214
if (!validTabs.includes(params.pageTab)) {
220215
navigate(`/projects/${params.projectName}/settings/general`)
@@ -258,8 +253,7 @@ const ProjectSettings = ({ frontendSpec, projectStore }) => {
258253
}
259254

260255
export default connect(
261-
({ appStore, projectStore }) => ({
262-
projectStore,
256+
({ appStore }) => ({
263257
frontendSpec: appStore.frontendSpec
264258
}),
265259
null

src/elements/ProjectSettingsGeneral/ProjectSettingsGeneral.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,20 @@ const ProjectSettingsGeneral = ({
279279
}
280280

281281
useEffect(() => {
282-
fetchProject(params.projectName)
282+
fetchProject(params.projectName).catch(error => {
283+
const customErrorMsg =
284+
error.response?.status === FORBIDDEN_ERROR_STATUS_CODE
285+
? 'Permission denied'
286+
: getErrorMsg(error, 'Failed to fetch project data')
287+
288+
showErrorNotification(dispatch, error, '', customErrorMsg)
289+
})
283290

284291
return () => {
285292
removeProjectData()
286293
setEditProjectData(initialEditProjectData)
287294
}
288-
}, [removeProjectData, params.pageTab, params.projectName, fetchProject])
295+
}, [removeProjectData, params.pageTab, params.projectName, fetchProject, dispatch])
289296

290297
return (
291298
<ProjectSettingsGeneralView

src/layout/Page/Page.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ such restriction.
1919
*/
2020
import React, { useEffect, useMemo, useRef } from 'react'
2121
import { useDispatch, useSelector } from 'react-redux'
22-
import { useParams, Outlet } from 'react-router-dom'
22+
import { useParams, Outlet, useNavigate } from 'react-router-dom'
2323
import classNames from 'classnames'
2424
import { isEmpty } from 'lodash'
2525

@@ -29,13 +29,15 @@ import DownloadContainer from '../../common/Download/DownloadContainer'
2929
import { getTransitionEndEventName } from 'igz-controls/utils/common.util'
3030
import { fetchFrontendSpec } from '../../reducers/appReducer'
3131
import { NAVBAR_WIDTH_CLOSED, NAVBAR_WIDTH_OPENED } from '../../constants'
32+
import { isProjectValid } from '../../utils/handleRedirect'
3233

3334
import './Page.scss'
3435

3536
const Page = ({ isNavbarPinned, setProjectName }) => {
3637
const { projectName } = useParams()
3738
const mainRef = useRef()
3839
const dispatch = useDispatch()
40+
const navigate = useNavigate()
3941
const transitionEndEventName = useMemo(() => getTransitionEndEventName(), [])
4042
const pinnedClasses = classNames(!(isNavbarPinned && projectName) && 'unpinned')
4143
const mainStyles = {
@@ -46,11 +48,16 @@ const Page = ({ isNavbarPinned, setProjectName }) => {
4648
: `${NAVBAR_WIDTH_CLOSED}px`
4749
}
4850
const { frontendSpec, frontendSpecPopupIsOpened } = useSelector(store => store.appStore)
51+
const { projectsNames } = useSelector(store => store.projectStore)
4952

5053
useEffect(() => {
5154
setProjectName(projectName)
5255
}, [projectName, setProjectName])
5356

57+
useEffect(() => {
58+
isProjectValid(navigate, projectsNames.data, projectName)
59+
}, [navigate, projectName, projectsNames.data])
60+
5461
useEffect(() => {
5562
if (mainRef) {
5663
mainRef.current.addEventListener(transitionEndEventName, event => {

0 commit comments

Comments
 (0)