diff --git a/src/app/manage/[clubId]/create/CreateEventForm.tsx b/src/app/manage/[clubId]/create/CreateEventForm.tsx index 70168b22..fb3fbf0e 100644 --- a/src/app/manage/[clubId]/create/CreateEventForm.tsx +++ b/src/app/manage/[clubId]/create/CreateEventForm.tsx @@ -20,6 +20,7 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub watch, setValue, getValues, + control, } = useForm>({ resolver: zodResolver(createEventSchema), defaultValues: { @@ -29,6 +30,7 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub }); const router = useRouter(); const [watchDescription, watchStartTime] = watch(['description', 'startTime']); + const [loading, setLoading] = useState(false); const [eventPreview, setEventPreview] = useState({ name: "", clubId, @@ -52,8 +54,8 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub location: location || "", liked: false, id: "", - startTime: startTime?.toString() === "" || startTime == undefined ? new Date(Date.now()) : new Date(startTime), - endTime: endTime?.toString() === "" || endTime?.toString() == "Invalid Date" || !endTime ? new Date(Date.now()) : new Date(endTime), + startTime: startTime?.toString() === "" || startTime === undefined ? new Date(Date.now()) : new Date(startTime), + endTime: endTime?.toString() === "" || endTime?.toString() === "Invalid Date" || !endTime ? new Date(Date.now()) : new Date(endTime), club, }); } @@ -65,11 +67,17 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub }, [router, watch, officerClubs]); const createMutation = api.event.create.useMutation({ - onSuccess: () => { location.reload(); } + onSuccess: (data) => { if (data) { + router.push(`/event/${data}`); + } }, + onError: () => { + setLoading(false); + } }) const onSubmit = handleSubmit((data: z.infer) => { - if (!createMutation.isPending) { + if (!createMutation.isPending && !loading) { + setLoading(true); createMutation.mutate(data); } }); @@ -89,7 +97,7 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub

Event Picture

Drag or choose file to upload

-
+

JPEG, PNG, or SVG

@@ -118,8 +126,12 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub placeholder="Event description" />
- - + +

Preview

diff --git a/src/app/manage/[clubId]/create/TimeSelect.tsx b/src/app/manage/[clubId]/create/TimeSelect.tsx index 05ea7d24..4e9f942a 100644 --- a/src/app/manage/[clubId]/create/TimeSelect.tsx +++ b/src/app/manage/[clubId]/create/TimeSelect.tsx @@ -1,84 +1,67 @@ 'use client' -import { useEffect, useState } from "react"; import type { - UseFormRegister, UseFormSetValue, UseFormGetValues, + Control +} from "react-hook-form"; +import { + Controller } from "react-hook-form"; import type { createEventSchema } from "@src/utils/formSchemas"; import type { z } from "zod"; interface Props { - register: UseFormRegister>, setValue: UseFormSetValue>, getValues: UseFormGetValues>, watchStartTime: Date, + control: Control>, } -const TimeSelect = ({ register, setValue, getValues, watchStartTime }: Props) => { - const [multiDay, setMultiDay] = useState(false); - const [numHours, setNumHours] = useState(2); - - useEffect(() => { - // If not multi-day, set end time to start time + numHours - if (!multiDay && watchStartTime !== undefined) { - const date = new Date(watchStartTime); - date.setHours(date.getHours() + numHours); - setValue("endTime", date); - } - - // If start time is after end time, set end time to start time - if (new Date(watchStartTime) > new Date(getValues('endTime'))) { - setValue('endTime', watchStartTime); - } - }, [setValue, getValues, watchStartTime, multiDay, numHours]) - +const TimeSelect = ({ setValue, getValues, watchStartTime, control }: Props) => { return (<> -
-
-

Multi-Day Event

-

Does the event last longer than one day?

-
-
-
-
{ - // If switching to multiDay, clear endTime - if (!multiDay) { - setValue('endTime', new Date(NaN)); - } - setMultiDay(!multiDay); - }} >
-

{multiDay ? "Yes" : "No"}

-
-
-

Duration

- + ( + { + if (!getValues("endTime") || new Date(e.currentTarget.value) > getValues("endTime")) { + // Add 1 hr to new start time + setValue("endTime", new Date(new Date(e.currentTarget.value).getTime() + 60 * 60 * 1000)); + } + onChange(new Date(e.currentTarget.value)); + }} + className="outline-none w-full block p-2 text-xs rounded-md text-[#7D8FB3]" /> + )} + rules={{ + required: true, + }} />
- { multiDay ?
- { if (new Date(e.currentTarget.value) < new Date(watchStartTime)) setValue('endTime', watchStartTime); }} - min={watchStartTime?.toString()} - className="outline-none w-full block p-2 text-xs rounded-md text-[#7D8FB3]" - /> -
- : -
- - + ( + onChange(new Date(e.currentTarget.value))} + className="outline-none w-full block p-2 text-xs rounded-md text-[#7D8FB3]" /> + )} + rules={{ + required: true, + }} />
- }
); } diff --git a/src/server/api/routers/event.ts b/src/server/api/routers/event.ts index e883f40e..454af6e4 100644 --- a/src/server/api/routers/event.ts +++ b/src/server/api/routers/event.ts @@ -262,7 +262,9 @@ export const eventRouter = createTRPCRouter({ throw new TRPCError({ code: 'UNAUTHORIZED' }); } - await ctx.db.insert(events).values({ ...input }); + const res = await ctx.db.insert(events).values({ ...input }).returning({ id: events.id }); + if (res.length == 0) throw "Failed to add event"; + return res[0]?.id; }), byName: publicProcedure.input(byNameSchema).query(async ({ input, ctx }) => { const { name, sortByDate } = input;