From f7897061fc687805babd674a7a47f015855d8917 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 11 Mar 2021 13:29:22 +0100 Subject: [PATCH] Refactor using hooks rules --- pages/[[...slug]].tsx | 28 ++++++++++++---------------- utils/translate.ts | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/pages/[[...slug]].tsx b/pages/[[...slug]].tsx index 653e20d..db34ccd 100644 --- a/pages/[[...slug]].tsx +++ b/pages/[[...slug]].tsx @@ -1,6 +1,6 @@ -import { useEffect, useReducer, FC, ChangeEvent } from "react"; +import { useState, useEffect, useReducer, FC, ChangeEvent } from "react"; import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from "next"; -import { useRouter } from "next/router"; +import Router from "next/router"; import Error from "next/error"; import { googleScrape, extractSlug } from "../utils/translate"; import Languages from "../components/Languages"; @@ -8,10 +8,8 @@ import { retrieveFiltered } from "../utils/language"; import langReducer, { Actions, initialState } from "../utils/reducer"; const Page: FC> = ({ translation, error, initial }) => { - if (error) - return - const [{ source, target, query }, dispatch] = useReducer(langReducer, initialState); + const [encodedQuery, setEncodedQuery] = useState(""); const handleChange = (e: ChangeEvent) => { dispatch({ @@ -23,12 +21,6 @@ const Page: FC> = ({ translation, }); }; - const router = useRouter(); - - const updateTranslation = () => { - query && router.push(`/${source}/${target}/${query}`); - }; - useEffect(() => { initial && dispatch({ type: Actions.SET_ALL, payload: { state: initial }}); }, [initial]); @@ -37,15 +29,19 @@ const Page: FC> = ({ translation, if (!query || query === initial?.query) return; - const timeout = setTimeout(updateTranslation, 1000); + const timeout = setTimeout(() => setEncodedQuery(encodeURIComponent(query)), 1000); return () => clearTimeout(timeout); - }, [query]); + }, [query, initial?.query]); - useEffect(updateTranslation, [source, target]); + useEffect(() => { + encodedQuery && Router.push(`/${source}/${target}/${encodedQuery}`); + }, [source, target, encodedQuery]); const { sourceLangs, targetLangs } = retrieveFiltered(source, target); - return ( + return error ? ( + + ) : (