🏗️ Wired up search with RQ

This commit is contained in:
2023-12-28 22:50:32 -05:00
parent 63ab0784e3
commit 9db4bc239e
3 changed files with 44 additions and 18 deletions

View File

@@ -1,4 +1,4 @@
import React, { useMemo, ReactElement, useState } from "react"; import React, { useMemo, ReactElement, useState, useEffect } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { isEmpty, isNil, isUndefined } from "lodash"; import { isEmpty, isNil, isUndefined } from "lodash";
@@ -6,7 +6,11 @@ import MetadataPanel from "../shared/MetadataPanel";
import T2Table from "../shared/T2Table"; import T2Table from "../shared/T2Table";
import SearchBar from "../Library/SearchBar"; import SearchBar from "../Library/SearchBar";
import ellipsize from "ellipsize"; import ellipsize from "ellipsize";
import { useQuery, keepPreviousData } from "@tanstack/react-query"; import {
useQuery,
keepPreviousData,
useQueryClient,
} from "@tanstack/react-query";
import axios from "axios"; import axios from "axios";
import { format, fromUnixTime, parseISO } from "date-fns"; import { format, fromUnixTime, parseISO } from "date-fns";
@@ -21,33 +25,53 @@ export const Library = (): ReactElement => {
// Default page state // Default page state
// offset: 0 // offset: 0
const [offset, setOffset] = useState(0); const [offset, setOffset] = useState(0);
const [searchResults, setSearchResults] = useState([]); const [searchQuery, setSearchQuery] = useState({
query: {},
pagination: {
size: 25,
from: offset,
},
type: "all",
trigger: "libraryPage",
});
const queryClient = useQueryClient();
// Method to fetch paginated issues // Method to fetch paginated issues
const fetchIssues = async (searchQuery, offset, type) => { const fetchIssues = async (searchQuery) => {
let pagination = { const { pagination, query, type } = searchQuery;
size: 15,
from: offset,
};
return await axios({ return await axios({
method: "POST", method: "POST",
url: "http://localhost:3000/api/search/searchIssue", url: "http://localhost:3000/api/search/searchIssue",
data: { data: {
searchQuery, query,
pagination, pagination,
type, type,
}, },
}); });
}; };
const searchIssues = (e) => {
queryClient.invalidateQueries({ queryKey: ["comics"] });
setSearchQuery({
query: {
volumeName: e.search,
},
pagination: {
size: 15,
from: 0,
},
type: "volumeName",
trigger: "libraryPage",
});
};
const { data, isLoading, isError, isPlaceholderData } = useQuery({ const { data, isLoading, isError, isPlaceholderData } = useQuery({
queryKey: ["comics", offset], queryKey: ["comics", offset, searchQuery],
queryFn: () => fetchIssues({}, offset, "all"), queryFn: () => fetchIssues(searchQuery),
placeholderData: keepPreviousData, placeholderData: keepPreviousData,
}); });
const searchResults = data?.data; const searchResults = data?.data;
// Programmatically navigate to comic detail // Programmatically navigate to comic detail
const navigate = useNavigate(); const navigate = useNavigate();
const navigateToComicDetail = (row) => { const navigateToComicDetail = (row) => {
@@ -217,8 +241,10 @@ export const Library = (): ReactElement => {
</header> </header>
{!isUndefined(searchResults?.hits) ? ( {!isUndefined(searchResults?.hits) ? (
<div> <div>
<div className="library"> <div>
<SearchBar /> <div className="grid grid-cols-2">
<SearchBar searchHandler={(e) => searchIssues(e)} />
</div>
<T2Table <T2Table
totalPages={searchResults.hits.total.value} totalPages={searchResults.hits.total.value}
columns={columns} columns={columns}
@@ -250,7 +276,7 @@ export const Library = (): ReactElement => {
{!isUndefined(searchResults?.data?.meta?.body) ? ( {!isUndefined(searchResults?.data?.meta?.body) ? (
<p> <p>
{JSON.stringify( {JSON.stringify(
searchResults.data.meta.body.error.root_cause, searchResults?.data.meta.body.error.root_cause,
null, null,
4, 4,
)} )}

View File

@@ -4,7 +4,8 @@ import { Form, Field } from "react-final-form";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { searchIssue } from "../../actions/fileops.actions"; import { searchIssue } from "../../actions/fileops.actions";
export const SearchBar = (): ReactElement => { export const SearchBar = (props): ReactElement => {
const { searchHandler } = props;
const handleSubmit = useCallback((e) => { const handleSubmit = useCallback((e) => {
// searchIssue( // searchIssue(
// { // {
@@ -24,7 +25,7 @@ export const SearchBar = (): ReactElement => {
}, []); }, []);
return ( return (
<Form <Form
onSubmit={handleSubmit} onSubmit={searchHandler}
initialValues={{}} initialValues={{}}
render={({ handleSubmit, form, submitting, pristine, values }) => ( render={({ handleSubmit, form, submitting, pristine, values }) => (
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit}>

View File

@@ -14,7 +14,6 @@ export const QbittorrentConnectionForm = (): ReactElement => {
method: "GET", method: "GET",
}), }),
}); });
console.log(data);
const hostDetails = data?.data?.bittorrent?.client?.host; const hostDetails = data?.data?.bittorrent?.client?.host;
// connect to qbittorrent client // connect to qbittorrent client
const { data: connectionDetails } = useQuery({ const { data: connectionDetails } = useQuery({