@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.
- package/README.md +78 -0
- package/dist/cjs/Booker.cjs +153 -0
- package/dist/cjs/Booker.native.js +158 -0
- package/dist/cjs/Booker.native.js.map +1 -0
- package/dist/cjs/BookingForm.cjs +197 -0
- package/dist/cjs/BookingForm.native.js +203 -0
- package/dist/cjs/BookingForm.native.js.map +1 -0
- package/dist/cjs/CalendarEmbed.cjs +121 -0
- package/dist/cjs/CalendarEmbed.native.js +125 -0
- package/dist/cjs/CalendarEmbed.native.js.map +1 -0
- package/dist/cjs/Confirmation.cjs +177 -0
- package/dist/cjs/Confirmation.native.js +185 -0
- package/dist/cjs/Confirmation.native.js.map +1 -0
- package/dist/cjs/EventHeader.cjs +112 -0
- package/dist/cjs/EventHeader.native.js +118 -0
- package/dist/cjs/EventHeader.native.js.map +1 -0
- package/dist/cjs/MonthCalendar.cjs +177 -0
- package/dist/cjs/MonthCalendar.native.js +191 -0
- package/dist/cjs/MonthCalendar.native.js.map +1 -0
- package/dist/cjs/TimeSlots.cjs +119 -0
- package/dist/cjs/TimeSlots.native.js +126 -0
- package/dist/cjs/TimeSlots.native.js.map +1 -0
- package/dist/cjs/client.cjs +136 -0
- package/dist/cjs/client.native.js +267 -0
- package/dist/cjs/client.native.js.map +1 -0
- package/dist/cjs/hooks.cjs +193 -0
- package/dist/cjs/hooks.native.js +221 -0
- package/dist/cjs/hooks.native.js.map +1 -0
- package/dist/cjs/index.cjs +71 -0
- package/dist/cjs/index.native.js +74 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/time.cjs +145 -0
- package/dist/cjs/time.native.js +150 -0
- package/dist/cjs/time.native.js.map +1 -0
- package/dist/cjs/useBooker.cjs +151 -0
- package/dist/cjs/useBooker.native.js +173 -0
- package/dist/cjs/useBooker.native.js.map +1 -0
- package/dist/esm/Booker.mjs +128 -0
- package/dist/esm/Booker.mjs.map +1 -0
- package/dist/esm/Booker.native.js +130 -0
- package/dist/esm/Booker.native.js.map +1 -0
- package/dist/esm/BookingForm.mjs +172 -0
- package/dist/esm/BookingForm.mjs.map +1 -0
- package/dist/esm/BookingForm.native.js +175 -0
- package/dist/esm/BookingForm.native.js.map +1 -0
- package/dist/esm/CalendarEmbed.mjs +96 -0
- package/dist/esm/CalendarEmbed.mjs.map +1 -0
- package/dist/esm/CalendarEmbed.native.js +97 -0
- package/dist/esm/CalendarEmbed.native.js.map +1 -0
- package/dist/esm/Confirmation.mjs +152 -0
- package/dist/esm/Confirmation.mjs.map +1 -0
- package/dist/esm/Confirmation.native.js +157 -0
- package/dist/esm/Confirmation.native.js.map +1 -0
- package/dist/esm/EventHeader.mjs +87 -0
- package/dist/esm/EventHeader.mjs.map +1 -0
- package/dist/esm/EventHeader.native.js +90 -0
- package/dist/esm/EventHeader.native.js.map +1 -0
- package/dist/esm/MonthCalendar.mjs +152 -0
- package/dist/esm/MonthCalendar.mjs.map +1 -0
- package/dist/esm/MonthCalendar.native.js +163 -0
- package/dist/esm/MonthCalendar.native.js.map +1 -0
- package/dist/esm/TimeSlots.mjs +94 -0
- package/dist/esm/TimeSlots.mjs.map +1 -0
- package/dist/esm/TimeSlots.native.js +98 -0
- package/dist/esm/TimeSlots.native.js.map +1 -0
- package/dist/esm/client.mjs +104 -0
- package/dist/esm/client.mjs.map +1 -0
- package/dist/esm/client.native.js +232 -0
- package/dist/esm/client.native.js.map +1 -0
- package/dist/esm/hooks.mjs +165 -0
- package/dist/esm/hooks.mjs.map +1 -0
- package/dist/esm/hooks.native.js +190 -0
- package/dist/esm/hooks.native.js.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.mjs +13 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +13 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/time.mjs +107 -0
- package/dist/esm/time.mjs.map +1 -0
- package/dist/esm/time.native.js +109 -0
- package/dist/esm/time.native.js.map +1 -0
- package/dist/esm/useBooker.mjs +126 -0
- package/dist/esm/useBooker.mjs.map +1 -0
- package/dist/esm/useBooker.native.js +145 -0
- package/dist/esm/useBooker.native.js.map +1 -0
- package/package.json +61 -0
- package/src/Booker.tsx +152 -0
- package/src/BookingForm.tsx +180 -0
- package/src/CalendarEmbed.tsx +111 -0
- package/src/Confirmation.tsx +145 -0
- package/src/EventHeader.tsx +85 -0
- package/src/MonthCalendar.tsx +179 -0
- package/src/TimeSlots.tsx +102 -0
- package/src/client.ts +218 -0
- package/src/hooks.ts +180 -0
- package/src/index.ts +72 -0
- package/src/time.ts +131 -0
- package/src/useBooker.ts +187 -0
- package/types/Booker.d.ts +16 -0
- package/types/Booker.d.ts.map +1 -0
- package/types/BookingForm.d.ts +13 -0
- package/types/BookingForm.d.ts.map +1 -0
- package/types/CalendarEmbed.d.ts +15 -0
- package/types/CalendarEmbed.d.ts.map +1 -0
- package/types/Confirmation.d.ts +12 -0
- package/types/Confirmation.d.ts.map +1 -0
- package/types/EventHeader.d.ts +10 -0
- package/types/EventHeader.d.ts.map +1 -0
- package/types/MonthCalendar.d.ts +14 -0
- package/types/MonthCalendar.d.ts.map +1 -0
- package/types/TimeSlots.d.ts +15 -0
- package/types/TimeSlots.d.ts.map +1 -0
- package/types/client.d.ts +77 -0
- package/types/client.d.ts.map +1 -0
- package/types/hooks.d.ts +43 -0
- package/types/hooks.d.ts.map +1 -0
- package/types/index.d.ts +12 -0
- package/types/index.d.ts.map +1 -0
- package/types/time.d.ts +38 -0
- package/types/time.d.ts.map +1 -0
- package/types/useBooker.d.ts +41 -0
- package/types/useBooker.d.ts.map +1 -0
|
@@ -0,0 +1,191 @@
|
|
|
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 MonthCalendar_exports = {};
|
|
26
|
+
__export(MonthCalendar_exports, {
|
|
27
|
+
MonthCalendar: () => MonthCalendar
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(MonthCalendar_exports);
|
|
30
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
31
|
+
var import_hanzogui = require("hanzogui");
|
|
32
|
+
var import_time = require("./time.native.js");
|
|
33
|
+
function MonthCalendar(param) {
|
|
34
|
+
var {
|
|
35
|
+
viewDate,
|
|
36
|
+
availableKeys,
|
|
37
|
+
selectedDay,
|
|
38
|
+
onSelectDay,
|
|
39
|
+
onPrev,
|
|
40
|
+
onNext,
|
|
41
|
+
atFirstMonth,
|
|
42
|
+
weekStartsOn = 0,
|
|
43
|
+
loading
|
|
44
|
+
} = param;
|
|
45
|
+
var cells = (0, import_time.monthMatrix)(viewDate, weekStartsOn);
|
|
46
|
+
var rows = [];
|
|
47
|
+
for (var i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7));
|
|
48
|
+
var labels = (0, import_time.weekdayLabels)(weekStartsOn);
|
|
49
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_hanzogui.YStack, {
|
|
50
|
+
gap: "$2",
|
|
51
|
+
flex: 1,
|
|
52
|
+
minWidth: 260,
|
|
53
|
+
children: [/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_hanzogui.XStack, {
|
|
54
|
+
alignItems: "center",
|
|
55
|
+
justifyContent: "space-between",
|
|
56
|
+
paddingVertical: "$1",
|
|
57
|
+
children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(NavArrow, {
|
|
58
|
+
label: "Previous month",
|
|
59
|
+
disabled: atFirstMonth,
|
|
60
|
+
onPress: onPrev,
|
|
61
|
+
children: "\u2039"
|
|
62
|
+
}), /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_hanzogui.XStack, {
|
|
63
|
+
alignItems: "center",
|
|
64
|
+
gap: "$2",
|
|
65
|
+
children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
66
|
+
size: "$5",
|
|
67
|
+
fontWeight: "700",
|
|
68
|
+
color: "$color12",
|
|
69
|
+
children: (0, import_time.formatMonthLabel)(viewDate)
|
|
70
|
+
}), loading ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.Spinner, {
|
|
71
|
+
size: "small",
|
|
72
|
+
color: "$color9"
|
|
73
|
+
}) : null]
|
|
74
|
+
}), /* @__PURE__ */(0, import_jsx_runtime.jsx)(NavArrow, {
|
|
75
|
+
label: "Next month",
|
|
76
|
+
onPress: onNext,
|
|
77
|
+
children: "\u203A"
|
|
78
|
+
})]
|
|
79
|
+
}), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.XStack, {
|
|
80
|
+
children: labels.map(function (l) {
|
|
81
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.YStack, {
|
|
82
|
+
flexBasis: 0,
|
|
83
|
+
flexGrow: 1,
|
|
84
|
+
alignItems: "center",
|
|
85
|
+
paddingVertical: "$1",
|
|
86
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
87
|
+
size: "$1",
|
|
88
|
+
color: "$color10",
|
|
89
|
+
children: l
|
|
90
|
+
})
|
|
91
|
+
}, l);
|
|
92
|
+
})
|
|
93
|
+
}), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.YStack, {
|
|
94
|
+
gap: "$1.5",
|
|
95
|
+
children: rows.map(function (row, r) {
|
|
96
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.XStack, {
|
|
97
|
+
gap: "$1.5",
|
|
98
|
+
children: row.map(function (cell) {
|
|
99
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(DayCell, {
|
|
100
|
+
cell,
|
|
101
|
+
available: availableKeys.has(cell.key),
|
|
102
|
+
past: (0, import_time.isBeforeToday)(cell.key),
|
|
103
|
+
selected: selectedDay === cell.key,
|
|
104
|
+
onSelectDay
|
|
105
|
+
}, cell.key);
|
|
106
|
+
})
|
|
107
|
+
}, r);
|
|
108
|
+
})
|
|
109
|
+
})]
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function DayCell(param) {
|
|
113
|
+
var {
|
|
114
|
+
cell,
|
|
115
|
+
available,
|
|
116
|
+
past,
|
|
117
|
+
selected,
|
|
118
|
+
onSelectDay
|
|
119
|
+
} = param;
|
|
120
|
+
var selectable = cell.inMonth && available && !past;
|
|
121
|
+
var dayNum = cell.date.getDate();
|
|
122
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_hanzogui.YStack, {
|
|
123
|
+
flexBasis: 0,
|
|
124
|
+
flexGrow: 1,
|
|
125
|
+
aspectRatio: 1,
|
|
126
|
+
alignItems: "center",
|
|
127
|
+
justifyContent: "center",
|
|
128
|
+
borderRadius: "$4",
|
|
129
|
+
borderWidth: 1,
|
|
130
|
+
borderColor: selected ? "$color12" : selectable ? "$color5" : "transparent",
|
|
131
|
+
backgroundColor: selected ? "$color12" : selectable ? "$color2" : "transparent",
|
|
132
|
+
opacity: cell.inMonth ? 1 : 0,
|
|
133
|
+
cursor: selectable ? "pointer" : "default",
|
|
134
|
+
hoverStyle: selectable && !selected ? {
|
|
135
|
+
backgroundColor: "$color4"
|
|
136
|
+
} : void 0,
|
|
137
|
+
pressStyle: selectable ? {
|
|
138
|
+
backgroundColor: "$color6"
|
|
139
|
+
} : void 0,
|
|
140
|
+
onPress: selectable ? function () {
|
|
141
|
+
return onSelectDay(cell.key);
|
|
142
|
+
} : void 0,
|
|
143
|
+
"aria-label": selectable ? `Select ${cell.key}` : void 0,
|
|
144
|
+
role: selectable ? "button" : void 0,
|
|
145
|
+
children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
146
|
+
size: "$3",
|
|
147
|
+
fontWeight: selectable ? "600" : "400",
|
|
148
|
+
color: selected ? "$color1" : selectable ? "$color12" : "$color8",
|
|
149
|
+
children: dayNum
|
|
150
|
+
}), selectable && !selected ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.YStack, {
|
|
151
|
+
position: "absolute",
|
|
152
|
+
bottom: 4,
|
|
153
|
+
width: 4,
|
|
154
|
+
height: 4,
|
|
155
|
+
borderRadius: 9999,
|
|
156
|
+
backgroundColor: "$color10"
|
|
157
|
+
}) : null]
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function NavArrow(param) {
|
|
161
|
+
var {
|
|
162
|
+
children,
|
|
163
|
+
onPress,
|
|
164
|
+
disabled,
|
|
165
|
+
label
|
|
166
|
+
} = param;
|
|
167
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.YStack, {
|
|
168
|
+
width: 34,
|
|
169
|
+
height: 34,
|
|
170
|
+
alignItems: "center",
|
|
171
|
+
justifyContent: "center",
|
|
172
|
+
borderRadius: "$4",
|
|
173
|
+
opacity: disabled ? 0.35 : 1,
|
|
174
|
+
cursor: disabled ? "default" : "pointer",
|
|
175
|
+
hoverStyle: disabled ? void 0 : {
|
|
176
|
+
backgroundColor: "$color4"
|
|
177
|
+
},
|
|
178
|
+
pressStyle: disabled ? void 0 : {
|
|
179
|
+
backgroundColor: "$color6"
|
|
180
|
+
},
|
|
181
|
+
onPress: disabled ? void 0 : onPress,
|
|
182
|
+
"aria-label": label,
|
|
183
|
+
role: "button",
|
|
184
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
185
|
+
size: "$6",
|
|
186
|
+
color: "$color11",
|
|
187
|
+
children
|
|
188
|
+
})
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=MonthCalendar.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","MonthCalendar_exports","__export","MonthCalendar","module","exports","import_jsx_runtime","require","import_hanzogui","import_time","param","viewDate","availableKeys","selectedDay","onSelectDay","onPrev","onNext","atFirstMonth","weekStartsOn","loading","cells","monthMatrix","rows","i","length","push","slice","labels","weekdayLabels","jsxs","YStack","gap","flex","minWidth","children","XStack","alignItems","justifyContent","paddingVertical","jsx","NavArrow","label","disabled","onPress","SizableText","size","fontWeight","color","formatMonthLabel","Spinner","map","l","flexBasis","flexGrow","row","r","cell","DayCell","available","has","key","past","isBeforeToday","selected","selectable","inMonth","dayNum","date","getDate","aspectRatio","borderRadius","borderWidth","borderColor","backgroundColor","opacity","cursor","hoverStyle","pressStyle","role","position","bottom","width","height"],"sources":["../../src/MonthCalendar.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all) __defProp(target, name, {
|
|
7
|
+
get: all[name],
|
|
8
|
+
enumerable: true
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
14
|
+
get: () => from[key],
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
21
|
+
value: true
|
|
22
|
+
}), mod);
|
|
23
|
+
var TimeSlots_exports = {};
|
|
24
|
+
__export(TimeSlots_exports, {
|
|
25
|
+
TimeSlots: () => TimeSlots
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(TimeSlots_exports);
|
|
28
|
+
var import_hanzogui = require("hanzogui");
|
|
29
|
+
var import_time = require("./time.cjs");
|
|
30
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
31
|
+
function TimeSlots({
|
|
32
|
+
dayKey,
|
|
33
|
+
slots,
|
|
34
|
+
timeZone,
|
|
35
|
+
onPick,
|
|
36
|
+
selectedIso,
|
|
37
|
+
loading,
|
|
38
|
+
compact,
|
|
39
|
+
maxHeight = 360
|
|
40
|
+
}) {
|
|
41
|
+
if (!dayKey) {
|
|
42
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Centered, {
|
|
43
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
44
|
+
size: "$3",
|
|
45
|
+
color: "$color10",
|
|
46
|
+
textAlign: "center",
|
|
47
|
+
children: "Select a day to see available times."
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const heading = (0, import_time.formatDayLong)((0, import_time.dateFromKey)(dayKey));
|
|
52
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_hanzogui.YStack, {
|
|
53
|
+
gap: "$2",
|
|
54
|
+
flex: 1,
|
|
55
|
+
minWidth: 200,
|
|
56
|
+
children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
57
|
+
size: "$4",
|
|
58
|
+
fontWeight: "600",
|
|
59
|
+
color: "$color12",
|
|
60
|
+
children: heading
|
|
61
|
+
}), loading ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(Centered, {
|
|
62
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
63
|
+
size: "$2",
|
|
64
|
+
color: "$color10",
|
|
65
|
+
children: "Loading times\u2026"
|
|
66
|
+
})
|
|
67
|
+
}) : slots.length === 0 ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(Centered, {
|
|
68
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
69
|
+
size: "$3",
|
|
70
|
+
color: "$color10",
|
|
71
|
+
textAlign: "center",
|
|
72
|
+
children: "No times left on this day. Try another."
|
|
73
|
+
})
|
|
74
|
+
}) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.ScrollView, {
|
|
75
|
+
maxHeight,
|
|
76
|
+
showsVerticalScrollIndicator: false,
|
|
77
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.XStack, {
|
|
78
|
+
flexWrap: "wrap",
|
|
79
|
+
gap: "$2",
|
|
80
|
+
flexDirection: compact ? "row" : "column",
|
|
81
|
+
children: slots.map(slot => {
|
|
82
|
+
const active = selectedIso === slot.time;
|
|
83
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.Button, {
|
|
84
|
+
size: "$3",
|
|
85
|
+
theme: active ? "blue" : void 0,
|
|
86
|
+
chromeless: !active,
|
|
87
|
+
borderWidth: 1,
|
|
88
|
+
borderColor: active ? "$color8" : "$color6",
|
|
89
|
+
backgroundColor: active ? void 0 : "$color1",
|
|
90
|
+
hoverStyle: {
|
|
91
|
+
borderColor: "$color10"
|
|
92
|
+
},
|
|
93
|
+
pressStyle: {
|
|
94
|
+
backgroundColor: "$color4"
|
|
95
|
+
},
|
|
96
|
+
onPress: () => onPick(slot.time),
|
|
97
|
+
"aria-label": `Book ${(0, import_time.formatSlotTime)(slot.time, timeZone)}`,
|
|
98
|
+
...(compact ? {} : {
|
|
99
|
+
alignSelf: "stretch"
|
|
100
|
+
}),
|
|
101
|
+
children: (0, import_time.formatSlotTime)(slot.time, timeZone)
|
|
102
|
+
}, slot.time);
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
})]
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function Centered({
|
|
109
|
+
children
|
|
110
|
+
}) {
|
|
111
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.YStack, {
|
|
112
|
+
flex: 1,
|
|
113
|
+
minHeight: 120,
|
|
114
|
+
alignItems: "center",
|
|
115
|
+
justifyContent: "center",
|
|
116
|
+
padding: "$4",
|
|
117
|
+
children
|
|
118
|
+
});
|
|
119
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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 TimeSlots_exports = {};
|
|
26
|
+
__export(TimeSlots_exports, {
|
|
27
|
+
TimeSlots: () => TimeSlots
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(TimeSlots_exports);
|
|
30
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
31
|
+
var import_hanzogui = require("hanzogui");
|
|
32
|
+
var import_time = require("./time.native.js");
|
|
33
|
+
function TimeSlots(param) {
|
|
34
|
+
var {
|
|
35
|
+
dayKey,
|
|
36
|
+
slots,
|
|
37
|
+
timeZone,
|
|
38
|
+
onPick,
|
|
39
|
+
selectedIso,
|
|
40
|
+
loading,
|
|
41
|
+
compact,
|
|
42
|
+
maxHeight = 360
|
|
43
|
+
} = param;
|
|
44
|
+
if (!dayKey) {
|
|
45
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Centered, {
|
|
46
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
47
|
+
size: "$3",
|
|
48
|
+
color: "$color10",
|
|
49
|
+
textAlign: "center",
|
|
50
|
+
children: "Select a day to see available times."
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
var heading = (0, import_time.formatDayLong)((0, import_time.dateFromKey)(dayKey));
|
|
55
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_hanzogui.YStack, {
|
|
56
|
+
gap: "$2",
|
|
57
|
+
flex: 1,
|
|
58
|
+
minWidth: 200,
|
|
59
|
+
children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
60
|
+
size: "$4",
|
|
61
|
+
fontWeight: "600",
|
|
62
|
+
color: "$color12",
|
|
63
|
+
children: heading
|
|
64
|
+
}), loading ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(Centered, {
|
|
65
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
66
|
+
size: "$2",
|
|
67
|
+
color: "$color10",
|
|
68
|
+
children: "Loading times\u2026"
|
|
69
|
+
})
|
|
70
|
+
}) : slots.length === 0 ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(Centered, {
|
|
71
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.SizableText, {
|
|
72
|
+
size: "$3",
|
|
73
|
+
color: "$color10",
|
|
74
|
+
textAlign: "center",
|
|
75
|
+
children: "No times left on this day. Try another."
|
|
76
|
+
})
|
|
77
|
+
}) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.ScrollView, {
|
|
78
|
+
maxHeight,
|
|
79
|
+
showsVerticalScrollIndicator: false,
|
|
80
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.XStack, {
|
|
81
|
+
flexWrap: "wrap",
|
|
82
|
+
gap: "$2",
|
|
83
|
+
flexDirection: compact ? "row" : "column",
|
|
84
|
+
children: slots.map(function (slot) {
|
|
85
|
+
var active = selectedIso === slot.time;
|
|
86
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.Button, {
|
|
87
|
+
size: "$3",
|
|
88
|
+
theme: active ? "blue" : void 0,
|
|
89
|
+
chromeless: !active,
|
|
90
|
+
borderWidth: 1,
|
|
91
|
+
borderColor: active ? "$color8" : "$color6",
|
|
92
|
+
backgroundColor: active ? void 0 : "$color1",
|
|
93
|
+
hoverStyle: {
|
|
94
|
+
borderColor: "$color10"
|
|
95
|
+
},
|
|
96
|
+
pressStyle: {
|
|
97
|
+
backgroundColor: "$color4"
|
|
98
|
+
},
|
|
99
|
+
onPress: function () {
|
|
100
|
+
return onPick(slot.time);
|
|
101
|
+
},
|
|
102
|
+
"aria-label": `Book ${(0, import_time.formatSlotTime)(slot.time, timeZone)}`,
|
|
103
|
+
...(compact ? {} : {
|
|
104
|
+
alignSelf: "stretch"
|
|
105
|
+
}),
|
|
106
|
+
children: (0, import_time.formatSlotTime)(slot.time, timeZone)
|
|
107
|
+
}, slot.time);
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
})]
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function Centered(param) {
|
|
114
|
+
var {
|
|
115
|
+
children
|
|
116
|
+
} = param;
|
|
117
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_hanzogui.YStack, {
|
|
118
|
+
flex: 1,
|
|
119
|
+
minHeight: 120,
|
|
120
|
+
alignItems: "center",
|
|
121
|
+
justifyContent: "center",
|
|
122
|
+
padding: "$4",
|
|
123
|
+
children
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=TimeSlots.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","TimeSlots_exports","__export","TimeSlots","module","exports","import_jsx_runtime","require","import_hanzogui","import_time","param","dayKey","slots","timeZone","onPick","selectedIso","loading","compact","maxHeight","jsx","Centered","children","SizableText","size","color","textAlign","heading","formatDayLong","dateFromKey","jsxs","YStack","gap","flex","minWidth","fontWeight","length","ScrollView","showsVerticalScrollIndicator","XStack","flexWrap","flexDirection","map","slot","active","time","Button","theme","chromeless","borderWidth"],"sources":["../../src/TimeSlots.tsx"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,iBAAA;AAAAC,QAAA,CAAAD,iBAAA;EAAAE,SAAA,EAAAA,CAAA,KAAAA;AAAA;AACAC,MAAA,CAAAC,OAAA,GAAAT,YAAgE,CAAAK,iBAAA;AAEhE,IAAAK,kBAA2D,GAAAC,OAAA;AA4BnD,IAAAC,eAAA,GAAAD,OAAA;AAbD,IAAAE,WAAS,GAAAF,OAAU;AAAA,SACxBJ,UAAAO,KAAA;EACA;IAAAC,MAAA;IAAAC,KAAA;IAAAC,QAAA;IAAAC,MAAA;IAAAC,WAAA;IAAAC,OAAA;IAAAC,OAAA;IAAAC,SAAA;EAAA,IAAAR,KAAA;EACA,KAAAC,MAAA;IACA,0BAAAL,kBAAA,CAAAa,GAAA,EAAAC,QAAA;MACAC,QAAA,qBAAAf,kBAAA,CAAAa,GAAA,EAAAX,eAAA,CAAAc,WAAA;QACAC,IAAA;QACAC,KAAA;QACAC,SAAY;QACKJ,QAAA;MACb,CAAC;IACH;EAOF;EAEA,IAAAK,OAAM,OAAAjB,WAAU,CAAAkB,aAAA,MAAAlB,WAAc,CAAAmB,WAAA,EAAAjB,MAAY,EAAM;EAEhD,OACE,mBAAAL,kBAAA,CAAAuB,IAAA,EAACrB,eAAA,CAAAsB,MAAA;IACCC,GAAA;IAICC,IAAA;IAgBOC,QAAM;IACNZ,QAAA,EACE,gBAAC,IAAAf,kBAAA,CAAAa,GAAA,EAAAX,eAAA,CAAAc,WAAA;MAAAC,IAAA;MAAAW,UAEM;MAAAV,KACL,YAAO;MAAkBH,QACzB,EAAAK;IAAa,IACAV,OACb,kBAAsB,IAAAV,kBAAY,CAAAa,GAAA,EAAAC,QAAA;MAAAC,QAClC,iBAAiB,EAAS,EAAAf,kBAAY,CAAAa,GAAA,EAAAX,eAAA,CAAAc,WAAA;QACtCC,IAAA;QACAC,KAAA,YAAc;QACdH,QAAA,EAAS;MAAsB;IACwB,KACtDT,KAAI,CAAAuB,MAAU,KAAK,IAAE,eAAW,IAAU7B,kBAAA,CAAAa,GAAA,EAAAC,QAAA;MAAAC,QAE1C,qBAAAf,kBAAe,CAAKa,GAAA,EAAAX,eAAc,CAAAc,WAAA;QAAAC,IAAA;QAb9BC,KAAK;QAcZC,SAAA;QAGNJ,QACF;MAEJ;IAEJ,wBAAAf,kBAAA,CAAAa,GAAA,EAAAX,eAAA,CAAA4B,UAAA;MAEAlB,SAAS;MACPmB,4BACE;MAAChB,QAAA,qBAAAf,kBAAA,CAAAa,GAAA,EAAAX,eAAA,CAAA8B,MAAA;QAAAC,QAAA;QACCR,GAAM;QACNS,aAAW,EAAAvB,OAAA;QACXI,QAAW,EAAAT,KAAA,CAAA6B,GAAA,WAAAC,IAAA;UACX,IAAAC,MAAe,GAAA5B,WAAA,KAAA2B,IAAA,CAAAE,IAAA;UACf,OAAQ,mBAAAtC,kBAAA,CAAAa,GAAA,EAAAX,eAAA,CAAAqC,MAAA;YAEPtB,IAAA;YAAAuB,KAAA,EAAAH,MAAA;YACHI,UAAA,GAAAJ,MAAA;YAEJK,WAAA","ignoreList":[]}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all) __defProp(target, name, {
|
|
7
|
+
get: all[name],
|
|
8
|
+
enumerable: true
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
14
|
+
get: () => from[key],
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
21
|
+
value: true
|
|
22
|
+
}), mod);
|
|
23
|
+
var client_exports = {};
|
|
24
|
+
__export(client_exports, {
|
|
25
|
+
CAL_API_VERSION: () => CAL_API_VERSION,
|
|
26
|
+
CalendarError: () => CalendarError,
|
|
27
|
+
DEFAULT_API_URL: () => DEFAULT_API_URL,
|
|
28
|
+
cancelBooking: () => cancelBooking,
|
|
29
|
+
createBooking: () => createBooking,
|
|
30
|
+
fetchBooking: () => fetchBooking,
|
|
31
|
+
fetchEventType: () => fetchEventType,
|
|
32
|
+
fetchSlots: () => fetchSlots
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(client_exports);
|
|
35
|
+
const DEFAULT_API_URL = "https://api.hanzo.ai/v1/calendar";
|
|
36
|
+
const CAL_API_VERSION = "2024-08-13";
|
|
37
|
+
class CalendarError extends Error {
|
|
38
|
+
status;
|
|
39
|
+
conflict;
|
|
40
|
+
constructor(message, status) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.name = "CalendarError";
|
|
43
|
+
this.status = status;
|
|
44
|
+
this.conflict = status === 409;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function messageOf(body, status) {
|
|
48
|
+
const b = body;
|
|
49
|
+
return b?.error?.message || b?.message || `Request failed (${status})`;
|
|
50
|
+
}
|
|
51
|
+
async function readJson(res) {
|
|
52
|
+
return res.json().catch(() => null);
|
|
53
|
+
}
|
|
54
|
+
async function getJson(url, signal) {
|
|
55
|
+
const res = await fetch(url, {
|
|
56
|
+
headers: {
|
|
57
|
+
Accept: "application/json"
|
|
58
|
+
},
|
|
59
|
+
signal
|
|
60
|
+
});
|
|
61
|
+
const body = await readJson(res);
|
|
62
|
+
if (!res.ok) throw new CalendarError(messageOf(body, res.status), res.status);
|
|
63
|
+
return body.data;
|
|
64
|
+
}
|
|
65
|
+
function normalizeEventType(raw) {
|
|
66
|
+
const length = raw.length ?? raw.lengthInMinutes ?? raw.durationMinutes ?? 30;
|
|
67
|
+
return {
|
|
68
|
+
id: Number(raw.id ?? 0),
|
|
69
|
+
slug: String(raw.slug ?? ""),
|
|
70
|
+
title: String(raw.title ?? ""),
|
|
71
|
+
description: String(raw.description ?? ""),
|
|
72
|
+
length,
|
|
73
|
+
locations: raw.locations ?? [],
|
|
74
|
+
price: Number(raw.price ?? 0),
|
|
75
|
+
currency: String(raw.currency ?? "usd"),
|
|
76
|
+
profile: raw.profile
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async function fetchEventType(api, eventSlug, username, signal) {
|
|
80
|
+
const url = `${api}/atoms/event-types/${encodeURIComponent(eventSlug)}/public?username=${encodeURIComponent(username)}`;
|
|
81
|
+
const raw = await getJson(url, signal);
|
|
82
|
+
return normalizeEventType(raw);
|
|
83
|
+
}
|
|
84
|
+
async function fetchSlots(api, input, signal) {
|
|
85
|
+
const q = new URLSearchParams({
|
|
86
|
+
eventTypeSlug: input.eventTypeSlug,
|
|
87
|
+
usernameList: input.username,
|
|
88
|
+
startTime: input.startTime,
|
|
89
|
+
endTime: input.endTime,
|
|
90
|
+
timeZone: input.timeZone
|
|
91
|
+
});
|
|
92
|
+
const data = await getJson(`${api}/slots/available?${q.toString()}`, signal);
|
|
93
|
+
const slots = data.slots ?? data;
|
|
94
|
+
return slots ?? {};
|
|
95
|
+
}
|
|
96
|
+
async function createBooking(api, input, signal) {
|
|
97
|
+
const res = await fetch(`${api}/bookings`, {
|
|
98
|
+
method: "POST",
|
|
99
|
+
headers: {
|
|
100
|
+
"Content-Type": "application/json",
|
|
101
|
+
Accept: "application/json",
|
|
102
|
+
"cal-api-version": CAL_API_VERSION
|
|
103
|
+
},
|
|
104
|
+
body: JSON.stringify({
|
|
105
|
+
eventTypeSlug: input.eventTypeSlug,
|
|
106
|
+
user: input.username,
|
|
107
|
+
start: input.start,
|
|
108
|
+
timeZone: input.timeZone,
|
|
109
|
+
responses: input.responses
|
|
110
|
+
}),
|
|
111
|
+
signal
|
|
112
|
+
});
|
|
113
|
+
const body = await readJson(res);
|
|
114
|
+
if (!res.ok) throw new CalendarError(messageOf(body, res.status), res.status);
|
|
115
|
+
return body.data;
|
|
116
|
+
}
|
|
117
|
+
async function fetchBooking(api, uid, signal) {
|
|
118
|
+
return getJson(`${api}/bookings/${encodeURIComponent(uid)}`, signal);
|
|
119
|
+
}
|
|
120
|
+
async function cancelBooking(api, uid, reason, signal) {
|
|
121
|
+
const res = await fetch(`${api}/bookings/${encodeURIComponent(uid)}/cancel`, {
|
|
122
|
+
method: "POST",
|
|
123
|
+
headers: {
|
|
124
|
+
"Content-Type": "application/json",
|
|
125
|
+
Accept: "application/json",
|
|
126
|
+
"cal-api-version": CAL_API_VERSION
|
|
127
|
+
},
|
|
128
|
+
body: JSON.stringify({
|
|
129
|
+
reason: reason ?? ""
|
|
130
|
+
}),
|
|
131
|
+
signal
|
|
132
|
+
});
|
|
133
|
+
const body = await readJson(res);
|
|
134
|
+
if (!res.ok) throw new CalendarError(messageOf(body, res.status), res.status);
|
|
135
|
+
return body.data;
|
|
136
|
+
}
|