@fayz-ai/plugin-agenda 0.8.1 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-LFUELUIT.cjs → chunk-3KWNHV5A.cjs} +60 -2
- package/dist/chunk-3KWNHV5A.cjs.map +1 -0
- package/dist/{chunk-DRZF6CV2.js → chunk-YQO6B4G3.js} +60 -3
- package/dist/chunk-YQO6B4G3.js.map +1 -0
- package/dist/components/AgendaGeneralSettings.d.ts.map +1 -1
- package/dist/components/AppointmentModal.d.ts.map +1 -1
- package/dist/components/CalendarToolbar.d.ts.map +1 -1
- package/dist/data/supabase.d.ts +5 -1
- package/dist/data/supabase.d.ts.map +1 -1
- package/dist/index.cjs +1071 -766
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +914 -609
- package/dist/index.js.map +1 -1
- package/dist/integrations/google-calendar/components/CalendarColorDot.d.ts +6 -0
- package/dist/integrations/google-calendar/components/CalendarColorDot.d.ts.map +1 -0
- package/dist/integrations/google-calendar/components/ChannelMappingList.d.ts +9 -0
- package/dist/integrations/google-calendar/components/ChannelMappingList.d.ts.map +1 -0
- package/dist/integrations/google-calendar/components/ImportEventsWizard.d.ts +12 -0
- package/dist/integrations/google-calendar/components/ImportEventsWizard.d.ts.map +1 -0
- package/dist/integrations/google-calendar/components/useAgendaLookups.d.ts +26 -0
- package/dist/integrations/google-calendar/components/useAgendaLookups.d.ts.map +1 -0
- package/dist/integrations/google-calendar/connectorDef.d.ts.map +1 -1
- package/dist/integrations/google-calendar/data/supabase.d.ts +33 -1
- package/dist/integrations/google-calendar/data/supabase.d.ts.map +1 -1
- package/dist/integrations/google-calendar/data/tables.d.ts +6 -0
- package/dist/integrations/google-calendar/data/tables.d.ts.map +1 -0
- package/dist/integrations/google-calendar/index.d.ts +1 -1
- package/dist/integrations/google-calendar/index.d.ts.map +1 -1
- package/dist/integrations/google-calendar/mapping.d.ts +56 -4
- package/dist/integrations/google-calendar/mapping.d.ts.map +1 -1
- package/dist/integrations/google-calendar/types.d.ts +101 -0
- package/dist/integrations/google-calendar/types.d.ts.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +11 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/public/BookingWidget.d.ts.map +1 -1
- package/dist/public/context.d.ts +3 -1
- package/dist/public/context.d.ts.map +1 -1
- package/dist/public/createPublicBookingPlugin.d.ts +7 -1
- package/dist/public/createPublicBookingPlugin.d.ts.map +1 -1
- package/dist/public/data.d.ts +6 -0
- package/dist/public/data.d.ts.map +1 -1
- package/dist/public/data.supabase.d.ts.map +1 -1
- package/dist/public/format.d.ts +22 -1
- package/dist/public/format.d.ts.map +1 -1
- package/dist/public/hooks.d.ts.map +1 -1
- package/dist/public/index.cjs +31 -63
- package/dist/public/index.cjs.map +1 -1
- package/dist/public/index.d.ts +1 -1
- package/dist/public/index.d.ts.map +1 -1
- package/dist/public/index.js +27 -61
- package/dist/public/index.js.map +1 -1
- package/dist/public/steps/ContactStep.d.ts +4 -2
- package/dist/public/steps/ContactStep.d.ts.map +1 -1
- package/dist/public/types.d.ts +16 -0
- package/dist/public/types.d.ts.map +1 -1
- package/dist/views/CalendarView.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/components/AgendaGeneralSettings.tsx +38 -16
- package/src/components/AppointmentModal.tsx +50 -108
- package/src/components/CalendarToolbar.tsx +10 -7
- package/src/data/supabase.ts +67 -13
- package/src/index.ts +56 -8
- package/src/integrations/google-calendar/components/CalendarColorDot.tsx +23 -0
- package/src/integrations/google-calendar/components/ChannelMappingList.tsx +329 -0
- package/src/integrations/google-calendar/components/ImportEventsWizard.tsx +215 -0
- package/src/integrations/google-calendar/components/useAgendaLookups.ts +100 -0
- package/src/integrations/google-calendar/connectorDef.tsx +123 -40
- package/src/integrations/google-calendar/data/supabase.ts +109 -13
- package/src/integrations/google-calendar/data/tables.ts +12 -0
- package/src/integrations/google-calendar/index.ts +10 -1
- package/src/integrations/google-calendar/integration.test.ts +126 -1
- package/src/integrations/google-calendar/mapping.ts +149 -9
- package/src/integrations/google-calendar/migrations/001_google_calendar.sql +9 -6
- package/src/integrations/google-calendar/migrations/002_smart_sync.sql +517 -0
- package/src/integrations/google-calendar/migrations/003_plg_rename.sql +273 -0
- package/src/integrations/google-calendar/types.ts +111 -0
- package/src/locales/en.ts +1 -0
- package/src/locales/pt-BR.ts +1 -0
- package/src/migrations/003_public_client_kind.sql +175 -0
- package/src/migrations/004_public_booking_assignee.sql +176 -0
- package/src/migrations/005_agent_rpcs.sql +168 -0
- package/src/migrations/006_agent_rpc_localtime.sql +181 -0
- package/src/migrations/007_schedule_exception_precedence.sql +290 -0
- package/src/migrations/008_agent_rpc_exception_precedence.sql +172 -0
- package/src/migrations/009_public_booking_location.sql +162 -0
- package/src/migrations/010_public_service_curation.sql +31 -0
- package/src/migrations/011_default_assignee.sql +167 -0
- package/src/migrations/012_drop_legacy_booking_overload.sql +29 -0
- package/src/migrations/013_normalize_v_appointments.sql +161 -0
- package/src/migrations/index.ts +1746 -1
- package/src/public/BookingWidget.tsx +10 -1
- package/src/public/context.tsx +3 -0
- package/src/public/createPublicBookingPlugin.ts +14 -1
- package/src/public/data.supabase.ts +3 -0
- package/src/public/data.ts +6 -0
- package/src/public/format.ts +36 -1
- package/src/public/hooks.ts +7 -2
- package/src/public/index.ts +1 -0
- package/src/public/steps/ContactStep.tsx +10 -5
- package/src/public/types.ts +21 -0
- package/src/views/CalendarView.tsx +15 -1
- package/dist/chunk-3LJKZQK4.js +0 -12
- package/dist/chunk-3LJKZQK4.js.map +0 -1
- package/dist/chunk-DRZF6CV2.js.map +0 -1
- package/dist/chunk-LFUELUIT.cjs.map +0 -1
- package/dist/chunk-SYDBDI3Q.cjs +0 -15
- package/dist/chunk-SYDBDI3Q.cjs.map +0 -1
- package/dist/components/SearchCombobox.d.ts +0 -38
- package/dist/components/SearchCombobox.d.ts.map +0 -1
- package/dist/tenant-222EHYUC.cjs +0 -16
- package/dist/tenant-222EHYUC.cjs.map +0 -1
- package/dist/tenant-LAUWVUYB.js +0 -3
- package/dist/tenant-LAUWVUYB.js.map +0 -1
- package/src/components/SearchCombobox.tsx +0 -216
|
@@ -26,7 +26,8 @@ type Step = 'overview' | 'datetime' | 'contact' | 'payment' | 'success'
|
|
|
26
26
|
export function BookingWidget() {
|
|
27
27
|
const {
|
|
28
28
|
services, servicesLoading, professionalName, businessHours, payment, paymentProvider,
|
|
29
|
-
onIdentityVerified, labels, brand, components: C,
|
|
29
|
+
phoneVerification, onIdentityVerified, labels, brand, components: C,
|
|
30
|
+
window: bookingWindow, locale, currency,
|
|
30
31
|
} = useBooking()
|
|
31
32
|
const fmt = useFormatters(locale, currency)
|
|
32
33
|
|
|
@@ -123,8 +124,15 @@ export function BookingWidget() {
|
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
// Contact sub-step submit handlers (also used by Enter via <form onSubmit>).
|
|
127
|
+
// With phoneVerification 'none' the typed number is trusted: skip the code
|
|
128
|
+
// modal and go straight to details (identity emitted just the same).
|
|
126
129
|
function sendCode() {
|
|
127
130
|
if (unmaskPhone(contact.phone).length < 8) return
|
|
131
|
+
if (phoneVerification === 'none') {
|
|
132
|
+
emitIdentity()
|
|
133
|
+
setContactStep('details')
|
|
134
|
+
return
|
|
135
|
+
}
|
|
128
136
|
setCode(''); setCodeError(false); setContactStep('code')
|
|
129
137
|
}
|
|
130
138
|
function confirmCode() {
|
|
@@ -254,6 +262,7 @@ export function BookingWidget() {
|
|
|
254
262
|
}}
|
|
255
263
|
code={code}
|
|
256
264
|
onCodeChange={(v) => { setCode(v); setCodeError(false) }}
|
|
265
|
+
phoneVerification={phoneVerification}
|
|
257
266
|
codeError={codeError}
|
|
258
267
|
onSendCode={sendCode}
|
|
259
268
|
onConfirmCode={confirmCode}
|
package/src/public/context.tsx
CHANGED
|
@@ -4,6 +4,7 @@ import type { PublicBookingDataProvider } from './data'
|
|
|
4
4
|
import type {
|
|
5
5
|
BookingComponents,
|
|
6
6
|
BookingWindow,
|
|
7
|
+
PhoneVerificationMode,
|
|
7
8
|
PublicBookingLabels,
|
|
8
9
|
PublicService,
|
|
9
10
|
ResolvedBookingBrand,
|
|
@@ -25,6 +26,8 @@ export interface PublicBookingContextValue {
|
|
|
25
26
|
servicesLoading: boolean
|
|
26
27
|
/** Business opening hours, shown on the overview "Sobre" section. */
|
|
27
28
|
businessHours: WorkingHours
|
|
29
|
+
/** 'otp' shows the code modal; 'none' trusts the typed number (default). */
|
|
30
|
+
phoneVerification: PhoneVerificationMode
|
|
28
31
|
/** Payment step config, or null when the flow ends at confirmation. */
|
|
29
32
|
payment: ResolvedPayment | null
|
|
30
33
|
/** Injected charge provider (Pix). When absent, the payment step self-mocks. */
|
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
BookingComponents,
|
|
14
14
|
BookingWindow,
|
|
15
15
|
PaymentConfig,
|
|
16
|
+
PhoneVerificationMode,
|
|
16
17
|
PublicBookingLabels,
|
|
17
18
|
PublicService,
|
|
18
19
|
ResolvedBookingBrand,
|
|
@@ -49,6 +50,12 @@ export interface PublicBookingOptions {
|
|
|
49
50
|
brand?: BookingBrand
|
|
50
51
|
/** Swap whole subcomponents when structure must change (defaults exported). */
|
|
51
52
|
components?: Partial<BookingComponents>
|
|
53
|
+
/**
|
|
54
|
+
* Phone verification before the details sub-step. Default 'none' — the typed
|
|
55
|
+
* number is trusted. Set 'otp' only where a real code sender is wired: the
|
|
56
|
+
* built-in modal is a POC that accepts the literal '0000' and sends nothing.
|
|
57
|
+
*/
|
|
58
|
+
phoneVerification?: PhoneVerificationMode
|
|
52
59
|
/** Adds a final Pagamento (Pix) step. Omit/disable to end the flow at confirmation. */
|
|
53
60
|
payment?: PaymentConfig
|
|
54
61
|
/** Charge provider (from a payments plugin) used by the Pagamento step. Optional. */
|
|
@@ -100,6 +107,8 @@ const DEFAULT_LABELS: PublicBookingLabels = {
|
|
|
100
107
|
phoneHint:
|
|
101
108
|
'Enviaremos um código para confirmar que o número de telefone é seu. Usaremos este número para associar as suas informações à sua conta.',
|
|
102
109
|
sendCodeCta: 'Enviar código via WhatsApp',
|
|
110
|
+
phoneHintNoVerification: 'Usaremos este número para confirmar seu agendamento pelo WhatsApp.',
|
|
111
|
+
phoneContinueCta: 'Continuar',
|
|
103
112
|
codeTitle: 'Insira o código',
|
|
104
113
|
codeBody: 'Enviamos um código via WhatsApp para você confirmar seu número.',
|
|
105
114
|
codeInvalid: 'Código inválido. Para testar, use 0000.',
|
|
@@ -116,7 +125,9 @@ const DEFAULT_LABELS: PublicBookingLabels = {
|
|
|
116
125
|
notesPlaceholder: 'Use esse espaço para deixar uma observação sobre este agendamento',
|
|
117
126
|
saveAndContinueCta: 'Salvar e continuar',
|
|
118
127
|
submitError: 'Não foi possível concluir o agendamento. Tente novamente.',
|
|
119
|
-
|
|
128
|
+
// Rendered ONLY when the payment step is off — so it must not promise a
|
|
129
|
+
// payment method the flow never shows.
|
|
130
|
+
noChargeNote: 'Sem cobrança agora · o pagamento é feito no atendimento',
|
|
120
131
|
// right rail
|
|
121
132
|
railTitle: 'Passos para agendar',
|
|
122
133
|
railWaitingPayment: 'Aguardando pagamento',
|
|
@@ -180,6 +191,7 @@ export function createPublicBookingPlugin(options: PublicBookingOptions): Public
|
|
|
180
191
|
const locale = options.locale ?? 'pt-BR'
|
|
181
192
|
const hours = options.workingHours ?? DEFAULT_HOURS
|
|
182
193
|
const staticServices = options.services ?? null
|
|
194
|
+
const phoneVerification: PhoneVerificationMode = options.phoneVerification ?? 'none'
|
|
183
195
|
const payment: ResolvedPayment | null = options.payment?.enabled
|
|
184
196
|
? {
|
|
185
197
|
reservationFeePercent: options.payment.reservationFeePercent ?? 100,
|
|
@@ -229,6 +241,7 @@ export function createPublicBookingPlugin(options: PublicBookingOptions): Public
|
|
|
229
241
|
professionalId,
|
|
230
242
|
professionalName,
|
|
231
243
|
businessHours: hours,
|
|
244
|
+
phoneVerification,
|
|
232
245
|
payment,
|
|
233
246
|
paymentProvider: options.paymentProvider ?? null,
|
|
234
247
|
onIdentityVerified: options.onIdentityVerified ?? null,
|
|
@@ -82,6 +82,9 @@ export function createSupabasePublicBookingProvider(options: SupabasePublicBooki
|
|
|
82
82
|
p_phone: phone,
|
|
83
83
|
p_email: input.contact.email?.trim() || null,
|
|
84
84
|
p_notes: input.contact.notes?.trim() || null,
|
|
85
|
+
// Only sent when pinned — keeps compatibility with pools still running
|
|
86
|
+
// the pre-004 7-arg function (unknown named arg would 404 on PostgREST).
|
|
87
|
+
...(input.assigneeId ? { p_assignee_id: input.assigneeId } : {}),
|
|
85
88
|
})
|
|
86
89
|
if (error) throw new Error(`[plugin-agenda/public] createBooking: ${error.message}`)
|
|
87
90
|
const row = (Array.isArray(data) ? data[0] : data) as
|
package/src/public/data.ts
CHANGED
|
@@ -25,6 +25,12 @@ export interface PublicCreateBookingInput {
|
|
|
25
25
|
startsAt: string
|
|
26
26
|
/** name required; phone should include the country dial for real backends. */
|
|
27
27
|
contact: ContactInfo
|
|
28
|
+
/**
|
|
29
|
+
* Staff person id the visitor saw availability for. When set, the backend
|
|
30
|
+
* books THAT professional (or fails if their hours don't cover the slot) —
|
|
31
|
+
* never silently reassigns. null/undefined → backend auto-picks.
|
|
32
|
+
*/
|
|
33
|
+
assigneeId?: string | null
|
|
28
34
|
}
|
|
29
35
|
|
|
30
36
|
export interface PublicBookingResult {
|
package/src/public/format.ts
CHANGED
|
@@ -29,12 +29,47 @@ export function toIso(d: Date): string {
|
|
|
29
29
|
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
/** Read a preselected service
|
|
32
|
+
/** Read a preselected service from the URL (?service=…), router-agnostic. */
|
|
33
33
|
export function readServiceParam(): string | null {
|
|
34
34
|
if (typeof window === 'undefined') return null
|
|
35
35
|
return new URLSearchParams(window.location.search).get('service')
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Comparable form of a service name: lowercase, accent-free, non-alphanumerics
|
|
40
|
+
* collapsed to single dashes.
|
|
41
|
+
*
|
|
42
|
+
* Exists because the marketing site and the catalog spell the same service
|
|
43
|
+
* differently — the site writes "Peeling Químico" and "Drenagem Linfática", the
|
|
44
|
+
* catalog stores "Peeling Quimico" and "Drenagem Linfatica". Matching on the
|
|
45
|
+
* raw name would miss most of them, and making the site link raw UUIDs instead
|
|
46
|
+
* would scatter database ids through page markup and break on every reseed.
|
|
47
|
+
*/
|
|
48
|
+
export function serviceSlug(name: string): string {
|
|
49
|
+
return name
|
|
50
|
+
.normalize('NFD')
|
|
51
|
+
.replace(/[̀-ͯ]/g, '')
|
|
52
|
+
.toLowerCase()
|
|
53
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
54
|
+
.replace(/^-|-$/g, '')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Resolve `?service=` against the catalog. Accepts the service id or its
|
|
59
|
+
* slugified name, so a site can link `/agendar?service=limpeza-de-pele`
|
|
60
|
+
* without knowing any ids. Unknown value ⇒ null, and the widget opens on the
|
|
61
|
+
* overview as if no service had been asked for.
|
|
62
|
+
*/
|
|
63
|
+
export function resolvePreselectedService<T extends { id: string; name: string }>(
|
|
64
|
+
param: string | null,
|
|
65
|
+
services: T[],
|
|
66
|
+
): string | null {
|
|
67
|
+
if (!param) return null
|
|
68
|
+
if (services.some((s) => s.id === param)) return param
|
|
69
|
+
const wanted = serviceSlug(param)
|
|
70
|
+
return services.find((s) => serviceSlug(s.name) === wanted)?.id ?? null
|
|
71
|
+
}
|
|
72
|
+
|
|
38
73
|
export interface DayCell {
|
|
39
74
|
iso: string
|
|
40
75
|
date: Date
|
package/src/public/hooks.ts
CHANGED
|
@@ -80,7 +80,7 @@ export interface UseCreateBookingResult {
|
|
|
80
80
|
|
|
81
81
|
/** Create a booking via the provider (mock append / Supabase RPC). */
|
|
82
82
|
export function useCreateBooking(): UseCreateBookingResult {
|
|
83
|
-
const { provider } = useBooking()
|
|
83
|
+
const { provider, professionalId } = useBooking()
|
|
84
84
|
const [submitting, setSubmitting] = useState(false)
|
|
85
85
|
const [error, setError] = useState<Error | null>(null)
|
|
86
86
|
const [done, setDone] = useState(false)
|
|
@@ -89,7 +89,12 @@ export function useCreateBooking(): UseCreateBookingResult {
|
|
|
89
89
|
setSubmitting(true)
|
|
90
90
|
setError(null)
|
|
91
91
|
try {
|
|
92
|
-
|
|
92
|
+
// The professional the visitor saw availability for must be the one
|
|
93
|
+
// booked — thread it unless the caller already pinned another.
|
|
94
|
+
const result = await provider.createBooking({
|
|
95
|
+
...input,
|
|
96
|
+
assigneeId: input.assigneeId ?? professionalId ?? null,
|
|
97
|
+
})
|
|
93
98
|
setDone(true)
|
|
94
99
|
return result
|
|
95
100
|
} catch (err) {
|
package/src/public/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Check, ChevronDown, CreditCard, Loader2, ShieldCheck } from 'lucide-react'
|
|
2
2
|
import { COUNTRIES, maskPhone, unmaskPhone, type CountryDef } from '@fayz-ai/core'
|
|
3
|
-
import type { PublicBookingLabels, ResolvedPayment } from '../types'
|
|
3
|
+
import type { PhoneVerificationMode, PublicBookingLabels, ResolvedPayment } from '../types'
|
|
4
4
|
|
|
5
5
|
export interface ContactDraft {
|
|
6
6
|
name: string
|
|
@@ -14,6 +14,8 @@ interface ContactStepProps {
|
|
|
14
14
|
contact: ContactDraft
|
|
15
15
|
onContactChange: (contact: ContactDraft) => void
|
|
16
16
|
contactStep: 'phone' | 'code' | 'details'
|
|
17
|
+
/** 'none' → no code is sent, so the copy drops every OTP promise. */
|
|
18
|
+
phoneVerification: PhoneVerificationMode
|
|
17
19
|
country: CountryDef
|
|
18
20
|
onCountryChange: (iso2: string) => void
|
|
19
21
|
code: string
|
|
@@ -30,7 +32,7 @@ interface ContactStepProps {
|
|
|
30
32
|
|
|
31
33
|
/** Contact step — phone verification first (Quaddro-style), then details. */
|
|
32
34
|
export function ContactStep({
|
|
33
|
-
labels, contact, onContactChange, contactStep, country, onCountryChange,
|
|
35
|
+
labels, contact, onContactChange, contactStep, phoneVerification, country, onCountryChange,
|
|
34
36
|
code, onCodeChange, codeError, onSendCode, onConfirmCode, onBackToPhone,
|
|
35
37
|
onSubmitDetails, payment, submitting, error,
|
|
36
38
|
}: ContactStepProps) {
|
|
@@ -65,14 +67,16 @@ export function ContactStep({
|
|
|
65
67
|
placeholder={`Ex.: ${maskPhone('11987654321', country.mask)}`}
|
|
66
68
|
/>
|
|
67
69
|
</div>
|
|
68
|
-
<p className="mt-2 text-xs text-muted-foreground">
|
|
70
|
+
<p className="mt-2 text-xs text-muted-foreground">
|
|
71
|
+
{phoneVerification === 'none' ? labels.phoneHintNoVerification : labels.phoneHint}
|
|
72
|
+
</p>
|
|
69
73
|
</div>
|
|
70
74
|
<button
|
|
71
75
|
type="submit"
|
|
72
76
|
disabled={unmaskPhone(contact.phone).length < 8}
|
|
73
77
|
className="mt-5 w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
74
78
|
>
|
|
75
|
-
{labels.sendCodeCta}
|
|
79
|
+
{phoneVerification === 'none' ? labels.phoneContinueCta : labels.sendCodeCta}
|
|
76
80
|
</button>
|
|
77
81
|
</form>
|
|
78
82
|
) : null}
|
|
@@ -83,7 +87,8 @@ export function ContactStep({
|
|
|
83
87
|
<p className="mt-1 text-sm text-muted-foreground">{labels.contactIntro}</p>
|
|
84
88
|
<div className="mt-4 flex items-center justify-between rounded-xl border border-border bg-muted/40 px-4 py-3">
|
|
85
89
|
<span className="flex items-center gap-2 text-sm text-foreground">
|
|
86
|
-
<ShieldCheck className="h-4 w-4 text-primary" />
|
|
90
|
+
<ShieldCheck className="h-4 w-4 text-primary" />{' '}
|
|
91
|
+
{phoneVerification === 'none' ? labels.phoneLabel : labels.phoneVerified} · {country.flag} {country.dial} {contact.phone}
|
|
87
92
|
</span>
|
|
88
93
|
<button
|
|
89
94
|
type="button"
|
package/src/public/types.ts
CHANGED
|
@@ -60,6 +60,23 @@ export interface ResolvedPayment {
|
|
|
60
60
|
method: 'pix'
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Phone verification
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* How the customer's phone number is verified before the details sub-step.
|
|
69
|
+
*
|
|
70
|
+
* • 'otp' — show the code modal (POC: the code is the literal '0000'; no
|
|
71
|
+
* message is actually sent). Use only where a real sender exists.
|
|
72
|
+
* • 'none' — trust the typed number: the flow goes straight to the details
|
|
73
|
+
* sub-step and the identity is emitted as-is.
|
|
74
|
+
*
|
|
75
|
+
* Default is 'none': until a real WhatsApp sender is wired, an OTP nobody can
|
|
76
|
+
* receive is a dead end for real customers.
|
|
77
|
+
*/
|
|
78
|
+
export type PhoneVerificationMode = 'otp' | 'none'
|
|
79
|
+
|
|
63
80
|
// ---------------------------------------------------------------------------
|
|
64
81
|
// Brand
|
|
65
82
|
// ---------------------------------------------------------------------------
|
|
@@ -201,6 +218,10 @@ export interface PublicBookingLabels {
|
|
|
201
218
|
phoneLabel: string
|
|
202
219
|
phoneHint: string
|
|
203
220
|
sendCodeCta: string
|
|
221
|
+
/** Phone hint shown when phoneVerification is 'none' (no code is sent). */
|
|
222
|
+
phoneHintNoVerification: string
|
|
223
|
+
/** Phone CTA shown when phoneVerification is 'none'. */
|
|
224
|
+
phoneContinueCta: string
|
|
204
225
|
codeTitle: string
|
|
205
226
|
codeBody: string
|
|
206
227
|
codeInvalid: string
|
|
@@ -11,7 +11,7 @@ import type { EventInput, EventClickArg, DateSelectArg, EventDropArg } from '@fu
|
|
|
11
11
|
import { ChevronLeft, ChevronRight, Plus, ChevronDown, Settings } from 'lucide-react'
|
|
12
12
|
import { usePluginPrefs } from '@fayz-ai/saas'
|
|
13
13
|
import { getCurrentLocale } from '@fayz-ai/core'
|
|
14
|
-
import { useTranslation } from '@fayz-ai/core'
|
|
14
|
+
import { useTranslation, useDataChanged } from '@fayz-ai/core'
|
|
15
15
|
import { useAgendaConfig, useAgendaStore } from '../AgendaContext'
|
|
16
16
|
import { useAgendaSettings } from '../hooks/useAgendaSettings'
|
|
17
17
|
import { MiniCalendar } from '../components/MiniCalendar'
|
|
@@ -392,6 +392,20 @@ export function CalendarView() {
|
|
|
392
392
|
fetchBookings({ start: start.toISOString(), end: end.toISOString() })
|
|
393
393
|
}, [isMobile, fetchBookings])
|
|
394
394
|
|
|
395
|
+
// A booking created outside the grid — the assistant, the public page,
|
|
396
|
+
// another device — repaints the calendar it belongs to. Without this the
|
|
397
|
+
// manager who just said "agenda a Maria amanhã às 10" still sees yesterday's
|
|
398
|
+
// grid and reloads the tab by hand.
|
|
399
|
+
useDataChanged({}, () => {
|
|
400
|
+
if (visibleRange) {
|
|
401
|
+
fetchBookings(visibleRange)
|
|
402
|
+
return
|
|
403
|
+
}
|
|
404
|
+
const start = new Date(); start.setHours(0, 0, 0, 0); start.setDate(start.getDate() - 1)
|
|
405
|
+
const end = new Date(start); end.setDate(end.getDate() + 91)
|
|
406
|
+
fetchBookings({ start: start.toISOString(), end: end.toISOString() })
|
|
407
|
+
}, [visibleRange, fetchBookings])
|
|
408
|
+
|
|
395
409
|
const resources = useMemo(() => {
|
|
396
410
|
const filtered = selectedProfIds.length > 0
|
|
397
411
|
? professionals.filter((p) => selectedProfIds.includes(p.id))
|
package/dist/chunk-3LJKZQK4.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// src/lib/tenant.ts
|
|
2
|
-
var t;
|
|
3
|
-
function setAgendaTenantId(id) {
|
|
4
|
-
t = id;
|
|
5
|
-
}
|
|
6
|
-
function getAgendaTenantId() {
|
|
7
|
-
return t;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export { getAgendaTenantId, setAgendaTenantId };
|
|
11
|
-
//# sourceMappingURL=chunk-3LJKZQK4.js.map
|
|
12
|
-
//# sourceMappingURL=chunk-3LJKZQK4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/tenant.ts"],"names":[],"mappings":";AAAA,IAAI,CAAA;AACG,SAAS,kBAAkB,EAAA,EAAuB;AAAE,EAAA,CAAA,GAAI,EAAA;AAAG;AAC3D,SAAS,iBAAA,GAAwC;AAAE,EAAA,OAAO,CAAA;AAAE","file":"chunk-3LJKZQK4.js","sourcesContent":["let t: string | undefined\nexport function setAgendaTenantId(id: string | undefined){ t = id }\nexport function getAgendaTenantId(): string | undefined { return t }\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/mock.ts"],"names":[],"mappings":"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","file":"chunk-DRZF6CV2.js","sourcesContent":["import type { AgendaDataProvider } from './types'\nimport type {\n CalendarBooking, Professional, Schedule, TimeSlot,\n CreateBookingInput, UpdateBookingInput, SaveScheduleInput,\n BookingQuery, ConflictCheckParams, AvailableSlotsParams, BookingStatus,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nlet nextId = 1\nfunction uid(): string { return `mock-${nextId++}` }\nfunction now(): string { return new Date().toISOString() }\n\nfunction addMinutes(date: string, minutes: number): string {\n const d = new Date(date)\n d.setMinutes(d.getMinutes() + minutes)\n return d.toISOString()\n}\n\nfunction timeOverlaps(aStart: string, aEnd: string, bStart: string, bEnd: string): boolean {\n return aStart < bEnd && aEnd > bStart\n}\n\n// ---------------------------------------------------------------------------\n// Sample data\n// ---------------------------------------------------------------------------\n\nconst SAMPLE_PROFESSIONALS: Professional[] = [\n { id: 'prof-1', name: 'Ana Silva', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-2', name: 'Carlos Santos', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-3', name: 'Maria Oliveira', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n]\n\nfunction createSampleBookings(): CalendarBooking[] {\n const today = new Date()\n const year = today.getFullYear()\n const month = today.getMonth()\n const day = today.getDate()\n\n function dt(hour: number, minute = 0): string {\n return new Date(year, month, day, hour, minute).toISOString()\n }\n\n return [\n {\n id: 'bk-1', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(9, 0), endsAt: dt(10, 30), status: 'confirmed',\n notes: null, orderId: 'ord-1', locationId: 'loc-1', metadata: {},\n clientId: 'cl-1', clientName: 'Sarah Johnson', clientPhone: '(11) 99999-1111', clientEmail: 'sarah@email.com', clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 250, orderStatus: 'draft',\n services: [{ id: 'bi-1', serviceId: 'svc-1', name: 'Balayage', durationMinutes: 90, price: 250, assigneeId: 'prof-1' }],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-2', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(10, 0), endsAt: dt(11, 0), status: 'scheduled',\n notes: null, orderId: 'ord-2', locationId: 'loc-1', metadata: {},\n clientId: 'cl-2', clientName: 'Emily Carter', clientPhone: '(11) 99999-2222', clientEmail: 'emily@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 80, orderStatus: 'draft',\n services: [{ id: 'bi-2', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 60, price: 80, assigneeId: 'prof-2' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-3', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(14, 0), endsAt: dt(15, 0), status: 'confirmed',\n notes: 'First visit', orderId: 'ord-3', locationId: 'loc-1', metadata: {},\n clientId: 'cl-3', clientName: 'Rachel Kim', clientPhone: '(11) 99999-3333', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-3', professionalName: 'Maria Oliveira', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 120, orderStatus: 'draft',\n services: [{ id: 'bi-3', serviceId: 'svc-3', name: 'Facial Treatment', durationMinutes: 60, price: 120, assigneeId: 'prof-3' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-4', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(11, 0), endsAt: dt(12, 0), status: 'scheduled',\n notes: null, orderId: 'ord-4', locationId: 'loc-1', metadata: {},\n clientId: 'cl-4', clientName: 'Jessica Lima', clientPhone: '(11) 99999-4444', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 60, orderStatus: 'draft',\n services: [{ id: 'bi-4', serviceId: 'svc-4', name: 'Manicure', durationMinutes: 60, price: 60, assigneeId: 'prof-1' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-5', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(15, 30), endsAt: dt(17, 0), status: 'confirmed',\n notes: null, orderId: 'ord-5', locationId: 'loc-1', metadata: {},\n clientId: 'cl-5', clientName: 'Amanda Wright', clientPhone: '(11) 99999-5555', clientEmail: 'amanda@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 350, orderStatus: 'draft',\n services: [\n { id: 'bi-5', serviceId: 'svc-1', name: 'Highlights', durationMinutes: 60, price: 200, assigneeId: 'prof-2' },\n { id: 'bi-6', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 30, price: 150, assigneeId: 'prof-2' },\n ],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n ]\n}\n\nfunction createSampleSchedules(): Schedule[] {\n const schedules: Schedule[] = []\n for (const prof of SAMPLE_PROFESSIONALS) {\n // Mon-Fri 08:00-12:00, 13:00-18:00\n for (let day = 1; day <= 5; day++) {\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '08:00', endsAt: '12:00', isActive: true, metadata: {},\n })\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '13:00', endsAt: '18:00', isActive: true, metadata: {},\n })\n }\n // Saturday 08:00-14:00\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: 6, specificDate: null,\n startsAt: '08:00', endsAt: '14:00', isActive: true, metadata: {},\n })\n }\n return schedules\n}\n\n// ---------------------------------------------------------------------------\n// Mock provider factory\n// ---------------------------------------------------------------------------\n\n/**\n * Pre-populated agenda data. Any omitted collection falls back to the built-in\n * salon-style sample. Pass `bookings` (and optionally an empty `professionals`)\n * to render a calendar seeded with app-specific events.\n */\nexport interface MockAgendaSeed {\n bookings?: CalendarBooking[]\n professionals?: Professional[]\n schedules?: Schedule[]\n}\n\nexport interface MockAgendaProviderOptions {\n seed?: MockAgendaSeed\n}\n\nexport function createMockAgendaProvider(options?: MockAgendaProviderOptions): AgendaDataProvider {\n const seed = options?.seed\n const bookings: CalendarBooking[] = seed?.bookings ? [...seed.bookings] : createSampleBookings()\n const schedules: Schedule[] = seed?.schedules ? [...seed.schedules] : createSampleSchedules()\n const professionals: Professional[] = seed?.professionals ? [...seed.professionals] : [...SAMPLE_PROFESSIONALS]\n\n return {\n async getLocations(): Promise<Array<{ id: string; name: string }>> {\n return []\n },\n async getBookings(query: BookingQuery): Promise<CalendarBooking[]> {\n return bookings.filter((b) => {\n if (query.kind && b.kind !== query.kind) return false\n if (query.statuses?.length && !query.statuses.includes(b.status)) return false\n if (query.professionalIds?.length && !query.professionalIds.includes(b.professionalId ?? '')) return false\n if (query.locationId && b.locationId !== query.locationId) return false\n if (query.dateRange) {\n if (b.startsAt > query.dateRange.end || (b.endsAt ?? b.startsAt) < query.dateRange.start) return false\n }\n return true\n })\n },\n\n async getBookingById(id: string): Promise<CalendarBooking | null> {\n return bookings.find((b) => b.id === id) ?? null\n },\n\n async createBooking(input: CreateBookingInput): Promise<CalendarBooking> {\n const totalDuration = input.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const totalPrice = input.services.reduce((sum, s) => sum + s.price, 0)\n const booking: CalendarBooking = {\n id: uid(), tenantId: 'mock', kind: input.kind ?? 'appointment',\n startsAt: input.startsAt, endsAt: addMinutes(input.startsAt, totalDuration || 30),\n status: 'scheduled', notes: input.notes ?? null,\n orderId: input.services.length > 0 ? uid() : null, locationId: input.locationId ?? null, metadata: {},\n clientId: input.clientId, clientName: input.title?.trim() || 'New Client', clientPhone: null, clientEmail: null, clientAvatarUrl: null,\n professionalId: input.professionalId,\n professionalName: professionals.find((p) => p.id === input.professionalId)?.name ?? 'Unknown',\n professionalAvatarUrl: null,\n locationName: null, orderTotal: totalPrice, orderStatus: 'draft',\n services: input.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? input.professionalId,\n })),\n totalDurationMinutes: totalDuration, createdAt: now(), updatedAt: now(),\n }\n bookings.push(booking)\n return booking\n },\n\n async updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n const existing = bookings[idx]\n const serviceUpdates: Partial<CalendarBooking> = {}\n if (data.services) {\n serviceUpdates.services = data.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? existing.professionalId ?? '',\n }))\n serviceUpdates.totalDurationMinutes = data.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n serviceUpdates.orderTotal = data.services.reduce((sum, s) => sum + s.price, 0)\n }\n const updated: CalendarBooking = {\n ...existing,\n ...(data.startsAt && { startsAt: data.startsAt }),\n ...(data.endsAt && { endsAt: data.endsAt }),\n ...(data.title !== undefined && { clientName: data.title }),\n ...(data.status && { status: data.status }),\n ...(data.notes !== undefined && { notes: data.notes ?? null }),\n ...(data.professionalId && { professionalId: data.professionalId }),\n ...(data.clientId && { clientId: data.clientId }),\n ...(data.locationId && { locationId: data.locationId }),\n ...serviceUpdates,\n updatedAt: now(),\n }\n bookings[idx] = updated\n return updated\n },\n\n async deleteBooking(id: string): Promise<void> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx !== -1) bookings.splice(idx, 1)\n },\n\n async updateBookingStatus(id: string, status: string): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: status as BookingStatus, updatedAt: now() }\n return bookings[idx]\n },\n\n async checkConflict(params: ConflictCheckParams): Promise<boolean> {\n return bookings.some((b) => {\n if (params.excludeBookingId && b.id === params.excludeBookingId) return false\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, params.startsAt, params.endsAt)\n })\n },\n\n async getAvailableSlots(params: AvailableSlotsParams): Promise<TimeSlot[]> {\n // Parse 'YYYY-MM-DD' as LOCAL midnight (not UTC) so the weekday and the\n // generated slot instants land on the requested calendar day in any tz.\n const [yy, mm, dd] = params.date.split('-').map(Number)\n const date = new Date(yy, (mm ?? 1) - 1, dd ?? 1)\n const dayOfWeek = date.getDay()\n const interval = params.slotInterval ?? 30\n\n // Get working hours for this professional on this day\n const daySchedules = schedules.filter((s) =>\n s.assigneeId === params.assigneeId && s.isActive &&\n (s.dayOfWeek === dayOfWeek || s.specificDate === params.date)\n )\n\n const slots: TimeSlot[] = []\n for (const sched of daySchedules) {\n const [startH, startM] = sched.startsAt.split(':').map(Number)\n const [endH, endM] = sched.endsAt.split(':').map(Number)\n const schedStart = new Date(date); schedStart.setHours(startH, startM, 0, 0)\n const schedEnd = new Date(date); schedEnd.setHours(endH, endM, 0, 0)\n\n let slotStart = new Date(schedStart)\n while (true) {\n const slotEnd = new Date(slotStart.getTime() + params.durationMinutes * 60000)\n if (slotEnd > schedEnd) break\n const startIso = slotStart.toISOString()\n const endIso = slotEnd.toISOString()\n const hasConflict = bookings.some((b) => {\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, startIso, endIso)\n })\n if (!hasConflict) {\n slots.push({ start: startIso, end: endIso })\n }\n slotStart = new Date(slotStart.getTime() + interval * 60000)\n }\n }\n return slots\n },\n\n async getSchedules(professionalId?: string): Promise<Schedule[]> {\n if (professionalId) return schedules.filter((s) => s.assigneeId === professionalId)\n return [...schedules]\n },\n\n async saveSchedule(input: SaveScheduleInput): Promise<Schedule> {\n const schedule: Schedule = {\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: input.assigneeId, locationId: input.locationId ?? null,\n dayOfWeek: input.dayOfWeek ?? null, specificDate: input.specificDate ?? null,\n startsAt: input.startsAt, endsAt: input.endsAt,\n isActive: input.isActive !== false, metadata: input.metadata ?? {},\n }\n schedules.push(schedule)\n return schedule\n },\n\n async deleteSchedule(id: string): Promise<void> {\n const idx = schedules.findIndex((s) => s.id === id)\n if (idx !== -1) schedules.splice(idx, 1)\n },\n\n async getProfessionals(): Promise<Professional[]> {\n return [...professionals]\n },\n\n async getConfirmationsPending(daysAhead = 2): Promise<CalendarBooking[]> {\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() + daysAhead)\n return bookings.filter((b) =>\n b.status === 'scheduled' && new Date(b.startsAt) <= cutoff && new Date(b.startsAt) >= new Date()\n )\n },\n\n async sendConfirmation(bookingId: string, channel: string): Promise<void> {\n const booking = bookings.find((b) => b.id === bookingId)\n if (!booking) throw new Error('Booking not found')\n const confirmations = (booking.metadata.confirmations as any[] ?? [])\n confirmations.push({ channel, sentAt: now(), status: 'sent' })\n booking.metadata = { ...booking.metadata, confirmations }\n },\n\n async completeBooking(bookingId: string): Promise<{ booking: CalendarBooking; orderId: string }> {\n const idx = bookings.findIndex((b) => b.id === bookingId)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: 'completed', updatedAt: now() }\n return { booking: bookings[idx], orderId: bookings[idx].orderId ?? '' }\n },\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/mock.ts"],"names":[],"mappings":"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","file":"chunk-LFUELUIT.cjs","sourcesContent":["import type { AgendaDataProvider } from './types'\nimport type {\n CalendarBooking, Professional, Schedule, TimeSlot,\n CreateBookingInput, UpdateBookingInput, SaveScheduleInput,\n BookingQuery, ConflictCheckParams, AvailableSlotsParams, BookingStatus,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nlet nextId = 1\nfunction uid(): string { return `mock-${nextId++}` }\nfunction now(): string { return new Date().toISOString() }\n\nfunction addMinutes(date: string, minutes: number): string {\n const d = new Date(date)\n d.setMinutes(d.getMinutes() + minutes)\n return d.toISOString()\n}\n\nfunction timeOverlaps(aStart: string, aEnd: string, bStart: string, bEnd: string): boolean {\n return aStart < bEnd && aEnd > bStart\n}\n\n// ---------------------------------------------------------------------------\n// Sample data\n// ---------------------------------------------------------------------------\n\nconst SAMPLE_PROFESSIONALS: Professional[] = [\n { id: 'prof-1', name: 'Ana Silva', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-2', name: 'Carlos Santos', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-3', name: 'Maria Oliveira', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n]\n\nfunction createSampleBookings(): CalendarBooking[] {\n const today = new Date()\n const year = today.getFullYear()\n const month = today.getMonth()\n const day = today.getDate()\n\n function dt(hour: number, minute = 0): string {\n return new Date(year, month, day, hour, minute).toISOString()\n }\n\n return [\n {\n id: 'bk-1', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(9, 0), endsAt: dt(10, 30), status: 'confirmed',\n notes: null, orderId: 'ord-1', locationId: 'loc-1', metadata: {},\n clientId: 'cl-1', clientName: 'Sarah Johnson', clientPhone: '(11) 99999-1111', clientEmail: 'sarah@email.com', clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 250, orderStatus: 'draft',\n services: [{ id: 'bi-1', serviceId: 'svc-1', name: 'Balayage', durationMinutes: 90, price: 250, assigneeId: 'prof-1' }],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-2', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(10, 0), endsAt: dt(11, 0), status: 'scheduled',\n notes: null, orderId: 'ord-2', locationId: 'loc-1', metadata: {},\n clientId: 'cl-2', clientName: 'Emily Carter', clientPhone: '(11) 99999-2222', clientEmail: 'emily@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 80, orderStatus: 'draft',\n services: [{ id: 'bi-2', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 60, price: 80, assigneeId: 'prof-2' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-3', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(14, 0), endsAt: dt(15, 0), status: 'confirmed',\n notes: 'First visit', orderId: 'ord-3', locationId: 'loc-1', metadata: {},\n clientId: 'cl-3', clientName: 'Rachel Kim', clientPhone: '(11) 99999-3333', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-3', professionalName: 'Maria Oliveira', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 120, orderStatus: 'draft',\n services: [{ id: 'bi-3', serviceId: 'svc-3', name: 'Facial Treatment', durationMinutes: 60, price: 120, assigneeId: 'prof-3' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-4', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(11, 0), endsAt: dt(12, 0), status: 'scheduled',\n notes: null, orderId: 'ord-4', locationId: 'loc-1', metadata: {},\n clientId: 'cl-4', clientName: 'Jessica Lima', clientPhone: '(11) 99999-4444', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 60, orderStatus: 'draft',\n services: [{ id: 'bi-4', serviceId: 'svc-4', name: 'Manicure', durationMinutes: 60, price: 60, assigneeId: 'prof-1' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-5', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(15, 30), endsAt: dt(17, 0), status: 'confirmed',\n notes: null, orderId: 'ord-5', locationId: 'loc-1', metadata: {},\n clientId: 'cl-5', clientName: 'Amanda Wright', clientPhone: '(11) 99999-5555', clientEmail: 'amanda@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 350, orderStatus: 'draft',\n services: [\n { id: 'bi-5', serviceId: 'svc-1', name: 'Highlights', durationMinutes: 60, price: 200, assigneeId: 'prof-2' },\n { id: 'bi-6', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 30, price: 150, assigneeId: 'prof-2' },\n ],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n ]\n}\n\nfunction createSampleSchedules(): Schedule[] {\n const schedules: Schedule[] = []\n for (const prof of SAMPLE_PROFESSIONALS) {\n // Mon-Fri 08:00-12:00, 13:00-18:00\n for (let day = 1; day <= 5; day++) {\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '08:00', endsAt: '12:00', isActive: true, metadata: {},\n })\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '13:00', endsAt: '18:00', isActive: true, metadata: {},\n })\n }\n // Saturday 08:00-14:00\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: 6, specificDate: null,\n startsAt: '08:00', endsAt: '14:00', isActive: true, metadata: {},\n })\n }\n return schedules\n}\n\n// ---------------------------------------------------------------------------\n// Mock provider factory\n// ---------------------------------------------------------------------------\n\n/**\n * Pre-populated agenda data. Any omitted collection falls back to the built-in\n * salon-style sample. Pass `bookings` (and optionally an empty `professionals`)\n * to render a calendar seeded with app-specific events.\n */\nexport interface MockAgendaSeed {\n bookings?: CalendarBooking[]\n professionals?: Professional[]\n schedules?: Schedule[]\n}\n\nexport interface MockAgendaProviderOptions {\n seed?: MockAgendaSeed\n}\n\nexport function createMockAgendaProvider(options?: MockAgendaProviderOptions): AgendaDataProvider {\n const seed = options?.seed\n const bookings: CalendarBooking[] = seed?.bookings ? [...seed.bookings] : createSampleBookings()\n const schedules: Schedule[] = seed?.schedules ? [...seed.schedules] : createSampleSchedules()\n const professionals: Professional[] = seed?.professionals ? [...seed.professionals] : [...SAMPLE_PROFESSIONALS]\n\n return {\n async getLocations(): Promise<Array<{ id: string; name: string }>> {\n return []\n },\n async getBookings(query: BookingQuery): Promise<CalendarBooking[]> {\n return bookings.filter((b) => {\n if (query.kind && b.kind !== query.kind) return false\n if (query.statuses?.length && !query.statuses.includes(b.status)) return false\n if (query.professionalIds?.length && !query.professionalIds.includes(b.professionalId ?? '')) return false\n if (query.locationId && b.locationId !== query.locationId) return false\n if (query.dateRange) {\n if (b.startsAt > query.dateRange.end || (b.endsAt ?? b.startsAt) < query.dateRange.start) return false\n }\n return true\n })\n },\n\n async getBookingById(id: string): Promise<CalendarBooking | null> {\n return bookings.find((b) => b.id === id) ?? null\n },\n\n async createBooking(input: CreateBookingInput): Promise<CalendarBooking> {\n const totalDuration = input.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const totalPrice = input.services.reduce((sum, s) => sum + s.price, 0)\n const booking: CalendarBooking = {\n id: uid(), tenantId: 'mock', kind: input.kind ?? 'appointment',\n startsAt: input.startsAt, endsAt: addMinutes(input.startsAt, totalDuration || 30),\n status: 'scheduled', notes: input.notes ?? null,\n orderId: input.services.length > 0 ? uid() : null, locationId: input.locationId ?? null, metadata: {},\n clientId: input.clientId, clientName: input.title?.trim() || 'New Client', clientPhone: null, clientEmail: null, clientAvatarUrl: null,\n professionalId: input.professionalId,\n professionalName: professionals.find((p) => p.id === input.professionalId)?.name ?? 'Unknown',\n professionalAvatarUrl: null,\n locationName: null, orderTotal: totalPrice, orderStatus: 'draft',\n services: input.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? input.professionalId,\n })),\n totalDurationMinutes: totalDuration, createdAt: now(), updatedAt: now(),\n }\n bookings.push(booking)\n return booking\n },\n\n async updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n const existing = bookings[idx]\n const serviceUpdates: Partial<CalendarBooking> = {}\n if (data.services) {\n serviceUpdates.services = data.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? existing.professionalId ?? '',\n }))\n serviceUpdates.totalDurationMinutes = data.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n serviceUpdates.orderTotal = data.services.reduce((sum, s) => sum + s.price, 0)\n }\n const updated: CalendarBooking = {\n ...existing,\n ...(data.startsAt && { startsAt: data.startsAt }),\n ...(data.endsAt && { endsAt: data.endsAt }),\n ...(data.title !== undefined && { clientName: data.title }),\n ...(data.status && { status: data.status }),\n ...(data.notes !== undefined && { notes: data.notes ?? null }),\n ...(data.professionalId && { professionalId: data.professionalId }),\n ...(data.clientId && { clientId: data.clientId }),\n ...(data.locationId && { locationId: data.locationId }),\n ...serviceUpdates,\n updatedAt: now(),\n }\n bookings[idx] = updated\n return updated\n },\n\n async deleteBooking(id: string): Promise<void> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx !== -1) bookings.splice(idx, 1)\n },\n\n async updateBookingStatus(id: string, status: string): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: status as BookingStatus, updatedAt: now() }\n return bookings[idx]\n },\n\n async checkConflict(params: ConflictCheckParams): Promise<boolean> {\n return bookings.some((b) => {\n if (params.excludeBookingId && b.id === params.excludeBookingId) return false\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, params.startsAt, params.endsAt)\n })\n },\n\n async getAvailableSlots(params: AvailableSlotsParams): Promise<TimeSlot[]> {\n // Parse 'YYYY-MM-DD' as LOCAL midnight (not UTC) so the weekday and the\n // generated slot instants land on the requested calendar day in any tz.\n const [yy, mm, dd] = params.date.split('-').map(Number)\n const date = new Date(yy, (mm ?? 1) - 1, dd ?? 1)\n const dayOfWeek = date.getDay()\n const interval = params.slotInterval ?? 30\n\n // Get working hours for this professional on this day\n const daySchedules = schedules.filter((s) =>\n s.assigneeId === params.assigneeId && s.isActive &&\n (s.dayOfWeek === dayOfWeek || s.specificDate === params.date)\n )\n\n const slots: TimeSlot[] = []\n for (const sched of daySchedules) {\n const [startH, startM] = sched.startsAt.split(':').map(Number)\n const [endH, endM] = sched.endsAt.split(':').map(Number)\n const schedStart = new Date(date); schedStart.setHours(startH, startM, 0, 0)\n const schedEnd = new Date(date); schedEnd.setHours(endH, endM, 0, 0)\n\n let slotStart = new Date(schedStart)\n while (true) {\n const slotEnd = new Date(slotStart.getTime() + params.durationMinutes * 60000)\n if (slotEnd > schedEnd) break\n const startIso = slotStart.toISOString()\n const endIso = slotEnd.toISOString()\n const hasConflict = bookings.some((b) => {\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, startIso, endIso)\n })\n if (!hasConflict) {\n slots.push({ start: startIso, end: endIso })\n }\n slotStart = new Date(slotStart.getTime() + interval * 60000)\n }\n }\n return slots\n },\n\n async getSchedules(professionalId?: string): Promise<Schedule[]> {\n if (professionalId) return schedules.filter((s) => s.assigneeId === professionalId)\n return [...schedules]\n },\n\n async saveSchedule(input: SaveScheduleInput): Promise<Schedule> {\n const schedule: Schedule = {\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: input.assigneeId, locationId: input.locationId ?? null,\n dayOfWeek: input.dayOfWeek ?? null, specificDate: input.specificDate ?? null,\n startsAt: input.startsAt, endsAt: input.endsAt,\n isActive: input.isActive !== false, metadata: input.metadata ?? {},\n }\n schedules.push(schedule)\n return schedule\n },\n\n async deleteSchedule(id: string): Promise<void> {\n const idx = schedules.findIndex((s) => s.id === id)\n if (idx !== -1) schedules.splice(idx, 1)\n },\n\n async getProfessionals(): Promise<Professional[]> {\n return [...professionals]\n },\n\n async getConfirmationsPending(daysAhead = 2): Promise<CalendarBooking[]> {\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() + daysAhead)\n return bookings.filter((b) =>\n b.status === 'scheduled' && new Date(b.startsAt) <= cutoff && new Date(b.startsAt) >= new Date()\n )\n },\n\n async sendConfirmation(bookingId: string, channel: string): Promise<void> {\n const booking = bookings.find((b) => b.id === bookingId)\n if (!booking) throw new Error('Booking not found')\n const confirmations = (booking.metadata.confirmations as any[] ?? [])\n confirmations.push({ channel, sentAt: now(), status: 'sent' })\n booking.metadata = { ...booking.metadata, confirmations }\n },\n\n async completeBooking(bookingId: string): Promise<{ booking: CalendarBooking; orderId: string }> {\n const idx = bookings.findIndex((b) => b.id === bookingId)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: 'completed', updatedAt: now() }\n return { booking: bookings[idx], orderId: bookings[idx].orderId ?? '' }\n },\n }\n}\n"]}
|
package/dist/chunk-SYDBDI3Q.cjs
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// src/lib/tenant.ts
|
|
4
|
-
var t;
|
|
5
|
-
function setAgendaTenantId(id) {
|
|
6
|
-
t = id;
|
|
7
|
-
}
|
|
8
|
-
function getAgendaTenantId() {
|
|
9
|
-
return t;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
exports.getAgendaTenantId = getAgendaTenantId;
|
|
13
|
-
exports.setAgendaTenantId = setAgendaTenantId;
|
|
14
|
-
//# sourceMappingURL=chunk-SYDBDI3Q.cjs.map
|
|
15
|
-
//# sourceMappingURL=chunk-SYDBDI3Q.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/tenant.ts"],"names":[],"mappings":";;;AAAA,IAAI,CAAA;AACG,SAAS,kBAAkB,EAAA,EAAuB;AAAE,EAAA,CAAA,GAAI,EAAA;AAAG;AAC3D,SAAS,iBAAA,GAAwC;AAAE,EAAA,OAAO,CAAA;AAAE","file":"chunk-SYDBDI3Q.cjs","sourcesContent":["let t: string | undefined\nexport function setAgendaTenantId(id: string | undefined){ t = id }\nexport function getAgendaTenantId(): string | undefined { return t }\n"]}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
export interface ComboboxOption {
|
|
3
|
-
id: string;
|
|
4
|
-
label: string;
|
|
5
|
-
subtitle?: string;
|
|
6
|
-
price?: number;
|
|
7
|
-
data?: Record<string, unknown>;
|
|
8
|
-
}
|
|
9
|
-
interface SearchComboboxProps {
|
|
10
|
-
value: string;
|
|
11
|
-
onChange: (value: string) => void;
|
|
12
|
-
onSelect: (option: ComboboxOption) => void;
|
|
13
|
-
options: ComboboxOption[];
|
|
14
|
-
placeholder?: string;
|
|
15
|
-
autoFocus?: boolean;
|
|
16
|
-
onBlurEmpty?: () => void;
|
|
17
|
-
renderRight?: (option: ComboboxOption) => React.ReactNode;
|
|
18
|
-
/** Show a "+ Create ..." option when search has no exact match */
|
|
19
|
-
allowCreate?: boolean;
|
|
20
|
-
/** Called when user clicks the create option. Receives the current search text. */
|
|
21
|
-
onCreateNew?: (searchText: string) => void;
|
|
22
|
-
/** Label for the create option (default: 'Create') */
|
|
23
|
-
createLabel?: string;
|
|
24
|
-
className?: string;
|
|
25
|
-
/** Minimal style — no border/bg, just underline on focus. For inline use. */
|
|
26
|
-
minimal?: boolean;
|
|
27
|
-
/** Inline label shown when collapsed. Click reveals the search input. */
|
|
28
|
-
inlineLabel?: string;
|
|
29
|
-
/** Icon for the inline label: 'search' (default) or 'plus' (for "add" actions) */
|
|
30
|
-
inlineIcon?: 'search' | 'plus';
|
|
31
|
-
/** Show a loading skeleton in the dropdown while results are being fetched */
|
|
32
|
-
loading?: boolean;
|
|
33
|
-
/** Called when the input gains focus */
|
|
34
|
-
onFocus?: () => void;
|
|
35
|
-
}
|
|
36
|
-
export declare function SearchCombobox({ value, onChange, onSelect, options, placeholder, autoFocus, onBlurEmpty, renderRight, allowCreate, onCreateNew, createLabel, className, minimal, inlineLabel, inlineIcon, loading, onFocus: onFocusProp, }: SearchComboboxProps): React.JSX.Element;
|
|
37
|
-
export {};
|
|
38
|
-
//# sourceMappingURL=SearchCombobox.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchCombobox.d.ts","sourceRoot":"","sources":["../../src/components/SearchCombobox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAQvE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;IAC1C,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,KAAK,CAAC,SAAS,CAAA;IACzD,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mFAAmF;IACnF,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kFAAkF;IAClF,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IAC9B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EACvE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAsB,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,UAAqB,EACrH,OAAO,EAAE,OAAO,EAAE,WAAW,GAC9B,EAAE,mBAAmB,qBAuKrB"}
|
package/dist/tenant-222EHYUC.cjs
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkSYDBDI3Q_cjs = require('./chunk-SYDBDI3Q.cjs');
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "getAgendaTenantId", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
get: function () { return chunkSYDBDI3Q_cjs.getAgendaTenantId; }
|
|
10
|
-
});
|
|
11
|
-
Object.defineProperty(exports, "setAgendaTenantId", {
|
|
12
|
-
enumerable: true,
|
|
13
|
-
get: function () { return chunkSYDBDI3Q_cjs.setAgendaTenantId; }
|
|
14
|
-
});
|
|
15
|
-
//# sourceMappingURL=tenant-222EHYUC.cjs.map
|
|
16
|
-
//# sourceMappingURL=tenant-222EHYUC.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"tenant-222EHYUC.cjs"}
|
package/dist/tenant-LAUWVUYB.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"tenant-LAUWVUYB.js"}
|