From 4fb0fbfe07e7c303b810e5ca29de178a6546cc5d Mon Sep 17 00:00:00 2001 From: Malte Delfs Date: Tue, 15 Jun 2021 17:26:16 +0200 Subject: [PATCH] Made event name customizable --- lib/event.ts | 5 +++++ pages/[user]/book.tsx | 6 +++--- pages/api/availability/eventtype.ts | 3 ++- pages/api/book/[user].ts | 16 ++++++++++++++-- pages/availability/event/[type].tsx | 13 +++++++++++-- pages/success.tsx | 19 ++++++++++++------- .../migration.sql | 2 ++ prisma/schema.prisma | 3 ++- 8 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 lib/event.ts create mode 100644 prisma/migrations/20210615142134_added_custom_event_name/migration.sql diff --git a/lib/event.ts b/lib/event.ts new file mode 100644 index 00000000..829ee7e1 --- /dev/null +++ b/lib/event.ts @@ -0,0 +1,5 @@ +export function getEventName(name: string, eventTitle: string, eventNameTemplate?: string) { + return eventNameTemplate + ? eventNameTemplate.replace("{USER}", name) + : eventTitle + ' with ' + name +} diff --git a/pages/[user]/book.tsx b/pages/[user]/book.tsx index f27eda37..fb9165e9 100644 --- a/pages/[user]/book.tsx +++ b/pages/[user]/book.tsx @@ -56,7 +56,7 @@ export default function Book(props) { email: event.target.email.value, notes: event.target.notes.value, timeZone: preferredTimeZone, - eventName: props.eventType.title, + eventTypeId: props.eventType.id, rescheduleUid: rescheduleUid }; @@ -76,7 +76,7 @@ export default function Book(props) { } ); - let successUrl = `/success?date=${date}&type=${props.eventType.id}&user=${props.user.username}&reschedule=1`; + let successUrl = `/success?date=${date}&type=${props.eventType.id}&user=${props.user.username}&reschedule=1&name=${payload.name}`; if (payload['location']) { successUrl += "&location=" + encodeURIComponent(payload['location']); } @@ -217,4 +217,4 @@ export async function getServerSideProps(context) { booking }, } -} \ No newline at end of file +} diff --git a/pages/api/availability/eventtype.ts b/pages/api/availability/eventtype.ts index 8f03e3e9..35d8c114 100644 --- a/pages/api/availability/eventtype.ts +++ b/pages/api/availability/eventtype.ts @@ -18,6 +18,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) length: parseInt(req.body.length), hidden: req.body.hidden, locations: req.body.locations, + eventName: req.body.eventName }; if (req.method == "POST") { @@ -50,4 +51,4 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) res.status(200).json({message: 'Event deleted successfully'}); } -} \ No newline at end of file +} diff --git a/pages/api/book/[user].ts b/pages/api/book/[user].ts index 53ae3db2..9c1f4f3e 100644 --- a/pages/api/book/[user].ts +++ b/pages/api/book/[user].ts @@ -5,6 +5,7 @@ import createConfirmBookedEmail from "../../../lib/emails/confirm-booked"; import async from 'async'; import {v5 as uuidv5} from 'uuid'; import short from 'short-uuid'; +import {getEventName} from "../../../lib/event"; const translator = short(); @@ -26,9 +27,20 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const rescheduleUid = req.body.rescheduleUid; + const selectedEventType = await prisma.eventType.findFirst({ + where: { + userId: currentUser.id, + id: req.body.eventTypeId + }, + select: { + eventName: true, + title: true + } + }); + const evt: CalendarEvent = { - type: req.body.eventName, - title: req.body.eventName + ' with ' + req.body.name, + type: selectedEventType.title, + title: getEventName(req.body.name, selectedEventType.title, selectedEventType.eventName), description: req.body.notes, startTime: req.body.start, endTime: req.body.end, diff --git a/pages/availability/event/[type].tsx b/pages/availability/event/[type].tsx index ed575f25..916e70c2 100644 --- a/pages/availability/event/[type].tsx +++ b/pages/availability/event/[type].tsx @@ -27,6 +27,7 @@ export default function EventType(props) { const descriptionRef = useRef(); const lengthRef = useRef(); const isHiddenRef = useRef(); + const eventNameRef = useRef(); if (loading) { return

Loading...

; @@ -40,11 +41,12 @@ export default function EventType(props) { const enteredDescription = descriptionRef.current.value; const enteredLength = lengthRef.current.value; const enteredIsHidden = isHiddenRef.current.checked; + const enteredEventName = eventNameRef.current.value; // TODO: Add validation const response = await fetch('/api/availability/eventtype', { method: 'PATCH', - body: JSON.stringify({id: props.eventType.id, title: enteredTitle, slug: enteredSlug, description: enteredDescription, length: enteredLength, hidden: enteredIsHidden, locations }), + body: JSON.stringify({id: props.eventType.id, title: enteredTitle, slug: enteredSlug, description: enteredDescription, length: enteredLength, hidden: enteredIsHidden, locations, eventName: enteredEventName }), headers: { 'Content-Type': 'application/json' } @@ -232,6 +234,12 @@ export default function EventType(props) { +
+ +
+ +
+
@@ -348,6 +356,7 @@ export async function getServerSideProps(context) { length: true, hidden: true, locations: true, + eventName: true, } }); @@ -357,4 +366,4 @@ export async function getServerSideProps(context) { eventType }, } -} \ No newline at end of file +} diff --git a/pages/success.tsx b/pages/success.tsx index c36ab173..44a3ea46 100644 --- a/pages/success.tsx +++ b/pages/success.tsx @@ -10,6 +10,7 @@ import utc from 'dayjs/plugin/utc'; import toArray from 'dayjs/plugin/toArray'; import timezone from 'dayjs/plugin/timezone'; import { createEvent } from 'ics'; +import {getEventName} from "../lib/event"; dayjs.extend(utc); dayjs.extend(toArray); @@ -18,6 +19,7 @@ dayjs.extend(timezone); export default function Success(props) { const router = useRouter(); const { location } = router.query; + const { name } = router.query; const [ is24h, setIs24h ] = useState(false); const [ date, setDate ] = useState(dayjs.utc(router.query.date)); @@ -27,6 +29,8 @@ export default function Success(props) { setIs24h(!!localStorage.getItem('timeOption.is24hClock')); }, []); + const eventName = getEventName(name, props.eventType.title, props.eventType.eventName); + function eventLink(): string { let optional = {}; @@ -37,7 +41,7 @@ export default function Success(props) { const event = createEvent({ start: date.utc().toArray().slice(0, 6), startInputType: 'utc', - title: props.eventType.title + ' with ' + props.user.name, + title: eventName, description: props.eventType.description, duration: { minutes: props.eventType.length }, ...optional @@ -53,7 +57,7 @@ export default function Success(props) { return(
- Booking Confirmed | {props.eventType.title} with {props.user.name || props.user.username} | Calendso + Booking Confirmed | {eventName} | Calendso
@@ -76,7 +80,7 @@ export default function Success(props) {

-

{props.eventType.title} with {props.user.name}

+

{eventName}

{props.eventType.length} minutes @@ -95,17 +99,17 @@ export default function Success(props) {

Add to your calendar
- Google - Microsoft Outlook - Microsoft Office @@ -149,7 +153,8 @@ export async function getServerSideProps(context) { id: true, title: true, description: true, - length: true + length: true, + eventName: true } }); diff --git a/prisma/migrations/20210615142134_added_custom_event_name/migration.sql b/prisma/migrations/20210615142134_added_custom_event_name/migration.sql new file mode 100644 index 00000000..856cb4c7 --- /dev/null +++ b/prisma/migrations/20210615142134_added_custom_event_name/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "EventType" ADD COLUMN "eventName" TEXT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 88a8187d..5f3ee65d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -21,6 +21,7 @@ model EventType { user User? @relation(fields: [userId], references: [id]) userId Int? bookings Booking[] + eventName String? } model Credential { @@ -119,4 +120,4 @@ model Booking { createdAt DateTime @default(now()) updatedAt DateTime? -} \ No newline at end of file +}