@everfur/sdk 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +251 -4
- package/README.md +9 -3
- package/dist/{Chat-DwAC2vhB.d.ts → Chat-BOX-03ho.d.ts} +17 -3
- package/dist/{Chat-DPUD6dnc.d.cts → Chat-TA-aTcVF.d.cts} +17 -3
- package/dist/{DepthViews-DP0R-DhB.d.cts → DepthViews-CgjX2AJ5.d.ts} +1 -1
- package/dist/{DepthViews-DbFhR4Du.d.cts → DepthViews-Cviea-ri.d.cts} +1 -1
- package/dist/{DepthViews-DNEM96Se.d.ts → DepthViews-D2dRqWRq.d.ts} +1 -1
- package/dist/{DepthViews-D_3hl4xk.d.ts → DepthViews-DSFyaSeL.d.cts} +1 -1
- package/dist/{ErrorPolicyPort-CwbfmxzJ.d.ts → ErrorPolicyPort-D22LUVrK.d.ts} +1 -1
- package/dist/{ErrorPolicyPort-CNf4uQZP.d.cts → ErrorPolicyPort-D6CybiqJ.d.cts} +1 -1
- package/dist/{EverfurResult-DN9pL2Ab.d.cts → EverfurError-DmELDpXp.d.cts} +1 -67
- package/dist/{EverfurResult-DN9pL2Ab.d.ts → EverfurError-DmELDpXp.d.ts} +1 -67
- package/dist/EverfurResult-SGvHKsCB.d.ts +69 -0
- package/dist/EverfurResult-ZtH-YV1h.d.cts +69 -0
- package/dist/animations/index.cjs +1 -1
- package/dist/animations/index.d.cts +6 -5
- package/dist/animations/index.d.ts +6 -5
- package/dist/animations/index.js +1 -1
- package/dist/{attachments-5NeobOCd.d.ts → attachments-C_vtFu2f.d.ts} +7 -5
- package/dist/{attachments-D8T5re7e.d.cts → attachments-DHvnITuE.d.cts} +7 -5
- package/dist/{attachments-Bw3iMQgu.d.ts → attachments-oD5U2fXI.d.ts} +3 -3
- package/dist/{attachments-CQgFrEQ7.d.cts → attachments-pIdGOQfm.d.cts} +3 -3
- package/dist/bookingCopy-CJir9mjb.d.ts +1135 -0
- package/dist/bookingCopy-DfuA13dh.d.cts +1135 -0
- package/dist/branding-Xb_wL8N1.d.cts +212 -0
- package/dist/branding-xpQ056sM.d.ts +212 -0
- package/dist/callCopy-rDH9JTFo.d.cts +45 -0
- package/dist/callCopy-rDH9JTFo.d.ts +45 -0
- package/dist/callRoom-7wrE3RP2.d.ts +62 -0
- package/dist/callRoom-B_EqaUzx.d.cts +62 -0
- package/dist/casesRepository-B-Eg8ZJ3.d.cts +63 -0
- package/dist/casesRepository-DHgIYKN9.d.ts +63 -0
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.d.cts +12 -10
- package/dist/chat/index.d.ts +12 -10
- package/dist/chat/index.js +1 -1
- package/dist/client/index.cjs +5 -5
- package/dist/client/index.d.cts +15 -11
- package/dist/client/index.d.ts +15 -11
- package/dist/client/index.js +5 -5
- package/dist/{config-CzTZGlfF.d.cts → config-ClI7QxB0.d.ts} +4 -3
- package/dist/{config-DW60uRb9.d.ts → config-DAFbf721.d.cts} +4 -3
- package/dist/consent/index.cjs +1 -1
- package/dist/consent/index.d.cts +9 -8
- package/dist/consent/index.d.ts +9 -8
- package/dist/consent/index.js +1 -1
- package/dist/{context-XvTzq1tE.d.cts → context-B-dUM1Qf.d.cts} +9 -8
- package/dist/{context-DXhqHlPU.d.ts → context-CZbgF_OH.d.ts} +9 -8
- package/dist/{copy-Mjoo91aS.d.ts → copy-CeRH3NXy.d.ts} +5 -4
- package/dist/{copy-bKDNigLb.d.cts → copy-CneuYdrO.d.cts} +5 -4
- package/dist/core/index.cjs +9 -9
- package/dist/core/index.d.cts +123 -32
- package/dist/core/index.d.ts +123 -32
- package/dist/core/index.js +9 -9
- package/dist/{depth-CErXCU8J.d.cts → depth-B3NFKlF9.d.cts} +38 -6
- package/dist/{depth-DjDcJ6kH.d.ts → depth-DO3Ko_qs.d.ts} +38 -6
- package/dist/entitlementRepository-74kW5mK0.d.ts +43 -0
- package/dist/entitlementRepository-m6zLUmiB.d.cts +43 -0
- package/dist/{identity-DI4eVx9S.d.cts → identity-C7uxGwfT.d.cts} +3 -3
- package/dist/{identity-BMx2SUOM.d.ts → identity-CLAUq-K4.d.ts} +3 -3
- package/dist/index.cjs +6 -6
- package/dist/index.d.cts +20 -17
- package/dist/index.d.ts +20 -17
- package/dist/index.js +6 -6
- package/dist/{models-D2EUxPZY.d.cts → models-Bn2z0NNo.d.cts} +1 -1
- package/dist/{models-B-Uh2LTf.d.ts → models-DSqA5Ahs.d.ts} +1 -1
- package/dist/notifications/index.cjs +2 -2
- package/dist/notifications/index.d.cts +5 -4
- package/dist/notifications/index.d.ts +5 -4
- package/dist/notifications/index.js +2 -2
- package/dist/optionalModule-DbJmsq5f.d.cts +21 -0
- package/dist/optionalModule-DbJmsq5f.d.ts +21 -0
- package/dist/{pets-aB8q0JyX.d.cts → pets-BoB5B7kp.d.cts} +2 -2
- package/dist/{pets-CtQdRpWo.d.ts → pets-w4M9d-Dn.d.ts} +2 -2
- package/dist/{casesRepository-ClLv6qMl.d.ts → petsRepository-BjKJ8UsN.d.ts} +3 -49
- package/dist/{casesRepository-DHwtGRYY.d.cts → petsRepository-DZZoEG3r.d.cts} +3 -49
- package/dist/photo/index.cjs +1 -1
- package/dist/photo/index.d.cts +3 -2
- package/dist/photo/index.d.ts +3 -2
- package/dist/photo/index.js +1 -1
- package/dist/{ports-DMolTRzU.d.ts → ports-BO3bzTJg.d.ts} +14 -17
- package/dist/{ports-DEBzEhbp.d.cts → ports-C2EVK416.d.cts} +14 -17
- package/dist/records/depth/index.cjs +2 -2
- package/dist/records/depth/index.d.cts +11 -10
- package/dist/records/depth/index.d.ts +11 -10
- package/dist/records/depth/index.js +2 -2
- package/dist/records/index.cjs +3 -3
- package/dist/records/index.d.cts +25 -14
- package/dist/records/index.d.ts +25 -14
- package/dist/records/index.js +3 -3
- package/dist/{requestFunnel-CjW7uDuA.d.ts → requestFunnel-D7ipek3e.d.ts} +28 -4
- package/dist/{requestFunnel-L-BQfi0z.d.cts → requestFunnel-Djjwgoe9.d.cts} +28 -4
- package/dist/{runtime-BR9ysG0J.d.ts → runtimeTypes-CTL3yToK.d.ts} +10 -100
- package/dist/{runtime-B8s-_hv8.d.cts → runtimeTypes-D2C9uD85.d.cts} +10 -100
- package/dist/server/events/index.cjs +1 -1
- package/dist/server/events/index.d.cts +4 -3
- package/dist/server/events/index.d.ts +4 -3
- package/dist/server/events/index.js +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.cts +5 -4
- package/dist/server/index.d.ts +5 -4
- package/dist/server/index.js +1 -1
- package/dist/televet/booking/index.cjs +1 -0
- package/dist/televet/booking/index.d.cts +566 -0
- package/dist/televet/booking/index.d.ts +566 -0
- package/dist/televet/booking/index.js +1 -0
- package/dist/televet/call/index.cjs +1 -0
- package/dist/televet/call/index.d.cts +161 -0
- package/dist/televet/call/index.d.ts +161 -0
- package/dist/televet/call/index.js +1 -0
- package/dist/televet/index.cjs +1 -1
- package/dist/televet/index.d.cts +64 -12
- package/dist/televet/index.d.ts +64 -12
- package/dist/televet/index.js +1 -1
- package/dist/televetGlobal-CEk0_cW9.d.cts +34 -0
- package/dist/televetGlobal-Cs9Wbqsy.d.ts +34 -0
- package/dist/testing/index.cjs +4 -4
- package/dist/testing/index.d.cts +4 -3
- package/dist/testing/index.d.ts +4 -3
- package/dist/testing/index.js +4 -4
- package/dist/testing/rn/index.cjs +1 -1
- package/dist/testing/rn/index.d.cts +13 -10
- package/dist/testing/rn/index.d.ts +13 -10
- package/dist/testing/rn/index.js +1 -1
- package/dist/testing/web/index.cjs +1 -1
- package/dist/testing/web/index.d.cts +14 -12
- package/dist/testing/web/index.d.ts +14 -12
- package/dist/testing/web/index.js +1 -1
- package/dist/{timelineRows-DZed6dAM.d.ts → timelineRows-7yFNK_rU.d.ts} +1 -1
- package/dist/{timelineRows-CaohZzXS.d.cts → timelineRows-CzR1T2DR.d.cts} +1 -1
- package/dist/tokens-CIngRkvt.d.cts +362 -0
- package/dist/tokens-CIngRkvt.d.ts +362 -0
- package/dist/typeStyle-DHJzDaUo.d.cts +112 -0
- package/dist/typeStyle-YPS_MXeI.d.ts +112 -0
- package/dist/{useRecordsDepth-BHBzJ76R.d.cts → useRecordsDepth-Bnw36jPr.d.cts} +24 -5
- package/dist/{useRecordsDepth-BU-OhzH6.d.ts → useRecordsDepth-DFF7Faxx.d.ts} +24 -5
- package/dist/{useVetVisit-CjmMa896.d.ts → useVetVisit-BsjoDO-n.d.ts} +21 -6
- package/dist/{useVetVisit-Bc84hWUU.d.cts → useVetVisit-Ds8f1peV.d.cts} +21 -6
- package/dist/video/index.cjs +1 -1
- package/dist/video/index.d.cts +3 -2
- package/dist/video/index.d.ts +3 -2
- package/dist/video/index.js +1 -1
- package/dist/{view-DtSPYpKa.d.ts → view-BqcOYFTr.d.ts} +5 -4
- package/dist/{view-C3qPIXGX.d.cts → view-CaJs8WFH.d.cts} +5 -4
- package/dist/web/consent/index.cjs +1 -1
- package/dist/web/consent/index.d.cts +9 -8
- package/dist/web/consent/index.d.ts +9 -8
- package/dist/web/consent/index.js +1 -1
- package/dist/web/index.cjs +10 -10
- package/dist/web/index.d.cts +43 -19
- package/dist/web/index.d.ts +43 -19
- package/dist/web/index.js +10 -10
- package/dist/web/notifications/index.cjs +2 -2
- package/dist/web/notifications/index.d.cts +7 -6
- package/dist/web/notifications/index.d.ts +7 -6
- package/dist/web/notifications/index.js +2 -2
- package/dist/web/records/depth/index.cjs +2 -2
- package/dist/web/records/depth/index.d.cts +11 -10
- package/dist/web/records/depth/index.d.ts +11 -10
- package/dist/web/records/depth/index.js +2 -2
- package/dist/web/records/index.cjs +3 -3
- package/dist/web/records/index.d.cts +123 -14
- package/dist/web/records/index.d.ts +123 -14
- package/dist/web/records/index.js +3 -3
- package/dist/web/televet/booking/index.cjs +2 -0
- package/dist/web/televet/booking/index.d.cts +770 -0
- package/dist/web/televet/booking/index.d.ts +770 -0
- package/dist/web/televet/booking/index.js +2 -0
- package/dist/web/televet/call/index.cjs +1 -0
- package/dist/web/televet/call/index.d.cts +144 -0
- package/dist/web/televet/call/index.d.ts +144 -0
- package/dist/web/televet/call/index.js +1 -0
- package/dist/web/televet/index.cjs +1 -1
- package/dist/web/televet/index.d.cts +61 -9
- package/dist/web/televet/index.d.ts +61 -9
- package/dist/web/televet/index.js +1 -1
- package/package.json +74 -5
- package/televet/booking/package.json +8 -0
- package/televet/call/package.json +8 -0
- package/web/televet/booking/native-blocked.cjs +12 -0
- package/web/televet/booking/package.json +8 -0
- package/web/televet/call/native-blocked.cjs +12 -0
- package/web/televet/call/package.json +8 -0
- package/dist/entitlementRepository-DKdXFgTo.d.cts +0 -698
- package/dist/entitlementRepository-DSbzuyAW.d.ts +0 -698
- package/dist/typeStyle-0TydiZ1w.d.cts +0 -19
- package/dist/typeStyle-CWMsoe6b.d.ts +0 -19
|
@@ -0,0 +1,770 @@
|
|
|
1
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
import { P as PetRef } from '../../../ids-B2GAAifq.js';
|
|
3
|
+
export { B as Brand, _ as __brand } from '../../../ids-B2GAAifq.js';
|
|
4
|
+
import { c as TelevetConsult, d as TelevetBookingStep, e as TelevetBookingController, f as TelevetTriageRead, g as TelevetStateInterestWrite, T as TelevetEmptyRosterCause, a as TelevetStateInterestAction$1, b as TelevetMediaShortfall, i as TelevetSlot } from '../../../bookingCopy-CJir9mjb.js';
|
|
5
|
+
export { C as CANCELLATION_POLICY_VERSION_MAX, j as CANCEL_REASON_MAX, k as CONSULT_KINDS, l as CONSULT_MINUTES, m as CONSULT_STATUSES, n as ConsultKind, o as ConsultStatus, M as MEDIA_REFS_MAX, N as NO_MEDIA_SHORTFALL, R as REASON_TEXT_MAX, p as TELEVET_BOOKING_BASE, q as TELEVET_BOOKING_COPY, r as TELEVET_BOOKING_STEPS, s as TELEVET_CONSULT_PAGE_LIMIT, t as TELEVET_JOIN_CLOSES_MINUTES_AFTER, u as TELEVET_JOIN_OPENS_MINUTES_BEFORE, v as TERMINAL_CONSULT_STATUSES, w as TelevetBookingAction, x as TelevetBookingBody, y as TelevetBookingContext, z as TelevetBookingControllerDeps, A as TelevetBookingCopy, B as TelevetBookingDraft, D as TelevetBookingEntitlement, E as TelevetBookingFailure, F as TelevetBookingRefusal, G as TelevetBookingState, h as TelevetCancelReceipt, H as TelevetCancellationPolicy, I as TelevetClinician, J as TelevetEarlyTriage, K as TelevetEmptyRosterView, aH as TelevetJoinBlock, aI as TelevetJoinDecision, O as TelevetJoinState, P as TelevetMediaRefusal, Q as TelevetRead, S as TelevetSlotHold, U as TelevetStateInterestReason, V as TelevetStatePolicy, W as TelevetTriageVerdict, X as TelevetWrite, Y as attestation, Z as canConfirm, _ as canManageTelevetVisit, $ as createTelevetBookingController, a0 as currentStep, a1 as emptyTelevetDraft, a2 as formatVisitRange, a3 as formatWhen, a4 as formatWhenWithDay, a5 as hasPreviousStep, a6 as initialTelevetBookingState, a7 as isHoldExpired, a8 as isMediaShortfallEmpty, a9 as isSkipped, aa as isTelevetBookingCopyReady, ab as isWellFormedStateCode, ac as mediaShortfallFromUnsentPicks, ad as splitTelevetVisits, ae as televetBookingKey, af as televetBookingReducer, ag as televetBookingRefusal, ah as televetCancelCall, ai as televetConsultCall, aj as televetEmptyRosterCause, ak as televetEmptyRosterView, al as televetHoldCall, am as televetJoinCall, aJ as televetJoinDecision, an as televetJoinOpensAtMs, ap as televetMediaShortfallLines, aq as televetRescheduleCall, ar as useEarlyTriage, as as useStateInterest, at as useTelevetBookConsult, au as useTelevetBookingAvailable, av as useTelevetBookingController, aw as useTelevetBookingEntitlement, ax as useTelevetCancellationPolicy, ay as useTelevetClinicians, az as useTelevetHoldSlot, aA as useTelevetJoin, aB as useTelevetNextSlot, aC as useTelevetRescheduleConsult, aD as useTelevetSlots, aE as useTelevetStatePolicy, aF as validateBookingBody, aG as withUnsentPicks } from '../../../bookingCopy-CJir9mjb.js';
|
|
6
|
+
import { V as VetVisitIntent } from '../../../visitIntent-D7_yVp1I.js';
|
|
7
|
+
import { E as EverfurTelevetFlowRequest } from '../../../televetGlobal-Cs9Wbqsy.js';
|
|
8
|
+
import { E as EverfurTheme } from '../../../tokens-CIngRkvt.js';
|
|
9
|
+
export { b as VetCallCredential, c as VetCallJoinRefusal, d as VetCallLimits, p as parseVetCallCredential, v as vetCallJoinReason, e as vetCallJoinRefusal } from '../../../callRoom-7wrE3RP2.js';
|
|
10
|
+
export { E as EverfurError, a as EverfurErrorCategory, b as EverfurErrorCode } from '../../../EverfurError-DmELDpXp.js';
|
|
11
|
+
export { E as EverfurResult } from '../../../EverfurResult-SGvHKsCB.js';
|
|
12
|
+
export { W as WidgetPet } from '../../../petsRepository-BjKJ8UsN.js';
|
|
13
|
+
import '../../../requestFunnel-D7ipek3e.js';
|
|
14
|
+
import '../../../ErrorPolicyPort-D22LUVrK.js';
|
|
15
|
+
import '../../../config-ClI7QxB0.js';
|
|
16
|
+
import '../../../identity-CLAUq-K4.js';
|
|
17
|
+
import '../../../TelemetryPort-BDNr00hu.js';
|
|
18
|
+
import '../../../profile-CSs1wlXT.js';
|
|
19
|
+
|
|
20
|
+
/** The calendar entry a booked visit asks the host to write. */
|
|
21
|
+
interface TelevetCalendarEvent {
|
|
22
|
+
/**
|
|
23
|
+
* A stable key for THIS consult's entry.
|
|
24
|
+
*
|
|
25
|
+
* Keyed on the CONSULT so a re-press updates the same entry rather than writing a second event for one
|
|
26
|
+
* visit, and so a later cancel or reschedule can address the SAME row. A host that ignores the key writes
|
|
27
|
+
* duplicates the owner has to clean up by hand.
|
|
28
|
+
*/
|
|
29
|
+
readonly key: string;
|
|
30
|
+
readonly title: string;
|
|
31
|
+
readonly startDate: Date;
|
|
32
|
+
readonly endDate: Date;
|
|
33
|
+
/** The reminder offset in minutes, negative for "before". The platform queues its own at the same offset. */
|
|
34
|
+
readonly alarmOffsetMinutes: number;
|
|
35
|
+
}
|
|
36
|
+
/** Writes the entry. Resolves true when it landed; false when the host has no calendar to write to. */
|
|
37
|
+
type TelevetCalendarWriter = (event: TelevetCalendarEvent) => Promise<boolean>;
|
|
38
|
+
/** The calendar key for a consult. One definition, so a cancel and a reschedule address the booked row. */
|
|
39
|
+
declare function televetConsultCalendarKey(consultId: string): string;
|
|
40
|
+
interface TelevetBookedScreenProps {
|
|
41
|
+
readonly consult: TelevetConsult;
|
|
42
|
+
readonly petName: string | null;
|
|
43
|
+
readonly onDone: () => void;
|
|
44
|
+
/** Absent, there is no Add to calendar control. */
|
|
45
|
+
readonly onAddToCalendar?: TelevetCalendarWriter | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Has the host PROVEN it can host the call in place? Defaults to false.
|
|
48
|
+
*
|
|
49
|
+
* Fail closed: a host that has not said so is assumed not to have mounted the call surface, and the in-place
|
|
50
|
+
* join promise is withheld rather than printed on a hope.
|
|
51
|
+
*/
|
|
52
|
+
readonly canJoinInApp?: boolean;
|
|
53
|
+
}
|
|
54
|
+
declare function TelevetBookedScreen({ consult, petName, onDone, onAddToCalendar, canJoinInApp, }: TelevetBookedScreenProps): ReactNode;
|
|
55
|
+
|
|
56
|
+
/** The heading levels the DOM has elements for. */
|
|
57
|
+
type EverfurHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The host's own discard confirmation.
|
|
61
|
+
*
|
|
62
|
+
* Receives the ported title, body and the two button labels, and resolves true to leave. A partner with its
|
|
63
|
+
* own dialog system passes this; absent, the SDK renders the in-page dialog below.
|
|
64
|
+
*/
|
|
65
|
+
type TelevetDiscardConfirm = (prompt: {
|
|
66
|
+
readonly title: string;
|
|
67
|
+
readonly body: string;
|
|
68
|
+
readonly confirmLabel: string;
|
|
69
|
+
readonly keepLabel: string;
|
|
70
|
+
}) => Promise<boolean>;
|
|
71
|
+
interface TelevetBookingChromeProps {
|
|
72
|
+
readonly step: TelevetBookingStep;
|
|
73
|
+
readonly furthestIndex: number;
|
|
74
|
+
/** The title on the bar. The reschedule flow passes its own, so the bar never says "Book a visit" there. */
|
|
75
|
+
readonly title?: string;
|
|
76
|
+
/** False on the first visible step, where Back would leave the flow entirely. */
|
|
77
|
+
readonly canGoBack: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Has the owner entered anything worth losing?
|
|
80
|
+
*
|
|
81
|
+
* Gates the discard confirm AND the `beforeunload` backstop. A confirm on an untouched flow is a pointless
|
|
82
|
+
* obstacle; NO confirm on a flow holding typed clinical text is the actual defect, because that text is
|
|
83
|
+
* volatile component state with no draft to restore it from.
|
|
84
|
+
*/
|
|
85
|
+
readonly isDirty: boolean;
|
|
86
|
+
readonly onBack: () => void;
|
|
87
|
+
readonly onClose: () => void;
|
|
88
|
+
readonly onConfirmDiscard?: TelevetDiscardConfirm | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* The heading level of the bar's title. Defaults to 2, the level an embedded surface may safely claim.
|
|
91
|
+
*
|
|
92
|
+
* Pass 1 only when the flow IS the page in your app. See `src/web/headingLevel.ts`.
|
|
93
|
+
*/
|
|
94
|
+
readonly headingLevel?: EverfurHeadingLevel | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Is the emergency warning up in place of Describe? The web funnel counts it as its own step (`Desktop - 18`,
|
|
97
|
+
* fourth of eight), so the bar lights four segments while it is on screen.
|
|
98
|
+
*/
|
|
99
|
+
readonly triageOpen?: boolean | undefined;
|
|
100
|
+
}
|
|
101
|
+
declare function TelevetBookingChrome({ step, furthestIndex, title, canGoBack, isDirty, onBack, onClose, onConfirmDiscard, headingLevel: level, triageOpen, }: TelevetBookingChromeProps): ReactNode;
|
|
102
|
+
/**
|
|
103
|
+
* The back control's spoken label.
|
|
104
|
+
*
|
|
105
|
+
* "Back" is the platform word for the control and is not product copy, which is why it is a constant here and
|
|
106
|
+
* not a key in the ported deck. The web records port declares the same constant for the same reason.
|
|
107
|
+
*/
|
|
108
|
+
declare const BACK_LABEL = "Back";
|
|
109
|
+
|
|
110
|
+
/** The pet's own clinic, when the HOST holds it. The RN file's docblock explains why it is a prop. */
|
|
111
|
+
interface TelevetPrimaryVet {
|
|
112
|
+
readonly detail?: string | null;
|
|
113
|
+
/** Places the call. Absent, the row is not a link and takes no click. */
|
|
114
|
+
readonly dial?: (() => void) | undefined;
|
|
115
|
+
}
|
|
116
|
+
interface TelevetEmergencyExitsProps {
|
|
117
|
+
/** The pet's name, for the primary-vet card. Absent, that card is not drawn. */
|
|
118
|
+
readonly petName?: string | null | undefined;
|
|
119
|
+
readonly primaryVet?: TelevetPrimaryVet | null | undefined;
|
|
120
|
+
/** The host's own emergency-vet locator. Absent, that card is not drawn. */
|
|
121
|
+
readonly onFindEmergencyVet?: (() => void) | undefined;
|
|
122
|
+
/** Distinguishes the two places the warning is drawn, for tests. */
|
|
123
|
+
readonly testIDPrefix: string;
|
|
124
|
+
}
|
|
125
|
+
declare function TelevetEmergencyExits({ petName, primaryVet, onFindEmergencyVet, testIDPrefix, }: TelevetEmergencyExitsProps): ReactNode;
|
|
126
|
+
|
|
127
|
+
/** A picked-but-not-yet-uploaded attachment, in the host's own terms. */
|
|
128
|
+
interface TelevetIntakeMediaItem {
|
|
129
|
+
readonly uri: string;
|
|
130
|
+
readonly filename: string;
|
|
131
|
+
readonly mimeType: string;
|
|
132
|
+
readonly fileSize: number;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The host's media picker.
|
|
136
|
+
*
|
|
137
|
+
* Resolves the picks, or null when the owner cancelled. The SDK takes no picker dependency and opens no file
|
|
138
|
+
* dialog of its own; a partner supplies whichever picker its site already has, typically an `<input
|
|
139
|
+
* type="file">` whose `File` objects it turns into object URLs.
|
|
140
|
+
*
|
|
141
|
+
* `limit` is the remaining headroom, so the host can cap its own selection rather than returning picks this
|
|
142
|
+
* row has to silently discard.
|
|
143
|
+
*/
|
|
144
|
+
type TelevetMediaPicker = (limit: number) => Promise<readonly TelevetIntakeMediaItem[] | null>;
|
|
145
|
+
interface TelevetIntakeMediaProps {
|
|
146
|
+
readonly media: readonly TelevetIntakeMediaItem[];
|
|
147
|
+
readonly onChange: (next: readonly TelevetIntakeMediaItem[]) => void;
|
|
148
|
+
/** Absent, the row renders nothing at all. There is no disabled Add control. */
|
|
149
|
+
readonly onPickMedia?: TelevetMediaPicker | undefined;
|
|
150
|
+
/**
|
|
151
|
+
* The list's accessible name.
|
|
152
|
+
*
|
|
153
|
+
* Required, with no default string here: naming the group is what makes the tiles announce as a set, and
|
|
154
|
+
* the name is user-facing copy this SDK does not author. The intake step passes a ported key down.
|
|
155
|
+
*/
|
|
156
|
+
readonly listLabel: string;
|
|
157
|
+
}
|
|
158
|
+
declare function TelevetIntakeMedia({ media, onChange, onPickMedia, listLabel }: TelevetIntakeMediaProps): ReactNode;
|
|
159
|
+
|
|
160
|
+
/** What the host can tell us about a location it could not resolve, so the right card renders. */
|
|
161
|
+
type TelevetLocationStatus = 'unknown' | 'blocked' | 'unavailable';
|
|
162
|
+
interface EverfurTelevetBookingProps {
|
|
163
|
+
/** The pet the visit is for. Seeds the draft; a one-pet roster skips the picker entirely. */
|
|
164
|
+
readonly petRef?: PetRef | null;
|
|
165
|
+
/** The owner's two-letter US state. The SDK never reads a browser location for it. */
|
|
166
|
+
readonly usState?: string | null;
|
|
167
|
+
/** Host/test seam: inject a booking controller instead of building one from the provider's session. */
|
|
168
|
+
readonly controller?: TelevetBookingController;
|
|
169
|
+
readonly onBooked?: (consult: TelevetConsult) => void;
|
|
170
|
+
/** Leaves the flow. The flow never navigates itself, so the same screens work in a modal, a tab or a route. */
|
|
171
|
+
readonly onExit?: () => void;
|
|
172
|
+
/** Leaves the flow to create a pet, then comes back. Absent, the empty roster has no action. */
|
|
173
|
+
readonly onAddPet?: () => void;
|
|
174
|
+
/** The host's media picker for the intake step. Absent, there is no attachment row. */
|
|
175
|
+
readonly onPickMedia?: TelevetMediaPicker;
|
|
176
|
+
/** The host's calendar writer for the confirmation. Absent, there is no Add to calendar control. */
|
|
177
|
+
readonly onAddToCalendar?: TelevetCalendarWriter;
|
|
178
|
+
/** The host's own discard dialog. Absent, the SDK renders its own `<dialog>`. */
|
|
179
|
+
readonly onConfirmDiscard?: TelevetDiscardConfirm;
|
|
180
|
+
/** Asks the host to resolve the owner's state again. Absent, the location cards render without an action. */
|
|
181
|
+
readonly onRequestLocation?: () => void;
|
|
182
|
+
/** Why the host has no state for us, so the right card renders. */
|
|
183
|
+
readonly locationStatus?: TelevetLocationStatus;
|
|
184
|
+
/**
|
|
185
|
+
* THE EMERGENCY TRIAGE READ, asked after Describe rather than only at Confirm.
|
|
186
|
+
*
|
|
187
|
+
* ABSENT MEANS NO EARLY QUESTION and the flow behaves as it did before, with the server's own
|
|
188
|
+
* `emergency_ack_required` refusal still waiting at Confirm. That is the consumer's rule for a triage read
|
|
189
|
+
* that could not answer, not a degraded mode.
|
|
190
|
+
*
|
|
191
|
+
* A SEAM BECAUSE `POST /widget/v1/televet/consults/triage` IS NOT SERVED (verified on EFBackend main
|
|
192
|
+
* 2026-09-22 against the partner_televet route decorators). The consumer WEB funnel does ask the question
|
|
193
|
+
* at this position (`continueFromDescribe`, since 2026-09-12) but against a CONSUMER session.
|
|
194
|
+
*/
|
|
195
|
+
readonly onTriageReason?: TelevetTriageRead;
|
|
196
|
+
/**
|
|
197
|
+
* THE STATE-INTEREST WRITE: the one way out of "we have no vet licensed in your state".
|
|
198
|
+
*
|
|
199
|
+
* ABSENT MEANS THE CONTROL DOES NOT RENDER. `POST /widget/v1/televet/state-interest` does not exist on the
|
|
200
|
+
* partner plane, and the consumer WEB app already refused to ship this button over an unreachable write
|
|
201
|
+
* for the same reason on its own pre-signup funnel: "the button would 401 for every visitor who pressed
|
|
202
|
+
* it" (everfur-frontend StateUnavailableNotice.tsx:34-41).
|
|
203
|
+
*/
|
|
204
|
+
readonly onStateInterest?: TelevetStateInterestWrite;
|
|
205
|
+
/**
|
|
206
|
+
* THE PET'S OWN CLINIC, for the emergency screen's one exit row. The partner wire has no primary-vet
|
|
207
|
+
* concept, so a host that holds its customer's clinic supplies it and gets the consumer's exact row.
|
|
208
|
+
*/
|
|
209
|
+
readonly primaryVet?: TelevetPrimaryVet | null;
|
|
210
|
+
/**
|
|
211
|
+
* THE HOST'S OWN EMERGENCY-VET LOCATOR, for the emergency warning's "Find an emergency vet near you" card.
|
|
212
|
+
* The consumer web links its own clinic finder; the SDK has none and navigates the partner's page nowhere,
|
|
213
|
+
* so the card renders only when the host can take the member to one. Absent, the other cards still render.
|
|
214
|
+
*/
|
|
215
|
+
readonly onFindEmergencyVet?: () => void;
|
|
216
|
+
/**
|
|
217
|
+
* Has the host PROVEN it can host the call in place? Defaults to false.
|
|
218
|
+
*
|
|
219
|
+
* Fail closed: without the call surface mounted the confirmation must not promise an in-place join.
|
|
220
|
+
*/
|
|
221
|
+
readonly canJoinInApp?: boolean;
|
|
222
|
+
/**
|
|
223
|
+
* What to render when the partner booking surface is not served for this tenant.
|
|
224
|
+
*
|
|
225
|
+
* Absent, the paused card, inside the chrome whose Close is the way out. Nothing leaves the page by default;
|
|
226
|
+
* a host that wants the hosted visit offered here passes `() => <VetVisitButton prefer="redirect" />`.
|
|
227
|
+
*/
|
|
228
|
+
readonly renderUnavailable?: () => ReactNode;
|
|
229
|
+
/**
|
|
230
|
+
* The heading level this flow's title claims. Defaults to 2.
|
|
231
|
+
*
|
|
232
|
+
* A DROP-IN WIDGET DOES NOT OWN YOUR PAGE'S `<h1>`, so the default is 2 and every heading inside the flow
|
|
233
|
+
* sits one level below it. Pass 1 when the flow IS the page in your app. See `src/web/headingLevel.ts` for
|
|
234
|
+
* the full reasoning and for why the default falls on the safe side rather than on the tidier one.
|
|
235
|
+
*/
|
|
236
|
+
readonly headingLevel?: number;
|
|
237
|
+
readonly style?: CSSProperties;
|
|
238
|
+
readonly testID?: string;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
declare function EverfurTelevetBooking(props: EverfurTelevetBookingProps): ReactNode;
|
|
242
|
+
|
|
243
|
+
interface TelevetEarlyEmergencyProps {
|
|
244
|
+
readonly petName?: string | null;
|
|
245
|
+
readonly primaryVet?: TelevetPrimaryVet | null;
|
|
246
|
+
/** The host's own emergency-vet locator, for the "Find an emergency vet near you" card. */
|
|
247
|
+
readonly onFindEmergencyVet?: (() => void) | undefined;
|
|
248
|
+
readonly onContinue: () => void;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* THE EMERGENCY WARNING, IN PLACE OF DESCRIBE. The clinical-safety surface on this flow.
|
|
252
|
+
*
|
|
253
|
+
* The consumer web app's interstitial (BookingFunnel.tsx:713-774): its heading, its body, its cards and its
|
|
254
|
+
* continue control, in the web deck's words. The mobile shape underneath (the two-point danger edge, the
|
|
255
|
+
* assertive region) is kept, because both apps interrupt the same way.
|
|
256
|
+
*
|
|
257
|
+
* ── THE DOM PIECES THAT CARRY WHAT THE RN PROPS CARRIED ─────────────────────────────────────────────────
|
|
258
|
+
* `role="alertdialog"` with `aria-modal` is deliberately NOT used. This is not an overlay: the container
|
|
259
|
+
* REPLACES the intake step with it, so there is no live form underneath for a modal to fence off, and
|
|
260
|
+
* claiming a modal that traps no focus is a worse lie than claiming none. What the screen needs instead is
|
|
261
|
+
* that its heading is announced the moment it mounts, which `role="alert"` on the region does, and that its
|
|
262
|
+
* heading is a real heading so a reader can jump to it.
|
|
263
|
+
*
|
|
264
|
+
* IT CANNOT BE SKIPPED PAST for the same three container-level reasons the RN file lists: it replaces the
|
|
265
|
+
* step, Back returns to the words without acknowledging, and the acknowledgement is bound to the exact text.
|
|
266
|
+
*/
|
|
267
|
+
declare function TelevetEarlyEmergency({ petName, primaryVet, onFindEmergencyVet, onContinue, }: TelevetEarlyEmergencyProps): ReactNode;
|
|
268
|
+
interface TelevetStateInterestActionProps {
|
|
269
|
+
/** Null renders NOTHING: no seam, no control. */
|
|
270
|
+
readonly action: TelevetStateInterestAction$1 | null;
|
|
271
|
+
readonly testIDPrefix: string;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* ASK TO BE TOLD WHEN THE FACT ON SCREEN CHANGES.
|
|
275
|
+
*
|
|
276
|
+
* PORTED FROM THE CONSUMER WEB APP (`StateInterestPanel.tsx:100-130`), which is the right reference for a DOM
|
|
277
|
+
* surface and differs from the phone in one visible way: the pending state is a LABEL
|
|
278
|
+
* (`stateInterestSubmitting`, ownerCopy.ts:524) rather than a spinner inside the button. The web app made
|
|
279
|
+
* that choice for its own surface and this follows it, so a partner's web page reads the way everfur.com does.
|
|
280
|
+
*
|
|
281
|
+
* THE FAILURE IS `role="alert"` AND THE JOIN IS `role="status"`, matching the consumer's `Notice` tones
|
|
282
|
+
* (danger/alert, success/status). A failed write needs to interrupt because the member is about to walk away
|
|
283
|
+
* believing they were added; a success can wait for a pause.
|
|
284
|
+
*/
|
|
285
|
+
declare function TelevetStateInterestAction({ action, testIDPrefix, }: TelevetStateInterestActionProps): ReactNode;
|
|
286
|
+
interface TelevetClinicianEmptyStateProps {
|
|
287
|
+
readonly cause: TelevetEmptyRosterCause;
|
|
288
|
+
readonly onRetry?: (() => void) | undefined;
|
|
289
|
+
readonly stateInterest?: TelevetStateInterestAction$1 | null;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* THE TERMINAL STATE FOR A RESOLVED, STATE-SCOPED EMPTY CLINICIAN ROSTER.
|
|
293
|
+
*
|
|
294
|
+
* Mobile shape in DOM: the consumer web funnel is pre-signup and reads no roster, so it has no equivalent.
|
|
295
|
+
* The retry follows the CAUSE rather than the screen, and the decision lives in
|
|
296
|
+
* `react/televet/clinicianEmptyState.ts` so this file and its RN sibling cannot disagree about which
|
|
297
|
+
* sentence is true.
|
|
298
|
+
*/
|
|
299
|
+
declare function TelevetClinicianEmptyState({ cause, onRetry, stateInterest, }: TelevetClinicianEmptyStateProps): ReactNode;
|
|
300
|
+
interface TelevetEntitlementInterestStateProps {
|
|
301
|
+
/** Opens the state-scoped roster read and nothing else. Absent, the card stands alone. */
|
|
302
|
+
readonly onCheckAvailability?: (() => void) | undefined;
|
|
303
|
+
}
|
|
304
|
+
/** THE SUBSCRIPTION TRUTH WITH THE ONE DELIBERATELY NON-BOOKING ESCAPE HATCH. See the RN sibling's docblock. */
|
|
305
|
+
declare function TelevetEntitlementInterestState({ onCheckAvailability, }: TelevetEntitlementInterestStateProps): ReactNode;
|
|
306
|
+
interface TelevetMediaDropNoticeProps {
|
|
307
|
+
readonly shortfall: TelevetMediaShortfall;
|
|
308
|
+
readonly testIDPrefix: string;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* WHAT HAPPENED TO THE OWNER'S ATTACHMENTS, one line per cause.
|
|
312
|
+
*
|
|
313
|
+
* Ported from the consumer web app's own composition: `consultAttachmentShortfallLines` builds the sentences
|
|
314
|
+
* (consultAttachmentUpload.ts:382-407) and `BookingMediaField.tsx:441` renders them as a list. So this is a
|
|
315
|
+
* `<ul>`, which is what the web app does and what a reader needs in order to be told how many things went
|
|
316
|
+
* wrong before it reads the first one.
|
|
317
|
+
*
|
|
318
|
+
* MOUNTED ON BOTH REVIEW AND THE CONFIRMATION, for the reason the consumer mobile app found the hard way:
|
|
319
|
+
* review unmounts the instant the booking succeeds, and the confirmation is where a "your photo did not reach
|
|
320
|
+
* the vet" line actually has to be read.
|
|
321
|
+
*/
|
|
322
|
+
declare function TelevetMediaDropNotice({ shortfall, testIDPrefix, }: TelevetMediaDropNoticeProps): ReactNode;
|
|
323
|
+
|
|
324
|
+
/** The screens of the televet stack. */
|
|
325
|
+
type TelevetScreen =
|
|
326
|
+
/** Where a vet entry lands: the visits when one is still ahead, otherwise the booking. The default root. */
|
|
327
|
+
{
|
|
328
|
+
readonly name: 'home';
|
|
329
|
+
} | {
|
|
330
|
+
readonly name: 'booking';
|
|
331
|
+
}
|
|
332
|
+
/** The member's visits, upcoming and past, each with its own Join, Reschedule and Cancel. */
|
|
333
|
+
| {
|
|
334
|
+
readonly name: 'visits';
|
|
335
|
+
} | {
|
|
336
|
+
readonly name: 'reschedule';
|
|
337
|
+
readonly consult: TelevetConsult;
|
|
338
|
+
}
|
|
339
|
+
/** Mint the room credential for this consult and join it, behind the recording notice. */
|
|
340
|
+
| {
|
|
341
|
+
readonly name: 'call';
|
|
342
|
+
readonly consultId: string;
|
|
343
|
+
readonly clinicianName?: string | null | undefined;
|
|
344
|
+
readonly petName?: string | null | undefined;
|
|
345
|
+
}
|
|
346
|
+
/** A visit the member already has, as a tapped reminder names it. Opens the visits. */
|
|
347
|
+
| {
|
|
348
|
+
readonly name: 'visit';
|
|
349
|
+
readonly visitRef: string;
|
|
350
|
+
readonly intent: VetVisitIntent | null;
|
|
351
|
+
};
|
|
352
|
+
/**
|
|
353
|
+
* The screen a request opens on: the visit it names, or the landing (the visits when one is ahead, otherwise
|
|
354
|
+
* a new booking). What `EverfurTelevetHost` and a partner's own presenter both use, so the two cannot open the
|
|
355
|
+
* same request on different screens.
|
|
356
|
+
*/
|
|
357
|
+
declare function televetScreenForRequest(request: EverfurTelevetFlowRequest): TelevetScreen;
|
|
358
|
+
/** How the flow's own stack relates to the browser's history. */
|
|
359
|
+
type TelevetHistoryMode = 'memory' | 'browser';
|
|
360
|
+
interface EverfurTelevetProps {
|
|
361
|
+
/** The pet the visit is for. Seeds the draft; a one-pet roster skips the picker entirely. */
|
|
362
|
+
readonly petRef?: PetRef | null;
|
|
363
|
+
/** The owner's two-letter US state. The SDK never reads a browser location for it. */
|
|
364
|
+
readonly usState?: string | null;
|
|
365
|
+
/** Host/test seam: inject a booking controller instead of building one from the provider's session. */
|
|
366
|
+
readonly controller?: TelevetBookingController;
|
|
367
|
+
readonly onBooked?: (consult: TelevetConsult) => void;
|
|
368
|
+
/** The root screen's exit; absent, the root's Close does nothing and the host owns leaving. */
|
|
369
|
+
readonly onExit?: () => void;
|
|
370
|
+
readonly onAddPet?: () => void;
|
|
371
|
+
readonly onPickMedia?: TelevetMediaPicker;
|
|
372
|
+
readonly onAddToCalendar?: TelevetCalendarWriter;
|
|
373
|
+
readonly onConfirmDiscard?: TelevetDiscardConfirm;
|
|
374
|
+
readonly onRequestLocation?: () => void;
|
|
375
|
+
readonly locationStatus?: TelevetLocationStatus;
|
|
376
|
+
/**
|
|
377
|
+
* THE PET'S OWN CLINIC, for the emergency screen's exit row. The partner wire has no primary-vet concept,
|
|
378
|
+
* so a host that holds its customer's clinic passes it here and gets the consumer's exact row.
|
|
379
|
+
*/
|
|
380
|
+
readonly primaryVet?: TelevetPrimaryVet | null;
|
|
381
|
+
/**
|
|
382
|
+
* THE EMERGENCY SCREEN'S "Find an emergency vet near you" ROW. The SDK has no clinic directory and opens
|
|
383
|
+
* nothing outside the page, so the row renders only when the host can take the member to one of its own.
|
|
384
|
+
*/
|
|
385
|
+
readonly onFindEmergencyVet?: () => void;
|
|
386
|
+
/**
|
|
387
|
+
* The emergency question asked after Describe. Absent, the question is asked at Confirm by the server, as
|
|
388
|
+
* it is today: the partner plane serves no triage route. See `EverfurTelevetBooking`.
|
|
389
|
+
*/
|
|
390
|
+
readonly onTriageReason?: TelevetTriageRead;
|
|
391
|
+
/**
|
|
392
|
+
* How the flow's stack relates to the browser's history. `memory` by default, which never touches
|
|
393
|
+
* `history`: a widget embedded in someone else's page must not take over their back button.
|
|
394
|
+
*/
|
|
395
|
+
readonly historyMode?: TelevetHistoryMode;
|
|
396
|
+
/**
|
|
397
|
+
* Has the host mounted the call surface (`@everfur/sdk/web/televet/call`)? Defaults to FALSE.
|
|
398
|
+
*
|
|
399
|
+
* Fail closed. A partner that has not said so gets a confirmation that promises only what it can keep.
|
|
400
|
+
*/
|
|
401
|
+
readonly canJoinInApp?: boolean;
|
|
402
|
+
/**
|
|
403
|
+
* Replace what is shown when the in-page booking surface is not served for this tenant.
|
|
404
|
+
*
|
|
405
|
+
* The default is the paused card inside the booking chrome, whose Close is the way out: nothing leaves the
|
|
406
|
+
* page. A partner that wants the hosted visit offered here opts in explicitly:
|
|
407
|
+
* `renderUnavailable={() => <VetVisitButton prefer="redirect" />}`.
|
|
408
|
+
*/
|
|
409
|
+
readonly renderUnavailable?: () => ReactNode;
|
|
410
|
+
/** The screen the flow starts on; `home` (the visits when one is ahead, otherwise booking) when omitted. */
|
|
411
|
+
readonly initialScreen?: TelevetScreen;
|
|
412
|
+
/**
|
|
413
|
+
* The heading level this flow's title claims. Defaults to 2.
|
|
414
|
+
*
|
|
415
|
+
* A DROP-IN WIDGET DOES NOT OWN YOUR PAGE'S `<h1>`. Pass 1 only when the flow IS the page in your app; every
|
|
416
|
+
* heading inside the flow then follows one level below. See `src/web/headingLevel.ts`.
|
|
417
|
+
*/
|
|
418
|
+
readonly headingLevel?: number;
|
|
419
|
+
readonly style?: CSSProperties;
|
|
420
|
+
/** Your own placeholder while the entitlement verdict is pending on a cold mount. */
|
|
421
|
+
readonly renderPending?: () => ReactNode;
|
|
422
|
+
/** A class the host may hang its own layout rules on; the SDK sets no classes of its own. */
|
|
423
|
+
readonly className?: string;
|
|
424
|
+
}
|
|
425
|
+
declare function EverfurTelevetFlow(props: EverfurTelevetProps): ReactNode;
|
|
426
|
+
/** The public prebuilt televet surface: the flow, landing on the visits or the booking. */
|
|
427
|
+
declare const EverfurTelevet: typeof EverfurTelevetFlow;
|
|
428
|
+
|
|
429
|
+
interface EverfurTelevetDialogProps {
|
|
430
|
+
/** What was opened: the pet and state for a booking, or the visit a reminder named. */
|
|
431
|
+
readonly request: EverfurTelevetFlowRequest;
|
|
432
|
+
/** Close the dialog. Called by the flow's own exits and by an Escape no screen handled. */
|
|
433
|
+
readonly onClose: () => void;
|
|
434
|
+
}
|
|
435
|
+
/** The in-page vet visit in a modal dialog. */
|
|
436
|
+
declare function EverfurTelevetDialog({ request, onClose }: EverfurTelevetDialogProps): ReactNode;
|
|
437
|
+
|
|
438
|
+
interface TelevetJoinScreenProps {
|
|
439
|
+
/** The consult to join. */
|
|
440
|
+
readonly consultId: string;
|
|
441
|
+
/** Host/test seam: inject a booking controller instead of building one from the provider's session. */
|
|
442
|
+
readonly controller?: TelevetBookingController | undefined;
|
|
443
|
+
/** Shown in the lobby while the clinician has not joined. Never invented. */
|
|
444
|
+
readonly clinicianName?: string | null | undefined;
|
|
445
|
+
/** The pet's name for the lobby's prep line. */
|
|
446
|
+
readonly petName?: string | null | undefined;
|
|
447
|
+
/** The way out: the member left the call, declined the notice, or pressed Leave on a refusal. */
|
|
448
|
+
readonly onLeave: () => void;
|
|
449
|
+
readonly style?: CSSProperties | undefined;
|
|
450
|
+
}
|
|
451
|
+
/** Mint the room credential for one consult and join it in the page. */
|
|
452
|
+
declare function TelevetJoinScreen({ consultId, controller: injected, clinicianName, petName, onLeave, style }: TelevetJoinScreenProps): ReactNode;
|
|
453
|
+
|
|
454
|
+
interface TelevetVisitsScreenProps {
|
|
455
|
+
/** Host/test seam: inject a booking controller instead of building one from the provider's session. */
|
|
456
|
+
readonly controller?: TelevetBookingController | undefined;
|
|
457
|
+
/** Join a visit: the flow mints the credential and opens the call behind the recording notice. */
|
|
458
|
+
readonly onJoin: (consult: TelevetConsult, petName: string | null) => void;
|
|
459
|
+
/** Move a visit. Absent, the control is omitted rather than rendered inert. */
|
|
460
|
+
readonly onReschedule?: ((consult: TelevetConsult) => void) | undefined;
|
|
461
|
+
/** Start a new booking. Absent, the book card is omitted. */
|
|
462
|
+
readonly onBook?: (() => void) | undefined;
|
|
463
|
+
/** Leave the visits: back to the screen under them, or out of the flow from its first screen. */
|
|
464
|
+
readonly onBack: () => void;
|
|
465
|
+
/** True when the visits are the flow's first screen, so the way out is the close control rather than Back. */
|
|
466
|
+
readonly isRoot?: boolean | undefined;
|
|
467
|
+
/** Bumped by the flow after a booking, a move or a call, so the list is read again. */
|
|
468
|
+
readonly revision?: number | undefined;
|
|
469
|
+
/** Injected by tests, so the split and the window can sit on either side of a boundary. */
|
|
470
|
+
readonly nowMs?: number | undefined;
|
|
471
|
+
readonly style?: CSSProperties | undefined;
|
|
472
|
+
}
|
|
473
|
+
declare function TelevetVisitsScreen({ controller: injected, onJoin, onReschedule, onBook, onBack, isRoot, revision, nowMs, style, }: TelevetVisitsScreenProps): ReactNode;
|
|
474
|
+
|
|
475
|
+
type Css = CSSProperties;
|
|
476
|
+
declare function makeVisitStyles(theme: EverfurTheme): {
|
|
477
|
+
screen: Css;
|
|
478
|
+
topBar: Css;
|
|
479
|
+
topBarStart: Css;
|
|
480
|
+
iconButton: Css;
|
|
481
|
+
textButton: Css;
|
|
482
|
+
panel: Css;
|
|
483
|
+
panelBody: Css;
|
|
484
|
+
panelHeader: Css;
|
|
485
|
+
panelTitle: Css;
|
|
486
|
+
count: Css;
|
|
487
|
+
bookTitle: Css;
|
|
488
|
+
list: Css;
|
|
489
|
+
row: Css;
|
|
490
|
+
rowHead: Css;
|
|
491
|
+
when: Css;
|
|
492
|
+
pet: Css;
|
|
493
|
+
chip: Css;
|
|
494
|
+
chipPositive: Css;
|
|
495
|
+
actions: Css;
|
|
496
|
+
note: Css;
|
|
497
|
+
notice: Css;
|
|
498
|
+
noticeTitle: Css;
|
|
499
|
+
noticeDanger: Css;
|
|
500
|
+
form: Css;
|
|
501
|
+
label: Css;
|
|
502
|
+
textarea: Css;
|
|
503
|
+
fieldError: Css;
|
|
504
|
+
empty: Css;
|
|
505
|
+
skeletons: Css;
|
|
506
|
+
};
|
|
507
|
+
type VisitStyles = ReturnType<typeof makeVisitStyles>;
|
|
508
|
+
|
|
509
|
+
type TelevetCancelTerms = {
|
|
510
|
+
readonly status: 'loading';
|
|
511
|
+
} | {
|
|
512
|
+
readonly status: 'ready';
|
|
513
|
+
readonly summary: string;
|
|
514
|
+
} | {
|
|
515
|
+
readonly status: 'error';
|
|
516
|
+
};
|
|
517
|
+
interface TelevetCancelVisitFormProps {
|
|
518
|
+
readonly terms: TelevetCancelTerms;
|
|
519
|
+
readonly submitting: boolean;
|
|
520
|
+
/** The line to show when the last attempt did not land, or null. */
|
|
521
|
+
readonly failure: string | null;
|
|
522
|
+
readonly onConfirm: (reason: string) => void;
|
|
523
|
+
readonly onDismiss: () => void;
|
|
524
|
+
readonly onRetryTerms: () => void;
|
|
525
|
+
readonly styles: VisitStyles;
|
|
526
|
+
}
|
|
527
|
+
declare function TelevetCancelVisitForm({ terms, submitting, failure, onConfirm, onDismiss, onRetryTerms, styles, }: TelevetCancelVisitFormProps): ReactNode;
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* The emergency interstitial's cards: ownerCopy.ts:1074-1077, rendered by `EmergencyInterstitial`
|
|
531
|
+
* (BookingFunnel.tsx:713-774). The number is the web app's own dialled constant (BookingFunnel.tsx:643), the
|
|
532
|
+
* same one its emergency notice gives in words, never parsed back out of the displayed line.
|
|
533
|
+
*/
|
|
534
|
+
declare const TELEVET_EMERGENCY_EXITS_WEB: Readonly<{
|
|
535
|
+
findEmergencyVet: "Find an emergency vet near you";
|
|
536
|
+
poisonControl: "ASPCA Animal Poison Control";
|
|
537
|
+
poisonControlDetail: "(888) 426-4435 · a fee may apply";
|
|
538
|
+
poisonControlTel: "tel:+18884264435";
|
|
539
|
+
}>;
|
|
540
|
+
declare const TELEVET_BOOKING_COPY_WEB: Readonly<{
|
|
541
|
+
/** :1037. The same words as the shared deck, restated so the web deck is complete for this screen. */
|
|
542
|
+
petSelectTitle: "Who is this visit for?";
|
|
543
|
+
/** :1054. The shared deck's "or Type to the vet what you're seeing" kept an "or" from a removed option. */
|
|
544
|
+
describeHeading: "Type to the vet what you're seeing";
|
|
545
|
+
/** :1056 `describeHint`, the web frame's line under that heading. */
|
|
546
|
+
describeHelpLong: "Describe the issues your pet is experiencing";
|
|
547
|
+
/** see-a-vet/copy.ts:264 `intakeStepTwoCopy.detail.placeholder`, which the web funnel's textarea uses. */
|
|
548
|
+
reasonPlaceholder: "She's been scratching her left ear a lot this week...";
|
|
549
|
+
/** :1094 `vetHeading`. The shared deck's "Your Vet" is the mobile card's title. */
|
|
550
|
+
yourVetTitle: "Which vet would you like to see?";
|
|
551
|
+
/** :1113 `timeHeading`. */
|
|
552
|
+
timeHeading: "Pick a date and time";
|
|
553
|
+
/** :1116 `reviewHeading`, drawn on the web frame where the mobile review draws none. */
|
|
554
|
+
reviewHeading: "Does this look right?";
|
|
555
|
+
/**
|
|
556
|
+
* :1047 `issuesHeading`, :1049 `issuesHint`, :1051 `otherIssue`. `{pet}` is DATA. The apostrophe is the
|
|
557
|
+
* web deck's typographic one, character for character.
|
|
558
|
+
*/
|
|
559
|
+
issuesHeadingTemplate: "Select {pet}’s main issues";
|
|
560
|
+
issuesHint: "Can select more than 1";
|
|
561
|
+
otherIssue: "Other";
|
|
562
|
+
/** :1129 `bookedHeading`. `{vet}` is the booked clinician's served name; without one the shared title stays. */
|
|
563
|
+
bookedHeadingTemplate: "You're booked with {vet}";
|
|
564
|
+
/** :1141, capital C as the web frame draws it. */
|
|
565
|
+
addToCalendarCta: "Add to Calendar";
|
|
566
|
+
/** see-a-vet/copy.ts `statePolicyNoticeCopy.back`, the funnel's Back (FunnelFrame, BookingFunnel.tsx:280). */
|
|
567
|
+
backLabel: "Back";
|
|
568
|
+
/**
|
|
569
|
+
* The emergency interstitial (`Desktop - 18`): ownerCopy.ts:1069, :1071-1072, :1085 and :1091.
|
|
570
|
+
*
|
|
571
|
+
* "PLEASE CALL ONE OF THESE FIRST." ONLY OVER CARDS THAT ARE THERE. The consumer web draws its cards on every
|
|
572
|
+
* warning, so its lede can point at them. The SDK draws a card only when the host gave it one (a locator, the
|
|
573
|
+
* pet's clinic) or the owner approves poison control, so a warning with none reads `ledeWithoutExits`: the
|
|
574
|
+
* consumer MOBILE deck's lede for exactly that state (everfur-mobile copy.ts:726-730, "it must not tell an
|
|
575
|
+
* owner to call a list that is absent from the screen"), which is the shared deck's value.
|
|
576
|
+
*/
|
|
577
|
+
emergency: Readonly<{
|
|
578
|
+
bannerTitle: "This can't wait for a scheduled call.";
|
|
579
|
+
lede: "What you're describing is the kind of thing vets want to see in person, now. Please call one of these first.";
|
|
580
|
+
ledeWithoutExits: string;
|
|
581
|
+
keepBookingCta: "I've handled this, continue with booking";
|
|
582
|
+
exitPrimaryVetTitle: "Call {petName}'s primary vet";
|
|
583
|
+
exitFindErTitle: string;
|
|
584
|
+
startCallHint: string;
|
|
585
|
+
}>;
|
|
586
|
+
stateBlockedTitle: string;
|
|
587
|
+
noCliniciansTitle: string;
|
|
588
|
+
noCliniciansBody: string;
|
|
589
|
+
noCliniciansRetryCta: string;
|
|
590
|
+
noCliniciansRegionBody: string;
|
|
591
|
+
reviewsLabel: string;
|
|
592
|
+
rescheduleFromTemplate: string;
|
|
593
|
+
rescheduleFailed: string;
|
|
594
|
+
keepExistingCta: string;
|
|
595
|
+
bookingPausedTitle: string;
|
|
596
|
+
slotsErrorTitle: string;
|
|
597
|
+
noSlotsTitle: string;
|
|
598
|
+
nextOpeningTemplate: string;
|
|
599
|
+
seeOtherVetsCta: string;
|
|
600
|
+
retryCta: string;
|
|
601
|
+
holdExpired: string;
|
|
602
|
+
slotTaken: string;
|
|
603
|
+
reasonTooLong: string;
|
|
604
|
+
shareRecordsOff: string;
|
|
605
|
+
confirmNotEntitled: string;
|
|
606
|
+
confirmFailed: string;
|
|
607
|
+
checkAvailabilityCta: string;
|
|
608
|
+
stateInterest: Readonly<{
|
|
609
|
+
cta: string;
|
|
610
|
+
submitting: string;
|
|
611
|
+
joinedTitle: string;
|
|
612
|
+
joinedBody: string;
|
|
613
|
+
failed: string;
|
|
614
|
+
}>;
|
|
615
|
+
media: Readonly<{
|
|
616
|
+
droppedTemplate: string;
|
|
617
|
+
droppedPluralTemplate: string;
|
|
618
|
+
refusedSizeTemplate: string;
|
|
619
|
+
refusedSizePluralTemplate: string;
|
|
620
|
+
refusedTypeTemplate: string;
|
|
621
|
+
refusedTypePluralTemplate: string;
|
|
622
|
+
refusedUnreadableTemplate: string;
|
|
623
|
+
refusedUnreadablePluralTemplate: string;
|
|
624
|
+
}>;
|
|
625
|
+
navTitle: string;
|
|
626
|
+
rescheduleNavTitle: string;
|
|
627
|
+
close: string;
|
|
628
|
+
continueCta: string;
|
|
629
|
+
addPetCta: string;
|
|
630
|
+
locationUnknownTitle: string;
|
|
631
|
+
locationUnknownBody: string;
|
|
632
|
+
locationUnknownCta: string;
|
|
633
|
+
locationBlockedTitle: string;
|
|
634
|
+
locationBlockedBody: string;
|
|
635
|
+
locationBlockedCta: string;
|
|
636
|
+
locationUnavailableTitle: string;
|
|
637
|
+
locationUnavailableBody: string;
|
|
638
|
+
stateAttestTemplate: string;
|
|
639
|
+
addPhotoCta: string;
|
|
640
|
+
removePhotoLabel: string;
|
|
641
|
+
summaryPet: string;
|
|
642
|
+
summaryVet: string;
|
|
643
|
+
summaryWhen: string;
|
|
644
|
+
summaryLength: string;
|
|
645
|
+
summaryReason: string;
|
|
646
|
+
summaryLengthTemplate: string;
|
|
647
|
+
confirmCta: string;
|
|
648
|
+
bookedTitle: string;
|
|
649
|
+
doneCta: string;
|
|
650
|
+
booked: Readonly<{
|
|
651
|
+
remindPromise: string;
|
|
652
|
+
summaryPromise: string;
|
|
653
|
+
joinPromise: string;
|
|
654
|
+
backToPet: string;
|
|
655
|
+
calendarAdded: string;
|
|
656
|
+
calendarFailedBody: string;
|
|
657
|
+
}>;
|
|
658
|
+
chrome: Readonly<{
|
|
659
|
+
closeHint: string;
|
|
660
|
+
discardTitle: string;
|
|
661
|
+
discardBody: string;
|
|
662
|
+
discardConfirmCta: string;
|
|
663
|
+
discardKeepCta: string;
|
|
664
|
+
noPetsTitle: string;
|
|
665
|
+
loadFailedTitle: string;
|
|
666
|
+
retryCta: string;
|
|
667
|
+
}>;
|
|
668
|
+
visit: Readonly<{
|
|
669
|
+
title: string;
|
|
670
|
+
}>;
|
|
671
|
+
loading: Readonly<{
|
|
672
|
+
pets: "Loading pets. Nothing to read yet.";
|
|
673
|
+
clinicians: "Loading vets. Nothing to read yet.";
|
|
674
|
+
slots: "Loading times. Nothing to read yet.";
|
|
675
|
+
consult: "Loading your visit. Nothing to read yet.";
|
|
676
|
+
progressTemplate: "Step {step} of {total}";
|
|
677
|
+
}>;
|
|
678
|
+
}>;
|
|
679
|
+
|
|
680
|
+
interface EverfurTelevetRescheduleProps {
|
|
681
|
+
/** The consult being moved. Null while the host is still loading it. */
|
|
682
|
+
readonly consult: TelevetConsult | null;
|
|
683
|
+
readonly onRescheduled?: (moved: TelevetConsult) => void;
|
|
684
|
+
/** Backing out. Never destructive: the original consult is left exactly as it was. */
|
|
685
|
+
readonly onCancel?: () => void;
|
|
686
|
+
/** Host/test seam: inject a booking controller instead of building one from the provider's session. */
|
|
687
|
+
readonly controller?: TelevetBookingController;
|
|
688
|
+
readonly style?: CSSProperties;
|
|
689
|
+
readonly testID?: string;
|
|
690
|
+
}
|
|
691
|
+
declare function EverfurTelevetReschedule(props: EverfurTelevetRescheduleProps): ReactNode;
|
|
692
|
+
|
|
693
|
+
interface TelevetDay {
|
|
694
|
+
readonly key: string;
|
|
695
|
+
readonly iso: string;
|
|
696
|
+
readonly weekday: string;
|
|
697
|
+
readonly dayNumber: string;
|
|
698
|
+
}
|
|
699
|
+
interface TelevetDayStripProps {
|
|
700
|
+
readonly slots: readonly TelevetSlot[];
|
|
701
|
+
readonly selectedDayKey: string | null;
|
|
702
|
+
readonly onSelectDay: (day: TelevetDay) => void;
|
|
703
|
+
/**
|
|
704
|
+
* The group's accessible name.
|
|
705
|
+
*
|
|
706
|
+
* A PROP WITH NO DEFAULT STRING IN THIS FILE. Naming the group is required for the radiogroup to be
|
|
707
|
+
* announced usefully, and the name is user-facing copy, which this SDK does not author. The slot picker
|
|
708
|
+
* passes the ported deck's own heading down.
|
|
709
|
+
*/
|
|
710
|
+
readonly groupLabel: string;
|
|
711
|
+
}
|
|
712
|
+
/** The day strip. Renders nothing when the window holds no readable day. */
|
|
713
|
+
declare function TelevetDayStrip({ slots, selectedDayKey, onSelectDay, groupLabel }: TelevetDayStripProps): ReactNode;
|
|
714
|
+
/**
|
|
715
|
+
* The distinct local days the slots cover, in server order.
|
|
716
|
+
*
|
|
717
|
+
* Exported for the picker, which needs the first day to seed the selection, and for the suite. Identical to
|
|
718
|
+
* the RN implementation: this is pure data and the port changes nothing about it.
|
|
719
|
+
*/
|
|
720
|
+
declare function televetDaysFromSlots(slots: readonly TelevetSlot[]): readonly TelevetDay[];
|
|
721
|
+
|
|
722
|
+
interface TelevetSlotPickerProps {
|
|
723
|
+
/** The server's full window. Never truncated: the day filter is what bounds it. */
|
|
724
|
+
readonly slots: readonly TelevetSlot[];
|
|
725
|
+
/** The slot whose hold is in flight, or null. Disables the whole grid. */
|
|
726
|
+
readonly busySlotId: string | null;
|
|
727
|
+
readonly onPick: (slot: TelevetSlot) => void;
|
|
728
|
+
/** Rendered above the strip, for example a failure line from the container. */
|
|
729
|
+
readonly header?: ReactNode;
|
|
730
|
+
/**
|
|
731
|
+
* The accessible name for the day strip and the time grid.
|
|
732
|
+
*
|
|
733
|
+
* Required, with no default written here: it is user-facing copy and this SDK authors none. The containers
|
|
734
|
+
* pass the ported deck's own headings down.
|
|
735
|
+
*/
|
|
736
|
+
readonly dayGroupLabel: string;
|
|
737
|
+
readonly timeGroupLabel: string;
|
|
738
|
+
readonly rowTestIdPrefix?: string;
|
|
739
|
+
readonly testID?: string;
|
|
740
|
+
}
|
|
741
|
+
declare function TelevetSlotPicker({ slots, busySlotId, onPick, header, dayGroupLabel, timeGroupLabel, rowTestIdPrefix, testID, }: TelevetSlotPickerProps): ReactNode;
|
|
742
|
+
|
|
743
|
+
/** One "label ... value" row in the summary card, as a bound `<dt>` / `<dd>` pair. */
|
|
744
|
+
declare function TelevetSummaryRow({ label, value, last, testID, }: {
|
|
745
|
+
readonly label: string;
|
|
746
|
+
readonly value: string;
|
|
747
|
+
/** The last row draws no divider, so the card does not end on a line. */
|
|
748
|
+
readonly last?: boolean;
|
|
749
|
+
readonly testID?: string;
|
|
750
|
+
}): ReactNode;
|
|
751
|
+
/**
|
|
752
|
+
* A consent tick.
|
|
753
|
+
*
|
|
754
|
+
* A REAL CHECKBOX. `accessibilityRole="checkbox"` with a `checked` state is what makes a screen reader announce
|
|
755
|
+
* it as an agreement rather than a button; in the DOM the element itself does that, and also brings focus,
|
|
756
|
+
* Space-to-toggle and the label-wraps-input behaviour for free.
|
|
757
|
+
*/
|
|
758
|
+
declare function TelevetConsentCheckbox({ label, checked, onToggle, testID, }: {
|
|
759
|
+
readonly label: string;
|
|
760
|
+
readonly checked: boolean;
|
|
761
|
+
readonly onToggle: (next: boolean) => void;
|
|
762
|
+
readonly testID?: string;
|
|
763
|
+
}): ReactNode;
|
|
764
|
+
/** The summary card's own frame, exported so the container does not re-declare it. */
|
|
765
|
+
declare function TelevetSummaryCard({ children, testID }: {
|
|
766
|
+
readonly children: ReactNode;
|
|
767
|
+
readonly testID?: string;
|
|
768
|
+
}): ReactNode;
|
|
769
|
+
|
|
770
|
+
export { BACK_LABEL, type EverfurHeadingLevel, EverfurTelevet, EverfurTelevetBooking, type EverfurTelevetBookingProps, EverfurTelevetDialog, type EverfurTelevetDialogProps, EverfurTelevetFlow, EverfurTelevetFlowRequest, type EverfurTelevetProps, EverfurTelevetReschedule, type EverfurTelevetRescheduleProps, PetRef, TELEVET_BOOKING_COPY_WEB, TELEVET_EMERGENCY_EXITS_WEB, TelevetBookedScreen, type TelevetBookedScreenProps, TelevetBookingChrome, type TelevetBookingChromeProps, TelevetBookingController, TelevetBookingStep, type TelevetCalendarEvent, type TelevetCalendarWriter, type TelevetCancelTerms, TelevetCancelVisitForm, type TelevetCancelVisitFormProps, TelevetClinicianEmptyState, type TelevetClinicianEmptyStateProps, TelevetConsentCheckbox, TelevetConsult, type TelevetDay, TelevetDayStrip, type TelevetDayStripProps, type TelevetDiscardConfirm, TelevetEarlyEmergency, type TelevetEarlyEmergencyProps, TelevetEmergencyExits, type TelevetEmergencyExitsProps, TelevetEmptyRosterCause, TelevetEntitlementInterestState, type TelevetEntitlementInterestStateProps, type TelevetHistoryMode, TelevetIntakeMedia, type TelevetIntakeMediaItem, type TelevetIntakeMediaProps, TelevetJoinScreen, type TelevetJoinScreenProps, type TelevetLocationStatus, TelevetMediaDropNotice, type TelevetMediaDropNoticeProps, type TelevetMediaPicker, TelevetMediaShortfall, type TelevetPrimaryVet, type TelevetScreen, TelevetSlot, TelevetSlotPicker, type TelevetSlotPickerProps, TelevetStateInterestAction, type TelevetStateInterestActionProps, TelevetStateInterestAction$1 as TelevetStateInterestLifecycle, TelevetStateInterestWrite, TelevetSummaryCard, TelevetSummaryRow, TelevetTriageRead, TelevetVisitsScreen, type TelevetVisitsScreenProps, VetVisitIntent, televetConsultCalendarKey, televetDaysFromSlots, televetScreenForRequest };
|