90 lines
2.7 KiB
TypeScript
90 lines
2.7 KiB
TypeScript
import { useState } from "react";
|
|
import axios from "axios";
|
|
import { isNil, isUndefined, isEmpty } from "lodash";
|
|
import { refineQuery } from "filename-parser";
|
|
import { COMICVINE_SERVICE_URI } from "../../constants/endpoints";
|
|
import { RawFileDetails as RawFileDetailsType } from "../../graphql/generated";
|
|
|
|
type ComicVineMatch = {
|
|
score: number;
|
|
[key: string]: any;
|
|
};
|
|
|
|
type ComicVineSearchQuery = {
|
|
inferredIssueDetails: {
|
|
name: string;
|
|
[key: string]: any;
|
|
};
|
|
[key: string]: any;
|
|
};
|
|
|
|
type ComicVineMetadata = {
|
|
name?: string;
|
|
[key: string]: any;
|
|
};
|
|
|
|
export const useComicVineMatching = () => {
|
|
const [comicVineMatches, setComicVineMatches] = useState<ComicVineMatch[]>([]);
|
|
|
|
const fetchComicVineMatches = async (
|
|
searchPayload: any,
|
|
issueSearchQuery: ComicVineSearchQuery,
|
|
seriesSearchQuery: ComicVineSearchQuery,
|
|
) => {
|
|
try {
|
|
const response = await axios({
|
|
url: `${COMICVINE_SERVICE_URI}/volumeBasedSearch`,
|
|
method: "POST",
|
|
data: {
|
|
format: "json",
|
|
// hack
|
|
query: issueSearchQuery.inferredIssueDetails.name
|
|
.replace(/[^a-zA-Z0-9 ]/g, "")
|
|
.trim(),
|
|
limit: "100",
|
|
page: 1,
|
|
resources: "volume",
|
|
scorerConfiguration: {
|
|
searchParams: issueSearchQuery.inferredIssueDetails,
|
|
},
|
|
rawFileDetails: searchPayload,
|
|
},
|
|
transformResponse: (r) => {
|
|
const matches = JSON.parse(r);
|
|
return matches;
|
|
},
|
|
});
|
|
let matches: ComicVineMatch[] = [];
|
|
if (!isNil(response.data.results) && response.data.results.length === 1) {
|
|
matches = response.data.results;
|
|
} else {
|
|
matches = response.data.map((match: ComicVineMatch) => match);
|
|
}
|
|
const scoredMatches = matches.sort((a: ComicVineMatch, b: ComicVineMatch) => b.score - a.score);
|
|
setComicVineMatches(scoredMatches);
|
|
} catch (err) {
|
|
// Error handling could be added here if needed
|
|
}
|
|
};
|
|
|
|
const prepareAndFetchMatches = (
|
|
rawFileDetails: RawFileDetailsType | undefined,
|
|
comicvine: ComicVineMetadata | undefined,
|
|
) => {
|
|
let seriesSearchQuery: ComicVineSearchQuery = {} as ComicVineSearchQuery;
|
|
let issueSearchQuery: ComicVineSearchQuery = {} as ComicVineSearchQuery;
|
|
|
|
if (!isUndefined(rawFileDetails) && rawFileDetails.name) {
|
|
issueSearchQuery = refineQuery(rawFileDetails.name) as ComicVineSearchQuery;
|
|
} else if (!isEmpty(comicvine) && comicvine?.name) {
|
|
issueSearchQuery = refineQuery(comicvine.name) as ComicVineSearchQuery;
|
|
}
|
|
fetchComicVineMatches(rawFileDetails, issueSearchQuery, seriesSearchQuery);
|
|
};
|
|
|
|
return {
|
|
comicVineMatches,
|
|
prepareAndFetchMatches,
|
|
};
|
|
};
|