From fa2ef651c0e28fb3bc45bc1947396a250006577e Mon Sep 17 00:00:00 2001 From: Peter Barnum Date: Wed, 1 May 2024 12:09:08 -0600 Subject: [PATCH] create hook to fetch showcase -- move req to server to prevent CORS issue --- pages/api/showcase.ts | 48 +++++++++++++++++++++++++++++++++++++++ pages/index.tsx | 49 ++++------------------------------------ src/hooks/useShowcase.ts | 45 ++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 44 deletions(-) create mode 100644 pages/api/showcase.ts create mode 100644 src/hooks/useShowcase.ts diff --git a/pages/api/showcase.ts b/pages/api/showcase.ts new file mode 100644 index 0000000..e464689 --- /dev/null +++ b/pages/api/showcase.ts @@ -0,0 +1,48 @@ +import { NextApiRequest as Req, NextApiResponse as Res } from 'next'; + +import { Showcase } from '@this/data/types/gradShowcase'; +import axios, { isAxiosError } from 'axios'; + +import dayjs from 'dayjs'; + +export default async function showcaseHandler(req: Req, res: Res) { + if (req.method === 'GET') { + try { + const { data: showcase } = await axios.get( + 'https://showcase.operationspark.org/api/showcases/active', + ); + if (!showcase) { + res.status(404).end('Showcase inactive'); + return; + } + + const { startDateTime, doorsOffset, websiteActive, active } = showcase; + + if (!startDateTime || !websiteActive || !active) { + res.status(404).end('Showcase inactive'); + return; + } + + const disableTime = dayjs(startDateTime).add(doorsOffset ?? 30, 'minutes'); + + if (disableTime.isBefore(dayjs())) { + console.info('Showcase inactive'); + res.status(404).end('Showcase inactive'); + return; + } + + res.status(200).json(showcase); + } catch (err) { + if (isAxiosError(err) && err.response?.status === 404) { + console.info('Showcase inactive'); + res.status(404).end('Showcase inactive'); + return; + } + console.error('Showcase fetch error: ', err); + res.status(500).end('Showcase fetch error'); + return; + } + } + + res.status(405).end('Method Not Allowed'); +} diff --git a/pages/index.tsx b/pages/index.tsx index 5308fce..d7771a6 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,6 +1,4 @@ -import axios, { isAxiosError } from 'axios'; -import type { GetServerSideProps, NextPage } from 'next'; -import { useState } from 'react'; +import type { GetStaticProps, NextPage } from 'next'; import { IHome } from '../data/types/home'; import { getStaticAsset } from './api/static/[asset]'; @@ -20,9 +18,7 @@ import { ILogo } from '@this/data/types/logos'; import AtlantaPromo from '@this/src/components/Elements/AtlantaPromo'; import PromoVideo from '@this/src/components/Home/PromoVideo'; import ShowcasePromo from '@this/src/components/Home/ShowcasePromo'; -import { toDayJs } from '@this/src/helpers/time'; - -// const gCloudBaseUrl = 'https://storage.googleapis.com/operationspark-org'; +import { useShowcase } from '@this/src/hooks/useShowcase'; interface HomeProps extends IHome { logos: ILogo[]; @@ -35,17 +31,12 @@ const Home: NextPage = ({ greatCompanies, programsForAll, teamEffort, - showcase, }) => { - const [showcaseInfo, setShowcaseInfo] = useState(showcase || null); + const { showcase, clearShowcase } = useShowcase(); return (
- {showcaseInfo ? ( - setShowcaseInfo(null)} /> - ) : ( - - )} + {showcase ? : } @@ -59,41 +50,12 @@ const Home: NextPage = ({ ); }; -const getShowcase = async () => { - try { - const { data } = await axios.get( - 'https://showcase.operationspark.org/api/showcases/active', - ); - - if (!data || !data.startDateTime || !data.websiteActive || !data.active) { - return null; - } - - const disableTime = toDayJs(data.startDateTime).add(data.doorsOffset ?? 30, 'minutes'); - - if (disableTime.isBefore(toDayJs())) { - return null; - } - - return data; - } catch (err) { - if (isAxiosError(err) && err.response?.status === 404) { - console.info('Showcase inactive'); - return null; - } - console.error('Showcase fetch error: ', err); - return null; - } -}; - -export const getServerSideProps: GetServerSideProps = async () => { +export const getStaticProps: GetStaticProps = async () => { const { greatCompanies, programsForAll, igniteCareer, teamEffort }: IHome = await getStaticAsset( 'index', ); const logos: ILogo[] = await getStaticAsset('logos', 'partners'); - const showcase = await getShowcase(); - return { props: { greatCompanies, @@ -101,7 +63,6 @@ export const getServerSideProps: GetServerSideProps = async () => { igniteCareer, teamEffort, logos, - showcase, }, }; }; diff --git a/src/hooks/useShowcase.ts b/src/hooks/useShowcase.ts new file mode 100644 index 0000000..35b5dde --- /dev/null +++ b/src/hooks/useShowcase.ts @@ -0,0 +1,45 @@ +import axios, { isAxiosError } from 'axios'; + +import { Showcase } from '@this/data/types/gradShowcase'; +import { toDayJs } from '@this/src/helpers/time'; +import { useEffect, useState } from 'react'; + +const getShowcase = async () => { + try { + const { data } = await axios.get('/api/showcase'); + + if (!data || !data.startDateTime || !data.websiteActive || !data.active) { + return null; + } + + const disableTime = toDayJs(data.startDateTime).add(data.doorsOffset ?? 30, 'minutes'); + + if (disableTime.isBefore(toDayJs())) { + console.info('Showcase inactive'); + return null; + } + + return data; + } catch (err) { + if (isAxiosError(err) && err.response?.status === 404) { + console.info('Showcase inactive'); + return null; + } + console.error('Showcase fetch error: ', err); + return null; + } +}; + +export const useShowcase = () => { + const [showcase, setShowcase] = useState(); + + useEffect(() => { + getShowcase().then((showcase) => showcase && setShowcase(showcase)); + }, []); + + return { + showcase, + clearShowcase: () => setShowcase(null), + refreshShowcase: () => getShowcase().then((showcase) => showcase && setShowcase(showcase)), + }; +};