@myrjfa/state 1.1.1 → 2.0.0
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/index.d.ts +34 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -18
- package/dist/lib/actions/actions.d.ts +170 -170
- package/dist/lib/actions/actions.js +307 -307
- package/dist/lib/actions/auth.d.ts +20 -0
- package/dist/lib/actions/auth.d.ts.map +1 -1
- package/dist/lib/actions/booking.d.ts +30 -0
- package/dist/lib/actions/booking.d.ts.map +1 -0
- package/dist/lib/actions/booking.js +77 -0
- package/dist/lib/actions/fetcher.js +84 -84
- package/dist/lib/actions/severActions.js +2 -2
- package/dist/lib/authSessionManager.js +34 -34
- package/dist/lib/context/ChatContext.js +338 -338
- package/dist/lib/models/adventure.d.ts +75 -0
- package/dist/lib/models/adventure.d.ts.map +1 -0
- package/dist/lib/models/adventure.js +1 -0
- package/dist/lib/models/blog.d.ts +4 -4
- package/dist/lib/models/booking.d.ts +47 -0
- package/dist/lib/models/booking.d.ts.map +1 -0
- package/dist/lib/models/booking.js +1 -0
- package/dist/lib/models/guide.d.ts +43 -0
- package/dist/lib/models/guide.d.ts.map +1 -0
- package/dist/lib/models/guide.js +1 -0
- package/dist/lib/models/notfications.d.ts +93 -93
- package/dist/lib/models/opportunities/freelance.d.ts +74 -6
- package/dist/lib/models/opportunities/freelance.d.ts.map +1 -1
- package/dist/lib/models/opportunities/internship.d.ts +74 -6
- package/dist/lib/models/opportunities/internship.d.ts.map +1 -1
- package/dist/lib/models/opportunities/job.d.ts +74 -6
- package/dist/lib/models/opportunities/job.d.ts.map +1 -1
- package/dist/lib/models/opportunities/opportunity.d.ts +74 -6
- package/dist/lib/models/opportunities/opportunity.d.ts.map +1 -1
- package/dist/lib/models/opportunities/volunteerJob.d.ts +74 -6
- package/dist/lib/models/opportunities/volunteerJob.d.ts.map +1 -1
- package/dist/lib/models/package.d.ts +264 -0
- package/dist/lib/models/package.d.ts.map +1 -0
- package/dist/lib/models/package.js +58 -0
- package/dist/lib/models/portfolio.d.ts +42 -42
- package/dist/lib/models/props.d.ts +3 -0
- package/dist/lib/models/props.d.ts.map +1 -1
- package/dist/lib/models/props.js +36 -0
- package/dist/lib/models/rental.d.ts +85 -0
- package/dist/lib/models/rental.d.ts.map +1 -0
- package/dist/lib/models/rental.js +1 -0
- package/dist/lib/models/review.d.ts +1 -1
- package/dist/lib/models/review.d.ts.map +1 -1
- package/dist/lib/models/stay.d.ts +459 -0
- package/dist/lib/models/stay.d.ts.map +1 -0
- package/dist/lib/models/stay.js +214 -0
- package/dist/lib/models/tile.d.ts +53 -28
- package/dist/lib/models/tile.d.ts.map +1 -1
- package/dist/lib/models/user.d.ts +48 -0
- package/dist/lib/models/user.d.ts.map +1 -1
- package/dist/lib/models/user.js +10 -0
- package/dist/lib/userAtom.d.ts +238 -198
- package/dist/lib/userAtom.d.ts.map +1 -1
- package/dist/lib/userAtom.js +127 -127
- package/package.json +6 -1
- package/dist/lib/actions/property.d.ts +0 -77
- package/dist/lib/actions/property.d.ts.map +0 -1
- package/dist/lib/actions/property.js +0 -133
- package/dist/lib/actions.d.ts +0 -141
- package/dist/lib/actions.d.ts.map +0 -1
- package/dist/lib/actions.js +0 -307
- package/dist/lib/auth.d.ts +0 -150
- package/dist/lib/auth.d.ts.map +0 -1
- package/dist/lib/auth.js +0 -125
- package/dist/lib/fetcher.d.ts +0 -9
- package/dist/lib/fetcher.d.ts.map +0 -1
- package/dist/lib/fetcher.js +0 -84
- package/dist/lib/models/property.d.ts +0 -79
- package/dist/lib/models/property.d.ts.map +0 -1
- package/dist/lib/models/property.js +0 -134
- package/dist/lib/models/volunteerJob.d.ts +0 -398
- package/dist/lib/models/volunteerJob.d.ts.map +0 -1
- package/dist/lib/models/volunteerJob.js +0 -152
- package/dist/lib/severActions.d.ts +0 -3
- package/dist/lib/severActions.d.ts.map +0 -1
- package/dist/lib/severActions.js +0 -19
- package/dist/lib/socket.d.ts +0 -7
- package/dist/lib/socket.d.ts.map +0 -1
- package/dist/lib/socket.js +0 -22
- package/dist/lib/utils/socialMediaUrl.d.ts +0 -25
- package/dist/lib/utils/socialMediaUrl.d.ts.map +0 -1
- package/dist/lib/utils/socialMediaUrl.js +0 -97
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const stayTypeOptions: readonly [{
|
|
3
|
+
readonly value: "hotel";
|
|
4
|
+
readonly label: "Hotel";
|
|
5
|
+
}, {
|
|
6
|
+
readonly value: "hostel";
|
|
7
|
+
readonly label: "Hostel";
|
|
8
|
+
}, {
|
|
9
|
+
readonly value: "homestay";
|
|
10
|
+
readonly label: "Homestay";
|
|
11
|
+
}, {
|
|
12
|
+
readonly value: "resort";
|
|
13
|
+
readonly label: "Resort";
|
|
14
|
+
}, {
|
|
15
|
+
readonly value: "guesthouse";
|
|
16
|
+
readonly label: "Guesthouse";
|
|
17
|
+
}, {
|
|
18
|
+
readonly value: "apartment";
|
|
19
|
+
readonly label: "Apartment";
|
|
20
|
+
}, {
|
|
21
|
+
readonly value: "villa";
|
|
22
|
+
readonly label: "Villa";
|
|
23
|
+
}, {
|
|
24
|
+
readonly value: "camping";
|
|
25
|
+
readonly label: "Glamping";
|
|
26
|
+
}, {
|
|
27
|
+
readonly value: "treehouse";
|
|
28
|
+
readonly label: "Treehouse";
|
|
29
|
+
}, {
|
|
30
|
+
readonly value: "houseboat";
|
|
31
|
+
readonly label: "Houseboat";
|
|
32
|
+
}, {
|
|
33
|
+
readonly value: "ngo";
|
|
34
|
+
readonly label: "NGO";
|
|
35
|
+
}, {
|
|
36
|
+
readonly value: "coworking";
|
|
37
|
+
readonly label: "Co-working Space";
|
|
38
|
+
}];
|
|
39
|
+
export declare const stayStatusOptions: readonly [{
|
|
40
|
+
readonly value: "draft";
|
|
41
|
+
readonly label: "Draft";
|
|
42
|
+
}, {
|
|
43
|
+
readonly value: "pending";
|
|
44
|
+
readonly label: "Pending Approval";
|
|
45
|
+
}, {
|
|
46
|
+
readonly value: "active";
|
|
47
|
+
readonly label: "Active";
|
|
48
|
+
}, {
|
|
49
|
+
readonly value: "inactive";
|
|
50
|
+
readonly label: "Inactive";
|
|
51
|
+
}, {
|
|
52
|
+
readonly value: "open";
|
|
53
|
+
readonly label: "Open";
|
|
54
|
+
}, {
|
|
55
|
+
readonly value: "closed";
|
|
56
|
+
readonly label: "Closed";
|
|
57
|
+
}, {
|
|
58
|
+
readonly value: "archived";
|
|
59
|
+
readonly label: "Archived";
|
|
60
|
+
}];
|
|
61
|
+
export type StayType = typeof stayTypeOptions[number]['value'];
|
|
62
|
+
export type StayStatus = typeof stayStatusOptions[number]['value'];
|
|
63
|
+
export declare const STAY_PERMISSIONS: readonly ["property:read", "property:write", "property:delete", "opportunity:read", "opportunity:write", "chat:write", "rooms:read", "rooms:write", "events:read", "events:write", "packages:approve", "managers:manage", "analytics:view"];
|
|
64
|
+
export type StayPermission = typeof STAY_PERMISSIONS[number];
|
|
65
|
+
export declare const stayPermissionLabels: Record<StayPermission, string>;
|
|
66
|
+
export declare const stayPermissionCategories: {
|
|
67
|
+
label: string;
|
|
68
|
+
permissions: StayPermission[];
|
|
69
|
+
}[];
|
|
70
|
+
export declare const StayManagerSchema: z.ZodObject<{
|
|
71
|
+
_id: z.ZodOptional<z.ZodString>;
|
|
72
|
+
userId: z.ZodString;
|
|
73
|
+
username: z.ZodString;
|
|
74
|
+
role: z.ZodEnum<["user", "host"]>;
|
|
75
|
+
managerRole: z.ZodDefault<z.ZodString>;
|
|
76
|
+
permissions: z.ZodArray<z.ZodString, "many">;
|
|
77
|
+
isOwner: z.ZodDefault<z.ZodBoolean>;
|
|
78
|
+
addedAt: z.ZodOptional<z.ZodDate>;
|
|
79
|
+
}, "strip", z.ZodTypeAny, {
|
|
80
|
+
username: string;
|
|
81
|
+
role: "host" | "user";
|
|
82
|
+
userId: string;
|
|
83
|
+
managerRole: string;
|
|
84
|
+
permissions: string[];
|
|
85
|
+
isOwner: boolean;
|
|
86
|
+
_id?: string | undefined;
|
|
87
|
+
addedAt?: Date | undefined;
|
|
88
|
+
}, {
|
|
89
|
+
username: string;
|
|
90
|
+
role: "host" | "user";
|
|
91
|
+
userId: string;
|
|
92
|
+
permissions: string[];
|
|
93
|
+
_id?: string | undefined;
|
|
94
|
+
managerRole?: string | undefined;
|
|
95
|
+
isOwner?: boolean | undefined;
|
|
96
|
+
addedAt?: Date | undefined;
|
|
97
|
+
}>;
|
|
98
|
+
export type StayManager = z.infer<typeof StayManagerSchema>;
|
|
99
|
+
export declare const roomTypeOptions: readonly [{
|
|
100
|
+
readonly value: "single";
|
|
101
|
+
readonly label: "Single Room";
|
|
102
|
+
}, {
|
|
103
|
+
readonly value: "double";
|
|
104
|
+
readonly label: "Double Room";
|
|
105
|
+
}, {
|
|
106
|
+
readonly value: "twin";
|
|
107
|
+
readonly label: "Twin Room";
|
|
108
|
+
}, {
|
|
109
|
+
readonly value: "suite";
|
|
110
|
+
readonly label: "Suite";
|
|
111
|
+
}, {
|
|
112
|
+
readonly value: "deluxe";
|
|
113
|
+
readonly label: "Deluxe Room";
|
|
114
|
+
}, {
|
|
115
|
+
readonly value: "family";
|
|
116
|
+
readonly label: "Family Room";
|
|
117
|
+
}, {
|
|
118
|
+
readonly value: "dorm-mixed";
|
|
119
|
+
readonly label: "Dorm (Mixed)";
|
|
120
|
+
}, {
|
|
121
|
+
readonly value: "dorm-female";
|
|
122
|
+
readonly label: "Dorm (Female)";
|
|
123
|
+
}, {
|
|
124
|
+
readonly value: "dorm-male";
|
|
125
|
+
readonly label: "Dorm (Male)";
|
|
126
|
+
}, {
|
|
127
|
+
readonly value: "cottage";
|
|
128
|
+
readonly label: "Cottage";
|
|
129
|
+
}, {
|
|
130
|
+
readonly value: "tent";
|
|
131
|
+
readonly label: "Tent / Glamping";
|
|
132
|
+
}, {
|
|
133
|
+
readonly value: "penthouse";
|
|
134
|
+
readonly label: "Penthouse";
|
|
135
|
+
}, {
|
|
136
|
+
readonly value: "studio";
|
|
137
|
+
readonly label: "Studio";
|
|
138
|
+
}, {
|
|
139
|
+
readonly value: "villa";
|
|
140
|
+
readonly label: "Villa";
|
|
141
|
+
}];
|
|
142
|
+
export declare const bedTypeOptions: readonly [{
|
|
143
|
+
readonly value: "single";
|
|
144
|
+
readonly label: "Single Bed";
|
|
145
|
+
}, {
|
|
146
|
+
readonly value: "double";
|
|
147
|
+
readonly label: "Double Bed";
|
|
148
|
+
}, {
|
|
149
|
+
readonly value: "queen";
|
|
150
|
+
readonly label: "Queen Bed";
|
|
151
|
+
}, {
|
|
152
|
+
readonly value: "king";
|
|
153
|
+
readonly label: "King Bed";
|
|
154
|
+
}, {
|
|
155
|
+
readonly value: "twin";
|
|
156
|
+
readonly label: "Twin Beds";
|
|
157
|
+
}, {
|
|
158
|
+
readonly value: "bunk";
|
|
159
|
+
readonly label: "Bunk Bed";
|
|
160
|
+
}, {
|
|
161
|
+
readonly value: "sofa-bed";
|
|
162
|
+
readonly label: "Sofa Bed";
|
|
163
|
+
}, {
|
|
164
|
+
readonly value: "futon";
|
|
165
|
+
readonly label: "Futon";
|
|
166
|
+
}];
|
|
167
|
+
export declare const mealPlanOptions: readonly [{
|
|
168
|
+
readonly value: "none";
|
|
169
|
+
readonly label: "No Meals";
|
|
170
|
+
}, {
|
|
171
|
+
readonly value: "breakfast";
|
|
172
|
+
readonly label: "Breakfast Included";
|
|
173
|
+
}, {
|
|
174
|
+
readonly value: "half-board";
|
|
175
|
+
readonly label: "Half Board (Breakfast + Dinner)";
|
|
176
|
+
}, {
|
|
177
|
+
readonly value: "full-board";
|
|
178
|
+
readonly label: "Full Board (All Meals)";
|
|
179
|
+
}, {
|
|
180
|
+
readonly value: "all-inclusive";
|
|
181
|
+
readonly label: "All Inclusive";
|
|
182
|
+
}];
|
|
183
|
+
export declare const RoomSchema: z.ZodObject<{
|
|
184
|
+
_id: z.ZodOptional<z.ZodString>;
|
|
185
|
+
propertyId: z.ZodString;
|
|
186
|
+
roomType: z.ZodString;
|
|
187
|
+
name: z.ZodString;
|
|
188
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
189
|
+
description: z.ZodOptional<z.ZodString>;
|
|
190
|
+
pricePerNight: z.ZodNumber;
|
|
191
|
+
currency: z.ZodDefault<z.ZodString>;
|
|
192
|
+
maxAdults: z.ZodDefault<z.ZodNumber>;
|
|
193
|
+
maxChildren: z.ZodDefault<z.ZodNumber>;
|
|
194
|
+
maxOccupancy: z.ZodDefault<z.ZodNumber>;
|
|
195
|
+
totalRooms: z.ZodDefault<z.ZodNumber>;
|
|
196
|
+
availableRooms: z.ZodOptional<z.ZodNumber>;
|
|
197
|
+
bedType: z.ZodOptional<z.ZodString>;
|
|
198
|
+
bathType: z.ZodDefault<z.ZodEnum<["private", "shared"]>>;
|
|
199
|
+
roomSize: z.ZodOptional<z.ZodString>;
|
|
200
|
+
view: z.ZodOptional<z.ZodString>;
|
|
201
|
+
mealPlan: z.ZodOptional<z.ZodString>;
|
|
202
|
+
floorLevel: z.ZodOptional<z.ZodString>;
|
|
203
|
+
images: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
204
|
+
amenities: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
205
|
+
isAvailable: z.ZodDefault<z.ZodBoolean>;
|
|
206
|
+
status: z.ZodDefault<z.ZodEnum<["active", "inactive", "draft"]>>;
|
|
207
|
+
createdAt: z.ZodOptional<z.ZodDate>;
|
|
208
|
+
updatedAt: z.ZodOptional<z.ZodDate>;
|
|
209
|
+
}, "strip", z.ZodTypeAny, {
|
|
210
|
+
status: "draft" | "active" | "inactive";
|
|
211
|
+
name: string;
|
|
212
|
+
currency: string;
|
|
213
|
+
propertyId: string;
|
|
214
|
+
roomType: string;
|
|
215
|
+
pricePerNight: number;
|
|
216
|
+
maxAdults: number;
|
|
217
|
+
maxChildren: number;
|
|
218
|
+
maxOccupancy: number;
|
|
219
|
+
totalRooms: number;
|
|
220
|
+
bathType: "private" | "shared";
|
|
221
|
+
isAvailable: boolean;
|
|
222
|
+
description?: string | undefined;
|
|
223
|
+
_id?: string | undefined;
|
|
224
|
+
createdAt?: Date | undefined;
|
|
225
|
+
updatedAt?: Date | undefined;
|
|
226
|
+
slug?: string | undefined;
|
|
227
|
+
images?: string[] | undefined;
|
|
228
|
+
availableRooms?: number | undefined;
|
|
229
|
+
bedType?: string | undefined;
|
|
230
|
+
roomSize?: string | undefined;
|
|
231
|
+
view?: string | undefined;
|
|
232
|
+
mealPlan?: string | undefined;
|
|
233
|
+
floorLevel?: string | undefined;
|
|
234
|
+
amenities?: string[] | undefined;
|
|
235
|
+
}, {
|
|
236
|
+
name: string;
|
|
237
|
+
propertyId: string;
|
|
238
|
+
roomType: string;
|
|
239
|
+
pricePerNight: number;
|
|
240
|
+
status?: "draft" | "active" | "inactive" | undefined;
|
|
241
|
+
description?: string | undefined;
|
|
242
|
+
_id?: string | undefined;
|
|
243
|
+
createdAt?: Date | undefined;
|
|
244
|
+
updatedAt?: Date | undefined;
|
|
245
|
+
currency?: string | undefined;
|
|
246
|
+
slug?: string | undefined;
|
|
247
|
+
images?: string[] | undefined;
|
|
248
|
+
maxAdults?: number | undefined;
|
|
249
|
+
maxChildren?: number | undefined;
|
|
250
|
+
maxOccupancy?: number | undefined;
|
|
251
|
+
totalRooms?: number | undefined;
|
|
252
|
+
availableRooms?: number | undefined;
|
|
253
|
+
bedType?: string | undefined;
|
|
254
|
+
bathType?: "private" | "shared" | undefined;
|
|
255
|
+
roomSize?: string | undefined;
|
|
256
|
+
view?: string | undefined;
|
|
257
|
+
mealPlan?: string | undefined;
|
|
258
|
+
floorLevel?: string | undefined;
|
|
259
|
+
amenities?: string[] | undefined;
|
|
260
|
+
isAvailable?: boolean | undefined;
|
|
261
|
+
}>;
|
|
262
|
+
export type StayRoom = z.infer<typeof RoomSchema>;
|
|
263
|
+
export type Room = StayRoom;
|
|
264
|
+
export declare const StaySchema: z.ZodObject<{
|
|
265
|
+
_id: z.ZodOptional<z.ZodString>;
|
|
266
|
+
title: z.ZodString;
|
|
267
|
+
name: z.ZodOptional<z.ZodString>;
|
|
268
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
269
|
+
description: z.ZodOptional<z.ZodString>;
|
|
270
|
+
shortDescription: z.ZodOptional<z.ZodString>;
|
|
271
|
+
propertyType: z.ZodString;
|
|
272
|
+
starRating: z.ZodOptional<z.ZodNumber>;
|
|
273
|
+
status: z.ZodOptional<z.ZodEnum<["draft", "pending", "active", "inactive", "open", "closed", "archived"]>>;
|
|
274
|
+
openedAt: z.ZodOptional<z.ZodDate>;
|
|
275
|
+
hostId: z.ZodAny;
|
|
276
|
+
managers: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
277
|
+
_id: z.ZodOptional<z.ZodString>;
|
|
278
|
+
userId: z.ZodString;
|
|
279
|
+
username: z.ZodString;
|
|
280
|
+
role: z.ZodEnum<["user", "host"]>;
|
|
281
|
+
managerRole: z.ZodDefault<z.ZodString>;
|
|
282
|
+
permissions: z.ZodArray<z.ZodString, "many">;
|
|
283
|
+
isOwner: z.ZodDefault<z.ZodBoolean>;
|
|
284
|
+
addedAt: z.ZodOptional<z.ZodDate>;
|
|
285
|
+
}, "strip", z.ZodTypeAny, {
|
|
286
|
+
username: string;
|
|
287
|
+
role: "host" | "user";
|
|
288
|
+
userId: string;
|
|
289
|
+
managerRole: string;
|
|
290
|
+
permissions: string[];
|
|
291
|
+
isOwner: boolean;
|
|
292
|
+
_id?: string | undefined;
|
|
293
|
+
addedAt?: Date | undefined;
|
|
294
|
+
}, {
|
|
295
|
+
username: string;
|
|
296
|
+
role: "host" | "user";
|
|
297
|
+
userId: string;
|
|
298
|
+
permissions: string[];
|
|
299
|
+
_id?: string | undefined;
|
|
300
|
+
managerRole?: string | undefined;
|
|
301
|
+
isOwner?: boolean | undefined;
|
|
302
|
+
addedAt?: Date | undefined;
|
|
303
|
+
}>, "many">>;
|
|
304
|
+
images: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
305
|
+
nearbyAreaImages: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
306
|
+
address: z.ZodOptional<z.ZodString>;
|
|
307
|
+
city: z.ZodString;
|
|
308
|
+
state: z.ZodString;
|
|
309
|
+
country: z.ZodDefault<z.ZodString>;
|
|
310
|
+
pincode: z.ZodOptional<z.ZodString>;
|
|
311
|
+
coordinates: z.ZodOptional<z.ZodObject<{
|
|
312
|
+
lat: z.ZodNumber;
|
|
313
|
+
lng: z.ZodNumber;
|
|
314
|
+
}, "strip", z.ZodTypeAny, {
|
|
315
|
+
lat: number;
|
|
316
|
+
lng: number;
|
|
317
|
+
}, {
|
|
318
|
+
lat: number;
|
|
319
|
+
lng: number;
|
|
320
|
+
}>>;
|
|
321
|
+
nearbyLandmarks: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
322
|
+
roomIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
323
|
+
amenities: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
324
|
+
facilities: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
325
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
326
|
+
houseRules: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
327
|
+
checkInTime: z.ZodOptional<z.ZodString>;
|
|
328
|
+
checkOutTime: z.ZodOptional<z.ZodString>;
|
|
329
|
+
cancellationPolicy: z.ZodOptional<z.ZodString>;
|
|
330
|
+
petsAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
331
|
+
smokingAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
332
|
+
instantBook: z.ZodOptional<z.ZodBoolean>;
|
|
333
|
+
rating: z.ZodOptional<z.ZodNumber>;
|
|
334
|
+
ratingCount: z.ZodOptional<z.ZodNumber>;
|
|
335
|
+
reviewCount: z.ZodOptional<z.ZodNumber>;
|
|
336
|
+
views: z.ZodOptional<z.ZodNumber>;
|
|
337
|
+
isFeatured: z.ZodOptional<z.ZodBoolean>;
|
|
338
|
+
adminApproval: z.ZodOptional<z.ZodBoolean>;
|
|
339
|
+
chatIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
340
|
+
linkedEventIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
341
|
+
createdAt: z.ZodOptional<z.ZodDate>;
|
|
342
|
+
updatedAt: z.ZodOptional<z.ZodDate>;
|
|
343
|
+
}, "strip", z.ZodTypeAny, {
|
|
344
|
+
country: string;
|
|
345
|
+
city: string;
|
|
346
|
+
state: string;
|
|
347
|
+
title: string;
|
|
348
|
+
propertyType: string;
|
|
349
|
+
status?: "draft" | "archived" | "pending" | "open" | "closed" | "active" | "inactive" | undefined;
|
|
350
|
+
rating?: number | undefined;
|
|
351
|
+
ratingCount?: number | undefined;
|
|
352
|
+
reviewCount?: number | undefined;
|
|
353
|
+
name?: string | undefined;
|
|
354
|
+
address?: string | undefined;
|
|
355
|
+
description?: string | undefined;
|
|
356
|
+
_id?: string | undefined;
|
|
357
|
+
createdAt?: Date | undefined;
|
|
358
|
+
updatedAt?: Date | undefined;
|
|
359
|
+
slug?: string | undefined;
|
|
360
|
+
images?: string[] | undefined;
|
|
361
|
+
facilities?: string[] | undefined;
|
|
362
|
+
views?: number | undefined;
|
|
363
|
+
hostId?: any;
|
|
364
|
+
adminApproval?: boolean | undefined;
|
|
365
|
+
amenities?: string[] | undefined;
|
|
366
|
+
shortDescription?: string | undefined;
|
|
367
|
+
starRating?: number | undefined;
|
|
368
|
+
openedAt?: Date | undefined;
|
|
369
|
+
managers?: {
|
|
370
|
+
username: string;
|
|
371
|
+
role: "host" | "user";
|
|
372
|
+
userId: string;
|
|
373
|
+
managerRole: string;
|
|
374
|
+
permissions: string[];
|
|
375
|
+
isOwner: boolean;
|
|
376
|
+
_id?: string | undefined;
|
|
377
|
+
addedAt?: Date | undefined;
|
|
378
|
+
}[] | undefined;
|
|
379
|
+
nearbyAreaImages?: string[] | undefined;
|
|
380
|
+
pincode?: string | undefined;
|
|
381
|
+
coordinates?: {
|
|
382
|
+
lat: number;
|
|
383
|
+
lng: number;
|
|
384
|
+
} | undefined;
|
|
385
|
+
nearbyLandmarks?: string[] | undefined;
|
|
386
|
+
roomIds?: string[] | undefined;
|
|
387
|
+
tags?: string[] | undefined;
|
|
388
|
+
houseRules?: string[] | undefined;
|
|
389
|
+
checkInTime?: string | undefined;
|
|
390
|
+
checkOutTime?: string | undefined;
|
|
391
|
+
cancellationPolicy?: string | undefined;
|
|
392
|
+
petsAllowed?: boolean | undefined;
|
|
393
|
+
smokingAllowed?: boolean | undefined;
|
|
394
|
+
instantBook?: boolean | undefined;
|
|
395
|
+
isFeatured?: boolean | undefined;
|
|
396
|
+
chatIds?: string[] | undefined;
|
|
397
|
+
linkedEventIds?: string[] | undefined;
|
|
398
|
+
}, {
|
|
399
|
+
city: string;
|
|
400
|
+
state: string;
|
|
401
|
+
title: string;
|
|
402
|
+
propertyType: string;
|
|
403
|
+
country?: string | undefined;
|
|
404
|
+
status?: "draft" | "archived" | "pending" | "open" | "closed" | "active" | "inactive" | undefined;
|
|
405
|
+
rating?: number | undefined;
|
|
406
|
+
ratingCount?: number | undefined;
|
|
407
|
+
reviewCount?: number | undefined;
|
|
408
|
+
name?: string | undefined;
|
|
409
|
+
address?: string | undefined;
|
|
410
|
+
description?: string | undefined;
|
|
411
|
+
_id?: string | undefined;
|
|
412
|
+
createdAt?: Date | undefined;
|
|
413
|
+
updatedAt?: Date | undefined;
|
|
414
|
+
slug?: string | undefined;
|
|
415
|
+
images?: string[] | undefined;
|
|
416
|
+
facilities?: string[] | undefined;
|
|
417
|
+
views?: number | undefined;
|
|
418
|
+
hostId?: any;
|
|
419
|
+
adminApproval?: boolean | undefined;
|
|
420
|
+
amenities?: string[] | undefined;
|
|
421
|
+
shortDescription?: string | undefined;
|
|
422
|
+
starRating?: number | undefined;
|
|
423
|
+
openedAt?: Date | undefined;
|
|
424
|
+
managers?: {
|
|
425
|
+
username: string;
|
|
426
|
+
role: "host" | "user";
|
|
427
|
+
userId: string;
|
|
428
|
+
permissions: string[];
|
|
429
|
+
_id?: string | undefined;
|
|
430
|
+
managerRole?: string | undefined;
|
|
431
|
+
isOwner?: boolean | undefined;
|
|
432
|
+
addedAt?: Date | undefined;
|
|
433
|
+
}[] | undefined;
|
|
434
|
+
nearbyAreaImages?: string[] | undefined;
|
|
435
|
+
pincode?: string | undefined;
|
|
436
|
+
coordinates?: {
|
|
437
|
+
lat: number;
|
|
438
|
+
lng: number;
|
|
439
|
+
} | undefined;
|
|
440
|
+
nearbyLandmarks?: string[] | undefined;
|
|
441
|
+
roomIds?: string[] | undefined;
|
|
442
|
+
tags?: string[] | undefined;
|
|
443
|
+
houseRules?: string[] | undefined;
|
|
444
|
+
checkInTime?: string | undefined;
|
|
445
|
+
checkOutTime?: string | undefined;
|
|
446
|
+
cancellationPolicy?: string | undefined;
|
|
447
|
+
petsAllowed?: boolean | undefined;
|
|
448
|
+
smokingAllowed?: boolean | undefined;
|
|
449
|
+
instantBook?: boolean | undefined;
|
|
450
|
+
isFeatured?: boolean | undefined;
|
|
451
|
+
chatIds?: string[] | undefined;
|
|
452
|
+
linkedEventIds?: string[] | undefined;
|
|
453
|
+
}>;
|
|
454
|
+
export type Stay = z.infer<typeof StaySchema>;
|
|
455
|
+
export type Property = Stay;
|
|
456
|
+
export declare const stayAmenitiesOptions: string[];
|
|
457
|
+
export declare const stayFacilitiesOptions: string[];
|
|
458
|
+
export declare const roomAmenitiesOptions: string[];
|
|
459
|
+
//# sourceMappingURL=stay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stay.d.ts","sourceRoot":"","sources":["../../../src/lib/models/stay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAalB,CAAC;AAEX,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAQpB,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAC/D,MAAM,MAAM,UAAU,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAGnE,eAAO,MAAM,gBAAgB,6OASnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAc/D,CAAC;AAEF,eAAO,MAAM,wBAAwB;;iBACwC,cAAc,EAAE;GAM5F,CAAC;AAGF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAM5D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAelB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;EASjB,CAAC;AAEX,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAMlB,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCrB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAClD,MAAM,MAAM,IAAI,GAAG,QAAQ,CAAC;AAM5B,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyDrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC9C,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC;AAG5B,eAAO,MAAM,oBAAoB,UAMhC,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAMjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAOhC,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ── Property Type Options ─────────────────────────────────────────────────────
|
|
3
|
+
export const stayTypeOptions = [
|
|
4
|
+
{ value: 'hotel', label: 'Hotel' },
|
|
5
|
+
{ value: 'hostel', label: 'Hostel' },
|
|
6
|
+
{ value: 'homestay', label: 'Homestay' },
|
|
7
|
+
{ value: 'resort', label: 'Resort' },
|
|
8
|
+
{ value: 'guesthouse', label: 'Guesthouse' },
|
|
9
|
+
{ value: 'apartment', label: 'Apartment' },
|
|
10
|
+
{ value: 'villa', label: 'Villa' },
|
|
11
|
+
{ value: 'camping', label: 'Glamping' },
|
|
12
|
+
{ value: 'treehouse', label: 'Treehouse' },
|
|
13
|
+
{ value: 'houseboat', label: 'Houseboat' },
|
|
14
|
+
{ value: 'ngo', label: 'NGO' },
|
|
15
|
+
{ value: 'coworking', label: 'Co-working Space' },
|
|
16
|
+
];
|
|
17
|
+
export const stayStatusOptions = [
|
|
18
|
+
{ value: 'draft', label: 'Draft' },
|
|
19
|
+
{ value: 'pending', label: 'Pending Approval' },
|
|
20
|
+
{ value: 'active', label: 'Active' },
|
|
21
|
+
{ value: 'inactive', label: 'Inactive' },
|
|
22
|
+
{ value: 'open', label: 'Open' },
|
|
23
|
+
{ value: 'closed', label: 'Closed' },
|
|
24
|
+
{ value: 'archived', label: 'Archived' },
|
|
25
|
+
];
|
|
26
|
+
// ── Permissions ───────────────────────────────────────────────────────────────
|
|
27
|
+
export const STAY_PERMISSIONS = [
|
|
28
|
+
'property:read', 'property:write', 'property:delete',
|
|
29
|
+
'opportunity:read', 'opportunity:write',
|
|
30
|
+
'chat:write',
|
|
31
|
+
'rooms:read', 'rooms:write',
|
|
32
|
+
'events:read', 'events:write',
|
|
33
|
+
'packages:approve',
|
|
34
|
+
'managers:manage',
|
|
35
|
+
'analytics:view',
|
|
36
|
+
];
|
|
37
|
+
export const stayPermissionLabels = {
|
|
38
|
+
'property:read': 'View Property Details',
|
|
39
|
+
'property:write': 'Edit Property Details',
|
|
40
|
+
'property:delete': 'Delete Property',
|
|
41
|
+
'opportunity:read': 'View Linked Opportunities',
|
|
42
|
+
'opportunity:write': 'Create/Edit Opportunities',
|
|
43
|
+
'chat:write': 'Create/Manage Chats',
|
|
44
|
+
'rooms:read': 'View Rooms',
|
|
45
|
+
'rooms:write': 'Manage Rooms',
|
|
46
|
+
'events:read': 'View Events',
|
|
47
|
+
'events:write': 'Manage Events',
|
|
48
|
+
'packages:approve': 'Approve Packages',
|
|
49
|
+
'managers:manage': 'Manage Team Members',
|
|
50
|
+
'analytics:view': 'View Analytics',
|
|
51
|
+
};
|
|
52
|
+
export const stayPermissionCategories = [
|
|
53
|
+
{ label: 'Property', permissions: ['property:read', 'property:write'] },
|
|
54
|
+
{ label: 'Opportunities', permissions: ['opportunity:read', 'opportunity:write'] },
|
|
55
|
+
{ label: 'Rooms', permissions: ['rooms:read', 'rooms:write'] },
|
|
56
|
+
{ label: 'Events', permissions: ['events:read', 'events:write'] },
|
|
57
|
+
{ label: 'Communication', permissions: ['chat:write'] },
|
|
58
|
+
{ label: 'Admin', permissions: ['managers:manage', 'analytics:view', 'packages:approve', 'property:delete'] },
|
|
59
|
+
];
|
|
60
|
+
// ── Manager Schema ────────────────────────────────────────────────────────────
|
|
61
|
+
export const StayManagerSchema = z.object({
|
|
62
|
+
_id: z.string().optional(),
|
|
63
|
+
userId: z.string(),
|
|
64
|
+
username: z.string(),
|
|
65
|
+
role: z.enum(['user', 'host']),
|
|
66
|
+
managerRole: z.string().default('operations'),
|
|
67
|
+
permissions: z.array(z.string()),
|
|
68
|
+
isOwner: z.boolean().default(false),
|
|
69
|
+
addedAt: z.date().optional(),
|
|
70
|
+
});
|
|
71
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
72
|
+
// ROOM — Standalone entity linked to a Property via propertyId
|
|
73
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
74
|
+
export const roomTypeOptions = [
|
|
75
|
+
{ value: 'single', label: 'Single Room' },
|
|
76
|
+
{ value: 'double', label: 'Double Room' },
|
|
77
|
+
{ value: 'twin', label: 'Twin Room' },
|
|
78
|
+
{ value: 'suite', label: 'Suite' },
|
|
79
|
+
{ value: 'deluxe', label: 'Deluxe Room' },
|
|
80
|
+
{ value: 'family', label: 'Family Room' },
|
|
81
|
+
{ value: 'dorm-mixed', label: 'Dorm (Mixed)' },
|
|
82
|
+
{ value: 'dorm-female', label: 'Dorm (Female)' },
|
|
83
|
+
{ value: 'dorm-male', label: 'Dorm (Male)' },
|
|
84
|
+
{ value: 'cottage', label: 'Cottage' },
|
|
85
|
+
{ value: 'tent', label: 'Tent / Glamping' },
|
|
86
|
+
{ value: 'penthouse', label: 'Penthouse' },
|
|
87
|
+
{ value: 'studio', label: 'Studio' },
|
|
88
|
+
{ value: 'villa', label: 'Villa' },
|
|
89
|
+
];
|
|
90
|
+
export const bedTypeOptions = [
|
|
91
|
+
{ value: 'single', label: 'Single Bed' },
|
|
92
|
+
{ value: 'double', label: 'Double Bed' },
|
|
93
|
+
{ value: 'queen', label: 'Queen Bed' },
|
|
94
|
+
{ value: 'king', label: 'King Bed' },
|
|
95
|
+
{ value: 'twin', label: 'Twin Beds' },
|
|
96
|
+
{ value: 'bunk', label: 'Bunk Bed' },
|
|
97
|
+
{ value: 'sofa-bed', label: 'Sofa Bed' },
|
|
98
|
+
{ value: 'futon', label: 'Futon' },
|
|
99
|
+
];
|
|
100
|
+
export const mealPlanOptions = [
|
|
101
|
+
{ value: 'none', label: 'No Meals' },
|
|
102
|
+
{ value: 'breakfast', label: 'Breakfast Included' },
|
|
103
|
+
{ value: 'half-board', label: 'Half Board (Breakfast + Dinner)' },
|
|
104
|
+
{ value: 'full-board', label: 'Full Board (All Meals)' },
|
|
105
|
+
{ value: 'all-inclusive', label: 'All Inclusive' },
|
|
106
|
+
];
|
|
107
|
+
export const RoomSchema = z.object({
|
|
108
|
+
_id: z.string().optional(),
|
|
109
|
+
propertyId: z.string(),
|
|
110
|
+
// Core
|
|
111
|
+
roomType: z.string(),
|
|
112
|
+
name: z.string(),
|
|
113
|
+
slug: z.string().optional(),
|
|
114
|
+
description: z.string().optional(),
|
|
115
|
+
// Pricing
|
|
116
|
+
pricePerNight: z.number(),
|
|
117
|
+
currency: z.string().default('INR'),
|
|
118
|
+
// Capacity
|
|
119
|
+
maxAdults: z.number().default(2),
|
|
120
|
+
maxChildren: z.number().default(0),
|
|
121
|
+
maxOccupancy: z.number().default(2),
|
|
122
|
+
totalRooms: z.number().default(1),
|
|
123
|
+
availableRooms: z.number().optional(),
|
|
124
|
+
// Details
|
|
125
|
+
bedType: z.string().optional(),
|
|
126
|
+
bathType: z.enum(['private', 'shared']).default('private'),
|
|
127
|
+
roomSize: z.string().optional(),
|
|
128
|
+
view: z.string().optional(),
|
|
129
|
+
mealPlan: z.string().optional(),
|
|
130
|
+
floorLevel: z.string().optional(),
|
|
131
|
+
// Media
|
|
132
|
+
images: z.array(z.string()).optional(),
|
|
133
|
+
amenities: z.array(z.string()).optional(),
|
|
134
|
+
// Status
|
|
135
|
+
isAvailable: z.boolean().default(true),
|
|
136
|
+
status: z.enum(['active', 'inactive', 'draft']).default('active'),
|
|
137
|
+
createdAt: z.date().optional(),
|
|
138
|
+
updatedAt: z.date().optional(),
|
|
139
|
+
});
|
|
140
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
141
|
+
// PROPERTY — Property-level details (no embedded rooms)
|
|
142
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
143
|
+
export const StaySchema = z.object({
|
|
144
|
+
_id: z.string().optional(),
|
|
145
|
+
title: z.string(),
|
|
146
|
+
name: z.string().optional(),
|
|
147
|
+
slug: z.string().optional(),
|
|
148
|
+
description: z.string().optional(),
|
|
149
|
+
shortDescription: z.string().optional(),
|
|
150
|
+
propertyType: z.string(),
|
|
151
|
+
starRating: z.number().min(1).max(5).optional(),
|
|
152
|
+
status: z.enum(['draft', 'pending', 'active', 'inactive', 'open', 'closed', 'archived']).optional(),
|
|
153
|
+
openedAt: z.date().optional(),
|
|
154
|
+
hostId: z.any(),
|
|
155
|
+
managers: z.array(StayManagerSchema).optional(),
|
|
156
|
+
images: z.array(z.string()).optional(),
|
|
157
|
+
nearbyAreaImages: z.array(z.string()).optional(),
|
|
158
|
+
// Location
|
|
159
|
+
address: z.string().optional(),
|
|
160
|
+
city: z.string(),
|
|
161
|
+
state: z.string(),
|
|
162
|
+
country: z.string().default('India'),
|
|
163
|
+
pincode: z.string().optional(),
|
|
164
|
+
coordinates: z.object({ lat: z.number(), lng: z.number() }).optional(),
|
|
165
|
+
nearbyLandmarks: z.array(z.string()).optional(),
|
|
166
|
+
// Linked room IDs (optional cache — rooms are fetched separately)
|
|
167
|
+
roomIds: z.array(z.string()).optional(),
|
|
168
|
+
// Property-level amenities, facilities & policies
|
|
169
|
+
amenities: z.array(z.string()).optional(),
|
|
170
|
+
facilities: z.array(z.string()).optional(),
|
|
171
|
+
tags: z.array(z.string()).optional(),
|
|
172
|
+
houseRules: z.array(z.string()).optional(),
|
|
173
|
+
checkInTime: z.string().optional(),
|
|
174
|
+
checkOutTime: z.string().optional(),
|
|
175
|
+
cancellationPolicy: z.string().optional(),
|
|
176
|
+
petsAllowed: z.boolean().optional(),
|
|
177
|
+
smokingAllowed: z.boolean().optional(),
|
|
178
|
+
instantBook: z.boolean().optional(),
|
|
179
|
+
// Stats
|
|
180
|
+
rating: z.number().optional(),
|
|
181
|
+
ratingCount: z.number().optional(),
|
|
182
|
+
reviewCount: z.number().optional(),
|
|
183
|
+
views: z.number().optional(),
|
|
184
|
+
isFeatured: z.boolean().optional(),
|
|
185
|
+
adminApproval: z.boolean().optional(),
|
|
186
|
+
// Future linking
|
|
187
|
+
chatIds: z.array(z.string()).optional(),
|
|
188
|
+
linkedEventIds: z.array(z.string()).optional(),
|
|
189
|
+
createdAt: z.date().optional(),
|
|
190
|
+
updatedAt: z.date().optional(),
|
|
191
|
+
});
|
|
192
|
+
// ── Amenity & Facility options ────────────────────────────────────────────────
|
|
193
|
+
export const stayAmenitiesOptions = [
|
|
194
|
+
'Free WiFi', 'Swimming Pool', 'Spa', 'Gym', 'Restaurant', 'Bar',
|
|
195
|
+
'Parking', 'Air Conditioning', 'Breakfast', 'Room Service',
|
|
196
|
+
'Concierge', 'Laundry', 'Yoga Deck', 'Beach Access',
|
|
197
|
+
'Private Pool', 'Hot Tub', '24/7 Security', 'Airport Shuttle',
|
|
198
|
+
'EV Charging', 'Pet Friendly', 'CCTV', 'Kitchen', 'Garden',
|
|
199
|
+
];
|
|
200
|
+
export const stayFacilitiesOptions = [
|
|
201
|
+
'Conference Room', 'Co-working Space', 'Library', 'Rooftop Terrace',
|
|
202
|
+
'Banquet Hall', 'Kids Play Area', 'Bicycle Rental', 'Car Rental Desk',
|
|
203
|
+
'Travel Desk', 'Medical Aid', 'ATM', 'Gift Shop', 'Bonfire Area',
|
|
204
|
+
'Meditation Hall', 'Art Studio', 'Music Room', 'Organic Farm',
|
|
205
|
+
'Water Sports', 'Adventure Desk', 'Craft Workshop',
|
|
206
|
+
];
|
|
207
|
+
export const roomAmenitiesOptions = [
|
|
208
|
+
'AC', 'Free WiFi', 'TV', 'Hot Water', 'Bathtub', 'Minibar',
|
|
209
|
+
'Minifridge', 'Netflix', 'Sea View', 'Mountain View', 'Garden View',
|
|
210
|
+
'Balcony', 'Kitchenette', 'Washing Machine', 'Workspace',
|
|
211
|
+
'Locker', 'Reading Light', 'Power Socket', 'Heating',
|
|
212
|
+
'Hairdryer', 'Meals Included', 'Rainfall Shower', 'Fire Pit',
|
|
213
|
+
'Outdoor Shower', 'Mosquito Net', 'Fan',
|
|
214
|
+
];
|