@hanzo/booker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +78 -0
  2. package/dist/cjs/Booker.cjs +153 -0
  3. package/dist/cjs/Booker.native.js +158 -0
  4. package/dist/cjs/Booker.native.js.map +1 -0
  5. package/dist/cjs/BookingForm.cjs +197 -0
  6. package/dist/cjs/BookingForm.native.js +203 -0
  7. package/dist/cjs/BookingForm.native.js.map +1 -0
  8. package/dist/cjs/CalendarEmbed.cjs +121 -0
  9. package/dist/cjs/CalendarEmbed.native.js +125 -0
  10. package/dist/cjs/CalendarEmbed.native.js.map +1 -0
  11. package/dist/cjs/Confirmation.cjs +177 -0
  12. package/dist/cjs/Confirmation.native.js +185 -0
  13. package/dist/cjs/Confirmation.native.js.map +1 -0
  14. package/dist/cjs/EventHeader.cjs +112 -0
  15. package/dist/cjs/EventHeader.native.js +118 -0
  16. package/dist/cjs/EventHeader.native.js.map +1 -0
  17. package/dist/cjs/MonthCalendar.cjs +177 -0
  18. package/dist/cjs/MonthCalendar.native.js +191 -0
  19. package/dist/cjs/MonthCalendar.native.js.map +1 -0
  20. package/dist/cjs/TimeSlots.cjs +119 -0
  21. package/dist/cjs/TimeSlots.native.js +126 -0
  22. package/dist/cjs/TimeSlots.native.js.map +1 -0
  23. package/dist/cjs/client.cjs +136 -0
  24. package/dist/cjs/client.native.js +267 -0
  25. package/dist/cjs/client.native.js.map +1 -0
  26. package/dist/cjs/hooks.cjs +193 -0
  27. package/dist/cjs/hooks.native.js +221 -0
  28. package/dist/cjs/hooks.native.js.map +1 -0
  29. package/dist/cjs/index.cjs +71 -0
  30. package/dist/cjs/index.native.js +74 -0
  31. package/dist/cjs/index.native.js.map +1 -0
  32. package/dist/cjs/time.cjs +145 -0
  33. package/dist/cjs/time.native.js +150 -0
  34. package/dist/cjs/time.native.js.map +1 -0
  35. package/dist/cjs/useBooker.cjs +151 -0
  36. package/dist/cjs/useBooker.native.js +173 -0
  37. package/dist/cjs/useBooker.native.js.map +1 -0
  38. package/dist/esm/Booker.mjs +128 -0
  39. package/dist/esm/Booker.mjs.map +1 -0
  40. package/dist/esm/Booker.native.js +130 -0
  41. package/dist/esm/Booker.native.js.map +1 -0
  42. package/dist/esm/BookingForm.mjs +172 -0
  43. package/dist/esm/BookingForm.mjs.map +1 -0
  44. package/dist/esm/BookingForm.native.js +175 -0
  45. package/dist/esm/BookingForm.native.js.map +1 -0
  46. package/dist/esm/CalendarEmbed.mjs +96 -0
  47. package/dist/esm/CalendarEmbed.mjs.map +1 -0
  48. package/dist/esm/CalendarEmbed.native.js +97 -0
  49. package/dist/esm/CalendarEmbed.native.js.map +1 -0
  50. package/dist/esm/Confirmation.mjs +152 -0
  51. package/dist/esm/Confirmation.mjs.map +1 -0
  52. package/dist/esm/Confirmation.native.js +157 -0
  53. package/dist/esm/Confirmation.native.js.map +1 -0
  54. package/dist/esm/EventHeader.mjs +87 -0
  55. package/dist/esm/EventHeader.mjs.map +1 -0
  56. package/dist/esm/EventHeader.native.js +90 -0
  57. package/dist/esm/EventHeader.native.js.map +1 -0
  58. package/dist/esm/MonthCalendar.mjs +152 -0
  59. package/dist/esm/MonthCalendar.mjs.map +1 -0
  60. package/dist/esm/MonthCalendar.native.js +163 -0
  61. package/dist/esm/MonthCalendar.native.js.map +1 -0
  62. package/dist/esm/TimeSlots.mjs +94 -0
  63. package/dist/esm/TimeSlots.mjs.map +1 -0
  64. package/dist/esm/TimeSlots.native.js +98 -0
  65. package/dist/esm/TimeSlots.native.js.map +1 -0
  66. package/dist/esm/client.mjs +104 -0
  67. package/dist/esm/client.mjs.map +1 -0
  68. package/dist/esm/client.native.js +232 -0
  69. package/dist/esm/client.native.js.map +1 -0
  70. package/dist/esm/hooks.mjs +165 -0
  71. package/dist/esm/hooks.mjs.map +1 -0
  72. package/dist/esm/hooks.native.js +190 -0
  73. package/dist/esm/hooks.native.js.map +1 -0
  74. package/dist/esm/index.js +13 -0
  75. package/dist/esm/index.js.map +1 -0
  76. package/dist/esm/index.mjs +13 -0
  77. package/dist/esm/index.mjs.map +1 -0
  78. package/dist/esm/index.native.js +13 -0
  79. package/dist/esm/index.native.js.map +1 -0
  80. package/dist/esm/time.mjs +107 -0
  81. package/dist/esm/time.mjs.map +1 -0
  82. package/dist/esm/time.native.js +109 -0
  83. package/dist/esm/time.native.js.map +1 -0
  84. package/dist/esm/useBooker.mjs +126 -0
  85. package/dist/esm/useBooker.mjs.map +1 -0
  86. package/dist/esm/useBooker.native.js +145 -0
  87. package/dist/esm/useBooker.native.js.map +1 -0
  88. package/package.json +61 -0
  89. package/src/Booker.tsx +152 -0
  90. package/src/BookingForm.tsx +180 -0
  91. package/src/CalendarEmbed.tsx +111 -0
  92. package/src/Confirmation.tsx +145 -0
  93. package/src/EventHeader.tsx +85 -0
  94. package/src/MonthCalendar.tsx +179 -0
  95. package/src/TimeSlots.tsx +102 -0
  96. package/src/client.ts +218 -0
  97. package/src/hooks.ts +180 -0
  98. package/src/index.ts +72 -0
  99. package/src/time.ts +131 -0
  100. package/src/useBooker.ts +187 -0
  101. package/types/Booker.d.ts +16 -0
  102. package/types/Booker.d.ts.map +1 -0
  103. package/types/BookingForm.d.ts +13 -0
  104. package/types/BookingForm.d.ts.map +1 -0
  105. package/types/CalendarEmbed.d.ts +15 -0
  106. package/types/CalendarEmbed.d.ts.map +1 -0
  107. package/types/Confirmation.d.ts +12 -0
  108. package/types/Confirmation.d.ts.map +1 -0
  109. package/types/EventHeader.d.ts +10 -0
  110. package/types/EventHeader.d.ts.map +1 -0
  111. package/types/MonthCalendar.d.ts +14 -0
  112. package/types/MonthCalendar.d.ts.map +1 -0
  113. package/types/TimeSlots.d.ts +15 -0
  114. package/types/TimeSlots.d.ts.map +1 -0
  115. package/types/client.d.ts +77 -0
  116. package/types/client.d.ts.map +1 -0
  117. package/types/hooks.d.ts +43 -0
  118. package/types/hooks.d.ts.map +1 -0
  119. package/types/index.d.ts +12 -0
  120. package/types/index.d.ts.map +1 -0
  121. package/types/time.d.ts +38 -0
  122. package/types/time.d.ts.map +1 -0
  123. package/types/useBooker.d.ts +41 -0
  124. package/types/useBooker.d.ts.map +1 -0
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var useBooker_exports = {};
26
+ __export(useBooker_exports, {
27
+ useBooker: () => useBooker
28
+ });
29
+ module.exports = __toCommonJS(useBooker_exports);
30
+ var import_react = require("react");
31
+ var import_client = require("./client.native.js");
32
+ var import_hooks = require("./hooks.native.js");
33
+ var import_time = require("./time.native.js");
34
+ function useBooker(opts) {
35
+ var _opts_apiUrl;
36
+ var api = (_opts_apiUrl = opts.apiUrl) !== null && _opts_apiUrl !== void 0 ? _opts_apiUrl : import_client.DEFAULT_API_URL;
37
+ var _opts_timeZone;
38
+ var timeZone = (_opts_timeZone = opts.timeZone) !== null && _opts_timeZone !== void 0 ? _opts_timeZone : (0, import_time.visitorTimeZone)();
39
+ var _opts_weekStartsOn;
40
+ var weekStartsOn = (_opts_weekStartsOn = opts.weekStartsOn) !== null && _opts_weekStartsOn !== void 0 ? _opts_weekStartsOn : 0;
41
+ var event = (0, import_hooks.useEventType)(api, opts.eventSlug, opts.host);
42
+ var [viewDate, setViewDate] = (0, import_react.useState)(function () {
43
+ return (0, import_time.startOfMonth)(/* @__PURE__ */new Date());
44
+ });
45
+ var {
46
+ startTime,
47
+ endTime
48
+ } = (0, import_react.useMemo)(function () {
49
+ return (0, import_time.monthRange)(viewDate);
50
+ }, [viewDate]);
51
+ var slots = (0, import_hooks.useAvailableSlots)(api, {
52
+ eventTypeSlug: opts.eventSlug,
53
+ username: opts.host,
54
+ startTime,
55
+ endTime,
56
+ timeZone,
57
+ enabled: !!event.data
58
+ });
59
+ var [selectedDay, setSelectedDay] = (0, import_react.useState)(null);
60
+ var [selectedSlot, setSelectedSlot] = (0, import_react.useState)(null);
61
+ var [phase, setPhase] = (0, import_react.useState)("pick");
62
+ var [booking, setBooking] = (0, import_react.useState)(null);
63
+ var create = (0, import_hooks.useCreateBooking)(api);
64
+ var availableKeys = (0, import_react.useMemo)(function () {
65
+ var _slots_data;
66
+ var map = (_slots_data = slots.data) !== null && _slots_data !== void 0 ? _slots_data : {};
67
+ return new Set(Object.keys(map).filter(function (k) {
68
+ var _map_k;
69
+ var _map_k_length;
70
+ return ((_map_k_length = (_map_k = map[k]) === null || _map_k === void 0 ? void 0 : _map_k.length) !== null && _map_k_length !== void 0 ? _map_k_length : 0) > 0;
71
+ }));
72
+ }, [slots.data]);
73
+ var daySlots = (0, import_react.useMemo)(function () {
74
+ var _slots_data;
75
+ if (!selectedDay) return [];
76
+ var _slots_data_selectedDay;
77
+ return (_slots_data_selectedDay = (_slots_data = slots.data) === null || _slots_data === void 0 ? void 0 : _slots_data[selectedDay]) !== null && _slots_data_selectedDay !== void 0 ? _slots_data_selectedDay : [];
78
+ }, [slots.data, selectedDay]);
79
+ (0, import_react.useEffect)(function () {
80
+ if (!opts.autoSelectFirst) return;
81
+ if (selectedDay && availableKeys.has(selectedDay)) return;
82
+ var first = [...availableKeys].sort()[0];
83
+ if (first) {
84
+ setSelectedDay(first);
85
+ setSelectedSlot(null);
86
+ }
87
+ }, [opts.autoSelectFirst, availableKeys, selectedDay]);
88
+ var now = (0, import_time.startOfMonth)(/* @__PURE__ */new Date());
89
+ var atFirstMonth = viewDate.getFullYear() === now.getFullYear() && viewDate.getMonth() === now.getMonth();
90
+ var goPrevMonth = function () {
91
+ if (atFirstMonth) return;
92
+ setViewDate(function (d) {
93
+ return (0, import_time.addMonths)(d, -1);
94
+ });
95
+ setSelectedDay(null);
96
+ setSelectedSlot(null);
97
+ };
98
+ var goNextMonth = function () {
99
+ setViewDate(function (d) {
100
+ return (0, import_time.addMonths)(d, 1);
101
+ });
102
+ setSelectedDay(null);
103
+ setSelectedSlot(null);
104
+ };
105
+ var selectDay = function (key) {
106
+ setSelectedDay(key);
107
+ setSelectedSlot(null);
108
+ };
109
+ var selectSlot = function (iso) {
110
+ setSelectedSlot(iso);
111
+ setPhase("form");
112
+ create.reset();
113
+ };
114
+ var back = function () {
115
+ setPhase("pick");
116
+ setSelectedSlot(null);
117
+ create.reset();
118
+ };
119
+ var reset = function () {
120
+ setBooking(null);
121
+ setSelectedSlot(null);
122
+ setSelectedDay(null);
123
+ setPhase("pick");
124
+ create.reset();
125
+ slots.refetch();
126
+ };
127
+ var submit = async function (responses) {
128
+ if (!selectedSlot) return;
129
+ var result = await create.submit({
130
+ eventTypeSlug: opts.eventSlug,
131
+ username: opts.host,
132
+ start: selectedSlot,
133
+ timeZone,
134
+ responses
135
+ });
136
+ if (result.ok) {
137
+ var _opts_onBooked;
138
+ setBooking(result.booking);
139
+ setPhase("done");
140
+ (_opts_onBooked = opts.onBooked) === null || _opts_onBooked === void 0 ? void 0 : _opts_onBooked.call(opts, result.booking);
141
+ } else if (result.conflict) {
142
+ slots.refetch();
143
+ setSelectedSlot(null);
144
+ setPhase("pick");
145
+ }
146
+ };
147
+ return {
148
+ api,
149
+ timeZone,
150
+ weekStartsOn,
151
+ event,
152
+ slots,
153
+ viewDate,
154
+ availableKeys,
155
+ selectedDay,
156
+ daySlots,
157
+ selectedSlot,
158
+ phase,
159
+ booking,
160
+ submitting: create.submitting,
161
+ error: create.error,
162
+ conflict: create.conflict,
163
+ goPrevMonth,
164
+ goNextMonth,
165
+ atFirstMonth,
166
+ selectDay,
167
+ selectSlot,
168
+ submit,
169
+ back,
170
+ reset
171
+ };
172
+ }
173
+ //# sourceMappingURL=useBooker.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","useBooker_exports","__export","useBooker","module","exports","import_react","require","import_client","import_hooks","import_time","opts","_opts_apiUrl","api","apiUrl","DEFAULT_API_URL","_opts_timeZone","timeZone","visitorTimeZone","_opts_weekStartsOn","weekStartsOn","event","useEventType","eventSlug","host","viewDate","setViewDate","useState","startOfMonth","Date","startTime","endTime","useMemo","monthRange","slots","useAvailableSlots","eventTypeSlug","username","enabled","data","selectedDay","setSelectedDay","selectedSlot","setSelectedSlot","phase","setPhase","booking","setBooking","create","useCreateBooking","availableKeys","_slots_data","map","Set","Object","keys","filter","k","_map_k","_map_k_length","length","daySlots","_slots_data_selectedDay","useEffect","autoSelectFirst","has","first","sort","now","atFirstMonth","getFullYear","getMonth","goPrevMonth","d","addMonths","goNextMonth","selectDay","key","selectSlot","iso","reset","back","refetch","submit","responses","result","start","ok","_opts_onBooked"],"sources":["../../src/useBooker.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,128 @@
1
+ import { SizableText, Spinner, XStack, YStack } from "hanzogui";
2
+ import { BookingForm } from "./BookingForm.mjs";
3
+ import { Confirmation } from "./Confirmation.mjs";
4
+ import { EventHeader } from "./EventHeader.mjs";
5
+ import { MonthCalendar } from "./MonthCalendar.mjs";
6
+ import { TimeSlots } from "./TimeSlots.mjs";
7
+ import { useBooker } from "./useBooker.mjs";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ function Booker(props) {
10
+ const m = useBooker(props);
11
+ return /* @__PURE__ */jsx(YStack, {
12
+ backgroundColor: "$background",
13
+ borderColor: "$borderColor",
14
+ borderWidth: 1,
15
+ borderRadius: "$6",
16
+ padding: "$4",
17
+ gap: "$4",
18
+ width: "100%",
19
+ maxWidth: 860,
20
+ alignSelf: "center",
21
+ children: m.event.loading ? /* @__PURE__ */jsxs(StatePanel, {
22
+ children: [/* @__PURE__ */jsx(Spinner, {
23
+ size: "large",
24
+ color: "$color9"
25
+ }), /* @__PURE__ */jsx(SizableText, {
26
+ size: "$3",
27
+ color: "$color10",
28
+ children: "Loading\u2026"
29
+ })]
30
+ }) : m.event.error || !m.event.data ? /* @__PURE__ */jsxs(StatePanel, {
31
+ children: [/* @__PURE__ */jsx(SizableText, {
32
+ size: "$5",
33
+ fontWeight: "600",
34
+ color: "$color12",
35
+ children: "Couldn't load this event"
36
+ }), /* @__PURE__ */jsx(SizableText, {
37
+ size: "$3",
38
+ color: "$color10",
39
+ textAlign: "center",
40
+ children: m.event.error ?? "The event type was not found."
41
+ })]
42
+ }) : m.phase === "done" && m.booking ? /* @__PURE__ */jsx(Confirmation, {
43
+ booking: m.booking,
44
+ timeZone: m.timeZone,
45
+ onDone: m.reset
46
+ }) : /* @__PURE__ */jsxs(YStack, {
47
+ gap: "$4",
48
+ children: [/* @__PURE__ */jsx(EventHeader, {
49
+ event: m.event.data,
50
+ host: props.host,
51
+ timeZone: m.timeZone,
52
+ compact: m.phase === "form"
53
+ }), m.phase === "form" && m.selectedSlot ? /* @__PURE__ */jsx(BookingForm, {
54
+ slotIso: m.selectedSlot,
55
+ timeZone: m.timeZone,
56
+ eventLength: m.event.data.length,
57
+ submitting: m.submitting,
58
+ error: m.error,
59
+ onSubmit: m.submit,
60
+ onBack: m.back
61
+ }) : /* @__PURE__ */jsxs(Fragment, {
62
+ children: [m.conflict ? /* @__PURE__ */jsx(JustTakenBanner, {}) : null, m.slots.error ? /* @__PURE__ */jsxs(SizableText, {
63
+ size: "$2",
64
+ color: "$red10",
65
+ children: ["Couldn't load availability: ", m.slots.error]
66
+ }) : null, /* @__PURE__ */jsxs(XStack, {
67
+ gap: "$5",
68
+ flexDirection: "column",
69
+ $sm: {
70
+ flexDirection: "row"
71
+ },
72
+ alignItems: "flex-start",
73
+ children: [/* @__PURE__ */jsx(MonthCalendar, {
74
+ viewDate: m.viewDate,
75
+ availableKeys: m.availableKeys,
76
+ selectedDay: m.selectedDay,
77
+ onSelectDay: m.selectDay,
78
+ onPrev: m.goPrevMonth,
79
+ onNext: m.goNextMonth,
80
+ atFirstMonth: m.atFirstMonth,
81
+ weekStartsOn: m.weekStartsOn,
82
+ loading: m.slots.loading
83
+ }), /* @__PURE__ */jsx(TimeSlots, {
84
+ dayKey: m.selectedDay,
85
+ slots: m.daySlots,
86
+ timeZone: m.timeZone,
87
+ onPick: m.selectSlot,
88
+ selectedIso: m.selectedSlot,
89
+ loading: m.slots.loading && !m.selectedDay
90
+ })]
91
+ }), m.availableKeys.size === 0 && !m.slots.loading && !m.slots.error ? /* @__PURE__ */jsx(SizableText, {
92
+ size: "$3",
93
+ color: "$color10",
94
+ textAlign: "center",
95
+ children: "No availability this month \u2014 try the next month."
96
+ }) : null]
97
+ })]
98
+ })
99
+ });
100
+ }
101
+ function StatePanel({
102
+ children
103
+ }) {
104
+ return /* @__PURE__ */jsx(YStack, {
105
+ alignItems: "center",
106
+ justifyContent: "center",
107
+ gap: "$3",
108
+ padding: "$8",
109
+ minHeight: 220,
110
+ children
111
+ });
112
+ }
113
+ function JustTakenBanner() {
114
+ return /* @__PURE__ */jsx(YStack, {
115
+ backgroundColor: "$yellow3",
116
+ borderColor: "$yellow6",
117
+ borderWidth: 1,
118
+ borderRadius: "$4",
119
+ padding: "$2.5",
120
+ children: /* @__PURE__ */jsx(SizableText, {
121
+ size: "$2",
122
+ color: "$yellow11",
123
+ children: "That time was just taken. We refreshed the calendar \u2014 please pick another."
124
+ })
125
+ });
126
+ }
127
+ export { Booker };
128
+ //# sourceMappingURL=Booker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SizableText","Spinner","XStack","YStack","BookingForm","Confirmation","EventHeader","MonthCalendar","TimeSlots","useBooker","Fragment","jsx","jsxs","Booker","props","m","backgroundColor","borderColor","borderWidth","borderRadius","padding","gap","width","maxWidth","alignSelf","children","event","loading","StatePanel","size","color","error","data","fontWeight","textAlign","phase","booking","timeZone","onDone","reset","host","compact","selectedSlot","slotIso","eventLength","length","submitting","onSubmit","submit","onBack","back","conflict","JustTakenBanner","slots","flexDirection","$sm","alignItems","viewDate","availableKeys","selectedDay","onSelectDay","selectDay","onPrev","goPrevMonth","onNext","goNextMonth","atFirstMonth","weekStartsOn","dayKey","daySlots","onPick","selectSlot","selectedIso","justifyContent","minHeight"],"sources":["../../src/Booker.tsx"],"sourcesContent":[null],"mappings":"AACA,SAASA,WAAA,EAAaC,OAAA,EAASC,MAAA,EAAQC,MAAA,QAAc;AAErD,SAASC,WAAA,QAAmB;AAC5B,SAASC,YAAA,QAAoB;AAC7B,SAASC,WAAA,QAAmB;AAC5B,SAASC,aAAA,QAAqB;AAC9B,SAASC,SAAA,QAAiB;AAC1B,SAASC,SAAA,QAAiB;AAgClB,SAqCIC,QAAA,EApCFC,GAAA,EADFC,IAAA;AAhBD,SAASC,OAAOC,KAAA,EAAoB;EACzC,MAAMC,CAAA,GAAIN,SAAA,CAAUK,KAAK;EAEzB,OACE,eAAAH,GAAA,CAACR,MAAA;IACCa,eAAA,EAAgB;IAChBC,WAAA,EAAY;IACZC,WAAA,EAAa;IACbC,YAAA,EAAa;IACbC,OAAA,EAAQ;IACRC,GAAA,EAAI;IACJC,KAAA,EAAM;IACNC,QAAA,EAAU;IACVC,SAAA,EAAU;IAETC,QAAA,EAAAV,CAAA,CAAEW,KAAA,CAAMC,OAAA,GACP,eAAAf,IAAA,CAACgB,UAAA;MACCH,QAAA,kBAAAd,GAAA,CAACV,OAAA;QAAQ4B,IAAA,EAAK;QAAQC,KAAA,EAAM;MAAA,CAAU,GACtC,eAAAnB,GAAA,CAACX,WAAA;QAAY6B,IAAA,EAAK;QAAKC,KAAA,EAAM;QAAWL,QAAA;MAAA,CAExC;IAAA,CACF,IACEV,CAAA,CAAEW,KAAA,CAAMK,KAAA,IAAS,CAAChB,CAAA,CAAEW,KAAA,CAAMM,IAAA,GAC5B,eAAApB,IAAA,CAACgB,UAAA;MACCH,QAAA,kBAAAd,GAAA,CAACX,WAAA;QAAY6B,IAAA,EAAK;QAAKI,UAAA,EAAW;QAAMH,KAAA,EAAM;QAAWL,QAAA;MAAA,CAEzD,GACA,eAAAd,GAAA,CAACX,WAAA;QAAY6B,IAAA,EAAK;QAAKC,KAAA,EAAM;QAAWI,SAAA,EAAU;QAC/CT,QAAA,EAAAV,CAAA,CAAEW,KAAA,CAAMK,KAAA,IAAS;MAAA,CACpB;IAAA,CACF,IACEhB,CAAA,CAAEoB,KAAA,KAAU,UAAUpB,CAAA,CAAEqB,OAAA,GAC1B,eAAAzB,GAAA,CAACN,YAAA;MAAa+B,OAAA,EAASrB,CAAA,CAAEqB,OAAA;MAASC,QAAA,EAAUtB,CAAA,CAAEsB,QAAA;MAAUC,MAAA,EAAQvB,CAAA,CAAEwB;IAAA,CAAO,IAEzE,eAAA3B,IAAA,CAACT,MAAA;MAAOkB,GAAA,EAAI;MACVI,QAAA,kBAAAd,GAAA,CAACL,WAAA;QACCoB,KAAA,EAAOX,CAAA,CAAEW,KAAA,CAAMM,IAAA;QACfQ,IAAA,EAAM1B,KAAA,CAAM0B,IAAA;QACZH,QAAA,EAAUtB,CAAA,CAAEsB,QAAA;QACZI,OAAA,EAAS1B,CAAA,CAAEoB,KAAA,KAAU;MAAA,CACvB,GAECpB,CAAA,CAAEoB,KAAA,KAAU,UAAUpB,CAAA,CAAE2B,YAAA,GACvB,eAAA/B,GAAA,CAACP,WAAA;QACCuC,OAAA,EAAS5B,CAAA,CAAE2B,YAAA;QACXL,QAAA,EAAUtB,CAAA,CAAEsB,QAAA;QACZO,WAAA,EAAa7B,CAAA,CAAEW,KAAA,CAAMM,IAAA,CAAKa,MAAA;QAC1BC,UAAA,EAAY/B,CAAA,CAAE+B,UAAA;QACdf,KAAA,EAAOhB,CAAA,CAAEgB,KAAA;QACTgB,QAAA,EAAUhC,CAAA,CAAEiC,MAAA;QACZC,MAAA,EAAQlC,CAAA,CAAEmC;MAAA,CACZ,IAEA,eAAAtC,IAAA,CAAAF,QAAA;QACGe,QAAA,GAAAV,CAAA,CAAEoC,QAAA,GAAW,eAAAxC,GAAA,CAACyC,eAAA,IAAgB,IAAK,MACnCrC,CAAA,CAAEsC,KAAA,CAAMtB,KAAA,GACP,eAAAnB,IAAA,CAACZ,WAAA;UAAY6B,IAAA,EAAK;UAAKC,KAAA,EAAM;UAASL,QAAA,mCACPV,CAAA,CAAEsC,KAAA,CAAMtB,KAAA;QAAA,CACvC,IACE,MACJ,eAAAnB,IAAA,CAACV,MAAA;UACCmB,GAAA,EAAI;UACJiC,aAAA,EAAc;UACdC,GAAA,EAAK;YAAED,aAAA,EAAe;UAAM;UAC5BE,UAAA,EAAW;UAEX/B,QAAA,kBAAAd,GAAA,CAACJ,aAAA;YACCkD,QAAA,EAAU1C,CAAA,CAAE0C,QAAA;YACZC,aAAA,EAAe3C,CAAA,CAAE2C,aAAA;YACjBC,WAAA,EAAa5C,CAAA,CAAE4C,WAAA;YACfC,WAAA,EAAa7C,CAAA,CAAE8C,SAAA;YACfC,MAAA,EAAQ/C,CAAA,CAAEgD,WAAA;YACVC,MAAA,EAAQjD,CAAA,CAAEkD,WAAA;YACVC,YAAA,EAAcnD,CAAA,CAAEmD,YAAA;YAChBC,YAAA,EAAcpD,CAAA,CAAEoD,YAAA;YAChBxC,OAAA,EAASZ,CAAA,CAAEsC,KAAA,CAAM1B;UAAA,CACnB,GACA,eAAAhB,GAAA,CAACH,SAAA;YACC4D,MAAA,EAAQrD,CAAA,CAAE4C,WAAA;YACVN,KAAA,EAAOtC,CAAA,CAAEsD,QAAA;YACThC,QAAA,EAAUtB,CAAA,CAAEsB,QAAA;YACZiC,MAAA,EAAQvD,CAAA,CAAEwD,UAAA;YACVC,WAAA,EAAazD,CAAA,CAAE2B,YAAA;YACff,OAAA,EAASZ,CAAA,CAAEsC,KAAA,CAAM1B,OAAA,IAAW,CAACZ,CAAA,CAAE4C;UAAA,CACjC;QAAA,CACF,GACC5C,CAAA,CAAE2C,aAAA,CAAc7B,IAAA,KAAS,KAAK,CAACd,CAAA,CAAEsC,KAAA,CAAM1B,OAAA,IAAW,CAACZ,CAAA,CAAEsC,KAAA,CAAMtB,KAAA,GAC1D,eAAApB,GAAA,CAACX,WAAA;UAAY6B,IAAA,EAAK;UAAKC,KAAA,EAAM;UAAWI,SAAA,EAAU;UAAST,QAAA;QAAA,CAE3D,IACE;MAAA,CACN;IAAA,CAEJ;EAAA,CAEJ;AAEJ;AAEA,SAASG,WAAW;EAAEH;AAAS,GAA4B;EACzD,OACE,eAAAd,GAAA,CAACR,MAAA;IACCqD,UAAA,EAAW;IACXiB,cAAA,EAAe;IACfpD,GAAA,EAAI;IACJD,OAAA,EAAQ;IACRsD,SAAA,EAAW;IAEVjD;EAAA,CACH;AAEJ;AAEA,SAAS2B,gBAAA,EAAkB;EACzB,OACE,eAAAzC,GAAA,CAACR,MAAA;IACCa,eAAA,EAAgB;IAChBC,WAAA,EAAY;IACZC,WAAA,EAAa;IACbC,YAAA,EAAa;IACbC,OAAA,EAAQ;IAERK,QAAA,iBAAAd,GAAA,CAACX,WAAA;MAAY6B,IAAA,EAAK;MAAKC,KAAA,EAAM;MAAYL,QAAA;IAAA,CAEzC;EAAA,CACF;AAEJ","ignoreList":[]}
@@ -0,0 +1,130 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { SizableText, Spinner, XStack, YStack } from "hanzogui";
3
+ import { BookingForm } from "./BookingForm.native.js";
4
+ import { Confirmation } from "./Confirmation.native.js";
5
+ import { EventHeader } from "./EventHeader.native.js";
6
+ import { MonthCalendar } from "./MonthCalendar.native.js";
7
+ import { TimeSlots } from "./TimeSlots.native.js";
8
+ import { useBooker } from "./useBooker.native.js";
9
+ function Booker(props) {
10
+ var m = useBooker(props);
11
+ var _m_event_error;
12
+ return /* @__PURE__ */_jsx(YStack, {
13
+ backgroundColor: "$background",
14
+ borderColor: "$borderColor",
15
+ borderWidth: 1,
16
+ borderRadius: "$6",
17
+ padding: "$4",
18
+ gap: "$4",
19
+ width: "100%",
20
+ maxWidth: 860,
21
+ alignSelf: "center",
22
+ children: m.event.loading ? /* @__PURE__ */_jsxs(StatePanel, {
23
+ children: [/* @__PURE__ */_jsx(Spinner, {
24
+ size: "large",
25
+ color: "$color9"
26
+ }), /* @__PURE__ */_jsx(SizableText, {
27
+ size: "$3",
28
+ color: "$color10",
29
+ children: "Loading\u2026"
30
+ })]
31
+ }) : m.event.error || !m.event.data ? /* @__PURE__ */_jsxs(StatePanel, {
32
+ children: [/* @__PURE__ */_jsx(SizableText, {
33
+ size: "$5",
34
+ fontWeight: "600",
35
+ color: "$color12",
36
+ children: "Couldn't load this event"
37
+ }), /* @__PURE__ */_jsx(SizableText, {
38
+ size: "$3",
39
+ color: "$color10",
40
+ textAlign: "center",
41
+ children: (_m_event_error = m.event.error) !== null && _m_event_error !== void 0 ? _m_event_error : "The event type was not found."
42
+ })]
43
+ }) : m.phase === "done" && m.booking ? /* @__PURE__ */_jsx(Confirmation, {
44
+ booking: m.booking,
45
+ timeZone: m.timeZone,
46
+ onDone: m.reset
47
+ }) : /* @__PURE__ */_jsxs(YStack, {
48
+ gap: "$4",
49
+ children: [/* @__PURE__ */_jsx(EventHeader, {
50
+ event: m.event.data,
51
+ host: props.host,
52
+ timeZone: m.timeZone,
53
+ compact: m.phase === "form"
54
+ }), m.phase === "form" && m.selectedSlot ? /* @__PURE__ */_jsx(BookingForm, {
55
+ slotIso: m.selectedSlot,
56
+ timeZone: m.timeZone,
57
+ eventLength: m.event.data.length,
58
+ submitting: m.submitting,
59
+ error: m.error,
60
+ onSubmit: m.submit,
61
+ onBack: m.back
62
+ }) : /* @__PURE__ */_jsxs(_Fragment, {
63
+ children: [m.conflict ? /* @__PURE__ */_jsx(JustTakenBanner, {}) : null, m.slots.error ? /* @__PURE__ */_jsxs(SizableText, {
64
+ size: "$2",
65
+ color: "$red10",
66
+ children: ["Couldn't load availability: ", m.slots.error]
67
+ }) : null, /* @__PURE__ */_jsxs(XStack, {
68
+ gap: "$5",
69
+ flexDirection: "column",
70
+ $sm: {
71
+ flexDirection: "row"
72
+ },
73
+ alignItems: "flex-start",
74
+ children: [/* @__PURE__ */_jsx(MonthCalendar, {
75
+ viewDate: m.viewDate,
76
+ availableKeys: m.availableKeys,
77
+ selectedDay: m.selectedDay,
78
+ onSelectDay: m.selectDay,
79
+ onPrev: m.goPrevMonth,
80
+ onNext: m.goNextMonth,
81
+ atFirstMonth: m.atFirstMonth,
82
+ weekStartsOn: m.weekStartsOn,
83
+ loading: m.slots.loading
84
+ }), /* @__PURE__ */_jsx(TimeSlots, {
85
+ dayKey: m.selectedDay,
86
+ slots: m.daySlots,
87
+ timeZone: m.timeZone,
88
+ onPick: m.selectSlot,
89
+ selectedIso: m.selectedSlot,
90
+ loading: m.slots.loading && !m.selectedDay
91
+ })]
92
+ }), m.availableKeys.size === 0 && !m.slots.loading && !m.slots.error ? /* @__PURE__ */_jsx(SizableText, {
93
+ size: "$3",
94
+ color: "$color10",
95
+ textAlign: "center",
96
+ children: "No availability this month \u2014 try the next month."
97
+ }) : null]
98
+ })]
99
+ })
100
+ });
101
+ }
102
+ function StatePanel(param) {
103
+ var {
104
+ children
105
+ } = param;
106
+ return /* @__PURE__ */_jsx(YStack, {
107
+ alignItems: "center",
108
+ justifyContent: "center",
109
+ gap: "$3",
110
+ padding: "$8",
111
+ minHeight: 220,
112
+ children
113
+ });
114
+ }
115
+ function JustTakenBanner() {
116
+ return /* @__PURE__ */_jsx(YStack, {
117
+ backgroundColor: "$yellow3",
118
+ borderColor: "$yellow6",
119
+ borderWidth: 1,
120
+ borderRadius: "$4",
121
+ padding: "$2.5",
122
+ children: /* @__PURE__ */_jsx(SizableText, {
123
+ size: "$2",
124
+ color: "$yellow11",
125
+ children: "That time was just taken. We refreshed the calendar \u2014 please pick another."
126
+ })
127
+ });
128
+ }
129
+ export { Booker };
130
+ //# sourceMappingURL=Booker.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","SizableText","Spinner","XStack","YStack","BookingForm","Confirmation","EventHeader","MonthCalendar","TimeSlots","useBooker","Booker","props","m","_m_event_error","backgroundColor","borderColor","borderWidth","borderRadius","padding","gap","width","maxWidth","alignSelf","children","event","loading","StatePanel","size","color","error","data","fontWeight","textAlign","phase","booking","timeZone","onDone","reset","host","compact","selectedSlot","slotIso","eventLength","length","submitting","onSubmit","submit","onBack","back","conflict","JustTakenBanner","slots","flexDirection","$sm","alignItems","viewDate","availableKeys","selectedDay","onSelectDay","selectDay","onPrev","goPrevMonth","onNext","goNextMonth","atFirstMonth","weekStartsOn","dayKey","daySlots","onPick","selectSlot","selectedIso","param"],"sources":["../../src/Booker.tsx"],"sourcesContent":[null],"mappings":"AACA,SAASA,GAAA,IAAAC,IAAA,EAAaC,IAAA,IAAAC,KAAS,EAAAC,QAAQ,IAAAC,SAAc;AAErD,SAASC,WAAA,EAAAC,OAAmB,EAAAC,MAAA,EAAAC,MAAA;AAC5B,SAASC,WAAA,iCAAoB;AAC7B,SAASC,YAAA,QAAmB;AAC5B,SAASC,WAAA,iCAAqB;AAC9B,SAASC,aAAA,QAAiB;AAC1B,SAASC,SAAA,QAAiB;AAgClB,SAqCIC,SAAA,QArCJ;AAhBD,SAASC,OAAOC,KAAA,EAAoB;EACzC,IAAAC,CAAA,GAAMH,SAAI,CAAAE,KAAU;EAEpB,IAAAE,cACE;EAAA,OAAC,eAAAlB,IAAA,CAAAQ,MAAA;IAAAW,eAAA;IAAAC,WACC,gBAAgB;IAAAC,WAChB;IAAYC,YACZ,MAAa;IAAAC,OACb;IAAaC,GACb;IAAQC,KACR,EAAI;IAAAC,QACJ,EAAM;IAAAC,SACN,UAAU;IAAAC,QACV,EAAAX,CAAA,CAAAY,KAAU,CAAAC,OAAA,kBAAA5B,KAAA,CAAA6B,UAAA;MAETH,QAAA,GAEG,eAAA5B,IAAC,CAAAM,OAAA;QACD0B,IAAA;QAGFC,KACI;MAEF,IAGA,eAAAjC,IAAC,CAAAK,WAAA;QAGH2B,IACE,EAAE;QAIFC,KAAA;QAACL,QAAA;MAAA;IACgB,KAAAX,CAAA,CAAAY,KACf,CAAAK,KAAM,IAAM,CAAAjB,CAAA,CAAAY,KAAA,CAAAM,IAAA,kBAAAjC,KAAA,CAAA6B,UAAA;MAAAH,QACZ,GAAY,eACD5B,IAAA,CAAAK,WAAU;QAAA2B,IAAA;QACvBI,UAAA;QAEGH,KAAA,YAAU;QACVL,QAAA;MAAA,mBACY5B,IAAA,CAAAK,WAAA;QAAA2B,IACX;QAAYC,KACZ,YAAe;QAAWI,SAC1B,UAAc;QAAAT,QACd,EAAO,CAAEV,cAAA,GAAAD,CAAA,CAAAY,KAAA,CAAAK,KAAA,cAAAhB,cAAA,cAAAA,cAAA;MAAA;IAEC,KAAAD,CAAA,CAAAqB,KAAA,eAAArB,CAAA,CAAAsB,OAAA,kBAAAvC,IAAA,CAAAU,YAAA;MAAA6B,OAGZ,EAAAtB,CAAA,CAAAsB,OAAA;MACGC,QAAE,EAAAvB,CAAA,CAAAuB,QAAW;MAAsBC,MACjC,EAAAxB,CAAA,CAAAyB;IACqC,oBAAAxC,KAAA,CAAAM,MAAA;MAAAgB,GAAA,MACL;MAAMI,QACvC,GACE,eACJ5B,IAAA,CAAAW,WAAA;QAAAkB,KAAC,EAAAZ,CAAA,CAAAY,KAAA,CAAAM,IAAA;QAAAQ,IAAA,EAAA3B,KAAA,CAAA2B,IAAA;QAAAH,QACC,EAAIvB,CAAA,CAAAuB,QAAA;QAAAI,OACJ,EAAA3B,CAAA,CAAAqB,KAAA,KAAc;MAAA,IACcrB,CAAA,CAAAqB,KAC5B,WAAW,IAAArB,CAAA,CAAA4B,YAAA,kBAAA7C,IAAA,CAAAS,WAAA;QAAAqC,OAEX,EAAA7B,CAAA,CAAA4B,YAAA;QAAAL,QAAA,EAAAvB,CAAA,CAAAuB,QAAA;QAAAO,WAAC,EAAA9B,CAAA,CAAAY,KAAA,CAAAM,IAAA,CAAAa,MAAA;QAAAC,UAAA,EAAAhC,CAAA,CAAAgC,UAAA;QAAAf,KAAA,EAAAjB,CAAA,CAAAiB,KACC;QAAYgB,QAAA,EACZjC,CAAA,CAAAkC,MAAA;QAAiBC,MAAA,EAAAnC,CAAA,CACjBoC;MAAe,oBACfnD,KAAa,CAAEE,SAAA;QAAAwB,QAAA,EACf,CAAUX,CAAA,CAAAqC,QACV,kBAAUtD,IAAA,CAAAuD,eAAA,cAAAtC,CAAA,CAAAuC,KAAA,CACVtB,KAAA,kBAAgBhC,KAAA,CAAAG,WAAA;UAAA2B,IAAA,EAChB;UAAgBC,KAAA,EAChB,QAAS;UAAQL,QAAA,GACnB,gCACAX,CAAA,CAAAuC,KAAA,CAAAtB,KAAA;QAAC,0BACShC,KAAE,CAAAK,MAAA;UAAAiB,GAAA,MACV;UAASiC,aACT,UAAY;UAAAC,GAAA;YACFD,aACV;UAAe;UACgBE,UAAA;UAAA/B,QACjC,kBAAA5B,IAAA,CAAAY,aAAA;YAAAgD,QAAA,EAAA3C,CAAA,CAAA2C,QAAA;YACFC,aAAA,EAAA5C,CAAA,CAAA4C,aAAA;YACGC,WAAc,EAAA7C,CAAA,CAAA6C,WAAiB;YAKpCC,WAAA,EAAA9C,CAAA,CAAA+C,SAAA;YAEJC,MAAA,EAAAhD,CAAA,CAAAiD,WAAA;YAAAC,MAAA,EAAAlD,CAAA,CAAAmD,WAAA;YAEJC,YAAA,EAAApD,CAAA,CAAAoD,YAAA;YAEJC,YAAA,EAAArD,CAAA,CAAAqD,YAAA;YAESxC,OAAa,EAAAb,CAAA,CAAAuC,KAAqC,CAAA1B;UAEvD,IAAC,eAAA9B,IAAA,CAAAa,SAAA;YAAA0D,MAAA,EAAAtD,CAAA,CAAA6C,WAAA;YACYN,KAAA,EAAAvC,CAAA,CAAAuD,QAAA;YACXhC,QAAe,EAAAvB,CAAA,CAAAuB,QAAA;YACXiC,MAAA,EAAAxD,CAAA,CAAAyD,UAAA;YACIC,WAAA,EAAA1D,CAAA,CAAA4B,YAAA;YACGf,OAAA,EAAAb,CAAA,CAAAuC,KAAA,CAAA1B,OAAA,KAAAb,CAAA,CAAA6C;UAEV;QACH,IAEJ7C,CAAA,CAAA4C,aAAA,CAAA7B,IAAA,WAAAf,CAAA,CAAAuC,KAAA,CAAA1B,OAAA,KAAAb,CAAA,CAAAuC,KAAA,CAAAtB,KAAA,kBAAAlC,IAAA,CAAAK,WAAA;UAES2B,IAAA;UAELC,KAAA;UAACI,SAAA;UAAAT,QAAA;QACC;MAEA;IACa;EACL;AAIR;AAAA,SACFG,WAAA6C,KAAA;EAEJ;IAAAhD;EAAA,IAAAgD,KAAA","ignoreList":[]}
@@ -0,0 +1,172 @@
1
+ import { useState } from "react";
2
+ import { Button, Input, SizableText, TextArea, XStack, YStack } from "hanzogui";
3
+ import { formatBookingWhen } from "./time.mjs";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
6
+ function BookingForm({
7
+ slotIso,
8
+ timeZone,
9
+ eventLength,
10
+ submitting,
11
+ error,
12
+ onSubmit,
13
+ onBack
14
+ }) {
15
+ const [name, setName] = useState("");
16
+ const [email, setEmail] = useState("");
17
+ const [notes, setNotes] = useState("");
18
+ const [touched, setTouched] = useState(false);
19
+ const nameValid = name.trim().length > 0;
20
+ const emailValid = EMAIL_RE.test(email.trim());
21
+ const valid = nameValid && emailValid;
22
+ const submit = () => {
23
+ setTouched(true);
24
+ if (!valid || submitting) return;
25
+ onSubmit({
26
+ name: name.trim(),
27
+ email: email.trim(),
28
+ notes: notes.trim() || void 0
29
+ });
30
+ };
31
+ return /* @__PURE__ */jsxs(YStack, {
32
+ gap: "$3",
33
+ flex: 1,
34
+ minWidth: 240,
35
+ children: [/* @__PURE__ */jsxs(YStack, {
36
+ gap: "$1",
37
+ children: [/* @__PURE__ */jsxs(XStack, {
38
+ alignItems: "center",
39
+ gap: "$2",
40
+ children: [/* @__PURE__ */jsx(BackLink, {
41
+ onPress: onBack
42
+ }), /* @__PURE__ */jsx(SizableText, {
43
+ size: "$5",
44
+ fontWeight: "700",
45
+ color: "$color12",
46
+ children: "Enter details"
47
+ })]
48
+ }), /* @__PURE__ */jsxs(SizableText, {
49
+ size: "$3",
50
+ color: "$color11",
51
+ children: [formatBookingWhen(slotIso, timeZone), " \xB7 ", eventLength, " min"]
52
+ })]
53
+ }), /* @__PURE__ */jsx(Field, {
54
+ label: "Name",
55
+ required: true,
56
+ invalid: touched && !nameValid,
57
+ hint: "Please enter your name",
58
+ children: /* @__PURE__ */jsx(Input, {
59
+ value: name,
60
+ onChangeText: setName,
61
+ placeholder: "Ada Lovelace",
62
+ autoComplete: "name",
63
+ size: "$4"
64
+ })
65
+ }), /* @__PURE__ */jsx(Field, {
66
+ label: "Email",
67
+ required: true,
68
+ invalid: touched && !emailValid,
69
+ hint: "Please enter a valid email",
70
+ children: /* @__PURE__ */jsx(Input, {
71
+ value: email,
72
+ onChangeText: setEmail,
73
+ placeholder: "ada@example.com",
74
+ keyboardType: "email-address",
75
+ autoCapitalize: "none",
76
+ autoComplete: "email",
77
+ size: "$4"
78
+ })
79
+ }), /* @__PURE__ */jsx(Field, {
80
+ label: "Notes",
81
+ hint: "Optional",
82
+ children: /* @__PURE__ */jsx(TextArea, {
83
+ value: notes,
84
+ onChangeText: setNotes,
85
+ placeholder: "Anything that would help prepare?",
86
+ numberOfLines: 3,
87
+ size: "$4"
88
+ })
89
+ }), error ? /* @__PURE__ */jsx(YStack, {
90
+ backgroundColor: "$red3",
91
+ borderColor: "$red6",
92
+ borderWidth: 1,
93
+ borderRadius: "$4",
94
+ padding: "$2.5",
95
+ children: /* @__PURE__ */jsx(SizableText, {
96
+ size: "$2",
97
+ color: "$red11",
98
+ children: error
99
+ })
100
+ }) : null, /* @__PURE__ */jsxs(XStack, {
101
+ gap: "$2",
102
+ justifyContent: "flex-end",
103
+ marginTop: "$1",
104
+ children: [/* @__PURE__ */jsx(Button, {
105
+ size: "$4",
106
+ chromeless: true,
107
+ onPress: onBack,
108
+ disabled: submitting,
109
+ children: "Back"
110
+ }), /* @__PURE__ */jsx(Button, {
111
+ size: "$4",
112
+ theme: "blue",
113
+ onPress: submit,
114
+ disabled: submitting || touched && !valid,
115
+ opacity: submitting ? 0.7 : 1,
116
+ children: submitting ? "Booking\u2026" : "Confirm booking"
117
+ })]
118
+ })]
119
+ });
120
+ }
121
+ function Field({
122
+ label,
123
+ required,
124
+ invalid,
125
+ hint,
126
+ children
127
+ }) {
128
+ return /* @__PURE__ */jsxs(YStack, {
129
+ gap: "$1.5",
130
+ children: [/* @__PURE__ */jsxs(SizableText, {
131
+ size: "$2",
132
+ color: "$color11",
133
+ fontWeight: "600",
134
+ children: [label, required ? /* @__PURE__ */jsx(SizableText, {
135
+ color: "$red10",
136
+ children: " *"
137
+ }) : null]
138
+ }), children, invalid && hint ? /* @__PURE__ */jsx(SizableText, {
139
+ size: "$1",
140
+ color: "$red10",
141
+ children: hint
142
+ }) : null]
143
+ });
144
+ }
145
+ function BackLink({
146
+ onPress
147
+ }) {
148
+ return /* @__PURE__ */jsx(YStack, {
149
+ width: 30,
150
+ height: 30,
151
+ alignItems: "center",
152
+ justifyContent: "center",
153
+ borderRadius: "$4",
154
+ cursor: "pointer",
155
+ hoverStyle: {
156
+ backgroundColor: "$color4"
157
+ },
158
+ pressStyle: {
159
+ backgroundColor: "$color6"
160
+ },
161
+ onPress,
162
+ "aria-label": "Back",
163
+ role: "button",
164
+ children: /* @__PURE__ */jsx(SizableText, {
165
+ size: "$6",
166
+ color: "$color11",
167
+ children: "\u2039"
168
+ })
169
+ });
170
+ }
171
+ export { BookingForm };
172
+ //# sourceMappingURL=BookingForm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","Button","Input","SizableText","TextArea","XStack","YStack","formatBookingWhen","jsx","jsxs","EMAIL_RE","BookingForm","slotIso","timeZone","eventLength","submitting","error","onSubmit","onBack","name","setName","email","setEmail","notes","setNotes","touched","setTouched","nameValid","trim","length","emailValid","test","valid","submit","gap","flex","minWidth","children","alignItems","BackLink","onPress","size","fontWeight","color","Field","label","required","invalid","hint","value","onChangeText","placeholder","autoComplete","keyboardType","autoCapitalize","numberOfLines","backgroundColor","borderColor","borderWidth","borderRadius","padding","justifyContent","marginTop","chromeless","disabled","theme","opacity","width","height","cursor","hoverStyle","pressStyle","role"],"sources":["../../src/BookingForm.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}