diff --git a/packages/app-store/_components/OmniInstallAppButton.tsx b/packages/app-store/_components/OmniInstallAppButton.tsx index daeb6ebb62b146..c3848f3cdfe643 100644 --- a/packages/app-store/_components/OmniInstallAppButton.tsx +++ b/packages/app-store/_components/OmniInstallAppButton.tsx @@ -24,7 +24,7 @@ export default function OmniInstallAppButton({ }) { const { t } = useLocale(); const { data: app } = useApp(appId); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = useAddAppMutation(null, { returnTo, diff --git a/packages/app-store/alby/components/AlbyPaymentComponent.tsx b/packages/app-store/alby/components/AlbyPaymentComponent.tsx index a9800fe6daff8b..a0117042a749b5 100644 --- a/packages/app-store/alby/components/AlbyPaymentComponent.tsx +++ b/packages/app-store/alby/components/AlbyPaymentComponent.tsx @@ -130,7 +130,7 @@ function PaymentChecker(props: PaymentCheckerProps) { // TODO: subscribe rather than polling const searchParams = useCompatSearchParams(); const bookingSuccessRedirect = useBookingSuccessRedirect(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const { t } = useLocale(); useEffect(() => { diff --git a/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts b/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts index 97c36059e72a94..27356649dfb802 100644 --- a/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts +++ b/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts @@ -107,8 +107,8 @@ const DailyVideoApiAdapter = (): VideoApiAdapter => { const translateEvent = async (event: CalendarEvent) => { // Documentation at: https://docs.daily.co/reference#list-rooms - // added a 1 hour buffer for room expiration - const exp = Math.round(new Date(event.endTime).getTime() / 1000) + 60 * 60; + // Adds 14 days from the end of the booking as the expiration date + const exp = Math.round(new Date(event.endTime).getTime() / 1000) + 60 * 60 * 24 * 14; const { scale_plan: scalePlan } = await getDailyAppKeys(); const hasTeamPlan = await prisma.membership.findFirst({ where: { diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 1a28f1e5181b7b..8b739ae6e224ef 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -9,6 +9,7 @@ import dayjs from "@calcom/dayjs"; import { getFeatureFlag } from "@calcom/features/flags/server/utils"; import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser"; import type CalendarService from "@calcom/lib/CalendarService"; +import { formatCalEvent } from "@calcom/lib/formatCalendarEvent"; import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; import prisma from "@calcom/prisma"; @@ -187,61 +188,65 @@ export default class GoogleCalendarService implements Calendar { }; async createEvent(calEventRaw: CalendarEvent, credentialId: number): Promise { + const formattedCalEvent = formatCalEvent(calEventRaw); + const payload: calendar_v3.Schema$Event = { - summary: calEventRaw.title, - description: getRichDescription(calEventRaw), + summary: formattedCalEvent.title, + description: getRichDescription(formattedCalEvent), start: { - dateTime: calEventRaw.startTime, - timeZone: calEventRaw.organizer.timeZone, + dateTime: formattedCalEvent.startTime, + timeZone: formattedCalEvent.organizer.timeZone, }, end: { - dateTime: calEventRaw.endTime, - timeZone: calEventRaw.organizer.timeZone, + dateTime: formattedCalEvent.endTime, + timeZone: formattedCalEvent.organizer.timeZone, }, - attendees: this.getAttendees(calEventRaw), + attendees: this.getAttendees(formattedCalEvent), reminders: { useDefault: true, }, - guestsCanSeeOtherGuests: !!calEventRaw.seatsPerTimeSlot ? calEventRaw.seatsShowAttendees : true, - iCalUID: calEventRaw.iCalUID, + guestsCanSeeOtherGuests: !!formattedCalEvent.seatsPerTimeSlot + ? formattedCalEvent.seatsShowAttendees + : true, + iCalUID: formattedCalEvent.iCalUID, }; - if (calEventRaw.location) { - payload["location"] = getLocation(calEventRaw); + if (formattedCalEvent.location) { + payload["location"] = getLocation(formattedCalEvent); } - if (calEventRaw.recurringEvent) { + if (formattedCalEvent.recurringEvent) { const rule = new RRule({ - freq: calEventRaw.recurringEvent.freq, - interval: calEventRaw.recurringEvent.interval, - count: calEventRaw.recurringEvent.count, + freq: formattedCalEvent.recurringEvent.freq, + interval: formattedCalEvent.recurringEvent.interval, + count: formattedCalEvent.recurringEvent.count, }); payload["recurrence"] = [rule.toString()]; } - if (calEventRaw.conferenceData && calEventRaw.location === MeetLocationType) { - payload["conferenceData"] = calEventRaw.conferenceData; + if (formattedCalEvent.conferenceData && formattedCalEvent.location === MeetLocationType) { + payload["conferenceData"] = formattedCalEvent.conferenceData; } const calendar = await this.authedCalendar(); - // Find in calEventRaw.destinationCalendar the one with the same credentialId + // Find in formattedCalEvent.destinationCalendar the one with the same credentialId const selectedCalendar = - calEventRaw.destinationCalendar?.find((cal) => cal.credentialId === credentialId)?.externalId || + formattedCalEvent.destinationCalendar?.find((cal) => cal.credentialId === credentialId)?.externalId || "primary"; try { let event; let recurringEventId = null; - if (calEventRaw.existingRecurringEvent) { - recurringEventId = calEventRaw.existingRecurringEvent.recurringEventId; + if (formattedCalEvent.existingRecurringEvent) { + recurringEventId = formattedCalEvent.existingRecurringEvent.recurringEventId; const recurringEventInstances = await calendar.events.instances({ calendarId: selectedCalendar, - eventId: calEventRaw.existingRecurringEvent.recurringEventId, + eventId: formattedCalEvent.existingRecurringEvent.recurringEventId, }); if (recurringEventInstances.data.items) { - const calComEventStartTime = dayjs(calEventRaw.startTime) - .tz(calEventRaw.organizer.timeZone) + const calComEventStartTime = dayjs(formattedCalEvent.startTime) + .tz(formattedCalEvent.organizer.timeZone) .format(); for (let i = 0; i < recurringEventInstances.data.items.length; i++) { const instance = recurringEventInstances.data.items[i]; @@ -266,9 +271,9 @@ export default class GoogleCalendarService implements Calendar { calendarId: selectedCalendar, eventId: event.id || "", requestBody: { - location: getLocation(calEventRaw), + location: getLocation(formattedCalEvent), description: getRichDescription({ - ...calEventRaw, + ...formattedCalEvent, }), }, }); @@ -296,7 +301,7 @@ export default class GoogleCalendarService implements Calendar { eventId: event.id || "", requestBody: { description: getRichDescription({ - ...calEventRaw, + ...formattedCalEvent, additionalInformation: { hangoutLink: event.hangoutLink }, }), }, @@ -342,37 +347,42 @@ export default class GoogleCalendarService implements Calendar { } async updateEvent(uid: string, event: CalendarEvent, externalCalendarId: string): Promise { + const formattedCalEvent = formatCalEvent(event); + const payload: calendar_v3.Schema$Event = { - summary: event.title, - description: getRichDescription(event), + summary: formattedCalEvent.title, + description: getRichDescription(formattedCalEvent), start: { - dateTime: event.startTime, - timeZone: event.organizer.timeZone, + dateTime: formattedCalEvent.startTime, + timeZone: formattedCalEvent.organizer.timeZone, }, end: { - dateTime: event.endTime, - timeZone: event.organizer.timeZone, + dateTime: formattedCalEvent.endTime, + timeZone: formattedCalEvent.organizer.timeZone, }, - attendees: this.getAttendees(event), + attendees: this.getAttendees(formattedCalEvent), reminders: { useDefault: true, }, - guestsCanSeeOtherGuests: !!event.seatsPerTimeSlot ? event.seatsShowAttendees : true, + guestsCanSeeOtherGuests: !!formattedCalEvent.seatsPerTimeSlot + ? formattedCalEvent.seatsShowAttendees + : true, }; - if (event.location) { - payload["location"] = getLocation(event); + if (formattedCalEvent.location) { + payload["location"] = getLocation(formattedCalEvent); } - if (event.conferenceData && event.location === MeetLocationType) { - payload["conferenceData"] = event.conferenceData; + if (formattedCalEvent.conferenceData && formattedCalEvent.location === MeetLocationType) { + payload["conferenceData"] = formattedCalEvent.conferenceData; } const calendar = await this.authedCalendar(); const selectedCalendar = (externalCalendarId - ? event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId + ? formattedCalEvent.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId) + ?.externalId : undefined) || "primary"; try { @@ -397,7 +407,7 @@ export default class GoogleCalendarService implements Calendar { eventId: evt.data.id || "", requestBody: { description: getRichDescription({ - ...event, + ...formattedCalEvent, additionalInformation: { hangoutLink: evt.data.hangoutLink }, }), }, @@ -419,7 +429,7 @@ export default class GoogleCalendarService implements Calendar { } catch (error) { this.log.error( "There was an error updating event in google calendar: ", - safeStringify({ error, event, uid }) + safeStringify({ error, event: formattedCalEvent, uid }) ); throw error; } diff --git a/packages/app-store/make/pages/setup/index.tsx b/packages/app-store/make/pages/setup/index.tsx index 7c5de88a4e6ddd..1a8985fe48041e 100644 --- a/packages/app-store/make/pages/setup/index.tsx +++ b/packages/app-store/make/pages/setup/index.tsx @@ -16,7 +16,7 @@ export default function MakeSetup({ inviteLink }: InferGetServerSidePropsType>({}); const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const integrations = trpc.viewer.integrations.useQuery({ variant: "automation" }); const oldApiKey = trpc.viewer.apiKeys.findKeyOfType.useQuery({ appId: MAKE }); const teamsList = trpc.viewer.teams.listOwnedTeams.useQuery(undefined, { diff --git a/packages/app-store/routing-forms/components/FormActions.tsx b/packages/app-store/routing-forms/components/FormActions.tsx index fbe6f8ed465b23..848777edf675f7 100644 --- a/packages/app-store/routing-forms/components/FormActions.tsx +++ b/packages/app-store/routing-forms/components/FormActions.tsx @@ -63,7 +63,7 @@ function NewFormDialog({ appUrl }: { appUrl: string }) { const routerQuery = useRouterQuery(); const { t } = useLocale(); const router = useRouter(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = trpc.viewer.appRoutingForms.formMutation.useMutation({ onSuccess: (_data, variables) => { @@ -193,7 +193,7 @@ function Dialogs({ setDeleteDialogOpen: (open: boolean) => void; deleteDialogFormId: string | null; }) { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const router = useRouter(); const { t } = useLocale(); const deleteMutation = trpc.viewer.appRoutingForms.deleteForm.useMutation({ @@ -276,7 +276,7 @@ export function FormActionsProvider({ appUrl, children }: { appUrl: string; chil const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [deleteDialogFormId, setDeleteDialogFormId] = useState(null); const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const toggleMutation = trpc.viewer.appRoutingForms.formMutation.useMutation({ onMutate: async ({ id: formId, disabled }) => { diff --git a/packages/app-store/routing-forms/components/SingleForm.tsx b/packages/app-store/routing-forms/components/SingleForm.tsx index 22cb9f61b82833..b9782e5200a8e0 100644 --- a/packages/app-store/routing-forms/components/SingleForm.tsx +++ b/packages/app-store/routing-forms/components/SingleForm.tsx @@ -234,7 +234,7 @@ type SingleFormComponentProps = { }; function SingleForm({ form, appUrl, Page, enrichedWithUserProfileForm }: SingleFormComponentProps) { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const { t } = useLocale(); const [isTestPreviewOpen, setIsTestPreviewOpen] = useState(false); diff --git a/packages/app-store/routing-forms/pages/forms/[...appPages].tsx b/packages/app-store/routing-forms/pages/forms/[...appPages].tsx index 48a37cc6edf2a2..c2686af6a7f67a 100644 --- a/packages/app-store/routing-forms/pages/forms/[...appPages].tsx +++ b/packages/app-store/routing-forms/pages/forms/[...appPages].tsx @@ -66,7 +66,7 @@ export default function RoutingForms({ const { hasPaidPlan } = useHasPaidPlan(); const routerQuery = useRouterQuery(); const hookForm = useFormContext(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [parent] = useAutoAnimate(); const mutation = trpc.viewer.routingFormOrder.useMutation({ diff --git a/packages/app-store/wipemycalother/components/confirmDialog.tsx b/packages/app-store/wipemycalother/components/confirmDialog.tsx index 5e02ed97203592..2dc38cb8bc3cb7 100644 --- a/packages/app-store/wipemycalother/components/confirmDialog.tsx +++ b/packages/app-store/wipemycalother/components/confirmDialog.tsx @@ -49,7 +49,7 @@ export const ConfirmDialog = (props: IConfirmDialogWipe) => { const endDate = today.endOf("day"); const dateFormat = "ddd, MMM D, YYYY h:mm A"; - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const rescheduleApi = useMutation({ mutationFn: async () => { diff --git a/packages/app-store/zapier/pages/setup/index.tsx b/packages/app-store/zapier/pages/setup/index.tsx index 0294f02cdd6495..805a961f8c44e5 100644 --- a/packages/app-store/zapier/pages/setup/index.tsx +++ b/packages/app-store/zapier/pages/setup/index.tsx @@ -16,7 +16,7 @@ const ZAPIER = "zapier"; export default function ZapierSetup(props: IZapierSetupProps) { const [newApiKeys, setNewApiKeys] = useState>({}); const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const integrations = trpc.viewer.integrations.useQuery({ variant: "automation" }); const oldApiKey = trpc.viewer.apiKeys.findKeyOfType.useQuery({ appId: ZAPIER }); const teamsList = trpc.viewer.teams.listOwnedTeams.useQuery(undefined, { diff --git a/packages/core/getUserAvailability.ts b/packages/core/getUserAvailability.ts index 0df941aaecadb7..174242dec84560 100644 --- a/packages/core/getUserAvailability.ts +++ b/packages/core/getUserAvailability.ts @@ -66,6 +66,7 @@ const _getEventType = async (id: number) => { metadata: true, schedule: { select: { + id: true, availability: { select: { days: true, @@ -276,6 +277,8 @@ const _getUserAvailability = async function getUsersWorkingHoursLifeTheUniverseA const useHostSchedulesForTeamEvent = eventType?.metadata?.config?.useHostSchedulesForTeamEvent; const schedule = !useHostSchedulesForTeamEvent && eventType?.schedule ? eventType.schedule : userSchedule; + const isDefaultSchedule = userSchedule && userSchedule.id === schedule.id; + log.debug( "Using schedule:", safeStringify({ @@ -344,6 +347,15 @@ const _getUserAvailability = async function getUsersWorkingHoursLifeTheUniverseA dateTo, availability, timeZone, + travelSchedules: isDefaultSchedule + ? user.travelSchedules.map((schedule) => { + return { + startDate: dayjs(schedule.startDate), + endDate: schedule.endDate ? dayjs(schedule.endDate) : undefined, + timeZone: schedule.timeZone, + }; + }) + : [], outOfOffice: datesOutOfOffice, }); diff --git a/packages/emails/email-manager.ts b/packages/emails/email-manager.ts index aca5ad30b5f55b..705155496d4e3c 100644 --- a/packages/emails/email-manager.ts +++ b/packages/emails/email-manager.ts @@ -5,6 +5,7 @@ import type { TFunction } from "next-i18next"; import type { EventNameObjectType } from "@calcom/core/event"; import { getEventName } from "@calcom/core/event"; import type BaseEmail from "@calcom/emails/templates/_base-email"; +import { formatCalEvent } from "@calcom/lib/formatCalendarEvent"; import type { CalendarEvent, Person } from "@calcom/types/Calendar"; import type { MonthlyDigestEmailData } from "./src/templates/MonthlyDigestEmail"; @@ -73,27 +74,30 @@ export const sendScheduledEmails = async ( hostEmailDisabled?: boolean, attendeeEmailDisabled?: boolean ) => { + const formattedCalEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; if (!hostEmailDisabled) { - emailsToSend.push(sendEmail(() => new OrganizerScheduledEmail({ calEvent }))); + emailsToSend.push(sendEmail(() => new OrganizerScheduledEmail({ calEvent: formattedCalEvent }))); - if (calEvent.team) { - for (const teamMember of calEvent.team.members) { - emailsToSend.push(sendEmail(() => new OrganizerScheduledEmail({ calEvent, teamMember }))); + if (formattedCalEvent.team) { + for (const teamMember of formattedCalEvent.team.members) { + emailsToSend.push( + sendEmail(() => new OrganizerScheduledEmail({ calEvent: formattedCalEvent, teamMember })) + ); } } } if (!attendeeEmailDisabled) { emailsToSend.push( - ...calEvent.attendees.map((attendee) => { + ...formattedCalEvent.attendees.map((attendee) => { return sendEmail( () => new AttendeeScheduledEmail( { - ...calEvent, - ...(calEvent.hideCalendarNotes && { additionalNotes: undefined }), + ...formattedCalEvent, + ...(formattedCalEvent.hideCalendarNotes && { additionalNotes: undefined }), ...(eventNameObject && { title: getEventName({ ...eventNameObject, t: attendee.language.translate }), }), @@ -110,49 +114,59 @@ export const sendScheduledEmails = async ( // for rescheduled round robin booking that assigned new members export const sendRoundRobinScheduledEmails = async (calEvent: CalendarEvent, members: Person[]) => { + const formattedCalEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; for (const teamMember of members) { - emailsToSend.push(sendEmail(() => new OrganizerScheduledEmail({ calEvent, teamMember }))); + emailsToSend.push( + sendEmail(() => new OrganizerScheduledEmail({ calEvent: formattedCalEvent, teamMember })) + ); } await Promise.all(emailsToSend); }; export const sendRoundRobinRescheduledEmails = async (calEvent: CalendarEvent, members: Person[]) => { + const calendarEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; for (const teamMember of members) { - emailsToSend.push(sendEmail(() => new OrganizerRescheduledEmail({ calEvent, teamMember }))); + emailsToSend.push( + sendEmail(() => new OrganizerRescheduledEmail({ calEvent: calendarEvent, teamMember })) + ); } await Promise.all(emailsToSend); }; export const sendRoundRobinCancelledEmails = async (calEvent: CalendarEvent, members: Person[]) => { + const calendarEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; for (const teamMember of members) { - emailsToSend.push(sendEmail(() => new OrganizerCancelledEmail({ calEvent, teamMember }))); + emailsToSend.push(sendEmail(() => new OrganizerCancelledEmail({ calEvent: calendarEvent, teamMember }))); } await Promise.all(emailsToSend); }; export const sendRescheduledEmails = async (calEvent: CalendarEvent) => { + const calendarEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; - emailsToSend.push(sendEmail(() => new OrganizerRescheduledEmail({ calEvent }))); + emailsToSend.push(sendEmail(() => new OrganizerRescheduledEmail({ calEvent: calendarEvent }))); - if (calEvent.team) { - for (const teamMember of calEvent.team.members) { - emailsToSend.push(sendEmail(() => new OrganizerRescheduledEmail({ calEvent, teamMember }))); + if (calendarEvent.team) { + for (const teamMember of calendarEvent.team.members) { + emailsToSend.push( + sendEmail(() => new OrganizerRescheduledEmail({ calEvent: calendarEvent, teamMember })) + ); } } emailsToSend.push( - ...calEvent.attendees.map((attendee) => { - return sendEmail(() => new AttendeeRescheduledEmail(calEvent, attendee)); + ...calendarEvent.attendees.map((attendee) => { + return sendEmail(() => new AttendeeRescheduledEmail(calendarEvent, attendee)); }) ); @@ -160,10 +174,12 @@ export const sendRescheduledEmails = async (calEvent: CalendarEvent) => { }; export const sendRescheduledSeatEmail = async (calEvent: CalendarEvent, attendee: Person) => { - const clonedCalEvent = cloneDeep(calEvent); + const calendarEvent = formatCalEvent(calEvent); + + const clonedCalEvent = cloneDeep(calendarEvent); const emailsToSend: Promise[] = [ sendEmail(() => new AttendeeRescheduledEmail(clonedCalEvent, attendee)), - sendEmail(() => new OrganizerRescheduledEmail({ calEvent })), + sendEmail(() => new OrganizerRescheduledEmail({ calEvent: calendarEvent })), ]; await Promise.all(emailsToSend); @@ -177,14 +193,18 @@ export const sendScheduledSeatsEmails = async ( hostEmailDisabled?: boolean, attendeeEmailDisabled?: boolean ) => { + const calendarEvent = formatCalEvent(calEvent); + const emailsToSend: Promise[] = []; if (!hostEmailDisabled) { - emailsToSend.push(sendEmail(() => new OrganizerScheduledEmail({ calEvent, newSeat }))); + emailsToSend.push(sendEmail(() => new OrganizerScheduledEmail({ calEvent: calendarEvent, newSeat }))); - if (calEvent.team) { - for (const teamMember of calEvent.team.members) { - emailsToSend.push(sendEmail(() => new OrganizerScheduledEmail({ calEvent, newSeat, teamMember }))); + if (calendarEvent.team) { + for (const teamMember of calendarEvent.team.members) { + emailsToSend.push( + sendEmail(() => new OrganizerScheduledEmail({ calEvent: calendarEvent, newSeat, teamMember })) + ); } } } @@ -195,8 +215,8 @@ export const sendScheduledSeatsEmails = async ( () => new AttendeeScheduledEmail( { - ...calEvent, - ...(calEvent.hideCalendarNotes && { additionalNotes: undefined }), + ...calendarEvent, + ...(calendarEvent.hideCalendarNotes && { additionalNotes: undefined }), }, invitee, showAttendees @@ -208,21 +228,24 @@ export const sendScheduledSeatsEmails = async ( }; export const sendCancelledSeatEmails = async (calEvent: CalendarEvent, cancelledAttendee: Person) => { - const clonedCalEvent = cloneDeep(calEvent); + const formattedCalEvent = formatCalEvent(calEvent); + const clonedCalEvent = cloneDeep(formattedCalEvent); await Promise.all([ sendEmail(() => new AttendeeCancelledSeatEmail(clonedCalEvent, cancelledAttendee)), - sendEmail(() => new OrganizerAttendeeCancelledSeatEmail({ calEvent })), + sendEmail(() => new OrganizerAttendeeCancelledSeatEmail({ calEvent: formattedCalEvent })), ]); }; export const sendOrganizerRequestEmail = async (calEvent: CalendarEvent) => { + const calendarEvent = formatCalEvent(calEvent); + const emailsToSend: Promise[] = []; - emailsToSend.push(sendEmail(() => new OrganizerRequestEmail({ calEvent }))); + emailsToSend.push(sendEmail(() => new OrganizerRequestEmail({ calEvent: calendarEvent }))); - if (calEvent.team?.members) { - for (const teamMember of calEvent.team.members) { - emailsToSend.push(sendEmail(() => new OrganizerRequestEmail({ calEvent, teamMember }))); + if (calendarEvent.team?.members) { + for (const teamMember of calendarEvent.team.members) { + emailsToSend.push(sendEmail(() => new OrganizerRequestEmail({ calEvent: calendarEvent, teamMember }))); } } @@ -230,15 +253,17 @@ export const sendOrganizerRequestEmail = async (calEvent: CalendarEvent) => { }; export const sendAttendeeRequestEmail = async (calEvent: CalendarEvent, attendee: Person) => { - await sendEmail(() => new AttendeeRequestEmail(calEvent, attendee)); + const calendarEvent = formatCalEvent(calEvent); + await sendEmail(() => new AttendeeRequestEmail(calendarEvent, attendee)); }; export const sendDeclinedEmails = async (calEvent: CalendarEvent) => { + const calendarEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; emailsToSend.push( - ...calEvent.attendees.map((attendee) => { - return sendEmail(() => new AttendeeDeclinedEmail(calEvent, attendee)); + ...calendarEvent.attendees.map((attendee) => { + return sendEmail(() => new AttendeeDeclinedEmail(calendarEvent, attendee)); }) ); @@ -249,31 +274,34 @@ export const sendCancelledEmails = async ( calEvent: CalendarEvent, eventNameObject: Pick ) => { + const calendarEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; - emailsToSend.push(sendEmail(() => new OrganizerCancelledEmail({ calEvent }))); + emailsToSend.push(sendEmail(() => new OrganizerCancelledEmail({ calEvent: calendarEvent }))); - if (calEvent.team?.members) { - for (const teamMember of calEvent.team.members) { - emailsToSend.push(sendEmail(() => new OrganizerCancelledEmail({ calEvent, teamMember }))); + if (calendarEvent.team?.members) { + for (const teamMember of calendarEvent.team.members) { + emailsToSend.push( + sendEmail(() => new OrganizerCancelledEmail({ calEvent: calendarEvent, teamMember })) + ); } } emailsToSend.push( - ...calEvent.attendees.map((attendee) => { + ...calendarEvent.attendees.map((attendee) => { return sendEmail( () => new AttendeeCancelledEmail( { - ...calEvent, + ...calendarEvent, title: getEventName({ ...eventNameObject, t: attendee.language.translate, attendeeName: attendee.name, - host: calEvent.organizer.name, - eventType: calEvent.type, - ...(calEvent.responses && { bookingFields: calEvent.responses }), - ...(calEvent.location && { location: calEvent.location }), + host: calendarEvent.organizer.name, + eventType: calendarEvent.type, + ...(calendarEvent.responses && { bookingFields: calendarEvent.responses }), + ...(calendarEvent.location && { location: calendarEvent.location }), }), }, attendee @@ -286,13 +314,17 @@ export const sendCancelledEmails = async ( }; export const sendOrganizerRequestReminderEmail = async (calEvent: CalendarEvent) => { + const calendarEvent = formatCalEvent(calEvent); + const emailsToSend: Promise[] = []; - emailsToSend.push(sendEmail(() => new OrganizerRequestReminderEmail({ calEvent }))); + emailsToSend.push(sendEmail(() => new OrganizerRequestReminderEmail({ calEvent: calendarEvent }))); - if (calEvent.team?.members) { - for (const teamMember of calEvent.team.members) { - emailsToSend.push(sendEmail(() => new OrganizerRequestReminderEmail({ calEvent, teamMember }))); + if (calendarEvent.team?.members) { + for (const teamMember of calendarEvent.team.members) { + emailsToSend.push( + sendEmail(() => new OrganizerRequestReminderEmail({ calEvent: calendarEvent, teamMember })) + ); } } }; @@ -354,28 +386,33 @@ export const sendRequestRescheduleEmail = async ( metadata: { rescheduleLink: string } ) => { const emailsToSend: Promise[] = []; + const calendarEvent = formatCalEvent(calEvent); - emailsToSend.push(sendEmail(() => new OrganizerRequestedToRescheduleEmail(calEvent, metadata))); + emailsToSend.push(sendEmail(() => new OrganizerRequestedToRescheduleEmail(calendarEvent, metadata))); - emailsToSend.push(sendEmail(() => new AttendeeWasRequestedToRescheduleEmail(calEvent, metadata))); + emailsToSend.push(sendEmail(() => new AttendeeWasRequestedToRescheduleEmail(calendarEvent, metadata))); await Promise.all(emailsToSend); }; export const sendLocationChangeEmails = async (calEvent: CalendarEvent) => { + const calendarEvent = formatCalEvent(calEvent); + const emailsToSend: Promise[] = []; - emailsToSend.push(sendEmail(() => new OrganizerLocationChangeEmail({ calEvent }))); + emailsToSend.push(sendEmail(() => new OrganizerLocationChangeEmail({ calEvent: calendarEvent }))); - if (calEvent.team?.members) { - for (const teamMember of calEvent.team.members) { - emailsToSend.push(sendEmail(() => new OrganizerLocationChangeEmail({ calEvent, teamMember }))); + if (calendarEvent.team?.members) { + for (const teamMember of calendarEvent.team.members) { + emailsToSend.push( + sendEmail(() => new OrganizerLocationChangeEmail({ calEvent: calendarEvent, teamMember })) + ); } } emailsToSend.push( - ...calEvent.attendees.map((attendee) => { - return sendEmail(() => new AttendeeLocationChangeEmail(calEvent, attendee)); + ...calendarEvent.attendees.map((attendee) => { + return sendEmail(() => new AttendeeLocationChangeEmail(calendarEvent, attendee)); }) ); @@ -386,7 +423,8 @@ export const sendFeedbackEmail = async (feedback: Feedback) => { }; export const sendBrokenIntegrationEmail = async (evt: CalendarEvent, type: "video" | "calendar") => { - await sendEmail(() => new BrokenIntegrationEmail(evt, type)); + const calendarEvent = formatCalEvent(evt); + await sendEmail(() => new BrokenIntegrationEmail(calendarEvent, type)); }; export const sendDisabledAppEmail = async ({ @@ -428,13 +466,16 @@ export const sendNoShowFeeChargedEmail = async (attendee: Person, evt: CalendarE }; export const sendDailyVideoRecordingEmails = async (calEvent: CalendarEvent, downloadLink: string) => { + const calendarEvent = formatCalEvent(calEvent); const emailsToSend: Promise[] = []; - emailsToSend.push(sendEmail(() => new OrganizerDailyVideoDownloadRecordingEmail(calEvent, downloadLink))); + emailsToSend.push( + sendEmail(() => new OrganizerDailyVideoDownloadRecordingEmail(calendarEvent, downloadLink)) + ); - for (const attendee of calEvent.attendees) { + for (const attendee of calendarEvent.attendees) { emailsToSend.push( - sendEmail(() => new AttendeeDailyVideoDownloadRecordingEmail(calEvent, attendee, downloadLink)) + sendEmail(() => new AttendeeDailyVideoDownloadRecordingEmail(calendarEvent, attendee, downloadLink)) ); } await Promise.all(emailsToSend); diff --git a/packages/emails/src/components/BaseEmailHtml.tsx b/packages/emails/src/components/BaseEmailHtml.tsx index 2f14915782858f..3297dd22317c13 100644 --- a/packages/emails/src/components/BaseEmailHtml.tsx +++ b/packages/emails/src/components/BaseEmailHtml.tsx @@ -23,6 +23,7 @@ export const BaseEmailHtml = (props: { title?: string; subtitle?: React.ReactNode | string; headerType?: BodyHeadType; + hideLogo?: boolean; }) => { return ( @@ -196,7 +197,7 @@ export const BaseEmailHtml = (props: { - + {!Boolean(props.hideLogo) && } diff --git a/packages/emails/src/templates/BaseScheduledEmail.tsx b/packages/emails/src/templates/BaseScheduledEmail.tsx index e75fdb68832fe1..50f3d024e6c647 100644 --- a/packages/emails/src/templates/BaseScheduledEmail.tsx +++ b/packages/emails/src/templates/BaseScheduledEmail.tsx @@ -50,6 +50,7 @@ export const BaseScheduledEmail = ( return ( void; }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [disableDialog, setDisableDialog] = useState(false); const showKeyModal = (fromEnabled?: boolean) => { @@ -187,7 +187,7 @@ const EditKeysModal: FC<{ fromEnabled?: boolean; appName?: string; }> = (props) => { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const { t } = useLocale(); const { dirName, slug, type, isOpen, keys, handleModelClose, fromEnabled, appName } = props; const appKeySchema = appKeysSchemas[dirName as keyof typeof appKeysSchemas]; diff --git a/packages/features/apps/components/DisconnectIntegration.tsx b/packages/features/apps/components/DisconnectIntegration.tsx index b5f1fd3adfc7a4..8a81b7bfd1492a 100644 --- a/packages/features/apps/components/DisconnectIntegration.tsx +++ b/packages/features/apps/components/DisconnectIntegration.tsx @@ -22,7 +22,7 @@ export default function DisconnectIntegration({ }) { const { t } = useLocale(); const [modalOpen, setModalOpen] = useState(false); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = trpc.viewer.deleteCredential.useMutation({ onSuccess: () => { diff --git a/packages/features/apps/components/DisconnectIntegrationModal.tsx b/packages/features/apps/components/DisconnectIntegrationModal.tsx index 24c9da5e0ab845..0899e07d98fb80 100644 --- a/packages/features/apps/components/DisconnectIntegrationModal.tsx +++ b/packages/features/apps/components/DisconnectIntegrationModal.tsx @@ -16,7 +16,7 @@ export default function DisconnectIntegrationModal({ teamId, }: DisconnectIntegrationModalProps) { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = trpc.viewer.deleteCredential.useMutation({ onSuccess: () => { diff --git a/packages/features/bookings/Booker/Booker.tsx b/packages/features/bookings/Booker/Booker.tsx index 120a800232ed99..17198fcacd3d60 100644 --- a/packages/features/bookings/Booker/Booker.tsx +++ b/packages/features/bookings/Booker/Booker.tsx @@ -64,6 +64,7 @@ const BookerComponent = ({ verifyCode, isPlatform, orgBannerUrl, + customClassNames, }: BookerProps & WrappedBookerProps) => { const { t } = useLocale(); const [bookerState, setBookerState] = useBookerStore((state) => [state.state, state.setState], shallow); @@ -268,14 +269,14 @@ const BookerComponent = ({
{!isInstantMeeting && ( @@ -339,8 +340,17 @@ const BookerComponent = ({ src={orgBannerUrl} /> )} - - + {layout !== BookerLayouts.MONTH_VIEW && !(layout === "mobile" && bookerState === "booking") && (
@@ -353,7 +363,7 @@ const BookerComponent = ({ {EventBooker} @@ -366,7 +376,18 @@ const BookerComponent = ({ {...fadeInLeft} initial="visible" className="md:border-subtle ml-[-1px] h-full flex-shrink px-5 py-3 md:border-l lg:w-[var(--booker-main-width)]"> - +
- - {!hideBranding && !isPlatform && ( { const selectedDate = useBookerStore((state) => state.selectedDate); const setSelectedTimeslot = useBookerStore((state) => state.setSelectedTimeslot); @@ -81,13 +89,18 @@ export const AvailableTimeSlots = ({ return ( <> -
+
{isLoading ? (
) : ( slotsPerDay.length > 0 && slotsPerDay.map((slots) => ( {isLoading && // Shows exact amount of days as skeleton. Array.from({ length: 1 + (extraDays ?? 0) }).map((_, i) => )} @@ -114,6 +128,8 @@ export const AvailableTimeSlots = ({ slotsPerDay.map((slots) => (
{ const { i18n } = useLocale(); const [month, selectedDate] = useBookerStore((state) => [state.month, state.selectedDate], shallow); @@ -27,6 +36,14 @@ export const DatePicker = ({ return ( { setSelectedDate(date === null ? date : date.format("YYYY-MM-DD")); diff --git a/packages/features/bookings/Booker/components/EventMeta.tsx b/packages/features/bookings/Booker/components/EventMeta.tsx index 284ae0d66b2840..10b37281a0195f 100644 --- a/packages/features/bookings/Booker/components/EventMeta.tsx +++ b/packages/features/bookings/Booker/components/EventMeta.tsx @@ -27,10 +27,16 @@ export const EventMeta = ({ event, isPending, isPlatform = true, + classNames, }: { event: useEventReturnType["data"]; isPending: useEventReturnType["isPending"]; isPlatform?: boolean; + classNames?: { + eventMetaContainer?: string; + eventMetaTitle?: string; + eventMetaTimezoneSelect?: string; + }; }) => { const { setTimezone, timeFormat, timezone } = useTimePreferences(); const selectedDuration = useBookerStore((state) => state.selectedDuration); @@ -78,7 +84,7 @@ export const EventMeta = ({ : "text-bookinghighlight"; return ( -
+
{isPending && ( @@ -92,7 +98,7 @@ export const EventMeta = ({ profile={event.profile} entity={event.entity} /> - {event?.title} + {event?.title} {event.description && (
@@ -126,7 +132,6 @@ export const EventMeta = ({ )} - "!min-h-0 p-0 w-full border-0 bg-transparent focus-within:ring-0", menu: () => "!w-64 max-w-[90vw]", diff --git a/packages/features/bookings/Booker/components/hooks/useCalendars.ts b/packages/features/bookings/Booker/components/hooks/useCalendars.ts index b6f90c2c1a4410..371a84bea97e6c 100644 --- a/packages/features/bookings/Booker/components/hooks/useCalendars.ts +++ b/packages/features/bookings/Booker/components/hooks/useCalendars.ts @@ -25,7 +25,7 @@ export const useCalendars = ({ hasSession }: UseCalendarsProps) => { credentialId: number; externalId: string; }>("toggledConnectedCalendars", []); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [calendarSettingsOverlay] = useOverlayCalendarStore( (state) => [state.calendarSettingsOverlayModal, state.setCalendarSettingsOverlayModal], diff --git a/packages/features/bookings/Booker/types.ts b/packages/features/bookings/Booker/types.ts index 80e74437d37688..cb38256aaecaec 100644 --- a/packages/features/bookings/Booker/types.ts +++ b/packages/features/bookings/Booker/types.ts @@ -18,6 +18,11 @@ export interface BookerProps { username: string; orgBannerUrl?: string | null; + /* + all custom classnames related to booker styling go here + */ + customClassNames?: CustomClassNames; + /** * Whether is a team or org, we gather basic info from both */ @@ -109,11 +114,13 @@ export type WrappedBookerPropsMain = { schedule: useScheduleForEventReturnType; bookerLayout: UseBookerLayoutType; verifyEmail: UseVerifyEmailReturnType; + customClassNames?: CustomClassNames; }; export type WrappedBookerPropsForPlatform = WrappedBookerPropsMain & { isPlatform: true; verifyCode: undefined; + customClassNames?: CustomClassNames; }; export type WrappedBookerPropsForWeb = WrappedBookerPropsMain & { isPlatform: false; @@ -125,3 +132,27 @@ export type WrappedBookerProps = WrappedBookerPropsForPlatform | WrappedBookerPr export type BookerState = "loading" | "selecting_date" | "selecting_time" | "booking"; export type BookerLayout = BookerLayouts | "mobile"; export type BookerAreas = "calendar" | "timeslots" | "main" | "meta" | "header"; + +export type CustomClassNames = { + bookerContainer?: string; + eventMetaCustomClassNames?: { + eventMetaContainer?: string; + eventMetaTitle?: string; + eventMetaTimezoneSelect?: string; + }; + datePickerCustomClassNames?: { + datePickerContainer?: string; + datePickerTitle?: string; + datePickerDays?: string; + datePickerDate?: string; + datePickerDatesActive?: string; + datePickerToggle?: string; + }; + availableTimeSlotsCustomClassNames?: { + availableTimeSlotsContainer?: string; + availableTimeSlotsHeaderContainer?: string; + availableTimeSlotsTitle?: string; + availableTimeSlotsTimeFormatToggle?: string; + availableTimes?: string; + }; +}; diff --git a/packages/features/bookings/components/AvailableTimes.tsx b/packages/features/bookings/components/AvailableTimes.tsx index bed85fd05466b4..fe636b3ece4ab4 100644 --- a/packages/features/bookings/components/AvailableTimes.tsx +++ b/packages/features/bookings/components/AvailableTimes.tsx @@ -36,6 +36,7 @@ type AvailableTimesProps = { className?: string; selectedSlots?: string[]; event: useEventReturnType; + customClassNames?: string; }; const SlotItem = ({ @@ -45,6 +46,7 @@ const SlotItem = ({ onTimeSelect, showAvailableSeatsCount, event, + customClassNames, }: { slot: Slots[string][number]; seatsPerTimeSlot?: number | null; @@ -52,6 +54,7 @@ const SlotItem = ({ onTimeSelect: TOnTimeSelect; showAvailableSeatsCount?: boolean | null; event: useEventReturnType; + customClassNames?: string; }) => { const { t } = useLocale(); @@ -121,8 +124,9 @@ const SlotItem = ({ data-time={slot.time} onClick={onButtonClick} className={classNames( - "min-h-9 hover:border-brand-default mb-2 flex h-auto w-full flex-grow flex-col justify-center py-2", - selectedSlots?.includes(slot.time) && "border-brand-default" + `min-h-9 hover:border-brand-default mb-2 flex h-auto w-full flex-grow flex-col justify-center py-2`, + selectedSlots?.includes(slot.time) && "border-brand-default", + `${customClassNames}` )} color="secondary">
@@ -193,6 +197,7 @@ export const AvailableTimes = ({ className, selectedSlots, event, + customClassNames, }: AvailableTimesProps) => { const { t } = useLocale(); @@ -223,6 +228,7 @@ export const AvailableTimes = ({ if (slot.away) return null; return ( { const { t, i18n } = useLocale(); const [layout] = useBookerStore((state) => [state.layout], shallow); @@ -28,20 +34,31 @@ export const AvailableTimesHeader = ({ const isToday = dayjs().isSame(date, "day"); return ( -
+
- + {nameOfDay(i18n.language, Number(date.format("d")), "short")} {date.format("DD")} {availableMonth && `, ${availableMonth}`} @@ -50,7 +67,7 @@ export const AvailableTimesHeader = ({ {showTimeFormatToggle && (
- +
)}
diff --git a/packages/features/bookings/components/TimeFormatToggle.tsx b/packages/features/bookings/components/TimeFormatToggle.tsx index 20b38bec963e07..59d29cfce3c5af 100644 --- a/packages/features/bookings/components/TimeFormatToggle.tsx +++ b/packages/features/bookings/components/TimeFormatToggle.tsx @@ -4,13 +4,14 @@ import { ToggleGroup } from "@calcom/ui"; import { useTimePreferences } from "../lib"; -export const TimeFormatToggle = () => { +export const TimeFormatToggle = ({ customClassName }: { customClassName?: string }) => { const timeFormat = useTimePreferences((state) => state.timeFormat); const setTimeFormat = useTimePreferences((state) => state.setTimeFormat); const { t } = useLocale(); return ( { if (newFormat && newFormat !== timeFormat) setTimeFormat(newFormat as TimeFormat); }} diff --git a/packages/features/bookings/lib/handleCancelBooking.ts b/packages/features/bookings/lib/handleCancelBooking.ts index 0a135f5af6af80..b67d8b6ad83d46 100644 --- a/packages/features/bookings/lib/handleCancelBooking.ts +++ b/packages/features/bookings/lib/handleCancelBooking.ts @@ -125,13 +125,24 @@ async function getBookingToDelete(id: number | undefined, uid: string | undefine export type CustomRequest = NextApiRequest & { userId?: number; bookingToDelete?: Awaited>; + platformClientId?: string; + platformRescheduleUrl?: string; + platformCancelUrl?: string; + platformBookingUrl?: string; }; async function handler(req: CustomRequest) { const { id, uid, allRemainingBookings, cancellationReason, seatReferenceUid } = schemaBookingCancelParams.parse(req.body); req.bookingToDelete = await getBookingToDelete(id, uid); - const { bookingToDelete, userId } = req; + const { + bookingToDelete, + userId, + platformBookingUrl, + platformCancelUrl, + platformClientId, + platformRescheduleUrl, + } = req; if (!bookingToDelete || !bookingToDelete.user) { throw new HttpError({ statusCode: 400, message: "Booking not found" }); @@ -269,6 +280,10 @@ async function handler(req: CustomRequest) { seatsShowAttendees: bookingToDelete.eventType?.seatsShowAttendees, iCalUID: bookingToDelete.iCalUID, iCalSequence: bookingToDelete.iCalSequence + 1, + platformClientId, + platformRescheduleUrl, + platformCancelUrl, + platformBookingUrl, }; const dataForWebhooks = { evt, webhooks, eventTypeInfo }; diff --git a/packages/features/bookings/lib/handleNewBooking.ts b/packages/features/bookings/lib/handleNewBooking.ts index 22d40c607284fe..f97a46cf0ea1c0 100644 --- a/packages/features/bookings/lib/handleNewBooking.ts +++ b/packages/features/bookings/lib/handleNewBooking.ts @@ -225,6 +225,7 @@ export const getEventTypesFromDB = async (eventTypeId: number) => { timeZone: true, schedule: { select: { + id: true, availability: true, timeZone: true, }, @@ -290,7 +291,6 @@ const loadUsers = async (eventType: NewBookingEventType, dynamicUserList: string usernameList: dynamicUserList, orgSlug: isValidOrgDomain ? currentOrgDomain : null, }); - return users; } const hosts = eventType.hosts || []; @@ -902,10 +902,16 @@ type BookingDataSchemaGetter = | typeof import("@calcom/features/bookings/lib/getBookingDataSchemaForApi").default; async function handler( - req: NextApiRequest & { userId?: number | undefined }, + req: NextApiRequest & { + userId?: number | undefined; + platformClientId?: string; + platformRescheduleUrl?: string; + platformCancelUrl?: string; + platformBookingUrl?: string; + }, bookingDataSchemaGetter: BookingDataSchemaGetter = getBookingDataSchema ) { - const { userId } = req; + const { userId, platformClientId, platformCancelUrl, platformBookingUrl, platformRescheduleUrl } = req; // handle dynamic user let eventType = @@ -1503,6 +1509,10 @@ async function handler( schedulingType: eventType.schedulingType, iCalUID, iCalSequence, + platformClientId, + platformRescheduleUrl, + platformCancelUrl, + platformBookingUrl, }; if (req.body.thirdPartyRecurringEventId) { diff --git a/packages/features/calendars/CalendarSwitch.tsx b/packages/features/calendars/CalendarSwitch.tsx index d8c2b330756745..6bafec960344a3 100644 --- a/packages/features/calendars/CalendarSwitch.tsx +++ b/packages/features/calendars/CalendarSwitch.tsx @@ -19,7 +19,7 @@ interface ICalendarSwitchProps { const CalendarSwitch = (props: ICalendarSwitchProps) => { const { title, externalId, type, isChecked, name, isLastItemInList = false, credentialId } = props; const [checkedInternal, setCheckedInternal] = useState(isChecked); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const { t } = useLocale(); const mutation = useMutation({ mutationFn: async ({ isOn }: { isOn: boolean }) => { diff --git a/packages/features/calendars/DatePicker.tsx b/packages/features/calendars/DatePicker.tsx index 24ad9a4cd0059a..08a44879867421 100644 --- a/packages/features/calendars/DatePicker.tsx +++ b/packages/features/calendars/DatePicker.tsx @@ -59,12 +59,17 @@ export const Day = ({ disabled, away, emoji, + customClassName, ...props }: JSX.IntrinsicElements["button"] & { active: boolean; date: Dayjs; away?: boolean; emoji?: string | null; + customClassName?: { + dayContainer?: string; + dayActive?: string; + }; }) => { const { t } = useLocale(); const enabledDateButtonEmbedStyles = useEmbedStyles("enabledDateButton"); @@ -79,8 +84,12 @@ export const Day = ({ active ? "bg-brand-default text-brand" : !disabled - ? " hover:border-brand-default text-emphasis bg-emphasis" - : "text-muted" + ? `${ + !customClassName?.dayActive + ? "hover:border-brand-default text-emphasis bg-emphasis" + : `hover:border-brand-default ${customClassName.dayActive}` + }` + : `${customClassName ? "" : " text-mute"}` )} data-testid="day" data-disabled={disabled} @@ -131,6 +140,7 @@ const Days = ({ nextMonthButton, eventSlug, slots, + customClassName, ...props }: Omit & { DayComponent?: React.FC>; @@ -138,6 +148,10 @@ const Days = ({ weekStart: number; month: string | null; nextMonthButton: () => void; + customClassName?: { + datePickerDate?: string; + datePickerDateActive?: string; + }; }) => { // Create placeholder elements for empty days in first week const weekdayOfFirst = browsingDate.date(1).day(); @@ -244,6 +258,10 @@ const Days = ({ ) : ( { props.onChange(day); @@ -271,8 +289,18 @@ const DatePicker = ({ selected, onMonthChange, slots, + customClassNames, ...passThroughProps -}: DatePickerProps & Partial>) => { +}: DatePickerProps & + Partial> & { + customClassNames?: { + datePickerTitle?: string; + datePickerDays?: string; + datePickersDates?: string; + datePickerDatesActive?: string; + datePickerToggle?: string; + }; + }) => { const browsingDate = passThroughProps.browsingDate || dayjs().startOf("month"); const { i18n } = useLocale(); @@ -293,8 +321,13 @@ const DatePicker = ({ {browsingDate ? ( <> - {month}{" "} - {browsingDate.format("YYYY")} + + {month} + {" "} + + {browsingDate.format("YYYY")} + ) : ( @@ -304,9 +337,10 @@ const DatePicker = ({
{weekdayNames(locale, weekStart, "short").map((weekDay) => ( -
+
{weekDay}
))}
void; }) { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const updateApiKeyMutation = trpc.viewer.apiKeys.edit.useMutation({ onSuccess() { diff --git a/packages/features/ee/api-keys/components/ApiKeyListItem.tsx b/packages/features/ee/api-keys/components/ApiKeyListItem.tsx index 8dc8f01058dd5a..ffa57fd08fea51 100644 --- a/packages/features/ee/api-keys/components/ApiKeyListItem.tsx +++ b/packages/features/ee/api-keys/components/ApiKeyListItem.tsx @@ -26,7 +26,7 @@ const ApiKeyListItem = ({ onEditClick: () => void; }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const isExpired = apiKey?.expiresAt ? apiKey.expiresAt < new Date() : null; const neverExpires = apiKey?.expiresAt === null; diff --git a/packages/features/ee/dsync/components/ConfigureDirectorySync.tsx b/packages/features/ee/dsync/components/ConfigureDirectorySync.tsx index fb96fe19d7c7c8..b6e4bfffea0733 100644 --- a/packages/features/ee/dsync/components/ConfigureDirectorySync.tsx +++ b/packages/features/ee/dsync/components/ConfigureDirectorySync.tsx @@ -21,7 +21,7 @@ import GroupTeamMappingTable from "./GroupTeamMappingTable"; const ConfigureDirectorySync = ({ organizationId }: { organizationId: number | null }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [deleteDirectoryOpen, setDeleteDirectoryOpen] = useState(false); const { data, isLoading, isError, error } = trpc.viewer.dsync.get.useQuery({ organizationId }); diff --git a/packages/features/ee/dsync/components/CreateDirectory.tsx b/packages/features/ee/dsync/components/CreateDirectory.tsx index 557032ea5d491e..7ddce4218ea9e2 100644 --- a/packages/features/ee/dsync/components/CreateDirectory.tsx +++ b/packages/features/ee/dsync/components/CreateDirectory.tsx @@ -23,7 +23,7 @@ const defaultValues = { const CreateDirectory = ({ orgId }: { orgId: number | null }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const form = useForm({ defaultValues }); const [openModal, setOpenModal] = useState(false); diff --git a/packages/features/ee/dsync/components/CreateTeamDialog.tsx b/packages/features/ee/dsync/components/CreateTeamDialog.tsx index def1a02c9a59bf..d90d231886cbbe 100644 --- a/packages/features/ee/dsync/components/CreateTeamDialog.tsx +++ b/packages/features/ee/dsync/components/CreateTeamDialog.tsx @@ -12,7 +12,7 @@ const CreateTeamDialog = (props: CreateTeamDialogProps) => { const { open, onOpenChange } = props; const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); return ( diff --git a/packages/features/ee/dsync/components/GroupNameCell.tsx b/packages/features/ee/dsync/components/GroupNameCell.tsx index 2619350e73fdb8..9953d15dbffab6 100644 --- a/packages/features/ee/dsync/components/GroupNameCell.tsx +++ b/packages/features/ee/dsync/components/GroupNameCell.tsx @@ -15,7 +15,7 @@ const GroupNameCell = ({ groupNames, teamId, directoryId }: GroupNameCellProps) const [showTextInput, setShowTextInput] = useState(false); const [newGroupName, setNewGroupName] = useState(""); const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const createMutation = trpc.viewer.dsync.teamGroupMapping.create.useMutation({ onSuccess: (data) => { diff --git a/packages/features/ee/organizations/pages/components/OtherTeamList.tsx b/packages/features/ee/organizations/pages/components/OtherTeamList.tsx index 4f72b90c24aaf1..56795540370093 100644 --- a/packages/features/ee/organizations/pages/components/OtherTeamList.tsx +++ b/packages/features/ee/organizations/pages/components/OtherTeamList.tsx @@ -13,7 +13,7 @@ interface Props { } export default function OtherTeamList(props: Props) { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [hideDropdown, setHideDropdown] = useState(false); diff --git a/packages/features/ee/organizations/pages/settings/admin/AdminOrgEditPage.tsx b/packages/features/ee/organizations/pages/settings/admin/AdminOrgEditPage.tsx index f5c8f164a30dcf..3a22b2af31a88f 100644 --- a/packages/features/ee/organizations/pages/settings/admin/AdminOrgEditPage.tsx +++ b/packages/features/ee/organizations/pages/settings/admin/AdminOrgEditPage.tsx @@ -55,7 +55,7 @@ const OrgForm = ({ }) => { const { t } = useLocale(); const router = useRouter(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = trpc.viewer.organizations.adminUpdate.useMutation({ onSuccess: async () => { await Promise.all([ diff --git a/packages/features/ee/organizations/pages/settings/admin/AdminOrgPage.tsx b/packages/features/ee/organizations/pages/settings/admin/AdminOrgPage.tsx index 8d332f282d8745..465242618a233b 100644 --- a/packages/features/ee/organizations/pages/settings/admin/AdminOrgPage.tsx +++ b/packages/features/ee/organizations/pages/settings/admin/AdminOrgPage.tsx @@ -24,7 +24,7 @@ const { Body, Cell, ColumnTitle, Header, Row } = Table; function AdminOrgTable() { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [data] = trpc.viewer.organizations.adminGetAll.useSuspenseQuery(); const verifyMutation = trpc.viewer.organizations.adminVerify.useMutation({ onSuccess: async (_data, variables) => { @@ -277,7 +277,7 @@ const DeleteOrgDialog = ({ ); }; -async function invalidateQueries(utils: ReturnType, data: { orgId: number }) { +async function invalidateQueries(utils: ReturnType, data: { orgId: number }) { await utils.viewer.organizations.adminGetAll.invalidate(); await utils.viewer.organizations.adminGet.invalidate({ id: data.orgId, diff --git a/packages/features/ee/organizations/pages/settings/appearance.tsx b/packages/features/ee/organizations/pages/settings/appearance.tsx index 0191972acb7417..2658f2406df26e 100644 --- a/packages/features/ee/organizations/pages/settings/appearance.tsx +++ b/packages/features/ee/organizations/pages/settings/appearance.tsx @@ -32,7 +32,7 @@ const OrgAppearanceView = ({ isAdminOrOwner: boolean; }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const themeForm = useForm<{ theme: string | null | undefined }>({ defaultValues: { diff --git a/packages/features/ee/organizations/pages/settings/other-team-members-view.tsx b/packages/features/ee/organizations/pages/settings/other-team-members-view.tsx index 43f2e076820803..a593ba33d59214 100644 --- a/packages/features/ee/organizations/pages/settings/other-team-members-view.tsx +++ b/packages/features/ee/organizations/pages/settings/other-team-members-view.tsx @@ -13,7 +13,6 @@ import { MembershipRole } from "@calcom/prisma/enums"; import { trpc } from "@calcom/trpc/react"; import type { RouterOutputs } from "@calcom/trpc/react"; import { Meta, showToast, Button } from "@calcom/ui"; -import { Icon } from "@calcom/ui"; import { getLayout } from "../../../../settings/layouts/SettingsLayout"; import MakeTeamPrivateSwitch from "../../../teams/components/MakeTeamPrivateSwitch"; @@ -67,7 +66,7 @@ const MembersView = () => { const params = useParamsWithFallback(); const teamId = Number(params.id); const session = useSession(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); // const [query, setQuery] = useState(""); // const [queryToFetch, setQueryToFetch] = useState(""); const limit = 20; diff --git a/packages/features/ee/organizations/pages/settings/other-team-profile-view.tsx b/packages/features/ee/organizations/pages/settings/other-team-profile-view.tsx index e4d35ef37d005c..1511b95d6062cb 100644 --- a/packages/features/ee/organizations/pages/settings/other-team-profile-view.tsx +++ b/packages/features/ee/organizations/pages/settings/other-team-profile-view.tsx @@ -28,7 +28,6 @@ import { DialogTrigger, Editor, Form, - Icon, ImageUploader, Label, LinkIconButton, @@ -59,7 +58,7 @@ const teamProfileFormSchema = z.object({ const OtherTeamProfileView = () => { const { t } = useLocale(); const router = useRouter(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const session = useSession(); const [firstRender, setFirstRender] = useState(true); @@ -300,9 +299,7 @@ const OtherTeamProfileView = () => {
- - {t("preview")} - + {t("preview")} { - diff --git a/packages/features/ee/organizations/pages/settings/profile.tsx b/packages/features/ee/organizations/pages/settings/profile.tsx index bce21646ac06b2..3e5f2b5b82317d 100644 --- a/packages/features/ee/organizations/pages/settings/profile.tsx +++ b/packages/features/ee/organizations/pages/settings/profile.tsx @@ -22,7 +22,6 @@ import { Button, Editor, Form, - Icon, ImageUploader, Label, LinkIconButton, @@ -163,7 +162,7 @@ const OrgProfileView = () => { }; const OrgProfileForm = ({ defaultValues }: { defaultValues: FormValues }) => { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const { t } = useLocale(); const [firstRender, setFirstRender] = useState(true); diff --git a/packages/features/ee/sso/components/ConnectionInfo.tsx b/packages/features/ee/sso/components/ConnectionInfo.tsx index cab97718331272..7b250546e9cba6 100644 --- a/packages/features/ee/sso/components/ConnectionInfo.tsx +++ b/packages/features/ee/sso/components/ConnectionInfo.tsx @@ -21,7 +21,7 @@ export default function ConnectionInfo({ connection: SSOConnection; }) { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const connectionType = connection.type.toUpperCase(); diff --git a/packages/features/ee/sso/components/OIDCConnection.tsx b/packages/features/ee/sso/components/OIDCConnection.tsx index daef6902a77ba2..98b03b8c542cab 100644 --- a/packages/features/ee/sso/components/OIDCConnection.tsx +++ b/packages/features/ee/sso/components/OIDCConnection.tsx @@ -54,7 +54,7 @@ const CreateConnectionDialog = ({ setOpenModal: (open: boolean) => void; }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const form = useForm(); const mutation = trpc.viewer.saml.updateOIDC.useMutation({ diff --git a/packages/features/ee/sso/components/SAMLConnection.tsx b/packages/features/ee/sso/components/SAMLConnection.tsx index a7d05f0b657149..946f3a862a77cc 100644 --- a/packages/features/ee/sso/components/SAMLConnection.tsx +++ b/packages/features/ee/sso/components/SAMLConnection.tsx @@ -52,7 +52,7 @@ const CreateConnectionDialog = ({ setOpenModal: (open: boolean) => void; }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const form = useForm(); const mutation = trpc.viewer.saml.update.useMutation({ diff --git a/packages/features/ee/teams/components/AddNewTeamMembers.tsx b/packages/features/ee/teams/components/AddNewTeamMembers.tsx index 7b7eac226e6eff..e3508b3feed43e 100644 --- a/packages/features/ee/teams/components/AddNewTeamMembers.tsx +++ b/packages/features/ee/teams/components/AddNewTeamMembers.tsx @@ -16,7 +16,6 @@ import { trpc } from "@calcom/trpc/react"; import { Badge, Button, - Icon, showToast, SkeletonButton, SkeletonContainer, @@ -72,7 +71,7 @@ export const AddNewTeamMembersForm = ({ const { t, i18n } = useLocale(); const router = useRouter(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const orgBranding = useOrgBranding(); const showDialog = searchParams?.get("inviteModal") === "true"; @@ -235,7 +234,7 @@ const AddNewTeamMemberSkeleton = () => { const PendingMemberItem = (props: { member: TeamMember; index: number; teamId: number; isOrg?: boolean }) => { const { member, index, teamId } = props; const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const session = useSession(); const bookerUrl = member.bookerUrl; const { data: currentOrg } = trpc.viewer.organizations.listCurrent.useQuery(undefined, { diff --git a/packages/features/ee/teams/components/DisableTeamImpersonation.tsx b/packages/features/ee/teams/components/DisableTeamImpersonation.tsx index 3549612074857c..0503f1710b5574 100644 --- a/packages/features/ee/teams/components/DisableTeamImpersonation.tsx +++ b/packages/features/ee/teams/components/DisableTeamImpersonation.tsx @@ -15,7 +15,7 @@ const DisableTeamImpersonation = ({ }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const query = trpc.viewer.teams.getMembershipbyUser.useQuery({ teamId, memberId }); diff --git a/packages/features/ee/teams/components/GoogleWorkspaceInviteButton.tsx b/packages/features/ee/teams/components/GoogleWorkspaceInviteButton.tsx index 08b3112bd57539..92e6f3468f3e04 100644 --- a/packages/features/ee/teams/components/GoogleWorkspaceInviteButton.tsx +++ b/packages/features/ee/teams/components/GoogleWorkspaceInviteButton.tsx @@ -35,7 +35,7 @@ export function GoogleWorkspaceInviteButton( props: PropsWithChildren<{ onSuccess: (data: string[]) => void }> ) { const featureFlags = useFlagMap(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const { t } = useLocale(); const params = useParamsWithFallback(); const teamId = Number(params.id); diff --git a/packages/features/ee/teams/components/InviteLinkSettingsModal.tsx b/packages/features/ee/teams/components/InviteLinkSettingsModal.tsx index 3ca0b361d1e3f3..13aa1752551ec4 100644 --- a/packages/features/ee/teams/components/InviteLinkSettingsModal.tsx +++ b/packages/features/ee/teams/components/InviteLinkSettingsModal.tsx @@ -19,7 +19,7 @@ export interface LinkSettingsForm { export default function InviteLinkSettingsModal(props: InvitationLinkSettingsModalProps) { const { t } = useLocale(); - const trpcContext = trpc.useContext(); + const trpcContext = trpc.useUtils(); const deleteInviteMutation = trpc.viewer.teams.deleteInvite.useMutation({ onSuccess: () => { diff --git a/packages/features/ee/teams/components/MakeTeamPrivateSwitch.tsx b/packages/features/ee/teams/components/MakeTeamPrivateSwitch.tsx index c04d0a728dbb30..d8633902b76795 100644 --- a/packages/features/ee/teams/components/MakeTeamPrivateSwitch.tsx +++ b/packages/features/ee/teams/components/MakeTeamPrivateSwitch.tsx @@ -17,7 +17,7 @@ const MakeTeamPrivateSwitch = ({ }) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = trpc.viewer.teams.update.useMutation({ onError: (err) => { diff --git a/packages/features/ee/teams/components/MemberChangeRoleModal.tsx b/packages/features/ee/teams/components/MemberChangeRoleModal.tsx index 4c04a58b0df89f..dbe062d510ffe7 100644 --- a/packages/features/ee/teams/components/MemberChangeRoleModal.tsx +++ b/packages/features/ee/teams/components/MemberChangeRoleModal.tsx @@ -45,7 +45,7 @@ export default function MemberChangeRoleModal(props: { } ); const [errorMessage, setErrorMessage] = useState(""); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const changeRoleMutation = trpc.viewer.teams.changeMemberRole.useMutation({ async onSuccess() { diff --git a/packages/features/ee/teams/components/MemberInvitationModal.tsx b/packages/features/ee/teams/components/MemberInvitationModal.tsx index 01cc22fc4115a3..6c5391298b915e 100644 --- a/packages/features/ee/teams/components/MemberInvitationModal.tsx +++ b/packages/features/ee/teams/components/MemberInvitationModal.tsx @@ -69,7 +69,7 @@ function toggleElementInArray(value: string[] | string | undefined, element: str export default function MemberInvitationModal(props: MemberInvitationModalProps) { const { t } = useLocale(); const { disableCopyLink = false, isOrg = false } = props; - const trpcContext = trpc.useContext(); + const trpcContext = trpc.useUtils(); const session = useSession(); const { data: currentOrg } = trpc.viewer.organizations.listCurrent.useQuery(undefined, { enabled: !!session.data?.user?.org, diff --git a/packages/features/ee/teams/components/MemberListItem.tsx b/packages/features/ee/teams/components/MemberListItem.tsx index 1d56be5890801c..cdb1081e2f0789 100644 --- a/packages/features/ee/teams/components/MemberListItem.tsx +++ b/packages/features/ee/teams/components/MemberListItem.tsx @@ -50,7 +50,7 @@ const checkIsOrg = (team: Props["team"]) => { export default function MemberListItem(props: Props) { const { t, i18n } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [showChangeMemberRoleModal, setShowChangeMemberRoleModal] = useState(false); const [showTeamAvailabilityModal, setShowTeamAvailabilityModal] = useState(false); const [showImpersonateModal, setShowImpersonateModal] = useState(false); diff --git a/packages/features/ee/teams/components/TeamAvailabilityModal.tsx b/packages/features/ee/teams/components/TeamAvailabilityModal.tsx index 7aa3c0ddefe62b..989d3833cd3af0 100644 --- a/packages/features/ee/teams/components/TeamAvailabilityModal.tsx +++ b/packages/features/ee/teams/components/TeamAvailabilityModal.tsx @@ -17,7 +17,7 @@ interface Props { } export default function TeamAvailabilityModal(props: Props) { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [selectedDate, setSelectedDate] = useState(dayjs()); const [selectedTimeZone, setSelectedTimeZone] = useState( localStorage.getItem("timeOption.preferredTimeZone") || dayjs.tz.guess() || "Europe/London" diff --git a/packages/features/ee/teams/components/TeamInviteList.tsx b/packages/features/ee/teams/components/TeamInviteList.tsx index 04976aff55a09c..fe3bfaa87c74e2 100644 --- a/packages/features/ee/teams/components/TeamInviteList.tsx +++ b/packages/features/ee/teams/components/TeamInviteList.tsx @@ -20,7 +20,7 @@ interface Props { } export default function TeamInviteList(props: Props) { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [hideDropdown, setHideDropdown] = useState(false); diff --git a/packages/features/ee/teams/components/TeamInviteListItem.tsx b/packages/features/ee/teams/components/TeamInviteListItem.tsx index bbc41dd212984f..de7c1d9f0ae52a 100644 --- a/packages/features/ee/teams/components/TeamInviteListItem.tsx +++ b/packages/features/ee/teams/components/TeamInviteListItem.tsx @@ -33,7 +33,7 @@ interface Props { export default function TeamInviteListItem(props: Props) { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const team = props.team; const acceptOrLeaveMutation = trpc.viewer.teams.acceptOrLeave.useMutation({ diff --git a/packages/features/ee/teams/components/TeamListItem.tsx b/packages/features/ee/teams/components/TeamListItem.tsx index f697eb1454a002..91ceaf7c1b4aba 100644 --- a/packages/features/ee/teams/components/TeamListItem.tsx +++ b/packages/features/ee/teams/components/TeamListItem.tsx @@ -44,7 +44,7 @@ interface Props { export default function TeamListItem(props: Props) { const searchParams = useCompatSearchParams(); const { t, i18n } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const user = trpc.viewer.me.useQuery().data; const team = props.team; diff --git a/packages/features/ee/teams/components/TeamsListing.tsx b/packages/features/ee/teams/components/TeamsListing.tsx index d9efa111fbd62a..a46680bf8e37b8 100644 --- a/packages/features/ee/teams/components/TeamsListing.tsx +++ b/packages/features/ee/teams/components/TeamsListing.tsx @@ -15,7 +15,7 @@ export function TeamsListing() { const searchParams = useCompatSearchParams(); const token = searchParams?.get("token"); const { t } = useLocale(); - const trpcContext = trpc.useContext(); + const trpcContext = trpc.useUtils(); const router = useRouter(); const [inviteTokenChecked, setInviteTokenChecked] = useState(false); diff --git a/packages/features/ee/teams/pages/team-appearance-view.tsx b/packages/features/ee/teams/pages/team-appearance-view.tsx index 4cc29f366d1360..01bf90efbd35c1 100644 --- a/packages/features/ee/teams/pages/team-appearance-view.tsx +++ b/packages/features/ee/teams/pages/team-appearance-view.tsx @@ -28,7 +28,7 @@ type ProfileViewProps = { team: RouterOutputs["viewer"]["teams"]["get"] }; const ProfileView = ({ team }: ProfileViewProps) => { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [hideBrandingValue, setHideBrandingValue] = useState(team?.hideBranding ?? false); const [hideBookATeamMember, setHideBookATeamMember] = useState(team?.hideBookATeamMember ?? false); diff --git a/packages/features/ee/teams/pages/team-members-view.tsx b/packages/features/ee/teams/pages/team-members-view.tsx index d534118eb2f9cb..f314d0e3570aa2 100644 --- a/packages/features/ee/teams/pages/team-members-view.tsx +++ b/packages/features/ee/teams/pages/team-members-view.tsx @@ -11,7 +11,6 @@ import { MembershipRole } from "@calcom/prisma/enums"; import type { RouterOutputs } from "@calcom/trpc/react"; import { trpc } from "@calcom/trpc/react"; import { Button, Meta, showToast, TextField } from "@calcom/ui"; -import { Icon } from "@calcom/ui"; import { getLayout } from "../../../settings/layouts/SettingsLayout"; import DisableTeamImpersonation from "../components/DisableTeamImpersonation"; @@ -82,7 +81,7 @@ const MembersView = () => { const router = useRouter(); const session = useSession(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const params = useParamsWithFallback(); const teamId = Number(params.id); diff --git a/packages/features/ee/teams/pages/team-profile-view.tsx b/packages/features/ee/teams/pages/team-profile-view.tsx index 2d31cf874e3953..78f9331c5313e0 100644 --- a/packages/features/ee/teams/pages/team-profile-view.tsx +++ b/packages/features/ee/teams/pages/team-profile-view.tsx @@ -86,7 +86,7 @@ const ProfileView = () => { const teamId = Number(params.id); const { t } = useLocale(); const router = useRouter(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const session = useSession(); useLayoutEffect(() => { @@ -249,7 +249,7 @@ const ProfileView = () => { export type TeamProfileFormProps = { team: RouterOutputs["viewer"]["teams"]["get"] }; const TeamProfileForm = ({ team }: TeamProfileFormProps) => { - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const { t } = useLocale(); const router = useRouter(); diff --git a/packages/features/ee/users/components/UsersTable.tsx b/packages/features/ee/users/components/UsersTable.tsx index 6a6234d60de2ca..fc8bc52545fb0e 100644 --- a/packages/features/ee/users/components/UsersTable.tsx +++ b/packages/features/ee/users/components/UsersTable.tsx @@ -32,7 +32,7 @@ const FETCH_LIMIT = 25; function UsersTableBare() { const { t } = useLocale(); const tableContainerRef = useRef(null); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [searchTerm, setSearchTerm] = useState(""); const [showImpersonateModal, setShowImpersonateModal] = useState(false); const [selectedUser, setSelectedUser] = useState(null); diff --git a/packages/features/ee/users/pages/users-add-view.tsx b/packages/features/ee/users/pages/users-add-view.tsx index 44f3d8d1d0793f..9ebc493b05aca4 100644 --- a/packages/features/ee/users/pages/users-add-view.tsx +++ b/packages/features/ee/users/pages/users-add-view.tsx @@ -14,7 +14,7 @@ import { userBodySchema } from "../schemas/userBodySchema"; const UsersAddView = () => { const pathname = usePathname(); const router = useRouter(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = trpc.viewer.users.add.useMutation({ onSuccess: async () => { showToast("User added successfully", "success"); diff --git a/packages/features/ee/users/pages/users-edit-view.tsx b/packages/features/ee/users/pages/users-edit-view.tsx index c4d6169f537fca..00ed0d7b92d7d1 100644 --- a/packages/features/ee/users/pages/users-edit-view.tsx +++ b/packages/features/ee/users/pages/users-edit-view.tsx @@ -30,7 +30,7 @@ const UsersEditView = ({ userId }: { userId: number }) => { const router = useRouter(); const [data] = trpc.viewer.users.get.useSuspenseQuery({ userId }); const { user } = data; - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const mutation = trpc.viewer.users.update.useMutation({ onSuccess: async () => { Promise.all([utils.viewer.users.list.invalidate(), utils.viewer.users.get.invalidate()]); diff --git a/packages/features/ee/workflows/components/DeleteDialog.tsx b/packages/features/ee/workflows/components/DeleteDialog.tsx index 4f888ab1f6202c..7e6b68506c3c0a 100644 --- a/packages/features/ee/workflows/components/DeleteDialog.tsx +++ b/packages/features/ee/workflows/components/DeleteDialog.tsx @@ -15,7 +15,7 @@ interface IDeleteDialog { export const DeleteDialog = (props: IDeleteDialog) => { const { t } = useLocale(); const { isOpenDialog, setIsOpenDialog, workflowId, additionalFunction } = props; - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const deleteMutation = trpc.viewer.workflows.delete.useMutation({ onSuccess: async () => { diff --git a/packages/features/ee/workflows/components/EventWorkflowsTab.tsx b/packages/features/ee/workflows/components/EventWorkflowsTab.tsx index 6a955a16efb837..c6437251711b14 100644 --- a/packages/features/ee/workflows/components/EventWorkflowsTab.tsx +++ b/packages/features/ee/workflows/components/EventWorkflowsTab.tsx @@ -43,7 +43,7 @@ const WorkflowListItem = (props: ItemProps) => { ); const isActive = activeEventTypeIds.includes(eventType.id); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const activateEventTypeMutation = trpc.viewer.workflows.activateEventType.useMutation({ onSuccess: async () => { diff --git a/packages/features/ee/workflows/components/WorkflowListPage.tsx b/packages/features/ee/workflows/components/WorkflowListPage.tsx index 5f67d3e3434f0f..925f1a179aabc6 100644 --- a/packages/features/ee/workflows/components/WorkflowListPage.tsx +++ b/packages/features/ee/workflows/components/WorkflowListPage.tsx @@ -52,7 +52,7 @@ interface Props { } export default function WorkflowListPage({ workflows }: Props) { const { t } = useLocale(); - const utils = trpc.useContext(); + const utils = trpc.useUtils(); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [workflowToDeleteId, setwWorkflowToDeleteId] = useState(0); const [parent] = useAutoAnimate(); @@ -252,12 +252,7 @@ export default function WorkflowListPage({ workflows }: Props) {
- } @@ -213,6 +215,7 @@ const SmallScreenSideBar = ({ open, children }: { open: boolean; children: JSX.E export function AvailabilitySettings({ schedule, + travelSchedules, handleDelete, isDeleting, isLoading, @@ -324,11 +327,7 @@ export function AvailabilitySettings({ openSidebar ? "translate-x-0 opacity-100" : "translate-x-full opacity-0" )}>
-