80 lines
2.4 KiB
TypeScript
80 lines
2.4 KiB
TypeScript
import type { getEventTypeResponse } from "@calcom/features/bookings/lib/handleNewBooking/getEventTypesFromDB";
|
|
import type { IsFixedAwareUser } from "@calcom/features/bookings/lib/handleNewBooking/types";
|
|
import { getTranslation } from "@calcom/i18n/server";
|
|
|
|
import type { BookingSelectResult } from "./bookingSelect";
|
|
|
|
type Attendee = {
|
|
name: string;
|
|
id: number;
|
|
email: string;
|
|
timeZone: string;
|
|
locale: string | null;
|
|
bookingId: number | null;
|
|
phoneNumber: string | null;
|
|
noShow: boolean | null;
|
|
};
|
|
|
|
// TODO: We have far too many different types here. They're all users or hosts at the end of the day.
|
|
type OrganizerType =
|
|
| getEventTypeResponse["hosts"][number]["user"]
|
|
| IsFixedAwareUser
|
|
| {
|
|
id: number;
|
|
email: string;
|
|
name: string | null;
|
|
locale: string | null;
|
|
timeZone: string;
|
|
username: string | null;
|
|
};
|
|
|
|
export async function getTeamMembers({
|
|
eventTypeHosts,
|
|
attendees,
|
|
organizer,
|
|
previousHost,
|
|
reassignedHost,
|
|
}: {
|
|
eventTypeHosts: getEventTypeResponse["hosts"];
|
|
attendees: Attendee[];
|
|
organizer: OrganizerType;
|
|
previousHost: BookingSelectResult["user"] | getEventTypeResponse["hosts"][number]["user"] | null;
|
|
reassignedHost: getEventTypeResponse["hosts"][number]["user"];
|
|
}) {
|
|
const teamMemberPromises = eventTypeHosts
|
|
.filter((host) => {
|
|
const user = host.user;
|
|
return (
|
|
user.email !== previousHost?.email &&
|
|
user.email !== organizer.email &&
|
|
attendees.some((attendee) => attendee.email === user.email)
|
|
);
|
|
})
|
|
.map(async (host) => {
|
|
const user = host.user;
|
|
const tTeamMember = await getTranslation(user.locale ?? "en", "common");
|
|
return {
|
|
id: user.id,
|
|
email: user.email,
|
|
name: user.name || "",
|
|
timeZone: user.timeZone,
|
|
language: { translate: tTeamMember, locale: user.locale ?? "en" },
|
|
};
|
|
});
|
|
|
|
const teamMembers = await Promise.all(teamMemberPromises);
|
|
|
|
if (reassignedHost.email !== organizer.email) {
|
|
const tReassignedHost = await getTranslation(reassignedHost.locale ?? "en", "common");
|
|
teamMembers.push({
|
|
id: reassignedHost.id,
|
|
email: reassignedHost.email,
|
|
name: reassignedHost.name || "",
|
|
timeZone: reassignedHost.timeZone,
|
|
language: { translate: tReassignedHost, locale: reassignedHost.locale ?? "en" },
|
|
});
|
|
}
|
|
|
|
return teamMembers;
|
|
}
|