@deallony/shared 1.2.80 → 1.2.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/cjs/constants/events/EventBirthday.d.ts +2 -0
  2. package/dist/cjs/constants/events/EventBirthday.js +12 -0
  3. package/dist/cjs/constants/events/EventCustomization.d.ts +21 -0
  4. package/dist/cjs/constants/events/EventCustomization.js +23 -2
  5. package/dist/cjs/constants/events/EventDressCode.d.ts +65 -0
  6. package/dist/cjs/constants/events/EventDressCode.js +56 -0
  7. package/dist/cjs/constants/events/EventGuests.d.ts +3 -0
  8. package/dist/cjs/constants/events/EventGuests.js +6 -0
  9. package/dist/cjs/constants/events/EventHost.d.ts +79 -0
  10. package/dist/cjs/constants/events/EventHost.js +155 -0
  11. package/dist/cjs/constants/events/EventOccasion.d.ts +63 -0
  12. package/dist/cjs/constants/events/EventOccasion.js +242 -0
  13. package/dist/cjs/constants/events/EventPreview.d.ts +3 -0
  14. package/dist/cjs/constants/events/EventPreview.js +9 -1
  15. package/dist/cjs/constants/events/EventTemplate.d.ts +518 -10
  16. package/dist/cjs/constants/events/EventTemplate.js +81 -11
  17. package/dist/cjs/constants/events/EventTextPolicy.d.ts +7 -0
  18. package/dist/cjs/constants/events/EventTextPolicy.js +66 -0
  19. package/dist/cjs/constants/events/EventType.d.ts +273 -8
  20. package/dist/cjs/constants/events/EventType.js +38 -2
  21. package/dist/cjs/constants/events/EventVisibility.d.ts +19 -0
  22. package/dist/cjs/constants/events/EventVisibility.js +18 -0
  23. package/dist/cjs/constants/events/EventWedding.js +3 -0
  24. package/dist/cjs/constants/events/EventWeddingReligion.d.ts +72 -0
  25. package/dist/cjs/constants/events/EventWeddingReligion.js +126 -0
  26. package/dist/cjs/constants/events/index.d.ts +8 -0
  27. package/dist/cjs/constants/events/index.js +8 -0
  28. package/dist/cjs/constants/routes/app.d.ts +49 -0
  29. package/dist/cjs/constants/routes/app.js +16 -0
  30. package/dist/cjs/dto/events/EventBirthday.dto.d.ts +3 -0
  31. package/dist/cjs/dto/events/EventBirthday.dto.js +2 -0
  32. package/dist/cjs/dto/events/EventHost.dto.d.ts +7 -0
  33. package/dist/cjs/dto/events/EventHost.dto.js +2 -0
  34. package/dist/cjs/dto/events/EventOccasion.dto.d.ts +3 -0
  35. package/dist/cjs/dto/events/EventOccasion.dto.js +2 -0
  36. package/dist/cjs/dto/events/index.d.ts +3 -0
  37. package/dist/cjs/dto/events/index.js +3 -0
  38. package/dist/cjs/schema/communication/ai-conversation.schema.d.ts +55 -3
  39. package/dist/cjs/schema/communication/ai-conversation.schema.js +28 -3
  40. package/dist/cjs/schema/communication/offer.schema.d.ts +3 -3
  41. package/dist/cjs/schema/communication/support-ticket.schema.d.ts +136 -0
  42. package/dist/cjs/schema/communication/support-ticket.schema.js +47 -2
  43. package/dist/cjs/schema/events/Event.schema.d.ts +326 -0
  44. package/dist/cjs/schema/events/Event.schema.js +55 -1
  45. package/dist/cjs/schema/events/EventBirthday.schema.d.ts +19 -0
  46. package/dist/cjs/schema/events/EventBirthday.schema.js +17 -0
  47. package/dist/cjs/schema/events/EventHost.schema.d.ts +36 -0
  48. package/dist/cjs/schema/events/EventHost.schema.js +44 -0
  49. package/dist/cjs/schema/events/EventOccasion.schema.d.ts +22 -0
  50. package/dist/cjs/schema/events/EventOccasion.schema.js +31 -0
  51. package/dist/cjs/schema/events/EventRsvp.schema.d.ts +4 -0
  52. package/dist/cjs/schema/events/EventRsvp.schema.js +1 -0
  53. package/dist/cjs/schema/events/EventTimeline.schema.d.ts +5 -0
  54. package/dist/cjs/schema/events/EventTimeline.schema.js +14 -1
  55. package/dist/cjs/schema/events/EventWedding.schema.d.ts +32 -0
  56. package/dist/cjs/schema/events/EventWedding.schema.js +11 -0
  57. package/dist/cjs/schema/events/index.d.ts +3 -0
  58. package/dist/cjs/schema/events/index.js +3 -0
  59. package/dist/cjs/types/communication/Notification.d.ts +21 -2
  60. package/dist/cjs/types/communication/Notification.js +17 -0
  61. package/dist/cjs/types/events/Event.d.ts +38 -1
  62. package/dist/cjs/types/events/EventBirthday.d.ts +17 -0
  63. package/dist/cjs/types/events/EventBirthday.js +2 -0
  64. package/dist/cjs/types/events/EventCustomization.d.ts +4 -0
  65. package/dist/cjs/types/events/EventDressCode.d.ts +13 -0
  66. package/dist/cjs/types/events/EventDressCode.js +2 -0
  67. package/dist/cjs/types/events/EventHost.d.ts +29 -0
  68. package/dist/cjs/types/events/EventHost.js +2 -0
  69. package/dist/cjs/types/events/EventOccasion.d.ts +24 -0
  70. package/dist/cjs/types/events/EventOccasion.js +2 -0
  71. package/dist/cjs/types/events/EventRsvp.d.ts +2 -0
  72. package/dist/cjs/types/events/EventTimeline.d.ts +2 -0
  73. package/dist/cjs/types/events/EventWedding.d.ts +7 -0
  74. package/dist/cjs/types/events/index.d.ts +4 -0
  75. package/dist/cjs/types/events/index.js +4 -0
  76. package/dist/cjs/types/index.d.ts +4 -0
  77. package/dist/cjs/types/index.js +6 -2
  78. package/dist/cjs/types/user/SavedSearch.d.ts +38 -0
  79. package/dist/cjs/types/user/SavedSearch.js +11 -0
  80. package/dist/esm/constants/events/EventBirthday.js +9 -0
  81. package/dist/esm/constants/events/EventCustomization.js +21 -1
  82. package/dist/esm/constants/events/EventDressCode.js +49 -0
  83. package/dist/esm/constants/events/EventGuests.js +3 -0
  84. package/dist/esm/constants/events/EventHost.js +147 -0
  85. package/dist/esm/constants/events/EventOccasion.js +235 -0
  86. package/dist/esm/constants/events/EventPreview.js +7 -0
  87. package/dist/esm/constants/events/EventTemplate.js +78 -10
  88. package/dist/esm/constants/events/EventTextPolicy.js +61 -0
  89. package/dist/esm/constants/events/EventType.js +34 -1
  90. package/dist/esm/constants/events/EventVisibility.js +15 -0
  91. package/dist/esm/constants/events/EventWedding.js +3 -0
  92. package/dist/esm/constants/events/EventWeddingReligion.js +118 -0
  93. package/dist/esm/constants/events/index.js +8 -0
  94. package/dist/esm/constants/routes/app.js +16 -0
  95. package/dist/esm/dto/events/EventBirthday.dto.js +1 -0
  96. package/dist/esm/dto/events/EventHost.dto.js +1 -0
  97. package/dist/esm/dto/events/EventOccasion.dto.js +1 -0
  98. package/dist/esm/dto/events/index.js +3 -0
  99. package/dist/esm/schema/communication/ai-conversation.schema.js +27 -2
  100. package/dist/esm/schema/communication/support-ticket.schema.js +46 -1
  101. package/dist/esm/schema/events/Event.schema.js +55 -1
  102. package/dist/esm/schema/events/EventBirthday.schema.js +14 -0
  103. package/dist/esm/schema/events/EventHost.schema.js +41 -0
  104. package/dist/esm/schema/events/EventOccasion.schema.js +28 -0
  105. package/dist/esm/schema/events/EventRsvp.schema.js +1 -0
  106. package/dist/esm/schema/events/EventTimeline.schema.js +14 -1
  107. package/dist/esm/schema/events/EventWedding.schema.js +11 -0
  108. package/dist/esm/schema/events/index.js +3 -0
  109. package/dist/esm/types/communication/Notification.js +17 -0
  110. package/dist/esm/types/events/EventBirthday.js +1 -0
  111. package/dist/esm/types/events/EventDressCode.js +1 -0
  112. package/dist/esm/types/events/EventHost.js +1 -0
  113. package/dist/esm/types/events/EventOccasion.js +1 -0
  114. package/dist/esm/types/events/index.js +4 -0
  115. package/dist/esm/types/index.js +4 -0
  116. package/dist/esm/types/user/SavedSearch.js +8 -0
  117. package/package.json +1 -1
@@ -2,6 +2,8 @@ import type { IEvent } from './Event';
2
2
  export type ITimelinePayload = {
3
3
  title: string;
4
4
  start_time: string;
5
+ /** Optional place of this item (e.g. the marriage ceremony), shown with a map search link */
6
+ place?: string | null;
5
7
  };
6
8
  export type IEventTimeline = {
7
9
  id?: number;
@@ -1,3 +1,4 @@
1
+ import type { EventWeddingReligion } from '../../constants/events/EventWeddingReligion';
1
2
  import { IFile } from '../media';
2
3
  import type { IEvent } from './Event';
3
4
  export type IEventWedding = {
@@ -10,5 +11,11 @@ export type IEventWedding = {
10
11
  last_groom_name: string | null;
11
12
  bride_phone: string | null;
12
13
  groom_phone: string | null;
14
+ /** EventWeddingReligion value; missing = muslim */
15
+ religion?: EventWeddingReligion | null;
16
+ /** EventWeddingVerses value; missing = the style's first verse */
17
+ verse_key?: string | null;
18
+ /** Hand-written couple's words when verse_key is "custom" (general style) */
19
+ custom_verse?: string | null;
13
20
  event?: IEvent;
14
21
  };
@@ -2,4 +2,8 @@ export * from './Event';
2
2
  export * from './EventRsvp';
3
3
  export * from './EventTimeline';
4
4
  export * from './EventWedding';
5
+ export * from './EventBirthday';
6
+ export * from './EventOccasion';
5
7
  export * from './EventCustomization';
8
+ export * from "./EventDressCode";
9
+ export * from './EventHost';
@@ -18,4 +18,8 @@ __exportStar(require("./Event"), exports);
18
18
  __exportStar(require("./EventRsvp"), exports);
19
19
  __exportStar(require("./EventTimeline"), exports);
20
20
  __exportStar(require("./EventWedding"), exports);
21
+ __exportStar(require("./EventBirthday"), exports);
22
+ __exportStar(require("./EventOccasion"), exports);
21
23
  __exportStar(require("./EventCustomization"), exports);
24
+ __exportStar(require("./EventDressCode"), exports);
25
+ __exportStar(require("./EventHost"), exports);
@@ -42,12 +42,16 @@ export * as Event from './events/Event';
42
42
  export * as EventRsvp from './events/EventRsvp';
43
43
  export * as EventTimeline from './events/EventTimeline';
44
44
  export * as EventWedding from './events/EventWedding';
45
+ export * as EventBirthday from './events/EventBirthday';
46
+ export * as EventOccasion from './events/EventOccasion';
45
47
  export * as EventVenue from './events/EventVenue';
48
+ export * as EventHost from './events/EventHost';
46
49
  export * as User from "./user/User";
47
50
  export * as Role from "./user/Role";
48
51
  export * as Permission from "./user/Permission";
49
52
  export * as Wallet from "./user/Wallet";
50
53
  export * as Favorite from "./user/Favorite";
54
+ export * as SavedSearch from "./user/SavedSearch";
51
55
  export * as Loyalty from "./user/Loyalty";
52
56
  export * as PotentialUser from "./user/PotentialUser";
53
57
  export * as Company from './company/Company';
@@ -36,8 +36,8 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  };
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.Favorite = exports.Wallet = exports.Permission = exports.Role = exports.User = exports.EventVenue = exports.EventWedding = exports.EventTimeline = exports.EventRsvp = exports.Event = exports.District = exports.City = exports.AdminBoundary = exports.WorkType = exports.UsedProductCondition = exports.UsedProductAge = exports.Unit = exports.Transmission = exports.RegionalSpec = exports.PublisherType = exports.PropertyStatus = exports.PriceType = exports.OfferType = exports.LicenseType = exports.FuelType = exports.Feature = exports.Facility = exports.Currency = exports.Color = exports.CategoryWorkType = exports.Category = exports.CarBody = exports.UsedProduct = exports.Service = exports.PropertySubType = exports.Property = exports.MotorTrim = exports.Motor = exports.AdPromotion = exports.Addresses = exports.AdDailyViews = exports.AdLocation = exports.Ad = exports.FilterParams = exports.ModuleFetchEndpoints = exports.Config = exports.AccessType = exports.Status = exports.Response = exports.LocalizedName = void 0;
40
- exports.Payment = exports.Analysis = exports.GeminiApiKey = exports.Google = exports.Kyc = exports.SocialMediaProfile = exports.SocialMediaPlatform = exports.Image = exports.Media = exports.File = exports.Notification = exports.NotificationToken = exports.MessageTemplate = exports.Device = exports.Chat = exports.AppStartScreen = exports.MetaData = exports.Company = exports.PotentialUser = exports.Loyalty = void 0;
39
+ exports.Role = exports.User = exports.EventHost = exports.EventVenue = exports.EventOccasion = exports.EventBirthday = exports.EventWedding = exports.EventTimeline = exports.EventRsvp = exports.Event = exports.District = exports.City = exports.AdminBoundary = exports.WorkType = exports.UsedProductCondition = exports.UsedProductAge = exports.Unit = exports.Transmission = exports.RegionalSpec = exports.PublisherType = exports.PropertyStatus = exports.PriceType = exports.OfferType = exports.LicenseType = exports.FuelType = exports.Feature = exports.Facility = exports.Currency = exports.Color = exports.CategoryWorkType = exports.Category = exports.CarBody = exports.UsedProduct = exports.Service = exports.PropertySubType = exports.Property = exports.MotorTrim = exports.Motor = exports.AdPromotion = exports.Addresses = exports.AdDailyViews = exports.AdLocation = exports.Ad = exports.FilterParams = exports.ModuleFetchEndpoints = exports.Config = exports.AccessType = exports.Status = exports.Response = exports.LocalizedName = void 0;
40
+ exports.Payment = exports.Analysis = exports.GeminiApiKey = exports.Google = exports.Kyc = exports.SocialMediaProfile = exports.SocialMediaPlatform = exports.Image = exports.Media = exports.File = exports.Notification = exports.NotificationToken = exports.MessageTemplate = exports.Device = exports.Chat = exports.AppStartScreen = exports.MetaData = exports.Company = exports.PotentialUser = exports.Loyalty = exports.SavedSearch = exports.Favorite = exports.Wallet = exports.Permission = void 0;
41
41
  // common
42
42
  exports.LocalizedName = __importStar(require("./common/LocalizedName"));
43
43
  exports.Response = __importStar(require("./common/Response"));
@@ -87,13 +87,17 @@ exports.Event = __importStar(require("./events/Event"));
87
87
  exports.EventRsvp = __importStar(require("./events/EventRsvp"));
88
88
  exports.EventTimeline = __importStar(require("./events/EventTimeline"));
89
89
  exports.EventWedding = __importStar(require("./events/EventWedding"));
90
+ exports.EventBirthday = __importStar(require("./events/EventBirthday"));
91
+ exports.EventOccasion = __importStar(require("./events/EventOccasion"));
90
92
  exports.EventVenue = __importStar(require("./events/EventVenue"));
93
+ exports.EventHost = __importStar(require("./events/EventHost"));
91
94
  // user
92
95
  exports.User = __importStar(require("./user/User"));
93
96
  exports.Role = __importStar(require("./user/Role"));
94
97
  exports.Permission = __importStar(require("./user/Permission"));
95
98
  exports.Wallet = __importStar(require("./user/Wallet"));
96
99
  exports.Favorite = __importStar(require("./user/Favorite"));
100
+ exports.SavedSearch = __importStar(require("./user/SavedSearch"));
97
101
  exports.Loyalty = __importStar(require("./user/Loyalty"));
98
102
  exports.PotentialUser = __importStar(require("./user/PotentialUser"));
99
103
  exports.Company = __importStar(require("./company/Company"));
@@ -0,0 +1,38 @@
1
+ import { GetAdsFilterDto, SubjectTable } from "../ad/Ad";
2
+ /** How often a saved search alerts: as new ads come in, or one summary each morning */
3
+ export declare enum SavedSearchFrequency {
4
+ INSTANT = "instant",
5
+ DAILY = "daily"
6
+ }
7
+ /** Most saved searches one user can keep */
8
+ export declare const SAVED_SEARCH_LIMIT = 20;
9
+ /** The filter as the ads list uses it, without paging or sorting */
10
+ export type SavedSearchFilter = Omit<GetAdsFilterDto, "page" | "limit" | "sort_by" | "sort_order">;
11
+ /** A user's saved ad search ("بحثي المحفوظ"). New matching ads are announced as SAVED_SEARCH notifications. */
12
+ export type ISavedSearch = {
13
+ id: number;
14
+ user_id: number;
15
+ name: string;
16
+ subject_type: SubjectTable;
17
+ filter: SavedSearchFilter;
18
+ /** Alerts for new matching ads */
19
+ notify: boolean;
20
+ frequency: SavedSearchFrequency;
21
+ /** When the user last opened its results; ads newer than this are "new" */
22
+ last_opened_at: Date | string | null;
23
+ created_at: Date | string;
24
+ updated_at?: Date | string;
25
+ /** Sent with the list: matching ads posted since last_opened_at (at most 99) */
26
+ new_count?: number;
27
+ /** Sent with the list: ids of those new ads, newest first (at most 20) */
28
+ new_ad_ids?: number[];
29
+ };
30
+ export type CreateSavedSearchDto = {
31
+ name: string;
32
+ filter: SavedSearchFilter & {
33
+ subject_type: SubjectTable;
34
+ };
35
+ notify?: boolean;
36
+ frequency?: SavedSearchFrequency;
37
+ };
38
+ export type UpdateSavedSearchDto = Partial<CreateSavedSearchDto>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SAVED_SEARCH_LIMIT = exports.SavedSearchFrequency = void 0;
4
+ /** How often a saved search alerts: as new ads come in, or one summary each morning */
5
+ var SavedSearchFrequency;
6
+ (function (SavedSearchFrequency) {
7
+ SavedSearchFrequency["INSTANT"] = "instant";
8
+ SavedSearchFrequency["DAILY"] = "daily";
9
+ })(SavedSearchFrequency || (exports.SavedSearchFrequency = SavedSearchFrequency = {}));
10
+ /** Most saved searches one user can keep */
11
+ exports.SAVED_SEARCH_LIMIT = 20;
@@ -0,0 +1,9 @@
1
+ export const emptyEventBirthday = {
2
+ id: 0,
3
+ event_id: 0,
4
+ cover: null,
5
+ celebrant_name: null,
6
+ age: null,
7
+ host_name: null,
8
+ phone: null,
9
+ };
@@ -17,7 +17,9 @@ export const EventCustomizationFonts = [
17
17
  ];
18
18
  /** Music the owner can pick; add a track here once its file is on the event site under /music */
19
19
  export const EventCustomizationTracks = [
20
- { value: "wedding-theme", name: { en: "Wedding theme", ar: "لحن الزفاف" }, src: "/music/wedding-theme.mp3" },
20
+ { value: "wedding-theme", name: { en: "Wedding theme", ar: "لحن الزفاف" }, src: "/music/wedding-theme.mp3", event_types: ["wedding", "engagement", "marriage", "proposal", "valentine"] },
21
+ { value: "birthday-theme", name: { en: "Happy birthday", ar: "لحن عيد الميلاد" }, src: "/music/birthday-theme.mp3", event_types: ["birthday"] },
22
+ { value: "celebration-theme", name: { en: "Celebration", ar: "لحن الاحتفال" }, src: "/music/celebration-theme.mp3", event_types: ["bachelor", "newborn", "gender_reveal", "circumcision", "graduation", "hajj", "mothers_day", "valentine", "opening", "general", "proposal", "engagement", "marriage"] },
21
23
  ];
22
24
  export const EventCustomizationSection = {
23
25
  COUNTDOWN: "countdown",
@@ -26,6 +28,7 @@ export const EventCustomizationSection = {
26
28
  GALLERY: "gallery",
27
29
  RSVP: "rsvp",
28
30
  MUSIC: "music",
31
+ DRESS_CODE: "dress_code",
29
32
  };
30
33
  export const EventCustomizationSectionOptions = [
31
34
  { value: "countdown", name: { en: "Countdown", ar: "العد التنازلي" } },
@@ -34,12 +37,29 @@ export const EventCustomizationSectionOptions = [
34
37
  { value: "gallery", name: { en: "Photos", ar: "الصور" } },
35
38
  { value: "rsvp", name: { en: "RSVP", ar: "تأكيد الحضور" } },
36
39
  { value: "music", name: { en: "Music", ar: "الموسيقى" } },
40
+ { value: "dress_code", name: { en: "Dress code", ar: "اللباس المطلوب" } },
37
41
  ];
38
42
  export const EVENT_CUSTOMIZATION_TEXT_MAX = 160;
43
+ /** How the invitation opens for a guest; no value keeps the template's own opening */
44
+ export const EventCustomizationOpening = {
45
+ NONE: "none",
46
+ ENVELOPE: "envelope",
47
+ CURTAIN: "curtain",
48
+ CARD: "card",
49
+ };
50
+ export const EventCustomizationOpeningOptions = [
51
+ { value: "none", name: { en: "None", ar: "بدون" } },
52
+ { value: "envelope", name: { en: "Envelope", ar: "ظرف" } },
53
+ { value: "curtain", name: { en: "Curtain", ar: "ستارة" } },
54
+ { value: "card", name: { en: "Card", ar: "بطاقة" } },
55
+ ];
39
56
  export const EventCustomizationPaletteValues = EventCustomizationPalettes.map((p) => p.value);
40
57
  export const EventCustomizationFontValues = EventCustomizationFonts.map((f) => f.value);
41
58
  export const EventCustomizationTrackValues = EventCustomizationTracks.map((t) => t.value);
42
59
  export const EventCustomizationSectionValues = EventCustomizationSectionOptions.map((s) => s.value);
60
+ export const EventCustomizationOpeningValues = EventCustomizationOpeningOptions.map((o) => o.value);
43
61
  export const findEventCustomizationPalette = (value) => { var _a; return (_a = EventCustomizationPalettes.find((p) => p.value === value)) !== null && _a !== void 0 ? _a : null; };
44
62
  export const findEventCustomizationFont = (value) => { var _a; return (_a = EventCustomizationFonts.find((f) => f.value === value)) !== null && _a !== void 0 ? _a : null; };
63
+ /** Tracks offered for an event type; events without a type are weddings */
64
+ export const eventCustomizationTracksFor = (eventType) => EventCustomizationTracks.filter((t) => t.event_types.includes(eventType || "wedding"));
45
65
  export const findEventCustomizationTrack = (value) => { var _a; return (_a = EventCustomizationTracks.find((t) => t.value === value)) !== null && _a !== void 0 ? _a : null; };
@@ -0,0 +1,49 @@
1
+ /** Optional dress code an event owner can show on the invitation (all event types) */
2
+ export const EventDressCodeStyleValues = ["formal", "evening", "semi_formal", "smart_casual", "traditional", "custom"];
3
+ export const EventDressCodeStyleOptions = [
4
+ { value: "formal", name: { en: "Formal", ar: "رسمي" } },
5
+ { value: "evening", name: { en: "Evening wear", ar: "سهرة" } },
6
+ { value: "semi_formal", name: { en: "Semi-formal", ar: "شبه رسمي" } },
7
+ { value: "smart_casual", name: { en: "Smart casual", ar: "كاجوال أنيق" } },
8
+ { value: "traditional", name: { en: "Traditional", ar: "تقليدي" } },
9
+ { value: "custom", name: { en: "Custom text", ar: "نص خاص" } },
10
+ ];
11
+ /** wear = colours guests are asked to wear, avoid = colours guests should not wear */
12
+ export const EventDressCodeColorModeValues = ["wear", "avoid"];
13
+ export const EventDressCodeColorModeNames = {
14
+ wear: { en: "Colours to wear", ar: "ألوان مرغوبة" },
15
+ avoid: { en: "Colours to avoid", ar: "ألوان يجب تجنبها" },
16
+ };
17
+ /** Heading shown on the invitation above the colour dots */
18
+ export const EventDressCodeColorModeTitles = {
19
+ wear: { en: "Suggested colours", ar: "ألوان مقترحة" },
20
+ avoid: { en: "Please avoid", ar: "نرجو تجنّب" },
21
+ };
22
+ export const EventDressCodeColors = [
23
+ { value: "white", hex: "#FFFFFF", name: { en: "White", ar: "أبيض" } },
24
+ { value: "black", hex: "#000000", name: { en: "Black", ar: "أسود" } },
25
+ { value: "gold", hex: "#D4AF37", name: { en: "Gold", ar: "ذهبي" } },
26
+ { value: "beige", hex: "#C9C0B3", name: { en: "Beige", ar: "بيج" } },
27
+ { value: "navy", hex: "#1F3A5F", name: { en: "Navy", ar: "كحلي" } },
28
+ { value: "burgundy", hex: "#7A1F2B", name: { en: "Burgundy", ar: "عنابي" } },
29
+ { value: "sage", hex: "#B7C9A8", name: { en: "Light green", ar: "أخضر فاتح" } },
30
+ { value: "pink", hex: "#E8B4BC", name: { en: "Pink", ar: "وردي" } },
31
+ { value: "grey", hex: "#9AA5B1", name: { en: "Grey", ar: "رمادي" } },
32
+ ];
33
+ export const EventDressCodeColorValues = EventDressCodeColors.map((c) => c.value);
34
+ /** @deprecated colours are no longer limited; kept for older imports */
35
+ export const EVENT_DRESS_CODE_MAX_COLORS = 9;
36
+ export const EVENT_DRESS_CODE_NOTE_MAX = 120;
37
+ export const findEventDressCodeStyle = (value) => { var _a; return (_a = EventDressCodeStyleOptions.find((s) => s.value === value)) !== null && _a !== void 0 ? _a : null; };
38
+ export const findEventDressCodeColor = (value) => { var _a; return (_a = EventDressCodeColors.find((c) => c.value === value)) !== null && _a !== void 0 ? _a : null; };
39
+ /** True when the owner filled at least one part of the dress code */
40
+ export const hasEventDressCode = (dc) => { var _a, _b, _c; return !!dc && (!!dc.style || !!((_a = dc.colors) === null || _a === void 0 ? void 0 : _a.length) || !!((_b = dc.avoid_colors) === null || _b === void 0 ? void 0 : _b.length) || !!((_c = dc.note) === null || _c === void 0 ? void 0 : _c.trim())); };
41
+ /** Wanted and avoided colours, reading old saves where color_mode "avoid" marked `colors` */
42
+ export const eventDressCodeColorLists = (dc) => {
43
+ var _a, _b, _c;
44
+ const legacyAvoid = (dc === null || dc === void 0 ? void 0 : dc.color_mode) === "avoid";
45
+ return {
46
+ wear: legacyAvoid ? [] : ((_a = dc === null || dc === void 0 ? void 0 : dc.colors) !== null && _a !== void 0 ? _a : []),
47
+ avoid: [...(legacyAvoid ? ((_b = dc === null || dc === void 0 ? void 0 : dc.colors) !== null && _b !== void 0 ? _b : []) : []), ...((_c = dc === null || dc === void 0 ? void 0 : dc.avoid_colors) !== null && _c !== void 0 ? _c : [])],
48
+ };
49
+ };
@@ -0,0 +1,3 @@
1
+ /** Limits of the expected guest count asked when creating an event */
2
+ export const EVENT_EXPECTED_GUESTS_MIN = 1;
3
+ export const EVENT_EXPECTED_GUESTS_MAX = 100000;
@@ -0,0 +1,147 @@
1
+ /** organiser: full control like the owner; guests: the event's guests only */
2
+ export const EventHostRoleValues = ["organiser", "guests"];
3
+ export const EventHostRole = {
4
+ ORGANISER: "organiser",
5
+ GUESTS: "guests",
6
+ };
7
+ export const EventHostRoleNames = {
8
+ organiser: { ar: "منظم", en: "Organiser" },
9
+ guests: { ar: "إدارة المدعوين", en: "Manages guests" },
10
+ };
11
+ export const EventHostRoleHints = {
12
+ organiser: { ar: "يدير المناسبة كاملة", en: "Manages the whole event" },
13
+ guests: { ar: "يدير المدعوين ويرسل الدعوات ويتابع الردود", en: "Manages guests, sends invitations and follows replies" },
14
+ };
15
+ export const EventHostRoleOptions = EventHostRoleValues.map((value) => ({
16
+ value,
17
+ name: EventHostRoleNames[value],
18
+ hint: EventHostRoleHints[value],
19
+ }));
20
+ /** pending: waiting for the person to sign in and accept; active: accepted */
21
+ export const EventHostStatusValues = ["pending", "active", "declined", "left", "removed"];
22
+ export const EventHostStatus = {
23
+ PENDING: "pending",
24
+ ACTIVE: "active",
25
+ DECLINED: "declined",
26
+ LEFT: "left",
27
+ REMOVED: "removed",
28
+ };
29
+ export const EventHostStatusNames = {
30
+ pending: { ar: "بانتظار القبول", en: "Waiting to accept" },
31
+ active: { ar: "انضم", en: "Joined" },
32
+ declined: { ar: "رفض", en: "Declined" },
33
+ left: { ar: "غادر", en: "Left" },
34
+ removed: { ar: "أزيل", en: "Removed" },
35
+ };
36
+ /** Statuses that still hold the number on the event (one row per number) */
37
+ export const EventHostOpenStatusValues = ["pending", "active"];
38
+ /** What the signed-in user is on an event */
39
+ export const EventAccessRoleValues = ["owner", "organiser", "guests"];
40
+ export const EventPermissionValues = [
41
+ /** See the event (drafts included) and its invitation link */
42
+ "event.view",
43
+ /** Details, names, date, timeline, dress code, design, photos, visibility, preview */
44
+ "event.edit",
45
+ /** Publish (pay), unpublish */
46
+ "event.publish",
47
+ "event.delete",
48
+ /** Guests: add, edit, remove, send links, read status, replies, check-in, guest reports */
49
+ "guests.manage",
50
+ /** Add/remove people of the event and change their role */
51
+ "hosts.manage",
52
+ ];
53
+ export const EventRolePermissions = {
54
+ owner: EventPermissionValues,
55
+ organiser: EventPermissionValues,
56
+ guests: ["event.view", "guests.manage"],
57
+ };
58
+ export const hasEventPermission = (role, permission) => !!role && EventRolePermissions[role].includes(permission);
59
+ export const EventAccessRoleNames = {
60
+ owner: { ar: "المالك", en: "Owner" },
61
+ organiser: EventHostRoleNames.organiser,
62
+ guests: EventHostRoleNames.guests,
63
+ };
64
+ const slot = (key, ar, en, role, extra = {}) => ({ key, label: { ar, en }, role, ...extra });
65
+ const organiser = (ar = "المنظم", en = "Organiser") => slot("organiser", ar, en, "organiser", { mirrors: "occasion.phone" });
66
+ const weddingPeople = [
67
+ slot("bride", "العروس", "Bride", "guests", { mirrors: "wedding.bride_phone" }),
68
+ slot("groom", "العريس", "Groom", "guests", { mirrors: "wedding.groom_phone" }),
69
+ slot("organiser", "المنظم", "Organiser", "organiser"),
70
+ ];
71
+ /**
72
+ * Suggested people of each event type. The person the event is for manages guests;
73
+ * whoever organises or invites gets full control. Anyone else is added by hand.
74
+ */
75
+ export const EventPeopleSlots = {
76
+ wedding: weddingPeople,
77
+ engagement: weddingPeople,
78
+ marriage: weddingPeople,
79
+ proposal: [
80
+ slot("proposer", "من سيطلب", "Who is proposing", "organiser"),
81
+ slot("partner", "الشريك", "Partner", "guests", { surprise_when_details_surprise: true }),
82
+ organiser(),
83
+ ],
84
+ bachelor: [slot("celebrant", "العروس أو العريس", "Bride or groom", "guests"), organiser()],
85
+ birthday: [slot("celebrant", "صاحب عيد الميلاد", "Birthday person", "guests"), organiser("من يدعو", "Who is inviting")],
86
+ newborn: [slot("mother", "الأم", "Mother", "organiser", { mirrors: "occasion.phone" }), slot("father", "الأب", "Father", "organiser")],
87
+ gender_reveal: [slot("mother", "الأم", "Mother", "organiser", { mirrors: "occasion.phone" }), slot("father", "الأب", "Father", "organiser")],
88
+ circumcision: [slot("mother", "الأم", "Mother", "organiser", { mirrors: "occasion.phone" }), slot("father", "الأب", "Father", "organiser")],
89
+ graduation: [slot("graduate", "الخريج", "Graduate", "guests"), organiser("من يدعو", "Who is inviting")],
90
+ hajj: [
91
+ slot("pilgrim", "الحاج أو الحاجة", "Pilgrim", "guests"),
92
+ slot("pilgrim2", "الحاج الثاني", "Second pilgrim", "guests"),
93
+ organiser("من يدعو", "Who is inviting"),
94
+ ],
95
+ mothers_day: [slot("mother", "الأم", "Mother", "guests"), organiser("من يدعو", "Who is inviting")],
96
+ valentine: [
97
+ slot("first", "الشخص الأول", "First person", "guests"),
98
+ slot("second", "الشخص الثاني", "Second person", "guests"),
99
+ organiser("من يدعو", "Who is inviting"),
100
+ ],
101
+ opening: [slot("shop_owner", "صاحب المحل", "Business owner", "organiser", { mirrors: "occasion.phone" })],
102
+ general: [organiser()],
103
+ };
104
+ const DEFAULT_PEOPLE = [organiser()];
105
+ /** Suggested people of a type (a type without its own list gets the organiser only) */
106
+ export const findEventPeopleSlots = (eventType) => (eventType && EventPeopleSlots[eventType]) || DEFAULT_PEOPLE;
107
+ export const findEventPeopleSlot = (eventType, key) => key ? findEventPeopleSlots(eventType).find((s) => s.key === key) : undefined;
108
+ /** Answers to «من أنت في هذه المناسبة؟» besides the type's slots */
109
+ export const EventCreatorRoleExtra = {
110
+ COMPANY: "company",
111
+ OTHER: "other",
112
+ };
113
+ export const EventCreatorRoleExtraNames = {
114
+ company: { ar: "شركة", en: "A company" },
115
+ other: { ar: "شخص آخر", en: "Someone else" },
116
+ };
117
+ /** Label of the person a host row (or the creator) is: slot label, or the free text */
118
+ export const eventPersonLabel = (eventType, slotKey, fallback) => {
119
+ const s = findEventPeopleSlot(eventType, slotKey);
120
+ if (s)
121
+ return s.label;
122
+ if (slotKey === "company" || slotKey === "other")
123
+ return EventCreatorRoleExtraNames[slotKey];
124
+ return fallback ? { ar: fallback, en: fallback } : null;
125
+ };
126
+ export const EVENT_HOST_LABEL_MAX = 60;
127
+ /**
128
+ * One spelling for a phone number so numbers typed differently still match:
129
+ * digits only with a leading +, 00 → +, and no 0 right after a known country code.
130
+ */
131
+ export const normalizeEventPhone = (value) => {
132
+ if (!value)
133
+ return null;
134
+ let digits = String(value).trim().replace(/[^\d+]/g, "");
135
+ if (digits.startsWith("00"))
136
+ digits = "+" + digits.slice(2);
137
+ if (!digits.startsWith("+"))
138
+ digits = "+" + digits.replace(/\+/g, "");
139
+ digits = "+" + digits.slice(1).replace(/\+/g, "");
140
+ for (const code of ["+963", "+971", "+965", "+961", "+90", "+966", "+962", "+974"]) {
141
+ if (digits.startsWith(code + "0")) {
142
+ digits = code + digits.slice(code.length + 1);
143
+ break;
144
+ }
145
+ }
146
+ return digits.length > 4 ? digits : null;
147
+ };