Merge pull request #2295 from automatisch/importing-flow-should-invalidate-flows
feat(useImportFlow): invalidate flows on success
This commit is contained in:
@@ -16,8 +16,7 @@ import useExportFlow from 'hooks/useExportFlow';
|
|||||||
import useDownloadJsonAsFile from 'hooks/useDownloadJsonAsFile';
|
import useDownloadJsonAsFile from 'hooks/useDownloadJsonAsFile';
|
||||||
|
|
||||||
function ContextMenu(props) {
|
function ContextMenu(props) {
|
||||||
const { flowId, onClose, anchorEl, onDuplicateFlow, onDeleteFlow, appKey } =
|
const { flowId, onClose, anchorEl, onDuplicateFlow, appKey } = props;
|
||||||
props;
|
|
||||||
const enqueueSnackbar = useEnqueueSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
@@ -67,14 +66,12 @@ function ContextMenu(props) {
|
|||||||
variant: 'success',
|
variant: 'success',
|
||||||
});
|
});
|
||||||
|
|
||||||
onDeleteFlow?.();
|
|
||||||
onClose();
|
onClose();
|
||||||
}, [
|
}, [
|
||||||
deleteFlow,
|
deleteFlow,
|
||||||
appKey,
|
appKey,
|
||||||
enqueueSnackbar,
|
enqueueSnackbar,
|
||||||
formatMessage,
|
formatMessage,
|
||||||
onDeleteFlow,
|
|
||||||
onClose,
|
onClose,
|
||||||
queryClient,
|
queryClient,
|
||||||
]);
|
]);
|
||||||
@@ -143,7 +140,6 @@ ContextMenu.propTypes = {
|
|||||||
PropTypes.func,
|
PropTypes.func,
|
||||||
PropTypes.shape({ current: PropTypes.instanceOf(Element) }),
|
PropTypes.shape({ current: PropTypes.instanceOf(Element) }),
|
||||||
]).isRequired,
|
]).isRequired,
|
||||||
onDeleteFlow: PropTypes.func,
|
|
||||||
onDuplicateFlow: PropTypes.func,
|
onDuplicateFlow: PropTypes.func,
|
||||||
appKey: PropTypes.string,
|
appKey: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ function FlowRow(props) {
|
|||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const contextButtonRef = React.useRef(null);
|
const contextButtonRef = React.useRef(null);
|
||||||
const [anchorEl, setAnchorEl] = React.useState(null);
|
const [anchorEl, setAnchorEl] = React.useState(null);
|
||||||
const { flow, onDuplicateFlow, onDeleteFlow, appKey } = props;
|
const { flow, onDuplicateFlow, appKey } = props;
|
||||||
|
|
||||||
const handleClose = () => {
|
const handleClose = () => {
|
||||||
setAnchorEl(null);
|
setAnchorEl(null);
|
||||||
@@ -118,7 +118,6 @@ function FlowRow(props) {
|
|||||||
flowId={flow.id}
|
flowId={flow.id}
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
anchorEl={anchorEl}
|
anchorEl={anchorEl}
|
||||||
onDeleteFlow={onDeleteFlow}
|
|
||||||
onDuplicateFlow={onDuplicateFlow}
|
onDuplicateFlow={onDuplicateFlow}
|
||||||
appKey={appKey}
|
appKey={appKey}
|
||||||
/>
|
/>
|
||||||
@@ -129,7 +128,6 @@ function FlowRow(props) {
|
|||||||
|
|
||||||
FlowRow.propTypes = {
|
FlowRow.propTypes = {
|
||||||
flow: FlowPropType.isRequired,
|
flow: FlowPropType.isRequired,
|
||||||
onDeleteFlow: PropTypes.func,
|
|
||||||
onDuplicateFlow: PropTypes.func,
|
onDuplicateFlow: PropTypes.func,
|
||||||
appKey: PropTypes.string,
|
appKey: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ export default function useDeleteFlow(flowId) {
|
|||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
|
|
||||||
onSuccess: () => {
|
onSuccess: async () => {
|
||||||
queryClient.invalidateQueries({
|
await queryClient.invalidateQueries({
|
||||||
queryKey: ['flows'],
|
queryKey: ['flows'],
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ export default function useDuplicateFlow(flowId) {
|
|||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
|
|
||||||
onSuccess: () => {
|
onSuccess: async () => {
|
||||||
queryClient.invalidateQueries({
|
await queryClient.invalidateQueries({
|
||||||
queryKey: ['flows'],
|
queryKey: ['flows'],
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
18
packages/web/src/hooks/useFlows.js
Normal file
18
packages/web/src/hooks/useFlows.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import api from 'helpers/api';
|
||||||
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
|
||||||
|
export default function useFlows({ flowName, page }) {
|
||||||
|
const query = useQuery({
|
||||||
|
queryKey: ['flows', flowName, { page }],
|
||||||
|
queryFn: async ({ signal }) => {
|
||||||
|
const { data } = await api.get('/v1/flows', {
|
||||||
|
params: { name: flowName, page },
|
||||||
|
signal,
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return query;
|
||||||
|
}
|
||||||
@@ -1,14 +1,20 @@
|
|||||||
import { useMutation } from '@tanstack/react-query';
|
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
||||||
|
|
||||||
import api from 'helpers/api';
|
import api from 'helpers/api';
|
||||||
|
|
||||||
export default function useImportFlow() {
|
export default function useImportFlow() {
|
||||||
|
const queryClient = useQueryClient();
|
||||||
const mutation = useMutation({
|
const mutation = useMutation({
|
||||||
mutationFn: async (flowData) => {
|
mutationFn: async (flowData) => {
|
||||||
const { data } = await api.post('/v1/flows/import', flowData);
|
const { data } = await api.post('/v1/flows/import', flowData);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
|
onSuccess: async () => {
|
||||||
|
await queryClient.invalidateQueries({
|
||||||
|
queryKey: ['flows'],
|
||||||
|
});
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return mutation;
|
return mutation;
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
import * as React from 'react';
|
|
||||||
|
|
||||||
import api from 'helpers/api';
|
|
||||||
import { useMutation } from '@tanstack/react-query';
|
|
||||||
|
|
||||||
export default function useLazyFlows({ flowName, page }, { onSettled }) {
|
|
||||||
const abortControllerRef = React.useRef(new AbortController());
|
|
||||||
|
|
||||||
React.useEffect(() => {
|
|
||||||
abortControllerRef.current = new AbortController();
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
abortControllerRef.current?.abort();
|
|
||||||
};
|
|
||||||
}, [flowName]);
|
|
||||||
|
|
||||||
const query = useMutation({
|
|
||||||
mutationFn: async () => {
|
|
||||||
const { data } = await api.get('/v1/flows', {
|
|
||||||
params: { name: flowName, page },
|
|
||||||
signal: abortControllerRef.current.signal,
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
onSettled,
|
|
||||||
});
|
|
||||||
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,6 @@ import {
|
|||||||
Routes,
|
Routes,
|
||||||
Route,
|
Route,
|
||||||
} from 'react-router-dom';
|
} from 'react-router-dom';
|
||||||
import debounce from 'lodash/debounce';
|
|
||||||
import Box from '@mui/material/Box';
|
import Box from '@mui/material/Box';
|
||||||
import Grid from '@mui/material/Grid';
|
import Grid from '@mui/material/Grid';
|
||||||
import AddIcon from '@mui/icons-material/Add';
|
import AddIcon from '@mui/icons-material/Add';
|
||||||
@@ -27,7 +26,7 @@ import ImportFlowDialog from 'components/ImportFlowDialog';
|
|||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
import useCurrentUserAbility from 'hooks/useCurrentUserAbility';
|
import useCurrentUserAbility from 'hooks/useCurrentUserAbility';
|
||||||
import * as URLS from 'config/urls';
|
import * as URLS from 'config/urls';
|
||||||
import useLazyFlows from 'hooks/useLazyFlows';
|
import useFlows from 'hooks/useFlows';
|
||||||
|
|
||||||
export default function Flows() {
|
export default function Flows() {
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
@@ -35,21 +34,9 @@ export default function Flows() {
|
|||||||
const [searchParams, setSearchParams] = useSearchParams();
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
const page = parseInt(searchParams.get('page') || '', 10) || 1;
|
const page = parseInt(searchParams.get('page') || '', 10) || 1;
|
||||||
const flowName = searchParams.get('flowName') || '';
|
const flowName = searchParams.get('flowName') || '';
|
||||||
const [isLoading, setIsLoading] = React.useState(true);
|
|
||||||
const currentUserAbility = useCurrentUserAbility();
|
const currentUserAbility = useCurrentUserAbility();
|
||||||
|
|
||||||
const {
|
const { data, isSuccess, isLoading } = useFlows({ flowName, page });
|
||||||
data,
|
|
||||||
mutate: fetchFlows,
|
|
||||||
isSuccess,
|
|
||||||
} = useLazyFlows(
|
|
||||||
{ flowName, page },
|
|
||||||
{
|
|
||||||
onSettled: () => {
|
|
||||||
setIsLoading(false);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
const flows = data?.data || [];
|
const flows = data?.data || [];
|
||||||
const pageInfo = data?.meta;
|
const pageInfo = data?.meta;
|
||||||
@@ -76,26 +63,9 @@ export default function Flows() {
|
|||||||
const onDuplicateFlow = () => {
|
const onDuplicateFlow = () => {
|
||||||
if (pageInfo?.currentPage > 1) {
|
if (pageInfo?.currentPage > 1) {
|
||||||
navigate(getPathWithSearchParams(1, flowName));
|
navigate(getPathWithSearchParams(1, flowName));
|
||||||
} else {
|
|
||||||
fetchFlows();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const fetchData = React.useMemo(
|
|
||||||
() => debounce(fetchFlows, 300),
|
|
||||||
[fetchFlows],
|
|
||||||
);
|
|
||||||
|
|
||||||
React.useEffect(() => {
|
|
||||||
setIsLoading(true);
|
|
||||||
|
|
||||||
fetchData({ flowName, page });
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
fetchData.cancel();
|
|
||||||
};
|
|
||||||
}, [fetchData, flowName, page]);
|
|
||||||
|
|
||||||
React.useEffect(
|
React.useEffect(
|
||||||
function redirectToLastPage() {
|
function redirectToLastPage() {
|
||||||
if (navigateToLastPage) {
|
if (navigateToLastPage) {
|
||||||
@@ -184,7 +154,6 @@ export default function Flows() {
|
|||||||
key={flow.id}
|
key={flow.id}
|
||||||
flow={flow}
|
flow={flow}
|
||||||
onDuplicateFlow={onDuplicateFlow}
|
onDuplicateFlow={onDuplicateFlow}
|
||||||
onDeleteFlow={fetchFlows}
|
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user