summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-web/opendc-web-ui')
-rw-r--r--opendc-web/opendc-web-ui/src/api/topologies.js8
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/map/MapStageComponent.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js28
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js43
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js14
-rw-r--r--opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js12
-rw-r--r--opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js12
-rw-r--r--opendc-web/opendc-web-ui/src/containers/projects/ProjectListContainer.js1
-rw-r--r--opendc-web/opendc-web-ui/src/data/experiments.js15
-rw-r--r--opendc-web/opendc-web-ui/src/data/project.js96
-rw-r--r--opendc-web/opendc-web-ui/src/data/topology.js55
-rw-r--r--opendc-web/opendc-web-ui/src/pages/_app.js12
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/topologies.js8
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/index.js4
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/objects.js4
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/topology.js28
16 files changed, 181 insertions, 163 deletions
diff --git a/opendc-web/opendc-web-ui/src/api/topologies.js b/opendc-web/opendc-web-ui/src/api/topologies.js
index 40685094..74fc1977 100644
--- a/opendc-web/opendc-web-ui/src/api/topologies.js
+++ b/opendc-web/opendc-web-ui/src/api/topologies.js
@@ -22,12 +22,12 @@
import { request } from './index'
-export function addTopology(auth, topology) {
- return request(auth, `projects/${topology.projectId}/topologies`, 'POST', { topology })
+export function fetchTopology(auth, topologyId) {
+ return request(auth, `topologies/${topologyId}`)
}
-export function getTopology(auth, topologyId) {
- return request(auth, `topologies/${topologyId}`)
+export function addTopology(auth, topology) {
+ return request(auth, `projects/${topology.projectId}/topologies`, 'POST', { topology })
}
export function updateTopology(auth, topology) {
diff --git a/opendc-web/opendc-web-ui/src/components/app/map/MapStageComponent.js b/opendc-web/opendc-web-ui/src/components/app/map/MapStageComponent.js
index a8e156ec..c3177fe1 100644
--- a/opendc-web/opendc-web-ui/src/components/app/map/MapStageComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/map/MapStageComponent.js
@@ -1,4 +1,3 @@
-/* eslint-disable react-hooks/exhaustive-deps */
import PropTypes from 'prop-types'
import React, { useEffect, useRef, useState } from 'react'
import { HotKeys } from 'react-hotkeys'
@@ -42,7 +41,6 @@ function MapStageComponent({
const updateScale = (e) => zoomInOnPosition(e.deltaY < 0, x, y)
// We explicitly do not specify any dependencies to prevent infinitely dispatching updateDimensions commands
- // eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(() => {
updateDimensions()
@@ -60,7 +58,7 @@ function MapStageComponent({
window.removeEventListener('resize', updateDimensions)
window.removeEventListener('wheel', updateScale)
}
- }, [])
+ }, []) // eslint-disable-line react-hooks/exhaustive-deps
const store = useStore()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js
index 01183724..1fb88253 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js
@@ -1,12 +1,9 @@
import React, { useState } from 'react'
-import { useDispatch } from 'react-redux'
import { useRouter } from 'next/router'
import PortfolioListComponent from '../../../../components/app/sidebars/project/PortfolioListComponent'
import NewPortfolioModalComponent from '../../../../components/modals/custom-components/NewPortfolioModalComponent'
import { usePortfolios, useProject } from '../../../../data/project'
-import { useMutation, useQueryClient } from 'react-query'
-import { addPortfolio, deletePortfolio } from '../../../../api/portfolios'
-import { useAuth } from '../../../../auth'
+import { useMutation } from 'react-query'
const PortfolioListContainer = () => {
const router = useRouter()
@@ -16,24 +13,9 @@ const PortfolioListContainer = () => {
.filter((res) => res.data)
.map((res) => res.data)
- const auth = useAuth()
- const queryClient = useQueryClient()
- const addMutation = useMutation((data) => addPortfolio(auth, data), {
- onSuccess: async (result) => {
- await queryClient.invalidateQueries(['projects', currentProjectId])
- },
- })
- const deleteMutation = useMutation((id) => deletePortfolio(auth, id), {
- onSuccess: async (result) => {
- queryClient.setQueryData(['projects', currentProjectId], (old) => ({
- ...old,
- portfolioIds: old.portfolioIds.filter((id) => id !== result._id),
- }))
- queryClient.removeQueries(['portfolios', result._id])
- },
- })
+ const { mutate: addPortfolio } = useMutation('addPortfolio')
+ const { mutateAsync: deletePortfolio } = useMutation('deletePortfolio')
- const dispatch = useDispatch()
const [isVisible, setVisible] = useState(false)
const actions = {
onNewPortfolio: () => setVisible(true),
@@ -42,14 +24,14 @@ const PortfolioListContainer = () => {
},
onDeletePortfolio: async (id) => {
if (id) {
- await deleteMutation.mutateAsync(id)
+ await deletePortfolio(id)
await router.push(`/projects/${currentProjectId}`)
}
},
}
const callback = (name, targets) => {
if (name) {
- addMutation.mutate({ projectId: currentProjectId, name, targets })
+ addPortfolio({ projectId: currentProjectId, name, targets })
}
setVisible(false)
}
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js
index 6bfc8599..62761583 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js
@@ -2,52 +2,33 @@ import PropTypes from 'prop-types'
import React, { useState } from 'react'
import ScenarioListComponent from '../../../../components/app/sidebars/project/ScenarioListComponent'
import NewScenarioModalComponent from '../../../../components/modals/custom-components/NewScenarioModalComponent'
-import { useProjectTopologies } from '../../../../data/topology'
-import { usePortfolio, useScenarios } from '../../../../data/project'
+import { useTopologies } from '../../../../data/topology'
+import { usePortfolio, useProject, useScenarios } from '../../../../data/project'
import { useSchedulers, useTraces } from '../../../../data/experiments'
-import { useAuth } from '../../../../auth'
-import { useMutation, useQueryClient } from 'react-query'
-import { addScenario, deleteScenario } from '../../../../api/scenarios'
+import { useMutation } from 'react-query'
const ScenarioListContainer = ({ portfolioId }) => {
const { data: portfolio } = usePortfolio(portfolioId)
+ const { data: project } = useProject(portfolio?.projectId)
const scenarios = useScenarios(portfolio?.scenarioIds ?? [])
.filter((res) => res.data)
.map((res) => res.data)
- const topologies = useProjectTopologies()
+ const topologies = useTopologies(project?.topologyIds ?? [])
+ .filter((res) => res.data)
+ .map((res) => res.data)
const traces = useTraces().data ?? []
const schedulers = useSchedulers().data ?? []
- const auth = useAuth()
- const queryClient = useQueryClient()
- const addMutation = useMutation((data) => addScenario(auth, data), {
- onSuccess: async (result) => {
- await queryClient.invalidateQueries(['portfolios', portfolioId])
- },
- })
- const deleteMutation = useMutation((id) => deleteScenario(auth, id), {
- onSuccess: async (result) => {
- queryClient.setQueryData(['portfolios', portfolioId], (old) => ({
- ...old,
- scenarioIds: old.scenarioIds.filter((id) => id !== result._id),
- }))
- queryClient.removeQueries(['scenarios', result._id])
- },
- })
+ const { mutate: addScenario } = useMutation('addScenario')
+ const { mutate: deleteScenario } = useMutation('deleteScenario')
const [isVisible, setVisible] = useState(false)
- const onNewScenario = (currentPortfolioId) => {
- setVisible(true)
- }
- const onDeleteScenario = (id) => {
- if (id) {
- deleteMutation.mutate(id)
- }
- }
+ const onNewScenario = () => setVisible(true)
+ const onDeleteScenario = (id) => id && deleteScenario(id)
const callback = (name, portfolioId, trace, topology, operational) => {
if (name) {
- addMutation.mutate({
+ addScenario({
portfolioId,
name,
trace,
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js
index 55f8bd00..78db166c 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js
@@ -3,28 +3,32 @@ import { useDispatch } from 'react-redux'
import TopologyListComponent from '../../../../components/app/sidebars/project/TopologyListComponent'
import { setCurrentTopology } from '../../../../redux/actions/topology/building'
import { useRouter } from 'next/router'
-import { addTopology, deleteTopology } from '../../../../redux/actions/topologies'
+import { addTopology } from '../../../../redux/actions/topologies'
import NewTopologyModalComponent from '../../../../components/modals/custom-components/NewTopologyModalComponent'
-import { useActiveTopology, useProjectTopologies } from '../../../../data/topology'
+import { useActiveTopology, useTopologies } from '../../../../data/topology'
import { useProject } from '../../../../data/project'
+import { useMutation } from 'react-query'
const TopologyListContainer = () => {
const dispatch = useDispatch()
const router = useRouter()
const { project: currentProjectId } = router.query
const { data: currentProject } = useProject(currentProjectId)
- const topologies = useProjectTopologies()
+ const topologies = useTopologies(currentProject?.topologyIds ?? [])
+ .filter((res) => res.data)
+ .map((res) => res.data)
const currentTopologyId = useActiveTopology()?._id
const [isVisible, setVisible] = useState(false)
+ const { mutate: deleteTopology } = useMutation('deleteTopology')
+
const onChooseTopology = async (id) => {
dispatch(setCurrentTopology(id))
await router.push(`/projects/${currentProjectId}/topologies/${id}`)
}
const onDeleteTopology = async (id) => {
if (id) {
- dispatch(deleteTopology(id))
- dispatch(setCurrentTopology(currentProject.topologyIds[0]))
+ deleteTopology(id)
await router.push(`/projects/${currentProjectId}`)
}
}
diff --git a/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js b/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
index c844fe2d..ac0edae4 100644
--- a/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
@@ -3,23 +3,17 @@ import TextInputModal from '../../components/modals/TextInputModal'
import { Button } from 'reactstrap'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faPlus } from '@fortawesome/free-solid-svg-icons'
-import { useMutation, useQueryClient } from 'react-query'
-import { addProject } from '../../api/projects'
-import { useAuth } from '../../auth'
+import { useMutation } from 'react-query'
/**
* A container for creating a new project.
*/
const NewProjectContainer = () => {
const [isVisible, setVisible] = useState(false)
- const auth = useAuth()
- const queryClient = useQueryClient()
- const mutation = useMutation((data) => addProject(auth, data), {
- onSuccess: (result) => queryClient.setQueryData('projects', (old) => [...(old || []), result]),
- })
+ const { mutate: addProject } = useMutation('addProject')
const callback = (text) => {
if (text) {
- mutation.mutate({ name: text })
+ addProject({ name: text })
}
setVisible(false)
}
diff --git a/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js b/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js
index eba388d6..62985742 100644
--- a/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js
+++ b/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js
@@ -1,18 +1,12 @@
import React from 'react'
import ProjectActionButtons from '../../components/projects/ProjectActionButtons'
-import { useMutation, useQueryClient } from 'react-query'
-import { useAuth } from '../../auth'
-import { deleteProject } from '../../api/projects'
+import { useMutation } from 'react-query'
const ProjectActions = (props) => {
- const auth = useAuth()
- const queryClient = useQueryClient()
- const mutation = useMutation((projectId) => deleteProject(auth, projectId), {
- onSuccess: () => queryClient.invalidateQueries('projects'),
- })
+ const { mutate: deleteProject } = useMutation('deleteProject')
const actions = {
onViewUsers: (id) => {}, // TODO implement user viewing
- onDelete: (id) => mutation.mutate(id),
+ onDelete: (id) => deleteProject(id),
}
return <ProjectActionButtons {...props} {...actions} />
}
diff --git a/opendc-web/opendc-web-ui/src/containers/projects/ProjectListContainer.js b/opendc-web/opendc-web-ui/src/containers/projects/ProjectListContainer.js
index 91e8ac5a..b5c5dd68 100644
--- a/opendc-web/opendc-web-ui/src/containers/projects/ProjectListContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/projects/ProjectListContainer.js
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types'
import ProjectList from '../../components/projects/ProjectList'
import { useAuth } from '../../auth'
import { useProjects } from '../../data/project'
-import { useQueryClient } from 'react-query'
const getVisibleProjects = (projects, filter, userId) => {
switch (filter) {
diff --git a/opendc-web/opendc-web-ui/src/data/experiments.js b/opendc-web/opendc-web-ui/src/data/experiments.js
index 4797bacb..a76ea53f 100644
--- a/opendc-web/opendc-web-ui/src/data/experiments.js
+++ b/opendc-web/opendc-web-ui/src/data/experiments.js
@@ -22,21 +22,26 @@
import { useQuery } from 'react-query'
import { fetchTraces } from '../api/traces'
-import { useAuth } from '../auth'
import { fetchSchedulers } from '../api/schedulers'
/**
+ * Configure the query defaults for the experiment endpoints.
+ */
+export function configureExperimentClient(queryClient, auth) {
+ queryClient.setQueryDefaults('traces', { queryFn: () => fetchTraces(auth) })
+ queryClient.setQueryDefaults('schedulers', { queryFn: () => fetchSchedulers(auth) })
+}
+
+/**
* Return the available traces to experiment with.
*/
export function useTraces() {
- const auth = useAuth()
- return useQuery('traces', () => fetchTraces(auth))
+ return useQuery('traces')
}
/**
* Return the available schedulers to experiment with.
*/
export function useSchedulers() {
- const auth = useAuth()
- return useQuery('schedulers', () => fetchSchedulers(auth))
+ return useQuery('schedulers')
}
diff --git a/opendc-web/opendc-web-ui/src/data/project.js b/opendc-web/opendc-web-ui/src/data/project.js
index 5cf620da..256203a3 100644
--- a/opendc-web/opendc-web-ui/src/data/project.js
+++ b/opendc-web/opendc-web-ui/src/data/project.js
@@ -21,45 +21,113 @@
*/
import { useQueries, useQuery } from 'react-query'
-import { fetchProject, fetchProjects } from '../api/projects'
-import { useAuth } from '../auth'
+import { addProject, deleteProject, fetchProject, fetchProjects } from '../api/projects'
import { useRouter } from 'next/router'
-import { fetchPortfolio } from '../api/portfolios'
-import { fetchScenario } from '../api/scenarios'
+import { addPortfolio, deletePortfolio, fetchPortfolio } from '../api/portfolios'
+import { addScenario, deleteScenario, fetchScenario } from '../api/scenarios'
+
+/**
+ * Configure the query defaults for the project endpoints.
+ */
+export function configureProjectClient(queryClient, auth) {
+ queryClient.setQueryDefaults('projects', {
+ queryFn: ({ queryKey }) => (queryKey.length === 1 ? fetchProjects(auth) : fetchProject(auth, queryKey[1])),
+ })
+
+ queryClient.setMutationDefaults('addProject', {
+ mutationFn: (data) => addProject(auth, data),
+ onSuccess: async (result) => {
+ queryClient.setQueryData('projects', (old = []) => [...old, result])
+ },
+ })
+ queryClient.setMutationDefaults('deleteProject', {
+ mutationFn: (id) => deleteProject(auth, id),
+ onSuccess: async (result) => {
+ queryClient.setQueryData('projects', (old = []) => old.filter((project) => project._id !== result._id))
+ queryClient.removeQueries(['projects', result._id])
+ },
+ })
+
+ queryClient.setQueryDefaults('portfolios', {
+ queryFn: ({ queryKey }) => fetchPortfolio(auth, queryKey[1]),
+ })
+ queryClient.setMutationDefaults('addPortfolio', {
+ mutationFn: (data) => addPortfolio(auth, data),
+ onSuccess: async (result) => {
+ queryClient.setQueryData(['projects', result.projectId], (old) => ({
+ ...old,
+ portfolioIds: [...old.portfolioIds, result._id],
+ }))
+ queryClient.setQueryData(['portfolios', result._id], result)
+ },
+ })
+ queryClient.setMutationDefaults('deletePortfolio', {
+ mutationFn: (id) => deletePortfolio(auth, id),
+ onSuccess: async (result) => {
+ queryClient.setQueryData(['projects', result.projectId], (old) => ({
+ ...old,
+ portfolioIds: old.portfolioIds.filter((id) => id !== result._id),
+ }))
+ queryClient.removeQueries(['portfolios', result._id])
+ },
+ })
+
+ queryClient.setQueryDefaults('scenarios', {
+ queryFn: ({ queryKey }) => fetchScenario(auth, queryKey[1]),
+ })
+ queryClient.setMutationDefaults('addScenario', {
+ mutationFn: (data) => addScenario(auth, data),
+ onSuccess: async (result) => {
+ // Register updated scenario in cache
+ queryClient.setQueryData(['scenarios', result._id], result)
+
+ // Add scenario id to portfolio
+ queryClient.setQueryData(['portfolios', result.portfolioId], (old) => ({
+ ...old,
+ scenarioIds: [...old.scenarioIds, result._id],
+ }))
+ },
+ })
+ queryClient.setMutationDefaults('deleteScenario', {
+ mutationFn: (id) => deleteScenario(auth, id),
+ onSuccess: async (result) => {
+ queryClient.setQueryData(['portfolios', result.portfolioId], (old) => ({
+ ...old,
+ scenarioIds: old.scenarioIds.filter((id) => id !== result._id),
+ }))
+ queryClient.removeQueries(['scenarios', result._id])
+ },
+ })
+}
/**
* Return the available projects.
*/
export function useProjects() {
- const auth = useAuth()
- return useQuery('projects', () => fetchProjects(auth))
+ return useQuery('projects')
}
/**
* Return the project with the specified identifier.
*/
export function useProject(projectId) {
- const auth = useAuth()
- return useQuery(['projects', projectId], () => fetchProject(auth, projectId), { enabled: !!projectId })
+ return useQuery(['projects', projectId], { enabled: !!projectId })
}
/**
* Return the portfolio with the specified identifier.
*/
export function usePortfolio(portfolioId) {
- const auth = useAuth()
- return useQuery(['portfolios', portfolioId], () => fetchPortfolio(auth, portfolioId), { enabled: !!portfolioId })
+ return useQuery(['portfolios', portfolioId], { enabled: !!portfolioId })
}
/**
* Return the portfolios for the specified project id.
*/
export function usePortfolios(portfolioIds) {
- const auth = useAuth()
return useQueries(
portfolioIds.map((portfolioId) => ({
queryKey: ['portfolios', portfolioId],
- queryFn: () => fetchPortfolio(auth, portfolioId),
}))
)
}
@@ -68,11 +136,9 @@ export function usePortfolios(portfolioIds) {
* Return the scenarios with the specified identifiers.
*/
export function useScenarios(scenarioIds) {
- const auth = useAuth()
return useQueries(
scenarioIds.map((scenarioId) => ({
- queryKey: ['scenario', scenarioId],
- queryFn: () => fetchScenario(auth, scenarioId),
+ queryKey: ['scenarios', scenarioId],
}))
)
}
diff --git a/opendc-web/opendc-web-ui/src/data/topology.js b/opendc-web/opendc-web-ui/src/data/topology.js
index 4c746a7e..92911a70 100644
--- a/opendc-web/opendc-web-ui/src/data/topology.js
+++ b/opendc-web/opendc-web-ui/src/data/topology.js
@@ -21,7 +21,40 @@
*/
import { useSelector } from 'react-redux'
-import { useActiveProjectId, useProject } from './project'
+import { useQueries } from 'react-query'
+import { addTopology, deleteTopology, fetchTopology, updateTopology } from '../api/topologies'
+
+/**
+ * Configure the query defaults for the topology endpoints.
+ */
+export function configureTopologyClient(queryClient, auth) {
+ queryClient.setQueryDefaults('topologies', { queryFn: ({ queryKey }) => fetchTopology(auth, queryKey[1]) })
+
+ queryClient.setMutationDefaults('addTopology', {
+ mutationFn: (data) => addTopology(auth, data),
+ onSuccess: async (result) => {
+ queryClient.setQueryData(['projects', result.projectId], (old) => ({
+ ...old,
+ topologyIds: [...old.topologyIds, result._id],
+ }))
+ queryClient.setQueryData(['topologies', result._id], result)
+ },
+ })
+ queryClient.setMutationDefaults('updateTopology', {
+ mutationFn: (data) => updateTopology(auth, data),
+ onSuccess: async (result) => queryClient.setQueryData(['topologies', result._id], result),
+ })
+ queryClient.setMutationDefaults('deleteTopology', {
+ mutationFn: (id) => deleteTopology(auth, id),
+ onSuccess: async (result) => {
+ queryClient.setQueryData(['projects', result.projectId], (old) => ({
+ ...old,
+ topologyIds: old.topologyIds.filter((id) => id !== result._id),
+ }))
+ queryClient.removeQueries(['topologies', result._id])
+ },
+ })
+}
/**
* Return the current active topology.
@@ -31,22 +64,8 @@ export function useActiveTopology() {
}
/**
- * Return the topologies for the active project.
+ * Return the scenarios with the specified identifiers.
*/
-export function useProjectTopologies() {
- const projectId = useActiveProjectId()
- const { data: project } = useProject(projectId)
- return useSelector(({ objects }) => {
- if (!project) {
- return []
- }
-
- const topologies = project.topologyIds.map((t) => objects.topology[t])
-
- if (topologies.filter((t) => !t).length > 0) {
- return []
- }
-
- return topologies
- })
+export function useTopologies(topologyIds) {
+ return useQueries(topologyIds.map((topologyId) => ({ queryKey: ['topologies', topologyId] })))
}
diff --git a/opendc-web/opendc-web-ui/src/pages/_app.js b/opendc-web/opendc-web-ui/src/pages/_app.js
index 7b4dcb3e..6a7200d5 100644
--- a/opendc-web/opendc-web-ui/src/pages/_app.js
+++ b/opendc-web/opendc-web-ui/src/pages/_app.js
@@ -30,11 +30,21 @@ import * as Sentry from '@sentry/react'
import { Integrations } from '@sentry/tracing'
import { QueryClient, QueryClientProvider } from 'react-query'
import { useMemo } from 'react'
+import { configureProjectClient } from '../data/project'
+import { configureExperimentClient } from '../data/experiments'
+import { configureTopologyClient } from '../data/topology'
// This setup is necessary to forward the Auth0 context to the Redux context
const Inner = ({ Component, pageProps }) => {
const auth = useAuth()
- const queryClient = useMemo(() => new QueryClient(), [])
+
+ const queryClient = useMemo(() => {
+ const client = new QueryClient()
+ configureProjectClient(client, auth)
+ configureExperimentClient(client, auth)
+ configureTopologyClient(client, auth)
+ return client
+ }, []) // eslint-disable-line react-hooks/exhaustive-deps
const store = useStore(pageProps.initialReduxState, { auth, queryClient })
return (
<QueryClientProvider client={queryClient}>
diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topologies.js b/opendc-web/opendc-web-ui/src/redux/actions/topologies.js
index abfded7e..e19a7f21 100644
--- a/opendc-web/opendc-web-ui/src/redux/actions/topologies.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/topologies.js
@@ -1,5 +1,4 @@
export const ADD_TOPOLOGY = 'ADD_TOPOLOGY'
-export const DELETE_TOPOLOGY = 'DELETE_TOPOLOGY'
export function addTopology(projectId, name, duplicateId) {
return {
@@ -9,10 +8,3 @@ export function addTopology(projectId, name, duplicateId) {
duplicateId,
}
}
-
-export function deleteTopology(id) {
- return {
- type: DELETE_TOPOLOGY,
- id,
- }
-}
diff --git a/opendc-web/opendc-web-ui/src/redux/sagas/index.js b/opendc-web/opendc-web-ui/src/redux/sagas/index.js
index 74d9efb6..318f0afb 100644
--- a/opendc-web/opendc-web-ui/src/redux/sagas/index.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/index.js
@@ -21,13 +21,12 @@ import {
onDeleteRack,
onDeleteRoom,
onDeleteTile,
- onDeleteTopology,
onDeleteUnit,
onEditRackName,
onEditRoomName,
onStartNewRoomConstruction,
} from './topology'
-import { ADD_TOPOLOGY, DELETE_TOPOLOGY } from '../actions/topologies'
+import { ADD_TOPOLOGY } from '../actions/topologies'
import { onAddPrefab } from './prefabs'
import { ADD_PREFAB } from '../actions/prefabs'
@@ -35,7 +34,6 @@ export default function* rootSaga() {
yield takeEvery(OPEN_PROJECT_SUCCEEDED, onOpenProjectSucceeded)
yield takeEvery(ADD_TOPOLOGY, onAddTopology)
- yield takeEvery(DELETE_TOPOLOGY, onDeleteTopology)
yield takeEvery(START_NEW_ROOM_CONSTRUCTION, onStartNewRoomConstruction)
yield takeEvery(CANCEL_NEW_ROOM_CONSTRUCTION, onCancelNewRoomConstruction)
yield takeEvery(ADD_TILE, onAddTile)
diff --git a/opendc-web/opendc-web-ui/src/redux/sagas/objects.js b/opendc-web/opendc-web-ui/src/redux/sagas/objects.js
index 88f71fe4..99082df0 100644
--- a/opendc-web/opendc-web-ui/src/redux/sagas/objects.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/objects.js
@@ -1,6 +1,6 @@
import { call, put, select, getContext } from 'redux-saga/effects'
import { addToStore } from '../actions/objects'
-import { getTopology, updateTopology } from '../../api/topologies'
+import { fetchTopology, updateTopology } from '../../api/topologies'
import { uuid } from 'uuidv4'
export const OBJECT_SELECTORS = {
@@ -32,7 +32,7 @@ export const fetchAndStoreTopology = function* (id) {
let topology = topologyStore[id]
if (!topology) {
- const fullTopology = yield call(getTopology, auth, id)
+ const fullTopology = yield call(fetchTopology, auth, id)
for (let roomIdx in fullTopology.rooms) {
const fullRoom = fullTopology.rooms[roomIdx]
diff --git a/opendc-web/opendc-web-ui/src/redux/sagas/topology.js b/opendc-web/opendc-web-ui/src/redux/sagas/topology.js
index efa125c6..0ed40131 100644
--- a/opendc-web/opendc-web-ui/src/redux/sagas/topology.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/topology.js
@@ -18,16 +18,12 @@ import {
} from '../../components/app/map/MapConstants'
import { fetchAndStoreTopology, denormalizeTopology, updateTopologyOnServer } from './objects'
import { uuid } from 'uuidv4'
-import { addTopology, deleteTopology } from '../../api/topologies'
-import { fetchProject } from '../../api/projects'
+import { addTopology } from '../../api/topologies'
export function* fetchAndStoreAllTopologiesOfProject(projectId, setTopology = false) {
try {
- const auth = yield getContext('auth')
const queryClient = yield getContext('queryClient')
- const project = yield call(() =>
- queryClient.fetchQuery(['projects', projectId], () => fetchProject(auth, projectId))
- )
+ const project = yield call(() => queryClient.fetchQuery(['projects', projectId]))
for (let i in project.topologyIds) {
yield fetchAndStoreTopology(project.topologyIds[i])
@@ -62,26 +58,6 @@ export function* onAddTopology(action) {
}
}
-export function* onDeleteTopology(action) {
- try {
- const auth = yield getContext('auth')
- const queryClient = yield getContext('queryClient')
- const project = yield call(() =>
- queryClient.fetchQuery(['projects', action.projectId], () => fetchProject(auth, action.projectId))
- )
- const topologyIds = project?.topologyIds ?? []
-
- const currentTopologyId = yield select((state) => state.currentTopologyId)
- if (currentTopologyId === action.id) {
- yield put(setCurrentTopology(topologyIds.filter((t) => t !== action.id)[0]))
- }
-
- yield call(deleteTopology, auth, action.id)
- } catch (error) {
- console.error(error)
- }
-}
-
export function* onStartNewRoomConstruction() {
try {
const topologyId = yield select((state) => state.currentTopologyId)