diff --git a/TODO.md b/TODO.md index 97c594104..027e0988b 100644 --- a/TODO.md +++ b/TODO.md @@ -25,7 +25,7 @@ Calendar - [x] date input take in account time zone difference between server and client - [x] User selector allow passing users from top level -- [ ] Constants use CALENDAR_EVENT object +- [x] Constants use CALENDAR_EVENT object - [x] New unfriendly crash if omits dates - [x] badges inside tag? - [x] Tags selector can remove diff --git a/app/constants.ts b/app/constants.ts index 45a9c66ec..c53c4014a 100644 --- a/app/constants.ts +++ b/app/constants.ts @@ -9,15 +9,15 @@ export const USER_BIO_MAX_LENGTH = DISCORD_MESSAGE_MAX_LENGTH; export const PlUS_SUGGESTION_FIRST_COMMENT_MAX_LENGTH = 500; export const PlUS_SUGGESTION_COMMENT_MAX_LENGTH = TWEET_LENGTH_MAX_LENGTH; -export const CALENDAR_EVENT_NAME_MIN_LENGTH = 2; -export const CALENDAR_EVENT_NAME_MAX_LENGTH = 100; -export const CALENDAR_EVENT_DESCRIPTION_MAX_LENGTH = DISCORD_MESSAGE_MAX_LENGTH; -export const CALENDAR_EVENT_DISCORD_INVITE_CODE_MAX_LENGTH = 50; -export const CALENDAR_EVENT_BRACKET_URL_MAX_LENGTH = 100; -export const CALENDAR_EVENT_MAX_AMOUNT_OF_DATES = 5; -export const CALENDAR_EVENT_TAGS = Object.keys( - allTags -) as Array; +export const CALENDAR_EVENT = { + NAME_MIN_LENGTH: 2, + NAME_MAX_LENGTH: 100, + DESCRIPTION_MAX_LENGTH: DISCORD_MESSAGE_MAX_LENGTH, + DISCORD_INVITE_CODE_MAX_LENGTH: 50, + BRACKET_URL_MAX_LENGTH: 100, + MAX_AMOUNT_OF_DATES: 5, + TAGS: Object.keys(allTags) as Array, +}; export const CALENDAR_EVENT_RESULT = { MAX_PARTICIPANTS_COUNT: 1000, diff --git a/app/routes/calendar/new.tsx b/app/routes/calendar/new.tsx index 793226a69..61f802609 100644 --- a/app/routes/calendar/new.tsx +++ b/app/routes/calendar/new.tsx @@ -3,15 +3,7 @@ import { Label } from "~/components/Label"; import { Main } from "~/components/Main"; import * as React from "react"; import type { Badge as BadgeType, CalendarEventTag } from "~/db/types"; -import { - CALENDAR_EVENT_TAGS, - CALENDAR_EVENT_BRACKET_URL_MAX_LENGTH, - CALENDAR_EVENT_DESCRIPTION_MAX_LENGTH, - CALENDAR_EVENT_DISCORD_INVITE_CODE_MAX_LENGTH, - CALENDAR_EVENT_MAX_AMOUNT_OF_DATES, - CALENDAR_EVENT_NAME_MAX_LENGTH, - CALENDAR_EVENT_NAME_MIN_LENGTH, -} from "~/constants"; +import { CALENDAR_EVENT } from "~/constants"; import { Button } from "~/components/Button"; import { json, @@ -41,6 +33,7 @@ import { processMany, removeDuplicates, safeJSONParse, + toArray, } from "~/utils/zod"; import { badRequestIfFalsy, @@ -81,20 +74,23 @@ const newCalendarEventActionSchema = z.object({ eventToEditId: z.preprocess(actualNumber, id.nullish()), name: z .string() - .min(CALENDAR_EVENT_NAME_MIN_LENGTH) - .max(CALENDAR_EVENT_NAME_MAX_LENGTH), + .min(CALENDAR_EVENT.NAME_MIN_LENGTH) + .max(CALENDAR_EVENT.NAME_MAX_LENGTH), description: z.preprocess( falsyToNull, - z.string().max(CALENDAR_EVENT_DESCRIPTION_MAX_LENGTH).nullable() + z.string().max(CALENDAR_EVENT.DESCRIPTION_MAX_LENGTH).nullable() ), - date: z - .array(z.preprocess(date, z.date().min(MIN_DATE).max(MAX_DATE))) - .min(1) - .max(CALENDAR_EVENT_MAX_AMOUNT_OF_DATES), - bracketUrl: z.string().url().max(CALENDAR_EVENT_BRACKET_URL_MAX_LENGTH), + date: z.preprocess( + toArray, + z + .array(z.preprocess(date, z.date().min(MIN_DATE).max(MAX_DATE))) + .min(1) + .max(CALENDAR_EVENT.MAX_AMOUNT_OF_DATES) + ), + bracketUrl: z.string().url().max(CALENDAR_EVENT.BRACKET_URL_MAX_LENGTH), discordInviteCode: z.preprocess( falsyToNull, - z.string().max(CALENDAR_EVENT_DISCORD_INVITE_CODE_MAX_LENGTH).nullable() + z.string().max(CALENDAR_EVENT.DISCORD_INVITE_CODE_MAX_LENGTH).nullable() ), tags: z.preprocess( processMany(safeJSONParse, removeDuplicates), @@ -103,7 +99,7 @@ const newCalendarEventActionSchema = z.object({ z .string() .refine((val) => - CALENDAR_EVENT_TAGS.includes(val as CalendarEventTag) + CALENDAR_EVENT.TAGS.includes(val as CalendarEventTag) ) ) .nullable() @@ -131,8 +127,8 @@ export const action: ActionFunction = async ({ request }) => { ? data.tags .sort( (a, b) => - CALENDAR_EVENT_TAGS.indexOf(a as CalendarEventTag) - - CALENDAR_EVENT_TAGS.indexOf(b as CalendarEventTag) + CALENDAR_EVENT.TAGS.indexOf(a as CalendarEventTag) - + CALENDAR_EVENT.TAGS.indexOf(b as CalendarEventTag) ) .join(",") : data.tags, @@ -229,8 +225,8 @@ function NameInput() { @@ -248,7 +244,7 @@ function DescriptionTextarea() { htmlFor="description" valueLimits={{ current: value.length, - max: CALENDAR_EVENT_DESCRIPTION_MAX_LENGTH, + max: CALENDAR_EVENT.DESCRIPTION_MAX_LENGTH, }} > Description @@ -258,7 +254,7 @@ function DescriptionTextarea() { name="description" value={value} onChange={(e) => setValue(e.target.value)} - maxLength={CALENDAR_EVENT_DESCRIPTION_MAX_LENGTH} + maxLength={CALENDAR_EVENT.DESCRIPTION_MAX_LENGTH} data-cy="description-textarea" /> @@ -306,7 +302,7 @@ function DatesInput() {