2022-05-03 20:58:34 +02:00
|
|
|
import React, { useRef, useState } from "react";
|
2022-02-27 20:07:15 +01:00
|
|
|
import { generatePath, useHistory, useRouteMatch } from "react-router-dom";
|
2022-12-13 23:50:13 +01:00
|
|
|
import { MWMediaType, MWQuery } from "@/providers";
|
2022-02-27 20:07:15 +01:00
|
|
|
|
2022-05-03 20:58:34 +02:00
|
|
|
export function useSearchQuery(): [
|
|
|
|
MWQuery,
|
|
|
|
(inp: Partial<MWQuery>, force: boolean) => void,
|
|
|
|
() => void
|
|
|
|
] {
|
2022-02-28 22:00:32 +01:00
|
|
|
const history = useHistory();
|
2022-05-03 21:06:27 +02:00
|
|
|
const isFirstRender = useRef(true);
|
2022-02-28 22:00:32 +01:00
|
|
|
const { path, params } = useRouteMatch<{ type: string; query: string }>();
|
2022-02-27 20:07:15 +01:00
|
|
|
const [search, setSearch] = useState<MWQuery>({
|
|
|
|
searchQuery: "",
|
|
|
|
type: MWMediaType.MOVIE,
|
|
|
|
});
|
|
|
|
|
2022-05-03 20:58:34 +02:00
|
|
|
const updateParams = (inp: Partial<MWQuery>, force: boolean) => {
|
2022-02-28 22:00:32 +01:00
|
|
|
const copySearch: MWQuery = { ...search };
|
2022-02-27 20:07:15 +01:00
|
|
|
Object.assign(copySearch, inp);
|
2022-05-01 23:32:33 +02:00
|
|
|
setSearch(copySearch);
|
2022-05-03 20:58:34 +02:00
|
|
|
if (!force) return;
|
2022-02-28 22:00:32 +01:00
|
|
|
history.replace(
|
|
|
|
generatePath(path, {
|
|
|
|
query:
|
|
|
|
copySearch.searchQuery.length === 0 ? undefined : inp.searchQuery,
|
|
|
|
type: copySearch.type,
|
|
|
|
})
|
|
|
|
);
|
|
|
|
};
|
2022-02-27 20:07:15 +01:00
|
|
|
|
2022-05-03 20:58:34 +02:00
|
|
|
const onUnFocus = () => {
|
|
|
|
history.replace(
|
|
|
|
generatePath(path, {
|
|
|
|
query: search.searchQuery.length === 0 ? undefined : search.searchQuery,
|
|
|
|
type: search.type,
|
|
|
|
})
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
// only run on first load of the page
|
2022-02-27 20:07:15 +01:00
|
|
|
React.useEffect(() => {
|
2022-05-03 21:06:27 +02:00
|
|
|
if (isFirstRender.current === false) {
|
2022-05-03 20:58:34 +02:00
|
|
|
return;
|
|
|
|
}
|
2022-05-03 21:06:27 +02:00
|
|
|
isFirstRender.current = false;
|
2022-02-28 22:00:32 +01:00
|
|
|
const type =
|
|
|
|
Object.values(MWMediaType).find((v) => params.type === v) ||
|
|
|
|
MWMediaType.MOVIE;
|
2022-02-27 20:07:15 +01:00
|
|
|
const searchQuery = params.query || "";
|
|
|
|
setSearch({ type, searchQuery });
|
2022-05-03 20:58:34 +02:00
|
|
|
}, [setSearch, params, isFirstRender]);
|
2022-02-27 20:07:15 +01:00
|
|
|
|
2022-05-03 20:58:34 +02:00
|
|
|
return [search, updateParams, onUnFocus];
|
2022-02-27 20:07:15 +01:00
|
|
|
}
|