|
| 1 | +/** |
| 2 | + * A person appearing on an episode. Multi-guest bookings store these in |
| 3 | + * `booking.guests[]`; older single-guest bookings keep one guest in the |
| 4 | + * top-level `guestName` / `guestEmail` / `signature*` fields, which |
| 5 | + * `resolvePortalGuests` maps to a single entry with `_key: "primary"`. |
| 6 | + */ |
| 7 | +export interface PortalGuest { |
| 8 | + _key: string; |
| 9 | + name: string; |
| 10 | + email: string; |
| 11 | + guestSlug?: string; |
| 12 | + guestDocId?: string; |
| 13 | + signatureMode?: string; |
| 14 | + signatureData?: string; |
| 15 | + signedAt?: string; |
| 16 | +} |
| 17 | + |
| 18 | +export const PRIMARY_GUEST_KEY = "primary"; |
| 19 | + |
| 20 | +export function hasGuestList( |
| 21 | + booking: Record<string, any> | null | undefined, |
| 22 | +): boolean { |
| 23 | + return Array.isArray(booking?.guests) && booking.guests.length > 0; |
| 24 | +} |
| 25 | + |
| 26 | +export function resolvePortalGuests( |
| 27 | + booking: Record<string, any> | null | undefined, |
| 28 | + lead?: Record<string, any> | null, |
| 29 | +): PortalGuest[] { |
| 30 | + if (hasGuestList(booking)) { |
| 31 | + return (booking?.guests as Array<Record<string, any>>) |
| 32 | + .filter((g) => g?._key && g?.email) |
| 33 | + .map((g) => ({ |
| 34 | + _key: g._key, |
| 35 | + name: g.name || g.email, |
| 36 | + email: String(g.email).trim().toLowerCase(), |
| 37 | + guestSlug: g.guestSlug, |
| 38 | + guestDocId: g.guestDocId, |
| 39 | + signatureMode: g.signatureMode, |
| 40 | + signatureData: g.signatureData, |
| 41 | + signedAt: g.signedAt, |
| 42 | + })); |
| 43 | + } |
| 44 | + |
| 45 | + const email = (booking?.guestEmail || lead?.contactEmail || "") |
| 46 | + .trim() |
| 47 | + .toLowerCase(); |
| 48 | + const name = booking?.guestName || lead?.contactName || ""; |
| 49 | + if (!email && !name) { |
| 50 | + return []; |
| 51 | + } |
| 52 | + return [ |
| 53 | + { |
| 54 | + _key: PRIMARY_GUEST_KEY, |
| 55 | + name: name || email, |
| 56 | + email, |
| 57 | + guestSlug: booking?.guestSlug || lead?.guestSlug, |
| 58 | + guestDocId: booking?.guestDocId || lead?.guestDocId, |
| 59 | + signatureMode: booking?.signatureMode, |
| 60 | + signatureData: booking?.signatureData, |
| 61 | + signedAt: booking?.signedAt, |
| 62 | + }, |
| 63 | + ]; |
| 64 | +} |
| 65 | + |
| 66 | +export function findGuestByEmail( |
| 67 | + guests: PortalGuest[], |
| 68 | + email?: string | null, |
| 69 | +): PortalGuest | undefined { |
| 70 | + const clean = (email || "").trim().toLowerCase(); |
| 71 | + if (!clean) { |
| 72 | + return undefined; |
| 73 | + } |
| 74 | + return guests.find((g) => g.email === clean); |
| 75 | +} |
0 commit comments