1
Fork 0
mirror of https://github.com/Steffo99/festa.git synced 2024-10-16 15:07:27 +00:00
festa/pages/events/[slug].tsx

88 lines
3.2 KiB
TypeScript
Raw Normal View History

2022-06-11 03:08:49 +00:00
import { NextPage, NextPageContext } from 'next'
import { useTranslation } from 'next-i18next'
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import { default as Head } from 'next/head'
2022-06-09 21:43:38 +00:00
import defaultPostcard from "../../public/postcards/adi-goldstein-Hli3R6LKibo-unsplash.jpg"
2022-06-11 03:08:49 +00:00
import { Postcard } from '../../components/postcard/changer'
import useSWR from 'swr'
import { Event } from '@prisma/client'
2022-07-18 02:47:02 +00:00
import { useCallback, useState } from 'react'
2022-07-16 16:18:41 +00:00
import { ToolBar } from '../../components/generic/toolbar/bar'
import { ToolToggleEditing } from '../../components/events/toolbar/toolToggleEditing'
import { ToolToggleVisibility } from '../../components/postcard/toolbar/toolToggleVisibility'
import { WIPBanner } from '../../components/generic/wip/banner'
2022-07-16 18:02:03 +00:00
import { AuthContext } from '../../components/auth/base'
import { useDefinedContext } from '../../utils/definedContext'
import { useAxios } from '../../components/auth/requests'
import { database } from '../../utils/prismaClient'
2022-07-19 18:25:11 +00:00
import { EventsActionEdit } from '../../components/events/actions/edit'
import { EventsActionView } from '../../components/events/actions/view'
2022-07-20 11:26:34 +00:00
import { usePromise } from '../../components/generic/loading/promise'
2022-06-03 01:55:02 +00:00
export async function getServerSideProps(context: NextPageContext) {
const slug = context.query.slug as string
2022-06-03 01:55:02 +00:00
return {
props: {
slug,
2022-07-19 18:25:11 +00:00
fallbackData: await database.event.findUnique({ where: { slug } }),
2022-06-03 01:55:02 +00:00
...(await serverSideTranslations(context.locale ?? "it-IT", ["common"]))
}
}
}
2022-06-11 03:08:49 +00:00
type PageEventProps = {
slug: string,
2022-07-19 18:25:11 +00:00
fallbackData: Event,
2022-06-03 01:55:02 +00:00
}
2022-07-19 18:25:11 +00:00
const PageEvent: NextPage<PageEventProps> = ({ slug, fallbackData }) => {
const { t } = useTranslation()
const axios = useAxios()
2022-06-10 03:21:02 +00:00
2022-07-19 18:25:11 +00:00
const [eventEditing, eventSetEditing] = useState<boolean>(false)
2022-07-20 10:29:07 +00:00
const { data, mutate } = useSWR<Event>(`/api/events/${slug}`, { fallbackData, revalidateOnFocus: eventEditing, revalidateOnReconnect: eventEditing, refreshInterval: eventEditing ? 0 : 30000 })
const [auth,] = useDefinedContext(AuthContext)
2022-07-19 18:25:11 +00:00
2022-07-20 11:26:34 +00:00
const save = usePromise<void, void>(useCallback(
2022-07-17 00:31:04 +00:00
async () => {
2022-07-19 18:25:11 +00:00
const response = await axios.patch<Event>(`/api/events/${slug}`, data!)
mutate(response.data, { revalidate: false })
2022-07-16 18:02:03 +00:00
},
2022-07-19 18:30:37 +00:00
[axios, data, mutate, slug]
2022-07-20 11:26:34 +00:00
))
2022-07-16 18:02:03 +00:00
2022-07-19 18:25:11 +00:00
const eventName = data?.name ?? slug
const eventPostcard = data?.postcard || defaultPostcard
const eventCanEdit = auth && data && auth.userId === data.creatorId
2022-06-04 03:13:19 +00:00
return <>
<Head>
2022-07-19 18:25:11 +00:00
<title key="title">{eventName} - {t("siteTitle")}</title>
2022-06-04 03:13:19 +00:00
</Head>
2022-07-19 18:25:11 +00:00
<Postcard src={eventPostcard} />
2022-07-16 16:18:41 +00:00
<WIPBanner />
2022-07-19 18:25:11 +00:00
<ToolBar vertical="vadapt" horizontal="right">
<ToolToggleVisibility />
{eventCanEdit &&
<ToolToggleEditing
editing={eventEditing}
setEditing={eventSetEditing}
save={save}
/>
}
</ToolBar>
{eventEditing ?
2022-07-20 11:26:34 +00:00
<EventsActionEdit data={data!} mutate={mutate} save={save} setEditing={eventSetEditing} />
2022-07-19 18:25:11 +00:00
:
<EventsActionView data={data!} />
}
2022-06-04 03:13:19 +00:00
</>
2022-06-11 03:08:49 +00:00
}
export default PageEvent