import Button from '@app/components/Common/Button'; import Header from '@app/components/Common/Header'; import LoadingSpinner from '@app/components/Common/LoadingSpinner'; import PageTitle from '@app/components/Common/PageTitle'; import IssueItem from '@app/components/IssueList/IssueItem'; import { useUpdateQueryParams } from '@app/hooks/useUpdateQueryParams'; import globalMessages from '@app/i18n/globalMessages'; import { BarsArrowDownIcon, ChevronLeftIcon, ChevronRightIcon, FunnelIcon, } from '@heroicons/react/24/solid'; import type { IssueResultsResponse } from '@server/interfaces/api/issueInterfaces'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import useSWR from 'swr'; const messages = defineMessages({ issues: 'Issues', sortAdded: 'Most Recent', sortModified: 'Last Modified', showallissues: 'Show All Issues', }); enum Filter { ALL = 'all', OPEN = 'open', RESOLVED = 'resolved', } type Sort = 'added' | 'modified'; const IssueList = () => { const intl = useIntl(); const router = useRouter(); const [currentFilter, setCurrentFilter] = useState(Filter.OPEN); const [currentSort, setCurrentSort] = useState('added'); const [currentPageSize, setCurrentPageSize] = useState(10); const page = router.query.page ? Number(router.query.page) : 1; const pageIndex = page - 1; const updateQueryParams = useUpdateQueryParams({ page: page.toString() }); const { data, error } = useSWR( `/api/v1/issue?take=${currentPageSize}&skip=${ pageIndex * currentPageSize }&filter=${currentFilter}&sort=${currentSort}` ); // Restore last set filter values on component mount useEffect(() => { const filterString = window.localStorage.getItem('il-filter-settings'); if (filterString) { const filterSettings = JSON.parse(filterString); setCurrentFilter(filterSettings.currentFilter); setCurrentSort(filterSettings.currentSort); setCurrentPageSize(filterSettings.currentPageSize); } // If filter value is provided in query, use that instead if (Object.values(Filter).includes(router.query.filter as Filter)) { setCurrentFilter(router.query.filter as Filter); } }, [router.query.filter]); // Set filter values to local storage any time they are changed useEffect(() => { window.localStorage.setItem( 'il-filter-settings', JSON.stringify({ currentFilter, currentSort, currentPageSize, }) ); }, [currentFilter, currentSort, currentPageSize]); if (!data && !error) { return ; } if (!data) { return ; } const hasNextPage = data.pageInfo.pages > pageIndex + 1; const hasPrevPage = pageIndex > 0; return ( <>
{intl.formatMessage(messages.issues)}
{data.results.map((issue) => { return (
); })} {data.results.length === 0 && (
{intl.formatMessage(globalMessages.noresults)} {currentFilter !== Filter.ALL && (
)}
)}
); }; export default IssueList;