88 lines
2.2 KiB
TypeScript
88 lines
2.2 KiB
TypeScript
'use server'
|
|
import { env } from '~/env'
|
|
import { getGoogleCalendarClient, getGoogleCalendarId } from '~/server/googleCalendar'
|
|
|
|
function googleCalendarDate(date: Date) {
|
|
return date.toISOString().replace(/[-:]|\.\d{3}/g, '')
|
|
}
|
|
|
|
function createGoogleCalendarTemplateLink({
|
|
title,
|
|
description,
|
|
startTime,
|
|
endTime,
|
|
gregorEmail,
|
|
}: {
|
|
title: string
|
|
description: string
|
|
startTime: Date
|
|
endTime: Date
|
|
gregorEmail: string
|
|
}) {
|
|
const params = new URLSearchParams({
|
|
action: 'TEMPLATE',
|
|
text: title,
|
|
dates: `${googleCalendarDate(startTime)}/${googleCalendarDate(endTime)}`,
|
|
details: description,
|
|
add: gregorEmail,
|
|
})
|
|
|
|
return `https://calendar.google.com/calendar/render?${params.toString()}`
|
|
}
|
|
|
|
export async function scheduleMeeting({
|
|
title,
|
|
description,
|
|
dateTime,
|
|
durationMinutes,
|
|
attendeeEmail,
|
|
attendeeName,
|
|
}: {
|
|
title: string
|
|
description: string
|
|
dateTime: string
|
|
durationMinutes: number
|
|
attendeeEmail?: string
|
|
attendeeName?: string
|
|
}) {
|
|
try {
|
|
const calendar = getGoogleCalendarClient()
|
|
|
|
const startTime = new Date(dateTime)
|
|
const endTime = new Date(startTime.getTime() + durationMinutes * 60 * 1000)
|
|
const attendeeNote = attendeeEmail
|
|
? `\n\nVisitor: ${attendeeName ?? 'Unknown'} <${attendeeEmail}>`
|
|
: ''
|
|
const eventDescription = `${description}${attendeeNote}`
|
|
|
|
const eventRequest = {
|
|
summary: title,
|
|
description: eventDescription,
|
|
start: { dateTime: startTime.toISOString(), timeZone: 'UTC' },
|
|
end: { dateTime: endTime.toISOString(), timeZone: 'UTC' },
|
|
}
|
|
const event = await calendar.events.insert({
|
|
calendarId: getGoogleCalendarId(),
|
|
requestBody: eventRequest,
|
|
})
|
|
|
|
const addToCalendarLink = createGoogleCalendarTemplateLink({
|
|
title,
|
|
description,
|
|
startTime,
|
|
endTime,
|
|
gregorEmail: env.GREGOR_MEETING_EMAIL,
|
|
})
|
|
|
|
return {
|
|
success: true,
|
|
eventId: event.data.id,
|
|
addToCalendarLink,
|
|
message: `Meeting "${title}" scheduled for ${startTime.toLocaleString()}.${attendeeEmail ? ` Visitor email noted: ${attendeeEmail}.` : ''} The add-to-calendar link invites ${env.GREGOR_MEETING_EMAIL}.`,
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to schedule meeting:', error)
|
|
return { success: false, error: 'Failed to schedule meeting. Please try again.' }
|
|
}
|
|
}
|