import Box from '@mui/material/Box'; import CircularProgress from '@mui/material/CircularProgress'; import Divider from '@mui/material/Divider'; import Grid from '@mui/material/Grid'; import Pagination from '@mui/material/Pagination'; import PaginationItem from '@mui/material/PaginationItem'; import * as React from 'react'; import { Link, Route, Routes, useNavigate, useSearchParams, } from 'react-router-dom'; import Container from 'components/Container'; import FlowFilters from 'components/FlowFilters'; import FlowRow from 'components/FlowRow'; import FlowsButtons from 'components/FlowsButtons'; import Folders from 'components/Folders'; import ImportFlowDialog from 'components/ImportFlowDialog'; import NoResultFound from 'components/NoResultFound'; import PageTitle from 'components/PageTitle'; import SearchInput from 'components/SearchInput'; import TemplatesDialog from 'components/TemplatesDialog/index.ee'; import * as URLS from 'config/urls'; import objectifyUrlSearchParams from 'helpers/objectifyUrlSearchParams'; import useCurrentUserAbility from 'hooks/useCurrentUserAbility'; import useFlows from 'hooks/useFlows'; import useFormatMessage from 'hooks/useFormatMessage'; export default function Flows() { const formatMessage = useFormatMessage(); const navigate = useNavigate(); const [searchParams, setSearchParams] = useSearchParams(); const page = parseInt(searchParams.get('page') || '', 10) || 1; const flowName = searchParams.get('flowName') || ''; const folderId = searchParams.get('folderId'); const status = searchParams.get('status'); const onlyOwnedFlows = searchParams.get('onlyOwnedFlows'); const currentUserAbility = useCurrentUserAbility(); const [searchValue, setSearchValue] = React.useState(flowName); const { data, isSuccess, isLoading } = useFlows({ flowName, page, folderId, status, onlyOwnedFlows, }); const flows = data?.data || []; const pageInfo = data?.meta; const hasFlows = flows?.length; const navigateToLastPage = isSuccess && !hasFlows && page > 1; const onSearchChange = React.useCallback( (event) => { const value = event.target.value; setSearchValue(value); setSearchParams({ flowName: value, ...(folderId && { folderId }), ...(onlyOwnedFlows && { onlyOwnedFlows }), ...(status && { status }), }); }, [folderId, setSearchParams, onlyOwnedFlows, status], ); const getPathWithSearchParams = (page) => { const searchParamsObject = objectifyUrlSearchParams(searchParams); const newSearchParams = new window.URLSearchParams({ ...searchParamsObject, page, }); return { search: newSearchParams.toString() }; }; const onDuplicateFlow = () => { if (pageInfo?.currentPage > 1) { navigate(getPathWithSearchParams(1)); } }; React.useEffect( function resetSearchValue() { if (!searchParams.has('flowName')) { setSearchValue(''); } }, [searchParams], ); React.useEffect( function redirectToLastPage() { if (navigateToLastPage) { navigate(getPathWithSearchParams(pageInfo.totalPages)); } }, [navigateToLastPage], ); return ( <> {formatMessage('flows.title')} {(isLoading || navigateToLastPage) && ( )} {!isLoading && flows?.map((flow) => ( ))} {!isLoading && !navigateToLastPage && !hasFlows && ( )} {!isLoading && !navigateToLastPage && pageInfo && pageInfo.totalPages > 1 && ( ( )} /> )} } /> } /> ); }