diff --git a/pages/events/[slug].tsx b/pages/events/[slug].tsx index db028fa..80000e4 100644 --- a/pages/events/[slug].tsx +++ b/pages/events/[slug].tsx @@ -8,7 +8,7 @@ import useSWR from 'swr' import { Event } from '@prisma/client' import { EditableMarkdown, EditableText } from '../../components/generic/editable/inputs' import { EditingContext, EditingMode } from '../../components/generic/editable/base' -import { useCallback, useContext, useState } from 'react' +import { useCallback, useState } from 'react' import { ToolBar } from '../../components/generic/toolbar/bar' import { ToolToggleEditing } from '../../components/events/toolbar/toolToggleEditing' import { ToolToggleVisibility } from '../../components/postcard/toolbar/toolToggleVisibility' @@ -17,6 +17,9 @@ import { AuthContext } from '../../components/auth/base' import { useDefinedContext } from '../../utils/definedContext' import { ViewContent } from '../../components/generic/views/content' import { useAxios } from '../../components/auth/requests' +import { faAsterisk } from '@fortawesome/free-solid-svg-icons' +import { FestaIcon } from '../../components/generic/renderers/fontawesome' +import { usePromise, UsePromiseStatus } from '../../components/generic/loading/promise' export async function getServerSideProps(context: NextPageContext) { @@ -35,15 +38,35 @@ type PageEventProps = { const PageEvent: NextPage = ({ slug }) => { - const { t } = useTranslation() - const { data, mutate } = useSWR(`/api/events/${slug}`) - const [auth, _setAuth] = useDefinedContext(AuthContext) - const axios = useAxios() + const { t } = + useTranslation() + + const { data, isValidating, mutate } = + useSWR(`/api/events/${slug}`) + + const [auth, _setAuth] = + useDefinedContext(AuthContext) + + const axios = + useAxios() + + const { run: patchEditsToAPI, status: patchStatus } = + usePromise((d) => axios.patch(`/api/events/${slug}`, d)) + + const isLoading = isValidating || patchStatus === UsePromiseStatus.PENDING const save = useCallback( async () => { - await axios.patch(`/api/events/${slug}`, data) + + if (data === undefined) { + console.warn("[PageEvent] Tried to save while no data was available.") + return + } + + patchEditsToAPI(data) mutate(data) + + console.info("[PageEvent] Saved successfully!") }, [axios, data] ) @@ -62,6 +85,7 @@ const PageEvent: NextPage = ({ slug }) => { mutate(async state => state ? { ...state, name: e.target.value } : undefined, { revalidate: false })} + viewPrefix={isLoading ? <>   : undefined} /> } content={