feat: abort controller and i18n

This commit is contained in:
Zamitto 2024-09-12 13:12:42 -03:00
parent 5c363810c8
commit 0fce444df8
4 changed files with 27 additions and 27 deletions

View file

@ -7,7 +7,8 @@
"featured": "Featured", "featured": "Featured",
"trending": "Trending", "trending": "Trending",
"surprise_me": "Surprise me", "surprise_me": "Surprise me",
"no_results": "No results found" "no_results": "No results found",
"start_typing": "Starting typing to search..."
}, },
"sidebar": { "sidebar": {
"catalogue": "Catalogue", "catalogue": "Catalogue",

View file

@ -7,7 +7,8 @@
"featured": "Destaques", "featured": "Destaques",
"trending": "Populares", "trending": "Populares",
"surprise_me": "Surpreenda-me", "surprise_me": "Surpreenda-me",
"no_results": "Nenhum resultado encontrado" "no_results": "Nenhum resultado encontrado",
"start_typing": "Comece a digitar para pesquisar…"
}, },
"sidebar": { "sidebar": {
"catalogue": "Catálogo", "catalogue": "Catálogo",

View file

@ -7,7 +7,8 @@
"featured": "Destaques", "featured": "Destaques",
"trending": "Populares", "trending": "Populares",
"surprise_me": "Surpreende-me", "surprise_me": "Surpreende-me",
"no_results": "Nenhum resultado encontrado" "no_results": "Nenhum resultado encontrado",
"start_typing": "Comece a digitar para pesquisar…"
}, },
"sidebar": { "sidebar": {
"catalogue": "Catálogo", "catalogue": "Catálogo",

View file

@ -25,9 +25,10 @@ export function SearchResults() {
const [searchResults, setSearchResults] = useState<CatalogueEntry[]>([]); const [searchResults, setSearchResults] = useState<CatalogueEntry[]>([]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [showMessage, setShowMessage] = useState(false); const [showTypingMessage, setShowTypingMessage] = useState(false);
const debouncedFunc = useRef<DebouncedFunc<() => void> | null>(null); const debouncedFunc = useRef<DebouncedFunc<() => void> | null>(null);
const abortControllerRef = useRef<AbortController | null>(null);
const navigate = useNavigate(); const navigate = useNavigate();
@ -36,40 +37,36 @@ export function SearchResults() {
navigate(buildGameDetailsPath(game)); navigate(buildGameDetailsPath(game));
}; };
const fetchGames = (query: string) => {
window.electron
.searchGames(query)
.then((results) => {
console.log(
"original query: ",
query,
"current value: ",
searchParams.get("query")
);
if (query != searchParams.get("query")) return;
setSearchResults(results);
})
.finally(() => {
setIsLoading(false);
});
};
useEffect(() => { useEffect(() => {
setIsLoading(true); setIsLoading(true);
if (debouncedFunc.current) debouncedFunc.current.cancel(); if (debouncedFunc.current) debouncedFunc.current.cancel();
if (abortControllerRef.current) abortControllerRef.current.abort();
const abortController = new AbortController();
abortControllerRef.current = abortController;
debouncedFunc.current = debounce(() => { debouncedFunc.current = debounce(() => {
const query = searchParams.get("query") ?? ""; const query = searchParams.get("query") ?? "";
if (query.length < 3) { if (query.length < 3) {
setIsLoading(false); setIsLoading(false);
setShowMessage(true); setShowTypingMessage(true);
setSearchResults([]); setSearchResults([]);
return; return;
} }
setShowMessage(false); setShowTypingMessage(false);
fetchGames(query); window.electron
.searchGames(query)
.then((results) => {
if (abortController.signal.aborted) return;
setSearchResults(results);
setIsLoading(false);
})
.catch(() => {
setIsLoading(false);
});
}, 500); }, 500);
debouncedFunc.current(); debouncedFunc.current();
@ -97,11 +94,11 @@ export function SearchResults() {
)} )}
</section> </section>
{!isLoading && showMessage && ( {!isLoading && showTypingMessage && (
<div className={styles.noResults}> <div className={styles.noResults}>
<SearchIcon size={56} /> <SearchIcon size={56} />
<p>{"Comece a digitar para pesquisar…"}</p> <p>{t("start_typing")}</p>
</div> </div>
)} )}