@everfur/sdk 0.1.1 → 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 (219) hide show
  1. package/CHANGELOG.md +703 -4
  2. package/README.md +63 -23
  3. package/consent/package.json +8 -0
  4. package/dist/Chat-BZZ-Py5l.d.ts +128 -0
  5. package/dist/Chat-Dq4fffIO.d.cts +128 -0
  6. package/dist/DepthViews-BG3E25MD.d.ts +16 -0
  7. package/dist/DepthViews-B_hIypI6.d.cts +19 -0
  8. package/dist/DepthViews-CL75jyRA.d.cts +16 -0
  9. package/dist/DepthViews-CkYri51q.d.ts +19 -0
  10. package/dist/ErrorPolicyPort-CNf4uQZP.d.cts +22 -0
  11. package/dist/ErrorPolicyPort-CwbfmxzJ.d.ts +22 -0
  12. package/dist/{EverfurResult-D92-uL82.d.cts → EverfurResult-DN9pL2Ab.d.cts} +11 -10
  13. package/dist/{EverfurResult-D92-uL82.d.ts → EverfurResult-DN9pL2Ab.d.ts} +11 -10
  14. package/dist/{PhotoController-BItt5M7u.d.cts → PhotoController-3l7MT9jA.d.cts} +1 -1
  15. package/dist/{PhotoController-D8zMTdcW.d.ts → PhotoController-vzY5bfY_.d.ts} +1 -1
  16. package/dist/animations/index.cjs +1 -1997
  17. package/dist/animations/index.d.cts +35 -35
  18. package/dist/animations/index.d.ts +35 -35
  19. package/dist/animations/index.js +1 -1972
  20. package/dist/attachments-BorG422I.d.cts +146 -0
  21. package/dist/attachments-BrUWQYNK.d.ts +257 -0
  22. package/dist/attachments-D_SECjr1.d.cts +257 -0
  23. package/dist/attachments-DpldrvIW.d.ts +146 -0
  24. package/dist/bookingCopy-CqtDYvCR.d.ts +732 -0
  25. package/dist/bookingCopy-SREvkG19.d.cts +732 -0
  26. package/dist/branding-CsRdeNwK.d.cts +566 -0
  27. package/dist/branding-CsRdeNwK.d.ts +566 -0
  28. package/dist/callCopy-DoQKG3-L.d.cts +40 -0
  29. package/dist/callCopy-DoQKG3-L.d.ts +40 -0
  30. package/dist/casesRepository-DwtZVsbj.d.cts +51 -0
  31. package/dist/casesRepository-v6QczS9N.d.ts +51 -0
  32. package/dist/chat/index.cjs +1 -1170
  33. package/dist/chat/index.d.cts +32 -53
  34. package/dist/chat/index.d.ts +32 -53
  35. package/dist/chat/index.js +1 -1167
  36. package/dist/client/index.cjs +9 -2315
  37. package/dist/client/index.d.cts +80 -16
  38. package/dist/client/index.d.ts +80 -16
  39. package/dist/client/index.js +9 -2215
  40. package/dist/{config-CiJ0PVBB.d.ts → config--Wu1Umhd.d.cts} +64 -26
  41. package/dist/{config-BSjBdxrZ.d.cts → config-C7eb_IMD.d.ts} +64 -26
  42. package/dist/consent/index.cjs +1 -0
  43. package/dist/consent/index.d.cts +33 -0
  44. package/dist/consent/index.d.ts +33 -0
  45. package/dist/consent/index.js +1 -0
  46. package/dist/context-CL3lyuy1.d.cts +159 -0
  47. package/dist/context-CahAEha8.d.ts +159 -0
  48. package/dist/copy-DdVFDL01.d.ts +198 -0
  49. package/dist/copy-UeUJVk8X.d.cts +198 -0
  50. package/dist/core/index.cjs +13 -3178
  51. package/dist/core/index.d.cts +164 -29
  52. package/dist/core/index.d.ts +164 -29
  53. package/dist/core/index.js +13 -3166
  54. package/dist/depth-D5HwcvKC.d.cts +533 -0
  55. package/dist/depth-DvPwPuT_.d.ts +533 -0
  56. package/dist/entitlementRepository-B7egEdW6.d.ts +43 -0
  57. package/dist/entitlementRepository-BpJ7tiwl.d.cts +43 -0
  58. package/dist/{identity-Brl-lDd6.d.cts → identity-C2-08BZW.d.cts} +20 -7
  59. package/dist/{identity-DK9zORrG.d.ts → identity-CEi9GRFZ.d.ts} +20 -7
  60. package/dist/{ids-CJ1S6adf.d.cts → ids-B2GAAifq.d.cts} +1 -1
  61. package/dist/{ids-CJ1S6adf.d.ts → ids-B2GAAifq.d.ts} +1 -1
  62. package/dist/index.cjs +12 -4494
  63. package/dist/index.d.cts +30 -121
  64. package/dist/index.d.ts +30 -121
  65. package/dist/index.js +12 -4470
  66. package/dist/models-B-Uh2LTf.d.ts +214 -0
  67. package/dist/models-D2EUxPZY.d.cts +214 -0
  68. package/dist/notifications/index.cjs +2 -0
  69. package/dist/notifications/index.d.cts +17 -0
  70. package/dist/notifications/index.d.ts +17 -0
  71. package/dist/notifications/index.js +2 -0
  72. package/dist/optionalModule-DbJmsq5f.d.cts +21 -0
  73. package/dist/optionalModule-DbJmsq5f.d.ts +21 -0
  74. package/dist/pets-DJv2sj2H.d.ts +92 -0
  75. package/dist/pets-JVCXgRgR.d.cts +92 -0
  76. package/dist/petsRepository-B_gKbAzJ.d.cts +142 -0
  77. package/dist/petsRepository-Bk6GDwLs.d.ts +142 -0
  78. package/dist/photo/index.cjs +1 -2189
  79. package/dist/photo/index.d.cts +6 -6
  80. package/dist/photo/index.d.ts +6 -6
  81. package/dist/photo/index.js +1 -2186
  82. package/dist/ports-BN6RHF9W.d.cts +48 -0
  83. package/dist/ports-BN6RHF9W.d.ts +48 -0
  84. package/dist/ports-BY2ph0_y.d.cts +376 -0
  85. package/dist/ports-D7YW8qz9.d.ts +376 -0
  86. package/dist/profile-CSs1wlXT.d.cts +93 -0
  87. package/dist/profile-CSs1wlXT.d.ts +93 -0
  88. package/dist/records/depth/index.cjs +2 -0
  89. package/dist/records/depth/index.d.cts +13 -0
  90. package/dist/records/depth/index.d.ts +13 -0
  91. package/dist/records/depth/index.js +2 -0
  92. package/dist/records/index.cjs +3 -2839
  93. package/dist/records/index.d.cts +137 -203
  94. package/dist/records/index.d.ts +137 -203
  95. package/dist/records/index.js +3 -2833
  96. package/dist/requestFunnel-BjDpqqvm.d.cts +110 -0
  97. package/dist/requestFunnel-DFMGcluw.d.ts +110 -0
  98. package/dist/{resolve-Dq_4_agU.d.ts → resolve-D4Ywz5OS.d.cts} +10 -4
  99. package/dist/{resolve-Dq_4_agU.d.cts → resolve-D4Ywz5OS.d.ts} +10 -4
  100. package/dist/{runtime-Bvr8yqXm.d.cts → runtimeTypes-gZEJu-da.d.cts} +104 -132
  101. package/dist/{runtime-BIYzf9cK.d.ts → runtimeTypes-w5KqBMcs.d.ts} +104 -132
  102. package/dist/server/events/index.cjs +2 -0
  103. package/dist/server/events/index.d.cts +550 -0
  104. package/dist/server/events/index.d.ts +550 -0
  105. package/dist/server/events/index.js +2 -0
  106. package/dist/server/index.cjs +2 -533
  107. package/dist/server/index.d.cts +73 -18
  108. package/dist/server/index.d.ts +73 -18
  109. package/dist/server/index.js +2 -530
  110. package/dist/species-BXAIMh7I.d.cts +9 -0
  111. package/dist/species-BXAIMh7I.d.ts +9 -0
  112. package/dist/televet/booking/index.cjs +1 -0
  113. package/dist/televet/booking/index.d.cts +294 -0
  114. package/dist/televet/booking/index.d.ts +294 -0
  115. package/dist/televet/booking/index.js +1 -0
  116. package/dist/televet/call/index.cjs +1 -0
  117. package/dist/televet/call/index.d.cts +141 -0
  118. package/dist/televet/call/index.d.ts +141 -0
  119. package/dist/televet/call/index.js +1 -0
  120. package/dist/televet/index.cjs +1 -0
  121. package/dist/televet/index.d.cts +142 -0
  122. package/dist/televet/index.d.ts +142 -0
  123. package/dist/televet/index.js +1 -0
  124. package/dist/testing/index.cjs +5 -823
  125. package/dist/testing/index.d.cts +18 -4
  126. package/dist/testing/index.d.ts +18 -4
  127. package/dist/testing/index.js +5 -820
  128. package/dist/testing/rn/index.cjs +1 -449
  129. package/dist/testing/rn/index.d.cts +18 -29
  130. package/dist/testing/rn/index.d.ts +18 -29
  131. package/dist/testing/rn/index.js +1 -444
  132. package/dist/testing/web/index.cjs +1 -0
  133. package/dist/testing/web/index.d.cts +132 -0
  134. package/dist/testing/web/index.d.ts +132 -0
  135. package/dist/testing/web/index.js +1 -0
  136. package/dist/timelineRows-C15jxFFH.d.ts +19 -0
  137. package/dist/timelineRows-odO8g9r2.d.cts +19 -0
  138. package/dist/typeStyle-CKqVYD6L.d.cts +111 -0
  139. package/dist/typeStyle-DmoyacDG.d.ts +111 -0
  140. package/dist/uploadTransport-D0M0T4hN.d.ts +38 -0
  141. package/dist/uploadTransport-DKJHs3Yj.d.cts +38 -0
  142. package/dist/useRecordsDepth-C6rjEaLn.d.cts +237 -0
  143. package/dist/useRecordsDepth-crhBllQK.d.ts +237 -0
  144. package/dist/useVetVisit-Bc84hWUU.d.cts +187 -0
  145. package/dist/useVetVisit-CjmMa896.d.ts +187 -0
  146. package/dist/video/index.cjs +1 -1941
  147. package/dist/video/index.d.cts +4 -4
  148. package/dist/video/index.d.ts +4 -4
  149. package/dist/video/index.js +1 -1938
  150. package/dist/view-Bxwxp4xD.d.ts +310 -0
  151. package/dist/view-DyitEO0m.d.cts +310 -0
  152. package/dist/visitIntent-D7_yVp1I.d.cts +8 -0
  153. package/dist/visitIntent-D7_yVp1I.d.ts +8 -0
  154. package/dist/web/consent/index.cjs +1 -0
  155. package/dist/web/consent/index.d.cts +34 -0
  156. package/dist/web/consent/index.d.ts +34 -0
  157. package/dist/web/consent/index.js +1 -0
  158. package/dist/web/index.cjs +14 -0
  159. package/dist/web/index.d.cts +218 -0
  160. package/dist/web/index.d.ts +218 -0
  161. package/dist/web/index.js +14 -0
  162. package/dist/web/notifications/index.cjs +2 -0
  163. package/dist/web/notifications/index.d.cts +213 -0
  164. package/dist/web/notifications/index.d.ts +213 -0
  165. package/dist/web/notifications/index.js +2 -0
  166. package/dist/web/records/depth/index.cjs +2 -0
  167. package/dist/web/records/depth/index.d.cts +12 -0
  168. package/dist/web/records/depth/index.d.ts +12 -0
  169. package/dist/web/records/depth/index.js +2 -0
  170. package/dist/web/records/index.cjs +4 -0
  171. package/dist/web/records/index.d.cts +285 -0
  172. package/dist/web/records/index.d.ts +285 -0
  173. package/dist/web/records/index.js +4 -0
  174. package/dist/web/televet/booking/index.cjs +1 -0
  175. package/dist/web/televet/booking/index.d.cts +349 -0
  176. package/dist/web/televet/booking/index.d.ts +349 -0
  177. package/dist/web/televet/booking/index.js +1 -0
  178. package/dist/web/televet/call/index.cjs +1 -0
  179. package/dist/web/televet/call/index.d.cts +142 -0
  180. package/dist/web/televet/call/index.d.ts +142 -0
  181. package/dist/web/televet/call/index.js +1 -0
  182. package/dist/web/televet/index.cjs +1 -0
  183. package/dist/web/televet/index.d.cts +136 -0
  184. package/dist/web/televet/index.d.ts +136 -0
  185. package/dist/web/televet/index.js +1 -0
  186. package/notifications/package.json +8 -0
  187. package/package.json +266 -10
  188. package/records/depth/package.json +8 -0
  189. package/server/events/device-blocked.cjs +15 -0
  190. package/server/events/package.json +9 -0
  191. package/televet/booking/package.json +8 -0
  192. package/televet/call/package.json +8 -0
  193. package/televet/package.json +8 -0
  194. package/testing/web/native-blocked.cjs +12 -0
  195. package/testing/web/package.json +8 -0
  196. package/web/consent/native-blocked.cjs +12 -0
  197. package/web/consent/package.json +8 -0
  198. package/web/native-blocked.cjs +12 -0
  199. package/web/notifications/native-blocked.cjs +12 -0
  200. package/web/notifications/package.json +8 -0
  201. package/web/package.json +8 -0
  202. package/web/records/depth/native-blocked.cjs +12 -0
  203. package/web/records/depth/package.json +8 -0
  204. package/web/records/native-blocked.cjs +12 -0
  205. package/web/records/package.json +8 -0
  206. package/web/televet/booking/native-blocked.cjs +12 -0
  207. package/web/televet/booking/package.json +8 -0
  208. package/web/televet/call/native-blocked.cjs +12 -0
  209. package/web/televet/call/package.json +8 -0
  210. package/web/televet/native-blocked.cjs +12 -0
  211. package/web/televet/package.json +8 -0
  212. package/dist/ChatController-CKdBvPj2.d.ts +0 -146
  213. package/dist/ChatController-CpUMvvZf.d.cts +0 -146
  214. package/dist/FilePort-BabWrv7I.d.cts +0 -22
  215. package/dist/FilePort-BabWrv7I.d.ts +0 -22
  216. package/dist/petsRepository-BEGb97M9.d.cts +0 -326
  217. package/dist/petsRepository-Bu18r2kK.d.ts +0 -326
  218. package/dist/requestFunnel-DuUH-kAe.d.cts +0 -28
  219. package/dist/requestFunnel-dio5OmR9.d.ts +0 -28
@@ -0,0 +1,187 @@
1
+ import { c as EverfurResult, E as EverfurError } from './EverfurResult-DN9pL2Ab.cjs';
2
+ import { P as PetRef } from './ids-B2GAAifq.cjs';
3
+ import { V as VetVisitIntent } from './visitIntent-D7_yVp1I.cjs';
4
+
5
+ /** What the hosted page will open for a handoff minted with `visitRef`: the platform's own echo. */
6
+ interface VetVisitHandoffVisit {
7
+ /** The visit reference the handoff was minted for, as you sent it. */
8
+ readonly visitRef: string;
9
+ /** What the hosted page opens for it. `visit` when you named no intent. */
10
+ readonly intent: VetVisitIntent;
11
+ }
12
+ /** A minted handoff. Open `url` once, promptly; it expires at `expiresAt` and is spent by the first use. */
13
+ interface VetVisitHandoff {
14
+ /** The hosted Everfur page with the single-use token in its fragment. Never log or persist it. */
15
+ readonly url: string;
16
+ /** ISO-8601 timestamp from the server; about 120 seconds after the mint. */
17
+ readonly expiresAt: string;
18
+ /**
19
+ * Present only when the handoff was minted with `returnTo`: the opaque id the user comes back with on your
20
+ * registered return destination. Keep it to match the return (`parseVetVisitReturn`). It says nothing about
21
+ * the visit.
22
+ */
23
+ readonly flowId?: string;
24
+ /**
25
+ * Present only when the handoff was minted with `visitRef`: what the hosted page will open, echoed by the
26
+ * platform from what it stored with the handoff. The reference never rides the URL, so this is the only
27
+ * place to read it back. Absent on an ordinary booking handoff.
28
+ */
29
+ readonly visit?: VetVisitHandoffVisit;
30
+ }
31
+ /** Where a vet visit was opened from. `'chat'`: the user chose it inside partner Chat, for the chat's pet. */
32
+ type VetVisitEntry = 'chat';
33
+ /** Optional handoff settings. */
34
+ interface VetVisitHandoffOptions {
35
+ /**
36
+ * The KEY of a return destination your tenant registered with Everfur. After the hosted visit flow the user
37
+ * can go back to that destination, and only that one. Never a URL.
38
+ */
39
+ readonly returnTo?: string | null;
40
+ /** `'chat'` when the user opened the visit from Chat. Requires the pet the chat is about. */
41
+ readonly entry?: VetVisitEntry | null;
42
+ /**
43
+ * TV-01. The reference of a visit this member ALREADY has (the `visit_ref` the `visit.*` events carry, and
44
+ * the one `parseEverfurNotification` reads off a tapped push). The handoff then opens that visit instead of
45
+ * the booking funnel. Everfur resolves it at the mint against this member's own live link, so a reference
46
+ * that is not theirs is refused with the same words a malformed one gets: a `validationFailed` you cannot
47
+ * probe for visits with. At most 64 characters.
48
+ */
49
+ readonly visitRef?: string | null;
50
+ /**
51
+ * What to open for `visitRef`: the visit itself, its call, its summary or its messages. Absent means
52
+ * `visit`. An intent with no `visitRef` is refused locally, because it names a route with nothing to route
53
+ * to. A tapped push already carries the right one on `target.intent`.
54
+ */
55
+ readonly intent?: VetVisitIntent | null;
56
+ }
57
+ /** The state preflight's whole answer. Nothing about the account, the plan or the price. */
58
+ interface VetVisitAvailability {
59
+ /** True when a vet visit can be booked for the state asked about. False for every other reason, alike. */
60
+ readonly available: boolean;
61
+ }
62
+ /** A partner app's return from the hosted visit flow, read by `parseVetVisitReturn`. Only the flow id. */
63
+ interface VetVisitReturn {
64
+ /** The opaque flow id from the handoff that led to this return. */
65
+ readonly flowId: string;
66
+ }
67
+ /**
68
+ * The closed set a partner branches on, derived from the route's documented outcomes.
69
+ *
70
+ * - `sessionRequired`: the integration sent no signed session. Mint one on your backend
71
+ * (`@everfur/sdk/server` mintPartnerSession) and hand the token to `EverfurUser.getToken`.
72
+ * - `authRejected`: the session token was refused after the one refresh the SDK performs.
73
+ * - `accessDenied`: a signed session whose key or plan does not include vet visits.
74
+ * - `unavailable`: vet visits are off for this partner or for Everfur right now (the route answers 404).
75
+ * - `rateLimited`: this user or this partner has opened too many visits recently. Do not retry in a loop.
76
+ * - `sdkUpdateRequired`: the API refused this SDK version.
77
+ * - `invalidRequest`: the pet reference was refused (empty, or longer than 128 characters).
78
+ * - `network`: no response arrived (offline, DNS, timeout).
79
+ * - `serverError`: the API failed, or answered with something that is not a usable Everfur visit URL.
80
+ * - `popupBlocked`: web only. The browser refused to open the new tab.
81
+ * - `openFailed`: React Native only. The host could not open the URL.
82
+ * - `cancelled`: nothing to show. The visit tab was closed before it loaded, or the signed-in user changed
83
+ * while the handoff was being minted, so it was dropped rather than opened for the previous user.
84
+ * - `unknown`: anything else.
85
+ */
86
+ type VetVisitErrorReason = 'sessionRequired' | 'authRejected' | 'accessDenied' | 'unavailable' | 'rateLimited' | 'sdkUpdateRequired' | 'invalidRequest' | 'network' | 'serverError' | 'popupBlocked' | 'openFailed' | 'cancelled' | 'unknown';
87
+ /** Map a settled handoff failure to its closed reason. Total and pure. */
88
+ declare function vetVisitErrorReasonOf(error: EverfurError): VetVisitErrorReason;
89
+ /** Mints handoffs for the current session. Built by `useVetVisit`; injectable for tests. */
90
+ interface VetVisitController {
91
+ /**
92
+ * Mint one handoff. Optional `petRef` scopes the visit to the partner's pet, shown to the user after
93
+ * sign-in. `options` names a registered return destination and where the visit was opened from. Settles;
94
+ * never throws; never retries.
95
+ */
96
+ createHandoff(petRef?: PetRef | null, options?: VetVisitHandoffOptions): Promise<EverfurResult<VetVisitHandoff>>;
97
+ /**
98
+ * Ask whether a vet visit is available for a US state (for example `'CA'`). Settles. An injected controller
99
+ * without it is treated as unavailable wherever the hook needs the answer.
100
+ */
101
+ checkAvailability?(state: string): Promise<EverfurResult<VetVisitAvailability>>;
102
+ /** True only while Everfur has the vet entry inside Chat switched on. Never throws; any failure is false. */
103
+ chatEntryOpen?(): Promise<boolean>;
104
+ }
105
+ /**
106
+ * Read an Everfur return off the URL your registered return destination was opened with. Returns the opaque
107
+ * flow id you received from the handoff, or null for any URL that does not carry exactly one well-formed
108
+ * Everfur flow id in its query. It carries nothing about the visit, the pet or the account.
109
+ */
110
+ declare function parseVetVisitReturn(url: string): VetVisitReturn | null;
111
+
112
+ /** `idle` before a tap and after a successful open; `opening` while the handoff is minted; `error` after a failure. */
113
+ type VetVisitStatus = 'idle' | 'opening' | 'error';
114
+ /** What one `open()` call settled to. The URL is deliberately absent. */
115
+ type VetVisitOpenResult = {
116
+ readonly opened: true;
117
+ readonly flowId?: string;
118
+ } | {
119
+ readonly opened: false;
120
+ readonly reason: VetVisitErrorReason;
121
+ readonly error: EverfurError | null;
122
+ };
123
+ /** Options for `useVetVisit`. */
124
+ interface UseVetVisitOptions {
125
+ /** The partner's pet reference to scope the visit to. `open(petRef)` overrides it per call. */
126
+ readonly petRef?: PetRef | null;
127
+ /** Host/test seam: inject a controller instead of building one from the provider's session. */
128
+ readonly controller?: VetVisitController;
129
+ /**
130
+ * The KEY of a return destination your tenant registered with Everfur. The visit can then send the user back
131
+ * to it, and `open()` settles with the `flowId` that return will carry.
132
+ */
133
+ readonly returnTo?: string | null;
134
+ /**
135
+ * The user's US state (for example `'CA'`). When set, `available` stays false until Everfur confirms a visit
136
+ * is available there, so the entry is never shown to a user who could not book.
137
+ */
138
+ readonly usState?: string | null;
139
+ /**
140
+ * `'chat'` for the entry inside Chat. `available` then also needs Everfur's chat entry switch and a pet (the
141
+ * one the chat is about); the visit itself is the same hosted visit.
142
+ */
143
+ readonly entry?: VetVisitEntry | null;
144
+ }
145
+ /** What `useVetVisit` returns. The handoff URL is never part of it. */
146
+ interface UseVetVisitState {
147
+ /**
148
+ * True only when the server grants the `televet` capability AND the provider is scoped to a user. A handoff
149
+ * is minted from the user's session, so a publishable-key-only context could only ever spend a blank tab on
150
+ * a `sessionRequired` failure. A surface renders nothing otherwise.
151
+ */
152
+ readonly available: boolean;
153
+ /** True while the capability verdict is still resolving. */
154
+ readonly isPending: boolean;
155
+ /** Where the last `open()` is: idle, opening, or failed. */
156
+ readonly status: VetVisitStatus;
157
+ /** The settled failure of the last `open()`, or null. `error.displayMessage` is safe to show. */
158
+ readonly error: EverfurError | null;
159
+ /** The closed reason for the last failure, or null. */
160
+ readonly errorReason: VetVisitErrorReason | null;
161
+ /**
162
+ * Mint a handoff and open the hosted Everfur visit. Call it directly from a press or click handler. A second
163
+ * call while one is in flight returns the same promise rather than minting a second handoff.
164
+ */
165
+ open(petRef?: PetRef | null): Promise<VetVisitOpenResult>;
166
+ /**
167
+ * TV-01. Open a visit this member ALREADY has, instead of the booking funnel: the recap of a finished
168
+ * visit, the thread the vet wrote in, the call a reminder is for. `visitRef` is the reference the
169
+ * `visit.*` events carry, and `intent` is what to open for it (`visit` when omitted).
170
+ *
171
+ * Hand it what a tapped push gave you, unchanged:
172
+ * ```ts
173
+ * const n = parseEverfurNotification(response);
174
+ * if (n?.target.kind === 'visit' && n.target.intent !== null) {
175
+ * await visit.openVisit(n.target.visitRef, n.target.intent);
176
+ * }
177
+ * ```
178
+ * A `null` intent on a target means the visit is over without happening (cancelled, missed): there is
179
+ * nothing left to open, so call `open()` to book a new one instead.
180
+ *
181
+ * Everfur resolves the reference at the mint against this member's own visits, so one that is not theirs
182
+ * settles `invalidRequest` and opens nothing. Shares the single-flight rule with `open`.
183
+ */
184
+ openVisit(visitRef: string, intent?: VetVisitIntent | null): Promise<VetVisitOpenResult>;
185
+ }
186
+
187
+ export { type UseVetVisitOptions as U, type VetVisitEntry as V, type UseVetVisitState as a, type VetVisitErrorReason as b, type VetVisitController as c, type VetVisitAvailability as d, type VetVisitHandoff as e, type VetVisitHandoffOptions as f, type VetVisitHandoffVisit as g, type VetVisitOpenResult as h, type VetVisitReturn as i, type VetVisitStatus as j, parseVetVisitReturn as p, vetVisitErrorReasonOf as v };
@@ -0,0 +1,187 @@
1
+ import { c as EverfurResult, E as EverfurError } from './EverfurResult-DN9pL2Ab.js';
2
+ import { P as PetRef } from './ids-B2GAAifq.js';
3
+ import { V as VetVisitIntent } from './visitIntent-D7_yVp1I.js';
4
+
5
+ /** What the hosted page will open for a handoff minted with `visitRef`: the platform's own echo. */
6
+ interface VetVisitHandoffVisit {
7
+ /** The visit reference the handoff was minted for, as you sent it. */
8
+ readonly visitRef: string;
9
+ /** What the hosted page opens for it. `visit` when you named no intent. */
10
+ readonly intent: VetVisitIntent;
11
+ }
12
+ /** A minted handoff. Open `url` once, promptly; it expires at `expiresAt` and is spent by the first use. */
13
+ interface VetVisitHandoff {
14
+ /** The hosted Everfur page with the single-use token in its fragment. Never log or persist it. */
15
+ readonly url: string;
16
+ /** ISO-8601 timestamp from the server; about 120 seconds after the mint. */
17
+ readonly expiresAt: string;
18
+ /**
19
+ * Present only when the handoff was minted with `returnTo`: the opaque id the user comes back with on your
20
+ * registered return destination. Keep it to match the return (`parseVetVisitReturn`). It says nothing about
21
+ * the visit.
22
+ */
23
+ readonly flowId?: string;
24
+ /**
25
+ * Present only when the handoff was minted with `visitRef`: what the hosted page will open, echoed by the
26
+ * platform from what it stored with the handoff. The reference never rides the URL, so this is the only
27
+ * place to read it back. Absent on an ordinary booking handoff.
28
+ */
29
+ readonly visit?: VetVisitHandoffVisit;
30
+ }
31
+ /** Where a vet visit was opened from. `'chat'`: the user chose it inside partner Chat, for the chat's pet. */
32
+ type VetVisitEntry = 'chat';
33
+ /** Optional handoff settings. */
34
+ interface VetVisitHandoffOptions {
35
+ /**
36
+ * The KEY of a return destination your tenant registered with Everfur. After the hosted visit flow the user
37
+ * can go back to that destination, and only that one. Never a URL.
38
+ */
39
+ readonly returnTo?: string | null;
40
+ /** `'chat'` when the user opened the visit from Chat. Requires the pet the chat is about. */
41
+ readonly entry?: VetVisitEntry | null;
42
+ /**
43
+ * TV-01. The reference of a visit this member ALREADY has (the `visit_ref` the `visit.*` events carry, and
44
+ * the one `parseEverfurNotification` reads off a tapped push). The handoff then opens that visit instead of
45
+ * the booking funnel. Everfur resolves it at the mint against this member's own live link, so a reference
46
+ * that is not theirs is refused with the same words a malformed one gets: a `validationFailed` you cannot
47
+ * probe for visits with. At most 64 characters.
48
+ */
49
+ readonly visitRef?: string | null;
50
+ /**
51
+ * What to open for `visitRef`: the visit itself, its call, its summary or its messages. Absent means
52
+ * `visit`. An intent with no `visitRef` is refused locally, because it names a route with nothing to route
53
+ * to. A tapped push already carries the right one on `target.intent`.
54
+ */
55
+ readonly intent?: VetVisitIntent | null;
56
+ }
57
+ /** The state preflight's whole answer. Nothing about the account, the plan or the price. */
58
+ interface VetVisitAvailability {
59
+ /** True when a vet visit can be booked for the state asked about. False for every other reason, alike. */
60
+ readonly available: boolean;
61
+ }
62
+ /** A partner app's return from the hosted visit flow, read by `parseVetVisitReturn`. Only the flow id. */
63
+ interface VetVisitReturn {
64
+ /** The opaque flow id from the handoff that led to this return. */
65
+ readonly flowId: string;
66
+ }
67
+ /**
68
+ * The closed set a partner branches on, derived from the route's documented outcomes.
69
+ *
70
+ * - `sessionRequired`: the integration sent no signed session. Mint one on your backend
71
+ * (`@everfur/sdk/server` mintPartnerSession) and hand the token to `EverfurUser.getToken`.
72
+ * - `authRejected`: the session token was refused after the one refresh the SDK performs.
73
+ * - `accessDenied`: a signed session whose key or plan does not include vet visits.
74
+ * - `unavailable`: vet visits are off for this partner or for Everfur right now (the route answers 404).
75
+ * - `rateLimited`: this user or this partner has opened too many visits recently. Do not retry in a loop.
76
+ * - `sdkUpdateRequired`: the API refused this SDK version.
77
+ * - `invalidRequest`: the pet reference was refused (empty, or longer than 128 characters).
78
+ * - `network`: no response arrived (offline, DNS, timeout).
79
+ * - `serverError`: the API failed, or answered with something that is not a usable Everfur visit URL.
80
+ * - `popupBlocked`: web only. The browser refused to open the new tab.
81
+ * - `openFailed`: React Native only. The host could not open the URL.
82
+ * - `cancelled`: nothing to show. The visit tab was closed before it loaded, or the signed-in user changed
83
+ * while the handoff was being minted, so it was dropped rather than opened for the previous user.
84
+ * - `unknown`: anything else.
85
+ */
86
+ type VetVisitErrorReason = 'sessionRequired' | 'authRejected' | 'accessDenied' | 'unavailable' | 'rateLimited' | 'sdkUpdateRequired' | 'invalidRequest' | 'network' | 'serverError' | 'popupBlocked' | 'openFailed' | 'cancelled' | 'unknown';
87
+ /** Map a settled handoff failure to its closed reason. Total and pure. */
88
+ declare function vetVisitErrorReasonOf(error: EverfurError): VetVisitErrorReason;
89
+ /** Mints handoffs for the current session. Built by `useVetVisit`; injectable for tests. */
90
+ interface VetVisitController {
91
+ /**
92
+ * Mint one handoff. Optional `petRef` scopes the visit to the partner's pet, shown to the user after
93
+ * sign-in. `options` names a registered return destination and where the visit was opened from. Settles;
94
+ * never throws; never retries.
95
+ */
96
+ createHandoff(petRef?: PetRef | null, options?: VetVisitHandoffOptions): Promise<EverfurResult<VetVisitHandoff>>;
97
+ /**
98
+ * Ask whether a vet visit is available for a US state (for example `'CA'`). Settles. An injected controller
99
+ * without it is treated as unavailable wherever the hook needs the answer.
100
+ */
101
+ checkAvailability?(state: string): Promise<EverfurResult<VetVisitAvailability>>;
102
+ /** True only while Everfur has the vet entry inside Chat switched on. Never throws; any failure is false. */
103
+ chatEntryOpen?(): Promise<boolean>;
104
+ }
105
+ /**
106
+ * Read an Everfur return off the URL your registered return destination was opened with. Returns the opaque
107
+ * flow id you received from the handoff, or null for any URL that does not carry exactly one well-formed
108
+ * Everfur flow id in its query. It carries nothing about the visit, the pet or the account.
109
+ */
110
+ declare function parseVetVisitReturn(url: string): VetVisitReturn | null;
111
+
112
+ /** `idle` before a tap and after a successful open; `opening` while the handoff is minted; `error` after a failure. */
113
+ type VetVisitStatus = 'idle' | 'opening' | 'error';
114
+ /** What one `open()` call settled to. The URL is deliberately absent. */
115
+ type VetVisitOpenResult = {
116
+ readonly opened: true;
117
+ readonly flowId?: string;
118
+ } | {
119
+ readonly opened: false;
120
+ readonly reason: VetVisitErrorReason;
121
+ readonly error: EverfurError | null;
122
+ };
123
+ /** Options for `useVetVisit`. */
124
+ interface UseVetVisitOptions {
125
+ /** The partner's pet reference to scope the visit to. `open(petRef)` overrides it per call. */
126
+ readonly petRef?: PetRef | null;
127
+ /** Host/test seam: inject a controller instead of building one from the provider's session. */
128
+ readonly controller?: VetVisitController;
129
+ /**
130
+ * The KEY of a return destination your tenant registered with Everfur. The visit can then send the user back
131
+ * to it, and `open()` settles with the `flowId` that return will carry.
132
+ */
133
+ readonly returnTo?: string | null;
134
+ /**
135
+ * The user's US state (for example `'CA'`). When set, `available` stays false until Everfur confirms a visit
136
+ * is available there, so the entry is never shown to a user who could not book.
137
+ */
138
+ readonly usState?: string | null;
139
+ /**
140
+ * `'chat'` for the entry inside Chat. `available` then also needs Everfur's chat entry switch and a pet (the
141
+ * one the chat is about); the visit itself is the same hosted visit.
142
+ */
143
+ readonly entry?: VetVisitEntry | null;
144
+ }
145
+ /** What `useVetVisit` returns. The handoff URL is never part of it. */
146
+ interface UseVetVisitState {
147
+ /**
148
+ * True only when the server grants the `televet` capability AND the provider is scoped to a user. A handoff
149
+ * is minted from the user's session, so a publishable-key-only context could only ever spend a blank tab on
150
+ * a `sessionRequired` failure. A surface renders nothing otherwise.
151
+ */
152
+ readonly available: boolean;
153
+ /** True while the capability verdict is still resolving. */
154
+ readonly isPending: boolean;
155
+ /** Where the last `open()` is: idle, opening, or failed. */
156
+ readonly status: VetVisitStatus;
157
+ /** The settled failure of the last `open()`, or null. `error.displayMessage` is safe to show. */
158
+ readonly error: EverfurError | null;
159
+ /** The closed reason for the last failure, or null. */
160
+ readonly errorReason: VetVisitErrorReason | null;
161
+ /**
162
+ * Mint a handoff and open the hosted Everfur visit. Call it directly from a press or click handler. A second
163
+ * call while one is in flight returns the same promise rather than minting a second handoff.
164
+ */
165
+ open(petRef?: PetRef | null): Promise<VetVisitOpenResult>;
166
+ /**
167
+ * TV-01. Open a visit this member ALREADY has, instead of the booking funnel: the recap of a finished
168
+ * visit, the thread the vet wrote in, the call a reminder is for. `visitRef` is the reference the
169
+ * `visit.*` events carry, and `intent` is what to open for it (`visit` when omitted).
170
+ *
171
+ * Hand it what a tapped push gave you, unchanged:
172
+ * ```ts
173
+ * const n = parseEverfurNotification(response);
174
+ * if (n?.target.kind === 'visit' && n.target.intent !== null) {
175
+ * await visit.openVisit(n.target.visitRef, n.target.intent);
176
+ * }
177
+ * ```
178
+ * A `null` intent on a target means the visit is over without happening (cancelled, missed): there is
179
+ * nothing left to open, so call `open()` to book a new one instead.
180
+ *
181
+ * Everfur resolves the reference at the mint against this member's own visits, so one that is not theirs
182
+ * settles `invalidRequest` and opens nothing. Shares the single-flight rule with `open`.
183
+ */
184
+ openVisit(visitRef: string, intent?: VetVisitIntent | null): Promise<VetVisitOpenResult>;
185
+ }
186
+
187
+ export { type UseVetVisitOptions as U, type VetVisitEntry as V, type UseVetVisitState as a, type VetVisitErrorReason as b, type VetVisitController as c, type VetVisitAvailability as d, type VetVisitHandoff as e, type VetVisitHandoffOptions as f, type VetVisitHandoffVisit as g, type VetVisitOpenResult as h, type VetVisitReturn as i, type VetVisitStatus as j, parseVetVisitReturn as p, vetVisitErrorReasonOf as v };