@everfur/sdk 0.15.1 → 0.16.1
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 +138 -0
- package/README.md +3 -1
- package/chat/lite/package.json +8 -0
- package/dist/Chat.d-CzI2228d.d.ts +11 -0
- package/dist/Chat.d-D3ScVQ22.d.cts +11 -0
- package/dist/{DepthViews.d-PuBGdAYk.d.cts → DepthViews.d-6U4QqaW3.d.cts} +1 -1
- package/dist/{DepthViews.d--1daZblh.d.cts → DepthViews.d-BLx_ZTwa.d.cts} +1 -1
- package/dist/{DepthViews.d-CKTnEeUo.d.ts → DepthViews.d-Cwbel5o4.d.ts} +1 -1
- package/dist/{DepthViews.d-BuEWI6Ln.d.ts → DepthViews.d-DVIydPLt.d.ts} +1 -1
- package/dist/{RecordsPage.d-CBB8sfoY.d.ts → RecordsPage.d-Bwalb0wU.d.ts} +1 -1
- package/dist/{RecordsPage.d-Dq5gpQG0.d.cts → RecordsPage.d-Do7T8Fns.d.cts} +1 -1
- package/dist/animations/index.d.cts +5 -5
- package/dist/animations/index.d.ts +5 -5
- package/dist/{Chat.d-BlsnQwCQ.d.ts → appStateLifecycle.d-Bd-rNy6K.d.ts} +62 -144
- package/dist/{Chat.d-BO5iJsR2.d.cts → appStateLifecycle.d-_mh4CEAq.d.cts} +62 -144
- package/dist/attachmentTransport.d-Syrvv5zH.d.ts +41 -0
- package/dist/attachmentTransport.d-r1XCCdUB.d.cts +41 -0
- package/dist/{attachments.d-DFP9yvz9.d.ts → attachments.d-BiBGBE4o.d.ts} +24 -6
- package/dist/{attachments.d-C2nkIyDB.d.ts → attachments.d-CyB8hzDo.d.ts} +2 -2
- package/dist/{attachments.d-DRHsJkni.d.cts → attachments.d-GlO5UP7H.d.cts} +24 -6
- package/dist/{attachments.d-DRUC35Ti.d.cts → attachments.d-Y-qvSHVU.d.cts} +2 -2
- package/dist/{bookingCopy.d-bF_QknDC.d.cts → bookingCopy.d-BIaCiRuW.d.cts} +2 -2
- package/dist/{bookingCopy.d-CFL-1Be2.d.ts → bookingCopy.d-DgWvNKD5.d.ts} +2 -2
- package/dist/{casesRepository.d-C__BnffJ.d.ts → casesRepository.d-BW8DTYeN.d.ts} +1 -1
- package/dist/{casesRepository.d-BMOnT1fg.d.cts → casesRepository.d-_0AO2YrL.d.cts} +1 -1
- package/dist/chat/index.cjs +246 -231
- package/dist/chat/index.d.cts +16 -49
- package/dist/chat/index.d.ts +16 -49
- package/dist/chat/index.js +246 -231
- package/dist/chat/lite/index.cjs +430 -0
- package/dist/chat/lite/index.d.cts +35 -0
- package/dist/chat/lite/index.d.ts +35 -0
- package/dist/chat/lite/index.js +430 -0
- package/dist/client/index.cjs +4 -4
- package/dist/client/index.d.cts +6 -6
- package/dist/client/index.d.ts +6 -6
- package/dist/client/index.js +4 -4
- package/dist/{clinicBatch.d-D68RYvc3.d.ts → clinicBatch.d-BXwATY3-.d.ts} +2 -2
- package/dist/{clinicBatch.d-C5deJ4xY.d.cts → clinicBatch.d-BcuSaOkv.d.cts} +2 -2
- package/dist/{config.d-BQgrIDdu.d.cts → config.d-D1xcxALX.d.cts} +1 -1
- package/dist/{config.d-XSMThgVj.d.ts → config.d-jTVsAeky.d.ts} +1 -1
- package/dist/consent/index.d.cts +5 -5
- package/dist/consent/index.d.ts +5 -5
- package/dist/{context.d-Ba8YyJpk.d.cts → context.d-C3x-z665.d.cts} +5 -5
- package/dist/{context.d-xoh5vmxS.d.ts → context.d-goZeZO2I.d.ts} +5 -5
- package/dist/{copy.d-Cq-s-UUv.d.cts → copy.d-DPwFY4r5.d.cts} +2 -2
- package/dist/{copy.d-HV9fU5kh.d.ts → copy.d-yfJv7fl6.d.ts} +2 -2
- package/dist/core/index.cjs +10 -10
- package/dist/core/index.d.cts +13 -13
- package/dist/core/index.d.ts +13 -13
- package/dist/core/index.js +10 -10
- package/dist/{depth.d-D7kKiYl7.d.ts → depth.d-SJzknw_P.d.ts} +2 -2
- package/dist/{depth.d-DYnkz8Re.d.cts → depth.d-e_8_icip.d.cts} +2 -2
- package/dist/{entitlementRepository.d-DmnUZLl_.d.ts → entitlementRepository.d-BNgZhwoE.d.ts} +2 -2
- package/dist/{entitlementRepository.d-B_kEPLhz.d.cts → entitlementRepository.d-C_LdzINM.d.cts} +2 -2
- package/dist/{focus.d-BHm_QtQ9.d.cts → focus.d-CXpIkIuU.d.cts} +3 -3
- package/dist/{focus.d-CjL6Cj0m.d.ts → focus.d-DzIgOqNB.d.ts} +3 -3
- package/dist/health-plan/index.cjs +136 -133
- package/dist/health-plan/index.d.cts +77 -24
- package/dist/health-plan/index.d.ts +77 -24
- package/dist/health-plan/index.js +136 -133
- package/dist/{idempotency.d-BSRK8od4.d.cts → idempotency.d-0biUa_Vw.d.cts} +1 -1
- package/dist/{idempotency.d-CFc4CCc9.d.ts → idempotency.d-DcqIqmf9.d.ts} +1 -1
- package/dist/{identity.d-Be2Es9Td.d.ts → identity.d-BEJcHY-5.d.ts} +1 -1
- package/dist/{identity.d-HbwYQ4-z.d.cts → identity.d-COcNGuCJ.d.cts} +1 -1
- package/dist/index.cjs +245 -230
- package/dist/index.d.cts +15 -12
- package/dist/index.d.ts +15 -12
- package/dist/index.js +246 -231
- package/dist/{introEvents.d-Dr34KIaD.d.cts → introEvents.d-D8N9bbGO.d.cts} +1 -1
- package/dist/{introEvents.d-DflJ6J9H.d.ts → introEvents.d-GCdyQyUG.d.ts} +1 -1
- package/dist/notifications/index.d.cts +4 -4
- package/dist/notifications/index.d.ts +4 -4
- package/dist/{optInView.d-3mbj1mR6.d.ts → optInView.d-CY2IueSZ.d.ts} +2 -2
- package/dist/{optInView.d-D23o1gtT.d.cts → optInView.d-DVuuWDRw.d.cts} +2 -2
- package/dist/{parse.d-BERabxHw.d.ts → parse.d--ztmWIIP.d.ts} +1 -1
- package/dist/{parse.d-4lUXdmvY.d.cts → parse.d-B-WrkW2C.d.cts} +1 -1
- package/dist/{pets.d-CHU0UbXt.d.cts → pets.d-BSW0oEYx.d.cts} +1 -1
- package/dist/{pets.d-D_ayuqjp.d.ts → pets.d-DwsImaHU.d.ts} +1 -1
- package/dist/{petsRepository.d-Bwfe8yuR.d.cts → petsRepository.d-BQfWC3d4.d.cts} +1 -1
- package/dist/{petsRepository.d-DUaAWoTv.d.ts → petsRepository.d-BudLFHVe.d.ts} +1 -1
- package/dist/photo/index.cjs +2 -2
- package/dist/photo/index.js +2 -2
- package/dist/{ports.d-DzEJMVRs.d.ts → ports.d-B6kDPKF7.d.ts} +4 -4
- package/dist/{ports.d-ClbPRUtx.d.cts → ports.d-DzPbmiDT.d.cts} +4 -4
- package/dist/records/depth/index.cjs +10 -10
- package/dist/records/depth/index.d.cts +9 -9
- package/dist/records/depth/index.d.ts +9 -9
- package/dist/records/depth/index.js +10 -10
- package/dist/records/index.cjs +253 -211
- package/dist/records/index.d.cts +169 -73
- package/dist/records/index.d.ts +169 -73
- package/dist/records/index.js +254 -212
- package/dist/{requestFunnel.d-YabU6G-Z.d.ts → requestFunnel.d-BPsCHJWf.d.ts} +2 -2
- package/dist/{requestFunnel.d-JoqddYSx.d.cts → requestFunnel.d-BdpL7gwg.d.cts} +2 -2
- package/dist/{runtimeTypes.d-DQTBJAbk.d.ts → runtimeTypes.d-C_Pcxn-n.d.ts} +4 -4
- package/dist/{runtimeTypes.d-Cv38YuzP.d.cts → runtimeTypes.d-Cfq3IrZG.d.cts} +4 -4
- package/dist/{screenProps.d-C-AuHoyF.d.cts → screenProps.d-BJMn1kTR.d.cts} +2 -2
- package/dist/{screenProps.d-BuJLzFkN.d.ts → screenProps.d-DGrfO17l.d.ts} +2 -2
- package/dist/server/events/index.cjs +3 -3
- package/dist/server/events/index.d.cts +48 -6
- package/dist/server/events/index.d.ts +48 -6
- package/dist/server/events/index.js +3 -3
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.d.cts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +2 -2
- package/dist/shop/index.cjs +16 -16
- package/dist/shop/index.d.cts +12 -3
- package/dist/shop/index.d.ts +12 -3
- package/dist/shop/index.js +16 -16
- package/dist/tabs/index.cjs +4 -4
- package/dist/tabs/index.d.cts +34 -15
- package/dist/tabs/index.d.ts +34 -15
- package/dist/tabs/index.js +5 -5
- package/dist/{tabsModel.d-BfIQg6yS.d.ts → tabsModel.d-B7QMug1u.d.cts} +1 -17
- package/dist/{tabsModel.d-BfIQg6yS.d.cts → tabsModel.d-B7QMug1u.d.ts} +1 -17
- package/dist/televet/booking/index.cjs +2 -2
- package/dist/televet/booking/index.d.cts +6 -6
- package/dist/televet/booking/index.d.ts +6 -6
- package/dist/televet/booking/index.js +2 -2
- package/dist/televet/call/index.cjs +1 -1
- package/dist/televet/call/index.js +1 -1
- package/dist/televet/index.cjs +4 -3
- package/dist/televet/index.d.cts +1 -0
- package/dist/televet/index.d.ts +1 -0
- package/dist/televet/index.js +5 -4
- package/dist/testing/index.d.cts +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/rn/index.cjs +1 -1
- package/dist/testing/rn/index.d.cts +7 -7
- package/dist/testing/rn/index.d.ts +7 -7
- package/dist/testing/rn/index.js +1 -1
- package/dist/testing/web/index.d.cts +7 -7
- package/dist/testing/web/index.d.ts +7 -7
- package/dist/texting/index.cjs +21 -16
- package/dist/texting/index.d.cts +5 -5
- package/dist/texting/index.d.ts +5 -5
- package/dist/texting/index.js +22 -17
- package/dist/threadOptions.d-B0folrKm.d.cts +147 -0
- package/dist/{threadOptions.d-DBrmOwmb.d.cts → threadOptions.d-B8HTJa9A.d.cts} +6 -40
- package/dist/{threadOptions.d-8x_1evAr.d.ts → threadOptions.d-BnhE7T8Y.d.ts} +6 -40
- package/dist/threadOptions.d-DTsJFkL-.d.ts +147 -0
- package/dist/threadOptions.d-GPJPprkn.d.cts +55 -0
- package/dist/threadOptions.d-GPJPprkn.d.ts +55 -0
- package/dist/{timelineRows.d-B6lLC8Ud.d.cts → timelineRows.d-BTcUdNeI.d.cts} +1 -1
- package/dist/{timelineRows.d-Brlkti-G.d.ts → timelineRows.d-kmBms1W5.d.ts} +1 -1
- package/dist/{planSignals.d-Dha2CMDF.d.cts → useHealthPlanSubscription.d-B_cth_iF.d.cts} +81 -3
- package/dist/{planSignals.d-CON9gTvJ.d.ts → useHealthPlanSubscription.d-BzNaVl89.d.ts} +81 -3
- package/dist/{usePresentation.d-Bne14SlX.d.ts → usePresentation.d-B7Uf44Ax.d.ts} +40 -40
- package/dist/{usePresentation.d-BcdCIuEU.d.cts → usePresentation.d-BkAMOfb5.d.cts} +40 -40
- package/dist/{useRecordsDepth.d-Cd6J03o5.d.ts → useRecordsDepth.d-BHkZi0tM.d.ts} +1 -1
- package/dist/{useRecordsDepth.d-DAa169VY.d.cts → useRecordsDepth.d-BxHpKipf.d.cts} +1 -1
- package/dist/video/index.cjs +2 -2
- package/dist/video/index.js +2 -2
- package/dist/{view.d-DkGM8GNA.d.ts → view.d-2BYMRnWj.d.ts} +3 -3
- package/dist/{view.d-3d5_O7Xk.d.cts → view.d-CoDbnv0f.d.cts} +3 -3
- package/dist/web/consent/index.d.cts +5 -5
- package/dist/web/consent/index.d.ts +5 -5
- package/dist/web/health-plan/index.cjs +5 -5
- package/dist/web/health-plan/index.d.cts +15 -69
- package/dist/web/health-plan/index.d.ts +15 -69
- package/dist/web/health-plan/index.js +5 -5
- package/dist/web/index.cjs +8 -8
- package/dist/web/index.d.cts +26 -43
- package/dist/web/index.d.ts +26 -43
- package/dist/web/index.js +8 -8
- package/dist/web/intro/index.d.cts +6 -6
- package/dist/web/intro/index.d.ts +6 -6
- package/dist/web/notifications/index.d.cts +3 -3
- package/dist/web/notifications/index.d.ts +3 -3
- package/dist/web/records/depth/index.cjs +9 -9
- package/dist/web/records/depth/index.d.cts +9 -9
- package/dist/web/records/depth/index.d.ts +9 -9
- package/dist/web/records/depth/index.js +9 -9
- package/dist/web/records/index.cjs +12 -12
- package/dist/web/records/index.d.cts +11 -11
- package/dist/web/records/index.d.ts +11 -11
- package/dist/web/records/index.js +12 -12
- package/dist/web/records-sheet/index.cjs +17 -17
- package/dist/web/records-sheet/index.js +17 -17
- package/dist/web/shop/index.cjs +12 -12
- package/dist/web/shop/index.d.cts +3 -3
- package/dist/web/shop/index.d.ts +3 -3
- package/dist/web/shop/index.js +12 -12
- package/dist/web/televet/booking/index.cjs +2 -2
- package/dist/web/televet/booking/index.d.cts +6 -6
- package/dist/web/televet/booking/index.d.ts +6 -6
- package/dist/web/televet/booking/index.js +2 -2
- package/dist/web/televet/call/index.cjs +1 -1
- package/dist/web/televet/call/index.js +1 -1
- package/dist/web/texting/index.d.cts +5 -5
- package/dist/web/texting/index.d.ts +5 -5
- package/package.json +22 -27
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,144 @@ changes that has not been earned by any production integration yet.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.16.1] - 2026-10-25
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **`@everfur/sdk/chat/lite` (React Native).** The same chat as `@everfur/sdk/chat` (component, hook, props and
|
|
18
|
+
types), but its `EverfurChat` does not mount `EverfurTelevetHost`, so the entry imports none of
|
|
19
|
+
`@everfur/sdk/televet/booking` or `@everfur/sdk/televet/call`. Chat plus its imported SDK entries drops from about
|
|
20
|
+
184 KB to about 95 KB gzip. To open visits in the app, mount `<EverfurTelevetHost />` from `@everfur/sdk/televet`
|
|
21
|
+
yourself. `@everfur/sdk/chat` is unchanged.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- Refresh the backend contract snapshot and recognize its five claim webhook events on the server.
|
|
26
|
+
- Share Health Plan weight parsing between React Native and web while preserving each surface's limits.
|
|
27
|
+
- Consolidate bundle legal notices while retaining the license and third-party notices.
|
|
28
|
+
|
|
29
|
+
## [0.16.0] - 2026-10-24
|
|
30
|
+
|
|
31
|
+
This release covers the React Native parity work: the React Native chat, tabs, Health Plan, shop, records and
|
|
32
|
+
texting now follow the web. Web output is unchanged.
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- **Chat dictation (React Native).** `registerEverfurDictation(loader)` turns on the composer mic. The loader returns
|
|
37
|
+
the optional peer `expo-speech-recognition` (version 1 or later); without it the mic is not drawn. A registration
|
|
38
|
+
made after the chat mounts is picked up. New export `EverfurDictationLoader`.
|
|
39
|
+
- **Chat opening card and empty header (React Native).** `ask(prompt, card)` and the `initialAskCard` prop show the
|
|
40
|
+
same opening card as the web, and `renderEmptyHeader` draws above an empty thread. New exports
|
|
41
|
+
`EverfurChatOpeningCard` (also from `@everfur/sdk/tabs`), `EverfurChatEmptyHeaderContext` and `ChatFollowUpPolicy`
|
|
42
|
+
(the `followUpPolicy` prop). The opening card takes `styles` (card, icon, kicker, title, body), and
|
|
43
|
+
`answerCards.styles` adds `feedback`, `feedbackChip`, `feedbackChipText`, `followUps`, `followUpsLabel`,
|
|
44
|
+
`followUp`, `followUpText`, `followUpAction` and `followUpActionText`: the web's `classNames` as React Native styles.
|
|
45
|
+
- **Chat foreground re-read (React Native).** `createAppStateLifecycle()` builds a lifecycle from `AppState`.
|
|
46
|
+
- **Health Plan (React Native).** `HealthPlanTopRisk`, `useHealthPlanTopCard` and the top card exports,
|
|
47
|
+
`HealthPlanScrollScope`, `focus.trackingTexts`, `onAvailability`, `onAsk`, `emptyCopy` (`HealthPlanEmptyCopy`),
|
|
48
|
+
`healthPlanPetWords` (`HealthPlanPetPronouns`), and re-exports of the subscription hooks and mappers.
|
|
49
|
+
- **Shop cart storage (React Native).** `EverfurShop` takes `cartStorageKey`. The cart and checkout are kept in the
|
|
50
|
+
`KvPort`.
|
|
51
|
+
- **Records (React Native).** `recordsSheet` and `RECORDS_SHEET_ROW_BUTTON_STYLE`, and the `EverfurRecords` props
|
|
52
|
+
`renderUpcomingCareAction`, `noVet`, `weightUnit`, `onOpenPlan`, `onOpenScreenings`, `onRequestFromClinic`,
|
|
53
|
+
`onNavigate` and `alwaysShowWays`. The sheet takes the `raph` palette, fonts, `topRiskLine` and `stage`, and gains
|
|
54
|
+
the care timeline and the medications, history and weight cards, `RequestDocumentsList`, and pull to refresh.
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- **Chat re-reads in the foreground by default (React Native).** The chat and the tabs re-read the thread when the app
|
|
59
|
+
comes back to the foreground. Pass `lifecycle={null}` to opt out. In the tabs a hidden Ask pane does not re-read.
|
|
60
|
+
- **Chat copy matches the web (React Native).** The footnote is the web footnote, a failed turn uses the web title,
|
|
61
|
+
and the vet chip reads "Book a video visit".
|
|
62
|
+
- **Chat behaviour matches the web (React Native).** `answer_footer` is drawn outside the tabs too. Non-urgent banners
|
|
63
|
+
no longer alert. Past check-ins render as plain rows. New chat sits in the chat header. The WORSE check-in tries the
|
|
64
|
+
vet visit first. `maxPerMessage` defaults to 5. A top card with no `closeLabel` draws no close. One pet with
|
|
65
|
+
`onAddPet` opens the switcher. `onOpenHealthPlan` receives the pet.
|
|
66
|
+
- **Chat look matches the web (React Native).** The texting line puts the name over its bubble and its two answers
|
|
67
|
+
side by side as pills. Footer controls are spaced as on the web, and the cards style draws no footer under the
|
|
68
|
+
member's question. The footnote in the thread is left-aligned at the caption size. The failed-turn notice uses the
|
|
69
|
+
web's cream card and body-face title, and no longer takes the `card` slot.
|
|
70
|
+
- **Records session-required state (React Native).** The sheet, dashboard, requests, request and document screens
|
|
71
|
+
show a session-required state when there is no session. Hosts that mount Records before sign-in now see it.
|
|
72
|
+
The consent screen has one sign-mode toggle and Cancel, and the consent gate is no longer a dead end.
|
|
73
|
+
- **Health Plan and shop (React Native).** `onAvailabilityChange` is deprecated for `onAvailability`. Loading shows a
|
|
74
|
+
skeleton. Buy controls are always drawn and are disabled when unpriced. Order steps are always 4. The weight limit
|
|
75
|
+
is 90 kg. A dev warning shows when the shop is on with no return URL.
|
|
76
|
+
- **Shared types.** The chat opening card, empty header and top card shapes, and the Health Plan top card helpers,
|
|
77
|
+
now live in one shared module for web and React Native. Public type names are unchanged.
|
|
78
|
+
|
|
79
|
+
### Fixed
|
|
80
|
+
|
|
81
|
+
- **Chat dictation (React Native).** Dictation stops when the conversation changes and when the Ask pane is hidden.
|
|
82
|
+
The draft is not written while dictating. The dictation error line and the feedback failed note are announced on
|
|
83
|
+
iOS and are a live region on Android.
|
|
84
|
+
- **Chat (React Native).** A refused thumb shows the feedback failed note. An empty reasons submit sends nothing.
|
|
85
|
+
Load earlier keeps the reading position.
|
|
86
|
+
- **Health Plan (React Native).** A failed return shows a toast.
|
|
87
|
+
- **Texting (React Native).** The pop-up scrolls, avoids the keyboard and works in both orientations, its text is
|
|
88
|
+
centred, and announcements reach iOS. Buttons are 44 high, the pill edge changes colour on focus, and the opt-in card shows a
|
|
89
|
+
busy state. The entry's placeholders are grey, and focus moves to the code field on the code step.
|
|
90
|
+
|
|
91
|
+
## [0.15.6] - 2026-10-24
|
|
92
|
+
|
|
93
|
+
### Fixed
|
|
94
|
+
|
|
95
|
+
- **Shop: an order whose payment failed no longer reads confirmed.** Under "Payment failed" the order page drew the
|
|
96
|
+
status line too ("Confirmed, sending to the pharmacy" for an order waiting to be placed). The line is now left out
|
|
97
|
+
while the payment has failed or still waits for the member. Web and React Native. No new copy.
|
|
98
|
+
- **Shop: Paid with only on a paid order.** The card row showed on unpaid, voided and failed orders. It now shows only
|
|
99
|
+
once the payment is authorized or captured. Web and React Native. No new copy.
|
|
100
|
+
- **Shop: the cart drops the placed lines before the card step opens.** A checkout that needs 3-D Secure left the
|
|
101
|
+
lines in the cart when the in-app browser or the redirect did not hand back. `confirmWithPayerActions` takes a
|
|
102
|
+
`beforePayerAction` hook, and the cart checkout empties the placed lines there. Web and React Native.
|
|
103
|
+
|
|
104
|
+
## [0.15.5] - 2026-10-24
|
|
105
|
+
|
|
106
|
+
### Fixed
|
|
107
|
+
|
|
108
|
+
- **Shop: no stale card line on a paid order (React Native).** When the bank's 3-D Secure step finished but the
|
|
109
|
+
in-app browser closed before it handed back, the order page still said the card was not verified although the
|
|
110
|
+
order already held the payment. The order page now drops that line once the order reads authorized or captured
|
|
111
|
+
and has nothing left to pay. No new copy.
|
|
112
|
+
|
|
113
|
+
## [0.15.4] - 2026-10-24
|
|
114
|
+
|
|
115
|
+
### Fixed
|
|
116
|
+
|
|
117
|
+
- **Shop: Buy again on an Rx-only order (React Native).** A delivered or ended order that holds only Rx items now
|
|
118
|
+
offers Buy again, which opens the product page (where the prescription is chosen), as the web order page already
|
|
119
|
+
did. A mixed order still puts only its items with no prescription back in the cart.
|
|
120
|
+
|
|
121
|
+
## [0.15.3] - 2026-10-23
|
|
122
|
+
|
|
123
|
+
### Fixed
|
|
124
|
+
|
|
125
|
+
- **Shop: the order headline says its status once (web and React Native).** A shipped order with no arrival date
|
|
126
|
+
showed "Shipped" as the headline and again as the line under it. A status line that repeats the headline is no
|
|
127
|
+
longer drawn.
|
|
128
|
+
- **Shop: Buy again only on an order that is over (web and React Native).** Buy again shows on a delivered order and on
|
|
129
|
+
one that ended without arriving (cancelled, not approved, being looked into). An order still on its way (in review,
|
|
130
|
+
being prepared, shipped) no longer offers it.
|
|
131
|
+
- **Shop: no main landmark inside the host's (web).** The cart, orders, order and placed pages drew their own `<main>`
|
|
132
|
+
inside the host page's `<main>`. They now use a plain container; the host page owns the landmark.
|
|
133
|
+
|
|
134
|
+
## [0.15.2] - 2026-10-23
|
|
135
|
+
|
|
136
|
+
### Fixed
|
|
137
|
+
|
|
138
|
+
- **Shop: the order pages read again (web and React Native).** An order and the orders list read again behind what is
|
|
139
|
+
drawn, with no loading state, when the app comes back from the background on React Native (`AppState`) and when the
|
|
140
|
+
tab becomes visible again on the web (`visibilitychange`). A burst of signals makes one request, a read already in
|
|
141
|
+
flight is joined, and a failed re-read keeps the page shown. The list does not re-read once older pages are loaded.
|
|
142
|
+
On React Native the order and orders screens also refresh on a pull (`RefreshControl`).
|
|
143
|
+
- **Shop: a refused cancel reads the order again (web and React Native).** When the OMS refuses a cancel (the order
|
|
144
|
+
shipped or was already cancelled), the order is read again so Cancel goes when it no longer applies.
|
|
145
|
+
- **Shop: the refund row counts only refunds that succeeded (web and React Native).** A pending or failed refund no
|
|
146
|
+
longer adds to the amount shown.
|
|
147
|
+
- **Shop: a prescription that cannot be filled right now (web and React Native).** The product page for a prescription
|
|
148
|
+
that is `being_prepared` (an open order is using it) or `too_soon` (filled too recently) now says the pet has a
|
|
149
|
+
prescription with the `rxBeingPrepared` or `rxTooSoon` line, instead of "No prescription on file" with Book a visit.
|
|
150
|
+
|
|
13
151
|
## [0.15.1] - 2026-10-23
|
|
14
152
|
|
|
15
153
|
This patch changes packaging and documentation for the Everfur SDK License version 2.1, and carries the Records,
|
package/README.md
CHANGED
|
@@ -89,7 +89,9 @@ dialog (web) that `VetVisitButton` and `EverfurChat` mount themselves; the hoste
|
|
|
89
89
|
and the call (`@everfur/sdk/televet/call`, `@everfur/sdk/web/televet/call`) are their own entries. On the web they
|
|
90
90
|
are loaded on demand, so a page where nobody opens a visit downloads neither and a page where nobody joins takes
|
|
91
91
|
no WebRTC dependency; on React Native both are static imports in the same bundle (the WebRTC stack is the native
|
|
92
|
-
module your app registers with `registerEverfurDaily`).
|
|
92
|
+
module your app registers with `registerEverfurDaily`). Because `EverfurChat` from `@everfur/sdk/chat` mounts the
|
|
93
|
+
visit host, a React Native app that imports it also bundles the booking and call screens; `@everfur/sdk/chat/lite`
|
|
94
|
+
is the same chat without that host, for an app that mounts `<EverfurTelevetHost />` itself or opens no visits.
|
|
93
95
|
[docs/partner-integration/16-TELEVET-VISITS.md](https://docs.everfur.com/vet-visits/).
|
|
94
96
|
|
|
95
97
|
## Quickstart
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"//": "GENERATED by scripts/subpath-shims.mjs from the package.json \"exports\" map. Do not edit by hand; run `npm run build`.",
|
|
3
|
+
"react-native": "../../dist/chat/lite/index.js",
|
|
4
|
+
"module": "../../dist/chat/lite/index.js",
|
|
5
|
+
"main": "../../dist/chat/lite/index.cjs",
|
|
6
|
+
"types": "../../dist/chat/lite/index.d.ts",
|
|
7
|
+
"sideEffects": false
|
|
8
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { a as EverfurChatProps } from './appStateLifecycle.d-Bd-rNy6K.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Entitlement-gated, four-state chat surface. Entitlement-OFF renders the CapabilityGate OffState;
|
|
7
|
+
* otherwise the body maps the controller snapshot to exactly one deliberate state.
|
|
8
|
+
*/
|
|
9
|
+
declare function EverfurChat(props: EverfurChatProps): ReactNode;
|
|
10
|
+
|
|
11
|
+
export { EverfurChat as E };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { a as EverfurChatProps } from './appStateLifecycle.d-_mh4CEAq.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Entitlement-gated, four-state chat surface. Entitlement-OFF renders the CapabilityGate OffState;
|
|
7
|
+
* otherwise the body maps the controller snapshot to exactly one deliberate state.
|
|
8
|
+
*/
|
|
9
|
+
declare function EverfurChat(props: EverfurChatProps): ReactNode;
|
|
10
|
+
|
|
11
|
+
export { EverfurChat as E };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
4
|
-
import { c as RecordsScreenBaseProps } from './screenProps.d-
|
|
4
|
+
import { c as RecordsScreenBaseProps } from './screenProps.d-BJMn1kTR.cjs';
|
|
5
5
|
|
|
6
6
|
interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
|
|
7
7
|
readonly style?: StyleProp<ViewStyle>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
|
|
2
2
|
import { CSSProperties, ReactNode } from 'react';
|
|
3
|
-
import { c as RecordsScreenBaseProps } from './screenProps.d-
|
|
3
|
+
import { c as RecordsScreenBaseProps } from './screenProps.d-BJMn1kTR.cjs';
|
|
4
4
|
|
|
5
5
|
interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
|
|
6
6
|
readonly style?: CSSProperties;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
4
|
-
import { c as RecordsScreenBaseProps } from './screenProps.d-
|
|
4
|
+
import { c as RecordsScreenBaseProps } from './screenProps.d-DGrfO17l.js';
|
|
5
5
|
|
|
6
6
|
interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
|
|
7
7
|
readonly style?: StyleProp<ViewStyle>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
|
|
2
2
|
import { CSSProperties, ReactNode } from 'react';
|
|
3
|
-
import { c as RecordsScreenBaseProps } from './screenProps.d-
|
|
3
|
+
import { c as RecordsScreenBaseProps } from './screenProps.d-DGrfO17l.js';
|
|
4
4
|
|
|
5
5
|
interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
|
|
6
6
|
readonly style?: CSSProperties;
|
|
@@ -3,7 +3,7 @@ import { CSSProperties, ReactNode } from 'react';
|
|
|
3
3
|
import { R as RecordsClinicController, C as CaptureRecordsSignature } from './clinicRequestProps.d-CjsMg_OD.js';
|
|
4
4
|
import { R as RecordsController } from './useRecords.d-DWk61a4c.js';
|
|
5
5
|
import { c as RecordForwardItem } from './models.d-DOwnr8fi.js';
|
|
6
|
-
import { c as RecordsScreenBaseProps } from './screenProps.d-
|
|
6
|
+
import { c as RecordsScreenBaseProps } from './screenProps.d-DGrfO17l.js';
|
|
7
7
|
import { E as EverfurRecordsSheet } from './sheetSeam.d-B09jf4YC.js';
|
|
8
8
|
|
|
9
9
|
interface EverfurRecordsPageProps extends RecordsScreenBaseProps {
|
|
@@ -3,7 +3,7 @@ import { CSSProperties, ReactNode } from 'react';
|
|
|
3
3
|
import { R as RecordsClinicController, C as CaptureRecordsSignature } from './clinicRequestProps.d-1dCtouGA.cjs';
|
|
4
4
|
import { R as RecordsController } from './useRecords.d-BYNX01El.cjs';
|
|
5
5
|
import { c as RecordForwardItem } from './models.d-BSqvbTE1.cjs';
|
|
6
|
-
import { c as RecordsScreenBaseProps } from './screenProps.d-
|
|
6
|
+
import { c as RecordsScreenBaseProps } from './screenProps.d-BJMn1kTR.cjs';
|
|
7
7
|
import { E as EverfurRecordsSheet } from './sheetSeam.d-BBuEIVsa.cjs';
|
|
8
8
|
|
|
9
9
|
interface EverfurRecordsPageProps extends RecordsScreenBaseProps {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
4
4
|
import { E as EverfurResult } from '../EverfurResult.d-BFH-3s6E.cjs';
|
|
5
|
-
import { A as AuthContext } from '../identity.d-
|
|
6
|
-
export { I as IdentityProvider, n as newSessionId } from '../identity.d-
|
|
5
|
+
import { A as AuthContext } from '../identity.d-COcNGuCJ.cjs';
|
|
6
|
+
export { I as IdentityProvider, n as newSessionId } from '../identity.d-COcNGuCJ.cjs';
|
|
7
7
|
import { P as PetRef } from '../ids.d-B2GAAifq.cjs';
|
|
8
8
|
export { B as Brand, U as UserRef, _ as __brand } from '../ids.d-B2GAAifq.cjs';
|
|
9
9
|
import { z } from 'zod';
|
|
@@ -14,7 +14,7 @@ import { E as EverfurError } from '../EverfurError.d-8NHtlgzA.cjs';
|
|
|
14
14
|
export { a as EverfurErrorCategory, b as EverfurErrorCode } from '../EverfurError.d-8NHtlgzA.cjs';
|
|
15
15
|
import { D as DisabledLevel, a as CapabilityDecision } from '../resolve.d-CoQWUy1Y.cjs';
|
|
16
16
|
export { b as CapabilityDisabled, C as CapabilityName } from '../resolve.d-CoQWUy1Y.cjs';
|
|
17
|
-
export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-
|
|
17
|
+
export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-D1xcxALX.cjs';
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* The full /state payload. `degraded` + `cache_epoch` + `cache_key` are additive fields an older backend
|
|
@@ -134,7 +134,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
|
|
|
134
134
|
degraded: z.ZodDefault<z.ZodBoolean>;
|
|
135
135
|
cache_epoch: z.ZodDefault<z.ZodNumber>;
|
|
136
136
|
}, "strip", z.ZodTypeAny, {
|
|
137
|
-
category: "idle" | "
|
|
137
|
+
category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
|
|
138
138
|
idle: "bundled";
|
|
139
139
|
tiers: {
|
|
140
140
|
image?: {
|
|
@@ -165,7 +165,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
|
|
|
165
165
|
degraded: boolean;
|
|
166
166
|
cache_epoch: number;
|
|
167
167
|
}, {
|
|
168
|
-
category: "idle" | "
|
|
168
|
+
category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
|
|
169
169
|
ttl_seconds: number;
|
|
170
170
|
idle?: "bundled" | undefined;
|
|
171
171
|
tiers?: {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
4
4
|
import { E as EverfurResult } from '../EverfurResult.d-D_-254ZY.js';
|
|
5
|
-
import { A as AuthContext } from '../identity.d-
|
|
6
|
-
export { I as IdentityProvider, n as newSessionId } from '../identity.d-
|
|
5
|
+
import { A as AuthContext } from '../identity.d-BEJcHY-5.js';
|
|
6
|
+
export { I as IdentityProvider, n as newSessionId } from '../identity.d-BEJcHY-5.js';
|
|
7
7
|
import { P as PetRef } from '../ids.d-B2GAAifq.js';
|
|
8
8
|
export { B as Brand, U as UserRef, _ as __brand } from '../ids.d-B2GAAifq.js';
|
|
9
9
|
import { z } from 'zod';
|
|
@@ -14,7 +14,7 @@ import { E as EverfurError } from '../EverfurError.d-8NHtlgzA.js';
|
|
|
14
14
|
export { a as EverfurErrorCategory, b as EverfurErrorCode } from '../EverfurError.d-8NHtlgzA.js';
|
|
15
15
|
import { D as DisabledLevel, a as CapabilityDecision } from '../resolve.d-CoQWUy1Y.js';
|
|
16
16
|
export { b as CapabilityDisabled, C as CapabilityName } from '../resolve.d-CoQWUy1Y.js';
|
|
17
|
-
export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-
|
|
17
|
+
export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-jTVsAeky.js';
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* The full /state payload. `degraded` + `cache_epoch` + `cache_key` are additive fields an older backend
|
|
@@ -134,7 +134,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
|
|
|
134
134
|
degraded: z.ZodDefault<z.ZodBoolean>;
|
|
135
135
|
cache_epoch: z.ZodDefault<z.ZodNumber>;
|
|
136
136
|
}, "strip", z.ZodTypeAny, {
|
|
137
|
-
category: "idle" | "
|
|
137
|
+
category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
|
|
138
138
|
idle: "bundled";
|
|
139
139
|
tiers: {
|
|
140
140
|
image?: {
|
|
@@ -165,7 +165,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
|
|
|
165
165
|
degraded: boolean;
|
|
166
166
|
cache_epoch: number;
|
|
167
167
|
}, {
|
|
168
|
-
category: "idle" | "
|
|
168
|
+
category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
|
|
169
169
|
ttl_seconds: number;
|
|
170
170
|
idle?: "bundled" | undefined;
|
|
171
171
|
tiers?: {
|
|
@@ -3,143 +3,18 @@ import { ReactNode } from 'react';
|
|
|
3
3
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
4
4
|
import { P as PetRef, C as ConversationId } from './ids.d-B2GAAifq.js';
|
|
5
5
|
import { i as EverfurPresentationInput } from './presentation.d-vy8kTGfR.js';
|
|
6
|
-
import { a as ChatCheckinTarget } from './ports.d-
|
|
7
|
-
import { W as WidgetPet, P as PetProfileInput } from './petsRepository.d-
|
|
6
|
+
import { a as ChatCheckinTarget } from './ports.d-B6kDPKF7.js';
|
|
7
|
+
import { W as WidgetPet, P as PetProfileInput } from './petsRepository.d-BudLFHVe.js';
|
|
8
8
|
import { E as EverfurStarterPrompt } from './quickPrompts.d-NM_81Jc1.js';
|
|
9
9
|
import { L as LifecyclePort } from './LifecyclePort.d-Cr1p33a7.js';
|
|
10
|
-
import { U as UrgencyDisplayLevel, E as EverfurChatDraftStore } from './attachments.d-
|
|
10
|
+
import { U as UrgencyDisplayLevel, E as EverfurChatDraftStore, b as ChatFollowUpPolicy } from './attachments.d-BiBGBE4o.js';
|
|
11
11
|
import { F as FileHandle } from './ports.d-BX4f4UsB.js';
|
|
12
|
+
import { g as EverfurChatOpeningCard, a as EverfurChatAnswerCards, f as EverfurChatHistorySheet, e as EverfurChatHistoryBar, c as EverfurChatEmptyState } from './threadOptions.d-DTsJFkL-.js';
|
|
13
|
+
import { E as EverfurChatEmptyHeaderContext, a as EverfurChatTopCard } from './threadOptions.d-GPJPprkn.js';
|
|
12
14
|
|
|
13
15
|
/** Where a picked image comes from: the host's photo library, or its camera. */
|
|
14
16
|
type AttachmentSource = 'photo' | 'camera';
|
|
15
17
|
|
|
16
|
-
/**
|
|
17
|
-
* The history bar: a "Chats" control with the member's thread count that opens the history, and a "New chat"
|
|
18
|
-
* control. For a surface that hides the SDK header and still wants the member's past chats.
|
|
19
|
-
*/
|
|
20
|
-
interface EverfurChatHistoryBar {
|
|
21
|
-
/** The history control's words ("Chats"). */
|
|
22
|
-
readonly chats: string;
|
|
23
|
-
/** The new-chat control's words ("New chat"). */
|
|
24
|
-
readonly newChat: string;
|
|
25
|
-
/** Draw the two icons your way. */
|
|
26
|
-
readonly renderIcon?: (icon: 'history' | 'edit') => ReactNode;
|
|
27
|
-
/** Your own control after "Chats". Absent, nothing is drawn. */
|
|
28
|
-
readonly extra?: ReactNode;
|
|
29
|
-
}
|
|
30
|
-
/** The empty thread's own title and chip fills. Absent, the empty state is Everfur's own. */
|
|
31
|
-
interface EverfurChatEmptyState {
|
|
32
|
-
/** The title over the starter chips, in place of "What can we help {pet} with today?". */
|
|
33
|
-
readonly title?: string;
|
|
34
|
-
/**
|
|
35
|
-
* Fills for the chips that bring none of their own, taken in turn (the first chip the first fill, and round
|
|
36
|
-
* again). Each is a fill and its ink. Absent, Raph's v3 cycle on a light theme; empty, the theme's paint.
|
|
37
|
-
*/
|
|
38
|
-
readonly chipTints?: readonly {
|
|
39
|
-
readonly tint: string;
|
|
40
|
-
readonly ink?: string;
|
|
41
|
-
}[];
|
|
42
|
-
}
|
|
43
|
-
/** One card under an answer in the cards answer style: a record, a stat, or a link to one of your screens. */
|
|
44
|
-
interface EverfurChatAnswerCard {
|
|
45
|
-
/** Stable key within the answer. */
|
|
46
|
-
readonly key: string;
|
|
47
|
-
readonly title: string;
|
|
48
|
-
/** The small line under the title. */
|
|
49
|
-
readonly meta?: string;
|
|
50
|
-
/** A status pill. */
|
|
51
|
-
readonly pill?: {
|
|
52
|
-
readonly label: string;
|
|
53
|
-
readonly tone?: string;
|
|
54
|
-
};
|
|
55
|
-
/** A stat card's value: drawn in place of the pill and the chevron. */
|
|
56
|
-
readonly value?: {
|
|
57
|
-
readonly amount: string;
|
|
58
|
-
readonly unit?: string;
|
|
59
|
-
};
|
|
60
|
-
/** The tile at the start: an icon of yours, or an https image. */
|
|
61
|
-
readonly tile?: {
|
|
62
|
-
readonly icon?: ReactNode;
|
|
63
|
-
readonly imageUrl?: string;
|
|
64
|
-
readonly tone?: string;
|
|
65
|
-
};
|
|
66
|
-
readonly variant?: string;
|
|
67
|
-
/** Given, the card is a button that calls this. Absent, a static card. */
|
|
68
|
-
readonly onPress?: () => void;
|
|
69
|
-
/** A card of your own, drawn in the card's place. If it throws, the slot draws nothing. */
|
|
70
|
-
readonly render?: () => ReactNode;
|
|
71
|
-
}
|
|
72
|
-
/** What `answerCards.cards` receives: the settled answer's text and the question it answered. */
|
|
73
|
-
interface EverfurChatAnswerContext {
|
|
74
|
-
readonly answer: string;
|
|
75
|
-
readonly question: string | null;
|
|
76
|
-
/** The answer's message id, stable for the life of the thread. */
|
|
77
|
-
readonly messageId: string;
|
|
78
|
-
}
|
|
79
|
-
/** The cards answer style's content (used while presentation `chatAnswerStyle` is `cards`). The words are yours. */
|
|
80
|
-
interface EverfurChatAnswerCards {
|
|
81
|
-
/** The line over each answer (an icon and your words). Absent, the assistant's name line. */
|
|
82
|
-
readonly byline?: {
|
|
83
|
-
readonly label: string;
|
|
84
|
-
readonly icon?: ReactNode;
|
|
85
|
-
};
|
|
86
|
-
/** Your cards under a settled answer. A throw draws none. */
|
|
87
|
-
readonly cards?: (context: EverfurChatAnswerContext) => readonly EverfurChatAnswerCard[];
|
|
88
|
-
/** Two feedback chips in place of the footer's thumbs, mapped to thumbs up and thumbs down. */
|
|
89
|
-
readonly feedback?: {
|
|
90
|
-
readonly helpful: string;
|
|
91
|
-
readonly notHelpful: string;
|
|
92
|
-
};
|
|
93
|
-
/** Your own rows at the top of the follow-ups, for the answer it receives. */
|
|
94
|
-
readonly followUpActions?: (context: EverfurChatAnswerContext) => readonly EverfurChatFollowUpAction[];
|
|
95
|
-
/** Draw the chevron your way. Absent, Everfur's glyph. */
|
|
96
|
-
readonly renderIcon?: (icon: 'chevron') => ReactNode;
|
|
97
|
-
}
|
|
98
|
-
/** A row of yours at the top of the follow-ups under an answer. */
|
|
99
|
-
interface EverfurChatFollowUpAction {
|
|
100
|
-
readonly key: string;
|
|
101
|
-
readonly label: string;
|
|
102
|
-
readonly icon?: ReactNode;
|
|
103
|
-
readonly onPress: () => void;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* The card at the top of the empty thread (presentation `chatTopCard: "focus"`): one finding, in your words, with
|
|
107
|
-
* an action of yours and a question it can ask in the thread. Its close control folds it into a pill.
|
|
108
|
-
*/
|
|
109
|
-
interface EverfurChatTopCard {
|
|
110
|
-
/** The small heading ("Her focus"). */
|
|
111
|
-
readonly kicker: string;
|
|
112
|
-
/** A source badge ("<your brand> results"). */
|
|
113
|
-
readonly badge?: string;
|
|
114
|
-
readonly title: string;
|
|
115
|
-
/** The finding: a bold lead and the rest of the sentence. */
|
|
116
|
-
readonly lead?: string;
|
|
117
|
-
readonly body?: string;
|
|
118
|
-
/** Your action ("See her Health Plan"). */
|
|
119
|
-
readonly action?: {
|
|
120
|
-
readonly label: string;
|
|
121
|
-
readonly onPress: () => void;
|
|
122
|
-
};
|
|
123
|
-
/** A question the card asks in this thread. */
|
|
124
|
-
readonly ask?: {
|
|
125
|
-
readonly label: string;
|
|
126
|
-
readonly prompt: string;
|
|
127
|
-
};
|
|
128
|
-
/** The close control's accessible name. Absent, the shared `Close`. */
|
|
129
|
-
readonly closeLabel?: string;
|
|
130
|
-
/** The pill's words while the card is closed (defaults to `kicker`). */
|
|
131
|
-
readonly pill?: string;
|
|
132
|
-
/** Draw the close glyph your way. */
|
|
133
|
-
readonly renderIcon?: (icon: 'close') => ReactNode;
|
|
134
|
-
}
|
|
135
|
-
/** The history bottom sheet (presentation `chatHistoryStyle: "sheet"`). */
|
|
136
|
-
interface EverfurChatHistorySheet {
|
|
137
|
-
/** The sheet's small title ("Chats with Ask <your brand>"). Absent, Everfur's history heading. */
|
|
138
|
-
readonly title?: string;
|
|
139
|
-
/** Draw the icons your way. */
|
|
140
|
-
readonly renderIcon?: (icon: 'close' | 'chat' | 'edit') => ReactNode;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
18
|
/**
|
|
144
19
|
* The host's image picker for chat attachments. The SDK depends on no picker or camera module: open your own
|
|
145
20
|
* (for example `expo-image-picker`'s `launchImageLibraryAsync({ mediaTypes: ['images'] })`, or your camera
|
|
@@ -155,7 +30,7 @@ interface EverfurChatAttachments {
|
|
|
155
30
|
readonly pick: (source: AttachmentSource) => Promise<FileHandle | readonly FileHandle[] | null>;
|
|
156
31
|
/** The sources to offer, one popover tile each; default `['photo']`. */
|
|
157
32
|
readonly sources?: readonly AttachmentSource[];
|
|
158
|
-
/** Images per message; default
|
|
33
|
+
/** Images per message; default 5, the web composer's and the server's cap. */
|
|
159
34
|
readonly maxPerMessage?: number;
|
|
160
35
|
}
|
|
161
36
|
|
|
@@ -235,10 +110,12 @@ interface EverfurChatProps {
|
|
|
235
110
|
* Your app's lifecycle signals. Everfur has no socket and no polling here, so a message the platform
|
|
236
111
|
* writes into the thread (a follow-up check-in, a reminder) is not visible until something re-reads it.
|
|
237
112
|
* Tell Everfur when your app comes back to the foreground, when connectivity returns and when a push
|
|
238
|
-
* announced a change, and the thread and the unread dot catch up on that signal alone.
|
|
239
|
-
*
|
|
113
|
+
* announced a change, and the thread and the unread dot catch up on that signal alone. Absent, Everfur uses
|
|
114
|
+
* React Native's own signal (AppState returning to `active` from the background; see `createAppStateLifecycle`).
|
|
115
|
+
* Pass your own port to add connectivity or a push announcement, or `null` to turn the re-read off, in which
|
|
116
|
+
* case chat refreshes only when the user does something.
|
|
240
117
|
*/
|
|
241
|
-
readonly lifecycle?: LifecyclePort;
|
|
118
|
+
readonly lifecycle?: LifecyclePort | null;
|
|
242
119
|
/**
|
|
243
120
|
* Your own storage for an unsent draft. Given, what the user typed and did not send survives leaving this
|
|
244
121
|
* screen; absent, the draft lives in memory for as long as the surface is mounted and nowhere else.
|
|
@@ -290,19 +167,47 @@ interface EverfurChatProps {
|
|
|
290
167
|
/**
|
|
291
168
|
* The layout settings (Raph v3): the answer style, the history style, the top card, the composer style and
|
|
292
169
|
* placeholder, the history bar's place, the general banner, the send button, the follow-up count and the upload
|
|
293
|
-
* control. Each also comes from your console
|
|
294
|
-
* unless the console locks it. `attachments` counts
|
|
295
|
-
*
|
|
296
|
-
* content only and never switch a layout on by
|
|
170
|
+
* control, and the microphone (`chatComposerMic`). Each also comes from your console
|
|
171
|
+
* (render_hints.branding.presentation); a field you set here wins unless the console locks it. `attachments` counts
|
|
172
|
+
* as your explicit `chatComposerUpload: true`, `dictation` as your `chatComposerMic` and `followUpPolicy` as your
|
|
173
|
+
* follow-up count. `topCard`, `answerCards` and `historySheet` are content only and never switch a layout on by
|
|
174
|
+
* themselves.
|
|
297
175
|
*/
|
|
298
176
|
readonly presentation?: EverfurPresentationInput;
|
|
177
|
+
/**
|
|
178
|
+
* Voice dictation on the composer (the device's own speech recognizer, no Everfur service). On by default; the
|
|
179
|
+
* control appears only when your app has the optional `expo-speech-recognition` module installed and the device
|
|
180
|
+
* has a recognizer. `false` is the kill switch.
|
|
181
|
+
*/
|
|
182
|
+
readonly dictation?: boolean;
|
|
183
|
+
/**
|
|
184
|
+
* Your own content for the top of the empty thread, above its title and starter chips (for example a card of the
|
|
185
|
+
* pet's top findings). Rendered only while the thread is empty; if it throws, the empty state draws as usual.
|
|
186
|
+
* Absent, the empty state is Everfur's own. It receives `{ ask }`: a row of your card can ask its question in
|
|
187
|
+
* this thread directly, with no screen in between.
|
|
188
|
+
*/
|
|
189
|
+
readonly renderEmptyHeader?: (context: EverfurChatEmptyHeaderContext) => ReactNode;
|
|
190
|
+
/**
|
|
191
|
+
* Your rule for the follow-ups under a reply: how many (exactly, with `fill`), which backend prompts to drop
|
|
192
|
+
* (`exclude`, for example visit or booking prompts you do not offer), your own prompts to top up with, and a
|
|
193
|
+
* visible `label` over them. Absent, at most three of the backend's, as before.
|
|
194
|
+
*/
|
|
195
|
+
readonly followUpPolicy?: ChatFollowUpPolicy;
|
|
196
|
+
/**
|
|
197
|
+
* The card a notification-opened thread starts with: drawn in place of the first bubble while that bubble is
|
|
198
|
+
* `initialAsk`. Pair it with `initialAsk` (the notification's question). Absent, the bubble draws as usual.
|
|
199
|
+
*/
|
|
200
|
+
readonly initialAskCard?: EverfurChatOpeningCard;
|
|
299
201
|
/**
|
|
300
202
|
* The focus card's content (drawn while `chatTopCard` resolves to `focus`). Absent, the card is built from the
|
|
301
203
|
* pet's Health Plan page focus; no page, no focus, a refused read or a page still loading draws no card.
|
|
302
204
|
*/
|
|
303
205
|
readonly topCard?: EverfurChatTopCard;
|
|
304
|
-
/**
|
|
305
|
-
|
|
206
|
+
/**
|
|
207
|
+
* Opens the pet's Health Plan (your tab or screen), called with the pet (the chat's `petRef`, else the provider's
|
|
208
|
+
* active pet): the plan-built focus card's `See her Health Plan` button.
|
|
209
|
+
*/
|
|
210
|
+
readonly onOpenHealthPlan?: (petRef: PetRef | null) => void;
|
|
306
211
|
/** The cards answer style's content (used while `chatAnswerStyle` resolves to `cards`). */
|
|
307
212
|
readonly answerCards?: EverfurChatAnswerCards;
|
|
308
213
|
/** The history sheet's title and icons (used while `chatHistoryStyle` resolves to `sheet`). */
|
|
@@ -329,10 +234,23 @@ interface EverfurChatProps {
|
|
|
329
234
|
*/
|
|
330
235
|
readonly textingEntry?: boolean;
|
|
331
236
|
}
|
|
237
|
+
|
|
238
|
+
/** The host's loader: a thunk that requires the expo-speech-recognition module and returns it. */
|
|
239
|
+
type EverfurDictationLoader = () => unknown;
|
|
332
240
|
/**
|
|
333
|
-
*
|
|
334
|
-
*
|
|
241
|
+
* Turns on the chat composer's microphone on React Native: register the optional `expo-speech-recognition` module's
|
|
242
|
+
* loader once, in your app entry.
|
|
243
|
+
*
|
|
244
|
+
* Pass a thunk that requires the expo-speech-recognition module and returns it; the chat docs ("Dictation") show the
|
|
245
|
+
* exact line.
|
|
246
|
+
*
|
|
247
|
+
* Without it, or where the module has no native side (Expo Go, an older binary), the composer draws no microphone.
|
|
248
|
+
* Passing `null` unregisters it. Registering clears the memo, so a later registration always wins, and a composer
|
|
249
|
+
* already on screen re-reads it (best practice is still to register before the first chat renders).
|
|
335
250
|
*/
|
|
336
|
-
declare function
|
|
251
|
+
declare function registerEverfurDictation(next: EverfurDictationLoader | null): void;
|
|
252
|
+
|
|
253
|
+
/** The app's foreground edge for EverfurChat: AppState going from `background` back to `active`. */
|
|
254
|
+
declare function createAppStateLifecycle(): LifecyclePort;
|
|
337
255
|
|
|
338
|
-
export { type AttachmentSource as A,
|
|
256
|
+
export { type AttachmentSource as A, type EverfurChatAttachments as E, type RenderVetAction as R, type EverfurChatProps as a, type EverfurDictationLoader as b, createAppStateLifecycle as c, registerEverfurDictation as r };
|