@everfur/sdk 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/CHANGELOG.md +69 -4
  2. package/README.md +6 -1
  3. package/dist/{Chat-DwAC2vhB.d.ts → Chat-BZZ-Py5l.d.ts} +3 -3
  4. package/dist/{Chat-DPUD6dnc.d.cts → Chat-Dq4fffIO.d.cts} +3 -3
  5. package/dist/{DepthViews-DNEM96Se.d.ts → DepthViews-BG3E25MD.d.ts} +1 -1
  6. package/dist/{DepthViews-DP0R-DhB.d.cts → DepthViews-B_hIypI6.d.cts} +1 -1
  7. package/dist/{DepthViews-DbFhR4Du.d.cts → DepthViews-CL75jyRA.d.cts} +1 -1
  8. package/dist/{DepthViews-D_3hl4xk.d.ts → DepthViews-CkYri51q.d.ts} +1 -1
  9. package/dist/animations/index.cjs +1 -1
  10. package/dist/animations/index.d.cts +3 -3
  11. package/dist/animations/index.d.ts +3 -3
  12. package/dist/animations/index.js +1 -1
  13. package/dist/{attachments-CQgFrEQ7.d.cts → attachments-BorG422I.d.cts} +2 -2
  14. package/dist/{attachments-5NeobOCd.d.ts → attachments-BrUWQYNK.d.ts} +5 -4
  15. package/dist/{attachments-D8T5re7e.d.cts → attachments-D_SECjr1.d.cts} +5 -4
  16. package/dist/{attachments-Bw3iMQgu.d.ts → attachments-DpldrvIW.d.ts} +2 -2
  17. package/dist/bookingCopy-CqtDYvCR.d.ts +732 -0
  18. package/dist/bookingCopy-SREvkG19.d.cts +732 -0
  19. package/dist/{entitlementRepository-DSbzuyAW.d.ts → branding-CsRdeNwK.d.cts} +1 -133
  20. package/dist/{entitlementRepository-DKdXFgTo.d.cts → branding-CsRdeNwK.d.ts} +1 -133
  21. package/dist/callCopy-DoQKG3-L.d.cts +40 -0
  22. package/dist/callCopy-DoQKG3-L.d.ts +40 -0
  23. package/dist/casesRepository-DwtZVsbj.d.cts +51 -0
  24. package/dist/casesRepository-v6QczS9N.d.ts +51 -0
  25. package/dist/chat/index.cjs +1 -1
  26. package/dist/chat/index.d.cts +9 -8
  27. package/dist/chat/index.d.ts +9 -8
  28. package/dist/chat/index.js +1 -1
  29. package/dist/client/index.cjs +5 -5
  30. package/dist/client/index.d.cts +10 -8
  31. package/dist/client/index.d.ts +10 -8
  32. package/dist/client/index.js +5 -5
  33. package/dist/{config-CzTZGlfF.d.cts → config--Wu1Umhd.d.cts} +2 -2
  34. package/dist/{config-DW60uRb9.d.ts → config-C7eb_IMD.d.ts} +2 -2
  35. package/dist/consent/index.cjs +1 -1
  36. package/dist/consent/index.d.cts +5 -5
  37. package/dist/consent/index.d.ts +5 -5
  38. package/dist/consent/index.js +1 -1
  39. package/dist/{context-XvTzq1tE.d.cts → context-CL3lyuy1.d.cts} +6 -6
  40. package/dist/{context-DXhqHlPU.d.ts → context-CahAEha8.d.ts} +6 -6
  41. package/dist/{copy-Mjoo91aS.d.ts → copy-DdVFDL01.d.ts} +2 -2
  42. package/dist/{copy-bKDNigLb.d.cts → copy-UeUJVk8X.d.cts} +2 -2
  43. package/dist/core/index.cjs +7 -7
  44. package/dist/core/index.d.cts +118 -29
  45. package/dist/core/index.d.ts +118 -29
  46. package/dist/core/index.js +7 -7
  47. package/dist/{depth-CErXCU8J.d.cts → depth-D5HwcvKC.d.cts} +34 -3
  48. package/dist/{depth-DjDcJ6kH.d.ts → depth-DvPwPuT_.d.ts} +34 -3
  49. package/dist/entitlementRepository-B7egEdW6.d.ts +43 -0
  50. package/dist/entitlementRepository-BpJ7tiwl.d.cts +43 -0
  51. package/dist/{identity-DI4eVx9S.d.cts → identity-C2-08BZW.d.cts} +2 -2
  52. package/dist/{identity-BMx2SUOM.d.ts → identity-CEi9GRFZ.d.ts} +2 -2
  53. package/dist/index.cjs +6 -6
  54. package/dist/index.d.cts +17 -16
  55. package/dist/index.d.ts +17 -16
  56. package/dist/index.js +6 -6
  57. package/dist/notifications/index.cjs +2 -2
  58. package/dist/notifications/index.d.cts +2 -2
  59. package/dist/notifications/index.d.ts +2 -2
  60. package/dist/notifications/index.js +2 -2
  61. package/dist/optionalModule-DbJmsq5f.d.cts +21 -0
  62. package/dist/optionalModule-DbJmsq5f.d.ts +21 -0
  63. package/dist/{pets-CtQdRpWo.d.ts → pets-DJv2sj2H.d.ts} +1 -1
  64. package/dist/{pets-aB8q0JyX.d.cts → pets-JVCXgRgR.d.cts} +1 -1
  65. package/dist/{casesRepository-DHwtGRYY.d.cts → petsRepository-B_gKbAzJ.d.cts} +2 -48
  66. package/dist/{casesRepository-ClLv6qMl.d.ts → petsRepository-Bk6GDwLs.d.ts} +2 -48
  67. package/dist/photo/index.cjs +1 -1
  68. package/dist/photo/index.js +1 -1
  69. package/dist/{ports-DEBzEhbp.d.cts → ports-BY2ph0_y.d.cts} +5 -15
  70. package/dist/{ports-DMolTRzU.d.ts → ports-D7YW8qz9.d.ts} +5 -15
  71. package/dist/records/depth/index.cjs +2 -2
  72. package/dist/records/depth/index.d.cts +7 -7
  73. package/dist/records/depth/index.d.ts +7 -7
  74. package/dist/records/depth/index.js +2 -2
  75. package/dist/records/index.cjs +3 -3
  76. package/dist/records/index.d.cts +9 -9
  77. package/dist/records/index.d.ts +9 -9
  78. package/dist/records/index.js +3 -3
  79. package/dist/{requestFunnel-L-BQfi0z.d.cts → requestFunnel-BjDpqqvm.d.cts} +25 -2
  80. package/dist/{requestFunnel-CjW7uDuA.d.ts → requestFunnel-DFMGcluw.d.ts} +25 -2
  81. package/dist/{runtime-B8s-_hv8.d.cts → runtimeTypes-gZEJu-da.d.cts} +9 -99
  82. package/dist/{runtime-BR9ysG0J.d.ts → runtimeTypes-w5KqBMcs.d.ts} +9 -99
  83. package/dist/server/events/index.cjs +1 -1
  84. package/dist/server/events/index.d.cts +2 -2
  85. package/dist/server/events/index.d.ts +2 -2
  86. package/dist/server/events/index.js +1 -1
  87. package/dist/server/index.cjs +1 -1
  88. package/dist/server/index.d.cts +3 -3
  89. package/dist/server/index.d.ts +3 -3
  90. package/dist/server/index.js +1 -1
  91. package/dist/televet/booking/index.cjs +1 -0
  92. package/dist/televet/booking/index.d.cts +294 -0
  93. package/dist/televet/booking/index.d.ts +294 -0
  94. package/dist/televet/booking/index.js +1 -0
  95. package/dist/televet/call/index.cjs +1 -0
  96. package/dist/televet/call/index.d.cts +141 -0
  97. package/dist/televet/call/index.d.ts +141 -0
  98. package/dist/televet/call/index.js +1 -0
  99. package/dist/televet/index.cjs +1 -1
  100. package/dist/televet/index.d.cts +87 -5
  101. package/dist/televet/index.d.ts +87 -5
  102. package/dist/televet/index.js +1 -1
  103. package/dist/testing/index.cjs +3 -3
  104. package/dist/testing/index.d.cts +2 -2
  105. package/dist/testing/index.d.ts +2 -2
  106. package/dist/testing/index.js +3 -3
  107. package/dist/testing/rn/index.cjs +1 -1
  108. package/dist/testing/rn/index.d.cts +9 -8
  109. package/dist/testing/rn/index.d.ts +9 -8
  110. package/dist/testing/rn/index.js +1 -1
  111. package/dist/testing/web/index.cjs +1 -1
  112. package/dist/testing/web/index.d.cts +9 -8
  113. package/dist/testing/web/index.d.ts +9 -8
  114. package/dist/testing/web/index.js +1 -1
  115. package/dist/{timelineRows-DZed6dAM.d.ts → timelineRows-C15jxFFH.d.ts} +1 -1
  116. package/dist/{timelineRows-CaohZzXS.d.cts → timelineRows-odO8g9r2.d.cts} +1 -1
  117. package/dist/typeStyle-CKqVYD6L.d.cts +111 -0
  118. package/dist/typeStyle-DmoyacDG.d.ts +111 -0
  119. package/dist/{useRecordsDepth-BHBzJ76R.d.cts → useRecordsDepth-C6rjEaLn.d.cts} +1 -1
  120. package/dist/{useRecordsDepth-BU-OhzH6.d.ts → useRecordsDepth-crhBllQK.d.ts} +1 -1
  121. package/dist/video/index.cjs +1 -1
  122. package/dist/video/index.js +1 -1
  123. package/dist/{view-DtSPYpKa.d.ts → view-Bxwxp4xD.d.ts} +2 -2
  124. package/dist/{view-C3qPIXGX.d.cts → view-DyitEO0m.d.cts} +2 -2
  125. package/dist/web/consent/index.cjs +1 -1
  126. package/dist/web/consent/index.d.cts +5 -5
  127. package/dist/web/consent/index.d.ts +5 -5
  128. package/dist/web/consent/index.js +1 -1
  129. package/dist/web/index.cjs +7 -7
  130. package/dist/web/index.d.cts +18 -17
  131. package/dist/web/index.d.ts +18 -17
  132. package/dist/web/index.js +7 -7
  133. package/dist/web/notifications/index.cjs +2 -2
  134. package/dist/web/notifications/index.d.cts +3 -3
  135. package/dist/web/notifications/index.d.ts +3 -3
  136. package/dist/web/notifications/index.js +2 -2
  137. package/dist/web/records/depth/index.cjs +2 -2
  138. package/dist/web/records/depth/index.d.cts +7 -7
  139. package/dist/web/records/depth/index.d.ts +7 -7
  140. package/dist/web/records/depth/index.js +2 -2
  141. package/dist/web/records/index.cjs +3 -3
  142. package/dist/web/records/index.d.cts +102 -11
  143. package/dist/web/records/index.d.ts +102 -11
  144. package/dist/web/records/index.js +3 -3
  145. package/dist/web/televet/booking/index.cjs +1 -0
  146. package/dist/web/televet/booking/index.d.cts +349 -0
  147. package/dist/web/televet/booking/index.d.ts +349 -0
  148. package/dist/web/televet/booking/index.js +1 -0
  149. package/dist/web/televet/call/index.cjs +1 -0
  150. package/dist/web/televet/call/index.d.cts +142 -0
  151. package/dist/web/televet/call/index.d.ts +142 -0
  152. package/dist/web/televet/call/index.js +1 -0
  153. package/dist/web/televet/index.cjs +1 -1
  154. package/dist/web/televet/index.d.cts +90 -4
  155. package/dist/web/televet/index.d.ts +90 -4
  156. package/dist/web/televet/index.js +1 -1
  157. package/package.json +72 -4
  158. package/televet/booking/package.json +8 -0
  159. package/televet/call/package.json +8 -0
  160. package/web/televet/booking/native-blocked.cjs +12 -0
  161. package/web/televet/booking/package.json +8 -0
  162. package/web/televet/call/native-blocked.cjs +12 -0
  163. package/web/televet/call/package.json +8 -0
  164. package/dist/typeStyle-0TydiZ1w.d.cts +0 -19
  165. package/dist/typeStyle-CWMsoe6b.d.ts +0 -19
@@ -0,0 +1,294 @@
1
+ import { ReactNode, ComponentType, ReactElement } from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ import { P as PetRef } from '../../ids-B2GAAifq.cjs';
4
+ export { B as Brand, _ as __brand } from '../../ids-B2GAAifq.cjs';
5
+ import { T as TelevetConsult, a as TelevetBookingStep, b as TelevetBookingController, c as TelevetSlot } from '../../bookingCopy-SREvkG19.cjs';
6
+ export { C as CANCELLATION_POLICY_VERSION_MAX, d as CONSULT_KINDS, e as CONSULT_MINUTES, f as CONSULT_STATUSES, g as ConsultKind, h as ConsultStatus, M as MEDIA_REFS_MAX, R as REASON_TEXT_MAX, i as TELEVET_BOOKING_BASE, j as TELEVET_BOOKING_COPY, k as TELEVET_BOOKING_STEPS, l as TERMINAL_CONSULT_STATUSES, m as TelevetBookingAction, n as TelevetBookingBody, o as TelevetBookingContext, p as TelevetBookingControllerDeps, q as TelevetBookingCopy, r as TelevetBookingDraft, s as TelevetBookingEntitlement, t as TelevetBookingRefusal, u as TelevetBookingState, v as TelevetCancellationPolicy, w as TelevetClinician, x as TelevetRead, y as TelevetSlotHold, z as TelevetStatePolicy, A as TelevetWrite, B as attestation, D as canConfirm, E as createTelevetBookingController, F as currentStep, G as emptyTelevetDraft, H as formatVisitRange, I as formatWhen, J as formatWhenWithDay, K as hasPreviousStep, L as initialTelevetBookingState, N as isHoldExpired, O as isSkipped, P as isTelevetBookingCopyReady, Q as isWellFormedStateCode, S as televetBookingKey, U as televetBookingReducer, V as televetBookingRefusal, W as televetHoldCall, X as televetRescheduleCall, Y as useTelevetBookConsult, Z as useTelevetBookingAvailable, _ as useTelevetBookingController, $ as useTelevetBookingEntitlement, a0 as useTelevetCancellationPolicy, a1 as useTelevetClinicians, a2 as useTelevetHoldSlot, a3 as useTelevetNextSlot, a4 as useTelevetRescheduleConsult, a5 as useTelevetSlots, a6 as useTelevetStatePolicy, a7 as validateBookingBody } from '../../bookingCopy-SREvkG19.cjs';
7
+ export { E as EverfurError, a as EverfurErrorCategory, b as EverfurErrorCode, c as EverfurResult } from '../../EverfurResult-DN9pL2Ab.cjs';
8
+ export { W as WidgetPet } from '../../petsRepository-B_gKbAzJ.cjs';
9
+ import '../../requestFunnel-BjDpqqvm.cjs';
10
+ import '../../ErrorPolicyPort-CNf4uQZP.cjs';
11
+ import '../../config--Wu1Umhd.cjs';
12
+ import '../../identity-C2-08BZW.cjs';
13
+ import '../../TelemetryPort-BDNr00hu.cjs';
14
+ import '../../profile-CSs1wlXT.cjs';
15
+
16
+ /** The calendar entry a booked visit asks the host to write. */
17
+ interface TelevetCalendarEvent {
18
+ /**
19
+ * A stable key for THIS consult's entry.
20
+ *
21
+ * Keyed on the CONSULT so a re-tap updates the same entry rather than writing a second event for one visit,
22
+ * and so a later cancel or reschedule can address the SAME row. A host that ignores the key writes duplicates
23
+ * the owner has to clean up by hand.
24
+ */
25
+ readonly key: string;
26
+ readonly title: string;
27
+ readonly startDate: Date;
28
+ readonly endDate: Date;
29
+ /** The reminder offset in minutes, negative for "before". The platform queues its own at the same offset. */
30
+ readonly alarmOffsetMinutes: number;
31
+ }
32
+ /** Writes the entry. Resolves true when it landed; false for a refused permission or no calendar at all. */
33
+ type TelevetCalendarWriter = (event: TelevetCalendarEvent) => Promise<boolean>;
34
+ /** The calendar key for a consult. One definition, so a cancel and a reschedule address the booked row. */
35
+ declare function televetConsultCalendarKey(consultId: string): string;
36
+ interface TelevetBookedScreenProps {
37
+ readonly consult: TelevetConsult;
38
+ readonly petName: string | null;
39
+ readonly onDone: () => void;
40
+ /** Absent, there is no Add to calendar control. */
41
+ readonly onAddToCalendar?: TelevetCalendarWriter | undefined;
42
+ /**
43
+ * Has the host PROVEN it can host the call in app? Defaults to false.
44
+ *
45
+ * Fail closed: a host that has not said so is assumed not to have the native video modules, and the in-app
46
+ * join promise is withheld rather than printed on a hope.
47
+ */
48
+ readonly canJoinInApp?: boolean;
49
+ }
50
+ declare function TelevetBookedScreen({ consult, petName, onDone, onAddToCalendar, canJoinInApp, }: TelevetBookedScreenProps): ReactNode;
51
+
52
+ /**
53
+ * The host's own discard confirmation.
54
+ *
55
+ * Receives the ported title, body and the two button labels, and resolves true to leave. A partner with its
56
+ * own dialog system passes this; absent, the SDK uses React Native's `Alert`, which is what the consumer does.
57
+ */
58
+ type TelevetDiscardConfirm = (prompt: {
59
+ readonly title: string;
60
+ readonly body: string;
61
+ readonly confirmLabel: string;
62
+ readonly keepLabel: string;
63
+ }) => Promise<boolean>;
64
+ interface TelevetBookingChromeProps {
65
+ readonly step: TelevetBookingStep;
66
+ readonly furthestIndex: number;
67
+ /** The title on the bar. The reschedule flow passes its own, so the bar never says "Book a visit" there. */
68
+ readonly title?: string;
69
+ /** False on the first visible step, where Back would leave the flow entirely. */
70
+ readonly canGoBack: boolean;
71
+ /**
72
+ * Has the owner entered anything worth losing?
73
+ *
74
+ * Gates the discard confirm. A confirm on an untouched flow is a pointless obstacle; NO confirm on a flow
75
+ * holding typed clinical text is the actual defect, because that text is volatile component state with no
76
+ * draft to restore it from.
77
+ */
78
+ readonly isDirty: boolean;
79
+ readonly onBack: () => void;
80
+ readonly onClose: () => void;
81
+ readonly onConfirmDiscard?: TelevetDiscardConfirm | undefined;
82
+ }
83
+ declare function TelevetBookingChrome({ step, furthestIndex, title, canGoBack, isDirty, onBack, onClose, onConfirmDiscard, }: TelevetBookingChromeProps): ReactNode;
84
+ /**
85
+ * The back control's spoken label.
86
+ *
87
+ * "Back" is the platform word for the control and is not product copy, which is why it is a constant here and
88
+ * not a key in the ported deck: the consumer gets it from its shared back button, which owns the same string.
89
+ */
90
+ declare const BACK_LABEL = "Back";
91
+
92
+ /** A picked-but-not-yet-uploaded attachment, in the host's own terms. */
93
+ interface TelevetIntakeMediaItem {
94
+ readonly uri: string;
95
+ readonly filename: string;
96
+ readonly mimeType: string;
97
+ readonly fileSize: number;
98
+ }
99
+ /**
100
+ * The host's media picker.
101
+ *
102
+ * Resolves the picks, or null when the owner cancelled or the permission was refused. The SDK takes no picker
103
+ * dependency: on the consumer app this is expo-image-picker behind `pickMediaFromLibrary`, and a partner
104
+ * supplies whichever picker its app already has.
105
+ *
106
+ * `limit` is the remaining headroom, so the host can cap its own selection rather than returning picks this
107
+ * row has to silently discard.
108
+ */
109
+ type TelevetMediaPicker = (limit: number) => Promise<readonly TelevetIntakeMediaItem[] | null>;
110
+ interface TelevetIntakeMediaProps {
111
+ readonly media: readonly TelevetIntakeMediaItem[];
112
+ readonly onChange: (next: readonly TelevetIntakeMediaItem[]) => void;
113
+ /** Absent, the row renders nothing at all. There is no disabled Add control. */
114
+ readonly onPickMedia?: TelevetMediaPicker | undefined;
115
+ }
116
+ declare function TelevetIntakeMedia({ media, onChange, onPickMedia }: TelevetIntakeMediaProps): ReactNode;
117
+
118
+ /**
119
+ * Why a booking did not complete.
120
+ *
121
+ * `not_entitled` is separated from `failed` because the two need opposite affordances: a transient failure
122
+ * invites a retry, and a 402 must not. `unavailable` is separated from both because no retry can succeed.
123
+ */
124
+ type TelevetBookingFailure = 'taken' | 'expired' | 'failed' | 'not_entitled'
125
+ /** The remedy is a DIFFERENT VET, not a different time: re-picking a slot with the same clinician refuses again. */
126
+ | 'clinician_unavailable'
127
+ /** Per-owner caps. The remedy is WAITING, so this must never render as an invitation to press again. */
128
+ | 'rate_limited'
129
+ /** The partner booking surface is not served here. The remedy is the hosted visit, not a retry. */
130
+ | 'unavailable' | null;
131
+ /** What the host can tell us about a location it could not resolve, so the right card renders. */
132
+ type TelevetLocationStatus = 'unknown' | 'blocked' | 'unavailable';
133
+ interface EverfurTelevetBookingProps {
134
+ /** The pet the visit is for. Seeds the draft; a one-pet roster skips the picker entirely. */
135
+ readonly petRef?: PetRef | null;
136
+ /** The owner's two-letter US state. The SDK never reads a device location for it. */
137
+ readonly usState?: string | null;
138
+ /** Host/test seam: inject a booking controller instead of building one from the provider's session. */
139
+ readonly controller?: TelevetBookingController;
140
+ readonly onBooked?: (consult: TelevetConsult) => void;
141
+ /** Leaves the flow. The flow never navigates itself, so the same screens work in a modal, a tab or a stack. */
142
+ readonly onExit?: () => void;
143
+ /** Leaves the flow to create a pet, then comes back. Absent, the empty roster has no action. */
144
+ readonly onAddPet?: () => void;
145
+ /** The host's media picker for the intake step. Absent, there is no attachment row. */
146
+ readonly onPickMedia?: TelevetMediaPicker;
147
+ /** The host's calendar writer for the confirmation. Absent, there is no Add to calendar control. */
148
+ readonly onAddToCalendar?: TelevetCalendarWriter;
149
+ /** The host's own discard dialog. Absent, the SDK uses React Native's `Alert`. */
150
+ readonly onConfirmDiscard?: TelevetDiscardConfirm;
151
+ /** Asks the host to resolve the owner's state again. Absent, the location cards render without an action. */
152
+ readonly onRequestLocation?: () => void;
153
+ /** Why the host has no state for us, so the right card renders. */
154
+ readonly locationStatus?: TelevetLocationStatus;
155
+ /**
156
+ * Has the host PROVEN it can host the call in app? Defaults to false.
157
+ *
158
+ * Fail closed: without the native video modules the confirmation must not promise an in-app join.
159
+ */
160
+ readonly canJoinInApp?: boolean;
161
+ /**
162
+ * What to render when the partner booking surface is not served for this tenant.
163
+ *
164
+ * THE FLOW WILL NOT DEAD-END. Absent this, an unserved surface renders the paused card, which is a state but
165
+ * not a way forward; the prebuilt flow passes the hosted-visit handoff here so the owner still reaches a vet.
166
+ */
167
+ readonly renderUnavailable?: () => ReactNode;
168
+ readonly style?: StyleProp<ViewStyle>;
169
+ readonly testID?: string;
170
+ }
171
+ declare function EverfurTelevetBooking(props: EverfurTelevetBookingProps): ReactNode;
172
+
173
+ /** The screens of the televet stack. */
174
+ type TelevetScreen = {
175
+ readonly name: 'booking';
176
+ } | {
177
+ readonly name: 'reschedule';
178
+ readonly consult: TelevetConsult;
179
+ };
180
+ interface EverfurTelevetProps {
181
+ /** The pet the visit is for. Seeds the draft; a one-pet roster skips the picker entirely. */
182
+ readonly petRef?: PetRef | null;
183
+ /** The owner's two-letter US state. The SDK never reads a device location for it. */
184
+ readonly usState?: string | null;
185
+ /** Host/test seam: inject a booking controller instead of building one from the provider's session. */
186
+ readonly controller?: TelevetBookingController;
187
+ readonly onBooked?: (consult: TelevetConsult) => void;
188
+ /** The root screen's exit; absent, the root's Close does nothing and the host navigator owns leaving. */
189
+ readonly onExit?: () => void;
190
+ readonly onAddPet?: () => void;
191
+ readonly onPickMedia?: TelevetMediaPicker;
192
+ readonly onAddToCalendar?: TelevetCalendarWriter;
193
+ readonly onConfirmDiscard?: TelevetDiscardConfirm;
194
+ readonly onRequestLocation?: () => void;
195
+ readonly locationStatus?: TelevetLocationStatus;
196
+ /**
197
+ * Has the host installed the native video modules and wired the call surface? Defaults to FALSE.
198
+ *
199
+ * Fail closed. A partner that has not said so gets a confirmation that promises only what it can keep.
200
+ */
201
+ readonly canJoinInApp?: boolean;
202
+ /**
203
+ * Replace the hosted-visit fallback shown when the in-app booking surface is not served.
204
+ *
205
+ * The default is the published `VetVisitButton`, which mints the single-use handoff and opens the hosted
206
+ * Everfur visit. Passing `null` here is not a way to remove it: a flow with no fallback dead-ends, so an
207
+ * explicit render prop is the only way to change it.
208
+ */
209
+ readonly renderUnavailable?: () => ReactNode;
210
+ /** The screen the flow starts on; the booking flow when omitted. */
211
+ readonly initialScreen?: TelevetScreen;
212
+ readonly style?: StyleProp<ViewStyle>;
213
+ /** Your own placeholder while the entitlement verdict is pending on a cold mount. */
214
+ readonly renderPending?: () => ReactNode;
215
+ }
216
+ declare function EverfurTelevetFlow(props: EverfurTelevetProps): ReactNode;
217
+ /** The public prebuilt televet surface: the flow, starting at booking. */
218
+ declare const EverfurTelevet: typeof EverfurTelevetFlow;
219
+
220
+ interface EverfurTelevetRescheduleProps {
221
+ /** The consult being moved. Null while the host is still loading it. */
222
+ readonly consult: TelevetConsult | null;
223
+ readonly onRescheduled?: (moved: TelevetConsult) => void;
224
+ /** Backing out. Never destructive: the original consult is left exactly as it was. */
225
+ readonly onCancel?: () => void;
226
+ /** Host/test seam: inject a booking controller instead of building one from the provider's session. */
227
+ readonly controller?: TelevetBookingController;
228
+ readonly style?: StyleProp<ViewStyle>;
229
+ readonly testID?: string;
230
+ }
231
+ declare function EverfurTelevetReschedule(props: EverfurTelevetRescheduleProps): ReactNode;
232
+
233
+ interface TelevetDay {
234
+ readonly key: string;
235
+ readonly iso: string;
236
+ readonly weekday: string;
237
+ readonly dayNumber: string;
238
+ }
239
+ interface TelevetDayStripProps {
240
+ readonly slots: readonly TelevetSlot[];
241
+ readonly selectedDayKey: string | null;
242
+ readonly onSelectDay: (day: TelevetDay) => void;
243
+ }
244
+ /** The day strip. Renders nothing when the window holds no readable day. */
245
+ declare function TelevetDayStrip({ slots, selectedDayKey, onSelectDay }: TelevetDayStripProps): ReactNode;
246
+ /**
247
+ * The distinct local days the slots cover, in server order.
248
+ *
249
+ * Exported for the picker, which needs the first day to seed the selection, and for the suite.
250
+ */
251
+ declare function televetDaysFromSlots(slots: readonly TelevetSlot[]): readonly TelevetDay[];
252
+
253
+ interface TelevetSlotPickerProps {
254
+ /** The server's full window. Never truncated: the day filter is what bounds it. */
255
+ readonly slots: readonly TelevetSlot[];
256
+ /** The slot whose hold is in flight, or null. Disables the whole grid. */
257
+ readonly busySlotId: string | null;
258
+ readonly onPick: (slot: TelevetSlot) => void;
259
+ /** Rendered above the strip, for example a failure line from the container. */
260
+ readonly ListHeaderComponent?: ComponentType | ReactElement | null;
261
+ readonly rowTestIdPrefix?: string;
262
+ readonly testID?: string;
263
+ }
264
+ declare function TelevetSlotPicker({ slots, busySlotId, onPick, ListHeaderComponent, rowTestIdPrefix, testID, }: TelevetSlotPickerProps): ReactNode;
265
+
266
+ /** One "label ... value" row in the summary card. */
267
+ declare function TelevetSummaryRow({ label, value, last, testID, }: {
268
+ readonly label: string;
269
+ readonly value: string;
270
+ /** The last row draws no divider, so the card does not end on a line. */
271
+ readonly last?: boolean;
272
+ readonly testID?: string;
273
+ }): ReactNode;
274
+ /**
275
+ * A consent tick.
276
+ *
277
+ * A REAL CHECKBOX, not a pill button. A filled pill reads as "press to continue" while a checkbox reads as
278
+ * "you are agreeing to this", and these ticks are the owner's licensure attestation and their cancellation
279
+ * agreement. `accessibilityRole="checkbox"` with a `checked` state is also what makes a screen reader announce
280
+ * it as an agreement rather than a button.
281
+ */
282
+ declare function TelevetConsentCheckbox({ label, checked, onToggle, testID, }: {
283
+ readonly label: string;
284
+ readonly checked: boolean;
285
+ readonly onToggle: (next: boolean) => void;
286
+ readonly testID?: string;
287
+ }): ReactNode;
288
+ /** The summary card's own frame, exported so the container does not re-declare it. */
289
+ declare function TelevetSummaryCard({ children, testID }: {
290
+ readonly children: ReactNode;
291
+ readonly testID?: string;
292
+ }): ReactNode;
293
+
294
+ export { BACK_LABEL, EverfurTelevet, EverfurTelevetBooking, type EverfurTelevetBookingProps, EverfurTelevetFlow, type EverfurTelevetProps, EverfurTelevetReschedule, type EverfurTelevetRescheduleProps, PetRef, TelevetBookedScreen, type TelevetBookedScreenProps, TelevetBookingChrome, type TelevetBookingChromeProps, TelevetBookingController, type TelevetBookingFailure, TelevetBookingStep, type TelevetCalendarEvent, type TelevetCalendarWriter, TelevetConsentCheckbox, TelevetConsult, type TelevetDay, TelevetDayStrip, type TelevetDayStripProps, type TelevetDiscardConfirm, TelevetIntakeMedia, type TelevetIntakeMediaItem, type TelevetIntakeMediaProps, type TelevetLocationStatus, type TelevetMediaPicker, type TelevetScreen, TelevetSlot, TelevetSlotPicker, type TelevetSlotPickerProps, TelevetSummaryCard, TelevetSummaryRow, televetConsultCalendarKey, televetDaysFromSlots };
@@ -0,0 +1,294 @@
1
+ import { ReactNode, ComponentType, ReactElement } from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ import { P as PetRef } from '../../ids-B2GAAifq.js';
4
+ export { B as Brand, _ as __brand } from '../../ids-B2GAAifq.js';
5
+ import { T as TelevetConsult, a as TelevetBookingStep, b as TelevetBookingController, c as TelevetSlot } from '../../bookingCopy-CqtDYvCR.js';
6
+ export { C as CANCELLATION_POLICY_VERSION_MAX, d as CONSULT_KINDS, e as CONSULT_MINUTES, f as CONSULT_STATUSES, g as ConsultKind, h as ConsultStatus, M as MEDIA_REFS_MAX, R as REASON_TEXT_MAX, i as TELEVET_BOOKING_BASE, j as TELEVET_BOOKING_COPY, k as TELEVET_BOOKING_STEPS, l as TERMINAL_CONSULT_STATUSES, m as TelevetBookingAction, n as TelevetBookingBody, o as TelevetBookingContext, p as TelevetBookingControllerDeps, q as TelevetBookingCopy, r as TelevetBookingDraft, s as TelevetBookingEntitlement, t as TelevetBookingRefusal, u as TelevetBookingState, v as TelevetCancellationPolicy, w as TelevetClinician, x as TelevetRead, y as TelevetSlotHold, z as TelevetStatePolicy, A as TelevetWrite, B as attestation, D as canConfirm, E as createTelevetBookingController, F as currentStep, G as emptyTelevetDraft, H as formatVisitRange, I as formatWhen, J as formatWhenWithDay, K as hasPreviousStep, L as initialTelevetBookingState, N as isHoldExpired, O as isSkipped, P as isTelevetBookingCopyReady, Q as isWellFormedStateCode, S as televetBookingKey, U as televetBookingReducer, V as televetBookingRefusal, W as televetHoldCall, X as televetRescheduleCall, Y as useTelevetBookConsult, Z as useTelevetBookingAvailable, _ as useTelevetBookingController, $ as useTelevetBookingEntitlement, a0 as useTelevetCancellationPolicy, a1 as useTelevetClinicians, a2 as useTelevetHoldSlot, a3 as useTelevetNextSlot, a4 as useTelevetRescheduleConsult, a5 as useTelevetSlots, a6 as useTelevetStatePolicy, a7 as validateBookingBody } from '../../bookingCopy-CqtDYvCR.js';
7
+ export { E as EverfurError, a as EverfurErrorCategory, b as EverfurErrorCode, c as EverfurResult } from '../../EverfurResult-DN9pL2Ab.js';
8
+ export { W as WidgetPet } from '../../petsRepository-Bk6GDwLs.js';
9
+ import '../../requestFunnel-DFMGcluw.js';
10
+ import '../../ErrorPolicyPort-CwbfmxzJ.js';
11
+ import '../../config-C7eb_IMD.js';
12
+ import '../../identity-CEi9GRFZ.js';
13
+ import '../../TelemetryPort-BDNr00hu.js';
14
+ import '../../profile-CSs1wlXT.js';
15
+
16
+ /** The calendar entry a booked visit asks the host to write. */
17
+ interface TelevetCalendarEvent {
18
+ /**
19
+ * A stable key for THIS consult's entry.
20
+ *
21
+ * Keyed on the CONSULT so a re-tap updates the same entry rather than writing a second event for one visit,
22
+ * and so a later cancel or reschedule can address the SAME row. A host that ignores the key writes duplicates
23
+ * the owner has to clean up by hand.
24
+ */
25
+ readonly key: string;
26
+ readonly title: string;
27
+ readonly startDate: Date;
28
+ readonly endDate: Date;
29
+ /** The reminder offset in minutes, negative for "before". The platform queues its own at the same offset. */
30
+ readonly alarmOffsetMinutes: number;
31
+ }
32
+ /** Writes the entry. Resolves true when it landed; false for a refused permission or no calendar at all. */
33
+ type TelevetCalendarWriter = (event: TelevetCalendarEvent) => Promise<boolean>;
34
+ /** The calendar key for a consult. One definition, so a cancel and a reschedule address the booked row. */
35
+ declare function televetConsultCalendarKey(consultId: string): string;
36
+ interface TelevetBookedScreenProps {
37
+ readonly consult: TelevetConsult;
38
+ readonly petName: string | null;
39
+ readonly onDone: () => void;
40
+ /** Absent, there is no Add to calendar control. */
41
+ readonly onAddToCalendar?: TelevetCalendarWriter | undefined;
42
+ /**
43
+ * Has the host PROVEN it can host the call in app? Defaults to false.
44
+ *
45
+ * Fail closed: a host that has not said so is assumed not to have the native video modules, and the in-app
46
+ * join promise is withheld rather than printed on a hope.
47
+ */
48
+ readonly canJoinInApp?: boolean;
49
+ }
50
+ declare function TelevetBookedScreen({ consult, petName, onDone, onAddToCalendar, canJoinInApp, }: TelevetBookedScreenProps): ReactNode;
51
+
52
+ /**
53
+ * The host's own discard confirmation.
54
+ *
55
+ * Receives the ported title, body and the two button labels, and resolves true to leave. A partner with its
56
+ * own dialog system passes this; absent, the SDK uses React Native's `Alert`, which is what the consumer does.
57
+ */
58
+ type TelevetDiscardConfirm = (prompt: {
59
+ readonly title: string;
60
+ readonly body: string;
61
+ readonly confirmLabel: string;
62
+ readonly keepLabel: string;
63
+ }) => Promise<boolean>;
64
+ interface TelevetBookingChromeProps {
65
+ readonly step: TelevetBookingStep;
66
+ readonly furthestIndex: number;
67
+ /** The title on the bar. The reschedule flow passes its own, so the bar never says "Book a visit" there. */
68
+ readonly title?: string;
69
+ /** False on the first visible step, where Back would leave the flow entirely. */
70
+ readonly canGoBack: boolean;
71
+ /**
72
+ * Has the owner entered anything worth losing?
73
+ *
74
+ * Gates the discard confirm. A confirm on an untouched flow is a pointless obstacle; NO confirm on a flow
75
+ * holding typed clinical text is the actual defect, because that text is volatile component state with no
76
+ * draft to restore it from.
77
+ */
78
+ readonly isDirty: boolean;
79
+ readonly onBack: () => void;
80
+ readonly onClose: () => void;
81
+ readonly onConfirmDiscard?: TelevetDiscardConfirm | undefined;
82
+ }
83
+ declare function TelevetBookingChrome({ step, furthestIndex, title, canGoBack, isDirty, onBack, onClose, onConfirmDiscard, }: TelevetBookingChromeProps): ReactNode;
84
+ /**
85
+ * The back control's spoken label.
86
+ *
87
+ * "Back" is the platform word for the control and is not product copy, which is why it is a constant here and
88
+ * not a key in the ported deck: the consumer gets it from its shared back button, which owns the same string.
89
+ */
90
+ declare const BACK_LABEL = "Back";
91
+
92
+ /** A picked-but-not-yet-uploaded attachment, in the host's own terms. */
93
+ interface TelevetIntakeMediaItem {
94
+ readonly uri: string;
95
+ readonly filename: string;
96
+ readonly mimeType: string;
97
+ readonly fileSize: number;
98
+ }
99
+ /**
100
+ * The host's media picker.
101
+ *
102
+ * Resolves the picks, or null when the owner cancelled or the permission was refused. The SDK takes no picker
103
+ * dependency: on the consumer app this is expo-image-picker behind `pickMediaFromLibrary`, and a partner
104
+ * supplies whichever picker its app already has.
105
+ *
106
+ * `limit` is the remaining headroom, so the host can cap its own selection rather than returning picks this
107
+ * row has to silently discard.
108
+ */
109
+ type TelevetMediaPicker = (limit: number) => Promise<readonly TelevetIntakeMediaItem[] | null>;
110
+ interface TelevetIntakeMediaProps {
111
+ readonly media: readonly TelevetIntakeMediaItem[];
112
+ readonly onChange: (next: readonly TelevetIntakeMediaItem[]) => void;
113
+ /** Absent, the row renders nothing at all. There is no disabled Add control. */
114
+ readonly onPickMedia?: TelevetMediaPicker | undefined;
115
+ }
116
+ declare function TelevetIntakeMedia({ media, onChange, onPickMedia }: TelevetIntakeMediaProps): ReactNode;
117
+
118
+ /**
119
+ * Why a booking did not complete.
120
+ *
121
+ * `not_entitled` is separated from `failed` because the two need opposite affordances: a transient failure
122
+ * invites a retry, and a 402 must not. `unavailable` is separated from both because no retry can succeed.
123
+ */
124
+ type TelevetBookingFailure = 'taken' | 'expired' | 'failed' | 'not_entitled'
125
+ /** The remedy is a DIFFERENT VET, not a different time: re-picking a slot with the same clinician refuses again. */
126
+ | 'clinician_unavailable'
127
+ /** Per-owner caps. The remedy is WAITING, so this must never render as an invitation to press again. */
128
+ | 'rate_limited'
129
+ /** The partner booking surface is not served here. The remedy is the hosted visit, not a retry. */
130
+ | 'unavailable' | null;
131
+ /** What the host can tell us about a location it could not resolve, so the right card renders. */
132
+ type TelevetLocationStatus = 'unknown' | 'blocked' | 'unavailable';
133
+ interface EverfurTelevetBookingProps {
134
+ /** The pet the visit is for. Seeds the draft; a one-pet roster skips the picker entirely. */
135
+ readonly petRef?: PetRef | null;
136
+ /** The owner's two-letter US state. The SDK never reads a device location for it. */
137
+ readonly usState?: string | null;
138
+ /** Host/test seam: inject a booking controller instead of building one from the provider's session. */
139
+ readonly controller?: TelevetBookingController;
140
+ readonly onBooked?: (consult: TelevetConsult) => void;
141
+ /** Leaves the flow. The flow never navigates itself, so the same screens work in a modal, a tab or a stack. */
142
+ readonly onExit?: () => void;
143
+ /** Leaves the flow to create a pet, then comes back. Absent, the empty roster has no action. */
144
+ readonly onAddPet?: () => void;
145
+ /** The host's media picker for the intake step. Absent, there is no attachment row. */
146
+ readonly onPickMedia?: TelevetMediaPicker;
147
+ /** The host's calendar writer for the confirmation. Absent, there is no Add to calendar control. */
148
+ readonly onAddToCalendar?: TelevetCalendarWriter;
149
+ /** The host's own discard dialog. Absent, the SDK uses React Native's `Alert`. */
150
+ readonly onConfirmDiscard?: TelevetDiscardConfirm;
151
+ /** Asks the host to resolve the owner's state again. Absent, the location cards render without an action. */
152
+ readonly onRequestLocation?: () => void;
153
+ /** Why the host has no state for us, so the right card renders. */
154
+ readonly locationStatus?: TelevetLocationStatus;
155
+ /**
156
+ * Has the host PROVEN it can host the call in app? Defaults to false.
157
+ *
158
+ * Fail closed: without the native video modules the confirmation must not promise an in-app join.
159
+ */
160
+ readonly canJoinInApp?: boolean;
161
+ /**
162
+ * What to render when the partner booking surface is not served for this tenant.
163
+ *
164
+ * THE FLOW WILL NOT DEAD-END. Absent this, an unserved surface renders the paused card, which is a state but
165
+ * not a way forward; the prebuilt flow passes the hosted-visit handoff here so the owner still reaches a vet.
166
+ */
167
+ readonly renderUnavailable?: () => ReactNode;
168
+ readonly style?: StyleProp<ViewStyle>;
169
+ readonly testID?: string;
170
+ }
171
+ declare function EverfurTelevetBooking(props: EverfurTelevetBookingProps): ReactNode;
172
+
173
+ /** The screens of the televet stack. */
174
+ type TelevetScreen = {
175
+ readonly name: 'booking';
176
+ } | {
177
+ readonly name: 'reschedule';
178
+ readonly consult: TelevetConsult;
179
+ };
180
+ interface EverfurTelevetProps {
181
+ /** The pet the visit is for. Seeds the draft; a one-pet roster skips the picker entirely. */
182
+ readonly petRef?: PetRef | null;
183
+ /** The owner's two-letter US state. The SDK never reads a device location for it. */
184
+ readonly usState?: string | null;
185
+ /** Host/test seam: inject a booking controller instead of building one from the provider's session. */
186
+ readonly controller?: TelevetBookingController;
187
+ readonly onBooked?: (consult: TelevetConsult) => void;
188
+ /** The root screen's exit; absent, the root's Close does nothing and the host navigator owns leaving. */
189
+ readonly onExit?: () => void;
190
+ readonly onAddPet?: () => void;
191
+ readonly onPickMedia?: TelevetMediaPicker;
192
+ readonly onAddToCalendar?: TelevetCalendarWriter;
193
+ readonly onConfirmDiscard?: TelevetDiscardConfirm;
194
+ readonly onRequestLocation?: () => void;
195
+ readonly locationStatus?: TelevetLocationStatus;
196
+ /**
197
+ * Has the host installed the native video modules and wired the call surface? Defaults to FALSE.
198
+ *
199
+ * Fail closed. A partner that has not said so gets a confirmation that promises only what it can keep.
200
+ */
201
+ readonly canJoinInApp?: boolean;
202
+ /**
203
+ * Replace the hosted-visit fallback shown when the in-app booking surface is not served.
204
+ *
205
+ * The default is the published `VetVisitButton`, which mints the single-use handoff and opens the hosted
206
+ * Everfur visit. Passing `null` here is not a way to remove it: a flow with no fallback dead-ends, so an
207
+ * explicit render prop is the only way to change it.
208
+ */
209
+ readonly renderUnavailable?: () => ReactNode;
210
+ /** The screen the flow starts on; the booking flow when omitted. */
211
+ readonly initialScreen?: TelevetScreen;
212
+ readonly style?: StyleProp<ViewStyle>;
213
+ /** Your own placeholder while the entitlement verdict is pending on a cold mount. */
214
+ readonly renderPending?: () => ReactNode;
215
+ }
216
+ declare function EverfurTelevetFlow(props: EverfurTelevetProps): ReactNode;
217
+ /** The public prebuilt televet surface: the flow, starting at booking. */
218
+ declare const EverfurTelevet: typeof EverfurTelevetFlow;
219
+
220
+ interface EverfurTelevetRescheduleProps {
221
+ /** The consult being moved. Null while the host is still loading it. */
222
+ readonly consult: TelevetConsult | null;
223
+ readonly onRescheduled?: (moved: TelevetConsult) => void;
224
+ /** Backing out. Never destructive: the original consult is left exactly as it was. */
225
+ readonly onCancel?: () => void;
226
+ /** Host/test seam: inject a booking controller instead of building one from the provider's session. */
227
+ readonly controller?: TelevetBookingController;
228
+ readonly style?: StyleProp<ViewStyle>;
229
+ readonly testID?: string;
230
+ }
231
+ declare function EverfurTelevetReschedule(props: EverfurTelevetRescheduleProps): ReactNode;
232
+
233
+ interface TelevetDay {
234
+ readonly key: string;
235
+ readonly iso: string;
236
+ readonly weekday: string;
237
+ readonly dayNumber: string;
238
+ }
239
+ interface TelevetDayStripProps {
240
+ readonly slots: readonly TelevetSlot[];
241
+ readonly selectedDayKey: string | null;
242
+ readonly onSelectDay: (day: TelevetDay) => void;
243
+ }
244
+ /** The day strip. Renders nothing when the window holds no readable day. */
245
+ declare function TelevetDayStrip({ slots, selectedDayKey, onSelectDay }: TelevetDayStripProps): ReactNode;
246
+ /**
247
+ * The distinct local days the slots cover, in server order.
248
+ *
249
+ * Exported for the picker, which needs the first day to seed the selection, and for the suite.
250
+ */
251
+ declare function televetDaysFromSlots(slots: readonly TelevetSlot[]): readonly TelevetDay[];
252
+
253
+ interface TelevetSlotPickerProps {
254
+ /** The server's full window. Never truncated: the day filter is what bounds it. */
255
+ readonly slots: readonly TelevetSlot[];
256
+ /** The slot whose hold is in flight, or null. Disables the whole grid. */
257
+ readonly busySlotId: string | null;
258
+ readonly onPick: (slot: TelevetSlot) => void;
259
+ /** Rendered above the strip, for example a failure line from the container. */
260
+ readonly ListHeaderComponent?: ComponentType | ReactElement | null;
261
+ readonly rowTestIdPrefix?: string;
262
+ readonly testID?: string;
263
+ }
264
+ declare function TelevetSlotPicker({ slots, busySlotId, onPick, ListHeaderComponent, rowTestIdPrefix, testID, }: TelevetSlotPickerProps): ReactNode;
265
+
266
+ /** One "label ... value" row in the summary card. */
267
+ declare function TelevetSummaryRow({ label, value, last, testID, }: {
268
+ readonly label: string;
269
+ readonly value: string;
270
+ /** The last row draws no divider, so the card does not end on a line. */
271
+ readonly last?: boolean;
272
+ readonly testID?: string;
273
+ }): ReactNode;
274
+ /**
275
+ * A consent tick.
276
+ *
277
+ * A REAL CHECKBOX, not a pill button. A filled pill reads as "press to continue" while a checkbox reads as
278
+ * "you are agreeing to this", and these ticks are the owner's licensure attestation and their cancellation
279
+ * agreement. `accessibilityRole="checkbox"` with a `checked` state is also what makes a screen reader announce
280
+ * it as an agreement rather than a button.
281
+ */
282
+ declare function TelevetConsentCheckbox({ label, checked, onToggle, testID, }: {
283
+ readonly label: string;
284
+ readonly checked: boolean;
285
+ readonly onToggle: (next: boolean) => void;
286
+ readonly testID?: string;
287
+ }): ReactNode;
288
+ /** The summary card's own frame, exported so the container does not re-declare it. */
289
+ declare function TelevetSummaryCard({ children, testID }: {
290
+ readonly children: ReactNode;
291
+ readonly testID?: string;
292
+ }): ReactNode;
293
+
294
+ export { BACK_LABEL, EverfurTelevet, EverfurTelevetBooking, type EverfurTelevetBookingProps, EverfurTelevetFlow, type EverfurTelevetProps, EverfurTelevetReschedule, type EverfurTelevetRescheduleProps, PetRef, TelevetBookedScreen, type TelevetBookedScreenProps, TelevetBookingChrome, type TelevetBookingChromeProps, TelevetBookingController, type TelevetBookingFailure, TelevetBookingStep, type TelevetCalendarEvent, type TelevetCalendarWriter, TelevetConsentCheckbox, TelevetConsult, type TelevetDay, TelevetDayStrip, type TelevetDayStripProps, type TelevetDiscardConfirm, TelevetIntakeMedia, type TelevetIntakeMediaItem, type TelevetIntakeMediaProps, type TelevetLocationStatus, type TelevetMediaPicker, type TelevetScreen, TelevetSlot, TelevetSlotPicker, type TelevetSlotPickerProps, TelevetSummaryCard, TelevetSummaryRow, televetConsultCalendarKey, televetDaysFromSlots };