@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.
- package/dist/cjs/constants/events/EventBirthday.d.ts +2 -0
- package/dist/cjs/constants/events/EventBirthday.js +12 -0
- package/dist/cjs/constants/events/EventCustomization.d.ts +21 -0
- package/dist/cjs/constants/events/EventCustomization.js +23 -2
- package/dist/cjs/constants/events/EventDressCode.d.ts +65 -0
- package/dist/cjs/constants/events/EventDressCode.js +56 -0
- package/dist/cjs/constants/events/EventGuests.d.ts +3 -0
- package/dist/cjs/constants/events/EventGuests.js +6 -0
- package/dist/cjs/constants/events/EventHost.d.ts +79 -0
- package/dist/cjs/constants/events/EventHost.js +155 -0
- package/dist/cjs/constants/events/EventOccasion.d.ts +63 -0
- package/dist/cjs/constants/events/EventOccasion.js +242 -0
- package/dist/cjs/constants/events/EventPreview.d.ts +3 -0
- package/dist/cjs/constants/events/EventPreview.js +9 -1
- package/dist/cjs/constants/events/EventTemplate.d.ts +518 -10
- package/dist/cjs/constants/events/EventTemplate.js +81 -11
- package/dist/cjs/constants/events/EventTextPolicy.d.ts +7 -0
- package/dist/cjs/constants/events/EventTextPolicy.js +66 -0
- package/dist/cjs/constants/events/EventType.d.ts +273 -8
- package/dist/cjs/constants/events/EventType.js +38 -2
- package/dist/cjs/constants/events/EventVisibility.d.ts +19 -0
- package/dist/cjs/constants/events/EventVisibility.js +18 -0
- package/dist/cjs/constants/events/EventWedding.js +3 -0
- package/dist/cjs/constants/events/EventWeddingReligion.d.ts +72 -0
- package/dist/cjs/constants/events/EventWeddingReligion.js +126 -0
- package/dist/cjs/constants/events/index.d.ts +8 -0
- package/dist/cjs/constants/events/index.js +8 -0
- package/dist/cjs/constants/routes/app.d.ts +49 -0
- package/dist/cjs/constants/routes/app.js +16 -0
- package/dist/cjs/dto/events/EventBirthday.dto.d.ts +3 -0
- package/dist/cjs/dto/events/EventBirthday.dto.js +2 -0
- package/dist/cjs/dto/events/EventHost.dto.d.ts +7 -0
- package/dist/cjs/dto/events/EventHost.dto.js +2 -0
- package/dist/cjs/dto/events/EventOccasion.dto.d.ts +3 -0
- package/dist/cjs/dto/events/EventOccasion.dto.js +2 -0
- package/dist/cjs/dto/events/index.d.ts +3 -0
- package/dist/cjs/dto/events/index.js +3 -0
- package/dist/cjs/schema/communication/ai-conversation.schema.d.ts +55 -3
- package/dist/cjs/schema/communication/ai-conversation.schema.js +28 -3
- package/dist/cjs/schema/communication/offer.schema.d.ts +3 -3
- package/dist/cjs/schema/communication/support-ticket.schema.d.ts +136 -0
- package/dist/cjs/schema/communication/support-ticket.schema.js +47 -2
- package/dist/cjs/schema/events/Event.schema.d.ts +326 -0
- package/dist/cjs/schema/events/Event.schema.js +55 -1
- package/dist/cjs/schema/events/EventBirthday.schema.d.ts +19 -0
- package/dist/cjs/schema/events/EventBirthday.schema.js +17 -0
- package/dist/cjs/schema/events/EventHost.schema.d.ts +36 -0
- package/dist/cjs/schema/events/EventHost.schema.js +44 -0
- package/dist/cjs/schema/events/EventOccasion.schema.d.ts +22 -0
- package/dist/cjs/schema/events/EventOccasion.schema.js +31 -0
- package/dist/cjs/schema/events/EventRsvp.schema.d.ts +4 -0
- package/dist/cjs/schema/events/EventRsvp.schema.js +1 -0
- package/dist/cjs/schema/events/EventTimeline.schema.d.ts +5 -0
- package/dist/cjs/schema/events/EventTimeline.schema.js +14 -1
- package/dist/cjs/schema/events/EventWedding.schema.d.ts +32 -0
- package/dist/cjs/schema/events/EventWedding.schema.js +11 -0
- package/dist/cjs/schema/events/index.d.ts +3 -0
- package/dist/cjs/schema/events/index.js +3 -0
- package/dist/cjs/types/communication/Notification.d.ts +21 -2
- package/dist/cjs/types/communication/Notification.js +17 -0
- package/dist/cjs/types/events/Event.d.ts +38 -1
- package/dist/cjs/types/events/EventBirthday.d.ts +17 -0
- package/dist/cjs/types/events/EventBirthday.js +2 -0
- package/dist/cjs/types/events/EventCustomization.d.ts +4 -0
- package/dist/cjs/types/events/EventDressCode.d.ts +13 -0
- package/dist/cjs/types/events/EventDressCode.js +2 -0
- package/dist/cjs/types/events/EventHost.d.ts +29 -0
- package/dist/cjs/types/events/EventHost.js +2 -0
- package/dist/cjs/types/events/EventOccasion.d.ts +24 -0
- package/dist/cjs/types/events/EventOccasion.js +2 -0
- package/dist/cjs/types/events/EventRsvp.d.ts +2 -0
- package/dist/cjs/types/events/EventTimeline.d.ts +2 -0
- package/dist/cjs/types/events/EventWedding.d.ts +7 -0
- package/dist/cjs/types/events/index.d.ts +4 -0
- package/dist/cjs/types/events/index.js +4 -0
- package/dist/cjs/types/index.d.ts +4 -0
- package/dist/cjs/types/index.js +6 -2
- package/dist/cjs/types/user/SavedSearch.d.ts +38 -0
- package/dist/cjs/types/user/SavedSearch.js +11 -0
- package/dist/esm/constants/events/EventBirthday.js +9 -0
- package/dist/esm/constants/events/EventCustomization.js +21 -1
- package/dist/esm/constants/events/EventDressCode.js +49 -0
- package/dist/esm/constants/events/EventGuests.js +3 -0
- package/dist/esm/constants/events/EventHost.js +147 -0
- package/dist/esm/constants/events/EventOccasion.js +235 -0
- package/dist/esm/constants/events/EventPreview.js +7 -0
- package/dist/esm/constants/events/EventTemplate.js +78 -10
- package/dist/esm/constants/events/EventTextPolicy.js +61 -0
- package/dist/esm/constants/events/EventType.js +34 -1
- package/dist/esm/constants/events/EventVisibility.js +15 -0
- package/dist/esm/constants/events/EventWedding.js +3 -0
- package/dist/esm/constants/events/EventWeddingReligion.js +118 -0
- package/dist/esm/constants/events/index.js +8 -0
- package/dist/esm/constants/routes/app.js +16 -0
- package/dist/esm/dto/events/EventBirthday.dto.js +1 -0
- package/dist/esm/dto/events/EventHost.dto.js +1 -0
- package/dist/esm/dto/events/EventOccasion.dto.js +1 -0
- package/dist/esm/dto/events/index.js +3 -0
- package/dist/esm/schema/communication/ai-conversation.schema.js +27 -2
- package/dist/esm/schema/communication/support-ticket.schema.js +46 -1
- package/dist/esm/schema/events/Event.schema.js +55 -1
- package/dist/esm/schema/events/EventBirthday.schema.js +14 -0
- package/dist/esm/schema/events/EventHost.schema.js +41 -0
- package/dist/esm/schema/events/EventOccasion.schema.js +28 -0
- package/dist/esm/schema/events/EventRsvp.schema.js +1 -0
- package/dist/esm/schema/events/EventTimeline.schema.js +14 -1
- package/dist/esm/schema/events/EventWedding.schema.js +11 -0
- package/dist/esm/schema/events/index.js +3 -0
- package/dist/esm/types/communication/Notification.js +17 -0
- package/dist/esm/types/events/EventBirthday.js +1 -0
- package/dist/esm/types/events/EventDressCode.js +1 -0
- package/dist/esm/types/events/EventHost.js +1 -0
- package/dist/esm/types/events/EventOccasion.js +1 -0
- package/dist/esm/types/events/index.js +4 -0
- package/dist/esm/types/index.js +4 -0
- package/dist/esm/types/user/SavedSearch.js +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
const host = (ar, en) => ({
|
|
2
|
+
key: "host_name",
|
|
3
|
+
label: { ar, en },
|
|
4
|
+
placeholder: { ar: "«عائلة الأحمد»", en: "e.g. The Ahmad family" },
|
|
5
|
+
});
|
|
6
|
+
export const EVENT_OCCASION_TEXT_MAX = 255;
|
|
7
|
+
export const EVENT_OCCASION_LONG_TEXT_MAX = 500;
|
|
8
|
+
export const EVENT_BIRTHDAY_AGE_LIMIT = 120;
|
|
9
|
+
export const EventOccasionTypeConfigs = {
|
|
10
|
+
birthday: {
|
|
11
|
+
type: "birthday",
|
|
12
|
+
description: { ar: "للأطفال والكبار", en: "For kids and adults" },
|
|
13
|
+
fields: [
|
|
14
|
+
{ key: "primary_name", label: { ar: "اسم صاحب عيد الميلاد", en: "Whose birthday" }, required: true, placeholder: { ar: "«ريم»", en: "e.g. Reem" } },
|
|
15
|
+
{ key: "details.age", label: { ar: "العمر الذي يتمّه", en: "Age they are turning" }, input: "number", min: 1, max: EVENT_BIRTHDAY_AGE_LIMIT },
|
|
16
|
+
host("من يدعو", "Who is inviting"),
|
|
17
|
+
],
|
|
18
|
+
title: { ar: "عيد ميلاد {name}", en: "{name}'s birthday" },
|
|
19
|
+
name_fallback: { ar: "صاحب المناسبة", en: "the birthday star" },
|
|
20
|
+
invite_line: { with_host: { ar: "{host} يدعونكم لحضور عيد ميلاد", en: "{host} invite you to the birthday of" }, without_host: { ar: "أنتم مدعوون لعيد ميلاد", en: "You are invited to the birthday of" } },
|
|
21
|
+
welcome: { ar: "سنة جديدة من الفرح، تعالوا نحتفل معاً بالكعك والبالونات", en: "A new year of joy, come celebrate with us" },
|
|
22
|
+
rsvp: { ar: "أكّد حضورك لنجهّز لك مكاناً وقطعة كعك", en: "Confirm so we save you a seat and a slice of cake" },
|
|
23
|
+
},
|
|
24
|
+
proposal: {
|
|
25
|
+
type: "proposal",
|
|
26
|
+
description: { ar: "لحظة طلب الزواج", en: "The moment of the question" },
|
|
27
|
+
fields: [
|
|
28
|
+
{ key: "primary_name", label: { ar: "اسم من سيطلب", en: "Who is proposing" }, required: true },
|
|
29
|
+
{ key: "secondary_name", label: { ar: "اسم الشريك", en: "Partner's name" } },
|
|
30
|
+
{ key: "details.surprise", label: { ar: "مفاجأة", en: "Surprise" }, input: "choice", hint: { ar: "عند المفاجأة لا يظهر اسم الشريك في الدعوة", en: "A surprise hides the partner's name on the invitation" }, options: [{ value: "yes", label: { ar: "نعم، مفاجأة", en: "Yes, a surprise" } }, { value: "no", label: { ar: "لا", en: "No" } }] },
|
|
31
|
+
host("من ينظّم", "Organiser"),
|
|
32
|
+
],
|
|
33
|
+
title: { ar: "Proposal {name}", en: "{name}'s proposal" },
|
|
34
|
+
name_fallback: { ar: "صاحب المفاجأة", en: "the proposer" },
|
|
35
|
+
invite_line: { with_host: { ar: "{host} يدعونكم ليوم مميز", en: "{host} invite you to a special day" }, without_host: { ar: "ندعوكم لحضور لحظة مميزة", en: "Join us for a special moment" } },
|
|
36
|
+
welcome: { ar: "لحظة «هل تقبلين؟» نريدكم معنا فيها", en: "We want you there for the big question" },
|
|
37
|
+
rsvp: { ar: "أكّد حضورك، ولا تخبر أحداً", en: "Confirm, and keep the secret" },
|
|
38
|
+
},
|
|
39
|
+
bachelor: {
|
|
40
|
+
type: "bachelor",
|
|
41
|
+
description: { ar: "سهرة قبل الزفاف", en: "A night before the wedding" },
|
|
42
|
+
fields: [
|
|
43
|
+
{ key: "primary_name", label: { ar: "اسم العروس أو العريس", en: "Bride or groom" }, required: true },
|
|
44
|
+
{ key: "details.side", label: { ar: "الحفل لـ", en: "Party for" }, input: "choice", options: [{ value: "bride", label: { ar: "العروس", en: "The bride" } }, { value: "groom", label: { ar: "العريس", en: "The groom" } }] },
|
|
45
|
+
host("من ينظّم", "Organiser"),
|
|
46
|
+
{ key: "details.dress_code", label: { ar: "اللباس المطلوب", en: "Dress code" } },
|
|
47
|
+
],
|
|
48
|
+
title: { ar: "توديع عزوبية {name}", en: "{name}'s bachelor party" },
|
|
49
|
+
name_fallback: { ar: "العروس", en: "the bride" },
|
|
50
|
+
invite_line: { with_host: { ar: "{host} يدعونكم لحفل توديع العزوبية", en: "{host} invite you to the bachelor party of" }, without_host: { ar: "أنتم مدعوون لحفل توديع عزوبية", en: "You are invited to the bachelor party of" } },
|
|
51
|
+
welcome: { ar: "آخر سهرة قبل القفص الذهبي، لا تفوّتوها", en: "One last night out before the big day" },
|
|
52
|
+
rsvp: { ar: "أكّد حضورك لنحجز لك مكاناً", en: "Confirm so we save you a spot" },
|
|
53
|
+
},
|
|
54
|
+
newborn: {
|
|
55
|
+
type: "newborn",
|
|
56
|
+
description: { ar: "استقبال المولود الجديد", en: "Welcome the new baby" },
|
|
57
|
+
fields: [
|
|
58
|
+
{ key: "primary_name", label: { ar: "اسم المولود", en: "Baby's name" }, required: true },
|
|
59
|
+
{ key: "details.gender", label: { ar: "المولود", en: "Baby" }, input: "choice", hint: { ar: "يغيّر ألوان الدعوة", en: "Changes the invitation colours" }, options: [{ value: "boy", label: { ar: "ولد", en: "Boy" } }, { value: "girl", label: { ar: "بنت", en: "Girl" } }] },
|
|
60
|
+
{ key: "details.birth_date", label: { ar: "تاريخ الولادة", en: "Birth date" }, input: "date" },
|
|
61
|
+
host("الأهل", "Parents"),
|
|
62
|
+
],
|
|
63
|
+
title: { ar: "مباركة المولود {name}", en: "Welcoming baby {name}" },
|
|
64
|
+
name_fallback: { ar: "المولود", en: "the baby" },
|
|
65
|
+
invite_line: { with_host: { ar: "{host} يدعونكم لمباركة المولود", en: "{host} invite you to welcome" }, without_host: { ar: "أنتم مدعوون لمباركة المولود", en: "You are invited to welcome" } },
|
|
66
|
+
welcome: { ar: "أهلاً بالقمر الصغير، شاركونا الفرحة", en: "Our little one is here, share our joy" },
|
|
67
|
+
rsvp: { ar: "أكّد حضورك لتشاركنا الفرحة", en: "Confirm to share the joy with us" },
|
|
68
|
+
},
|
|
69
|
+
gender_reveal: {
|
|
70
|
+
type: "gender_reveal",
|
|
71
|
+
description: { ar: "ولد أم بنت؟ مع تصويت", en: "Boy or girl? with a guess" },
|
|
72
|
+
fields: [
|
|
73
|
+
{ key: "primary_name", label: { ar: "اسم الأهل", en: "Parents' names" }, required: true, placeholder: { ar: "«أحمد وريم»", en: "e.g. Ahmad & Reem" } },
|
|
74
|
+
{ key: "details.due_date", label: { ar: "موعد الولادة المتوقع", en: "Due date" }, input: "date" },
|
|
75
|
+
{ key: "details.guessing", label: { ar: "تصويت المدعوين", en: "Guests guess" }, input: "choice", hint: { ar: "يختار الضيف ولد أو بنت مع رده", en: "Guests pick boy or girl with their reply" }, options: [{ value: "on", label: { ar: "مفعّل", en: "On" } }, { value: "off", label: { ar: "بدون تصويت", en: "Off" } }] },
|
|
76
|
+
{ key: "details.revealed_gender", label: { ar: "النتيجة (بعد الحفل)", en: "Result (after the party)" }, input: "choice", hint: { ar: "اتركها فارغة حتى الحفل، ثم تظهر في الدعوة", en: "Leave empty until the party, then it shows on the invitation" }, options: [{ value: "boy", label: { ar: "ولد", en: "Boy" } }, { value: "girl", label: { ar: "بنت", en: "Girl" } }] },
|
|
77
|
+
],
|
|
78
|
+
title: { ar: "جنس مولود {name}", en: "{name}'s gender reveal" },
|
|
79
|
+
name_fallback: { ar: "الأهل", en: "the parents" },
|
|
80
|
+
invite_line: { with_host: { ar: "{name} يدعونكم لاكتشاف", en: "{name} invite you to find out" }, without_host: { ar: "{name} يدعونكم لاكتشاف", en: "{name} invite you to find out" } },
|
|
81
|
+
welcome: { ar: "خمّن قبل الحفل، وتعال نعرف معاً", en: "Make your guess, then find out with us" },
|
|
82
|
+
rsvp: { ar: "أكّد حضورك وقل لنا توقعك", en: "Confirm and tell us your guess" },
|
|
83
|
+
},
|
|
84
|
+
circumcision: {
|
|
85
|
+
type: "circumcision",
|
|
86
|
+
description: { ar: "فرحة العائلة بابنها", en: "A family celebration" },
|
|
87
|
+
fields: [
|
|
88
|
+
{ key: "primary_name", label: { ar: "اسم الطفل", en: "Child's name" }, required: true },
|
|
89
|
+
host("الأهل", "Parents"),
|
|
90
|
+
],
|
|
91
|
+
title: { ar: "طهور {name}", en: "{name}'s celebration" },
|
|
92
|
+
name_fallback: { ar: "ابننا", en: "our son" },
|
|
93
|
+
invite_line: { with_host: { ar: "{host} يدعونكم لحفل طهور", en: "{host} invite you to the celebration of" }, without_host: { ar: "أنتم مدعوون لحفل طهور", en: "You are invited to the celebration of" } },
|
|
94
|
+
welcome: { ar: "شاركونا فرحتنا بابننا", en: "Share our joy with our son" },
|
|
95
|
+
rsvp: { ar: "أكّد حضورك لتشاركنا الفرحة", en: "Confirm to share the joy with us" },
|
|
96
|
+
},
|
|
97
|
+
graduation: {
|
|
98
|
+
type: "graduation",
|
|
99
|
+
description: { ar: "جامعة أو مدرسة", en: "University or school" },
|
|
100
|
+
fields: [
|
|
101
|
+
{ key: "primary_name", label: { ar: "اسم الخريج", en: "Graduate's name" }, required: true },
|
|
102
|
+
{ key: "details.institution", label: { ar: "الجامعة أو المدرسة", en: "University or school" } },
|
|
103
|
+
{ key: "details.major", label: { ar: "التخصص", en: "Major" } },
|
|
104
|
+
{ key: "details.class_year", label: { ar: "الدفعة", en: "Class of" }, input: "number", min: 1950, max: 2100, placeholder: { ar: "٢٠٢٦", en: "2026" } },
|
|
105
|
+
host("من يدعو", "Who is inviting"),
|
|
106
|
+
],
|
|
107
|
+
title: { ar: "تخرج {name}", en: "{name}'s graduation" },
|
|
108
|
+
name_fallback: { ar: "الخريج", en: "the graduate" },
|
|
109
|
+
invite_line: { with_host: { ar: "{host} يدعونكم لحفل تخرج", en: "{host} invite you to the graduation of" }, without_host: { ar: "أنتم مدعوون لحفل تخرج", en: "You are invited to the graduation of" } },
|
|
110
|
+
welcome: { ar: "تعب السنين صار فرحة، شاركونا الاحتفال", en: "Years of work, one big celebration" },
|
|
111
|
+
rsvp: { ar: "أكّد حضورك لتشاركنا الفرحة", en: "Confirm to celebrate with us" },
|
|
112
|
+
},
|
|
113
|
+
hajj: {
|
|
114
|
+
type: "hajj",
|
|
115
|
+
description: { ar: "استقبال الحاج بعد عودته", en: "Welcome a pilgrim home" },
|
|
116
|
+
fields: [
|
|
117
|
+
{ key: "primary_name", label: { ar: "اسم الحاج أو الحاجة", en: "Pilgrim's name" }, required: true },
|
|
118
|
+
{ key: "secondary_name", label: { ar: "حاج ثانٍ", en: "Second pilgrim" }, hint: { ar: "إن كانا اثنين", en: "If there are two" } },
|
|
119
|
+
{ key: "details.return_date", label: { ar: "تاريخ العودة", en: "Return date" }, input: "date" },
|
|
120
|
+
host("من يدعو", "Who is inviting"),
|
|
121
|
+
],
|
|
122
|
+
title: { ar: "استقبال الحاج {name}", en: "Welcoming pilgrim {name}" },
|
|
123
|
+
name_fallback: { ar: "الحاج", en: "the pilgrim" },
|
|
124
|
+
invite_line: { with_host: { ar: "{host} يدعونكم لاستقبال", en: "{host} invite you to welcome" }, without_host: { ar: "يسعدنا دعوتكم لاستقبال", en: "Join us in welcoming" } },
|
|
125
|
+
welcome: { ar: "حجاً مبروراً وسعياً مشكوراً وذنباً مغفوراً", en: "May the Hajj be accepted" },
|
|
126
|
+
rsvp: { ar: "أكّد حضورك لنستقبله معاً", en: "Confirm to welcome them with us" },
|
|
127
|
+
},
|
|
128
|
+
mothers_day: {
|
|
129
|
+
type: "mothers_day",
|
|
130
|
+
description: { ar: "تكريم الأم", en: "Celebrate mum" },
|
|
131
|
+
fields: [
|
|
132
|
+
{ key: "primary_name", label: { ar: "اسم الأم", en: "Mother's name" }, hint: { ar: "أو اتركه فارغاً لحفل عام", en: "Or leave empty for a general party" } },
|
|
133
|
+
host("من يدعو", "Who is inviting"),
|
|
134
|
+
{ key: "details.message", label: { ar: "كلمة للأم", en: "A note for mum" }, input: "multiline" },
|
|
135
|
+
],
|
|
136
|
+
title: { ar: "عيد الأم · {name}", en: "Mother's Day · {name}" },
|
|
137
|
+
name_fallback: { ar: "ست الحبايب", en: "Mum" },
|
|
138
|
+
invite_line: { with_host: { ar: "{host} يدعونكم للاحتفال بعيد الأم", en: "{host} invite you to celebrate Mother's Day with" }, without_host: { ar: "ندعوكم للاحتفال بعيد الأم", en: "Celebrate Mother's Day with" } },
|
|
139
|
+
welcome: { ar: "«الجنة تحت أقدام الأمهات»", en: "To the heart of our home" },
|
|
140
|
+
rsvp: { ar: "أكّد حضورك لنحتفل بها معاً", en: "Confirm to celebrate her with us" },
|
|
141
|
+
},
|
|
142
|
+
valentine: {
|
|
143
|
+
type: "valentine",
|
|
144
|
+
description: { ar: "لزوجين أو لسهرة في مكان", en: "For a couple or a venue night" },
|
|
145
|
+
fields: [
|
|
146
|
+
{ key: "primary_name", label: { ar: "الاسم الأول أو عنوان السهرة", en: "First name or party title" }, required: true, placeholder: { ar: "«ليلة ١٤ شباط»", en: "e.g. Valentine's night" } },
|
|
147
|
+
{ key: "secondary_name", label: { ar: "الاسم الثاني", en: "Second name" } },
|
|
148
|
+
host("من يدعو", "Who is inviting"),
|
|
149
|
+
{ key: "details.dress_code", label: { ar: "اللباس المطلوب", en: "Dress code" }, placeholder: { ar: "«أحمر»", en: "e.g. Red" } },
|
|
150
|
+
],
|
|
151
|
+
title: { ar: "عيد الحب · {name}", en: "Valentine's · {name}" },
|
|
152
|
+
name_fallback: { ar: "سهرة عيد الحب", en: "Valentine's night" },
|
|
153
|
+
invite_line: { with_host: { ar: "{host} يدعونكم لسهرة عيد الحب", en: "{host} invite you to a Valentine's night" }, without_host: { ar: "ندعوكم لسهرة عيد الحب", en: "Join us for Valentine's night" } },
|
|
154
|
+
welcome: { ar: "ليلة من الحب والموسيقى", en: "A night of love and music" },
|
|
155
|
+
rsvp: { ar: "أكّد حضورك لنحجز لك مكاناً", en: "Confirm so we save your seat" },
|
|
156
|
+
},
|
|
157
|
+
opening: {
|
|
158
|
+
type: "opening",
|
|
159
|
+
description: { ar: "محل، مطعم أو براند جديد", en: "A new shop, restaurant or brand" },
|
|
160
|
+
fields: [
|
|
161
|
+
{ key: "primary_name", label: { ar: "اسم المحل أو البراند", en: "Shop or brand name" }, required: true },
|
|
162
|
+
{ key: "details.business_type", label: { ar: "نوع النشاط", en: "Business type" }, placeholder: { ar: "«محمصة وقهوة مختصة»", en: "e.g. Coffee roastery" } },
|
|
163
|
+
{ key: "details.offer", label: { ar: "عرض الافتتاح", en: "Opening offer" }, placeholder: { ar: "«خصم ٢٠٪ أول أسبوع»", en: "e.g. 20% off the first week" } },
|
|
164
|
+
host("من يدعو", "Who is inviting"),
|
|
165
|
+
],
|
|
166
|
+
title: { ar: "افتتاح {name}", en: "{name} opening" },
|
|
167
|
+
name_fallback: { ar: "محلنا الجديد", en: "our new place" },
|
|
168
|
+
invite_line: { with_host: { ar: "{host} يتشرفون بدعوتكم لافتتاح", en: "{host} invite you to the opening of" }, without_host: { ar: "يسعدنا دعوتكم لافتتاح", en: "You are invited to the opening of" } },
|
|
169
|
+
welcome: { ar: "كونوا أول من يزورنا", en: "Be among our first guests" },
|
|
170
|
+
rsvp: { ar: "أكّد حضورك لنجهّز لك هدية الافتتاح", en: "Confirm so we prepare your opening gift" },
|
|
171
|
+
default_public: true,
|
|
172
|
+
},
|
|
173
|
+
general: {
|
|
174
|
+
type: "general",
|
|
175
|
+
description: { ar: "أي مناسبة أخرى", en: "Any other occasion" },
|
|
176
|
+
fields: [
|
|
177
|
+
{ key: "primary_name", label: { ar: "عنوان الحفلة", en: "Party title" }, required: true, placeholder: { ar: "«سهرة نهاية الصيف»", en: "e.g. End of summer party" } },
|
|
178
|
+
host("من يدعو", "Who is inviting"),
|
|
179
|
+
{ key: "details.description", label: { ar: "وصف قصير", en: "Short description" }, input: "multiline" },
|
|
180
|
+
{ key: "details.dress_code", label: { ar: "اللباس المطلوب", en: "Dress code" } },
|
|
181
|
+
],
|
|
182
|
+
title: { ar: "{name}", en: "{name}" },
|
|
183
|
+
name_fallback: { ar: "حفلتنا", en: "our party" },
|
|
184
|
+
invite_line: { with_host: { ar: "{host} يدعونكم إلى", en: "{host} invite you to" }, without_host: { ar: "أنتم مدعوون إلى", en: "You are invited to" } },
|
|
185
|
+
welcome: { ar: "نسعد بحضوركم ومشاركتكم", en: "We would love to have you" },
|
|
186
|
+
rsvp: { ar: "أكّد حضورك لنجهّز لك مكاناً", en: "Confirm so we save you a seat" },
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
export const findEventOccasionConfig = (eventType) => (eventType && EventOccasionTypeConfigs[eventType]) || null;
|
|
190
|
+
/** Value of a field (column or details key) */
|
|
191
|
+
export const eventOccasionFieldValue = (occasion, key) => {
|
|
192
|
+
var _a, _b, _c;
|
|
193
|
+
if (!occasion)
|
|
194
|
+
return null;
|
|
195
|
+
if (key.startsWith("details."))
|
|
196
|
+
return (_b = (_a = occasion.details) === null || _a === void 0 ? void 0 : _a[key.slice(8)]) !== null && _b !== void 0 ? _b : null;
|
|
197
|
+
return (_c = occasion[key]) !== null && _c !== void 0 ? _c : null;
|
|
198
|
+
};
|
|
199
|
+
const fill = (text, values) => text.replace(/\{(\w+)\}/g, (_, k) => { var _a; return (_a = values[k]) !== null && _a !== void 0 ? _a : ""; });
|
|
200
|
+
/** «تخرج أحمد», «افتتاح بن الشام» */
|
|
201
|
+
export const eventOccasionTitle = (eventType, occasion, lang = "ar") => {
|
|
202
|
+
var _a;
|
|
203
|
+
const config = findEventOccasionConfig(eventType);
|
|
204
|
+
if (!config)
|
|
205
|
+
return "";
|
|
206
|
+
const name = ((_a = occasion === null || occasion === void 0 ? void 0 : occasion.primary_name) === null || _a === void 0 ? void 0 : _a.trim()) || config.name_fallback[lang];
|
|
207
|
+
return fill(config.title[lang], { name }).trim();
|
|
208
|
+
};
|
|
209
|
+
/** First line of the invitation, e.g. «عائلة أحمد يدعونكم لحفل تخرج» */
|
|
210
|
+
export const eventOccasionInviteLine = (eventType, occasion, lang = "ar") => {
|
|
211
|
+
var _a, _b;
|
|
212
|
+
const config = findEventOccasionConfig(eventType);
|
|
213
|
+
if (!config)
|
|
214
|
+
return "";
|
|
215
|
+
const hostName = (_a = occasion === null || occasion === void 0 ? void 0 : occasion.host_name) === null || _a === void 0 ? void 0 : _a.trim();
|
|
216
|
+
const name = ((_b = occasion === null || occasion === void 0 ? void 0 : occasion.primary_name) === null || _b === void 0 ? void 0 : _b.trim()) || config.name_fallback[lang];
|
|
217
|
+
const line = hostName ? config.invite_line.with_host : config.invite_line.without_host;
|
|
218
|
+
return fill(line[lang], { host: hostName !== null && hostName !== void 0 ? hostName : "", name });
|
|
219
|
+
};
|
|
220
|
+
/** Answer keys a guest can send with an RSVP */
|
|
221
|
+
export const EventRsvpAnswerKeys = {
|
|
222
|
+
/** Gender reveal guess: boy | girl */
|
|
223
|
+
GENDER_GUESS: "gender_guess",
|
|
224
|
+
};
|
|
225
|
+
export const emptyEventOccasion = {
|
|
226
|
+
id: 0,
|
|
227
|
+
event_id: 0,
|
|
228
|
+
primary_name: null,
|
|
229
|
+
secondary_name: null,
|
|
230
|
+
host_name: null,
|
|
231
|
+
phone: null,
|
|
232
|
+
cover: null,
|
|
233
|
+
photos: [],
|
|
234
|
+
details: {},
|
|
235
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EventTemplateOptions } from "./EventTemplate.js";
|
|
1
2
|
/** Messages between the app (WebView / iframe) and the event site's /preview/:token page */
|
|
2
3
|
export const EventPreviewMessageType = {
|
|
3
4
|
SET_TEMPLATE: "deallony:set-template",
|
|
@@ -8,3 +9,9 @@ export const EventPreviewMessageType = {
|
|
|
8
9
|
/** Query parameter that picks the template on the preview page's first paint */
|
|
9
10
|
export const EventPreviewTemplateParam = "template";
|
|
10
11
|
export const DEFAULT_WEDDING_TEMPLATE = "wedding-01";
|
|
12
|
+
export const DEFAULT_BIRTHDAY_TEMPLATE = "birthday-01";
|
|
13
|
+
/** The template a new event of this type starts with */
|
|
14
|
+
export const defaultEventTemplate = (eventType) => {
|
|
15
|
+
var _a, _b;
|
|
16
|
+
return (_b = (_a = EventTemplateOptions.find((t) => !t.hidden && t.event_types.includes(eventType || "wedding"))) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : DEFAULT_WEDDING_TEMPLATE;
|
|
17
|
+
};
|
|
@@ -1,12 +1,80 @@
|
|
|
1
1
|
export const EventTemplate = {
|
|
2
|
-
WEDDING_01: { value: 'wedding-01', name: { en: '
|
|
3
|
-
WEDDING_02: { value: 'wedding-02', name: { en: '
|
|
4
|
-
WEDDING_03: { value: 'wedding-03', name: { en: '
|
|
5
|
-
WEDDING_04: { value: 'wedding-04', name: { en: '
|
|
6
|
-
WEDDING_05: { value: 'wedding-05', name: { en: '
|
|
2
|
+
WEDDING_01: { value: 'wedding-01', name: { en: 'Golden chandelier', ar: 'الثريا الذهبية' }, event_types: ['wedding'] },
|
|
3
|
+
WEDDING_02: { value: 'wedding-02', name: { en: 'Day and night', ar: 'ليل ونهار' }, event_types: ['wedding'] },
|
|
4
|
+
WEDDING_03: { value: 'wedding-03', name: { en: 'Simple classic', ar: 'الكلاسيكي البسيط' }, event_types: ['wedding'] },
|
|
5
|
+
WEDDING_04: { value: 'wedding-04', name: { en: 'Rose petals', ar: 'بتلات الورد' }, event_types: ['wedding'] },
|
|
6
|
+
WEDDING_05: { value: 'wedding-05', name: { en: 'Royal calendar', ar: 'التقويم الملكي' }, event_types: ['wedding'] },
|
|
7
|
+
BIRTHDAY_01: { value: 'birthday-01', name: { en: 'Balloons', ar: 'بالونات' }, event_types: ['birthday'] },
|
|
8
|
+
ENGAGEMENT_01: { value: 'engagement-01', name: { en: 'Ring', ar: 'خاتم' }, event_types: ['engagement'], hidden: true },
|
|
9
|
+
MARRIAGE_01: { value: 'marriage-01', name: { en: 'Covenant', ar: 'ميثاق' }, event_types: ['marriage'], hidden: true },
|
|
10
|
+
PROPOSAL_01: { value: 'proposal-01', name: { en: 'Will you?', ar: 'هل تقبلين؟' }, event_types: ['proposal'], hidden: true },
|
|
11
|
+
BACHELOR_01: { value: 'bachelor-01', name: { en: 'Friends night', ar: 'ليلة الأصدقاء' }, event_types: ['bachelor'], hidden: true },
|
|
12
|
+
NEWBORN_01: { value: 'newborn-01', name: { en: 'Little star', ar: 'نجمة صغيرة' }, event_types: ['newborn'], hidden: true },
|
|
13
|
+
GENDER_REVEAL_01: { value: 'gender-reveal-01', name: { en: 'Boy or girl?', ar: 'ولد أم بنت؟' }, event_types: ['gender_reveal'], hidden: true },
|
|
14
|
+
CIRCUMCISION_01: { value: 'circumcision-01', name: { en: 'Joy', ar: 'فرحة' }, event_types: ['circumcision'], hidden: true },
|
|
15
|
+
GRADUATION_01: { value: 'graduation-01', name: { en: 'Grad cap', ar: 'قبعة التخرج' }, event_types: ['graduation'], hidden: true },
|
|
16
|
+
HAJJ_01: { value: 'hajj-01', name: { en: 'Blessed Hajj', ar: 'حج مبرور' }, event_types: ['hajj'], hidden: true },
|
|
17
|
+
MOTHERS_DAY_01: { value: 'mothers-day-01', name: { en: 'Roses', ar: 'ورد' }, event_types: ['mothers_day'], hidden: true },
|
|
18
|
+
VALENTINE_01: { value: 'valentine-01', name: { en: 'Hearts', ar: 'قلوب' }, event_types: ['valentine'], hidden: true },
|
|
19
|
+
OPENING_01: { value: 'opening-01', name: { en: 'Ribbon cutting', ar: 'قص الشريط' }, event_types: ['opening'], hidden: true },
|
|
20
|
+
GENERAL_01: { value: 'general-01', name: { en: 'Simple', ar: 'بسيط' }, event_types: ['general'], hidden: true },
|
|
21
|
+
// One page each (2026-11): photos = how many pictures the design shows (cover + occasion.photos)
|
|
22
|
+
ENGAGEMENT_ROSE_ARCH: { value: 'engagement-rose-arch', name: { en: 'Rose arch', ar: 'قوس الورد' }, event_types: ['engagement'], photos: 1 },
|
|
23
|
+
ENGAGEMENT_FULL_MOMENT: { value: 'engagement-full-moment', name: { en: 'Full moment', ar: 'لحظة كاملة' }, event_types: ['engagement'], photos: 1 },
|
|
24
|
+
ENGAGEMENT_SEALED_LETTER: { value: 'engagement-sealed-letter', name: { en: 'Sealed letter', ar: 'رسالة مختومة' }, event_types: ['engagement'], photos: 1 },
|
|
25
|
+
MARRIAGE_CONTRACT: { value: 'marriage-contract', name: { en: 'The contract', ar: 'وثيقة العقد' }, event_types: ['marriage'], photos: 1 },
|
|
26
|
+
MARRIAGE_STAR_MEDALLION: { value: 'marriage-star-medallion', name: { en: 'Star medallion', ar: 'ميدالية النجمة' }, event_types: ['marriage'], photos: 1 },
|
|
27
|
+
MARRIAGE_MASHRABIYA: { value: 'marriage-mashrabiya', name: { en: 'Mashrabiya', ar: 'نافذة المشربية' }, event_types: ['marriage'], photos: 1 },
|
|
28
|
+
PROPOSAL_ONE_QUESTION: { value: 'proposal-one-question', name: { en: 'One question', ar: 'سؤال واحد' }, event_types: ['proposal'], photos: 1 },
|
|
29
|
+
PROPOSAL_WITNESS_TICKET: { value: 'proposal-witness-ticket', name: { en: 'Witness ticket', ar: 'تذكرة شاهد' }, event_types: ['proposal'], photos: 1 },
|
|
30
|
+
PROPOSAL_CANDLELIGHT: { value: 'proposal-candlelight', name: { en: 'Candlelight', ar: 'ضوء الشموع' }, event_types: ['proposal'], photos: 1 },
|
|
31
|
+
BACHELOR_DISCO: { value: 'bachelor-disco', name: { en: 'Disco', ar: 'ديسكو' }, event_types: ['bachelor'], photos: 1 },
|
|
32
|
+
BACHELOR_POLAROID_WALL: { value: 'bachelor-polaroid-wall', name: { en: 'Polaroid wall', ar: 'جدار البولارويد' }, event_types: ['bachelor'], photos: 3 },
|
|
33
|
+
BACHELOR_MAGAZINE: { value: 'bachelor-magazine', name: { en: 'Magazine cover', ar: 'غلاف مجلة' }, event_types: ['bachelor'], photos: 1 },
|
|
34
|
+
BIRTHDAY_BIG_NUMBER: { value: 'birthday-big-number', name: { en: 'Big number', ar: 'الرقم الكبير' }, event_types: ['birthday'], photos: 1 },
|
|
35
|
+
BIRTHDAY_LAYER_CAKE: { value: 'birthday-layer-cake', name: { en: 'Layer cake', ar: 'كعكة الطبقات' }, event_types: ['birthday'], photos: 1 },
|
|
36
|
+
BIRTHDAY_FLYING_BALLOONS: { value: 'birthday-flying-balloons', name: { en: 'Flying balloons', ar: 'بالونات تطير' }, event_types: ['birthday'], photos: 1 },
|
|
37
|
+
NEWBORN_CLOUD_CRIB: { value: 'newborn-cloud-crib', name: { en: 'Cloud crib', ar: 'سرير الغيوم' }, event_types: ['newborn'], photos: 1 },
|
|
38
|
+
NEWBORN_BIRTH_CARD: { value: 'newborn-birth-card', name: { en: 'Birth card', ar: 'بطاقة الولادة' }, event_types: ['newborn'], photos: 1 },
|
|
39
|
+
NEWBORN_STAR_MOBILE: { value: 'newborn-star-mobile', name: { en: 'Star mobile', ar: 'نجوم معلّقة' }, event_types: ['newborn'], photos: 1 },
|
|
40
|
+
GENDER_REVEAL_BIG_BALLOON: { value: 'gender-reveal-big-balloon', name: { en: 'Big balloon', ar: 'البالون الكبير' }, event_types: ['gender_reveal'], photos: 0 },
|
|
41
|
+
GENDER_REVEAL_HALF_HALF: { value: 'gender-reveal-half-half', name: { en: 'Half and half', ar: 'نصف ونصف' }, event_types: ['gender_reveal'], photos: 1 },
|
|
42
|
+
GENDER_REVEAL_SCRATCH_CARD: { value: 'gender-reveal-scratch-card', name: { en: 'Scratch card', ar: 'اكشط واكتشف' }, event_types: ['gender_reveal'], photos: 1 },
|
|
43
|
+
CIRCUMCISION_LANTERN_NIGHT: { value: 'circumcision-lantern-night', name: { en: 'Lantern night', ar: 'فوانيس الليل' }, event_types: ['circumcision'], photos: 1 },
|
|
44
|
+
CIRCUMCISION_EMBROIDERY: { value: 'circumcision-embroidery', name: { en: 'Embroidery', ar: 'التطريز' }, event_types: ['circumcision'], photos: 1 },
|
|
45
|
+
CIRCUMCISION_IN_THE_LANTERN: { value: 'circumcision-in-the-lantern', name: { en: 'Inside the lantern', ar: 'داخل الفانوس' }, event_types: ['circumcision'], photos: 1 },
|
|
46
|
+
GRADUATION_DIPLOMA: { value: 'graduation-diploma', name: { en: 'Diploma', ar: 'الشهادة' }, event_types: ['graduation'], photos: 1 },
|
|
47
|
+
GRADUATION_CAPS_FLY: { value: 'graduation-caps-fly', name: { en: 'Caps fly', ar: 'القبعات تطير' }, event_types: ['graduation'], photos: 1 },
|
|
48
|
+
GRADUATION_YEARBOOK: { value: 'graduation-yearbook', name: { en: 'Yearbook', ar: 'كتاب السنة' }, event_types: ['graduation'], photos: 5 },
|
|
49
|
+
HAJJ_HARAM_NIGHT: { value: 'hajj-haram-night', name: { en: 'Haram night', ar: 'ليلة الحرم' }, event_types: ['hajj'], photos: 1 },
|
|
50
|
+
HAJJ_PILGRIM_PATH: { value: 'hajj-pilgrim-path', name: { en: 'Pilgrim path', ar: 'رحلة الحاج' }, event_types: ['hajj'], photos: 1 },
|
|
51
|
+
HAJJ_GOLDEN_ARCH: { value: 'hajj-golden-arch', name: { en: 'Golden arch', ar: 'القوس الذهبي' }, event_types: ['hajj'], photos: 1 },
|
|
52
|
+
MOTHERS_DAY_HANDWRITTEN: { value: 'mothers-day-handwritten', name: { en: 'Handwritten letter', ar: 'رسالة بخط اليد' }, event_types: ['mothers_day'], photos: 1 },
|
|
53
|
+
MOTHERS_DAY_BOUQUET: { value: 'mothers-day-bouquet', name: { en: 'Bouquet', ar: 'باقة ورد' }, event_types: ['mothers_day'], photos: 1 },
|
|
54
|
+
MOTHERS_DAY_THEN_NOW: { value: 'mothers-day-then-now', name: { en: 'Then and now', ar: 'زمان والآن' }, event_types: ['mothers_day'], photos: 2 },
|
|
55
|
+
VALENTINE_RED_ENVELOPE: { value: 'valentine-red-envelope', name: { en: 'Red envelope', ar: 'الظرف الأحمر' }, event_types: ['valentine'], photos: 1 },
|
|
56
|
+
VALENTINE_FILM_STRIP: { value: 'valentine-film-strip', name: { en: 'Film strip', ar: 'شريط الفيلم' }, event_types: ['valentine'], photos: 3 },
|
|
57
|
+
VALENTINE_NEON_HEART: { value: 'valentine-neon-heart', name: { en: 'Neon heart', ar: 'قلب نيون' }, event_types: ['valentine'], photos: 1 },
|
|
58
|
+
OPENING_RIBBON_CUT: { value: 'opening-ribbon-cut', name: { en: 'Ribbon cut', ar: 'قص الشريط' }, event_types: ['opening'], photos: 1 },
|
|
59
|
+
OPENING_STOREFRONT: { value: 'opening-storefront', name: { en: 'Storefront', ar: 'واجهة المحل' }, event_types: ['opening'], photos: 1 },
|
|
60
|
+
OPENING_COUPON: { value: 'opening-coupon', name: { en: 'Coupon', ar: 'الكوبون' }, event_types: ['opening'], photos: 1 },
|
|
61
|
+
GENERAL_BOLD_POSTER: { value: 'general-bold-poster', name: { en: 'Bold poster', ar: 'ملصق جريء' }, event_types: ['general'], photos: 3 },
|
|
62
|
+
GENERAL_FIREWORKS: { value: 'general-fireworks', name: { en: 'Fireworks', ar: 'ألعاب نارية' }, event_types: ['general'], photos: 1 },
|
|
63
|
+
GENERAL_WRISTBAND: { value: 'general-wristband', name: { en: 'Wristband', ar: 'سوار الحفلة' }, event_types: ['general'], photos: 1 },
|
|
7
64
|
};
|
|
8
|
-
export const EventTemplateOptions = Object.values(EventTemplate).map((type) =>
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
65
|
+
export const EventTemplateOptions = Object.values(EventTemplate).map((type) => {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
return ({
|
|
68
|
+
value: type.value,
|
|
69
|
+
name: type.name,
|
|
70
|
+
event_types: [...type.event_types],
|
|
71
|
+
photos: (_a = type.photos) !== null && _a !== void 0 ? _a : 1,
|
|
72
|
+
hidden: (_b = type.hidden) !== null && _b !== void 0 ? _b : false,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
/** Most pictures any design shows (cover + photos) */
|
|
76
|
+
export const EVENT_TEMPLATE_MAX_PHOTOS = 5;
|
|
77
|
+
/** Pictures a template shows (cover included) */
|
|
78
|
+
export const eventTemplatePhotos = (template) => { var _a, _b; return (_b = (_a = EventTemplateOptions.find((t) => t.value === template)) === null || _a === void 0 ? void 0 : _a.photos) !== null && _b !== void 0 ? _b : 1; };
|
|
79
|
+
/** Templates offered for an event type; events without a type are weddings */
|
|
80
|
+
export const eventTemplatesFor = (eventType) => EventTemplateOptions.filter((t) => !t.hidden && t.event_types.includes(eventType || 'wedding'));
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Free texts owners type (welcome line, RSVP line, occasion details, program items) must not carry
|
|
3
|
+
* Christian religious symbols, creeds or rites (owner decision 2026-11-04). Social wording is fine.
|
|
4
|
+
*/
|
|
5
|
+
const BLOCKED_SYMBOLS = /[✝✞✟†☦☩✙✚✛✜♰♱⛪]/u;
|
|
6
|
+
/** Matched against the text after removing diacritics/tatweel and unifying alef/ya/ta marbuta forms */
|
|
7
|
+
const BLOCKED_PHRASES = [
|
|
8
|
+
"الاب والابن",
|
|
9
|
+
"الروح القدس",
|
|
10
|
+
"الثالوث",
|
|
11
|
+
"التثليث",
|
|
12
|
+
"ابن الله",
|
|
13
|
+
"الرب يسوع",
|
|
14
|
+
"يسوع",
|
|
15
|
+
"السيد المسيح",
|
|
16
|
+
"المسيح الرب",
|
|
17
|
+
"ام الله",
|
|
18
|
+
"والده الاله",
|
|
19
|
+
"الاكليل",
|
|
20
|
+
"اكليل",
|
|
21
|
+
"المعموديه",
|
|
22
|
+
"التعميد",
|
|
23
|
+
"العماد المقدس",
|
|
24
|
+
"الانجيل",
|
|
25
|
+
"انجيل",
|
|
26
|
+
"الكتاب المقدس",
|
|
27
|
+
"سفر التكوين",
|
|
28
|
+
"كورنثوس",
|
|
29
|
+
"هللويا",
|
|
30
|
+
"in the name of the father",
|
|
31
|
+
"holy spirit",
|
|
32
|
+
"holy ghost",
|
|
33
|
+
"jesus",
|
|
34
|
+
"trinity",
|
|
35
|
+
"son of god",
|
|
36
|
+
"holy matrimony",
|
|
37
|
+
"bible",
|
|
38
|
+
"gospel",
|
|
39
|
+
"hallelujah",
|
|
40
|
+
];
|
|
41
|
+
export const normalizeTextForPolicy = (value) => value
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
.replace(/[ً-ٰٟـ]/g, "")
|
|
44
|
+
.replace(/[إأآٱ]/g, "ا")
|
|
45
|
+
.replace(/ى/g, "ي")
|
|
46
|
+
.replace(/ة/g, "ه")
|
|
47
|
+
.replace(/\s+/g, " ");
|
|
48
|
+
const NORMALIZED_PHRASES = BLOCKED_PHRASES.map(normalizeTextForPolicy);
|
|
49
|
+
/** True when the text holds a blocked religious symbol or phrase */
|
|
50
|
+
export const hasBlockedReligiousText = (value) => {
|
|
51
|
+
if (!value)
|
|
52
|
+
return false;
|
|
53
|
+
if (BLOCKED_SYMBOLS.test(value))
|
|
54
|
+
return true;
|
|
55
|
+
const text = normalizeTextForPolicy(value);
|
|
56
|
+
return NORMALIZED_PHRASES.some((p) => text.includes(p));
|
|
57
|
+
};
|
|
58
|
+
export const BLOCKED_RELIGIOUS_TEXT_MESSAGE = {
|
|
59
|
+
en: "This text contains religious wording or symbols that invitations cannot include.",
|
|
60
|
+
ar: "يحتوي النص على عبارات أو رموز دينية لا يمكن إضافتها إلى الدعوة.",
|
|
61
|
+
};
|
|
@@ -1,7 +1,40 @@
|
|
|
1
|
+
/** Groups on the «ما نوع المناسبة؟» step */
|
|
2
|
+
export const EventTypeGroups = {
|
|
3
|
+
CELEBRATIONS: { value: 'celebrations', name: { en: 'Weddings & engagements', ar: 'أفراح' } },
|
|
4
|
+
FAMILY: { value: 'family', name: { en: 'Family & kids', ar: 'العائلة والأطفال' } },
|
|
5
|
+
MILESTONES: { value: 'milestones', name: { en: 'Milestones & occasions', ar: 'إنجازات ومناسبات' } },
|
|
6
|
+
BUSINESS: { value: 'business', name: { en: 'Business & general', ar: 'أعمال وعامة' } },
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Every invitation type. `details` says where its details are stored:
|
|
10
|
+
* wedding = event.wedding (couple), occasion = event.occasion (generic, see EventOccasionTypeConfigs).
|
|
11
|
+
*/
|
|
1
12
|
export const EventTypes = {
|
|
2
|
-
WEDDING: { value: 'wedding', name: { en: 'Wedding', ar: 'زفاف' } },
|
|
13
|
+
WEDDING: { value: 'wedding', name: { en: 'Wedding', ar: 'زفاف' }, group: 'celebrations', details: 'wedding' },
|
|
14
|
+
ENGAGEMENT: { value: 'engagement', name: { en: 'Engagement', ar: 'حفلة خطبة' }, group: 'celebrations', details: 'wedding' },
|
|
15
|
+
MARRIAGE: { value: 'marriage', name: { en: 'Marriage contract', ar: 'حفل زواج' }, group: 'celebrations', details: 'wedding' },
|
|
16
|
+
PROPOSAL: { value: 'proposal', name: { en: 'Proposal', ar: 'حفل Proposal' }, group: 'celebrations', details: 'occasion' },
|
|
17
|
+
BACHELOR: { value: 'bachelor', name: { en: 'Bachelor party', ar: 'حفل توديع عزوبية' }, group: 'celebrations', details: 'occasion' },
|
|
18
|
+
BIRTHDAY: { value: 'birthday', name: { en: 'Birthday', ar: 'عيد ميلاد' }, group: 'family', details: 'occasion' },
|
|
19
|
+
NEWBORN: { value: 'newborn', name: { en: 'New baby', ar: 'مباركة مولود' }, group: 'family', details: 'occasion' },
|
|
20
|
+
GENDER_REVEAL: { value: 'gender_reveal', name: { en: 'Gender reveal', ar: 'احتفال جنس المولود' }, group: 'family', details: 'occasion' },
|
|
21
|
+
CIRCUMCISION: { value: 'circumcision', name: { en: 'Circumcision', ar: 'حفل طهور' }, group: 'family', details: 'occasion' },
|
|
22
|
+
GRADUATION: { value: 'graduation', name: { en: 'Graduation', ar: 'حفل تخرج' }, group: 'milestones', details: 'occasion' },
|
|
23
|
+
HAJJ: { value: 'hajj', name: { en: 'Hajj return', ar: 'حفلة حج' }, group: 'milestones', details: 'occasion' },
|
|
24
|
+
MOTHERS_DAY: { value: 'mothers_day', name: { en: "Mother's Day", ar: 'حفل عيد الأم' }, group: 'milestones', details: 'occasion' },
|
|
25
|
+
VALENTINE: { value: 'valentine', name: { en: "Valentine's Day", ar: 'حفل لعيد الحب' }, group: 'milestones', details: 'occasion' },
|
|
26
|
+
OPENING: { value: 'opening', name: { en: 'Business opening', ar: 'افتتاح عمل تجاري' }, group: 'business', details: 'occasion' },
|
|
27
|
+
GENERAL: { value: 'general', name: { en: 'General party', ar: 'حفلة عامة' }, group: 'business', details: 'occasion' },
|
|
3
28
|
};
|
|
29
|
+
export const EventTypeValues = Object.values(EventTypes).map((t) => t.value);
|
|
4
30
|
export const EventTypeOptions = Object.values(EventTypes).map((type) => ({
|
|
5
31
|
value: type.value,
|
|
6
32
|
name: type.name,
|
|
33
|
+
group: type.group,
|
|
34
|
+
details: type.details,
|
|
7
35
|
}));
|
|
36
|
+
export const findEventType = (value) => { var _a; return (_a = EventTypeOptions.find((t) => t.value === (value || 'wedding'))) !== null && _a !== void 0 ? _a : null; };
|
|
37
|
+
/** Types whose details are a couple stored in event.wedding (events without a type are weddings) */
|
|
38
|
+
export const isCoupleEventType = (value) => { var _a, _b; return ((_b = (_a = findEventType(value)) === null || _a === void 0 ? void 0 : _a.details) !== null && _b !== void 0 ? _b : 'wedding') === 'wedding'; };
|
|
39
|
+
/** Types whose details are stored in event.occasion */
|
|
40
|
+
export const isOccasionEventType = (value) => { var _a; return ((_a = findEventType(value)) === null || _a === void 0 ? void 0 : _a.details) === 'occasion'; };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Who can find an event: private = only people with its link, public = can be listed and indexed */
|
|
2
|
+
export const EventVisibilityValues = ["private", "public"];
|
|
3
|
+
export const EventVisibility = {
|
|
4
|
+
PRIVATE: "private",
|
|
5
|
+
PUBLIC: "public",
|
|
6
|
+
};
|
|
7
|
+
export const DEFAULT_EVENT_VISIBILITY = "private";
|
|
8
|
+
export const EventVisibilityNames = {
|
|
9
|
+
private: { en: "Private", ar: "خاصة" },
|
|
10
|
+
public: { en: "Public", ar: "عامة" },
|
|
11
|
+
};
|
|
12
|
+
export const EventVisibilityOptions = EventVisibilityValues.map((value) => ({
|
|
13
|
+
value,
|
|
14
|
+
name: EventVisibilityNames[value],
|
|
15
|
+
}));
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invitation style of a wedding (also used by engagement and marriage, which share event.wedding).
|
|
3
|
+
* muslim = the Islamic opening, Quran verse and dua (the original templates).
|
|
4
|
+
* general = social congratulations only: names, place, date, program. Suits Christian weddings.
|
|
5
|
+
*
|
|
6
|
+
* Content rule (owner decision 2026-11-04): no Christian religious symbols, creeds, Bible verses or rites
|
|
7
|
+
* may appear in any invitation. The general style therefore carries no religious text at all.
|
|
8
|
+
*/
|
|
9
|
+
export const EventWeddingReligionValues = ["muslim", "general"];
|
|
10
|
+
export const EventWeddingReligion = {
|
|
11
|
+
MUSLIM: "muslim",
|
|
12
|
+
GENERAL: "general",
|
|
13
|
+
};
|
|
14
|
+
export const DEFAULT_EVENT_WEDDING_RELIGION = "muslim";
|
|
15
|
+
export const EventWeddingReligionNames = {
|
|
16
|
+
muslim: {
|
|
17
|
+
en: "Islamic",
|
|
18
|
+
ar: "إسلامي",
|
|
19
|
+
hint_en: "Bismillah, a Quran verse and a dua.",
|
|
20
|
+
hint_ar: "البسملة وآية قرآنية ودعاء للعروسين.",
|
|
21
|
+
},
|
|
22
|
+
general: {
|
|
23
|
+
en: "General",
|
|
24
|
+
ar: "عام",
|
|
25
|
+
hint_en: "Social congratulations only, with no religious text.",
|
|
26
|
+
hint_ar: "تهنئة اجتماعية فقط بدون نصوص دينية.",
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
export const EventWeddingReligionOptions = EventWeddingReligionValues.map((value) => ({
|
|
30
|
+
value,
|
|
31
|
+
name: EventWeddingReligionNames[value],
|
|
32
|
+
}));
|
|
33
|
+
export const EventWeddingVerses = [
|
|
34
|
+
{
|
|
35
|
+
value: "rum-21",
|
|
36
|
+
religion: "muslim",
|
|
37
|
+
text: "﴿ وَمِنْ آيَاتِهِ أَنْ خَلَقَ لَكُمْ مِنْ أَنْفُسِكُمْ أَزْوَاجًا لِتَسْكُنُوا إِلَيْهَا وَجَعَلَ بَيْنَكُمْ مَوَدَّةً وَرَحْمَةً ﴾",
|
|
38
|
+
reference: "سورة الروم - آية ٢١",
|
|
39
|
+
label: { en: "Ar-Rum 21", ar: "سورة الروم - آية ٢١" },
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
value: "furqan-74",
|
|
43
|
+
religion: "muslim",
|
|
44
|
+
text: "﴿ رَبَّنَا هَبْ لَنَا مِنْ أَزْوَاجِنَا وَذُرِّيَّاتِنَا قُرَّةَ أَعْيُنٍ وَاجْعَلْنَا لِلْمُتَّقِينَ إِمَامًا ﴾",
|
|
45
|
+
reference: "سورة الفرقان - آية ٧٤",
|
|
46
|
+
label: { en: "Al-Furqan 74", ar: "سورة الفرقان - آية ٧٤" },
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
value: "rum-mawadda",
|
|
50
|
+
religion: "muslim",
|
|
51
|
+
text: "﴿ وَجَعَلَ بَيْنَكُم مَّوَدَّةً وَرَحْمَةً ﴾",
|
|
52
|
+
reference: "سورة الروم",
|
|
53
|
+
label: { en: "Mawadda wa rahma", ar: "وجعل بينكم مودة ورحمة" },
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
value: "together",
|
|
57
|
+
religion: "general",
|
|
58
|
+
text: "«معاً نبدأ أجمل حكايات العمر»",
|
|
59
|
+
reference: null,
|
|
60
|
+
label: { en: "Together we begin", ar: "معاً نبدأ أجمل حكايات العمر" },
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
value: "love-loyalty",
|
|
64
|
+
religion: "general",
|
|
65
|
+
text: "«بالحب والوفاء نبدأ رحلتنا، وبحضوركم تكتمل فرحتنا»",
|
|
66
|
+
reference: null,
|
|
67
|
+
label: { en: "Love and loyalty", ar: "بالحب والوفاء نبدأ رحلتنا" },
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
value: "night-of-life",
|
|
71
|
+
religion: "general",
|
|
72
|
+
text: "«ليلة العمر لا تكتمل إلا بوجود من نحب»",
|
|
73
|
+
reference: null,
|
|
74
|
+
label: { en: "Night of a lifetime", ar: "ليلة العمر لا تكتمل إلا بوجود من نحب" },
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
/** General style only: the owner writes the couple's words by hand (event.wedding.custom_verse) */
|
|
78
|
+
export const EVENT_WEDDING_CUSTOM_VERSE = "custom";
|
|
79
|
+
export const EVENT_WEDDING_CUSTOM_VERSE_MAX = 160;
|
|
80
|
+
export const EventWeddingVerseValues = [
|
|
81
|
+
EVENT_WEDDING_CUSTOM_VERSE,
|
|
82
|
+
...EventWeddingVerses.map((v) => v.value),
|
|
83
|
+
];
|
|
84
|
+
/** The hand-written text applies only to the general style */
|
|
85
|
+
export const eventWeddingCustomVerse = (verseKey, religion, customVerse) => verseKey === EVENT_WEDDING_CUSTOM_VERSE && normalizeEventWeddingReligion(religion) === "general"
|
|
86
|
+
? (customVerse === null || customVerse === void 0 ? void 0 : customVerse.trim()) || null
|
|
87
|
+
: null;
|
|
88
|
+
export const EventWeddingReligionTextsMap = {
|
|
89
|
+
muslim: {
|
|
90
|
+
opening: "بسم الله الرحمن الرحيم",
|
|
91
|
+
verse_title: "مقتطف قرآني مبارك",
|
|
92
|
+
blessing: "اللهم بارك لهما وبارك عليهما واجمع بينهما في خير، واجعل أيامهما مودة ورحمة وسكينة.",
|
|
93
|
+
blessing_title: "دعاء",
|
|
94
|
+
symbol: "۞",
|
|
95
|
+
contract_line: "على سنّة الله ورسوله",
|
|
96
|
+
},
|
|
97
|
+
general: {
|
|
98
|
+
opening: null,
|
|
99
|
+
verse_title: "كلمة افتتاحية",
|
|
100
|
+
blessing: "نتمنى لهما حياة مليئة بالحب والسعادة، وأياماً عامرة بالفرح والوفاق.",
|
|
101
|
+
blessing_title: "أمنية",
|
|
102
|
+
symbol: "⚭",
|
|
103
|
+
contract_line: null,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
/** Ready-made program item offered for the general style */
|
|
107
|
+
export const EVENT_WEDDING_CEREMONY_TIMELINE_TITLE = "مراسم الزواج";
|
|
108
|
+
export const normalizeEventWeddingReligion = (value) => EventWeddingReligionValues.includes(value !== null && value !== void 0 ? value : "")
|
|
109
|
+
? value
|
|
110
|
+
: DEFAULT_EVENT_WEDDING_RELIGION;
|
|
111
|
+
export const eventWeddingVersesFor = (religion) => EventWeddingVerses.filter((v) => v.religion === normalizeEventWeddingReligion(religion));
|
|
112
|
+
/** The saved verse when it belongs to the style, otherwise the style's first one */
|
|
113
|
+
export const findEventWeddingVerse = (value, religion) => {
|
|
114
|
+
var _a;
|
|
115
|
+
const list = eventWeddingVersesFor(religion);
|
|
116
|
+
return (_a = list.find((v) => v.value === value)) !== null && _a !== void 0 ? _a : list[0];
|
|
117
|
+
};
|
|
118
|
+
export const eventWeddingReligionTexts = (religion) => EventWeddingReligionTextsMap[normalizeEventWeddingReligion(religion)];
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
export * from "./Event.js";
|
|
2
2
|
export * from "./EventType.js";
|
|
3
3
|
export * from "./EventWedding.js";
|
|
4
|
+
export * from "./EventBirthday.js";
|
|
5
|
+
export * from "./EventOccasion.js";
|
|
4
6
|
export * from "./EventTemplate.js";
|
|
5
7
|
export * from "./EventTimeline.js";
|
|
6
8
|
export * from "./EventInvitationScanType.js";
|
|
7
9
|
export * from "./EventPricing.js";
|
|
8
10
|
export * from "./EventPreview.js";
|
|
9
11
|
export * from "./EventCustomization.js";
|
|
12
|
+
export * from "./EventVisibility.js";
|
|
13
|
+
export * from "./EventWeddingReligion.js";
|
|
14
|
+
export * from "./EventTextPolicy.js";
|
|
15
|
+
export * from "./EventDressCode.js";
|
|
16
|
+
export * from "./EventHost.js";
|
|
17
|
+
export * from "./EventGuests.js";
|