@evelan/jexity-widget 0.13.0 → 0.14.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.mjs +3038 -2038
- package/dist/index.mjs.map +1 -1
- package/dist/react.mjs +3012 -2012
- package/dist/react.mjs.map +1 -1
- package/dist/types/features/chat/components/MagiclineFormMessage.d.ts +29 -0
- package/dist/types/features/chat/components/MagiclineFormMessage.d.ts.map +1 -0
- package/dist/types/features/chat/components/MessageList.d.ts.map +1 -1
- package/dist/types/features/chat/components/magicline/TrialSessionBookingForm.d.ts +34 -0
- package/dist/types/features/chat/components/magicline/TrialSessionBookingForm.d.ts.map +1 -0
- package/dist/types/features/chat/components/magicline/buildWizardSteps.d.ts +26 -0
- package/dist/types/features/chat/components/magicline/buildWizardSteps.d.ts.map +1 -0
- package/dist/types/features/chat/components/magicline/formUtils.d.ts +23 -0
- package/dist/types/features/chat/components/magicline/formUtils.d.ts.map +1 -0
- package/dist/types/features/chat/components/magicline/magiclineConstants.d.ts +21 -0
- package/dist/types/features/chat/components/magicline/magiclineConstants.d.ts.map +1 -0
- package/dist/types/features/chat/components/magicline/useTrialBookingState.d.ts +87 -0
- package/dist/types/features/chat/components/magicline/useTrialBookingState.d.ts.map +1 -0
- package/dist/types/features/chat/hooks/useMagicline.d.ts +88 -0
- package/dist/types/features/chat/hooks/useMagicline.d.ts.map +1 -0
- package/dist/types/i18n/locales/de.d.ts.map +1 -1
- package/dist/types/i18n/locales/en.d.ts +63 -0
- package/dist/types/i18n/locales/en.d.ts.map +1 -1
- package/dist/widget.js +32 -32
- package/dist/widget.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Doc, Id } from '@repo/backend/convex/_generated/dataModel';
|
|
2
|
+
interface MagiclineFormMessageProps {
|
|
3
|
+
message: Doc<'conversations'>;
|
|
4
|
+
sessionId: Id<'contactSessions'>;
|
|
5
|
+
visitorId: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Inline Magicline integration form rendered inside the chat thread.
|
|
9
|
+
*
|
|
10
|
+
* Three states driven by `message.magiclineForm.status`:
|
|
11
|
+
* - `submitted` → read-only success card (NOT re-submittable).
|
|
12
|
+
* - `failed` → read-only failure card.
|
|
13
|
+
* - `open` → renders the interactive trial form. v1 is trial-only — the
|
|
14
|
+
* dormant `leadApplication` action is intentionally NOT routed (the file stays
|
|
15
|
+
* on disk but is no longer imported).
|
|
16
|
+
*
|
|
17
|
+
* 409 retry: when a `slot_unavailable` 409 reopens the form (status flips
|
|
18
|
+
* back to `open` while the linked submission carries `errorCode === "slot_unavailable"`),
|
|
19
|
+
* the form shows a "pick another time" notice and reloads slots. This is detected
|
|
20
|
+
* by reading `getSubmissionStatus` only when the form is `open` AND a
|
|
21
|
+
* `submissionId` is present (otherwise the query is skipped).
|
|
22
|
+
*
|
|
23
|
+
* Mirrors FormMessage (escalation): reads the row, renders read-only when the
|
|
24
|
+
* backend has flipped the status, otherwise renders the interactive form. The
|
|
25
|
+
* form's own submit handler additionally guards against double-submit.
|
|
26
|
+
*/
|
|
27
|
+
export declare function MagiclineFormMessage({ message, sessionId, visitorId }: MagiclineFormMessageProps): import("preact").JSX.Element | null;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=MagiclineFormMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MagiclineFormMessage.d.ts","sourceRoot":"","sources":["../../../../../src/features/chat/components/MagiclineFormMessage.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2CAA2C,CAAA;AAExE,UAAU,yBAAyB;IACjC,OAAO,EAAE,GAAG,CAAC,eAAe,CAAC,CAAA;IAC7B,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,yBAAyB,uCAyEhG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../../../src/features/chat/components/MessageList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../../../src/features/chat/components/MessageList.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2CAA2C,CAAA;AAgBxE,UAAU,gBAAgB;IACxB,aAAa,EAAE,GAAG,CAAC,eAAe,CAAC,EAAE,GAAG,SAAS,CAAA;IACjD,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oEAAoE;IACpE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,iDAAiD;IACjD,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAA;IACvC,iDAAiD;IACjD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,gBAAgB,gCA6J3I"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Id } from '@repo/backend/convex/_generated/dataModel';
|
|
2
|
+
interface TrialSessionBookingFormProps {
|
|
3
|
+
formMessageId: Id<'conversations'>;
|
|
4
|
+
sessionId: Id<'contactSessions'>;
|
|
5
|
+
visitorId: string;
|
|
6
|
+
/** Set when the form was reopened after a `slot_unavailable` 409. */
|
|
7
|
+
slotUnavailable?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* True while the 409 retry-status query is still resolving. The Slot
|
|
10
|
+
* step waits for this to clear before deciding its UI so a reopened form
|
|
11
|
+
* doesn't flash "no slots" before the slot-unavailable notice resolves.
|
|
12
|
+
*/
|
|
13
|
+
retryPending?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Inline Magicline trial-session booking STEP WIZARD. Renders the
|
|
17
|
+
* dynamic per-studio form as internal steps inside ONE chat card:
|
|
18
|
+
*
|
|
19
|
+
* Trainer → Slot → Personal → Address → Confirm
|
|
20
|
+
*
|
|
21
|
+
* Steps with no visible fields are auto-skipped (see `buildWizardSteps`). The
|
|
22
|
+
* trainer step is shown only when the studio allows trainer-free bookings.
|
|
23
|
+
*
|
|
24
|
+
* State (config, slots, all field values) is lifted into `useTrialBookingState`
|
|
25
|
+
* which is mounted ONCE here, above the step switch — so navigating between
|
|
26
|
+
* steps never refetches config or slots. Config is fetched once on open;
|
|
27
|
+
* slots are fetched on open and whenever the trainer choice changes.
|
|
28
|
+
*
|
|
29
|
+
* The selected slot's `startDateTime` is sent as the `slotId` field — the
|
|
30
|
+
* backend transformer maps `slotId` → Magicline `startDateTime`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function TrialSessionBookingForm({ formMessageId, sessionId, visitorId, slotUnavailable, retryPending, }: TrialSessionBookingFormProps): import("preact").JSX.Element;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=TrialSessionBookingForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrialSessionBookingForm.d.ts","sourceRoot":"","sources":["../../../../../../src/features/chat/components/magicline/TrialSessionBookingForm.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2CAA2C,CAAA;AAEnE,UAAU,4BAA4B;IACpC,aAAa,EAAE,EAAE,CAAC,eAAe,CAAC,CAAA;IAClC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,qEAAqE;IACrE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAKD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,aAAa,EACb,SAAS,EACT,SAAS,EACT,eAAuB,EACvB,YAAoB,GACrB,EAAE,4BAA4B,gCA2C9B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { TrialConfigPlan } from '../../hooks/useMagicline';
|
|
2
|
+
/**
|
|
3
|
+
* Ordered wizard step identifiers. The widget renders these as internal steps
|
|
4
|
+
* inside ONE card (not one chat message per step).
|
|
5
|
+
*/
|
|
6
|
+
export type WizardStep = 'trainer' | 'slot' | 'personal' | 'address' | 'confirm';
|
|
7
|
+
/**
|
|
8
|
+
* Pure helper — resolves the ordered list of VISIBLE wizard steps for a studio
|
|
9
|
+
* plan. Steps with no visible fields are skipped so the visitor never lands on
|
|
10
|
+
* an empty page and the "Step n of N" counter shrinks accordingly.
|
|
11
|
+
*
|
|
12
|
+
* Skip rules:
|
|
13
|
+
* - `trainer` — skipped unless the studio allows trainer-free bookings
|
|
14
|
+
* (`bookingWithoutTrainerAllowed === true`); otherwise the choice is forced
|
|
15
|
+
* and there is nothing to ask.
|
|
16
|
+
* - `slot` — always shown (a slot is mandatory).
|
|
17
|
+
* - `personal` — always shown (firstname/lastname are always visible+required).
|
|
18
|
+
* - `address` — skipped when neither the address group nor the zip field is
|
|
19
|
+
* visible per the plan.
|
|
20
|
+
* - `confirm` — always shown (note + consent + summary + submit).
|
|
21
|
+
*
|
|
22
|
+
* Visibility is derived ONLY from the same `plan` the fields use — no second
|
|
23
|
+
* source of truth.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildWizardSteps(plan: TrialConfigPlan, bookingWithoutTrainerAllowed: boolean): WizardStep[];
|
|
26
|
+
//# sourceMappingURL=buildWizardSteps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildWizardSteps.d.ts","sourceRoot":"","sources":["../../../../../../src/features/chat/components/magicline/buildWizardSteps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAA;AAEhF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,eAAe,EACrB,4BAA4B,EAAE,OAAO,GACpC,UAAU,EAAE,CAYd"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare function isValidEmail(value: string): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* Whole-years age from an ISO `YYYY-MM-DD` date-of-birth string at `now`.
|
|
4
|
+
* Returns `null` when the value is empty or unparseable (callers treat a null
|
|
5
|
+
* age as "not yet entered", deferring to required-field handling). Client-side
|
|
6
|
+
* UX only — the backend re-validates minimum age against the studio plan.
|
|
7
|
+
*
|
|
8
|
+
* The Y/M/D parts are parsed manually via `split('-')` instead of
|
|
9
|
+
* `new Date('YYYY-MM-DD')`. The string form is parsed as UTC midnight, so
|
|
10
|
+
* comparing it with LOCAL getters (`now.getDate()` etc.) shifts the day by one
|
|
11
|
+
* in negative-offset timezones and mis-gates min-age on the birthday boundary.
|
|
12
|
+
* Parsing the parts directly keeps the comparison purely calendar-based.
|
|
13
|
+
*/
|
|
14
|
+
export declare function ageFromIsoDate(isoDate: string, now?: Date): number | null;
|
|
15
|
+
/** Today's date as an ISO `YYYY-MM-DD` string in LOCAL time (for `<input max>`). */
|
|
16
|
+
export declare function todayIsoDate(now?: Date): string;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the privacy-policy URL the same way FormMessage does: prefer the
|
|
19
|
+
* org-configured URL when it is absolute, otherwise fall back to the platform
|
|
20
|
+
* default.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolvePrivacyUrl(): string;
|
|
23
|
+
//# sourceMappingURL=formUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formUtils.d.ts","sourceRoot":"","sources":["../../../../../../src/features/chat/components/magicline/formUtils.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,GAAG,IAAI,CA8BrF;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,GAAG,GAAE,IAAiB,GAAG,MAAM,CAK3D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget-side Magicline constants. The widget cannot import the backend
|
|
3
|
+
* `model.ts` (it is bundled separately), so the controlled `<select>` enums are
|
|
4
|
+
* mirrored here. Every value below is a member of the backend `GENDER_ENUM` /
|
|
5
|
+
* `COUNTRY_ENUM` so a submission re-validates server-side without surprises.
|
|
6
|
+
*/
|
|
7
|
+
/** Magicline gender enum (controlled select). Mirrors backend `GENDER_ENUM`. */
|
|
8
|
+
export declare const GENDER_VALUES: readonly ["MALE", "FEMALE", "UNISEX"];
|
|
9
|
+
export type GenderValue = (typeof GENDER_VALUES)[number];
|
|
10
|
+
/**
|
|
11
|
+
* Curated subset of the backend `COUNTRY_ENUM` for the country `<select>`.
|
|
12
|
+
* Magicline's full enum has 250+ ISO codes; surfacing all of them in a widget
|
|
13
|
+
* dropdown is poor UX. We ship the DACH region plus common neighbours — every
|
|
14
|
+
* code here is a valid `COUNTRY_ENUM` member, so the server-side check passes.
|
|
15
|
+
*/
|
|
16
|
+
export interface CountryOption {
|
|
17
|
+
code: string;
|
|
18
|
+
label: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const COUNTRY_OPTIONS: readonly CountryOption[];
|
|
21
|
+
//# sourceMappingURL=magiclineConstants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magiclineConstants.d.ts","sourceRoot":"","sources":["../../../../../../src/features/chat/components/magicline/magiclineConstants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gFAAgF;AAChF,eAAO,MAAM,aAAa,uCAAwC,CAAA;AAClE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAgB1C,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type TrialConfigPlan, type TrialSlot } from '../../hooks/useMagicline';
|
|
2
|
+
import type { Id } from '@repo/backend/convex/_generated/dataModel';
|
|
3
|
+
/** Resolved per-studio config (only present once the fetch succeeds). */
|
|
4
|
+
export interface ResolvedConfig {
|
|
5
|
+
plan: TrialConfigPlan;
|
|
6
|
+
minimumAge: number;
|
|
7
|
+
bookingWithoutTrainerAllowed: boolean;
|
|
8
|
+
/** Studio IANA timezone (or null) — used to display bare-UTC slot times. */
|
|
9
|
+
studioZoneId: string | null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Config status as a CODE, not a resolved message. The view resolves the
|
|
13
|
+
* code to a localised string at render time so a locale toggle mid-fill never
|
|
14
|
+
* re-runs the config fetch and never nukes the filled form to an error card.
|
|
15
|
+
*/
|
|
16
|
+
export type ConfigStatusCode = 'unsupported' | 'inconsistent' | 'unavailable';
|
|
17
|
+
export type ConfigState = {
|
|
18
|
+
phase: 'loading';
|
|
19
|
+
} | {
|
|
20
|
+
phase: 'ready';
|
|
21
|
+
config: ResolvedConfig;
|
|
22
|
+
} | {
|
|
23
|
+
phase: 'error';
|
|
24
|
+
code: ConfigStatusCode;
|
|
25
|
+
backendMessage: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Slots lifecycle. `empty` (healthy, zero availability) is split from
|
|
29
|
+
* `error` (unavailable / network_error / rejection) so the Slot step can show
|
|
30
|
+
* a Retry affordance on `error` and a no-slots message on `empty`.
|
|
31
|
+
*/
|
|
32
|
+
export type SlotsState = {
|
|
33
|
+
phase: 'loading';
|
|
34
|
+
} | {
|
|
35
|
+
phase: 'ready';
|
|
36
|
+
slots: TrialSlot[];
|
|
37
|
+
} | {
|
|
38
|
+
phase: 'empty';
|
|
39
|
+
} | {
|
|
40
|
+
phase: 'error';
|
|
41
|
+
};
|
|
42
|
+
/** The flat field bag — all controlled inputs default to "". */
|
|
43
|
+
export interface TrialFormFields {
|
|
44
|
+
firstName: string;
|
|
45
|
+
lastName: string;
|
|
46
|
+
email: string;
|
|
47
|
+
phone: string;
|
|
48
|
+
birthDate: string;
|
|
49
|
+
gender: string;
|
|
50
|
+
street: string;
|
|
51
|
+
houseNumber: string;
|
|
52
|
+
zip: string;
|
|
53
|
+
city: string;
|
|
54
|
+
country: string;
|
|
55
|
+
note: string;
|
|
56
|
+
slotId: string;
|
|
57
|
+
consent: boolean;
|
|
58
|
+
/** Trainer required defaults to TRUE (safest); preselected "with trainer". */
|
|
59
|
+
trainerRequired: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface UseTrialBookingStateOptions {
|
|
62
|
+
sessionId: Id<'contactSessions'>;
|
|
63
|
+
visitorId: string;
|
|
64
|
+
}
|
|
65
|
+
export interface TrialBookingState {
|
|
66
|
+
fields: TrialFormFields;
|
|
67
|
+
setField: (key: keyof TrialFormFields, value: string | boolean) => void;
|
|
68
|
+
setTrainerRequired: (trainerRequired: boolean) => void;
|
|
69
|
+
configState: ConfigState;
|
|
70
|
+
slotsState: SlotsState;
|
|
71
|
+
/** Re-fetch slots with the current `trainerRequired` (Retry button). */
|
|
72
|
+
refetchSlots: () => void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Single fetch-once container for the trial-booking wizard.
|
|
76
|
+
*
|
|
77
|
+
* - Config is fetched ONCE on mount. A locale toggle does NOT re-fetch it
|
|
78
|
+
* (no `t` in deps; status stored as a code).
|
|
79
|
+
* - Slots are fetched once config is ready and again whenever `trainerRequired`
|
|
80
|
+
* flips OR `refetchSlots` is called. A `refreshKey` counter drives the slot
|
|
81
|
+
* effect so the Retry button can re-run it without other deps changing.
|
|
82
|
+
* - Wizard STEP components read this shared state — mounting a step never
|
|
83
|
+
* re-fetches config or slots (the fetches live on this single hook instance,
|
|
84
|
+
* which is mounted once by the container, above the step switch).
|
|
85
|
+
*/
|
|
86
|
+
export declare function useTrialBookingState({ sessionId, visitorId, }: UseTrialBookingStateOptions): TrialBookingState;
|
|
87
|
+
//# sourceMappingURL=useTrialBookingState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTrialBookingState.d.ts","sourceRoot":"","sources":["../../../../../../src/features/chat/components/magicline/useTrialBookingState.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,SAAS,EACf,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2CAA2C,CAAA;AAEnE,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,eAAe,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,4BAA4B,EAAE,OAAO,CAAA;IACrC,4EAA4E;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,CAAA;AAE7E,MAAM,MAAM,WAAW,GACnB;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAC1C;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,GACtC;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAClB;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAA;AAEtB,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAA;CACzB;AAiDD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAA;IACvE,kBAAkB,EAAE,CAAC,eAAe,EAAE,OAAO,KAAK,IAAI,CAAA;IACtD,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,wEAAwE;IACxE,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,SAAS,GACV,EAAE,2BAA2B,GAAG,iBAAiB,CAoHjD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Id } from '@repo/backend/convex/_generated/dataModel';
|
|
2
|
+
/**
|
|
3
|
+
* Safe trial slot shape returned by `listTrialSlots`. The backend validator
|
|
4
|
+
* also carries `endDateTime`/`rawId`/`title`, but the widget only ever reads
|
|
5
|
+
* `startDateTime` (submitted as the `slotId` field + used as the option key),
|
|
6
|
+
* so we keep the widget type honest and narrow.
|
|
7
|
+
*/
|
|
8
|
+
export interface TrialSlot {
|
|
9
|
+
startDateTime: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Result of `listTrialSlots`. `status` distinguishes a healthy empty list
|
|
13
|
+
* (`ok` + zero slots → no availability) from a backend/availability failure
|
|
14
|
+
* (`unavailable` / `network_error` → retryable). The widget no longer reads a
|
|
15
|
+
* separate `ok` boolean — `status === 'ok'` is the single success signal.
|
|
16
|
+
* Extra backend fields are intentionally dropped from this mirror.
|
|
17
|
+
*/
|
|
18
|
+
export interface TrialSlotsResult {
|
|
19
|
+
status: 'ok' | 'unavailable' | 'network_error';
|
|
20
|
+
slots: TrialSlot[];
|
|
21
|
+
}
|
|
22
|
+
export type ListTrialSlots = (args: {
|
|
23
|
+
sessionId: Id<'contactSessions'>;
|
|
24
|
+
visitorId: string;
|
|
25
|
+
trainerRequired: boolean;
|
|
26
|
+
}) => Promise<TrialSlotsResult>;
|
|
27
|
+
/** Per-field visibility/requirement flag from the resolved studio plan. */
|
|
28
|
+
export interface TrialFieldFlag {
|
|
29
|
+
visible: boolean;
|
|
30
|
+
required: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Resolved per-studio trial plan (only present when status === "ok"). */
|
|
33
|
+
export interface TrialConfigPlan {
|
|
34
|
+
firstname: TrialFieldFlag;
|
|
35
|
+
lastname: TrialFieldFlag;
|
|
36
|
+
email: TrialFieldFlag;
|
|
37
|
+
phone: TrialFieldFlag;
|
|
38
|
+
dateOfBirth: TrialFieldFlag;
|
|
39
|
+
gender: TrialFieldFlag;
|
|
40
|
+
/** Governs street/houseNumber/city/country as a group. */
|
|
41
|
+
address: TrialFieldFlag;
|
|
42
|
+
zip: TrialFieldFlag;
|
|
43
|
+
}
|
|
44
|
+
export type TrialConfigResult = {
|
|
45
|
+
status: 'ok';
|
|
46
|
+
plan: TrialConfigPlan;
|
|
47
|
+
minimumAge: number;
|
|
48
|
+
bookingWithoutTrainerAllowed: boolean;
|
|
49
|
+
/** Stored studio IANA timezone (or null) for bare-UTC slot display. */
|
|
50
|
+
studioZoneId: string | null;
|
|
51
|
+
} | {
|
|
52
|
+
status: 'unsupported' | 'inconsistent' | 'unavailable';
|
|
53
|
+
message: string;
|
|
54
|
+
};
|
|
55
|
+
export type GetTrialConfig = (args: {
|
|
56
|
+
sessionId: Id<'contactSessions'>;
|
|
57
|
+
visitorId: string;
|
|
58
|
+
}) => Promise<TrialConfigResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Magicline widget seam — single touch point for the public Magicline widget
|
|
61
|
+
* functions.
|
|
62
|
+
*
|
|
63
|
+
* - `useMagiclineSubmit` wraps the `submitForm` mutation. The mutation inserts
|
|
64
|
+
* the submission row, patches the form card to `submitted`, and schedules the
|
|
65
|
+
* Node submit action. Consumers own their own submitting / error UI.
|
|
66
|
+
* - `useTrialConfig` wraps the `getTrialConfig` action — the dynamic form fetches
|
|
67
|
+
* the per-studio field plan on mount and renders fields accordingly.
|
|
68
|
+
* - `useTrialSlots` wraps the `listTrialSlots` action. It is fail-safe on the
|
|
69
|
+
* backend (never throws, always returns a result object), but the network
|
|
70
|
+
* call itself can still reject; callers should catch and treat a rejection
|
|
71
|
+
* the same as an `unavailable` status. It now forwards the visitor's
|
|
72
|
+
* `trainerRequired` preference (re-fetched when the toggle changes).
|
|
73
|
+
*
|
|
74
|
+
* Mirrors `useEscalation` / `useHandoff`: thin api-path abstraction, no state.
|
|
75
|
+
*/
|
|
76
|
+
export declare function useMagiclineSubmit(): import("convex/react").ReactMutation<import("convex/server").FunctionReference<"mutation", "public", {
|
|
77
|
+
fields: Record<string, string | number | boolean | null>;
|
|
78
|
+
visitorId: string;
|
|
79
|
+
sessionId: import("convex/values").GenericId<"contactSessions">;
|
|
80
|
+
action: "trialSessionBooking" | "leadApplication";
|
|
81
|
+
formMessageId: import("convex/values").GenericId<"conversations">;
|
|
82
|
+
}, {
|
|
83
|
+
submissionId: import("convex/values").GenericId<"magiclineSubmissions">;
|
|
84
|
+
status: "failed" | "pending" | "submitting" | "succeeded";
|
|
85
|
+
}, string | undefined>>;
|
|
86
|
+
export declare function useTrialConfig(): GetTrialConfig;
|
|
87
|
+
export declare function useTrialSlots(): ListTrialSlots;
|
|
88
|
+
//# sourceMappingURL=useMagicline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMagicline.d.ts","sourceRoot":"","sources":["../../../../../src/features/chat/hooks/useMagicline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2CAA2C,CAAA;AAEnE;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,IAAI,GAAG,aAAa,GAAG,eAAe,CAAA;IAC9C,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE;IAClC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,OAAO,CAAA;CACzB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAE/B,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,cAAc,CAAA;IACxB,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,cAAc,CAAA;IACrB,WAAW,EAAE,cAAc,CAAA;IAC3B,MAAM,EAAE,cAAc,CAAA;IACtB,0DAA0D;IAC1D,OAAO,EAAE,cAAc,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,EAAE,IAAI,CAAA;IACZ,IAAI,EAAE,eAAe,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,4BAA4B,EAAE,OAAO,CAAA;IACrC,uEAAuE;IACvE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,GACD;IACE,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,CAAA;IACtD,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAEL,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE;IAClC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;CAClB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAEhC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB;;;;;;;;;wBAEjC;AAED,wBAAgB,cAAc,IAAI,cAAc,CAE/C;AAED,wBAAgB,aAAa,IAAI,cAAc,CAE9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../../../src/i18n/locales/de.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAEzC,eAAO,MAAM,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../../../src/i18n/locales/de.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAEzC,eAAO,MAAM,EAAE,EAAE,aAsJhB,CAAA"}
|
|
@@ -91,6 +91,69 @@ export interface WidgetStrings {
|
|
|
91
91
|
privacyExplicitTitle: string;
|
|
92
92
|
privacyExplicitBodyPre: string;
|
|
93
93
|
privacyExplicitButton: string;
|
|
94
|
+
magiclineTrialTitle: string;
|
|
95
|
+
magiclineLeadTitle: string;
|
|
96
|
+
magiclineFirstName: string;
|
|
97
|
+
magiclineLastName: string;
|
|
98
|
+
magiclineEmail: string;
|
|
99
|
+
magiclinePhone: string;
|
|
100
|
+
magiclineBirthDate: string;
|
|
101
|
+
magiclineInterest: string;
|
|
102
|
+
magiclineMessage: string;
|
|
103
|
+
magiclineSlotLabel: string;
|
|
104
|
+
magiclineSlotPlaceholder: string;
|
|
105
|
+
magiclineLoadingSlots: string;
|
|
106
|
+
magiclineNoSlots: string;
|
|
107
|
+
magiclineSubmit: string;
|
|
108
|
+
magiclineSubmitting: string;
|
|
109
|
+
magiclineSubmitted: string;
|
|
110
|
+
magiclineSubmittedDetail: string;
|
|
111
|
+
magiclineFailed: string;
|
|
112
|
+
magiclineFailedDetail: string;
|
|
113
|
+
magiclineConsent: string;
|
|
114
|
+
magiclinePrivacyLinkText: string;
|
|
115
|
+
magiclineRequiredError: string;
|
|
116
|
+
magiclineEmailError: string;
|
|
117
|
+
magiclineConsentError: string;
|
|
118
|
+
magiclineConfigLoading: string;
|
|
119
|
+
magiclineConfigUnsupported: string;
|
|
120
|
+
magiclineConfigInconsistent: string;
|
|
121
|
+
magiclineConfigUnavailable: string;
|
|
122
|
+
magiclineGender: string;
|
|
123
|
+
magiclineGenderPlaceholder: string;
|
|
124
|
+
magiclineGenderMale: string;
|
|
125
|
+
magiclineGenderFemale: string;
|
|
126
|
+
magiclineGenderUnisex: string;
|
|
127
|
+
magiclineStreet: string;
|
|
128
|
+
magiclineHouseNumber: string;
|
|
129
|
+
magiclineZip: string;
|
|
130
|
+
magiclineCity: string;
|
|
131
|
+
magiclineCountry: string;
|
|
132
|
+
magiclineCountryPlaceholder: string;
|
|
133
|
+
magiclineNote: string;
|
|
134
|
+
/** Suffix appended to a config-driven field label when the studio marks it optional. */
|
|
135
|
+
magiclineOptionalSuffix: string;
|
|
136
|
+
magiclineTrainerRequired: string;
|
|
137
|
+
magiclineMinAgeError: string;
|
|
138
|
+
magiclineSlotRequiredError: string;
|
|
139
|
+
magiclineSlotUnavailableNotice: string;
|
|
140
|
+
magiclineStepTrainer: string;
|
|
141
|
+
magiclineStepSlot: string;
|
|
142
|
+
magiclineStepPersonal: string;
|
|
143
|
+
magiclineStepAddress: string;
|
|
144
|
+
magiclineStepConfirm: string;
|
|
145
|
+
/** "Step {n} of {total}". `{n}` and `{total}` interpolated. */
|
|
146
|
+
magiclineStepCounter: string;
|
|
147
|
+
magiclineWizardBack: string;
|
|
148
|
+
magiclineWizardNext: string;
|
|
149
|
+
magiclineTrainerWith: string;
|
|
150
|
+
magiclineTrainerWithout: string;
|
|
151
|
+
magiclineSummaryTrainer: string;
|
|
152
|
+
magiclineSummarySlot: string;
|
|
153
|
+
magiclineSummaryName: string;
|
|
154
|
+
magiclineRetry: string;
|
|
155
|
+
/** Distinct from `magiclineNoSlots` — a retryable load failure, not empty. */
|
|
156
|
+
magiclineSlotsError: string;
|
|
94
157
|
}
|
|
95
158
|
export declare const en: WidgetStrings;
|
|
96
159
|
//# sourceMappingURL=en.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../../src/i18n/locales/en.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../../src/i18n/locales/en.ts"],"names":[],"mappings":"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"}
|