import { useState, useEffect, FC } from "react"; import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from "next"; import { useRouter } from "next/router"; import Error from "next/error"; import { googleScrape, extractSlug } from "../utils/translate"; import Languages from "../components/Languages"; import { languages, exceptions } from "../utils/languages.json"; const Page: FC> = ({ translation, error, initial }) => { if (error) return const router = useRouter(); const [source, setSource] = useState("auto"); const [target, setTarget] = useState("en"); const [query, setQuery] = useState(""); const updateTranslation = () => { query && router.push(`/${source}/${target}/${query}`); }; useEffect(() => { initial?.source && setSource(initial.source); initial?.target && setTarget(initial.target); initial?.query && setQuery(initial.query); }, [initial]); useEffect(() => { if (!query || query === initial?.query) return; const timeout = setTimeout(updateTranslation, 1500); return () => clearTimeout(timeout); }, [query]); useEffect(updateTranslation, [source, target]); const langs = Object.entries(languages); const sourceLangs = langs.filter(([code]) => !exceptions.source.includes(code)); const targetLangs = langs.filter(([code]) => !exceptions.target.includes(code)); return (
setQuery(e.target.value)} />
{translation}
); } export default Page; export const getStaticPaths: GetStaticPaths = async () => ({ paths: [ { params: { slug: [] } } ], fallback: true }); export const getStaticProps: GetStaticProps = async ({ params, locale }) => { if (!params?.slug || !Array.isArray(params.slug)) return { props: {} }; const { source, target, query } = extractSlug(params.slug); if (!query) return { notFound: true }; if (!source || !target) return { redirect: { destination: `/${source ?? "auto"}/${target ?? "en"}/${query}`, permanent: true } } return { props: { ...await googleScrape(source, target, query), initial: { source, target, query } }, revalidate: 2 * 30 * 24 * 60 * 60 // 2 months }; }