@hanzo/booker 8.2.1 → 8.3.2
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/README.md +6 -6
- package/dist/cjs/Booker.js +23 -0
- package/dist/cjs/Booker.js.map +1 -0
- package/dist/cjs/BookingForm.js +32 -0
- package/dist/cjs/BookingForm.js.map +1 -0
- package/dist/cjs/CalendarEmbed.js +20 -0
- package/dist/cjs/CalendarEmbed.js.map +1 -0
- package/dist/cjs/Confirmation.js +34 -0
- package/dist/cjs/Confirmation.js.map +1 -0
- package/dist/cjs/EventHeader.js +31 -0
- package/dist/cjs/EventHeader.js.map +1 -0
- package/dist/cjs/MonthCalendar.js +24 -0
- package/dist/cjs/MonthCalendar.js.map +1 -0
- package/dist/cjs/TimeSlots.js +21 -0
- package/dist/cjs/TimeSlots.js.map +1 -0
- package/dist/cjs/client.js +113 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/hooks.js +121 -0
- package/dist/cjs/hooks.js.map +1 -0
- package/dist/cjs/index.js +55 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/time.js +129 -0
- package/dist/cjs/time.js.map +1 -0
- package/dist/cjs/useBooker.js +135 -0
- package/dist/cjs/useBooker.js.map +1 -0
- package/dist/esm/Booker.js +20 -0
- package/dist/esm/Booker.js.map +1 -0
- package/dist/esm/BookingForm.js +29 -0
- package/dist/esm/BookingForm.js.map +1 -0
- package/dist/esm/CalendarEmbed.js +17 -0
- package/dist/esm/CalendarEmbed.js.map +1 -0
- package/dist/esm/Confirmation.js +31 -0
- package/dist/esm/Confirmation.js.map +1 -0
- package/dist/esm/EventHeader.js +28 -0
- package/dist/esm/EventHeader.js.map +1 -0
- package/dist/esm/MonthCalendar.js +21 -0
- package/dist/esm/MonthCalendar.js.map +1 -0
- package/dist/esm/TimeSlots.js +18 -0
- package/dist/esm/TimeSlots.js.map +1 -0
- package/dist/esm/client.js +104 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/hooks.js +115 -0
- package/dist/esm/hooks.js.map +1 -0
- package/dist/esm/index.js +18 -13
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/time.js +113 -0
- package/dist/esm/time.js.map +1 -0
- package/dist/esm/useBooker.js +132 -0
- package/dist/esm/useBooker.js.map +1 -0
- package/package.json +28 -28
- package/src/Booker.tsx +7 -7
- package/src/BookingForm.tsx +2 -2
- package/src/CalendarEmbed.tsx +7 -7
- package/src/Confirmation.tsx +4 -4
- package/src/EventHeader.tsx +1 -1
- package/src/MonthCalendar.tsx +1 -1
- package/src/TimeSlots.tsx +2 -2
- package/src/hooks.ts +1 -1
- package/src/index.ts +11 -11
- package/src/useBooker.ts +9 -4
- package/types/Booker.d.ts +2 -2
- package/types/Booker.d.ts.map +1 -1
- package/types/BookingForm.d.ts +2 -2
- package/types/BookingForm.d.ts.map +1 -1
- package/types/CalendarEmbed.d.ts +2 -2
- package/types/CalendarEmbed.d.ts.map +1 -1
- package/types/Confirmation.d.ts +2 -2
- package/types/Confirmation.d.ts.map +1 -1
- package/types/EventHeader.d.ts +2 -2
- package/types/EventHeader.d.ts.map +1 -1
- package/types/MonthCalendar.d.ts +1 -1
- package/types/MonthCalendar.d.ts.map +1 -1
- package/types/TimeSlots.d.ts +2 -2
- package/types/TimeSlots.d.ts.map +1 -1
- package/types/client.d.ts.map +1 -1
- package/types/hooks.d.ts +1 -1
- package/types/hooks.d.ts.map +1 -1
- package/types/index.d.ts +11 -11
- package/types/index.d.ts.map +1 -1
- package/types/useBooker.d.ts +3 -3
- package/types/useBooker.d.ts.map +1 -1
- package/dist/cjs/Booker.cjs +0 -153
- package/dist/cjs/Booker.native.js +0 -158
- package/dist/cjs/Booker.native.js.map +0 -1
- package/dist/cjs/BookingForm.cjs +0 -197
- package/dist/cjs/BookingForm.native.js +0 -203
- package/dist/cjs/BookingForm.native.js.map +0 -1
- package/dist/cjs/CalendarEmbed.cjs +0 -121
- package/dist/cjs/CalendarEmbed.native.js +0 -125
- package/dist/cjs/CalendarEmbed.native.js.map +0 -1
- package/dist/cjs/Confirmation.cjs +0 -177
- package/dist/cjs/Confirmation.native.js +0 -185
- package/dist/cjs/Confirmation.native.js.map +0 -1
- package/dist/cjs/EventHeader.cjs +0 -112
- package/dist/cjs/EventHeader.native.js +0 -118
- package/dist/cjs/EventHeader.native.js.map +0 -1
- package/dist/cjs/MonthCalendar.cjs +0 -177
- package/dist/cjs/MonthCalendar.native.js +0 -191
- package/dist/cjs/MonthCalendar.native.js.map +0 -1
- package/dist/cjs/TimeSlots.cjs +0 -119
- package/dist/cjs/TimeSlots.native.js +0 -126
- package/dist/cjs/TimeSlots.native.js.map +0 -1
- package/dist/cjs/client.cjs +0 -136
- package/dist/cjs/client.native.js +0 -267
- package/dist/cjs/client.native.js.map +0 -1
- package/dist/cjs/hooks.cjs +0 -193
- package/dist/cjs/hooks.native.js +0 -221
- package/dist/cjs/hooks.native.js.map +0 -1
- package/dist/cjs/index.cjs +0 -71
- package/dist/cjs/index.native.js +0 -74
- package/dist/cjs/index.native.js.map +0 -1
- package/dist/cjs/time.cjs +0 -145
- package/dist/cjs/time.native.js +0 -150
- package/dist/cjs/time.native.js.map +0 -1
- package/dist/cjs/useBooker.cjs +0 -151
- package/dist/cjs/useBooker.native.js +0 -173
- package/dist/cjs/useBooker.native.js.map +0 -1
- package/dist/esm/Booker.mjs +0 -128
- package/dist/esm/Booker.mjs.map +0 -1
- package/dist/esm/Booker.native.js +0 -130
- package/dist/esm/Booker.native.js.map +0 -1
- package/dist/esm/BookingForm.mjs +0 -172
- package/dist/esm/BookingForm.mjs.map +0 -1
- package/dist/esm/BookingForm.native.js +0 -175
- package/dist/esm/BookingForm.native.js.map +0 -1
- package/dist/esm/CalendarEmbed.mjs +0 -96
- package/dist/esm/CalendarEmbed.mjs.map +0 -1
- package/dist/esm/CalendarEmbed.native.js +0 -97
- package/dist/esm/CalendarEmbed.native.js.map +0 -1
- package/dist/esm/Confirmation.mjs +0 -152
- package/dist/esm/Confirmation.mjs.map +0 -1
- package/dist/esm/Confirmation.native.js +0 -157
- package/dist/esm/Confirmation.native.js.map +0 -1
- package/dist/esm/EventHeader.mjs +0 -87
- package/dist/esm/EventHeader.mjs.map +0 -1
- package/dist/esm/EventHeader.native.js +0 -90
- package/dist/esm/EventHeader.native.js.map +0 -1
- package/dist/esm/MonthCalendar.mjs +0 -152
- package/dist/esm/MonthCalendar.mjs.map +0 -1
- package/dist/esm/MonthCalendar.native.js +0 -163
- package/dist/esm/MonthCalendar.native.js.map +0 -1
- package/dist/esm/TimeSlots.mjs +0 -94
- package/dist/esm/TimeSlots.mjs.map +0 -1
- package/dist/esm/TimeSlots.native.js +0 -98
- package/dist/esm/TimeSlots.native.js.map +0 -1
- package/dist/esm/client.mjs +0 -104
- package/dist/esm/client.mjs.map +0 -1
- package/dist/esm/client.native.js +0 -232
- package/dist/esm/client.native.js.map +0 -1
- package/dist/esm/hooks.mjs +0 -165
- package/dist/esm/hooks.mjs.map +0 -1
- package/dist/esm/hooks.native.js +0 -190
- package/dist/esm/hooks.native.js.map +0 -1
- package/dist/esm/index.mjs +0 -13
- package/dist/esm/index.mjs.map +0 -1
- package/dist/esm/index.native.js +0 -13
- package/dist/esm/index.native.js.map +0 -1
- package/dist/esm/time.mjs +0 -107
- package/dist/esm/time.mjs.map +0 -1
- package/dist/esm/time.native.js +0 -109
- package/dist/esm/time.native.js.map +0 -1
- package/dist/esm/useBooker.mjs +0 -126
- package/dist/esm/useBooker.mjs.map +0 -1
- package/dist/esm/useBooker.native.js +0 -145
- package/dist/esm/useBooker.native.js.map +0 -1
package/README.md
CHANGED
|
@@ -37,12 +37,12 @@ That's the whole integration. `Booker` fetches the public event type, renders a
|
|
|
37
37
|
|
|
38
38
|
## Components
|
|
39
39
|
|
|
40
|
-
| Component
|
|
41
|
-
|
|
|
42
|
-
| `Booker`
|
|
43
|
-
| `CalendarEmbed`
|
|
44
|
-
| `Confirmation`
|
|
45
|
-
| `EventHeader`, `MonthCalendar`, `TimeSlots`, `BookingForm` | Composable sub-views for a custom flow.
|
|
40
|
+
| Component | Purpose |
|
|
41
|
+
| ---------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
42
|
+
| `Booker` | Full scheduling flow: event → month → times → details → confirmation. |
|
|
43
|
+
| `CalendarEmbed` | Compact card for a marketing hero — soonest availability inline. |
|
|
44
|
+
| `Confirmation` | Booking confirmation card; pass a `booking` or a `uid` to fetch one. |
|
|
45
|
+
| `EventHeader`, `MonthCalendar`, `TimeSlots`, `BookingForm` | Composable sub-views for a custom flow. |
|
|
46
46
|
|
|
47
47
|
### Props
|
|
48
48
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Booker = Booker;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const gui_1 = require("@hanzo/gui");
|
|
6
|
+
const BookingForm_tsx_1 = require("./BookingForm.js");
|
|
7
|
+
const Confirmation_tsx_1 = require("./Confirmation.js");
|
|
8
|
+
const EventHeader_tsx_1 = require("./EventHeader.js");
|
|
9
|
+
const MonthCalendar_tsx_1 = require("./MonthCalendar.js");
|
|
10
|
+
const TimeSlots_tsx_1 = require("./TimeSlots.js");
|
|
11
|
+
const useBooker_ts_1 = require("./useBooker.js");
|
|
12
|
+
/** Universal scheduling flow: event → month → times → details → confirmation. */
|
|
13
|
+
function Booker(props) {
|
|
14
|
+
const m = (0, useBooker_ts_1.useBooker)(props);
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { backgroundColor: "$background", borderColor: "$borderColor", borderWidth: 1, borderRadius: "$6", padding: "$4", gap: "$4", width: "100%", maxWidth: 860, alignSelf: "center", children: m.event.loading ? ((0, jsx_runtime_1.jsxs)(StatePanel, { children: [(0, jsx_runtime_1.jsx)(gui_1.Spinner, { size: "large", color: "$color9" }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", children: "Loading\u2026" })] })) : m.event.error || !m.event.data ? ((0, jsx_runtime_1.jsxs)(StatePanel, { children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$5", fontWeight: "600", color: "$color12", children: "Couldn't load this event" }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", textAlign: "center", children: m.event.error ?? 'The event type was not found.' })] })) : m.phase === 'done' && m.booking ? ((0, jsx_runtime_1.jsx)(Confirmation_tsx_1.Confirmation, { booking: m.booking, timeZone: m.timeZone, onDone: m.reset })) : ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$4", children: [(0, jsx_runtime_1.jsx)(EventHeader_tsx_1.EventHeader, { event: m.event.data, host: props.host, timeZone: m.timeZone, compact: m.phase === 'form' }), m.phase === 'form' && m.selectedSlot ? ((0, jsx_runtime_1.jsx)(BookingForm_tsx_1.BookingForm, { slotIso: m.selectedSlot, timeZone: m.timeZone, eventLength: m.event.data.length, submitting: m.submitting, error: m.error, onSubmit: m.submit, onBack: m.back })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [m.conflict ? (0, jsx_runtime_1.jsx)(JustTakenBanner, {}) : null, m.slots.error ? ((0, jsx_runtime_1.jsxs)(gui_1.SizableText, { size: "$2", color: "$red10", children: ["Couldn't load availability: ", m.slots.error] })) : null, (0, jsx_runtime_1.jsxs)(gui_1.XStack, { gap: "$5", flexDirection: "column", $sm: { flexDirection: 'row' }, alignItems: "flex-start", children: [(0, jsx_runtime_1.jsx)(MonthCalendar_tsx_1.MonthCalendar, { viewDate: m.viewDate, availableKeys: m.availableKeys, selectedDay: m.selectedDay, onSelectDay: m.selectDay, onPrev: m.goPrevMonth, onNext: m.goNextMonth, atFirstMonth: m.atFirstMonth, weekStartsOn: m.weekStartsOn, loading: m.slots.loading }), (0, jsx_runtime_1.jsx)(TimeSlots_tsx_1.TimeSlots, { dayKey: m.selectedDay, slots: m.daySlots, timeZone: m.timeZone, onPick: m.selectSlot, selectedIso: m.selectedSlot, loading: m.slots.loading && !m.selectedDay })] }), m.availableKeys.size === 0 && !m.slots.loading && !m.slots.error ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", textAlign: "center", children: "No availability this month \u2014 try the next month." })) : null] }))] })) }));
|
|
16
|
+
}
|
|
17
|
+
function StatePanel({ children }) {
|
|
18
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { alignItems: "center", justifyContent: "center", gap: "$3", padding: "$8", minHeight: 220, children: children }));
|
|
19
|
+
}
|
|
20
|
+
function JustTakenBanner() {
|
|
21
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { backgroundColor: "$yellow3", borderColor: "$yellow6", borderWidth: 1, borderRadius: "$4", padding: "$2.5", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$yellow11", children: "That time was just taken. We refreshed the calendar \u2014 please pick another." }) }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=Booker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Booker.js","sourceRoot":"","sources":["../../src/Booker.tsx"],"names":[],"mappings":";;;;AACA,oCAAiE;AAEjE,sDAA+C;AAC/C,wDAAiD;AACjD,sDAA+C;AAC/C,0DAAmD;AACnD,kDAA2C;AAC3C,iDAA0C;AAe1C,iFAAiF;AACjF,gBAAuB,KAAkB;IACvC,MAAM,CAAC,GAAG,IAAA,wBAAS,EAAC,KAAK,CAAC,CAAA;IAE1B,OAAO,CACL,uBAAC,YAAM,IACL,eAAe,EAAC,aAAa,EAC7B,WAAW,EAAC,cAAc,EAC1B,WAAW,EAAE,CAAC,EACd,YAAY,EAAC,IAAI,EACjB,OAAO,EAAC,IAAI,EACZ,GAAG,EAAC,IAAI,EACR,KAAK,EAAC,MAAM,EACZ,QAAQ,EAAE,GAAG,EACb,SAAS,EAAC,QAAQ,YAEjB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CACjB,wBAAC,UAAU,eACT,uBAAC,aAAO,IAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,SAAS,GAAG,EACxC,uBAAC,iBAAW,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,UAAU,8BAEzB,IACH,CACd,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CACnC,wBAAC,UAAU,eACT,uBAAC,iBAAW,IAAC,IAAI,EAAC,IAAI,EAAC,UAAU,EAAC,KAAK,EAAC,KAAK,EAAC,UAAU,yCAE1C,EACd,uBAAC,iBAAW,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,YACvD,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,+BAA+B,GACrC,IACH,CACd,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CACpC,uBAAC,+BAAY,IAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,GAAI,CAC5E,CAAC,CAAC,CAAC,CACF,wBAAC,YAAM,IAAC,GAAG,EAAC,IAAI,aACd,uBAAC,6BAAW,IACV,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EACnB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,OAAO,EAAE,CAAC,CAAC,KAAK,KAAK,MAAM,GAC3B,EAED,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CACtC,uBAAC,6BAAW,IACV,OAAO,EAAE,CAAC,CAAC,YAAY,EACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAChC,UAAU,EAAE,CAAC,CAAC,UAAU,EACxB,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAClB,MAAM,EAAE,CAAC,CAAC,IAAI,GACd,CACH,CAAC,CAAC,CAAC,CACF,6DACG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAC,eAAe,KAAG,CAAC,CAAC,CAAC,IAAI,EACvC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,wBAAC,iBAAW,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,QAAQ,6CACN,CAAC,CAAC,KAAK,CAAC,KAAK,IAC9B,CACf,CAAC,CAAC,CAAC,IAAI,EACR,wBAAC,YAAM,IACL,GAAG,EAAC,IAAI,EACR,aAAa,EAAC,QAAQ,EACtB,GAAG,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,EAC7B,UAAU,EAAC,YAAY,aAEvB,uBAAC,iCAAa,IACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,aAAa,EAAE,CAAC,CAAC,aAAa,EAC9B,WAAW,EAAE,CAAC,CAAC,WAAW,EAC1B,WAAW,EAAE,CAAC,CAAC,SAAS,EACxB,MAAM,EAAE,CAAC,CAAC,WAAW,EACrB,MAAM,EAAE,CAAC,CAAC,WAAW,EACrB,YAAY,EAAE,CAAC,CAAC,YAAY,EAC5B,YAAY,EAAE,CAAC,CAAC,YAAY,EAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,GACxB,EACF,uBAAC,yBAAS,IACR,MAAM,EAAE,CAAC,CAAC,WAAW,EACrB,KAAK,EAAE,CAAC,CAAC,QAAQ,EACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,MAAM,EAAE,CAAC,CAAC,UAAU,EACpB,WAAW,EAAE,CAAC,CAAC,YAAY,EAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW,GAC1C,IACK,EACR,CAAC,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAClE,uBAAC,iBAAW,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,sEAE5C,CACf,CAAC,CAAC,CAAC,IAAI,IACP,CACJ,IACM,CACV,GACM,CACV,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,QAAQ,EAA2B;IACvD,OAAO,CACL,uBAAC,YAAM,IACL,UAAU,EAAC,QAAQ,EACnB,cAAc,EAAC,QAAQ,EACvB,GAAG,EAAC,IAAI,EACR,OAAO,EAAC,IAAI,EACZ,SAAS,EAAE,GAAG,YAEb,QAAQ,GACF,CACV,CAAA;AACH,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,CACL,uBAAC,YAAM,IACL,eAAe,EAAC,UAAU,EAC1B,WAAW,EAAC,UAAU,EACtB,WAAW,EAAE,CAAC,EACd,YAAY,EAAC,IAAI,EACjB,OAAO,EAAC,MAAM,YAEd,uBAAC,iBAAW,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,WAAW,gGAE1B,GACP,CACV,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BookingForm = BookingForm;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const gui_1 = require("@hanzo/gui");
|
|
7
|
+
const time_ts_1 = require("./time.js");
|
|
8
|
+
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
9
|
+
/** Attendee details form for the chosen slot. */
|
|
10
|
+
function BookingForm({ slotIso, timeZone, eventLength, submitting, error, onSubmit, onBack, }) {
|
|
11
|
+
const [name, setName] = (0, react_1.useState)('');
|
|
12
|
+
const [email, setEmail] = (0, react_1.useState)('');
|
|
13
|
+
const [notes, setNotes] = (0, react_1.useState)('');
|
|
14
|
+
const [touched, setTouched] = (0, react_1.useState)(false);
|
|
15
|
+
const nameValid = name.trim().length > 0;
|
|
16
|
+
const emailValid = EMAIL_RE.test(email.trim());
|
|
17
|
+
const valid = nameValid && emailValid;
|
|
18
|
+
const submit = () => {
|
|
19
|
+
setTouched(true);
|
|
20
|
+
if (!valid || submitting)
|
|
21
|
+
return;
|
|
22
|
+
onSubmit({ name: name.trim(), email: email.trim(), notes: notes.trim() || undefined });
|
|
23
|
+
};
|
|
24
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$3", flex: 1, minWidth: 240, children: [(0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$1", children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { alignItems: "center", gap: "$2", children: [(0, jsx_runtime_1.jsx)(BackLink, { onPress: onBack }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$5", fontWeight: "700", color: "$color12", children: "Enter details" })] }), (0, jsx_runtime_1.jsxs)(gui_1.SizableText, { size: "$3", color: "$color11", children: [(0, time_ts_1.formatBookingWhen)(slotIso, timeZone), " \u00B7 ", eventLength, " min"] })] }), (0, jsx_runtime_1.jsx)(Field, { label: "Name", required: true, invalid: touched && !nameValid, hint: "Please enter your name", children: (0, jsx_runtime_1.jsx)(gui_1.Input, { value: name, onChangeText: setName, placeholder: "Ada Lovelace", autoComplete: "name", size: "$4" }) }), (0, jsx_runtime_1.jsx)(Field, { label: "Email", required: true, invalid: touched && !emailValid, hint: "Please enter a valid email", children: (0, jsx_runtime_1.jsx)(gui_1.Input, { value: email, onChangeText: setEmail, placeholder: "ada@example.com", keyboardType: "email-address", autoCapitalize: "none", autoComplete: "email", size: "$4" }) }), (0, jsx_runtime_1.jsx)(Field, { label: "Notes", hint: "Optional", children: (0, jsx_runtime_1.jsx)(gui_1.TextArea, { value: notes, onChangeText: setNotes, placeholder: "Anything that would help prepare?", numberOfLines: 3, size: "$4" }) }), error ? ((0, jsx_runtime_1.jsx)(gui_1.YStack, { backgroundColor: "$red3", borderColor: "$red6", borderWidth: 1, borderRadius: "$4", padding: "$2.5", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$red11", children: error }) })) : null, (0, jsx_runtime_1.jsxs)(gui_1.XStack, { gap: "$2", justifyContent: "flex-end", marginTop: "$1", children: [(0, jsx_runtime_1.jsx)(gui_1.Button, { size: "$4", chromeless: true, onPress: onBack, disabled: submitting, children: "Back" }), (0, jsx_runtime_1.jsx)(gui_1.Button, { size: "$4", theme: "blue", onPress: submit, disabled: submitting || (touched && !valid), opacity: submitting ? 0.7 : 1, children: submitting ? 'Booking…' : 'Confirm booking' })] })] }));
|
|
25
|
+
}
|
|
26
|
+
function Field({ label, required, invalid, hint, children, }) {
|
|
27
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$1.5", children: [(0, jsx_runtime_1.jsxs)(gui_1.SizableText, { size: "$2", color: "$color11", fontWeight: "600", children: [label, required ? (0, jsx_runtime_1.jsx)(gui_1.SizableText, { color: "$red10", children: " *" }) : null] }), children, invalid && hint ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$red10", children: hint })) : null] }));
|
|
28
|
+
}
|
|
29
|
+
function BackLink({ onPress }) {
|
|
30
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { width: 30, height: 30, alignItems: "center", justifyContent: "center", borderRadius: "$4", cursor: "pointer", hoverStyle: { backgroundColor: '$color4' }, pressStyle: { backgroundColor: '$color6' }, onPress: onPress, "aria-label": "Back", role: "button", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$6", color: "$color11", children: '‹' }) }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=BookingForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BookingForm.js","sourceRoot":"","sources":["../../src/BookingForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CalendarEmbed = CalendarEmbed;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const gui_1 = require("@hanzo/gui");
|
|
6
|
+
const BookingForm_tsx_1 = require("./BookingForm.js");
|
|
7
|
+
const Confirmation_tsx_1 = require("./Confirmation.js");
|
|
8
|
+
const EventHeader_tsx_1 = require("./EventHeader.js");
|
|
9
|
+
const TimeSlots_tsx_1 = require("./TimeSlots.js");
|
|
10
|
+
const time_ts_1 = require("./time.js");
|
|
11
|
+
const useBooker_ts_1 = require("./useBooker.js");
|
|
12
|
+
/**
|
|
13
|
+
* Compact booking card for a marketing hero — soonest availability inline,
|
|
14
|
+
* no month grid. Same state machine as <Booker>.
|
|
15
|
+
*/
|
|
16
|
+
function CalendarEmbed(props) {
|
|
17
|
+
const m = (0, useBooker_ts_1.useBooker)({ ...props, autoSelectFirst: true });
|
|
18
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { backgroundColor: "$background", borderColor: "$borderColor", borderWidth: 1, borderRadius: "$6", padding: "$4", gap: "$3", width: "100%", maxWidth: 420, children: m.event.loading ? ((0, jsx_runtime_1.jsx)(gui_1.YStack, { alignItems: "center", justifyContent: "center", gap: "$2", padding: "$6", minHeight: 160, children: (0, jsx_runtime_1.jsx)(gui_1.Spinner, { size: "large", color: "$color9" }) })) : m.event.error || !m.event.data ? ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { alignItems: "center", justifyContent: "center", padding: "$5", minHeight: 140, gap: "$1", children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$4", fontWeight: "600", color: "$color12", children: "Unavailable" }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$color10", textAlign: "center", children: m.event.error ?? 'Event not found.' })] })) : m.phase === 'done' && m.booking ? ((0, jsx_runtime_1.jsx)(Confirmation_tsx_1.Confirmation, { booking: m.booking, timeZone: m.timeZone, onDone: m.reset })) : m.phase === 'form' && m.selectedSlot ? ((0, jsx_runtime_1.jsx)(BookingForm_tsx_1.BookingForm, { slotIso: m.selectedSlot, timeZone: m.timeZone, eventLength: m.event.data.length, submitting: m.submitting, error: m.error, onSubmit: m.submit, onBack: m.back })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(EventHeader_tsx_1.EventHeader, { event: m.event.data, host: props.host, timeZone: m.timeZone, compact: true }), m.conflict ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$yellow11", children: "That time was just taken \u2014 pick another." })) : null, m.slots.loading && m.availableKeys.size === 0 ? ((0, jsx_runtime_1.jsx)(gui_1.YStack, { alignItems: "center", padding: "$4", children: (0, jsx_runtime_1.jsx)(gui_1.Spinner, { color: "$color9" }) })) : m.availableKeys.size === 0 ? ((0, jsx_runtime_1.jsxs)(gui_1.SizableText, { size: "$2", color: "$color10", children: ["No availability in ", (0, time_ts_1.formatMonthLabel)(m.viewDate), "."] })) : ((0, jsx_runtime_1.jsx)(TimeSlots_tsx_1.TimeSlots, { dayKey: m.selectedDay, slots: m.daySlots, timeZone: m.timeZone, onPick: m.selectSlot, selectedIso: m.selectedSlot, loading: m.slots.loading, compact: true, maxHeight: 220 }))] })) }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=CalendarEmbed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarEmbed.js","sourceRoot":"","sources":["../../src/CalendarEmbed.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Confirmation = Confirmation;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const gui_1 = require("@hanzo/gui");
|
|
6
|
+
const client_ts_1 = require("./client.js");
|
|
7
|
+
const hooks_ts_1 = require("./hooks.js");
|
|
8
|
+
const time_ts_1 = require("./time.js");
|
|
9
|
+
const time_ts_2 = require("./time.js");
|
|
10
|
+
/** Booking confirmation card. Accepts a booking object or fetches by uid. */
|
|
11
|
+
function Confirmation({ booking, uid, apiUrl, timeZone, onDone, }) {
|
|
12
|
+
const api = apiUrl ?? client_ts_1.DEFAULT_API_URL;
|
|
13
|
+
const tz = timeZone ?? (0, time_ts_1.visitorTimeZone)();
|
|
14
|
+
const fetched = (0, hooks_ts_1.useBooking)(api, booking ? undefined : uid);
|
|
15
|
+
const data = booking ?? fetched.data;
|
|
16
|
+
if (!data && fetched.loading) {
|
|
17
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { alignItems: "center", justifyContent: "center", padding: "$6", gap: "$3", minHeight: 200, children: [(0, jsx_runtime_1.jsx)(gui_1.Spinner, { size: "large", color: "$color9" }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", children: "Loading your booking\u2026" })] }));
|
|
18
|
+
}
|
|
19
|
+
if (!data) {
|
|
20
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { alignItems: "center", justifyContent: "center", padding: "$6", gap: "$2", minHeight: 200, children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$4", fontWeight: "600", color: "$color12", children: "Booking not found" }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", textAlign: "center", children: fetched.error ?? 'We could not load this booking.' })] }));
|
|
21
|
+
}
|
|
22
|
+
const attendee = data.attendees?.[0];
|
|
23
|
+
const location = data.location;
|
|
24
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$3", padding: "$1", alignItems: "center", children: [(0, jsx_runtime_1.jsx)(gui_1.YStack, { width: 52, height: 52, borderRadius: 9999, backgroundColor: "$green4", alignItems: "center", justifyContent: "center", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$8", color: "$green11", children: '✓' }) }), (0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$1", alignItems: "center", children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$7", fontWeight: "700", color: "$color12", textAlign: "center", children: "You're booked" }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$4", color: "$color11", textAlign: "center", children: data.title })] }), (0, jsx_runtime_1.jsx)(gui_1.Separator, { width: "100%" }), (0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$2.5", width: "100%", maxWidth: 420, children: [(0, jsx_runtime_1.jsx)(Row, { label: "When", value: (0, time_ts_2.formatBookingWhen)(data.start, tz) }), location ? (0, jsx_runtime_1.jsx)(Row, { label: "Where", value: location }) : null, attendee?.email ? (0, jsx_runtime_1.jsx)(Row, { label: "Guest", value: attendee.email }) : null, (0, jsx_runtime_1.jsx)(Row, { label: "Status", value: titleCase(data.status) }), (0, jsx_runtime_1.jsx)(Row, { label: "Reference", value: data.uid })] }), (0, jsx_runtime_1.jsxs)(gui_1.Paragraph, { size: "$2", color: "$color10", textAlign: "center", marginTop: "$1", children: ["A calendar invite is on its way to ", attendee?.email ?? 'your inbox', "."] }), onDone ? ((0, jsx_runtime_1.jsx)(gui_1.Button, { size: "$3", chromeless: true, onPress: onDone, marginTop: "$1", children: "Book another time" })) : null] }));
|
|
25
|
+
}
|
|
26
|
+
function Row({ label, value }) {
|
|
27
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { justifyContent: "space-between", gap: "$3", alignItems: "flex-start", children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", children: label }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color12", fontWeight: "500", textAlign: "right", flexShrink: 1, children: value })] }));
|
|
28
|
+
}
|
|
29
|
+
function titleCase(s) {
|
|
30
|
+
if (!s)
|
|
31
|
+
return '';
|
|
32
|
+
return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=Confirmation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Confirmation.js","sourceRoot":"","sources":["../../src/Confirmation.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventHeader = EventHeader;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const gui_1 = require("@hanzo/gui");
|
|
6
|
+
/** Event identity: host, title, duration, timezone, description. */
|
|
7
|
+
function EventHeader({ event, host, timeZone, compact }) {
|
|
8
|
+
const name = event.profile?.name || host;
|
|
9
|
+
const initial = (name?.[0] || 'H').toUpperCase();
|
|
10
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$2", children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { alignItems: "center", gap: "$2.5", children: [(0, jsx_runtime_1.jsx)(gui_1.YStack, { width: 28, height: 28, borderRadius: 9999, backgroundColor: "$color5", alignItems: "center", justifyContent: "center", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$color11", fontWeight: "600", children: initial }) }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", children: name })] }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: compact ? '$6' : '$8', fontWeight: "700", color: "$color12", children: event.title }), (0, jsx_runtime_1.jsxs)(gui_1.XStack, { gap: "$2", alignItems: "center", flexWrap: "wrap", children: [(0, jsx_runtime_1.jsxs)(Pill, { children: [event.length, " min"] }), (0, jsx_runtime_1.jsx)(Pill, { children: shortZone(timeZone) }), event.locations?.[0]?.type ? ((0, jsx_runtime_1.jsx)(Pill, { children: prettyLocation(event.locations[0].type) })) : null] }), !compact && event.description ? ((0, jsx_runtime_1.jsx)(gui_1.Paragraph, { size: "$3", color: "$color11", marginTop: "$1", children: event.description })) : null] }));
|
|
11
|
+
}
|
|
12
|
+
function Pill({ children }) {
|
|
13
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { backgroundColor: "$color3", paddingHorizontal: "$2.5", paddingVertical: "$1", borderRadius: "$10", alignItems: "center", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$color11", children: children }) }));
|
|
14
|
+
}
|
|
15
|
+
function shortZone(tz) {
|
|
16
|
+
const city = tz.split('/').pop() || tz;
|
|
17
|
+
return city.replace(/_/g, ' ');
|
|
18
|
+
}
|
|
19
|
+
function prettyLocation(type) {
|
|
20
|
+
const t = type.toLowerCase();
|
|
21
|
+
if (t.includes('google'))
|
|
22
|
+
return 'Google Meet';
|
|
23
|
+
if (t.includes('zoom'))
|
|
24
|
+
return 'Zoom';
|
|
25
|
+
if (t.includes('phone'))
|
|
26
|
+
return 'Phone';
|
|
27
|
+
if (t.includes('person'))
|
|
28
|
+
return 'In person';
|
|
29
|
+
return 'Video call';
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=EventHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventHeader.js","sourceRoot":"","sources":["../../src/EventHeader.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MonthCalendar = MonthCalendar;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const gui_1 = require("@hanzo/gui");
|
|
6
|
+
const time_ts_1 = require("./time.js");
|
|
7
|
+
/** Navigable month grid; days with availability are selectable. */
|
|
8
|
+
function MonthCalendar({ viewDate, availableKeys, selectedDay, onSelectDay, onPrev, onNext, atFirstMonth, weekStartsOn = 0, loading, }) {
|
|
9
|
+
const cells = (0, time_ts_1.monthMatrix)(viewDate, weekStartsOn);
|
|
10
|
+
const rows = [];
|
|
11
|
+
for (let i = 0; i < cells.length; i += 7)
|
|
12
|
+
rows.push(cells.slice(i, i + 7));
|
|
13
|
+
const labels = (0, time_ts_1.weekdayLabels)(weekStartsOn);
|
|
14
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$2", flex: 1, minWidth: 260, children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { alignItems: "center", justifyContent: "space-between", paddingVertical: "$1", children: [(0, jsx_runtime_1.jsx)(NavArrow, { label: "Previous month", disabled: atFirstMonth, onPress: onPrev, children: '‹' }), (0, jsx_runtime_1.jsxs)(gui_1.XStack, { alignItems: "center", gap: "$2", children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$5", fontWeight: "700", color: "$color12", children: (0, time_ts_1.formatMonthLabel)(viewDate) }), loading ? (0, jsx_runtime_1.jsx)(gui_1.Spinner, { size: "small", color: "$color9" }) : null] }), (0, jsx_runtime_1.jsx)(NavArrow, { label: "Next month", onPress: onNext, children: '›' })] }), (0, jsx_runtime_1.jsx)(gui_1.XStack, { children: labels.map((l) => ((0, jsx_runtime_1.jsx)(gui_1.YStack, { flexBasis: 0, flexGrow: 1, alignItems: "center", paddingVertical: "$1", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$color10", children: l }) }, l))) }), (0, jsx_runtime_1.jsx)(gui_1.YStack, { gap: "$1.5", children: rows.map((row, r) => ((0, jsx_runtime_1.jsx)(gui_1.XStack, { gap: "$1.5", children: row.map((cell) => ((0, jsx_runtime_1.jsx)(DayCell, { cell: cell, available: availableKeys.has(cell.key), past: (0, time_ts_1.isBeforeToday)(cell.key), selected: selectedDay === cell.key, onSelectDay: onSelectDay }, cell.key))) }, r))) })] }));
|
|
15
|
+
}
|
|
16
|
+
function DayCell({ cell, available, past, selected, onSelectDay, }) {
|
|
17
|
+
const selectable = cell.inMonth && available && !past;
|
|
18
|
+
const dayNum = cell.date.getDate();
|
|
19
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { flexBasis: 0, flexGrow: 1, aspectRatio: 1, alignItems: "center", justifyContent: "center", borderRadius: "$4", borderWidth: 1, borderColor: selected ? '$color12' : selectable ? '$color5' : 'transparent', backgroundColor: selected ? '$color12' : selectable ? '$color2' : 'transparent', opacity: cell.inMonth ? 1 : 0, cursor: selectable ? 'pointer' : 'default', hoverStyle: selectable && !selected ? { backgroundColor: '$color4' } : undefined, pressStyle: selectable ? { backgroundColor: '$color6' } : undefined, onPress: selectable ? () => onSelectDay(cell.key) : undefined, "aria-label": selectable ? `Select ${cell.key}` : undefined, role: selectable ? 'button' : undefined, children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", fontWeight: selectable ? '600' : '400', color: selected ? '$color1' : selectable ? '$color12' : '$color8', children: dayNum }), selectable && !selected ? ((0, jsx_runtime_1.jsx)(gui_1.YStack, { position: "absolute", bottom: 4, width: 4, height: 4, borderRadius: 9999, backgroundColor: "$color10" })) : null] }));
|
|
20
|
+
}
|
|
21
|
+
function NavArrow({ children, onPress, disabled, label, }) {
|
|
22
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { width: 34, height: 34, alignItems: "center", justifyContent: "center", borderRadius: "$4", opacity: disabled ? 0.35 : 1, cursor: disabled ? 'default' : 'pointer', hoverStyle: disabled ? undefined : { backgroundColor: '$color4' }, pressStyle: disabled ? undefined : { backgroundColor: '$color6' }, onPress: disabled ? undefined : onPress, "aria-label": label, role: "button", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$6", color: "$color11", children: children }) }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=MonthCalendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonthCalendar.js","sourceRoot":"","sources":["../../src/MonthCalendar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeSlots = TimeSlots;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const gui_1 = require("@hanzo/gui");
|
|
6
|
+
const time_ts_1 = require("./time.js");
|
|
7
|
+
/** Time-slot pills for the selected day, shown in the visitor's time zone. */
|
|
8
|
+
function TimeSlots({ dayKey, slots, timeZone, onPick, selectedIso, loading, compact, maxHeight = 360, }) {
|
|
9
|
+
if (!dayKey) {
|
|
10
|
+
return ((0, jsx_runtime_1.jsx)(Centered, { children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", textAlign: "center", children: "Select a day to see available times." }) }));
|
|
11
|
+
}
|
|
12
|
+
const heading = (0, time_ts_1.formatDayLong)((0, time_ts_1.dateFromKey)(dayKey));
|
|
13
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$2", flex: 1, minWidth: 200, children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$4", fontWeight: "600", color: "$color12", children: heading }), loading ? ((0, jsx_runtime_1.jsx)(Centered, { children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$color10", children: "Loading times\u2026" }) })) : slots.length === 0 ? ((0, jsx_runtime_1.jsx)(Centered, { children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$color10", textAlign: "center", children: "No times left on this day. Try another." }) })) : ((0, jsx_runtime_1.jsx)(gui_1.ScrollView, { maxHeight: maxHeight, showsVerticalScrollIndicator: false, children: (0, jsx_runtime_1.jsx)(gui_1.XStack, { flexWrap: "wrap", gap: "$2", flexDirection: compact ? 'row' : 'column', children: slots.map((slot) => {
|
|
14
|
+
const active = selectedIso === slot.time;
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.Button, { size: "$3", theme: active ? 'blue' : undefined, chromeless: !active, borderWidth: 1, borderColor: active ? '$color8' : '$color6', backgroundColor: active ? undefined : '$color1', hoverStyle: { borderColor: '$color10' }, pressStyle: { backgroundColor: '$color4' }, onPress: () => onPick(slot.time), "aria-label": `Book ${(0, time_ts_1.formatSlotTime)(slot.time, timeZone)}`, ...(compact ? {} : { alignSelf: 'stretch' }), children: (0, time_ts_1.formatSlotTime)(slot.time, timeZone) }, slot.time));
|
|
16
|
+
}) }) }))] }));
|
|
17
|
+
}
|
|
18
|
+
function Centered({ children }) {
|
|
19
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { flex: 1, minHeight: 120, alignItems: "center", justifyContent: "center", padding: "$4", children: children }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=TimeSlots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeSlots.js","sourceRoot":"","sources":["../../src/TimeSlots.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Data plane for the Hanzo Calendar (Cal API-v2 shapes).
|
|
3
|
+
// Pure fetch layer — no React, no DOM. Runs on web and React Native.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.CalendarError = exports.CAL_API_VERSION = exports.DEFAULT_API_URL = void 0;
|
|
6
|
+
exports.fetchEventType = fetchEventType;
|
|
7
|
+
exports.fetchSlots = fetchSlots;
|
|
8
|
+
exports.createBooking = createBooking;
|
|
9
|
+
exports.fetchBooking = fetchBooking;
|
|
10
|
+
exports.cancelBooking = cancelBooking;
|
|
11
|
+
exports.DEFAULT_API_URL = 'https://api.hanzo.ai/v1/calendar';
|
|
12
|
+
exports.CAL_API_VERSION = '2024-08-13';
|
|
13
|
+
/** Error carrying the HTTP status; `conflict` marks a 409 (slot just taken). */
|
|
14
|
+
class CalendarError extends Error {
|
|
15
|
+
constructor(message, status) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'CalendarError';
|
|
18
|
+
this.status = status;
|
|
19
|
+
this.conflict = status === 409;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.CalendarError = CalendarError;
|
|
23
|
+
function messageOf(body, status) {
|
|
24
|
+
const b = body;
|
|
25
|
+
return b?.error?.message || b?.message || `Request failed (${status})`;
|
|
26
|
+
}
|
|
27
|
+
async function readJson(res) {
|
|
28
|
+
return res.json().catch(() => null);
|
|
29
|
+
}
|
|
30
|
+
async function getJson(url, signal) {
|
|
31
|
+
const res = await fetch(url, { headers: { Accept: 'application/json' }, signal });
|
|
32
|
+
const body = await readJson(res);
|
|
33
|
+
if (!res.ok)
|
|
34
|
+
throw new CalendarError(messageOf(body, res.status), res.status);
|
|
35
|
+
return body.data;
|
|
36
|
+
}
|
|
37
|
+
function normalizeEventType(raw) {
|
|
38
|
+
const length = raw.length ??
|
|
39
|
+
raw.lengthInMinutes ??
|
|
40
|
+
raw.durationMinutes ??
|
|
41
|
+
30;
|
|
42
|
+
return {
|
|
43
|
+
id: Number(raw.id ?? 0),
|
|
44
|
+
slug: String(raw.slug ?? ''),
|
|
45
|
+
title: String(raw.title ?? ''),
|
|
46
|
+
description: String(raw.description ?? ''),
|
|
47
|
+
length,
|
|
48
|
+
locations: raw.locations ?? [],
|
|
49
|
+
price: Number(raw.price ?? 0),
|
|
50
|
+
currency: String(raw.currency ?? 'usd'),
|
|
51
|
+
profile: raw.profile,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function fetchEventType(api, eventSlug, username, signal) {
|
|
55
|
+
const url = `${api}/atoms/event-types/${encodeURIComponent(eventSlug)}/public?username=${encodeURIComponent(username)}`;
|
|
56
|
+
const raw = await getJson(url, signal);
|
|
57
|
+
return normalizeEventType(raw);
|
|
58
|
+
}
|
|
59
|
+
async function fetchSlots(api, input, signal) {
|
|
60
|
+
const q = new URLSearchParams({
|
|
61
|
+
eventTypeSlug: input.eventTypeSlug,
|
|
62
|
+
usernameList: input.username,
|
|
63
|
+
startTime: input.startTime,
|
|
64
|
+
endTime: input.endTime,
|
|
65
|
+
timeZone: input.timeZone,
|
|
66
|
+
});
|
|
67
|
+
const data = await getJson(`${api}/slots/available?${q.toString()}`, signal);
|
|
68
|
+
// API returns { data: { slots: {...} } }; tolerate a bare map too.
|
|
69
|
+
const slots = data.slots ?? data;
|
|
70
|
+
return slots ?? {};
|
|
71
|
+
}
|
|
72
|
+
async function createBooking(api, input, signal) {
|
|
73
|
+
const res = await fetch(`${api}/bookings`, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
Accept: 'application/json',
|
|
78
|
+
'cal-api-version': exports.CAL_API_VERSION,
|
|
79
|
+
},
|
|
80
|
+
body: JSON.stringify({
|
|
81
|
+
eventTypeSlug: input.eventTypeSlug,
|
|
82
|
+
user: input.username,
|
|
83
|
+
start: input.start,
|
|
84
|
+
timeZone: input.timeZone,
|
|
85
|
+
responses: input.responses,
|
|
86
|
+
}),
|
|
87
|
+
signal,
|
|
88
|
+
});
|
|
89
|
+
const body = await readJson(res);
|
|
90
|
+
if (!res.ok)
|
|
91
|
+
throw new CalendarError(messageOf(body, res.status), res.status);
|
|
92
|
+
return body.data;
|
|
93
|
+
}
|
|
94
|
+
async function fetchBooking(api, uid, signal) {
|
|
95
|
+
return getJson(`${api}/bookings/${encodeURIComponent(uid)}`, signal);
|
|
96
|
+
}
|
|
97
|
+
async function cancelBooking(api, uid, reason, signal) {
|
|
98
|
+
const res = await fetch(`${api}/bookings/${encodeURIComponent(uid)}/cancel`, {
|
|
99
|
+
method: 'POST',
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
Accept: 'application/json',
|
|
103
|
+
'cal-api-version': exports.CAL_API_VERSION,
|
|
104
|
+
},
|
|
105
|
+
body: JSON.stringify({ reason: reason ?? '' }),
|
|
106
|
+
signal,
|
|
107
|
+
});
|
|
108
|
+
const body = await readJson(res);
|
|
109
|
+
if (!res.ok)
|
|
110
|
+
throw new CalendarError(messageOf(body, res.status), res.status);
|
|
111
|
+
return body.data;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// React data hooks over the client. useState/useEffect only — no query lib.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.useEventType = useEventType;
|
|
5
|
+
exports.useAvailableSlots = useAvailableSlots;
|
|
6
|
+
exports.useCreateBooking = useCreateBooking;
|
|
7
|
+
exports.useBooking = useBooking;
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const client_ts_1 = require("./client.js");
|
|
10
|
+
function useEventType(api, eventSlug, username) {
|
|
11
|
+
const [state, setState] = (0, react_1.useState)({
|
|
12
|
+
data: null,
|
|
13
|
+
loading: true,
|
|
14
|
+
error: null,
|
|
15
|
+
});
|
|
16
|
+
(0, react_1.useEffect)(() => {
|
|
17
|
+
const ctrl = new AbortController();
|
|
18
|
+
setState({ data: null, loading: true, error: null });
|
|
19
|
+
(0, client_ts_1.fetchEventType)(api, eventSlug, username, ctrl.signal)
|
|
20
|
+
.then((data) => setState({ data, loading: false, error: null }))
|
|
21
|
+
.catch((err) => {
|
|
22
|
+
if (ctrl.signal.aborted)
|
|
23
|
+
return;
|
|
24
|
+
setState({ data: null, loading: false, error: errorText(err) });
|
|
25
|
+
});
|
|
26
|
+
return () => ctrl.abort();
|
|
27
|
+
}, [api, eventSlug, username]);
|
|
28
|
+
return state;
|
|
29
|
+
}
|
|
30
|
+
function useAvailableSlots(api, query) {
|
|
31
|
+
const { eventTypeSlug, username, startTime, endTime, timeZone, enabled = true } = query;
|
|
32
|
+
const [state, setState] = (0, react_1.useState)({
|
|
33
|
+
data: null,
|
|
34
|
+
loading: enabled,
|
|
35
|
+
error: null,
|
|
36
|
+
});
|
|
37
|
+
const [nonce, setNonce] = (0, react_1.useState)(0);
|
|
38
|
+
const refetch = (0, react_1.useCallback)(() => setNonce((n) => n + 1), []);
|
|
39
|
+
(0, react_1.useEffect)(() => {
|
|
40
|
+
if (!enabled)
|
|
41
|
+
return;
|
|
42
|
+
const ctrl = new AbortController();
|
|
43
|
+
setState((s) => ({ data: s.data, loading: true, error: null }));
|
|
44
|
+
(0, client_ts_1.fetchSlots)(api, { eventTypeSlug, username, startTime, endTime, timeZone }, ctrl.signal)
|
|
45
|
+
.then((data) => setState({ data, loading: false, error: null }))
|
|
46
|
+
.catch((err) => {
|
|
47
|
+
if (ctrl.signal.aborted)
|
|
48
|
+
return;
|
|
49
|
+
setState({ data: null, loading: false, error: errorText(err) });
|
|
50
|
+
});
|
|
51
|
+
return () => ctrl.abort();
|
|
52
|
+
}, [api, eventTypeSlug, username, startTime, endTime, timeZone, enabled, nonce]);
|
|
53
|
+
return { ...state, refetch };
|
|
54
|
+
}
|
|
55
|
+
function useCreateBooking(api) {
|
|
56
|
+
const [submitting, setSubmitting] = (0, react_1.useState)(false);
|
|
57
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
58
|
+
const [conflict, setConflict] = (0, react_1.useState)(false);
|
|
59
|
+
const mounted = (0, react_1.useRef)(true);
|
|
60
|
+
(0, react_1.useEffect)(() => {
|
|
61
|
+
mounted.current = true;
|
|
62
|
+
return () => {
|
|
63
|
+
mounted.current = false;
|
|
64
|
+
};
|
|
65
|
+
}, []);
|
|
66
|
+
const reset = (0, react_1.useCallback)(() => {
|
|
67
|
+
setError(null);
|
|
68
|
+
setConflict(false);
|
|
69
|
+
}, []);
|
|
70
|
+
const submit = (0, react_1.useCallback)(async (input) => {
|
|
71
|
+
setSubmitting(true);
|
|
72
|
+
setError(null);
|
|
73
|
+
setConflict(false);
|
|
74
|
+
try {
|
|
75
|
+
const booking = await (0, client_ts_1.createBooking)(api, input);
|
|
76
|
+
return { ok: true, booking };
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const isConflict = err instanceof client_ts_1.CalendarError && err.conflict;
|
|
80
|
+
const message = errorText(err);
|
|
81
|
+
if (mounted.current) {
|
|
82
|
+
setError(message);
|
|
83
|
+
setConflict(isConflict);
|
|
84
|
+
}
|
|
85
|
+
return { ok: false, conflict: isConflict, message };
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
if (mounted.current)
|
|
89
|
+
setSubmitting(false);
|
|
90
|
+
}
|
|
91
|
+
}, [api]);
|
|
92
|
+
return { submit, submitting, error, conflict, reset };
|
|
93
|
+
}
|
|
94
|
+
function useBooking(api, uid) {
|
|
95
|
+
const [state, setState] = (0, react_1.useState)({
|
|
96
|
+
data: null,
|
|
97
|
+
loading: !!uid,
|
|
98
|
+
error: null,
|
|
99
|
+
});
|
|
100
|
+
(0, react_1.useEffect)(() => {
|
|
101
|
+
if (!uid)
|
|
102
|
+
return;
|
|
103
|
+
const ctrl = new AbortController();
|
|
104
|
+
setState({ data: null, loading: true, error: null });
|
|
105
|
+
(0, client_ts_1.fetchBooking)(api, uid, ctrl.signal)
|
|
106
|
+
.then((data) => setState({ data, loading: false, error: null }))
|
|
107
|
+
.catch((err) => {
|
|
108
|
+
if (ctrl.signal.aborted)
|
|
109
|
+
return;
|
|
110
|
+
setState({ data: null, loading: false, error: errorText(err) });
|
|
111
|
+
});
|
|
112
|
+
return () => ctrl.abort();
|
|
113
|
+
}, [api, uid]);
|
|
114
|
+
return state;
|
|
115
|
+
}
|
|
116
|
+
function errorText(err) {
|
|
117
|
+
if (err instanceof Error)
|
|
118
|
+
return err.message;
|
|
119
|
+
return 'Something went wrong';
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
|