import React, { useMemo, ReactElement, useState } from "react"; import PropTypes from "prop-types"; import { useNavigate } from "react-router-dom"; import { isEmpty, isNil, isUndefined } from "lodash"; import MetadataPanel from "../shared/MetadataPanel"; import T2Table from "../shared/T2Table"; import ellipsize from "ellipsize"; import { useQuery, keepPreviousData } from "@tanstack/react-query"; import axios from "axios"; /** * Component that tabulates the contents of the user's ThreeTwo Library. * * @component * @example * */ export const Library = (): ReactElement => { // Default page state // offset: 0 const [offset, setOffset] = useState(0); // Method to fetch paginated issues const fetchIssues = async (searchQuery, offset, type) => { let pagination = { size: 15, from: offset, }; return await axios({ method: "POST", url: "http://localhost:3000/api/search/searchIssue", data: { searchQuery, pagination, type, }, }); }; const { data, isLoading, isError, isPlaceholderData } = useQuery({ queryKey: ["comics", offset], queryFn: () => fetchIssues({}, offset, "all"), placeholderData: keepPreviousData, }); const searchResults = data?.data; // Programmatically navigate to comic detail const navigate = useNavigate(); const navigateToComicDetail = (row) => { navigate(`/comic/details/${row.original._id}`); }; const ComicInfoXML = (value) => { return value.data ? (
Series {ellipsize(value.data.series[0], 25)}
Pages {value.data.pagecount[0]}
Issue {!isNil(value.data.number) && ( {parseInt(value.data.number[0], 10)} )}
) : null; }; const WantedStatus = ({ value }) => { return !value ? Wanted : null; }; const columns = useMemo( () => [ { header: "Comic Metadata", footer: 1, columns: [ { header: "File Details", id: "fileDetails", minWidth: 400, accessorKey: "_source", cell: (info) => { return ; }, }, { header: "ComicInfo.xml", accessorKey: "_source.sourcedMetadata.comicInfo", align: "center", minWidth: 250, cell: (info) => !isEmpty(info.getValue()) ? ( ) : ( No ComicInfo.xml ), }, ], }, { header: "Additional Metadata", columns: [ { header: "Publisher", accessorKey: "_source.sourcedMetadata.comicvine.volumeInformation", cell: (info) => { return ( !isNil(info.getValue()) && (
{info.getValue().publisher.name}
) ); }, }, { header: "Something", accessorKey: "_source.acquisition.source.wanted", cell: (info) => { !isUndefined(info.getValue()) ? ( ) : ( "Nothing" ); }, }, ], }, ], [], ); /** * Pagination control that fetches the next x (pageSize) items * based on the y (pageIndex) offset from the ThreeTwo Elasticsearch index * @param {number} pageIndex * @param {number} pageSize * @returns void * **/ const nextPage = (pageIndex: number, pageSize: number) => { if (!isPlaceholderData) { setOffset(pageSize * pageIndex + 1); } }; /** * Pagination control that fetches the previous x (pageSize) items * based on the y (pageIndex) offset from the ThreeTwo Elasticsearch index * @param {number} pageIndex * @param {number} pageSize * @returns void **/ const previousPage = (pageIndex: number, pageSize: number) => { let from = 0; if (pageIndex === 2) { from = (pageIndex - 1) * pageSize + 2 - (pageSize + 2); } else { from = (pageIndex - 1) * pageSize + 2 - (pageSize + 1); } setOffset(from); }; // ImportStatus.propTypes = { // value: PropTypes.bool.isRequired, // }; return (

Library

{!isUndefined(searchResults) ? (
) : (
No comics were found in the library, Elasticsearch reports no indices. Try importing a few comics into the library and come back.
{/*
                {!isUndefined(searchResults?.code === 404 && !isLoading) &&
                  JSON.stringify(
                    searchResults.meta.body.error.root_cause,
                    null,
                    4,
                  )}
              
*/}
)}
); }; export default Library;