import * as React from 'react'; import { Link, useSearchParams } from 'react-router-dom'; import debounce from 'lodash/debounce'; import Box from '@mui/material/Box'; import Grid from '@mui/material/Grid'; import AddIcon from '@mui/icons-material/Add'; import CircularProgress from '@mui/material/CircularProgress'; import Divider from '@mui/material/Divider'; import Pagination from '@mui/material/Pagination'; import PaginationItem from '@mui/material/PaginationItem'; import Can from 'components/Can'; import FlowRow from 'components/FlowRow'; import NoResultFound from 'components/NoResultFound'; import ConditionalIconButton from 'components/ConditionalIconButton'; import Container from 'components/Container'; import PageTitle from 'components/PageTitle'; import SearchInput from 'components/SearchInput'; import useFormatMessage from 'hooks/useFormatMessage'; import useCurrentUserAbility from 'hooks/useCurrentUserAbility'; import * as URLS from 'config/urls'; import useLazyFlows from 'hooks/useLazyFlows'; export default function Flows() { const formatMessage = useFormatMessage(); const [searchParams, setSearchParams] = useSearchParams(); const page = parseInt(searchParams.get('page') || '', 10) || 1; const [flowName, setFlowName] = React.useState(''); const [isLoading, setIsLoading] = React.useState(false); const currentUserAbility = useCurrentUserAbility(); const { data, mutate: fetchFlows } = useLazyFlows( { flowName, page }, { onSettled: () => { setIsLoading(false); }, }, ); const fetchData = React.useMemo( () => debounce(fetchFlows, 300), [fetchFlows], ); React.useEffect(() => { setIsLoading(true); fetchData({ flowName, page }); return () => { fetchData.cancel(); }; }, [fetchData, flowName, page]); React.useEffect( function resetPageOnSearch() { // reset search params which only consists of `page` setSearchParams({}); }, [flowName], ); const flows = data?.data || []; const pageInfo = data?.meta; const hasFlows = flows?.length; const onSearchChange = React.useCallback((event) => { setFlowName(event.target.value); }, []); return ( {formatMessage('flows.title')} {(allowed) => ( } to={URLS.CREATE_FLOW} data-test="create-flow-button" > {formatMessage('flows.create')} )} {isLoading && ( )} {!isLoading && flows?.map((flow) => ( ))} {!isLoading && !hasFlows && ( )} {!isLoading && pageInfo && pageInfo.totalPages > 1 && ( setSearchParams({ page: page.toString() }) } renderItem={(item) => ( )} /> )} ); }