@levo-so/site-runtime 0.3.27 → 0.3.29
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/CHANGELOG.md +28 -1
- package/index.js +142 -117
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,39 @@
|
|
|
1
1
|
# @levo-so/site-runtime
|
|
2
2
|
|
|
3
|
+
## 0.3.29
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Verification-code boxes built on `useLevoOtpInput` no longer jump back after a digit. Typing a digit moved focus to the next box, but that box still saw the code from before the digit and sent focus back to the box just filled, selected, so the next digit typed over it. Focus now moves forward one box per digit, as it should. Pasting a code, backspace and the arrow keys behave as before. Nothing to change in site code.
|
|
8
|
+
- The multi-ticket cart (`LevoEventRegister` with `enableMultipleTicketBooking`) respects a ticket's per-account registration limit within the order. When one email repeats on a ticket more often than its `max_registrations_per_account` allows, the extra attendee's email field shows "This ticket allows N per email. Use a different email." and the order cannot go on until it changes. Before, the order went through to Pay and the server refused it there.
|
|
9
|
+
|
|
10
|
+
- Emails are compared ignoring case and surrounding spaces, as the server does.
|
|
11
|
+
- The first N attendees on a ticket stay valid and only the extras are flagged, so the error lands on the entry just typed.
|
|
12
|
+
- An email that is missing or malformed keeps that error first.
|
|
13
|
+
- Only this order is counted. Registrations made earlier are still checked by the server at Pay ("Registration limit reached").
|
|
14
|
+
- A ticket with no limit is never flagged. The one-ticket sheet is unchanged.
|
|
15
|
+
|
|
16
|
+
Nothing to change in site code.
|
|
17
|
+
|
|
18
|
+
- Updated dependencies
|
|
19
|
+
- @levo-so/core@0.3.29
|
|
20
|
+
- @levo-so/insights@0.3.29
|
|
21
|
+
|
|
22
|
+
## 0.3.28
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- Collection field public visibility flags synced with backend architecture
|
|
27
|
+
- @levo-so/core@0.3.28
|
|
28
|
+
- @levo-so/insights@0.3.28
|
|
29
|
+
|
|
3
30
|
## 0.3.27
|
|
4
31
|
|
|
5
32
|
### Patch Changes
|
|
6
33
|
|
|
7
34
|
- Event registration suggests the event's public coupons and applies the best one on its own. It works in both the one-ticket sheet and the multi-ticket cart, and needs no new props or backend change: it uses the existing public-coupon list and coupon validation. **A visible change on every site that sells paid tickets.** Nothing to change in site code.
|
|
8
35
|
|
|
9
|
-
- **The best public coupon
|
|
36
|
+
- **The best public coupon applies on its own once the server accepts it.** "Finding your best offer…" holds its place while it validates, then a green banner shows the code and the saving. A failed auto-apply stays silent and leaves the price as it was.
|
|
10
37
|
- **The other public coupons the order qualifies for show as cards with their saving worked out**, e.g. "Save ₹300 · 10% off, up to ₹300". With nothing applied, the top card is marked "Best". Once a coupon is applied, the rest fold under "N more offers", and "Switch" moves to one of them.
|
|
11
38
|
- **Only coupons the order qualifies for are offered.** Archived, not-yet-started, expired and fully redeemed coupons are left out, as are coupons whose minimum order is not met and coupons that cover none of the chosen tickets. Offers are ranked by estimated saving, capped at the coupon's maximum discount. The applied banner always shows the server's figure, not the estimate.
|
|
12
39
|
- **Typing a code still works**, under "Have a code?", or "Have a different code?" once a coupon is applied. It is the only way to use a private code. A code that fails shows an inline error and leaves the applied coupon in place. Codes are upper-cased before they are checked.
|
package/index.js
CHANGED
|
@@ -666,78 +666,83 @@ var q = ["levo-auth", "session"], nt = () => {
|
|
|
666
666
|
}, kt = (e) => /^\+[1-9]\d{7,14}$/.test(Ot(e)), At = ({ value: e, onChange: t, length: n = 4, onComplete: r, autoFocus: i, disabled: a }) => {
|
|
667
667
|
let o = k([]), [s, c] = A(null), l = k(r);
|
|
668
668
|
l.current = r;
|
|
669
|
-
let u =
|
|
669
|
+
let u = k(e);
|
|
670
|
+
D(() => {
|
|
671
|
+
u.current = e;
|
|
672
|
+
});
|
|
673
|
+
let d = Array.from({ length: n }, (t, n) => e[n] ?? ""), f = w((e) => {
|
|
670
674
|
let t = Math.max(0, Math.min(n - 1, e)), r = o.current[t];
|
|
671
675
|
r?.focus(), r?.select();
|
|
672
676
|
}, [n]);
|
|
673
677
|
E(() => {
|
|
674
|
-
i && !a &&
|
|
678
|
+
i && !a && f(0);
|
|
675
679
|
}, [
|
|
676
680
|
i,
|
|
677
681
|
a,
|
|
678
|
-
|
|
682
|
+
f
|
|
679
683
|
]);
|
|
680
|
-
let
|
|
684
|
+
let p = w((e, r) => {
|
|
681
685
|
let i = e.slice(0, n);
|
|
682
|
-
t(i),
|
|
686
|
+
u.current = i, t(i), f(r), i.length === n && l.current?.(i);
|
|
683
687
|
}, [
|
|
684
688
|
n,
|
|
685
689
|
t,
|
|
686
|
-
|
|
687
|
-
]),
|
|
690
|
+
f
|
|
691
|
+
]), m = (t, r) => {
|
|
688
692
|
let i = r.replace(/\D/g, "");
|
|
689
693
|
if (!i) return;
|
|
690
694
|
if (i.length > 1) {
|
|
691
695
|
let r = (e.slice(0, t) + i).slice(0, n);
|
|
692
|
-
|
|
696
|
+
p(r, r.length);
|
|
693
697
|
return;
|
|
694
698
|
}
|
|
695
|
-
let a = [...
|
|
696
|
-
a[t] = i,
|
|
697
|
-
},
|
|
699
|
+
let a = [...d];
|
|
700
|
+
a[t] = i, p(a.join("").slice(0, Math.max(t + 1, e.length)), t + 1);
|
|
701
|
+
}, h = (t, n) => {
|
|
698
702
|
if (n.key === "Backspace") {
|
|
699
703
|
n.preventDefault();
|
|
700
|
-
let r =
|
|
704
|
+
let r = d[t] ? t : t - 1;
|
|
701
705
|
if (r < 0) return;
|
|
702
|
-
|
|
706
|
+
p(e.slice(0, r), r);
|
|
703
707
|
return;
|
|
704
708
|
}
|
|
705
709
|
if (n.key === "ArrowLeft") {
|
|
706
|
-
n.preventDefault(),
|
|
710
|
+
n.preventDefault(), f(t - 1);
|
|
707
711
|
return;
|
|
708
712
|
}
|
|
709
|
-
n.key === "ArrowRight" && (n.preventDefault(),
|
|
710
|
-
},
|
|
713
|
+
n.key === "ArrowRight" && (n.preventDefault(), f(Math.min(t + 1, e.length)));
|
|
714
|
+
}, g = (e) => {
|
|
711
715
|
e.preventDefault();
|
|
712
716
|
let t = e.clipboardData.getData("text").replace(/\D/g, "");
|
|
713
717
|
if (!t) return;
|
|
714
718
|
let r = t.slice(0, n);
|
|
715
|
-
|
|
719
|
+
p(r, r.length);
|
|
716
720
|
};
|
|
717
721
|
return {
|
|
718
|
-
slots:
|
|
719
|
-
char:
|
|
720
|
-
isActive: s ===
|
|
722
|
+
slots: d.map((e, t) => ({
|
|
723
|
+
char: e,
|
|
724
|
+
isActive: s === t,
|
|
721
725
|
inputProps: {
|
|
722
726
|
ref: (e) => {
|
|
723
|
-
o.current[
|
|
727
|
+
o.current[t] = e;
|
|
724
728
|
},
|
|
725
|
-
value:
|
|
729
|
+
value: e,
|
|
726
730
|
inputMode: "numeric",
|
|
727
|
-
autoComplete:
|
|
731
|
+
autoComplete: t === 0 ? "one-time-code" : "off",
|
|
728
732
|
type: "text",
|
|
729
|
-
"aria-label": `Digit ${
|
|
730
|
-
onChange: (e) =>
|
|
731
|
-
onKeyDown: (e) =>
|
|
732
|
-
onPaste:
|
|
733
|
+
"aria-label": `Digit ${t + 1} of ${n}`,
|
|
734
|
+
onChange: (e) => m(t, e.target.value),
|
|
735
|
+
onKeyDown: (e) => h(t, e),
|
|
736
|
+
onPaste: g,
|
|
733
737
|
onFocus: () => {
|
|
734
|
-
|
|
735
|
-
|
|
738
|
+
let e = u.current;
|
|
739
|
+
if (t > e.length) {
|
|
740
|
+
f(e.length);
|
|
736
741
|
return;
|
|
737
742
|
}
|
|
738
|
-
c(
|
|
743
|
+
c(t);
|
|
739
744
|
},
|
|
740
|
-
onBlur: () => c((e) => e ===
|
|
745
|
+
onBlur: () => c((e) => e === t ? null : e),
|
|
741
746
|
disabled: a
|
|
742
747
|
}
|
|
743
748
|
})),
|
|
@@ -745,7 +750,7 @@ var q = ["levo-auth", "session"], nt = () => {
|
|
|
745
750
|
role: "group",
|
|
746
751
|
"aria-label": `${n}-digit verification code`
|
|
747
752
|
},
|
|
748
|
-
clear: w(() =>
|
|
753
|
+
clear: w(() => p("", 0), [p])
|
|
749
754
|
};
|
|
750
755
|
}, jt = C(() => import("./kbChat-eFsau7hG.js")), Mt = ({ site: e, path: t }) => {
|
|
751
756
|
let n = K(), r = e.workspace_id || void 0;
|
|
@@ -3158,12 +3163,21 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3158
3163
|
];
|
|
3159
3164
|
for (let [e, i] of r) t[e] !== "off" && i && (n[e] = i);
|
|
3160
3165
|
return n;
|
|
3161
|
-
}, vi = (e
|
|
3166
|
+
}, vi = (e) => {
|
|
3167
|
+
let t = {}, n = /* @__PURE__ */ new Map();
|
|
3168
|
+
for (let r of e) {
|
|
3169
|
+
let e = r.ticket.max_registrations_per_account, i = r.email.trim().toLowerCase();
|
|
3170
|
+
if (!e || !i) continue;
|
|
3171
|
+
let a = `${r.ticket._id}|${i}`, o = (n.get(a) ?? 0) + 1;
|
|
3172
|
+
n.set(a, o), o > e && (t[r.key] = `This ticket allows ${e} per email. Use a different email.`);
|
|
3173
|
+
}
|
|
3174
|
+
return t;
|
|
3175
|
+
}, yi = (e, t) => {
|
|
3162
3176
|
let n = {};
|
|
3163
3177
|
e.name.trim() || (n.name = "Please enter your name"), t.email !== "off" && (e.email.trim() ? /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(e.email.trim()) || (n.email = "That email address doesn't look right") : t.email === "required" && (n.email = "Please enter your email")), t.mobile !== "off" && (e.mobile.trim() ? gi(e.mobile) || (n.mobile = "That doesn't look like a valid phone number") : t.mobile === "required" && (n.mobile = "Please enter your phone number"));
|
|
3164
3178
|
for (let r of ["organization", "designation"]) t[r] === "required" && !e[r].trim() && (n[r] = `Please enter your ${r}`);
|
|
3165
3179
|
return n;
|
|
3166
|
-
},
|
|
3180
|
+
}, bi = (e) => e.quantity === null || e.quantity === void 0 ? 10 : Math.max(0, Math.min(10, e.quantity - (e.sale_count ?? 0))), xi = "inline-flex size-8 items-center justify-center rounded-full border border-border text-ink transition hover:border-brand hover:text-brand active:scale-95 disabled:pointer-events-none disabled:opacity-35", Si = ({ tickets: e, counts: t, onChange: n, error: r }) => /* @__PURE__ */ N("fieldset", {
|
|
3167
3181
|
className: "m-0 flex min-w-0 flex-col gap-2 border-0 p-0",
|
|
3168
3182
|
children: [
|
|
3169
3183
|
/* @__PURE__ */ M("legend", {
|
|
@@ -3171,7 +3185,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3171
3185
|
children: "Choose your tickets"
|
|
3172
3186
|
}),
|
|
3173
3187
|
e.map((e) => {
|
|
3174
|
-
let r = t[e._id] ?? 0, i =
|
|
3188
|
+
let r = t[e._id] ?? 0, i = bi(e), a = i === 0, o = Br(e);
|
|
3175
3189
|
return /* @__PURE__ */ N("div", {
|
|
3176
3190
|
className: X("flex w-full items-start gap-3 rounded-xl border px-3.5 py-3 transition", r > 0 ? "border-brand bg-brand/5" : "border-border", a && "opacity-60"),
|
|
3177
3191
|
children: [/* @__PURE__ */ N("div", {
|
|
@@ -3207,7 +3221,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3207
3221
|
"aria-label": `Remove one ${e.title} ticket`,
|
|
3208
3222
|
disabled: r === 0,
|
|
3209
3223
|
onClick: () => n(e._id, r - 1),
|
|
3210
|
-
className:
|
|
3224
|
+
className: xi,
|
|
3211
3225
|
children: /* @__PURE__ */ M(le, { className: "size-3.5" })
|
|
3212
3226
|
}),
|
|
3213
3227
|
/* @__PURE__ */ N("span", {
|
|
@@ -3223,7 +3237,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3223
3237
|
"aria-label": `Add one ${e.title} ticket`,
|
|
3224
3238
|
disabled: r >= i,
|
|
3225
3239
|
onClick: () => n(e._id, r + 1),
|
|
3226
|
-
className:
|
|
3240
|
+
className: xi,
|
|
3227
3241
|
children: /* @__PURE__ */ M(ue, { className: "size-3.5" })
|
|
3228
3242
|
})
|
|
3229
3243
|
]
|
|
@@ -3262,13 +3276,13 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3262
3276
|
country: ""
|
|
3263
3277
|
}
|
|
3264
3278
|
}
|
|
3265
|
-
},
|
|
3279
|
+
}, Ci = {
|
|
3266
3280
|
name: !0,
|
|
3267
3281
|
email: !0,
|
|
3268
3282
|
mobile: !0,
|
|
3269
3283
|
organization: !0,
|
|
3270
3284
|
designation: !0
|
|
3271
|
-
},
|
|
3285
|
+
}, wi = (e, t) => {
|
|
3272
3286
|
let [n, r] = A(Q), [i, a] = A({}), [o, s] = A(!1), c = k(!1);
|
|
3273
3287
|
E(() => {
|
|
3274
3288
|
c.current || !e || (c.current = !0, r((t) => ({
|
|
@@ -3277,7 +3291,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3277
3291
|
email: t.email || e.email || ""
|
|
3278
3292
|
})));
|
|
3279
3293
|
}, [e]);
|
|
3280
|
-
let l =
|
|
3294
|
+
let l = yi(n, t), u = w((e, t) => r((n) => ({
|
|
3281
3295
|
...n,
|
|
3282
3296
|
[e]: t
|
|
3283
3297
|
})), []), d = w((e) => a((t) => ({
|
|
@@ -3298,9 +3312,9 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3298
3312
|
touchField: d,
|
|
3299
3313
|
reset: f,
|
|
3300
3314
|
resetValidationDisplay: p,
|
|
3301
|
-
touched: o ?
|
|
3315
|
+
touched: o ? Ci : i
|
|
3302
3316
|
};
|
|
3303
|
-
},
|
|
3317
|
+
}, Ti = (e, t, n) => {
|
|
3304
3318
|
let [r, i] = A({}), [a, o] = A({}), [s, c] = A({
|
|
3305
3319
|
is_business_purchase: Q.is_business_purchase,
|
|
3306
3320
|
billing_details: Q.billing_details
|
|
@@ -3324,7 +3338,16 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3324
3338
|
}, [e, p]);
|
|
3325
3339
|
let m = (e) => r[e] ?? Q, h = O(() => {
|
|
3326
3340
|
let e = {};
|
|
3327
|
-
for (let t of f) e[t.key] =
|
|
3341
|
+
for (let t of f) e[t.key] = yi(r[t.key] ?? Q, t.rules);
|
|
3342
|
+
let t = vi(f.map((e) => ({
|
|
3343
|
+
key: e.key,
|
|
3344
|
+
ticket: e.ticket,
|
|
3345
|
+
email: (r[e.key] ?? Q).email
|
|
3346
|
+
})));
|
|
3347
|
+
for (let [n, r] of Object.entries(t)) {
|
|
3348
|
+
let t = e[n];
|
|
3349
|
+
t && !t.email && (t.email = r);
|
|
3350
|
+
}
|
|
3328
3351
|
return e;
|
|
3329
3352
|
}, [f, r]), g = (e) => Object.keys(h[e] ?? {}).length === 0, _ = w((e, t, n) => i((r) => ({
|
|
3330
3353
|
...r,
|
|
@@ -3340,7 +3363,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3340
3363
|
}
|
|
3341
3364
|
})), []), y = w((e) => o((t) => ({
|
|
3342
3365
|
...t,
|
|
3343
|
-
[e]:
|
|
3366
|
+
[e]: Ci
|
|
3344
3367
|
})), []), b = w((e, t) => c((n) => ({
|
|
3345
3368
|
...n,
|
|
3346
3369
|
[e]: t
|
|
@@ -3358,7 +3381,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3358
3381
|
errors: h,
|
|
3359
3382
|
isSlotValid: g,
|
|
3360
3383
|
isValid: f.every((e) => g(e.key)),
|
|
3361
|
-
getTouched: (e) => l ?
|
|
3384
|
+
getTouched: (e) => l ? Ci : a[e] ?? {},
|
|
3362
3385
|
isSlotVisited: (e) => l || !!a[e],
|
|
3363
3386
|
submitAttempted: l,
|
|
3364
3387
|
markSubmitted: () => u(!0),
|
|
@@ -3370,20 +3393,20 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3370
3393
|
reset: x,
|
|
3371
3394
|
resetValidationDisplay: S
|
|
3372
3395
|
};
|
|
3373
|
-
},
|
|
3374
|
-
if (e.status === "archived" || e.starts_at && new Date(e.starts_at).getTime() > n || e.expires_at && new Date(e.expires_at).getTime() < n || e.max_redemptions && e.redeem_count >= e.max_redemptions || e.min_trnx_amount &&
|
|
3375
|
-
let r = e.tickets.map(
|
|
3396
|
+
}, Ei = (e) => typeof e == "string" ? e : e._id, Di = (e) => e.reduce((e, t) => e + (t.unit_amount ?? 0), 0), Oi = (e, t, n = Date.now()) => e.flatMap((e) => {
|
|
3397
|
+
if (e.status === "archived" || e.starts_at && new Date(e.starts_at).getTime() > n || e.expires_at && new Date(e.expires_at).getTime() < n || e.max_redemptions && e.redeem_count >= e.max_redemptions || e.min_trnx_amount && Di(t) < e.min_trnx_amount) return [];
|
|
3398
|
+
let r = e.tickets.map(Ei), i = Di(t.filter((e) => r.includes(e._id))), a = e.kind === "percent" ? Math.round(i * (e.percent_off ?? 0) / 100) : Math.min(e.amount_off ?? 0, i), o = e.max_amount_off ? Math.min(a, e.max_amount_off) : a;
|
|
3376
3399
|
return o > 0 ? [{
|
|
3377
3400
|
coupon: e,
|
|
3378
3401
|
saving: o
|
|
3379
3402
|
}] : [];
|
|
3380
|
-
}).sort((e, t) => t.saving - e.saving),
|
|
3381
|
-
let r = i(), a = t.map((e) => e._id).join(","), [o, s] = A(null), [c, l] = A(null), [u, d] = A(null), [f, p] = A(
|
|
3403
|
+
}).sort((e, t) => t.saving - e.saving), ki = ({ eventID: e, tickets: t, enabled: n }) => {
|
|
3404
|
+
let r = i(), a = t.map((e) => e._id).join(","), [o, s] = A(null), [c, l] = A(null), [u, d] = A(null), [f, p] = A(null), m = k(0), h = k(null), g = Oi(f ?? [], t), _ = g[0]?.coupon.code;
|
|
3382
3405
|
E(() => {
|
|
3383
3406
|
!n || !e || !r || r.fetch?.url(`/v1/event/event/${e}/coupon/list-public-coupons`)?.get().json().then((e) => {
|
|
3384
|
-
e?.status
|
|
3407
|
+
p(e?.status ? e.content?.data ?? [] : []);
|
|
3385
3408
|
}).catch((e) => {
|
|
3386
|
-
r.logger?.error("Failed to fetch public coupons", { exception: b(e) });
|
|
3409
|
+
p([]), r.logger?.error("Failed to fetch public coupons", { exception: b(e) });
|
|
3387
3410
|
});
|
|
3388
3411
|
}, [
|
|
3389
3412
|
n,
|
|
@@ -3433,8 +3456,8 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3433
3456
|
a,
|
|
3434
3457
|
v
|
|
3435
3458
|
]);
|
|
3436
|
-
let y = w(() => {
|
|
3437
|
-
m.current += 1, l(null), s(null), d(null);
|
|
3459
|
+
let y = w(({ rearm: e = !1 } = {}) => {
|
|
3460
|
+
e && (h.current = null), m.current += 1, l(null), s(null), d(null);
|
|
3438
3461
|
}, []);
|
|
3439
3462
|
return {
|
|
3440
3463
|
applied: o,
|
|
@@ -3442,16 +3465,17 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3442
3465
|
pending: c,
|
|
3443
3466
|
error: u,
|
|
3444
3467
|
offers: g,
|
|
3468
|
+
isFindingBestOffer: n && !!e && !!r && (f === null || !!c?.auto),
|
|
3445
3469
|
apply: v,
|
|
3446
3470
|
reset: y
|
|
3447
3471
|
};
|
|
3448
|
-
},
|
|
3472
|
+
}, Ai = async (e, t) => {
|
|
3449
3473
|
let n = new URLSearchParams();
|
|
3450
3474
|
return n.append("query", JSON.stringify({ where: { status: "active" } })), (await e.fetch?.url(`/v1/event/event/${t}/ticket/query?${n.toString()}`).get().json())?.content?.data ?? [];
|
|
3451
|
-
},
|
|
3475
|
+
}, ji = ({ eventID: e, external: t }) => {
|
|
3452
3476
|
let n = i(), [r, a] = A([]), [o, s] = A(!t), [c, l] = A(!1), [u, d] = A(null);
|
|
3453
3477
|
return E(() => {
|
|
3454
|
-
t || !e || !n || (s(!0), l(!1),
|
|
3478
|
+
t || !e || !n || (s(!0), l(!1), Ai(n, e).then((e) => {
|
|
3455
3479
|
a(e), e.length === 1 && d(e[0] ?? null);
|
|
3456
3480
|
}).catch((e) => {
|
|
3457
3481
|
l(!0), n.logger?.error("Failed to load event tickets", { exception: b(e) });
|
|
@@ -3467,7 +3491,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3467
3491
|
selectedTicket: u,
|
|
3468
3492
|
selectTicket: d
|
|
3469
3493
|
};
|
|
3470
|
-
},
|
|
3494
|
+
}, Mi = async (e) => {
|
|
3471
3495
|
let { payment_session_id: t, order_id: n } = e;
|
|
3472
3496
|
if (!t || !n) throw Error("Cashfree payment session missing");
|
|
3473
3497
|
let { load: r } = await import("./script.esm-D4nvz3-k.js"), i = await r({ mode: e.environment || "production" });
|
|
@@ -3483,7 +3507,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3483
3507
|
status: "closed",
|
|
3484
3508
|
message: a.error?.message
|
|
3485
3509
|
};
|
|
3486
|
-
},
|
|
3510
|
+
}, Ni = () => typeof window < "u" && "Razorpay" in window, Pi = ({ order: e, onSettled: t, onError: n }) => {
|
|
3487
3511
|
let { Razorpay: r, isLoading: i, error: a } = fe(), o = k({
|
|
3488
3512
|
onSettled: t,
|
|
3489
3513
|
onError: n
|
|
@@ -3499,7 +3523,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3499
3523
|
s.current = !0, o.current.onError(Error(a));
|
|
3500
3524
|
return;
|
|
3501
3525
|
}
|
|
3502
|
-
if (!r || !
|
|
3526
|
+
if (!r || !Ni()) return;
|
|
3503
3527
|
s.current = !0;
|
|
3504
3528
|
let t;
|
|
3505
3529
|
try {
|
|
@@ -3537,7 +3561,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3537
3561
|
a,
|
|
3538
3562
|
e
|
|
3539
3563
|
]), null;
|
|
3540
|
-
},
|
|
3564
|
+
}, Fi = ({ stripePromise: e, clientSecret: t, onClose: n, onComplete: r }) => {
|
|
3541
3565
|
let i = k(r);
|
|
3542
3566
|
i.current = r;
|
|
3543
3567
|
let a = O(() => ({
|
|
@@ -3565,9 +3589,9 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3565
3589
|
})]
|
|
3566
3590
|
})] })
|
|
3567
3591
|
});
|
|
3568
|
-
},
|
|
3592
|
+
}, Ii = () => {
|
|
3569
3593
|
let [e, t] = A(null), n = w(async (e, n) => {
|
|
3570
|
-
if (e.provider === "cashfree") return
|
|
3594
|
+
if (e.provider === "cashfree") return Mi(e);
|
|
3571
3595
|
if (e.provider === "stripe") {
|
|
3572
3596
|
let { client_secret: n, session_id: r } = e;
|
|
3573
3597
|
if (!n || !r) throw Error("Stripe checkout session missing");
|
|
@@ -3601,7 +3625,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3601
3625
|
}, []), r = (e, n) => {
|
|
3602
3626
|
t(null), n instanceof Error ? e.settle.reject(n) : e.settle.resolve(n);
|
|
3603
3627
|
}, i = null;
|
|
3604
|
-
return e?.provider === "stripe" ? i = /* @__PURE__ */ M(
|
|
3628
|
+
return e?.provider === "stripe" ? i = /* @__PURE__ */ M(Fi, {
|
|
3605
3629
|
stripePromise: e.stripePromise,
|
|
3606
3630
|
clientSecret: e.clientSecret,
|
|
3607
3631
|
onComplete: () => r(e, {
|
|
@@ -3609,7 +3633,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3609
3633
|
confirmation: { session_id: e.sessionId }
|
|
3610
3634
|
}),
|
|
3611
3635
|
onClose: () => r(e, { status: "closed" })
|
|
3612
|
-
}) : e?.provider === "razorpay" && (i = /* @__PURE__ */ M(
|
|
3636
|
+
}) : e?.provider === "razorpay" && (i = /* @__PURE__ */ M(Pi, {
|
|
3613
3637
|
order: e.order,
|
|
3614
3638
|
onSettled: (t) => r(e, t),
|
|
3615
3639
|
onError: (t) => r(e, t)
|
|
@@ -3623,8 +3647,8 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3623
3647
|
providerUnreachable: "We couldn't reach the payment provider. Check your connection and try again.",
|
|
3624
3648
|
confirmationFailed: "We couldn't confirm your payment. Your details are saved — try again.",
|
|
3625
3649
|
generic: "Something went wrong. Please try again."
|
|
3626
|
-
},
|
|
3627
|
-
let r = i(), a =
|
|
3650
|
+
}, Li = (e) => !!e && e.status !== "requires_payment", Ri = ({ eventID: e, details: t, onConfirmed: n }) => {
|
|
3651
|
+
let r = i(), a = Ii(), [o, s] = A({ kind: "idle" }), c = k({
|
|
3628
3652
|
details: t,
|
|
3629
3653
|
onConfirmed: n
|
|
3630
3654
|
});
|
|
@@ -3640,7 +3664,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3640
3664
|
message: t
|
|
3641
3665
|
}), d = async (e, t) => {
|
|
3642
3666
|
if (!t?.key) {
|
|
3643
|
-
|
|
3667
|
+
Li(e) ? l(e) : s({
|
|
3644
3668
|
kind: "failed",
|
|
3645
3669
|
message: $.registrationFailed
|
|
3646
3670
|
});
|
|
@@ -3674,7 +3698,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3674
3698
|
}
|
|
3675
3699
|
try {
|
|
3676
3700
|
let t = (await r?.fetch?.url(`/v1/event/booking/${e._id}/confirm-booking`)?.post(n.confirmation)?.json())?.content?.data;
|
|
3677
|
-
|
|
3701
|
+
Li(t) ? l(t) : u(e._id, $.paymentAbandoned);
|
|
3678
3702
|
} catch (t) {
|
|
3679
3703
|
r?.logger?.error("Failed to confirm booking after payment", { exception: b(t) }), u(e._id, $.confirmationFailed);
|
|
3680
3704
|
}
|
|
@@ -3713,67 +3737,67 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3713
3737
|
},
|
|
3714
3738
|
reset: () => s({ kind: "idle" })
|
|
3715
3739
|
};
|
|
3716
|
-
},
|
|
3740
|
+
}, zi = (e) => `levo:event-registration:${e}`, Bi = (e) => {
|
|
3717
3741
|
if (typeof window > "u") return null;
|
|
3718
3742
|
try {
|
|
3719
|
-
let t = window.localStorage.getItem(
|
|
3743
|
+
let t = window.localStorage.getItem(zi(e));
|
|
3720
3744
|
return t ? JSON.parse(t) : null;
|
|
3721
3745
|
} catch {
|
|
3722
3746
|
return null;
|
|
3723
3747
|
}
|
|
3724
|
-
},
|
|
3748
|
+
}, Vi = (e, t) => {
|
|
3725
3749
|
if (!(typeof window > "u")) try {
|
|
3726
|
-
window.localStorage.setItem(
|
|
3750
|
+
window.localStorage.setItem(zi(e), JSON.stringify(t));
|
|
3727
3751
|
} catch {}
|
|
3728
|
-
},
|
|
3752
|
+
}, Hi = (e) => {
|
|
3729
3753
|
if (!(typeof window > "u")) try {
|
|
3730
|
-
window.localStorage.removeItem(
|
|
3754
|
+
window.localStorage.removeItem(zi(e));
|
|
3731
3755
|
} catch {}
|
|
3732
|
-
},
|
|
3756
|
+
}, Ui = (e) => {
|
|
3733
3757
|
let [t, n] = A(null), [r, i] = A(null);
|
|
3734
3758
|
return E(() => {
|
|
3735
|
-
let t =
|
|
3759
|
+
let t = Bi(e);
|
|
3736
3760
|
t && i(t.email);
|
|
3737
3761
|
}, [e]), {
|
|
3738
3762
|
booking: t,
|
|
3739
3763
|
registeredEmail: r,
|
|
3740
3764
|
complete: (t, r) => {
|
|
3741
|
-
n(t), i(r),
|
|
3765
|
+
n(t), i(r), Vi(e, {
|
|
3742
3766
|
bookingId: t._id,
|
|
3743
3767
|
email: r,
|
|
3744
3768
|
at: (/* @__PURE__ */ new Date()).toISOString()
|
|
3745
3769
|
});
|
|
3746
3770
|
},
|
|
3747
3771
|
clear: () => {
|
|
3748
|
-
|
|
3772
|
+
Hi(e), i(null), n(null);
|
|
3749
3773
|
}
|
|
3750
3774
|
};
|
|
3751
|
-
},
|
|
3775
|
+
}, Wi = "register", Gi = () => {
|
|
3752
3776
|
if (typeof window > "u") return !1;
|
|
3753
|
-
let e = new URLSearchParams(window.location.search).get(
|
|
3777
|
+
let e = new URLSearchParams(window.location.search).get(Wi);
|
|
3754
3778
|
return e !== null && e !== "0" && e !== "false";
|
|
3755
|
-
},
|
|
3779
|
+
}, Ki = ({ canAutoOpen: e }) => {
|
|
3756
3780
|
let [t, n] = A(!1), r = k(!1), i = w(() => n(!0), []), a = w(() => n(!1), []);
|
|
3757
3781
|
return E(() => {
|
|
3758
|
-
r.current || !e || !
|
|
3782
|
+
r.current || !e || !Gi() || (r.current = !0, n(!0));
|
|
3759
3783
|
}, [e]), {
|
|
3760
3784
|
isOpen: t,
|
|
3761
3785
|
open: i,
|
|
3762
3786
|
close: a
|
|
3763
3787
|
};
|
|
3764
|
-
},
|
|
3765
|
-
let { account: o } = nt(), s = cr(), c =
|
|
3788
|
+
}, qi = (e, t) => `${e} ${t}${e === 1 ? "" : "s"}`, Ji = ({ eventID: e, title: t, buttonText: n = "Register Now", startsAt: r, endsAt: i, eventUrl: a }) => {
|
|
3789
|
+
let { account: o } = nt(), s = cr(), c = ji({ eventID: e }), [l, u] = A({}), [d, f] = A("tickets"), [p, m] = A(!1), [h, g] = A(null), _ = c.tickets.length === 1 ? c.tickets[0]?._id : void 0;
|
|
3766
3790
|
E(() => {
|
|
3767
3791
|
_ && u((e) => ({ [_]: e[_] || 1 }));
|
|
3768
3792
|
}, [_]);
|
|
3769
3793
|
let v = O(() => c.tickets.map((e) => ({
|
|
3770
3794
|
ticket: e,
|
|
3771
3795
|
count: l[e._id] ?? 0
|
|
3772
|
-
})).filter((e) => e.count > 0), [c.tickets, l]), y = v.reduce((e, t) => e + t.count, 0), b =
|
|
3796
|
+
})).filter((e) => e.count > 0), [c.tickets, l]), y = v.reduce((e, t) => e + t.count, 0), b = Ti(o, c.tickets, l), x = b.slots[0] ? b.getValues(b.slots[0].key) : null, S = Ui(e), { booking: C } = S, w = Ki({ canAutoOpen: !c.isLoading && c.tickets.length > 0 && !S.registeredEmail }), T = v.some((e) => Ur(e.ticket, null) > 0), D = ki({
|
|
3773
3797
|
eventID: e,
|
|
3774
3798
|
tickets: b.slots.map((e) => e.ticket),
|
|
3775
3799
|
enabled: w.isOpen && T && d === "review"
|
|
3776
|
-
}), k = Jr(v, D.discount), ee = !!k && !k.isFree, P = O(() => ei(r, i), [r, i]), F = t || "this event", I =
|
|
3800
|
+
}), k = Jr(v, D.discount), ee = !!k && !k.isFree, P = O(() => ei(r, i), [r, i]), F = t || "this event", I = Ri({
|
|
3777
3801
|
eventID: e,
|
|
3778
3802
|
details: {
|
|
3779
3803
|
merchantName: s?.name || t || "",
|
|
@@ -3791,7 +3815,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3791
3815
|
[e]: t
|
|
3792
3816
|
}));
|
|
3793
3817
|
}, R = () => {
|
|
3794
|
-
S.clear(), I.reset(), D.reset(), b.reset(), u(_ ? { [_]: 1 } : {}), f("tickets"), g(null);
|
|
3818
|
+
S.clear(), I.reset(), D.reset({ rearm: !0 }), b.reset(), u(_ ? { [_]: 1 } : {}), f("tickets"), g(null);
|
|
3795
3819
|
}, te = (t) => {
|
|
3796
3820
|
if (t.preventDefault(), d === "tickets") {
|
|
3797
3821
|
if (y === 0) {
|
|
@@ -3811,7 +3835,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3811
3835
|
return;
|
|
3812
3836
|
}
|
|
3813
3837
|
}
|
|
3814
|
-
I.register({
|
|
3838
|
+
D.isFindingBestOffer || I.register({
|
|
3815
3839
|
event: e,
|
|
3816
3840
|
coupon: D.applied?.code ?? "",
|
|
3817
3841
|
attendees: b.slots.map((e) => {
|
|
@@ -3848,7 +3872,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3848
3872
|
className: "min-w-0 flex-1",
|
|
3849
3873
|
children: [/* @__PURE__ */ M("span", {
|
|
3850
3874
|
className: "block font-semibold text-[15px] text-ink tabular-nums",
|
|
3851
|
-
children: y === 0 ? "No tickets yet" :
|
|
3875
|
+
children: y === 0 ? "No tickets yet" : qi(y, "ticket")
|
|
3852
3876
|
}), y > 0 && /* @__PURE__ */ M("span", {
|
|
3853
3877
|
className: "block text-[12.5px] text-ink-soft tabular-nums",
|
|
3854
3878
|
children: z ?? "Free"
|
|
@@ -3870,7 +3894,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3870
3894
|
payment: I,
|
|
3871
3895
|
label: ne,
|
|
3872
3896
|
isPaid: ee,
|
|
3873
|
-
blockedReason: d === "details" ? V : void 0
|
|
3897
|
+
blockedReason: d === "details" ? V : D.isFindingBestOffer ? "Finding your best offer…" : void 0
|
|
3874
3898
|
});
|
|
3875
3899
|
return /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ M(ci, {
|
|
3876
3900
|
buttonText: n,
|
|
@@ -3904,7 +3928,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3904
3928
|
attendeeCount: b.slots.length,
|
|
3905
3929
|
onClose: w.close,
|
|
3906
3930
|
onRegisterAnother: R
|
|
3907
|
-
}) : d === "tickets" ? /* @__PURE__ */ M(
|
|
3931
|
+
}) : d === "tickets" ? /* @__PURE__ */ M(Si, {
|
|
3908
3932
|
tickets: c.tickets,
|
|
3909
3933
|
counts: l,
|
|
3910
3934
|
onChange: L,
|
|
@@ -3948,7 +3972,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
3948
3972
|
]
|
|
3949
3973
|
})
|
|
3950
3974
|
})] });
|
|
3951
|
-
},
|
|
3975
|
+
}, Yi = ({ selectedTicket: e, discount: t }) => {
|
|
3952
3976
|
let [n, r] = A(!1), i = e?.currency, a = Ur(e, t), o = Gr(e, t), s = Kr(e, t), c = t?.discount ?? 0, l = s.length > 0 || c > 0 || o !== a, u = /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ N("span", {
|
|
3953
3977
|
className: "inline-flex items-center gap-1.5",
|
|
3954
3978
|
children: ["Total", l && /* @__PURE__ */ M(oe, { className: X("size-4 text-ink-muted transition-transform", n && "rotate-180") })]
|
|
@@ -4006,7 +4030,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4006
4030
|
})
|
|
4007
4031
|
})]
|
|
4008
4032
|
});
|
|
4009
|
-
},
|
|
4033
|
+
}, Xi = ({ tickets: e, selectedTicket: t, onSelect: n, error: r }) => {
|
|
4010
4034
|
let [i, a] = A(!t);
|
|
4011
4035
|
return /* @__PURE__ */ N("fieldset", {
|
|
4012
4036
|
className: "m-0 flex min-w-0 flex-col gap-2 border-0 p-0",
|
|
@@ -4083,15 +4107,15 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4083
4107
|
})
|
|
4084
4108
|
]
|
|
4085
4109
|
});
|
|
4086
|
-
},
|
|
4087
|
-
let { account: s } = nt(), c = cr(), l =
|
|
4110
|
+
}, Zi = (e) => e.enableMultipleTicketBooking && !e.external ? /* @__PURE__ */ M(Ji, { ...e }, e.eventID) : /* @__PURE__ */ M(Qi, { ...e }, e.eventID), Qi = ({ eventID: e, title: t, external: n, buttonText: r = "Register Now", startsAt: i, endsAt: a, eventUrl: o }) => {
|
|
4111
|
+
let { account: s } = nt(), c = cr(), l = ji({
|
|
4088
4112
|
eventID: e,
|
|
4089
4113
|
external: n
|
|
4090
|
-
}), u = l.selectedTicket?.registration_fields ?? mi, d =
|
|
4114
|
+
}), u = l.selectedTicket?.registration_fields ?? mi, d = wi(s, u), f = Wr(l.selectedTicket, null)?.isFree === !1, p = Ui(e), { booking: m } = p, h = Ki({ canAutoOpen: !n && !l.isLoading && l.tickets.length > 0 && !p.registeredEmail }), g = k(null), _ = ki({
|
|
4091
4115
|
eventID: e,
|
|
4092
4116
|
tickets: l.selectedTicket ? [l.selectedTicket] : [],
|
|
4093
4117
|
enabled: h.isOpen && f
|
|
4094
|
-
}), v = Wr(l.selectedTicket, _.discount), y = !!v && !v.isFree, b = l.tickets.length > 1, x = O(() => ei(i, a), [i, a]), S = t || "this event", C = b || f, w =
|
|
4118
|
+
}), v = Wr(l.selectedTicket, _.discount), y = !!v && !v.isFree, b = l.tickets.length > 1, x = O(() => ei(i, a), [i, a]), S = t || "this event", C = b || f, w = Ri({
|
|
4095
4119
|
eventID: e,
|
|
4096
4120
|
details: {
|
|
4097
4121
|
merchantName: c?.name || t || "",
|
|
@@ -4108,7 +4132,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4108
4132
|
}, E = () => {
|
|
4109
4133
|
p.clear(), w.reset(), d.reset();
|
|
4110
4134
|
}, D = (t) => {
|
|
4111
|
-
t.preventDefault(), d.markSubmitted(), !(!l.selectedTicket || !d.isValid) && w.register({
|
|
4135
|
+
t.preventDefault(), d.markSubmitted(), !(!l.selectedTicket || !d.isValid || _.isFindingBestOffer) && w.register({
|
|
4112
4136
|
event: e,
|
|
4113
4137
|
coupon: _.applied?.code ?? "",
|
|
4114
4138
|
attendees: [{
|
|
@@ -4160,7 +4184,8 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4160
4184
|
footer: m ? void 0 : /* @__PURE__ */ M(Xr, {
|
|
4161
4185
|
payment: w,
|
|
4162
4186
|
label: A,
|
|
4163
|
-
isPaid: y
|
|
4187
|
+
isPaid: y,
|
|
4188
|
+
blockedReason: _.isFindingBestOffer ? "Finding your best offer…" : void 0
|
|
4164
4189
|
}),
|
|
4165
4190
|
children: m ? /* @__PURE__ */ M(pi, {
|
|
4166
4191
|
email: d.values.email.trim(),
|
|
@@ -4177,13 +4202,13 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4177
4202
|
}) : /* @__PURE__ */ N("div", {
|
|
4178
4203
|
className: "flex flex-col gap-4",
|
|
4179
4204
|
children: [
|
|
4180
|
-
b && /* @__PURE__ */ M(
|
|
4205
|
+
b && /* @__PURE__ */ M(Xi, {
|
|
4181
4206
|
tickets: l.tickets,
|
|
4182
4207
|
selectedTicket: l.selectedTicket,
|
|
4183
4208
|
onSelect: T,
|
|
4184
4209
|
error: d.submitAttempted && !l.selectedTicket ? "Choose a ticket to continue" : void 0
|
|
4185
4210
|
}),
|
|
4186
|
-
f && /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ M(
|
|
4211
|
+
f && /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ M(Yi, {
|
|
4187
4212
|
selectedTicket: l.selectedTicket,
|
|
4188
4213
|
discount: _.discount
|
|
4189
4214
|
}), /* @__PURE__ */ M(Qr, {
|
|
@@ -4214,7 +4239,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4214
4239
|
]
|
|
4215
4240
|
})
|
|
4216
4241
|
})] });
|
|
4217
|
-
},
|
|
4242
|
+
}, $i = (e) => e.length > 1 ? e.replace(/\/+$/, "") : e, ea = (e) => typeof e == "string" && e.trim() ? e : void 0, ta = (e) => typeof e == "string" ? e : e?.location ?? void 0, na = (e, t) => {
|
|
4218
4243
|
let n = e.meta ?? {}, r = e.title && t ? `${e.title} | ${t}` : e.title || t || void 0;
|
|
4219
4244
|
return {
|
|
4220
4245
|
title: n.meta_title || r,
|
|
@@ -4224,32 +4249,32 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4224
4249
|
og: {
|
|
4225
4250
|
title: n.og_title || void 0,
|
|
4226
4251
|
description: n.og_description || void 0,
|
|
4227
|
-
image:
|
|
4252
|
+
image: ta(n.og_image),
|
|
4228
4253
|
url: n.og_url || void 0
|
|
4229
4254
|
},
|
|
4230
4255
|
twitter: { card: n.twitter_card || void 0 },
|
|
4231
4256
|
ldJson: n.ld_json || void 0,
|
|
4232
4257
|
customHead: n.head_code || void 0
|
|
4233
4258
|
};
|
|
4234
|
-
},
|
|
4259
|
+
}, ra = (e) => ({
|
|
4235
4260
|
description: e.description || void 0,
|
|
4236
4261
|
customHead: e.settings?.head_code || void 0
|
|
4237
|
-
}),
|
|
4238
|
-
let i =
|
|
4262
|
+
}), ia = (e) => (t = {}, n) => (r) => {
|
|
4263
|
+
let i = na(t, e.name);
|
|
4239
4264
|
if (n) {
|
|
4240
4265
|
let t = r?.loaderData?.[n.source];
|
|
4241
4266
|
if (t) {
|
|
4242
|
-
let r = n.title ?
|
|
4267
|
+
let r = n.title ? ea(t[n.title]) : void 0;
|
|
4243
4268
|
r && (i.title = e.name ? `${r} | ${e.name}` : r, i.og = {
|
|
4244
4269
|
...i.og,
|
|
4245
4270
|
title: r
|
|
4246
4271
|
});
|
|
4247
|
-
let a = n.description ?
|
|
4272
|
+
let a = n.description ? ea(t[n.description]) : void 0;
|
|
4248
4273
|
a && (i.description = a, i.og = {
|
|
4249
4274
|
...i.og,
|
|
4250
4275
|
description: a
|
|
4251
4276
|
});
|
|
4252
|
-
let o = n.image ?
|
|
4277
|
+
let o = n.image ? ta(t[n.image]) : void 0;
|
|
4253
4278
|
o && (i.og = {
|
|
4254
4279
|
...i.og,
|
|
4255
4280
|
image: o
|
|
@@ -4258,14 +4283,14 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4258
4283
|
}
|
|
4259
4284
|
if (!i.canonical) {
|
|
4260
4285
|
let t = r?.match?.pathname, n = (e.domain || "").trim();
|
|
4261
|
-
n && t?.startsWith("/") && (i.canonical = (/^https?:\/\//.test(n) ? n : `https://${n}`).replace(/\/+$/, "") +
|
|
4286
|
+
n && t?.startsWith("/") && (i.canonical = (/^https?:\/\//.test(n) ? n : `https://${n}`).replace(/\/+$/, "") + $i(t));
|
|
4262
4287
|
}
|
|
4263
|
-
let a = Dr(i,
|
|
4288
|
+
let a = Dr(i, ra(e)), o = t.id?.trim();
|
|
4264
4289
|
return o && a.meta.push({
|
|
4265
4290
|
name: nr,
|
|
4266
4291
|
content: o
|
|
4267
4292
|
}), a;
|
|
4268
|
-
},
|
|
4293
|
+
}, aa = (e) => e.params, oa = (e) => {
|
|
4269
4294
|
let t = Ne(e);
|
|
4270
4295
|
return (e, n) => {
|
|
4271
4296
|
let { rules: r, invalid: i } = Te(n?.access), a = r.length > 0 || i;
|
|
@@ -4273,16 +4298,16 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4273
4298
|
queryClient: n.context.queryClient,
|
|
4274
4299
|
config: t,
|
|
4275
4300
|
sources: e,
|
|
4276
|
-
params:
|
|
4301
|
+
params: aa(n)
|
|
4277
4302
|
});
|
|
4278
4303
|
};
|
|
4279
|
-
},
|
|
4304
|
+
}, sa = 2, ca = (e) => {
|
|
4280
4305
|
let { limit: t = 20, debounceMs: n = 300, hotkey: r = !0 } = e ?? {}, a = i(), o = cr(), s = K(), [c, l] = A(""), [u, d] = A(!1), [f, p] = A("");
|
|
4281
4306
|
E(() => {
|
|
4282
4307
|
let e = setTimeout(() => p(c.trim()), n);
|
|
4283
4308
|
return () => clearTimeout(e);
|
|
4284
4309
|
}, [c, n]);
|
|
4285
|
-
let m = f.length >=
|
|
4310
|
+
let m = f.length >= sa, h = L({
|
|
4286
4311
|
queryKey: [
|
|
4287
4312
|
"levo-search",
|
|
4288
4313
|
o?.id ?? null,
|
|
@@ -4331,4 +4356,4 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
|
|
|
4331
4356
|
};
|
|
4332
4357
|
};
|
|
4333
4358
|
//#endregion
|
|
4334
|
-
export { Bt as ColorModeProvider, Zn as Inspector, _e as LEVO_AUTH_METHODS, q as LEVO_AUTH_QUERY_KEY, ge as LEVO_OAUTH_METHODS, Tt as LEVO_OTP_LENGTH, ht as LEVO_PENDING_APPROVAL_CODE, he as LEVO_PRIMARY_AUTH_METHODS, m as LOCALE_COOKIE, l as LOCALE_REDIRECT_CACHE_CONTROL, Mt as LevoChat, Ut as LevoEditForm, rt as LevoEntryForm,
|
|
4359
|
+
export { Bt as ColorModeProvider, Zn as Inspector, _e as LEVO_AUTH_METHODS, q as LEVO_AUTH_QUERY_KEY, ge as LEVO_OAUTH_METHODS, Tt as LEVO_OTP_LENGTH, ht as LEVO_PENDING_APPROVAL_CODE, he as LEVO_PRIMARY_AUTH_METHODS, m as LOCALE_COOKIE, l as LOCALE_REDIRECT_CACHE_CONTROL, Mt as LevoChat, Ut as LevoEditForm, rt as LevoEntryForm, Zi as LevoEventRegister, Wt as LevoForm, gr as LevoLink, ar as LevoPopups, ct as LevoProfileForm, dr as LevoSiteProvider, _r as LocaleHreflang, yr as LocaleProvider, nr as PAGE_ID_META, Or as PageHead, Sr as SiteLocaleProvider, hr as buildHreflangLinks, ia as createLevoHead, oa as createLevoLoader, _ as createRouteTreeMatcher, Me as createSiteClient, je as decideAccess, v as extractGeoAndLanguageData, gt as isPendingApprovalError, Et as isValidEmail, Dt as isValidOtp, kt as isValidPhone, ze as levoParams, fr as localeBeforeLoad, p as localePath, d as localeRedirectResponse, Ot as normalizePhone, Dr as pageHead, Te as parseAccess, Er as parseRawHead, $e as prefetchLevoSources, pr as readLocaleConfig, rr as readPageId, Ee as resolveAuthMethods, g as resolveLocale, u as resolveLocaleRedirect, s as resolveLocaleRequest, Ne as siteConfigFromJson, f as splitLocalePrefix, Vt as useColorMode, Cr as useLanguageOptions, mt as useLevoAccess, nt as useLevoAuth, Ze as useLevoForm, ur as useLevoInsights, yt as useLevoLogin, wt as useLevoOAuth, At as useLevoOtpInput, Xe as useLevoRecord, ca as useLevoSearch, lr as useLevoSite, Ye as useLevoSource, br as useLocale, xr as useUrlLocale };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@levo-so/site-runtime",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.29",
|
|
4
4
|
"description": "Runtime for Levo Studio v3 sites — the editor preview inspector, page head metadata, and the Levo data client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -82,8 +82,8 @@
|
|
|
82
82
|
"@assistant-ui/store": "0.3.13",
|
|
83
83
|
"@assistant-ui/tap": "0.9.17",
|
|
84
84
|
"remark-gfm": "4.0.1",
|
|
85
|
-
"@levo-so/core": "0.3.
|
|
86
|
-
"@levo-so/insights": "0.3.
|
|
85
|
+
"@levo-so/core": "0.3.29",
|
|
86
|
+
"@levo-so/insights": "0.3.29",
|
|
87
87
|
"@stripe/react-stripe-js": "3.1.1",
|
|
88
88
|
"@stripe/stripe-js": "5.5.0",
|
|
89
89
|
"react-razorpay": "3.0.1"
|