import { UISref } from '@uirouter/react'; import { orderBy } from 'lodash'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import type { SelectCallback } from 'react-bootstrap'; import { PaginationControls } from '../application/search/PaginationControls'; import { ViewStateCache } from '../cache'; import type { IProject } from '../domain'; import { InsightMenu } from '../insight/InsightMenu'; import { SortToggle } from '../presentation'; import { anyFieldFilter } from '../presentation/anyFieldFilter/anyField.filter'; import { ProjectReader } from './service/ProjectReader'; import { timestamp } from '../utils'; import { Spinner } from '../widgets'; interface IProjectSummary extends IProject { createTs?: number; updateTs?: number; email: string; } interface IProjectsViewState { projectFilter: string; sort: string; } export const Projects = () => { const cache = useRef(ViewStateCache.get('projects') || ViewStateCache.createCache('projects', { version: 1 })) .current; const cached: IProjectsViewState = cache.get('#global') || { projectFilter: '', sort: 'name' }; const [projects, setProjects] = useState([]); const [loaded, setLoaded] = useState(false); const [projectFilter, setProjectFilter] = useState(cached.projectFilter); const [sortKey, setSortKey] = useState(cached.sort); const [currentPage, setCurrentPage] = useState(1); const inputRef = useRef(); useEffect(() => { cache.put('#global', { projectFilter, sort: sortKey }); }, [projectFilter, sortKey, cache]); useEffect(() => { ProjectReader.listProjects().then((result: IProjectSummary[]) => { setProjects(result); setLoaded(true); }); }, []); useEffect(() => { inputRef.current?.focus(); }, []); useEffect(() => { setCurrentPage(1); }, [projectFilter, sortKey]); const filteredProjects = useMemo(() => { const filterFn = anyFieldFilter(); const filtered = filterFn(projects, { name: projectFilter, email: projectFilter, }); const key = sortKey?.startsWith('-') ? sortKey.slice(1) : sortKey; const direction = sortKey?.startsWith('-') ? 'desc' : 'asc'; return orderBy(filtered, [key], [direction]); }, [projects, projectFilter, sortKey]); const itemsPerPage = 12; const totalPages = Math.ceil(filteredProjects.length / itemsPerPage) || 1; const pageProjects = filteredProjects.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage); const changePage: SelectCallback = (page: any) => setCurrentPage(Number(page)); const Loading = () => (
); return (

Projects setProjectFilter(e.target.value)} />

{!loaded && } {loaded && ( <> {pageProjects.map((project) => { const projectName = project.name.toLowerCase(); return ( ); })}
{projectName} {timestamp(project.createTs)} {timestamp(project.updateTs)} {project.email}
)}
); };