import { Download, Downloading } from '@mui/icons-material'; import { ButtonBase } from '@mui/material'; import { Resume } from '@reactive-resume/schema'; import clsx from 'clsx'; import download from 'downloadjs'; import get from 'lodash/get'; import isEmpty from 'lodash/isEmpty'; import { GetServerSideProps, NextPage } from 'next'; import dynamic from 'next/dynamic'; import Link from 'next/link'; import { useRouter } from 'next/router'; import i18nConfig from 'next-i18next.config'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { useEffect } from 'react'; import toast from 'react-hot-toast'; import { useMutation, useQuery } from 'react-query'; import { ServerError } from '@/services/axios'; import { printResumeAsPdf, PrintResumeAsPdfParams } from '@/services/printer'; import { fetchResumeByIdentifier } from '@/services/resume'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import { setResume } from '@/store/resume/resumeSlice'; import styles from '@/styles/pages/Preview.module.scss'; const Page = dynamic(() => import('@/components/build/Center/Page')); type QueryParams = { slug?: string; username?: string; }; type Props = { slug?: string; resume?: Resume; username?: string; }; export const getServerSideProps: GetServerSideProps = async ({ query, locale }) => { const { username, slug } = query as QueryParams; try { const resume = await fetchResumeByIdentifier({ username, slug, options: { withHost: true } }); return { props: { username, slug, resume, ...(await serverSideTranslations(locale, ['common'], i18nConfig)) }, }; } catch { return { props: { username, slug, ...(await serverSideTranslations(locale, ['common'], i18nConfig)) } }; } }; const Preview: NextPage = ({ username, slug, resume: initialData }) => { const router = useRouter(); const dispatch = useAppDispatch(); const resume = useAppSelector((state) => state.resume); useEffect(() => { if (!isEmpty(initialData)) { dispatch(setResume(initialData)); } }, [dispatch, initialData]); useQuery(`resume/${username}/${slug}`, () => fetchResumeByIdentifier({ username, slug }), { initialData, retry: false, refetchOnMount: false, refetchOnReconnect: false, refetchOnWindowFocus: false, onSuccess: (data) => { dispatch(setResume(data)); }, onError: (error) => { const errorObj = JSON.parse(JSON.stringify(error)); const statusCode: number = get(errorObj, 'status', 404); if (statusCode === 404) { toast.error('The resume you were looking for does not exist, or maybe it never did?'); router.push('/'); } }, }); const { mutateAsync, isLoading } = useMutation(printResumeAsPdf); if (isEmpty(resume)) return null; const layout: string[][][] = get(resume, 'metadata.layout', []); const handleDownload = async () => { try { const url = await mutateAsync({ username, slug }); download(url); } catch { toast.error('Something went wrong, please try again later.'); } }; return (
{layout.map((_, pageIndex) => ( ))}
{isLoading ? ( <>

Please wait

) : ( <>

Download PDF

)}

Made with Reactive Resume

); }; export default Preview;