import React, { useCallback, useMemo, useState } from 'react'; import { Button, Typography } from '@material-tailwind/react'; import DeploymentDetailsCard from './deployments/DeploymentDetailsCard'; import FilterForm, { FilterValue, StatusOptions, } from './deployments/FilterForm'; import { DeploymentDetails } from '../../../types/project'; const DEFAULT_FILTER_VALUE: FilterValue = { searchedBranch: '', status: StatusOptions.ALL_STATUS, }; const DeploymentsTabPanel = ({ deployments, }: { deployments: DeploymentDetails[]; }) => { const [filterValue, setFilterValue] = useState(DEFAULT_FILTER_VALUE); const productionDeployment = useMemo(() => { return deployments.find((deployment) => { return deployment.isProduction === true; }) as DeploymentDetails; }, []); const filteredDeployments = useMemo(() => { return deployments.filter((deployment) => { // Searched branch filter const branchMatch = !filterValue.searchedBranch || deployment.branch .toLowerCase() .includes(filterValue.searchedBranch.toLowerCase()); // Status filter const statusMatch = filterValue.status === StatusOptions.ALL_STATUS || // TODO: match status field types (deployment.status as unknown as StatusOptions) === filterValue.status; const dateMatch = !filterValue.updateAtRange || (new Date(deployment.updatedAt) >= filterValue.updateAtRange!.from! && new Date(deployment.updatedAt) <= filterValue.updateAtRange!.to!); return branchMatch && statusMatch && dateMatch; }) as DeploymentDetails[]; }, [filterValue]); const handleResetFilters = useCallback(() => { setFilterValue(DEFAULT_FILTER_VALUE); }, []); return (
setFilterValue(value)} />
{Boolean(filteredDeployments.length) ? ( filteredDeployments.map((deployment, key) => { return ( ); }) ) : (
No deployments found Please change your search query or filters
)}
); }; export default DeploymentsTabPanel;