@asksable/site-connector 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 ADDED
@@ -0,0 +1,51 @@
1
+ # `@asksable/site-connector`
2
+
3
+ Thin first-party package for connecting separate website repos to Sable through `siteSlug`.
4
+
5
+ ## Purpose
6
+
7
+ Use this package in public website repos that should:
8
+
9
+ - read business/site profile data from Sable
10
+ - submit contact forms into Sable
11
+ - render the shared booking widget against Sable public booking APIs
12
+
13
+ ## Setup
14
+
15
+ Wrap the site in `SableSiteProvider`:
16
+
17
+ ```tsx
18
+ import { SableSiteProvider } from '@asksable/site-connector'
19
+
20
+ <SableSiteProvider
21
+ config={{
22
+ apiUrl: import.meta.env.VITE_SABLE_PUBLIC_API_URL,
23
+ siteSlug: import.meta.env.VITE_SABLE_SITE_SLUG,
24
+ }}
25
+ >
26
+ <App />
27
+ </SableSiteProvider>
28
+ ```
29
+
30
+ Then consume the profile or render the shared booking widget:
31
+
32
+ ```tsx
33
+ import { BookingWidgetPanel, useSableSiteProfile } from '@asksable/site-connector'
34
+ ```
35
+
36
+ ## Exports
37
+
38
+ - `createSablePublicClient`
39
+ - `SableSiteProvider`
40
+ - `useSableSiteProfile`
41
+ - `useSableSiteClient`
42
+ - `useSableSiteConfig`
43
+ - `BookingWidgetPanel`
44
+ - `getResolvedSiteProfile`
45
+ - types for public site and booking payloads
46
+
47
+ ## Public API Contract
48
+
49
+ The package expects the public connector endpoints documented in:
50
+
51
+ - [docs/website-connector.md](../../docs/website-connector.md)
@@ -0,0 +1,5 @@
1
+ export declare function BookingWidgetPanel({ title, description, }: {
2
+ title?: string;
3
+ description?: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=booking-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-widget.d.ts","sourceRoot":"","sources":["../src/booking-widget.tsx"],"names":[],"mappings":"AAUA,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,GACZ,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,2CA0gBA"}
@@ -0,0 +1,310 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from 'react';
3
+ import { useSableSiteClient, useSableSiteConfig } from './provider';
4
+ export function BookingWidgetPanel({ title, description, }) {
5
+ const client = useSableSiteClient();
6
+ const { siteSlug } = useSableSiteConfig();
7
+ const [setup, setSetup] = useState(null);
8
+ const [isSetupLoading, setIsSetupLoading] = useState(true);
9
+ const [selectedServiceId, setSelectedServiceId] = useState(null);
10
+ const [selectedStaffId, setSelectedStaffId] = useState(null);
11
+ const [selectedDate, setSelectedDate] = useState(() => dateKeyFromOffset(0));
12
+ const [dateSlots, setDateSlots] = useState([]);
13
+ const [selectedSlot, setSelectedSlot] = useState(null);
14
+ const [holdId, setHoldId] = useState(null);
15
+ const [holdExpiresAt, setHoldExpiresAt] = useState(null);
16
+ const [heldStaffId, setHeldStaffId] = useState(null);
17
+ const [customerName, setCustomerName] = useState('');
18
+ const [customerEmail, setCustomerEmail] = useState('');
19
+ const [customerPhone, setCustomerPhone] = useState('');
20
+ const [customerNotes, setCustomerNotes] = useState('');
21
+ const [isSubmitting, setIsSubmitting] = useState(false);
22
+ const [isSlotsLoading, setIsSlotsLoading] = useState(false);
23
+ const [error, setError] = useState(null);
24
+ const [success, setSuccess] = useState(null);
25
+ const [sessionToken] = useState(() => sessionTokenFromBrowser());
26
+ useEffect(() => {
27
+ let cancelled = false;
28
+ setIsSetupLoading(true);
29
+ void client
30
+ .getPublicBookingSetup(siteSlug)
31
+ .then((result) => {
32
+ if (cancelled) {
33
+ return;
34
+ }
35
+ setSetup(result);
36
+ setSelectedServiceId((current) => current || result.services[0]?._id || null);
37
+ })
38
+ .catch((nextError) => {
39
+ if (!cancelled) {
40
+ setError(nextError instanceof Error ? nextError.message : 'Unable to load booking setup.');
41
+ }
42
+ })
43
+ .finally(() => {
44
+ if (!cancelled) {
45
+ setIsSetupLoading(false);
46
+ }
47
+ });
48
+ return () => {
49
+ cancelled = true;
50
+ };
51
+ }, [client, siteSlug]);
52
+ const selectedService = useMemo(() => setup?.services.find((service) => service._id === selectedServiceId) ?? null, [selectedServiceId, setup]);
53
+ const availableStaff = useMemo(() => {
54
+ if (!setup || !selectedService) {
55
+ return [];
56
+ }
57
+ return setup.staff.filter((staffMember) => selectedService.assignedStaffIds.includes(staffMember._id));
58
+ }, [selectedService, setup]);
59
+ useEffect(() => {
60
+ if (!selectedStaffId) {
61
+ return;
62
+ }
63
+ if (!availableStaff.some((staffMember) => staffMember._id === selectedStaffId)) {
64
+ setSelectedStaffId(null);
65
+ }
66
+ }, [availableStaff, selectedStaffId]);
67
+ const selectedStaff = useMemo(() => availableStaff.find((staffMember) => staffMember._id === selectedStaffId) ?? null, [availableStaff, selectedStaffId]);
68
+ const nextDateOptions = useMemo(() => Array.from({ length: 6 }, (_, index) => dateKeyFromOffset(index)), []);
69
+ useEffect(() => {
70
+ if (!selectedServiceId) {
71
+ setDateSlots([]);
72
+ return;
73
+ }
74
+ let cancelled = false;
75
+ setIsSlotsLoading(true);
76
+ void client
77
+ .getPublicAvailableSlots({
78
+ siteSlug,
79
+ serviceId: selectedServiceId,
80
+ staffMemberId: selectedStaffId ?? undefined,
81
+ startDate: selectedDate,
82
+ endDate: selectedDate,
83
+ })
84
+ .then((result) => {
85
+ if (!cancelled) {
86
+ setDateSlots(result.dates[0]?.slots ?? []);
87
+ }
88
+ })
89
+ .catch((nextError) => {
90
+ if (!cancelled) {
91
+ setDateSlots([]);
92
+ setError(nextError instanceof Error ? nextError.message : 'Unable to load booking slots.');
93
+ }
94
+ })
95
+ .finally(() => {
96
+ if (!cancelled) {
97
+ setIsSlotsLoading(false);
98
+ }
99
+ });
100
+ return () => {
101
+ cancelled = true;
102
+ };
103
+ }, [client, selectedDate, selectedServiceId, selectedStaffId, siteSlug]);
104
+ useEffect(() => {
105
+ return () => {
106
+ if (!holdId) {
107
+ return;
108
+ }
109
+ void client
110
+ .releasePublicBookingHold({
111
+ siteSlug,
112
+ holdId,
113
+ sessionToken,
114
+ })
115
+ .catch(() => undefined);
116
+ };
117
+ }, [client, holdId, sessionToken, siteSlug]);
118
+ useEffect(() => {
119
+ setSelectedSlot(null);
120
+ setHeldStaffId(null);
121
+ setSuccess(null);
122
+ setError(null);
123
+ }, [selectedDate, selectedServiceId, selectedStaffId]);
124
+ useEffect(() => {
125
+ if (!holdId || !holdExpiresAt) {
126
+ return;
127
+ }
128
+ if (holdExpiresAt <= Date.now()) {
129
+ setHoldId(null);
130
+ setHoldExpiresAt(null);
131
+ setHeldStaffId(null);
132
+ return;
133
+ }
134
+ const refreshAt = Math.max(1000, Math.min(60000, holdExpiresAt - Date.now() - 30000));
135
+ const handle = window.setTimeout(() => {
136
+ void client
137
+ .refreshPublicBookingHold({
138
+ siteSlug,
139
+ holdId,
140
+ sessionToken,
141
+ })
142
+ .then((result) => {
143
+ setHoldExpiresAt(result.expiresAt);
144
+ })
145
+ .catch(() => {
146
+ setHoldId(null);
147
+ setHoldExpiresAt(null);
148
+ setHeldStaffId(null);
149
+ });
150
+ }, refreshAt);
151
+ return () => window.clearTimeout(handle);
152
+ }, [client, holdExpiresAt, holdId, sessionToken, siteSlug]);
153
+ const holdSecondsRemaining = holdExpiresAt !== null ? Math.max(0, Math.floor((holdExpiresAt - Date.now()) / 1000)) : null;
154
+ async function handleSlotSelect(slot) {
155
+ if (!selectedServiceId) {
156
+ return;
157
+ }
158
+ setError(null);
159
+ setSuccess(null);
160
+ if (holdId) {
161
+ await client
162
+ .releasePublicBookingHold({
163
+ siteSlug,
164
+ holdId,
165
+ sessionToken,
166
+ })
167
+ .catch(() => undefined);
168
+ setHoldId(null);
169
+ setHoldExpiresAt(null);
170
+ setHeldStaffId(null);
171
+ }
172
+ const reservationStaffId = selectedStaffId ?? slot.availableStaffIds[0] ?? null;
173
+ if (!reservationStaffId) {
174
+ setError('No staff is available for that time.');
175
+ return;
176
+ }
177
+ const startTime = Date.parse(`${selectedDate}T${slot.time}:00`);
178
+ const endTime = Date.parse(`${selectedDate}T${slot.endTime}:00`);
179
+ try {
180
+ const result = await client.reservePublicBookingHold({
181
+ siteSlug,
182
+ serviceId: selectedServiceId,
183
+ staffMemberId: reservationStaffId,
184
+ startTime,
185
+ endTime,
186
+ sessionToken,
187
+ });
188
+ setSelectedSlot(slot);
189
+ setHoldId(result.holdId);
190
+ setHoldExpiresAt(result.expiresAt);
191
+ setHeldStaffId(reservationStaffId);
192
+ }
193
+ catch (nextError) {
194
+ setError(nextError instanceof Error ? nextError.message : 'Unable to reserve that time.');
195
+ }
196
+ }
197
+ async function handleConfirmBooking() {
198
+ if (!selectedServiceId || !selectedSlot || !holdId || !selectedService) {
199
+ return;
200
+ }
201
+ setIsSubmitting(true);
202
+ setError(null);
203
+ setSuccess(null);
204
+ try {
205
+ await client.createPublicBooking({
206
+ siteSlug,
207
+ serviceId: selectedServiceId,
208
+ staffMemberId: heldStaffId ?? selectedStaffId ?? selectedSlot.availableStaffIds[0],
209
+ startTime: Date.parse(`${selectedDate}T${selectedSlot.time}:00`),
210
+ endTime: Date.parse(`${selectedDate}T${selectedSlot.endTime}:00`),
211
+ timezone: selectedStaff?.timezone ?? availableStaff[0]?.timezone ?? 'UTC',
212
+ deliveryMethod: selectedService.deliveryMethods[0] ?? 'in-person',
213
+ customerName,
214
+ customerEmail,
215
+ customerPhone: customerPhone || undefined,
216
+ customerNotes: customerNotes || undefined,
217
+ bookingHoldId: holdId,
218
+ bookingSessionToken: sessionToken,
219
+ });
220
+ setSuccess('Booking confirmed.');
221
+ setSelectedSlot(null);
222
+ setHoldId(null);
223
+ setHoldExpiresAt(null);
224
+ setHeldStaffId(null);
225
+ setCustomerName('');
226
+ setCustomerEmail('');
227
+ setCustomerPhone('');
228
+ setCustomerNotes('');
229
+ }
230
+ catch (nextError) {
231
+ setError(nextError instanceof Error ? nextError.message : 'Unable to confirm booking.');
232
+ }
233
+ finally {
234
+ setIsSubmitting(false);
235
+ }
236
+ }
237
+ if (isSetupLoading) {
238
+ return (_jsx("div", { className: "rounded-[28px] border border-black/8 bg-white p-6 text-sm text-stone-500", children: "Loading booking..." }));
239
+ }
240
+ if (!setup || setup.services.length === 0) {
241
+ return (_jsx("div", { className: "rounded-[28px] border border-black/8 bg-white p-6 text-sm text-stone-500", children: "No bookable services are available yet." }));
242
+ }
243
+ return (_jsx("section", { className: "mx-auto w-full max-w-[1440px] px-4 py-8 sm:px-6 lg:px-8", children: _jsxs("div", { className: "grid gap-6 rounded-[32px] border border-black/8 bg-white p-5 shadow-sm lg:grid-cols-[1.15fr_0.85fr] lg:p-8", children: [_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.22em] text-stone-500", children: "Booking" }), _jsx("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.04em] text-stone-950", children: title || `Book with ${setup.site.businessName}` }), _jsx("p", { className: "mt-3 max-w-2xl text-sm leading-6 text-stone-600", children: description || 'Choose a service, reserve a slot, and confirm the booking directly through Sable.' })] }), _jsxs("div", { children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.18em] text-stone-500", children: "1. Choose a service" }), _jsx("div", { className: "mt-3 grid gap-3 sm:grid-cols-2", children: setup.services.map((service) => {
244
+ const isActive = service._id === selectedServiceId;
245
+ const priceLabel = currencyFormatter(service.currency).format(service.priceCents / 100);
246
+ return (_jsxs("button", { type: "button", onClick: () => setSelectedServiceId(service._id), className: isActive
247
+ ? 'rounded-[24px] border border-stone-950 bg-stone-950 p-4 text-left text-white'
248
+ : 'rounded-[24px] border border-black/8 bg-stone-50 p-4 text-left text-stone-950 transition hover:border-stone-300 hover:bg-white', children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-base font-semibold", children: service.name }), _jsx("p", { className: isActive ? 'mt-2 text-sm text-white/72' : 'mt-2 text-sm text-stone-600', children: service.description || 'Book this service online.' })] }), _jsxs("span", { className: isActive ? 'text-xs font-medium text-white/72' : 'text-xs font-medium text-stone-500', children: [service.durationMinutes, " min"] })] }), _jsx("p", { className: isActive ? 'mt-4 text-sm font-medium text-white' : 'mt-4 text-sm font-medium text-stone-950', children: priceLabel })] }, service._id));
249
+ }) })] }), _jsxs("div", { className: "grid gap-5 lg:grid-cols-[0.72fr_1.28fr]", children: [_jsxs("div", { className: "space-y-5", children: [_jsxs("div", { children: [_jsx("label", { className: "text-xs font-semibold uppercase tracking-[0.18em] text-stone-500", children: "2. Choose a team member" }), _jsxs("div", { className: "mt-3 grid gap-2", children: [_jsxs("button", { type: "button", onClick: () => setSelectedStaffId(null), className: selectedStaffId === null
250
+ ? 'flex min-h-12 items-center justify-between rounded-2xl bg-stone-950 px-4 text-left text-sm font-medium text-white'
251
+ : 'flex min-h-12 items-center justify-between rounded-2xl border border-black/8 bg-white px-4 text-left text-sm font-medium text-stone-900 transition hover:border-stone-300 hover:bg-stone-50', children: [_jsx("span", { children: "Any available" }), _jsx("span", { className: selectedStaffId === null ? 'text-white/70' : 'text-stone-500', children: "Fastest option" })] }), availableStaff.map((staffMember) => {
252
+ const isSelected = staffMember._id === selectedStaffId;
253
+ return (_jsxs("button", { type: "button", onClick: () => setSelectedStaffId(staffMember._id), className: isSelected
254
+ ? 'flex min-h-12 items-center justify-between rounded-2xl bg-stone-950 px-4 text-left text-sm font-medium text-white'
255
+ : 'flex min-h-12 items-center justify-between rounded-2xl border border-black/8 bg-white px-4 text-left text-sm font-medium text-stone-900 transition hover:border-stone-300 hover:bg-stone-50', children: [_jsx("span", { children: staffMember.name }), _jsx("span", { className: isSelected ? 'text-white/70' : 'text-stone-500', children: staffMember.timezone })] }, staffMember._id));
256
+ })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("label", { className: "text-xs font-semibold uppercase tracking-[0.18em] text-stone-500", children: "3. Choose a date" }), _jsx("div", { className: "grid gap-2 sm:grid-cols-3 lg:grid-cols-1", children: nextDateOptions.map((dateKey) => {
257
+ const isSelected = selectedDate === dateKey;
258
+ return (_jsxs("button", { type: "button", onClick: () => setSelectedDate(dateKey), className: isSelected
259
+ ? 'flex min-h-12 items-center justify-between rounded-2xl bg-stone-950 px-4 text-left text-sm font-medium text-white'
260
+ : 'flex min-h-12 items-center justify-between rounded-2xl border border-black/8 bg-white px-4 text-left text-sm font-medium text-stone-900 transition hover:border-stone-300 hover:bg-stone-50', children: [_jsx("span", { children: formatDateLabel(dateKey) }), _jsx("span", { className: isSelected ? 'text-white/70' : 'text-stone-500', children: dateKey === nextDateOptions[0] ? 'Today' : '' })] }, dateKey));
261
+ }) }), _jsx("input", { type: "date", value: selectedDate, onChange: (event) => setSelectedDate(event.target.value), className: "h-12 w-full rounded-2xl border border-black/8 px-4 text-sm text-stone-950 outline-none transition focus:border-stone-400" }), holdExpiresAt ? _jsxs("p", { className: "text-xs text-stone-500", children: ["Slot held for ", holdSecondsRemaining, "s"] }) : null] })] }), _jsxs("div", { children: [_jsx("label", { className: "text-xs font-semibold uppercase tracking-[0.18em] text-stone-500", children: "4. Choose a time" }), _jsx("div", { className: "mt-3 grid gap-2 sm:grid-cols-3 lg:grid-cols-4", children: isSlotsLoading ? (_jsx("div", { className: "rounded-2xl border border-dashed border-black/10 bg-stone-50 px-4 py-6 text-sm text-stone-500 sm:col-span-3 lg:col-span-4", children: "Loading available slots..." })) : dateSlots.length > 0 ? (dateSlots.map((slot) => {
262
+ const isSelected = selectedSlot?.time === slot.time && selectedSlot?.endTime === slot.endTime;
263
+ return (_jsx("button", { type: "button", onClick: () => void handleSlotSelect(slot), className: isSelected
264
+ ? 'h-11 rounded-2xl bg-stone-950 px-3 text-sm font-medium text-white'
265
+ : 'h-11 rounded-2xl border border-black/8 bg-white px-3 text-sm font-medium text-stone-900 transition hover:border-stone-300 hover:bg-stone-50', children: slot.time }, `${slot.time}-${slot.endTime}`));
266
+ })) : (_jsx("div", { className: "rounded-2xl border border-dashed border-black/10 bg-stone-50 px-4 py-6 text-sm text-stone-500 sm:col-span-3 lg:col-span-4", children: "No slots available for this date yet." })) })] })] })] }), _jsxs("div", { className: "rounded-[28px] bg-stone-50 p-5 lg:p-6", children: [_jsx("h3", { className: "text-lg font-semibold text-stone-950", children: "Your details" }), _jsxs("div", { className: "mt-5 space-y-3", children: [_jsx("input", { value: customerName, onChange: (event) => setCustomerName(event.target.value), placeholder: "Full name", className: "h-12 w-full rounded-2xl border border-black/8 bg-white px-4 text-sm text-stone-950 outline-none transition focus:border-stone-400" }), _jsx("input", { value: customerEmail, onChange: (event) => setCustomerEmail(event.target.value), placeholder: "Email", type: "email", className: "h-12 w-full rounded-2xl border border-black/8 bg-white px-4 text-sm text-stone-950 outline-none transition focus:border-stone-400" }), _jsx("input", { value: customerPhone, onChange: (event) => setCustomerPhone(event.target.value), placeholder: "Phone", className: "h-12 w-full rounded-2xl border border-black/8 bg-white px-4 text-sm text-stone-950 outline-none transition focus:border-stone-400" }), _jsx("textarea", { value: customerNotes, onChange: (event) => setCustomerNotes(event.target.value), placeholder: "Anything we should know?", className: "min-h-28 w-full rounded-2xl border border-black/8 bg-white px-4 py-3 text-sm text-stone-950 outline-none transition focus:border-stone-400" })] }), _jsxs("div", { className: "mt-6 rounded-[24px] border border-black/8 bg-white p-4", children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.18em] text-stone-500", children: "Summary" }), _jsxs("div", { className: "mt-3 space-y-2 text-sm text-stone-700", children: [_jsx("p", { children: selectedService ? selectedService.name : 'Choose a service' }), _jsx("p", { children: selectedSlot ? `${selectedDate} at ${selectedSlot.time}` : 'Choose a time' }), _jsx("p", { children: heldStaffId
267
+ ? `Reserved with ${availableStaff.find((staffMember) => staffMember._id === heldStaffId)?.name ?? 'selected staff'}`
268
+ : selectedStaff
269
+ ? `Staff: ${selectedStaff.name}`
270
+ : 'Any available team member' })] })] }), error ? _jsx("p", { className: "mt-4 text-sm text-red-600", children: error }) : null, success ? _jsx("p", { className: "mt-4 text-sm text-emerald-700", children: success }) : null, _jsx("button", { type: "button", disabled: isSubmitting ||
271
+ !selectedService ||
272
+ !selectedSlot ||
273
+ !holdId ||
274
+ !customerName.trim() ||
275
+ !customerEmail.trim(), onClick: () => void handleConfirmBooking(), className: "mt-6 inline-flex h-12 w-full items-center justify-center rounded-2xl bg-stone-950 px-4 text-sm font-medium text-white transition hover:bg-stone-800 disabled:cursor-not-allowed disabled:bg-stone-300", children: isSubmitting ? 'Booking...' : 'Confirm booking' })] })] }) }));
276
+ }
277
+ function currencyFormatter(currency) {
278
+ return new Intl.NumberFormat('en-US', {
279
+ style: 'currency',
280
+ currency: currency.toUpperCase(),
281
+ maximumFractionDigits: 0,
282
+ });
283
+ }
284
+ function dateKeyFromOffset(offset) {
285
+ const next = new Date();
286
+ next.setDate(next.getDate() + offset);
287
+ return next.toISOString().slice(0, 10);
288
+ }
289
+ function formatDateLabel(dateKey) {
290
+ return new Date(`${dateKey}T00:00:00`).toLocaleDateString([], {
291
+ weekday: 'short',
292
+ month: 'short',
293
+ day: 'numeric',
294
+ });
295
+ }
296
+ function sessionTokenFromBrowser() {
297
+ if (typeof window === 'undefined') {
298
+ return 'server-preview-session';
299
+ }
300
+ const existing = window.sessionStorage.getItem('sable-public-booking-session');
301
+ if (existing) {
302
+ return existing;
303
+ }
304
+ const next = typeof crypto !== 'undefined' && 'randomUUID' in crypto
305
+ ? crypto.randomUUID()
306
+ : `session-${Math.random().toString(36).slice(2)}`;
307
+ window.sessionStorage.setItem('sable-public-booking-session', next);
308
+ return next;
309
+ }
310
+ //# sourceMappingURL=booking-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-widget.js","sourceRoot":"","sources":["../src/booking-widget.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { BookingHoldRefresh, BookingHoldReservation, ContactSubmissionResult, PublicBookingCreateResult, PublicBookingSetup, PublicBookingSlots, PublicContactInput, PublicSiteProfile, SableSiteConfig } from './types';
2
+ export type SablePublicClient = ReturnType<typeof createSablePublicClient>;
3
+ export declare function createSablePublicClient(config: SableSiteConfig): {
4
+ config: SableSiteConfig;
5
+ getPublicSiteProfile(siteSlug?: string): Promise<PublicSiteProfile>;
6
+ submitPublicContact(input: PublicContactInput, siteSlug?: string): Promise<ContactSubmissionResult>;
7
+ getPublicBookingSetup(siteSlug?: string): Promise<PublicBookingSetup>;
8
+ getPublicAvailableSlots(args: {
9
+ serviceId: string;
10
+ staffMemberId?: string;
11
+ startDate: string;
12
+ endDate: string;
13
+ siteSlug?: string;
14
+ }): Promise<PublicBookingSlots>;
15
+ reservePublicBookingHold(input: Record<string, unknown>): Promise<BookingHoldReservation>;
16
+ refreshPublicBookingHold(input: Record<string, unknown>): Promise<BookingHoldRefresh>;
17
+ releasePublicBookingHold(input: Record<string, unknown>): Promise<{
18
+ status?: string;
19
+ }>;
20
+ createPublicBooking(input: Record<string, unknown>): Promise<PublicBookingCreateResult>;
21
+ };
22
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EAChB,MAAM,SAAS,CAAA;AAMhB,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE1E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe;;;+BAyBhC,kBAAkB;;kCAgBf;QAC5B,SAAS,EAAE,MAAM,CAAA;QACjB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB;oCAc+B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oCASvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oCASvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;iBACvB,MAAM;;+BAQX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAUrD"}
package/dist/client.js ADDED
@@ -0,0 +1,94 @@
1
+ export function createSablePublicClient(config) {
2
+ const apiUrl = normalizeApiUrl(config.apiUrl);
3
+ async function requestJson(path, init) {
4
+ const response = await fetch(`${apiUrl}${path}`, init);
5
+ const payload = (await response.json().catch(() => null));
6
+ const errorPayload = payload && 'error' in payload ? payload.error : null;
7
+ if (!response.ok || errorPayload) {
8
+ throw new Error(errorPayload?.message || `Request failed (${response.status})`);
9
+ }
10
+ if (!payload || !('data' in payload)) {
11
+ throw new Error('Malformed API response');
12
+ }
13
+ return payload.data;
14
+ }
15
+ return {
16
+ config,
17
+ getPublicSiteProfile(siteSlug = config.siteSlug) {
18
+ const query = new URLSearchParams({ siteSlug });
19
+ return requestJson(`/public/site-profile?${query.toString()}`);
20
+ },
21
+ submitPublicContact(input, siteSlug = config.siteSlug) {
22
+ return requestJson('/public/contact', {
23
+ method: 'POST',
24
+ headers: {
25
+ 'Content-Type': 'application/json',
26
+ },
27
+ body: JSON.stringify({
28
+ siteSlug,
29
+ ...input,
30
+ }),
31
+ });
32
+ },
33
+ getPublicBookingSetup(siteSlug = config.siteSlug) {
34
+ const query = new URLSearchParams({ siteSlug });
35
+ return requestJson(`/public/booking/setup?${query.toString()}`);
36
+ },
37
+ getPublicAvailableSlots(args) {
38
+ const query = new URLSearchParams({
39
+ siteSlug: args.siteSlug || config.siteSlug,
40
+ serviceId: args.serviceId,
41
+ startDate: args.startDate,
42
+ endDate: args.endDate,
43
+ });
44
+ if (args.staffMemberId) {
45
+ query.set('staffMemberId', args.staffMemberId);
46
+ }
47
+ return requestJson(`/public/booking/slots?${query.toString()}`);
48
+ },
49
+ reservePublicBookingHold(input) {
50
+ return requestJson('/public/booking/reserve-hold', {
51
+ method: 'POST',
52
+ headers: {
53
+ 'Content-Type': 'application/json',
54
+ },
55
+ body: JSON.stringify(input),
56
+ });
57
+ },
58
+ refreshPublicBookingHold(input) {
59
+ return requestJson('/public/booking/refresh-hold', {
60
+ method: 'POST',
61
+ headers: {
62
+ 'Content-Type': 'application/json',
63
+ },
64
+ body: JSON.stringify(input),
65
+ });
66
+ },
67
+ releasePublicBookingHold(input) {
68
+ return requestJson('/public/booking/release-hold', {
69
+ method: 'POST',
70
+ headers: {
71
+ 'Content-Type': 'application/json',
72
+ },
73
+ body: JSON.stringify(input),
74
+ });
75
+ },
76
+ createPublicBooking(input) {
77
+ return requestJson('/public/booking/create', {
78
+ method: 'POST',
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ },
82
+ body: JSON.stringify(input),
83
+ });
84
+ },
85
+ };
86
+ }
87
+ function normalizeApiUrl(value) {
88
+ const trimmed = value.trim();
89
+ if (!trimmed) {
90
+ throw new Error('Missing Sable public API URL');
91
+ }
92
+ return trimmed.replace(/\/+$/, '');
93
+ }
94
+ //# 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,5 @@
1
+ export { createSablePublicClient } from './client';
2
+ export { BookingWidgetPanel } from './booking-widget';
3
+ export { SableSiteProvider, getResolvedSiteProfile, useSableSiteClient, useSableSiteConfig, useSableSiteProfile, } from './provider';
4
+ export type { ContactSubmissionResult, PublicBookingCreateResult, PublicBookingSetup, PublicBookingSlots, PublicContactInput, PublicSiteProfile, ResolvedSiteProfile, SableSiteConfig, } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,GAChB,MAAM,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { createSablePublicClient } from './client';
2
+ export { BookingWidgetPanel } from './booking-widget';
3
+ export { SableSiteProvider, getResolvedSiteProfile, useSableSiteClient, useSableSiteConfig, useSableSiteProfile, } from './provider';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { PublicSiteProfile, ResolvedSiteProfile, SableSiteConfig } from './types';
3
+ export declare function SableSiteProvider({ config, children, fallbackProfile, }: {
4
+ config: SableSiteConfig;
5
+ children: ReactNode;
6
+ fallbackProfile?: Partial<ResolvedSiteProfile>;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ export declare function useSableSiteProfile(): {
9
+ siteProfile: PublicSiteProfile | null;
10
+ resolvedProfile: ResolvedSiteProfile;
11
+ isLoading: boolean;
12
+ error: string | null;
13
+ };
14
+ export declare function useSableSiteClient(): {
15
+ config: SableSiteConfig;
16
+ getPublicSiteProfile(siteSlug?: string): Promise<PublicSiteProfile>;
17
+ submitPublicContact(input: import("./types").PublicContactInput, siteSlug?: string): Promise<import("./types").ContactSubmissionResult>;
18
+ getPublicBookingSetup(siteSlug?: string): Promise<import("./types").PublicBookingSetup>;
19
+ getPublicAvailableSlots(args: {
20
+ serviceId: string;
21
+ staffMemberId?: string;
22
+ startDate: string;
23
+ endDate: string;
24
+ siteSlug?: string;
25
+ }): Promise<import("./types").PublicBookingSlots>;
26
+ reservePublicBookingHold(input: Record<string, unknown>): Promise<import("./types").BookingHoldReservation>;
27
+ refreshPublicBookingHold(input: Record<string, unknown>): Promise<import("./types").BookingHoldRefresh>;
28
+ releasePublicBookingHold(input: Record<string, unknown>): Promise<{
29
+ status?: string;
30
+ }>;
31
+ createPublicBooking(input: Record<string, unknown>): Promise<import("./types").PublicBookingCreateResult>;
32
+ };
33
+ export declare function useSableSiteConfig(): SableSiteConfig;
34
+ export declare function getResolvedSiteProfile(siteProfile: PublicSiteProfile | null, fallbackProfile?: Partial<ResolvedSiteProfile>): ResolvedSiteProfile;
35
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAyBtF,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,EAAE;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CAC/C,2CA+CA;AAED,wBAAgB,mBAAmB;;;;;EAQlC;AAED,wBAAgB,kBAAkB;;;;;;;qBAtBrB,CAAC;;;gBAKR,CAAL;;;;;;;;EAmBA;AAED,wBAAgB,kBAAkB,oBAEjC;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,iBAAiB,GAAG,IAAI,EACrC,eAAe,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAC7C,mBAAmB,CAqBrB"}
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useState, } from 'react';
3
+ import { createSablePublicClient } from './client';
4
+ const defaultResolvedProfile = {
5
+ businessName: 'Business',
6
+ phone: '',
7
+ email: '',
8
+ address: '',
9
+ addressLines: [],
10
+ hoursText: '',
11
+ facebook: '',
12
+ instagram: '',
13
+ description: '',
14
+ };
15
+ const SableSiteContext = createContext(null);
16
+ export function SableSiteProvider({ config, children, fallbackProfile, }) {
17
+ const client = useMemo(() => createSablePublicClient(config), [config.apiUrl, config.siteSlug]);
18
+ const [siteProfile, setSiteProfile] = useState(null);
19
+ const [isLoading, setIsLoading] = useState(true);
20
+ const [error, setError] = useState(null);
21
+ useEffect(() => {
22
+ let cancelled = false;
23
+ setIsLoading(true);
24
+ void client
25
+ .getPublicSiteProfile()
26
+ .then((profile) => {
27
+ if (cancelled) {
28
+ return;
29
+ }
30
+ setSiteProfile(profile);
31
+ setError(null);
32
+ })
33
+ .catch((nextError) => {
34
+ if (!cancelled) {
35
+ setError(nextError instanceof Error ? nextError.message : 'Unable to load site profile.');
36
+ }
37
+ })
38
+ .finally(() => {
39
+ if (!cancelled) {
40
+ setIsLoading(false);
41
+ }
42
+ });
43
+ return () => {
44
+ cancelled = true;
45
+ };
46
+ }, [client]);
47
+ const resolvedProfile = useMemo(() => getResolvedSiteProfile(siteProfile, fallbackProfile), [fallbackProfile, siteProfile]);
48
+ return (_jsx(SableSiteContext.Provider, { value: { client, config, siteProfile, resolvedProfile, isLoading, error }, children: children }));
49
+ }
50
+ export function useSableSiteProfile() {
51
+ const context = useRequiredSableSiteContext();
52
+ return {
53
+ siteProfile: context.siteProfile,
54
+ resolvedProfile: context.resolvedProfile,
55
+ isLoading: context.isLoading,
56
+ error: context.error,
57
+ };
58
+ }
59
+ export function useSableSiteClient() {
60
+ return useRequiredSableSiteContext().client;
61
+ }
62
+ export function useSableSiteConfig() {
63
+ return useRequiredSableSiteContext().config;
64
+ }
65
+ export function getResolvedSiteProfile(siteProfile, fallbackProfile) {
66
+ const base = {
67
+ ...defaultResolvedProfile,
68
+ ...fallbackProfile,
69
+ };
70
+ const address = siteProfile?.profile.contactAddress || base.address;
71
+ const businessHours = siteProfile?.profile.businessHours?.length
72
+ ? formatBusinessHours(siteProfile.profile.businessHours)
73
+ : base.hoursText;
74
+ return {
75
+ businessName: siteProfile?.site.businessName || base.businessName,
76
+ phone: siteProfile?.profile.contactPhone || base.phone,
77
+ email: siteProfile?.profile.contactEmail || base.email,
78
+ address,
79
+ addressLines: formatAddressLines(address),
80
+ hoursText: businessHours,
81
+ facebook: siteProfile?.profile.socialLinks?.facebook || base.facebook,
82
+ instagram: siteProfile?.profile.socialLinks?.instagram || base.instagram,
83
+ description: siteProfile?.profile.shortDescription || base.description,
84
+ };
85
+ }
86
+ function useRequiredSableSiteContext() {
87
+ const context = useContext(SableSiteContext);
88
+ if (!context) {
89
+ throw new Error('Sable site hooks must be used within SableSiteProvider');
90
+ }
91
+ return context;
92
+ }
93
+ function formatBusinessHours(hours) {
94
+ const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
95
+ return hours
96
+ .map((entry) => {
97
+ const dayLabel = dayNames[entry.day] || `Day ${entry.day}`;
98
+ if (!entry.isOpen) {
99
+ return `${dayLabel}: Closed`;
100
+ }
101
+ return `${dayLabel}: ${entry.openTime || '--'} – ${entry.closeTime || '--'}`;
102
+ })
103
+ .join('\n');
104
+ }
105
+ function formatAddressLines(address) {
106
+ if (!address) {
107
+ return [];
108
+ }
109
+ if (address.includes('\n')) {
110
+ return address.split('\n');
111
+ }
112
+ return address
113
+ .split(',')
114
+ .map((segment) => segment.trim())
115
+ .filter(Boolean);
116
+ }
117
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ export type SableSiteConfig = {
2
+ apiUrl: string;
3
+ siteSlug: string;
4
+ };
5
+ export type PublicSiteProfile = {
6
+ site: {
7
+ _id: string;
8
+ slug: string;
9
+ name: string;
10
+ businessName: string;
11
+ status: string;
12
+ };
13
+ profile: {
14
+ contactEmail: string | null;
15
+ contactPhone: string | null;
16
+ contactAddress: string | null;
17
+ tagline: string | null;
18
+ shortDescription: string | null;
19
+ aboutText: string | null;
20
+ socialLinks: {
21
+ instagram?: string;
22
+ facebook?: string;
23
+ linkedin?: string;
24
+ googleBusinessProfileUrl?: string;
25
+ tiktok?: string;
26
+ youtube?: string;
27
+ } | null;
28
+ businessHours: Array<{
29
+ day: number;
30
+ isOpen: boolean;
31
+ openTime?: string;
32
+ closeTime?: string;
33
+ }>;
34
+ bookingEnabled: boolean;
35
+ bookingSettings: {
36
+ requiresConfirmation: boolean;
37
+ defaultMinimumNoticeMinutes: number;
38
+ defaultMaxAdvanceBookingDays: number;
39
+ allowOnlinePayments: boolean;
40
+ allowInPersonPayments: boolean;
41
+ cancellationPolicyText?: string;
42
+ } | null;
43
+ };
44
+ };
45
+ export type PublicContactInput = {
46
+ name: string;
47
+ email: string;
48
+ phone?: string;
49
+ message: string;
50
+ page?: string;
51
+ };
52
+ export type PublicBookingSetup = {
53
+ site: {
54
+ _id: string;
55
+ slug: string;
56
+ businessName: string;
57
+ };
58
+ services: Array<{
59
+ _id: string;
60
+ name: string;
61
+ slug: string;
62
+ description?: string;
63
+ durationMinutes: number;
64
+ priceCents: number;
65
+ currency: string;
66
+ deliveryMethods: Array<'in-person' | 'video' | 'phone'>;
67
+ assignedStaffIds: string[];
68
+ }>;
69
+ staff: Array<{
70
+ _id: string;
71
+ name: string;
72
+ email: string;
73
+ timezone: string;
74
+ }>;
75
+ };
76
+ export type PublicBookingSlots = {
77
+ dates: Array<{
78
+ date: string;
79
+ slots: Array<{
80
+ time: string;
81
+ endTime: string;
82
+ availableStaffIds: string[];
83
+ }>;
84
+ }>;
85
+ };
86
+ export type BookingHoldReservation = {
87
+ holdId: string;
88
+ expiresAt: number;
89
+ };
90
+ export type BookingHoldRefresh = {
91
+ expiresAt: number;
92
+ };
93
+ export type ContactSubmissionResult = {
94
+ submissionId: string;
95
+ clientId: string;
96
+ };
97
+ export type PublicBookingCreateResult = {
98
+ appointmentId: string;
99
+ };
100
+ export type ResolvedSiteProfile = {
101
+ businessName: string;
102
+ phone: string;
103
+ email: string;
104
+ address: string;
105
+ addressLines: string[];
106
+ hoursText: string;
107
+ facebook: string;
108
+ instagram: string;
109
+ description: string;
110
+ };
111
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@asksable/site-connector",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.json",
25
+ "typecheck": "tsc -p tsconfig.json --noEmit",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "peerDependencies": {
29
+ "react": "^19.0.0",
30
+ "react-dom": "^19.0.0"
31
+ }
32
+ }