From d58929d109595cb41e517b0ffb020c4095a64ca4 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 31 Mar 2021 18:39:05 +0300 Subject: [PATCH] fix ISR fallback pages --- src/pages/events/[id].tsx | 18 +++++++- src/pages/feed/[id].tsx | 19 +++++++- src/pages/signup/[id].tsx | 16 ++++++- src/views/SignUpPage/SignUpPageView.tsx | 59 +++++++++++++++++-------- 4 files changed, 88 insertions(+), 24 deletions(-) diff --git a/src/pages/events/[id].tsx b/src/pages/events/[id].tsx index 1dbcaf1..082f721 100644 --- a/src/pages/events/[id].tsx +++ b/src/pages/events/[id].tsx @@ -8,6 +8,7 @@ import useFetchEvents from "@hooks/useFetchEvents"; import EventPageView from "@views/EventPage/EventPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; +import NotFoundPage from "@pages/404"; interface InitialProps { initialEvent: Event; @@ -20,7 +21,13 @@ const EventPage: NextPage = ({ initialEvent }) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { data, error } = useFetchEvents({ initialData: initialEvent, id: id as string }); - if (!data || router.isFallback) return ; + if (router.isFallback) return ; + + if (!data) { + return ( + + ); + } return ( <> @@ -50,12 +57,19 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const initialEvent = await EventApi.getEvent(Number(id)); + let notFound = false; + let initialEvent: Event; + try { + initialEvent = await EventApi.getEvent(Number(id)); + } catch (err) { + notFound = true; + } return { props: { initialEvent, }, revalidate: 10, + notFound, }; }; diff --git a/src/pages/feed/[id].tsx b/src/pages/feed/[id].tsx index e184bb3..1b42300 100644 --- a/src/pages/feed/[id].tsx +++ b/src/pages/feed/[id].tsx @@ -8,6 +8,7 @@ import useFetchFeed from "@hooks/useFetchFeed"; import FeedPageView from "@views/FeedPage/FeedPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; +import NotFoundPage from "@pages/404"; interface InitialProps { initialPost: Post; @@ -20,7 +21,13 @@ const FeedPage: NextPage = ({ initialPost }) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { data, error } = useFetchFeed({ initialData: initialPost, id: id as string }); - if (!data || router.isFallback) return ; + if (router.isFallback) return ; + + if (!data) { + return ( + + ); + } return ( <> @@ -50,12 +57,20 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const initialPost = await FeedApi.getPost(Number(id)); + let notFound = false; + let initialPost: Post; + try { + initialPost = await FeedApi.getPost(Number(id)); + } catch (err) { + notFound = true; + } + return { props: { initialPost, }, revalidate: 10, + notFound, }; }; diff --git a/src/pages/signup/[id].tsx b/src/pages/signup/[id].tsx index 6286957..ac9070c 100644 --- a/src/pages/signup/[id].tsx +++ b/src/pages/signup/[id].tsx @@ -9,6 +9,7 @@ import SignUpPageView from "@views/SignUpPage/SignUpPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; import noop from "@utils/noop"; +import NotFoundPage from "@pages/404"; type InitialProps = { form: SignupForm; @@ -21,6 +22,12 @@ const SignUpPage: NextPage = ({ form }) => { return ; } + if (!form) { + return ( + + ); + } + const onSubmit = async (data) => { const payload: Signup = { signupForm_id: form.id, @@ -70,12 +77,19 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const form = await SignupApi.getForm(Number(id)); + let notFound = false; + let form: SignupForm; + try { + form = await SignupApi.getForm(Number(id)); + } catch { + notFound = true; + } return { props: { form, }, revalidate: 10, + notFound, }; }; diff --git a/src/views/SignUpPage/SignUpPageView.tsx b/src/views/SignUpPage/SignUpPageView.tsx index 4ca3ca7..6ad2e53 100644 --- a/src/views/SignUpPage/SignUpPageView.tsx +++ b/src/views/SignUpPage/SignUpPageView.tsx @@ -23,16 +23,18 @@ interface SignUpPageViewProps { } const renderList = (signUpForm: SignupForm) => ( - <> -
- Ilmoittautuneet{signUpForm.quota > 0 && (` (${signUpForm.signups.length}/${signUpForm.quota})`)}: -
-
    - {signUpForm.signups.map((s, idx) => ( -
  1. signUpForm.quota ? "reserved" : ""}>{s}
  2. - ))} -
- + ); const StyledSection = styled(TextSection)` @@ -81,11 +83,34 @@ const SignUpPageView: React.FC = ({ ); }; - const form = signUpForm ? renderForm() : ( - - ); + let form: JSX.Element; + let signups: JSX.Element = null; + const startTime = new Date(signUpForm?.start_time); + const endTime = new Date(signUpForm?.end_time); + + if (!signUpForm) { + // Show loader if in edit mode and form has not yet loaded. + // For normal signup page, form is always defined on this level. + form = ( + + ); + } else if (startTime > new Date()) { + form = ( + <> +

Ilmoittauminen ei ole vielä auennut!

+

Se aukeaa {startTime.toLocaleString("fi-FI")}.

+ + ); + } else if (new Date() > endTime) { + form = ( +

Ilmoittauminen on umpeutunut!

+ ); + signups = renderList(signUpForm); + } else { + form = renderForm(); + signups = renderList(signUpForm); + } - const signups = signUpForm && signUpForm.signups ? renderList(signUpForm) : null; return (

@@ -97,11 +122,7 @@ const SignUpPageView: React.FC = ({
{form}
- + {signups} ); };