mirror of
https://github.com/supabase/supabase.git
synced 2026-10-17 15:19:08 +03:00
134 lines
4.1 KiB
TypeScript
134 lines
4.1 KiB
TypeScript
import { useState, useEffect } from 'react'
|
|
import dynamic from 'next/dynamic'
|
|
import { GetServerSideProps } from 'next'
|
|
import { useRouter } from 'next/router'
|
|
import { NextSeo } from 'next-seo'
|
|
import { Session } from '@supabase/supabase-js'
|
|
import { LW12_DATE, LW12_TITLE, LW_URL, SITE_ORIGIN } from '~/lib/constants'
|
|
import supabase from '~/lib/supabase'
|
|
|
|
import DefaultLayout from '~/components/Layouts/Default'
|
|
import { TicketState, ConfDataContext, UserData } from '~/components/LaunchWeek/hooks/use-conf-data'
|
|
import SectionContainer from '~/components/Layouts/SectionContainer'
|
|
import { Meetup } from '~/components/LaunchWeek/12/LWMeetups'
|
|
import LWStickyNav from '~/components/LaunchWeek/12/Releases/LWStickyNav'
|
|
import LWHeader from '~/components/LaunchWeek/12/Releases/LWHeader'
|
|
import MainStage from '~/components/LaunchWeek/12/Releases/MainStage'
|
|
|
|
const BuildStage = dynamic(() => import('~/components/LaunchWeek/12/Releases/BuildStage'))
|
|
const CTABanner = dynamic(() => import('~/components/CTABanner'))
|
|
const LaunchWeekPrizeSection = dynamic(
|
|
() => import('~/components/LaunchWeek/12/LaunchWeekPrizeSection')
|
|
)
|
|
const LW12Meetups = dynamic(() => import('~/components/LaunchWeek/12/LWMeetups'))
|
|
|
|
interface Props {
|
|
meetups?: Meetup[]
|
|
}
|
|
|
|
export default function LaunchWeekIndex({ meetups }: Props) {
|
|
const { query } = useRouter()
|
|
|
|
const TITLE = `${LW12_TITLE} | ${LW12_DATE}`
|
|
const DESCRIPTION = 'Join us for a week of announcing new features, every day at 7 AM PT.'
|
|
const OG_IMAGE = `${SITE_ORIGIN}/images/launchweek/12/lw12-og.png?lw=12`
|
|
|
|
const ticketNumber = query.ticketNumber?.toString()
|
|
const [session, setSession] = useState<Session | null>(null)
|
|
const [showCustomizationForm, setShowCustomizationForm] = useState<boolean>(false)
|
|
|
|
const defaultUserData = {
|
|
id: query.id?.toString(),
|
|
ticket_number: ticketNumber ? parseInt(ticketNumber, 10) : undefined,
|
|
name: query.name?.toString(),
|
|
username: query.username?.toString(),
|
|
platinum: !!query.platinum,
|
|
}
|
|
|
|
const [userData, setUserData] = useState<UserData>(defaultUserData)
|
|
const [ticketState, setTicketState] = useState<TicketState>('loading')
|
|
|
|
useEffect(() => {
|
|
if (supabase) {
|
|
supabase.auth.getSession().then(({ data: { session } }) => setSession(session))
|
|
const {
|
|
data: { subscription },
|
|
} = supabase.auth.onAuthStateChange((_event, session) => {
|
|
setSession(session)
|
|
})
|
|
|
|
return () => subscription.unsubscribe()
|
|
}
|
|
}, [supabase])
|
|
|
|
useEffect(() => {
|
|
if (session?.user) {
|
|
if (userData?.id) {
|
|
return setTicketState('ticket')
|
|
}
|
|
return setTicketState('loading')
|
|
}
|
|
if (!session) return setTicketState('registration')
|
|
}, [session, userData])
|
|
|
|
return (
|
|
<>
|
|
<NextSeo
|
|
title={TITLE}
|
|
description={DESCRIPTION}
|
|
openGraph={{
|
|
title: TITLE,
|
|
description: DESCRIPTION,
|
|
url: LW_URL,
|
|
images: [
|
|
{
|
|
url: OG_IMAGE,
|
|
},
|
|
],
|
|
}}
|
|
/>
|
|
<ConfDataContext.Provider
|
|
value={{
|
|
supabase,
|
|
session,
|
|
userData,
|
|
setUserData,
|
|
ticketState,
|
|
setTicketState,
|
|
showCustomizationForm,
|
|
setShowCustomizationForm,
|
|
}}
|
|
>
|
|
<DefaultLayout>
|
|
<LWStickyNav />
|
|
<LWHeader />
|
|
<MainStage className="relative z-10" />
|
|
<BuildStage />
|
|
<SectionContainer id="meetups" className="scroll-mt-[60px] lw-nav-anchor">
|
|
<LW12Meetups meetups={meetups} />
|
|
</SectionContainer>
|
|
<SectionContainer className="!pt-8 scroll-mt-[60px] lw-nav-anchor" id="awards">
|
|
<LaunchWeekPrizeSection />
|
|
</SectionContainer>
|
|
<CTABanner />
|
|
</DefaultLayout>
|
|
</ConfDataContext.Provider>
|
|
</>
|
|
)
|
|
}
|
|
|
|
export const getServerSideProps: GetServerSideProps = async () => {
|
|
const { data: meetups } = await supabase!
|
|
.from('meetups')
|
|
.select('*')
|
|
.eq('launch_week', 'lw12')
|
|
.neq('is_published', false)
|
|
.order('start_at')
|
|
|
|
return {
|
|
props: {
|
|
meetups,
|
|
},
|
|
}
|
|
}
|