import React, { useState, useEffect, useMemo, ReactElement, useCallback, } from "react"; import PropTypes from "prop-types"; import { useNavigate } from "react-router-dom"; import { useTable, usePagination, useFlexLayout } from "react-table"; import { flatten, isEmpty, isNil, isUndefined, map } from "lodash"; import RawFileDetails from "./RawFileDetails"; import ComicVineDetails from "./ComicVineDetails"; import SearchBar from "./SearchBar"; import { useDispatch } from "react-redux"; import { searchIssue } from "../../actions/fileops.actions"; import ellipsize from "ellipsize"; interface IComicBookLibraryProps { data: { searchResults: any; }; } export const Library = (data: IComicBookLibraryProps): ReactElement => { const { searchResults } = data.data; const pageTotal = searchResults.hits.total.value; const [isPageSizeDropdownCollapsed, collapsePageSizeDropdown] = useState(false); const togglePageSizeDropdown = () => collapsePageSizeDropdown(!isPageSizeDropdownCollapsed); // programatically navigate to comic detail const navigate = useNavigate(); const navigateToComicDetail = (id) => { navigate(`/comic/details/${id}`); }; const ImportStatus = ({ value }) => { return value ? (
Series {ellipsize(value.series[0], 25)}
Pages {value.pagecount[0]}
Issue {!isNil(value.number) && ( {parseInt(value.number[0], 10)} )}
) : ( No ComicInfo.xml ); }; const WantedStatus = ({ value }) => { return value ? Wanted : null; }; console.log(searchResults); // return null; const columns = useMemo( () => [ { Header: "Comic Metadata", columns: [ { Header: "File Details", id: "fileDetails", minWidth: 450, accessor: (row) => !isEmpty(row._source.rawFileDetails) ? { rawFileDetails: row._source.rawFileDetails, inferredMetadata: row._source.inferredMetadata, } : row._source.sourcedMetadata, Cell: ({ value }) => { // If no CV info available, use raw file metadata if (!isNil(value.rawFileDetails.cover)) { return ; } // If CV metadata available, show it if (!isNil(value.comicvine)) { return ; } return
null
; }, }, { Header: "Import Status", accessor: "_source.sourcedMetadata.comicInfo", minWidth: 300, align: "right", Cell: ImportStatus, }, ], }, { Header: "Additional Metadata", columns: [ { Header: "Publisher", accessor: "_source.sourcedMetadata.comicvine.volumeInformation.publisher", Cell(props) { return ( !isNil(props.cell.value) &&
{props.cell.value.name}
); }, }, { Header: "Something", accessor: "_source.acquisition.wanted", Cell: (props) => { return
asda
}, }, ], }, ], [], ); ImportStatus.propTypes = { value: PropTypes.bool.isRequired, }; const { getTableProps, getTableBodyProps, headerGroups, prepareRow, page, canPreviousPage, canNextPage, pageOptions, pageCount, gotoPage, nextPage, previousPage, setPageSize, state: { pageIndex, pageSize }, } = useTable( { columns, data: searchResults.hits.hits, manualPagination: true, initialState: { pageIndex: 1, pageSize: 25, }, pageCount: searchResults.hits.total.value, }, usePagination, useFlexLayout, ); const dispatch = useDispatch(); const goToNextPage = useCallback(() => { // incremement pageIndex nextPage(); console.log(pageIndex); console.log("from", pageSize * pageIndex + 1); dispatch( searchIssue( { query: {}, }, { pagination: { size: pageSize, from: pageSize * pageIndex + 1, }, }, ), ); }, [pageIndex]); const goToPreviousPage = useCallback(() => { previousPage(); let from = 0; if (pageIndex === 2) { from = (pageIndex - 1) * pageSize + 2 - 27; } else { from = (pageIndex - 1) * pageSize + 2 - 26; } dispatch( searchIssue( { query: {}, }, { pagination: { size: pageSize, from, }, }, ), ); }, [pageIndex]); return (

Library

{/* Search bar */} {!isUndefined(searchResults) && (
{headerGroups.map((headerGroup, idx) => ( {headerGroup.headers.map((column, idx) => ( ))} ))} {page.map((row, idx) => { prepareRow(row); return ( navigateToComicDetail(row.original._id)} > {row.cells.map((cell, idx) => { return ( ); })} ); })}
{column.render("Header")}
{cell.render("Cell")}
{/* pagination controls */}
)}
); }; export default Library;