calcom/packages/lib/defaultEvents.ts
Leo Giovanetti 1a79e0624c
Recurring Events ()
* Init dev

* UI changes for recurring event + prisma

* Revisiting schema + changes WIP

* UI done, BE WIP

* Feature completion

* Unused query param removed

* Invalid comment removed

* Removed unused translation

* Update apps/web/public/static/locales/en/common.json

Thanks!

Co-authored-by: Peer Richelsen <peeroke@gmail.com>

* Success page changes

* More progress

* Email text tweaks + test + seed

* Tweaking emails + Cal Apps support WIP

* No app integration for now
Final email and pages tweaks to avoid recurring info showed

* Missing comment for clarity

* Yet again, comment

* Last minute fix

* Missing tooltip for upcoming bookings

* Fixing seed

* Fixing import

* Increasing timeout for e2e

* Fixing any

* Apply suggestions from code review

Co-authored-by: Omar López <zomars@me.com>

* Update apps/web/pages/d/[link]/book.tsx

Co-authored-by: Omar López <zomars@me.com>

* Code improvements

* More code improvements

* Reverting back number input arrows

* Update BookingPage.tsx

* Update BookingPage.tsx

* Adds fallback for sendOrganizerPaymentRefundFailedEmail

* Type overkill

* Type fixes

* Type fixes

* Nitpicks

* Update success.tsx

* Update success.tsx

* Update success.tsx

* Fixing types

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
Co-authored-by: Omar López <zomars@me.com>
2022-05-05 18:16:25 -03:00

168 lines
4.1 KiB
TypeScript

import { PeriodType, SchedulingType, UserPlan, EventTypeCustomInput } from "@prisma/client";
const availability = [
{
days: [1, 2, 3, 4, 5],
startTime: new Date().getTime(),
endTime: new Date().getTime(),
date: new Date(),
scheduleId: null,
},
];
type UsernameSlugLinkProps = {
users: {
id?: number;
username: string | null;
email?: string;
name?: string | null;
bio?: string | null;
avatar?: string | null;
theme?: string | null;
plan?: UserPlan;
away?: boolean;
verified?: boolean | null;
allowDynamicBooking?: boolean | null;
}[];
slug: string;
};
const customInputs: EventTypeCustomInput[] = [];
const commons = {
periodCountCalendarDays: true,
periodStartDate: null,
periodEndDate: null,
beforeEventBuffer: 0,
afterEventBuffer: 0,
periodType: PeriodType.UNLIMITED,
periodDays: null,
slotInterval: null,
locations: [{ type: "integrations:daily" }],
customInputs,
disableGuests: true,
minimumBookingNotice: 120,
schedule: null,
timeZone: null,
successRedirectUrl: "",
availability: [],
price: 0,
currency: "usd",
schedulingType: SchedulingType.COLLECTIVE,
id: 0,
metadata: {
smartContractAddress: "",
},
isWeb3Active: false,
hideCalendarNotes: false,
recurringEvent: {},
destinationCalendar: null,
team: null,
requiresConfirmation: false,
hidden: false,
userId: 0,
users: [
{
id: 0,
plan: UserPlan.PRO,
email: "jdoe@example.com",
name: "John Doe",
username: "jdoe",
avatar: "",
hideBranding: true,
timeZone: "",
destinationCalendar: null,
credentials: [],
bufferTime: 0,
locale: "en",
theme: null,
brandColor: "#292929",
darkBrandColor: "#fafafa",
},
],
};
const min15Event = {
length: 15,
slug: "15",
title: "15min",
eventName: "Dynamic Collective 15min Event",
description: "Dynamic Collective 15min Event",
...commons,
};
const min30Event = {
length: 30,
slug: "30",
title: "30min",
eventName: "Dynamic Collective 30min Event",
description: "Dynamic Collective 30min Event",
...commons,
};
const min60Event = {
length: 60,
slug: "60",
title: "60min",
eventName: "Dynamic Collective 60min Event",
description: "Dynamic Collective 60min Event",
...commons,
};
const defaultEvents = [min15Event, min30Event, min60Event];
export const getDynamicEventDescription = (dynamicUsernames: string[], slug: string): string => {
return `Book a ${slug} min event with ${dynamicUsernames.join(", ")}`;
};
export const getDynamicEventName = (dynamicNames: string[], slug: string): string => {
const lastUser = dynamicNames.pop();
return `Dynamic Collective ${slug} min event with ${dynamicNames.join(", ")} & ${lastUser}`;
};
export const getDefaultEvent = (slug: string) => {
const event = defaultEvents.find((obj) => {
return obj.slug === slug;
});
return event || min15Event;
};
export const getGroupName = (usernameList: string[]): string => {
return usernameList.join(", ");
};
export const getUsernameSlugLink = ({ users, slug }: UsernameSlugLinkProps): string => {
let slugLink = ``;
if (users.length > 1) {
const combinedUsername = users.map((user) => user.username).join("+");
slugLink = `/${combinedUsername}/${slug}`;
} else {
slugLink = `/${users[0].username}/${slug}`;
}
return slugLink;
};
export const getUsernameList = (users: string | string[] | undefined): string[] => {
if (!users) {
return [];
}
if (!(users instanceof Array)) {
users = [users];
}
const allUsers: string[] = [];
// Multiple users can come in case of a team round-robin booking and in that case dynamic link won't be a user.
// So, even though this code handles even if individual user is dynamic link, that isn't a possibility right now.
users.forEach((user) => {
allUsers.push(
...user
?.toLowerCase()
.replace(/ /g, "+")
.replace(/%20/g, "+")
.split("+")
.filter((el) => {
return el.length != 0;
})
);
});
return allUsers;
};
export default defaultEvents;