@hanzo/booker 8.3.0 → 8.3.3

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.
Files changed (166) hide show
  1. package/README.md +6 -6
  2. package/dist/cjs/Booker.js +23 -0
  3. package/dist/cjs/Booker.js.map +1 -0
  4. package/dist/cjs/BookingForm.js +32 -0
  5. package/dist/cjs/BookingForm.js.map +1 -0
  6. package/dist/cjs/CalendarEmbed.js +20 -0
  7. package/dist/cjs/CalendarEmbed.js.map +1 -0
  8. package/dist/cjs/Confirmation.js +34 -0
  9. package/dist/cjs/Confirmation.js.map +1 -0
  10. package/dist/cjs/EventHeader.js +31 -0
  11. package/dist/cjs/EventHeader.js.map +1 -0
  12. package/dist/cjs/MonthCalendar.js +24 -0
  13. package/dist/cjs/MonthCalendar.js.map +1 -0
  14. package/dist/cjs/TimeSlots.js +21 -0
  15. package/dist/cjs/TimeSlots.js.map +1 -0
  16. package/dist/cjs/client.js +113 -0
  17. package/dist/cjs/client.js.map +1 -0
  18. package/dist/cjs/hooks.js +121 -0
  19. package/dist/cjs/hooks.js.map +1 -0
  20. package/dist/cjs/index.js +55 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/package.json +1 -0
  23. package/dist/cjs/time.js +129 -0
  24. package/dist/cjs/time.js.map +1 -0
  25. package/dist/cjs/useBooker.js +135 -0
  26. package/dist/cjs/useBooker.js.map +1 -0
  27. package/dist/esm/Booker.js +20 -0
  28. package/dist/esm/Booker.js.map +1 -0
  29. package/dist/esm/BookingForm.js +29 -0
  30. package/dist/esm/BookingForm.js.map +1 -0
  31. package/dist/esm/CalendarEmbed.js +17 -0
  32. package/dist/esm/CalendarEmbed.js.map +1 -0
  33. package/dist/esm/Confirmation.js +31 -0
  34. package/dist/esm/Confirmation.js.map +1 -0
  35. package/dist/esm/EventHeader.js +28 -0
  36. package/dist/esm/EventHeader.js.map +1 -0
  37. package/dist/esm/MonthCalendar.js +21 -0
  38. package/dist/esm/MonthCalendar.js.map +1 -0
  39. package/dist/esm/TimeSlots.js +18 -0
  40. package/dist/esm/TimeSlots.js.map +1 -0
  41. package/dist/esm/client.js +104 -0
  42. package/dist/esm/client.js.map +1 -0
  43. package/dist/esm/hooks.js +115 -0
  44. package/dist/esm/hooks.js.map +1 -0
  45. package/dist/esm/index.js +18 -13
  46. package/dist/esm/index.js.map +1 -1
  47. package/dist/esm/time.js +113 -0
  48. package/dist/esm/time.js.map +1 -0
  49. package/dist/esm/useBooker.js +132 -0
  50. package/dist/esm/useBooker.js.map +1 -0
  51. package/package.json +28 -28
  52. package/src/Booker.tsx +7 -7
  53. package/src/BookingForm.tsx +2 -2
  54. package/src/CalendarEmbed.tsx +7 -7
  55. package/src/Confirmation.tsx +4 -4
  56. package/src/EventHeader.tsx +1 -1
  57. package/src/MonthCalendar.tsx +1 -1
  58. package/src/TimeSlots.tsx +2 -2
  59. package/src/hooks.ts +1 -1
  60. package/src/index.ts +11 -11
  61. package/src/useBooker.ts +9 -4
  62. package/types/Booker.d.ts +2 -2
  63. package/types/Booker.d.ts.map +1 -1
  64. package/types/BookingForm.d.ts +2 -2
  65. package/types/BookingForm.d.ts.map +1 -1
  66. package/types/CalendarEmbed.d.ts +2 -2
  67. package/types/CalendarEmbed.d.ts.map +1 -1
  68. package/types/Confirmation.d.ts +2 -2
  69. package/types/Confirmation.d.ts.map +1 -1
  70. package/types/EventHeader.d.ts +2 -2
  71. package/types/EventHeader.d.ts.map +1 -1
  72. package/types/MonthCalendar.d.ts +1 -1
  73. package/types/MonthCalendar.d.ts.map +1 -1
  74. package/types/TimeSlots.d.ts +2 -2
  75. package/types/TimeSlots.d.ts.map +1 -1
  76. package/types/client.d.ts.map +1 -1
  77. package/types/hooks.d.ts +1 -1
  78. package/types/hooks.d.ts.map +1 -1
  79. package/types/index.d.ts +11 -11
  80. package/types/index.d.ts.map +1 -1
  81. package/types/useBooker.d.ts +3 -3
  82. package/types/useBooker.d.ts.map +1 -1
  83. package/dist/cjs/Booker.cjs +0 -153
  84. package/dist/cjs/Booker.native.js +0 -158
  85. package/dist/cjs/Booker.native.js.map +0 -1
  86. package/dist/cjs/BookingForm.cjs +0 -197
  87. package/dist/cjs/BookingForm.native.js +0 -203
  88. package/dist/cjs/BookingForm.native.js.map +0 -1
  89. package/dist/cjs/CalendarEmbed.cjs +0 -121
  90. package/dist/cjs/CalendarEmbed.native.js +0 -125
  91. package/dist/cjs/CalendarEmbed.native.js.map +0 -1
  92. package/dist/cjs/Confirmation.cjs +0 -177
  93. package/dist/cjs/Confirmation.native.js +0 -185
  94. package/dist/cjs/Confirmation.native.js.map +0 -1
  95. package/dist/cjs/EventHeader.cjs +0 -112
  96. package/dist/cjs/EventHeader.native.js +0 -118
  97. package/dist/cjs/EventHeader.native.js.map +0 -1
  98. package/dist/cjs/MonthCalendar.cjs +0 -177
  99. package/dist/cjs/MonthCalendar.native.js +0 -191
  100. package/dist/cjs/MonthCalendar.native.js.map +0 -1
  101. package/dist/cjs/TimeSlots.cjs +0 -119
  102. package/dist/cjs/TimeSlots.native.js +0 -126
  103. package/dist/cjs/TimeSlots.native.js.map +0 -1
  104. package/dist/cjs/client.cjs +0 -136
  105. package/dist/cjs/client.native.js +0 -267
  106. package/dist/cjs/client.native.js.map +0 -1
  107. package/dist/cjs/hooks.cjs +0 -193
  108. package/dist/cjs/hooks.native.js +0 -221
  109. package/dist/cjs/hooks.native.js.map +0 -1
  110. package/dist/cjs/index.cjs +0 -71
  111. package/dist/cjs/index.native.js +0 -74
  112. package/dist/cjs/index.native.js.map +0 -1
  113. package/dist/cjs/time.cjs +0 -145
  114. package/dist/cjs/time.native.js +0 -150
  115. package/dist/cjs/time.native.js.map +0 -1
  116. package/dist/cjs/useBooker.cjs +0 -151
  117. package/dist/cjs/useBooker.native.js +0 -173
  118. package/dist/cjs/useBooker.native.js.map +0 -1
  119. package/dist/esm/Booker.mjs +0 -128
  120. package/dist/esm/Booker.mjs.map +0 -1
  121. package/dist/esm/Booker.native.js +0 -130
  122. package/dist/esm/Booker.native.js.map +0 -1
  123. package/dist/esm/BookingForm.mjs +0 -172
  124. package/dist/esm/BookingForm.mjs.map +0 -1
  125. package/dist/esm/BookingForm.native.js +0 -175
  126. package/dist/esm/BookingForm.native.js.map +0 -1
  127. package/dist/esm/CalendarEmbed.mjs +0 -96
  128. package/dist/esm/CalendarEmbed.mjs.map +0 -1
  129. package/dist/esm/CalendarEmbed.native.js +0 -97
  130. package/dist/esm/CalendarEmbed.native.js.map +0 -1
  131. package/dist/esm/Confirmation.mjs +0 -152
  132. package/dist/esm/Confirmation.mjs.map +0 -1
  133. package/dist/esm/Confirmation.native.js +0 -157
  134. package/dist/esm/Confirmation.native.js.map +0 -1
  135. package/dist/esm/EventHeader.mjs +0 -87
  136. package/dist/esm/EventHeader.mjs.map +0 -1
  137. package/dist/esm/EventHeader.native.js +0 -90
  138. package/dist/esm/EventHeader.native.js.map +0 -1
  139. package/dist/esm/MonthCalendar.mjs +0 -152
  140. package/dist/esm/MonthCalendar.mjs.map +0 -1
  141. package/dist/esm/MonthCalendar.native.js +0 -163
  142. package/dist/esm/MonthCalendar.native.js.map +0 -1
  143. package/dist/esm/TimeSlots.mjs +0 -94
  144. package/dist/esm/TimeSlots.mjs.map +0 -1
  145. package/dist/esm/TimeSlots.native.js +0 -98
  146. package/dist/esm/TimeSlots.native.js.map +0 -1
  147. package/dist/esm/client.mjs +0 -104
  148. package/dist/esm/client.mjs.map +0 -1
  149. package/dist/esm/client.native.js +0 -232
  150. package/dist/esm/client.native.js.map +0 -1
  151. package/dist/esm/hooks.mjs +0 -165
  152. package/dist/esm/hooks.mjs.map +0 -1
  153. package/dist/esm/hooks.native.js +0 -190
  154. package/dist/esm/hooks.native.js.map +0 -1
  155. package/dist/esm/index.mjs +0 -13
  156. package/dist/esm/index.mjs.map +0 -1
  157. package/dist/esm/index.native.js +0 -13
  158. package/dist/esm/index.native.js.map +0 -1
  159. package/dist/esm/time.mjs +0 -107
  160. package/dist/esm/time.mjs.map +0 -1
  161. package/dist/esm/time.native.js +0 -109
  162. package/dist/esm/time.native.js.map +0 -1
  163. package/dist/esm/useBooker.mjs +0 -126
  164. package/dist/esm/useBooker.mjs.map +0 -1
  165. package/dist/esm/useBooker.native.js +0 -145
  166. 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 | 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. |
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":"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"}
@@ -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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"}