@uplifted/react 0.22.6

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 (221) hide show
  1. package/dist/AddClientSheet.d.ts +39 -0
  2. package/dist/AddClientSheet.d.ts.map +1 -0
  3. package/dist/AddClientSheet.js +108 -0
  4. package/dist/AddClientSheet.js.map +1 -0
  5. package/dist/AiSettingsSheet.d.ts +20 -0
  6. package/dist/AiSettingsSheet.d.ts.map +1 -0
  7. package/dist/AiSettingsSheet.js +274 -0
  8. package/dist/AiSettingsSheet.js.map +1 -0
  9. package/dist/AssistantGrid.d.ts +30 -0
  10. package/dist/AssistantGrid.d.ts.map +1 -0
  11. package/dist/AssistantGrid.js +68 -0
  12. package/dist/AssistantGrid.js.map +1 -0
  13. package/dist/AttachmentPicker.d.ts +38 -0
  14. package/dist/AttachmentPicker.d.ts.map +1 -0
  15. package/dist/AttachmentPicker.js +173 -0
  16. package/dist/AttachmentPicker.js.map +1 -0
  17. package/dist/BulkGenerateSheet.d.ts +25 -0
  18. package/dist/BulkGenerateSheet.d.ts.map +1 -0
  19. package/dist/BulkGenerateSheet.js +65 -0
  20. package/dist/BulkGenerateSheet.js.map +1 -0
  21. package/dist/ChannelBadge.d.ts +16 -0
  22. package/dist/ChannelBadge.d.ts.map +1 -0
  23. package/dist/ChannelBadge.js +19 -0
  24. package/dist/ChannelBadge.js.map +1 -0
  25. package/dist/ChannelExplainer.d.ts +17 -0
  26. package/dist/ChannelExplainer.d.ts.map +1 -0
  27. package/dist/ChannelExplainer.js +25 -0
  28. package/dist/ChannelExplainer.js.map +1 -0
  29. package/dist/ClientList.d.ts +43 -0
  30. package/dist/ClientList.d.ts.map +1 -0
  31. package/dist/ClientList.js +76 -0
  32. package/dist/ClientList.js.map +1 -0
  33. package/dist/ClosedWindowBanner.d.ts +12 -0
  34. package/dist/ClosedWindowBanner.d.ts.map +1 -0
  35. package/dist/ClosedWindowBanner.js +15 -0
  36. package/dist/ClosedWindowBanner.js.map +1 -0
  37. package/dist/Composer.d.ts +49 -0
  38. package/dist/Composer.d.ts.map +1 -0
  39. package/dist/Composer.js +99 -0
  40. package/dist/Composer.js.map +1 -0
  41. package/dist/ComposerExtras.d.ts +15 -0
  42. package/dist/ComposerExtras.d.ts.map +1 -0
  43. package/dist/ComposerExtras.js +14 -0
  44. package/dist/ComposerExtras.js.map +1 -0
  45. package/dist/ConversationPane.d.ts +33 -0
  46. package/dist/ConversationPane.d.ts.map +1 -0
  47. package/dist/ConversationPane.js +126 -0
  48. package/dist/ConversationPane.js.map +1 -0
  49. package/dist/DeliveryReceipt.d.ts +7 -0
  50. package/dist/DeliveryReceipt.d.ts.map +1 -0
  51. package/dist/DeliveryReceipt.js +13 -0
  52. package/dist/DeliveryReceipt.js.map +1 -0
  53. package/dist/DraftGrid.d.ts +17 -0
  54. package/dist/DraftGrid.d.ts.map +1 -0
  55. package/dist/DraftGrid.js +43 -0
  56. package/dist/DraftGrid.js.map +1 -0
  57. package/dist/HostPreviewPane.d.ts +37 -0
  58. package/dist/HostPreviewPane.d.ts.map +1 -0
  59. package/dist/HostPreviewPane.js +106 -0
  60. package/dist/HostPreviewPane.js.map +1 -0
  61. package/dist/InlineDrafts.d.ts +14 -0
  62. package/dist/InlineDrafts.d.ts.map +1 -0
  63. package/dist/InlineDrafts.js +19 -0
  64. package/dist/InlineDrafts.js.map +1 -0
  65. package/dist/ItemActions.d.ts +23 -0
  66. package/dist/ItemActions.d.ts.map +1 -0
  67. package/dist/ItemActions.js +83 -0
  68. package/dist/ItemActions.js.map +1 -0
  69. package/dist/MediaAttachment.d.ts +7 -0
  70. package/dist/MediaAttachment.d.ts.map +1 -0
  71. package/dist/MediaAttachment.js +37 -0
  72. package/dist/MediaAttachment.js.map +1 -0
  73. package/dist/OfferSheet.d.ts +32 -0
  74. package/dist/OfferSheet.d.ts.map +1 -0
  75. package/dist/OfferSheet.js +84 -0
  76. package/dist/OfferSheet.js.map +1 -0
  77. package/dist/ProactiveOptionsSheet.d.ts +14 -0
  78. package/dist/ProactiveOptionsSheet.d.ts.map +1 -0
  79. package/dist/ProactiveOptionsSheet.js +58 -0
  80. package/dist/ProactiveOptionsSheet.js.map +1 -0
  81. package/dist/QuickSend.d.ts +15 -0
  82. package/dist/QuickSend.d.ts.map +1 -0
  83. package/dist/QuickSend.js +90 -0
  84. package/dist/QuickSend.js.map +1 -0
  85. package/dist/SegmentEditor.d.ts +25 -0
  86. package/dist/SegmentEditor.d.ts.map +1 -0
  87. package/dist/SegmentEditor.js +95 -0
  88. package/dist/SegmentEditor.js.map +1 -0
  89. package/dist/Sheet.d.ts +13 -0
  90. package/dist/Sheet.d.ts.map +1 -0
  91. package/dist/Sheet.js +64 -0
  92. package/dist/Sheet.js.map +1 -0
  93. package/dist/ThreadFeed.d.ts +27 -0
  94. package/dist/ThreadFeed.d.ts.map +1 -0
  95. package/dist/ThreadFeed.js +42 -0
  96. package/dist/ThreadFeed.js.map +1 -0
  97. package/dist/UpliftPanel.d.ts +40 -0
  98. package/dist/UpliftPanel.d.ts.map +1 -0
  99. package/dist/UpliftPanel.js +219 -0
  100. package/dist/UpliftPanel.js.map +1 -0
  101. package/dist/UpliftProvider.d.ts +15 -0
  102. package/dist/UpliftProvider.d.ts.map +1 -0
  103. package/dist/UpliftProvider.js +19 -0
  104. package/dist/UpliftProvider.js.map +1 -0
  105. package/dist/WaitingTemplateGhost.d.ts +12 -0
  106. package/dist/WaitingTemplateGhost.d.ts.map +1 -0
  107. package/dist/WaitingTemplateGhost.js +16 -0
  108. package/dist/WaitingTemplateGhost.js.map +1 -0
  109. package/dist/channels.d.ts +22 -0
  110. package/dist/channels.d.ts.map +1 -0
  111. package/dist/channels.js +31 -0
  112. package/dist/channels.js.map +1 -0
  113. package/dist/errors.d.ts +6 -0
  114. package/dist/errors.d.ts.map +1 -0
  115. package/dist/errors.js +20 -0
  116. package/dist/errors.js.map +1 -0
  117. package/dist/host.d.ts +45 -0
  118. package/dist/host.d.ts.map +1 -0
  119. package/dist/host.js +35 -0
  120. package/dist/host.js.map +1 -0
  121. package/dist/icons.d.ts +48 -0
  122. package/dist/icons.d.ts.map +1 -0
  123. package/dist/icons.js +71 -0
  124. package/dist/icons.js.map +1 -0
  125. package/dist/index.d.ts +58 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +36 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/labels.d.ts +58 -0
  130. package/dist/labels.d.ts.map +1 -0
  131. package/dist/labels.js +86 -0
  132. package/dist/labels.js.map +1 -0
  133. package/dist/phone.d.ts +18 -0
  134. package/dist/phone.d.ts.map +1 -0
  135. package/dist/phone.js +27 -0
  136. package/dist/phone.js.map +1 -0
  137. package/dist/proactiveIcons.d.ts +6 -0
  138. package/dist/proactiveIcons.d.ts.map +1 -0
  139. package/dist/proactiveIcons.js +39 -0
  140. package/dist/proactiveIcons.js.map +1 -0
  141. package/dist/purposes.d.ts +19 -0
  142. package/dist/purposes.d.ts.map +1 -0
  143. package/dist/purposes.js +20 -0
  144. package/dist/purposes.js.map +1 -0
  145. package/dist/segments.d.ts +29 -0
  146. package/dist/segments.d.ts.map +1 -0
  147. package/dist/segments.js +75 -0
  148. package/dist/segments.js.map +1 -0
  149. package/dist/smsSegments.d.ts +28 -0
  150. package/dist/smsSegments.d.ts.map +1 -0
  151. package/dist/smsSegments.js +100 -0
  152. package/dist/smsSegments.js.map +1 -0
  153. package/dist/styles.d.ts +15 -0
  154. package/dist/styles.d.ts.map +1 -0
  155. package/dist/styles.js +545 -0
  156. package/dist/styles.js.map +1 -0
  157. package/dist/time.d.ts +14 -0
  158. package/dist/time.d.ts.map +1 -0
  159. package/dist/time.js +80 -0
  160. package/dist/time.js.map +1 -0
  161. package/dist/useAiSettings.d.ts +11 -0
  162. package/dist/useAiSettings.d.ts.map +1 -0
  163. package/dist/useAiSettings.js +21 -0
  164. package/dist/useAiSettings.js.map +1 -0
  165. package/dist/useBilling.d.ts +40 -0
  166. package/dist/useBilling.d.ts.map +1 -0
  167. package/dist/useBilling.js +155 -0
  168. package/dist/useBilling.js.map +1 -0
  169. package/dist/useBulkDrafts.d.ts +41 -0
  170. package/dist/useBulkDrafts.d.ts.map +1 -0
  171. package/dist/useBulkDrafts.js +112 -0
  172. package/dist/useBulkDrafts.js.map +1 -0
  173. package/dist/useClients.d.ts +16 -0
  174. package/dist/useClients.d.ts.map +1 -0
  175. package/dist/useClients.js +22 -0
  176. package/dist/useClients.js.map +1 -0
  177. package/dist/useDeliveryStatus.d.ts +7 -0
  178. package/dist/useDeliveryStatus.d.ts.map +1 -0
  179. package/dist/useDeliveryStatus.js +39 -0
  180. package/dist/useDeliveryStatus.js.map +1 -0
  181. package/dist/useDrafts.d.ts +19 -0
  182. package/dist/useDrafts.d.ts.map +1 -0
  183. package/dist/useDrafts.js +60 -0
  184. package/dist/useDrafts.js.map +1 -0
  185. package/dist/useInstructions.d.ts +9 -0
  186. package/dist/useInstructions.d.ts.map +1 -0
  187. package/dist/useInstructions.js +20 -0
  188. package/dist/useInstructions.js.map +1 -0
  189. package/dist/useLiveUpdates.d.ts +9 -0
  190. package/dist/useLiveUpdates.d.ts.map +1 -0
  191. package/dist/useLiveUpdates.js +48 -0
  192. package/dist/useLiveUpdates.js.map +1 -0
  193. package/dist/usePolling.d.ts +6 -0
  194. package/dist/usePolling.d.ts.map +1 -0
  195. package/dist/usePolling.js +31 -0
  196. package/dist/usePolling.js.map +1 -0
  197. package/dist/usePreviewDrafts.d.ts +15 -0
  198. package/dist/usePreviewDrafts.d.ts.map +1 -0
  199. package/dist/usePreviewDrafts.js +77 -0
  200. package/dist/usePreviewDrafts.js.map +1 -0
  201. package/dist/useProactiveOptions.d.ts +15 -0
  202. package/dist/useProactiveOptions.d.ts.map +1 -0
  203. package/dist/useProactiveOptions.js +39 -0
  204. package/dist/useProactiveOptions.js.map +1 -0
  205. package/dist/useSend.d.ts +16 -0
  206. package/dist/useSend.d.ts.map +1 -0
  207. package/dist/useSend.js +50 -0
  208. package/dist/useSend.js.map +1 -0
  209. package/dist/useStickToBottom.d.ts +12 -0
  210. package/dist/useStickToBottom.d.ts.map +1 -0
  211. package/dist/useStickToBottom.js +71 -0
  212. package/dist/useStickToBottom.js.map +1 -0
  213. package/dist/useThread.d.ts +26 -0
  214. package/dist/useThread.d.ts.map +1 -0
  215. package/dist/useThread.js +76 -0
  216. package/dist/useThread.js.map +1 -0
  217. package/dist/useWhatsAppWindow.d.ts +8 -0
  218. package/dist/useWhatsAppWindow.d.ts.map +1 -0
  219. package/dist/useWhatsAppWindow.js +22 -0
  220. package/dist/useWhatsAppWindow.js.map +1 -0
  221. package/package.json +36 -0
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { DeliveryReceipt } from "./DeliveryReceipt.js";
4
+ import { EventIcon } from "./icons.js";
5
+ import { MediaAttachment } from "./MediaAttachment.js";
6
+ import { clockLabel, dayKey, dayLabel } from "./time.js";
7
+ import { useStickToBottom } from "./useStickToBottom.js";
8
+ export function ThreadFeed({ thread, clientName, activitySourceLabel, now, actions, foot }) {
9
+ const first = clientName.split(" ")[0] ?? clientName;
10
+ const stick = useStickToBottom(thread.messages[0]?.id);
11
+ return (_jsxs("div", { className: "u-feed", role: "log", "aria-label": `Conversation with ${clientName}`, "aria-busy": thread.status === "loading", ...stick, children: [thread.status === "loading" && (_jsxs(_Fragment, { children: [_jsx("div", { className: "u-skel", style: { width: "40%", alignSelf: "flex-end" } }), _jsx("div", { className: "u-skel", style: { width: "60%" } }), _jsx("div", { className: "u-skel", style: { width: "35%", alignSelf: "center" } })] })), thread.status === "error" && (_jsxs("div", { className: "u-state", role: "alert", children: [_jsx("h3", { children: "Couldn't load this conversation" }), _jsx("p", { children: thread.error?.message }), _jsx("button", { type: "button", className: "u-retry", onClick: thread.reload, children: "Retry" })] })), thread.status === "ready" && thread.messages.length === 0 && (_jsx("div", { className: "u-state", children: _jsxs("p", { children: ["No messages or activity yet. Send ", first, " the first one below."] }) })), thread.status === "ready" && thread.hasMore && (_jsx("button", { type: "button", className: "u-older", onClick: thread.loadOlder, disabled: thread.loadingOlder, children: thread.loadingOlder ? "Loading…" : "Show older" })), thread.status === "ready" && !thread.hasMore && thread.messages.length > 0 && _jsx("span", { className: "u-hist-start", children: "\u2014 beginning of history \u2014" }), thread.status === "ready" && withDays(thread.messages).map((item) => item.type === "day"
12
+ ? _jsx("span", { className: "u-day", children: dayLabel(item.at, now) }, item.key)
13
+ : (_jsx(Item, { m: item.message, first: first, source: activitySourceLabel, children: actions ? actions(item.message) : null }, item.message.id))), thread.status === "ready" && foot] }));
14
+ }
15
+ /** Insert a day separator wherever the local calendar day changes. */
16
+ export function withDays(messages) {
17
+ const out = [];
18
+ let lastDay = "";
19
+ for (const m of messages) {
20
+ const k = dayKey(m.sentAt);
21
+ if (k && k !== lastDay) {
22
+ out.push({ type: "day", key: `day_${k}`, at: m.sentAt ?? "" });
23
+ lastDay = k;
24
+ }
25
+ out.push({ type: "message", message: m });
26
+ }
27
+ return out;
28
+ }
29
+ function Item({ m, first, source, children }) {
30
+ const time = clockLabel(m.sentAt);
31
+ const [showTemplate, setShowTemplate] = useState(false);
32
+ if (m.kind === "event") {
33
+ return (_jsxs("div", { className: "u-ev", children: [_jsx(EventIcon, { type: m.eventType }), _jsxs("div", { children: [_jsx("b", { children: m.body }), _jsxs("div", { className: "u-meta", children: ["From ", source, time ? ` · ${time}` : ""] }), children] })] }));
34
+ }
35
+ const out = m.direction !== "inbound";
36
+ const atts = m.attachments ?? [];
37
+ // A media-only send stores a log placeholder as its content ("Message from trainer logged: [ISO]
38
+ // [attachment]"). Native's adapter drops it; so do we, in case an older server sends it through.
39
+ const body = atts.length && /^(\[attachment\]|Message from (trainer|client) logged:)/i.test(m.body.trim()) ? "" : m.body;
40
+ return (_jsxs(_Fragment, { children: [atts.length > 0 && (_jsx("div", { className: `u-att ${out ? "u-att-out" : "u-att-in"}`, children: atts.map((a, i) => _jsx(MediaAttachment, { a: a, out: out }, i)) })), body && _jsx("div", { className: `u-bub ${out ? "u-out" : "u-in"}${showTemplate ? " u-tpl-shown" : ""}`, children: showTemplate && m.templateBody ? m.templateBody : body }), _jsxs("div", { className: `u-bmeta${out ? " u-r" : ""}`, children: [out ? "You" : first, time ? ` · ${time}` : "", out && m.sentViaTemplate && (_jsx("button", { type: "button", className: "u-tpl-chip", onClick: () => setShowTemplate((v) => !v), "aria-pressed": showTemplate, title: "Outside the 24h window this went out as a WhatsApp template with a preview + secure link", children: m.deliveredViaTapAt ? "Template · tapped" : showTemplate ? "Show your message" : "Sent as template" })), out && _jsx(DeliveryReceipt, { status: m.deliveryStatus })] }), children] }));
41
+ }
42
+ //# sourceMappingURL=ThreadFeed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThreadFeed.js","sourceRoot":"","sources":["../src/ThreadFeed.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Channel, Client } from "@uplifted/sdk";
2
+ import { type HostActivityLoader, type HostClient } from "./host.js";
3
+ export interface UpliftPanelProps {
4
+ /** Header title. Default "Messages". */
5
+ title?: string;
6
+ /** The host app's name, used in activity cards and the offer copy. Default "your app". */
7
+ hostName?: string;
8
+ /** Client to open first. Otherwise the most urgent client is selected. */
9
+ initialClientId?: string | null;
10
+ /**
11
+ * Optional override for hosts that bill coaches themselves. By default Uplift bills: the offer
12
+ * shows the Stripe price (GET /billing/plan) and opens Stripe Checkout in a new tab.
13
+ */
14
+ onCheckout?: () => void | Promise<void>;
15
+ /** Called after a successful send. */
16
+ onSent?: (client: Client) => void;
17
+ /** Called after a client is added. */
18
+ onClientAdded?: (client: Client) => void;
19
+ /** Channels whose rules the coach already confirmed (persisted by the host or Uplift, DT3). */
20
+ acknowledgedChannels?: Channel[];
21
+ onChannelAcknowledged?: (channel: Channel) => void;
22
+ /**
23
+ * The host's clients. Used by the add-client picker (name prefill, id link) and, for those
24
+ * without an `upliftClientId`, listed as "not connected" with a preview pane (D19).
25
+ */
26
+ hostClients?: ReadonlyArray<HostClient>;
27
+ /** Loads a not-connected host client's recent activity for the preview feed and drafts. */
28
+ hostActivity?: HostActivityLoader;
29
+ /** The coach's name, so preview drafts can be signed the way the real ones are. */
30
+ coachName?: string;
31
+ /** Fallback roster and open-thread refresh interval while the tab is visible and the stream is down. 0 disables. Default 20000. */
32
+ pollMs?: number;
33
+ /** Open the live update stream (partner GET /stream via the host). Default true. */
34
+ live?: boolean;
35
+ /** Clock for relative labels. Default: real time, read at render. */
36
+ now?: () => Date;
37
+ className?: string;
38
+ }
39
+ export declare function UpliftPanel({ title, hostName, initialClientId, onCheckout, onSent, onClientAdded, acknowledgedChannels, onChannelAcknowledged, hostClients, hostActivity, coachName, now, className, pollMs, live: liveUpdates }: UpliftPanelProps): import("react").JSX.Element;
40
+ //# sourceMappingURL=UpliftPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpliftPanel.d.ts","sourceRoot":"","sources":["../src/UpliftPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAKrD,OAAO,EAAgD,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBnH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,sCAAsC;IACtC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sCAAsC;IACtC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,+FAA+F;IAC/F,oBAAoB,CAAC,EAAE,OAAO,EAAE,CAAC;IACjC,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACxC,2FAA2F;IAC3F,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mIAAmI;IACnI,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmBD,wBAAgB,WAAW,CAAC,EAAE,KAAkB,EAAE,QAAqB,EAAE,eAAsB,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,gBAAgB,+BAqTnR"}
@@ -0,0 +1,219 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useInsertionEffect, useMemo, useState, useRef } from "react";
3
+ import { AddClientSheet } from "./AddClientSheet.js";
4
+ import { ClientList } from "./ClientList.js";
5
+ import { ConversationPane } from "./ConversationPane.js";
6
+ import { HostPreviewPane } from "./HostPreviewPane.js";
7
+ import { HOST_SEL, hostOnlyRows, hostSelId, isHostSel } from "./host.js";
8
+ import { OfferSheet } from "./OfferSheet.js";
9
+ import { ProactiveOptionsSheet } from "./ProactiveOptionsSheet.js";
10
+ import { useProactiveOptions } from "./useProactiveOptions.js";
11
+ import { useInstructions } from "./useInstructions.js";
12
+ import { AiSettingsSheet } from "./AiSettingsSheet.js";
13
+ import { usePolling } from "./usePolling.js";
14
+ import { useLiveUpdates } from "./useLiveUpdates.js";
15
+ import { firstName, matchesSearch, sortClients, sortInbox, SORT_MODES } from "./labels.js";
16
+ import { IconMaximize, IconMinimize, IconSliders, IconSparkles } from "./icons.js";
17
+ import { injectStyles } from "./styles.js";
18
+ import { useBulkDrafts } from "./useBulkDrafts.js";
19
+ import { BulkGenerateSheet } from "./BulkGenerateSheet.js";
20
+ import { useClients } from "./useClients.js";
21
+ import { useUplift } from "./UpliftProvider.js";
22
+ import { asUpliftError } from "./errors.js";
23
+ /**
24
+ * The Uplift coach panel: client list, conversation, drafts, composer, add client, offer,
25
+ * Bulk generate. Render inside <UpliftProvider>. Width-aware on its own (container query, D16);
26
+ * themed by `--u-*` vars (D15).
27
+ */
28
+ /** The chosen inbox sort survives a reload, like native's roster sort. Per browser. */
29
+ const SORT_KEY = "uplift_panel_sort";
30
+ function loadSort() {
31
+ try {
32
+ const v = localStorage.getItem(SORT_KEY);
33
+ if (v && SORT_MODES.some((m) => m.id === v))
34
+ return v;
35
+ }
36
+ catch { /* private mode / SSR */ }
37
+ return "priority";
38
+ }
39
+ export function UpliftPanel({ title = "Messages", hostName = "your app", initialClientId = null, onCheckout, onSent, onClientAdded, acknowledgedChannels, onChannelAcknowledged, hostClients, hostActivity, coachName, now, className, pollMs, live: liveUpdates }) {
40
+ useInsertionEffect(() => { injectStyles(); }, []);
41
+ const list = useClients();
42
+ const { client: api } = useUplift();
43
+ const bulk = useBulkDrafts({ hostActivity, coachName });
44
+ const [selectedId, setSelectedId] = useState(initialClientId);
45
+ const [showThread, setShowThread] = useState(false);
46
+ const [sort, setSortState] = useState(loadSort);
47
+ const setSort = useCallback((m) => { setSortState(m); try {
48
+ localStorage.setItem(SORT_KEY, m);
49
+ }
50
+ catch { /* private mode */ } }, []);
51
+ const [search, setSearch] = useState("");
52
+ // Full screen: the panel covers the host's viewport (the GHL iframe when embedded). Escape leaves it.
53
+ const [full, setFull] = useState(false);
54
+ useEffect(() => {
55
+ if (!full)
56
+ return;
57
+ const root = document.documentElement;
58
+ const prev = root.style.overflow;
59
+ root.style.overflow = "hidden";
60
+ const onKey = (e) => { if (e.key === "Escape" && !e.defaultPrevented && !document.querySelector(".uplift [role=\"dialog\"]"))
61
+ setFull(false); };
62
+ window.addEventListener("keydown", onKey);
63
+ return () => { root.style.overflow = prev; window.removeEventListener("keydown", onKey); };
64
+ }, [full]);
65
+ const [live, setLive] = useState("");
66
+ const [sheet, setSheet] = useState(null);
67
+ const proactive = useProactiveOptions();
68
+ const instructions = useInstructions();
69
+ // Live updates: Uplift pushes client_changed over the stream (roster refetch, plus the open thread
70
+ // when it is that client). Polling stays as the fallback: every pollMs while the stream is down,
71
+ // and a slow safety net (6× pollMs, at least 2 min) while it is up.
72
+ const [threadPing, setThreadPing] = useState(0);
73
+ const selectedRef = useRef(null);
74
+ const { connected: streamUp } = useLiveUpdates((clientId) => {
75
+ list.refresh();
76
+ if (clientId === selectedRef.current)
77
+ setThreadPing((n) => n + 1);
78
+ }, liveUpdates !== false);
79
+ const basePoll = pollMs ?? 20000;
80
+ const poll = usePolling(streamUp ? Math.max(basePoll * 6, 120000) : basePoll, basePoll > 0);
81
+ useEffect(() => { if (poll > 0)
82
+ list.refresh(); }, [poll]); // eslint-disable-line react-hooks/exhaustive-deps
83
+ const [acks, setAcks] = useState(() => new Set(acknowledgedChannels ?? []));
84
+ /** Host clients connected during this session, so they leave the not-connected rows at once. */
85
+ const [linkedHere, setLinkedHere] = useState(() => new Set());
86
+ const [connectFor, setConnectFor] = useState(null);
87
+ // What the coach had written to a client they then connected: it waits in the new conversation.
88
+ const [carry, setCarry] = useState(null);
89
+ const [carryFor, setCarryFor] = useState(null);
90
+ // Why the paywall opened, and the add the coach was making (completed for them once they have paid).
91
+ const [offer, setOffer] = useState({ reason: "pitch" });
92
+ // The add form reopened prefilled, only when finishing the add after an upgrade failed.
93
+ const [resumeAdd, setResumeAdd] = useState(null);
94
+ const clock = now ? now() : new Date();
95
+ // Unread counts the coach has already seen, by client. Opening a thread hides its badge until more
96
+ // activity arrives; Uplift's notification (and its reply drafts) stays until the coach sends, like native.
97
+ // Keyed by count and newest activity time, so new activity (even after a send reset the count) shows again.
98
+ const [seen, setSeen] = useState(() => new Map());
99
+ const seenKey = (c, count = c.unreadCount ?? 0) => `${count}|${c.lastActivity?.at ?? ""}`;
100
+ const clients = useMemo(() => list.clients.map((c) => ((c.unreadCount ?? 0) > 0 && seen.get(c.id) === seenKey(c) ? { ...c, unreadCount: 0, unreadMessages: 0, unreadUpdates: 0 } : c)), [list.clients, seen]); // eslint-disable-line react-hooks/exhaustive-deps
101
+ // Sorted on Uplift's own unread state, not the seen badges: opening a client (even the auto-open)
102
+ // must not drop them down Priority while their notification still stands.
103
+ const shown = useMemo(() => new Map(clients.map((c) => [c.id, c])), [clients]);
104
+ const sorted = useMemo(() => sortClients(list.clients, sort).map((c) => shown.get(c.id) ?? c), [list.clients, shown, sort]);
105
+ const hostOnly = useMemo(() => hostOnlyRows(hostClients, clock).filter((h) => !linkedHere.has(h.id)), [hostClients, clock, linkedHere]);
106
+ // Connected and not-connected clients sorted together, then searched.
107
+ const rows = useMemo(() => sortInbox(list.clients, hostOnly, sort)
108
+ .map((r) => (r.kind === "client" ? { kind: "client", client: shown.get(r.client.id) ?? r.client } : r))
109
+ .filter((r) => matchesSearch(r.kind === "client" ? r.client.name : r.host.name, search)), [list.clients, shown, hostOnly, sort, search]);
110
+ const selected = sorted.find((c) => c.id === selectedId) ?? null;
111
+ selectedRef.current = selectedId;
112
+ const selectedHost = isHostSel(selectedId) ? hostOnly.find((h) => hostSelId(h.id) === selectedId) ?? null : null;
113
+ useEffect(() => {
114
+ if (list.status !== "ready")
115
+ return;
116
+ if (!selected && !selectedHost) {
117
+ const first = sorted[0] ? sorted[0].id : hostOnly[0] ? hostSelId(hostOnly[0].id) : null;
118
+ // Only if nothing changed since this render: a row the coach tapped meanwhile wins over the auto-open.
119
+ const seen = selectedId;
120
+ if (first)
121
+ setSelectedId((cur) => (cur === seen ? first : cur));
122
+ }
123
+ }, [list.status, selected, selectedHost, sorted, hostOnly, selectedId]);
124
+ const open = useCallback((c) => { setSelectedId(c.id); setShowThread(true); }, []);
125
+ const openHost = useCallback((h) => { setSelectedId(hostSelId(h.id)); setShowThread(true); }, []);
126
+ const connect = useCallback((h, draft) => {
127
+ setConnectFor(h);
128
+ setCarry(draft?.trim() ? { hostId: h.id, text: draft } : null);
129
+ setSheet("add");
130
+ }, []);
131
+ const acknowledge = useCallback((ch) => {
132
+ setAcks((s) => new Set(s).add(ch));
133
+ onChannelAcknowledged?.(ch);
134
+ }, [onChannelAcknowledged]);
135
+ const added = useCallback((c, hostId = connectFor?.id) => {
136
+ list.upsert(c);
137
+ if (connectFor)
138
+ setLinkedHere((s) => new Set(s).add(connectFor.id));
139
+ if (carry && carry.hostId === hostId)
140
+ setCarryFor({ clientId: c.id, text: carry.text });
141
+ setCarry(null);
142
+ setConnectFor(null);
143
+ setSheet(null);
144
+ setSelectedId(c.id);
145
+ setShowThread(true);
146
+ setLive(`${firstName(c.name)} added to Uplift`);
147
+ onClientAdded?.(c);
148
+ }, [list, onClientAdded, connectFor, carry]);
149
+ const finishAdd = useCallback(async (attempt) => {
150
+ try {
151
+ added(await api.addClient(attempt.hostClientId ? attempt : { name: attempt.name, phone: attempt.phone, channel: attempt.channel }), attempt.hostClientId ?? undefined);
152
+ }
153
+ catch (err) {
154
+ setResumeAdd({ ...attempt, error: asUpliftError(err).message || "Couldn't add this client. Try again." });
155
+ setSheet("add");
156
+ }
157
+ }, [api, added]);
158
+ // Reading clears the badge only; the row's status is the server's call on the next refresh, so a
159
+ // row never jumps out of the list under the coach's finger.
160
+ // A thread only counts as read when the coach can see it: on a narrow panel the auto-selected one
161
+ // sits hidden behind the list until they open it.
162
+ const split = useRef(null);
163
+ const paneHidden = () => {
164
+ const pane = split.current?.querySelector(":scope > .u-pane");
165
+ return !!pane && getComputedStyle(pane).display === "none";
166
+ };
167
+ const read = useCallback((c) => {
168
+ const row = list.clients.find((x) => x.id === c.id);
169
+ if (!row || paneHidden())
170
+ return;
171
+ const key = seenKey(row);
172
+ setSeen((m) => (m.get(c.id) === key ? m : new Map(m).set(c.id, key)));
173
+ }, [list.clients]); // eslint-disable-line react-hooks/exhaustive-deps
174
+ // The open thread's own badge stays cleared as its row refreshes with new activity.
175
+ useEffect(() => {
176
+ const row = selectedId ? list.clients.find((x) => x.id === selectedId) : undefined;
177
+ if (row && (row.unreadCount ?? 0) > 0)
178
+ read(row);
179
+ }, [list.clients, selectedId, read, showThread]);
180
+ // A send shows on the client's row at once (Uplift only pushes client_changed when a notification
181
+ // changes, so a client with nothing unread would otherwise wait for the next poll), then the roster
182
+ // is refetched for the server's own version.
183
+ const showSent = useCallback((c, body, extra = {}) => {
184
+ const at = new Date().toISOString();
185
+ const row = list.clients.find((x) => x.id === c.id) ?? c;
186
+ list.upsert({ ...row, ...(row.status === "new" ? { status: "active" } : {}), lastContactAt: at, lastActivity: { kind: "message", direction: "outbound", body, at }, ...extra });
187
+ list.refresh();
188
+ }, [list]);
189
+ const quickSent = useCallback((c, body) => {
190
+ bulk.forget(c.id);
191
+ showSent(c, body, { drafts: null, unreadCount: 0, unreadMessages: 0, unreadUpdates: 0 });
192
+ onSent?.(c);
193
+ }, [bulk, showSent, onSent]);
194
+ const sent = useCallback((c, body) => {
195
+ bulk.forget(c.id);
196
+ setCarryFor((f) => (f?.clientId === c.id ? null : f));
197
+ showSent(c, body);
198
+ onSent?.(c);
199
+ }, [bulk, showSent, onSent]);
200
+ // Bulk drafts open in the composer's grid with the client (all four tones, not just the chip's).
201
+ const paneDrafts = selected ? bulk.results[selected.id] ?? null : null;
202
+ // AI settings + full screen: the right end of the conversation header (and, on narrow panels where
203
+ // the list shows alone, the list toolbar).
204
+ const headActions = (_jsxs("span", { className: "u-head-acts", children: [_jsxs("button", { type: "button", className: "u-iconbtn u-iconbtn-pair", "aria-label": "AI settings", title: "AI settings: your rules for drafts, and the \u2728 message options",
205
+ // Like Config AI: with no client connected yet, connecting comes first.
206
+ onClick: () => setSheet(list.clients.length === 0 && hostClients !== undefined ? "add" : "ai"), children: [_jsx("span", { className: "u-ai-spark", children: _jsx(IconSparkles, {}) }), _jsx(IconSliders, {})] }), _jsx("button", { type: "button", className: "u-iconbtn", "aria-pressed": full, "aria-label": full ? "Exit full screen" : "Full screen", title: full ? "Exit full screen (Esc)" : "Full screen", onClick: () => setFull((f) => !f), children: full ? _jsx(IconMinimize, {}) : _jsx(IconMaximize, {}) })] }));
207
+ return (_jsxs("section", { className: `uplift${full ? " u-full" : ""}${className ? ` ${className}` : ""}`, "aria-label": "Uplift messages", children: [_jsx("h2", { className: "u-sr", children: title }), bulk.blocked
208
+ ? (_jsxs("div", { className: "u-banner", role: "status", children: [_jsx("span", { children: "Your Uplift plan isn't active, so Bulk generate is paused." }), _jsx("span", { className: "u-sp" }), _jsx("button", { type: "button", className: "u-linkbtn", onClick: () => { setOffer({ reason: "plan_inactive" }); setSheet("offer"); }, children: "Reactivate" })] }))
209
+ : null, _jsxs("div", { ref: split, className: `u-split${showThread ? " u-show-thread" : ""}`, children: [_jsx(ClientList, { status: list.status, error: list.error, rows: rows, totalCount: clients.length + hostOnly.length, search: search, onSearch: setSearch, sort: sort, onSort: setSort, selectedId: selectedId, onOpen: open, onRetry: list.reload, onAddClient: () => setSheet("add"), onBulk: () => setSheet("bulk"), headActions: headActions, bulkDisabled: bulk.running || clients.length + hostOnly.length === 0, hostManaged: hostClients !== undefined, drafts: bulk.results, bulkStatus: bulk.status, onQuickSent: quickSent, hostName: hostName, onOpenHost: openHost, onConnectHost: connect, now: clock }), selectedHost
210
+ ? (_jsx(HostPreviewPane, { host: selectedHost, hostName: hostName, coachName: coachName, loadActivity: hostActivity, now: clock, onBack: () => setShowThread(false), onConnect: connect, purposes: proactive.purposes, onCustomize: () => setSheet("proactive"), instructions: instructions, connectedCount: list.clients.length, onPlanInactive: () => { setOffer({ reason: "plan_inactive" }); setSheet("offer"); }, cachedDrafts: bulk.results[hostSelId(selectedHost.id)] ?? null, headActions: headActions }, HOST_SEL + selectedHost.id))
211
+ : selected
212
+ ? (_jsx(ConversationPane, { client: selected, activitySourceLabel: hostName, now: clock, onBack: () => setShowThread(false), announce: setLive, onSent: sent, onNeedsPlan: (reason) => { setOffer({ reason: reason ?? "client_limit" }); setSheet("offer"); }, initialText: carryFor?.clientId === selected.id ? carryFor.text : undefined, cachedDrafts: paneDrafts, purposes: proactive.purposes, onCustomize: () => setSheet("proactive"), onRead: read, instructions: instructions, refreshKey: poll + threadPing, headActions: headActions }, selected.id))
213
+ : _jsx("div", { className: "u-pane", children: _jsx("div", { className: "u-pane-head u-pane-head-empty", children: headActions }) })] }), sheet === "add" && (_jsx(AddClientSheet, { onClose: () => { setSheet(null); setConnectFor(null); setCarry(null); setResumeAdd(null); }, onAdded: (c) => { setResumeAdd(null); added(c); }, onNeedsPlan: (ctx) => { setOffer(ctx); setSheet("offer"); }, acknowledged: acks, onAcknowledge: acknowledge, hostClients: hostClients?.filter((h) => !h.upliftClientId && !linkedHere.has(h.id)), existing: list.clients, hostName: hostName, prefill: resumeAdd ?? (connectFor ? { name: connectFor.name, hostClientId: connectFor.id } : undefined) })), sheet === "bulk" && (_jsx(BulkGenerateSheet, { candidates: sortInbox(clients, hostOnly, sort).map((r) => (r.kind === "client"
214
+ ? { target: { kind: "client", id: r.client.id }, name: r.client.name, lastActiveAt: r.client.lastActivity?.at ?? r.client.lastContactAt, connected: true }
215
+ : { target: { kind: "host", id: r.host.id, name: r.host.name }, name: r.host.name, lastActiveAt: r.host.lastActiveAt ?? null, connected: false })), now: clock, onClose: () => setSheet(null), onGenerate: bulk.start, onEditInstructions: instructions.data?.canEdit ? () => setSheet("ai") : undefined })), sheet === "proactive" && _jsx(ProactiveOptionsSheet, { state: proactive, onClose: () => setSheet(null) }), sheet === "ai" && _jsx(AiSettingsSheet, { instructions: instructions, proactive: proactive, hostName: hostName, onClose: () => setSheet(null), onUpgrade: () => { setOffer({ reason: "feature" }); setSheet("offer"); } }), sheet === "offer" && (_jsx(OfferSheet, { onClose: () => { setSheet(null); setConnectFor(null); }, onCheckout: onCheckout, hostName: hostName, reason: offer.reason, connecting: offer.attempt?.name, connected: list.clients.map((c) => ({ id: c.id, name: c.name })),
216
+ // Paid: finish the add the coach was making. Only if that fails does the form come back, prefilled.
217
+ onUpgraded: offer.attempt ? () => { void finishAdd(offer.attempt); } : undefined })), _jsx("div", { className: "u-sr", "aria-live": "polite", children: live })] }));
218
+ }
219
+ //# sourceMappingURL=UpliftPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpliftPanel.js","sourceRoot":"","sources":["../src/UpliftPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from "react";
2
+ import { UpliftClient, type UpliftClientOptions } from "@uplifted/sdk";
3
+ export interface UpliftContextValue {
4
+ client: UpliftClient;
5
+ }
6
+ export interface UpliftProviderProps extends UpliftClientOptions {
7
+ children: ReactNode;
8
+ }
9
+ /**
10
+ * Supplies one UpliftClient to every screen below it. Hosts render this once around the
11
+ * panel. Theming is CSS variables on the host (see theme tokens in later tasks), not props.
12
+ */
13
+ export declare function UpliftProvider({ children, ...options }: UpliftProviderProps): import("react").JSX.Element;
14
+ export declare function useUplift(): UpliftContextValue;
15
+ //# sourceMappingURL=UpliftProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpliftProvider.d.ts","sourceRoot":"","sources":["../src/UpliftProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;CACtB;AAID,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,mBAAmB,+BAG3E;AAED,wBAAgB,SAAS,IAAI,kBAAkB,CAI9C"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from "react";
3
+ import { UpliftClient } from "@uplifted/sdk";
4
+ const UpliftContext = createContext(null);
5
+ /**
6
+ * Supplies one UpliftClient to every screen below it. Hosts render this once around the
7
+ * panel. Theming is CSS variables on the host (see theme tokens in later tasks), not props.
8
+ */
9
+ export function UpliftProvider({ children, ...options }) {
10
+ const value = useMemo(() => ({ client: new UpliftClient(options) }), [options.baseUrl, options.getToken, options.identity.hostAccountId, options.identity.hostUserId, options.fetch, options.timeoutMs, options.apiPrefix]);
11
+ return _jsx(UpliftContext.Provider, { value: value, children: children });
12
+ }
13
+ export function useUplift() {
14
+ const ctx = useContext(UpliftContext);
15
+ if (!ctx)
16
+ throw new Error("useUplift must be used inside <UpliftProvider>");
17
+ return ctx;
18
+ }
19
+ //# sourceMappingURL=UpliftProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpliftProvider.js","sourceRoot":"","sources":["../src/UpliftProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,YAAY,EAA4B,MAAM,eAAe,CAAC;AAMvE,MAAM,aAAa,GAAG,aAAa,CAA4B,IAAI,CAAC,CAAC;AAMrE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAuB;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5N,OAAO,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA0B,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { WhatsAppWindow } from "@uplifted/sdk";
2
+ /**
3
+ * A pending outbound bubble at the foot of the feed showing what a closed-window WhatsApp send will
4
+ * look like, live as the coach types, a port of native WaitingTemplateGhost: the preview with the
5
+ * cut marked. aria-hidden because it rewrites on every keystroke.
6
+ */
7
+ export declare function WaitingTemplateGhost({ win, text, first }: {
8
+ win: WhatsAppWindow;
9
+ text: string;
10
+ first: string;
11
+ }): import("react").JSX.Element | null;
12
+ //# sourceMappingURL=WaitingTemplateGhost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaitingTemplateGhost.d.ts","sourceRoot":"","sources":["../src/WaitingTemplateGhost.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,sCAc9G"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * A pending outbound bubble at the foot of the feed showing what a closed-window WhatsApp send will
4
+ * look like, live as the coach types, a port of native WaitingTemplateGhost: the preview with the
5
+ * cut marked. aria-hidden because it rewrites on every keystroke.
6
+ */
7
+ export function WaitingTemplateGhost({ win, text, first }) {
8
+ const max = win.waitingTemplate?.previewMax ?? 100;
9
+ const t = text.trim();
10
+ if (!t)
11
+ return null;
12
+ const cut = t.length > max;
13
+ const head = cut ? t.slice(0, max) : t;
14
+ return (_jsxs("div", { className: "u-ghost", "aria-hidden": "true", children: [_jsxs("div", { className: "u-bub u-out u-ghost-bub", children: [first, ", you have a message waiting: \"", head, _jsx("span", { className: "u-ghost-cut", children: cut ? "…" : "" }), "\" Tap to read it in full."] }), _jsxs("div", { className: "u-bmeta u-r", children: ["Sent as the waiting template", cut ? ` · cut at ${max} characters` : ""] })] }));
15
+ }
16
+ //# sourceMappingURL=WaitingTemplateGhost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaitingTemplateGhost.js","sourceRoot":"","sources":["../src/WaitingTemplateGhost.tsx"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAwD;IAC7G,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,GAAG,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CACL,eAAK,SAAS,EAAC,SAAS,iBAAa,MAAM,aACzC,eAAK,SAAS,EAAC,yBAAyB,aACrC,KAAK,sCAAiC,IAAI,EAAC,eAAM,SAAS,EAAC,aAAa,YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAQ,kCAC7F,EACN,eAAK,SAAS,EAAC,aAAa,6CAA8B,GAAG,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,IAAO,IACrG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Channel } from "@uplifted/sdk";
2
+ /**
3
+ * Channel rules shown before a coach commits to a channel (D6) and before they pay (D9).
4
+ * Copy ported and shortened from uplift_coach client/src/components/ui/ChannelDisclaimerModal.jsx.
5
+ */
6
+ export interface ChannelInfo {
7
+ key: Channel;
8
+ label: string;
9
+ sublabel: string;
10
+ title: string;
11
+ /** One-line rule for the offer's "How Uplift messaging works" step. */
12
+ summary: string;
13
+ /** Rule blocks for the add-client sheet. */
14
+ rules: Array<{
15
+ title: string;
16
+ text: string;
17
+ }>;
18
+ confirmLabel: string;
19
+ }
20
+ export declare const CHANNELS: readonly ChannelInfo[];
21
+ export declare function channelInfo(key: Channel): ChannelInfo;
22
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EA0B1C,CAAC;AAEF,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAErD"}
@@ -0,0 +1,31 @@
1
+ export const CHANNELS = [
2
+ {
3
+ key: "sms",
4
+ label: "SMS",
5
+ sublabel: "US and Canada only",
6
+ title: "Before you choose SMS",
7
+ summary: "Works reliably for US and Canada numbers only. Photos and short videos go as picture messages; anything larger arrives as a link.",
8
+ rules: [
9
+ { title: "US and Canada only", text: "Uplift's texting runs on US carrier-registered numbers. Messages to international numbers are unreliable and often fail silently. If this client is outside the US or Canada, choose WhatsApp instead." },
10
+ { title: "Media limits", text: "Photos and short videos send as picture messages. Larger files arrive as a link." },
11
+ ],
12
+ confirmLabel: "My client has a US or Canada number",
13
+ },
14
+ {
15
+ key: "whatsapp",
16
+ label: "WhatsApp",
17
+ sublabel: "Meta's 24-hour rule applies",
18
+ title: "How WhatsApp messaging works",
19
+ summary: "Meta's 24-hour rule: if a client hasn't messaged in 24 hours, your message goes inside an approved template. They see a preview and one tap delivers it in full and reopens normal chat.",
20
+ rules: [
21
+ { title: "Window open: normal messaging", text: "Every time your client messages you, a 24-hour window opens. Inside it everything works like regular chat: texts, photos, videos and voice notes, delivered instantly." },
22
+ { title: "Window closed: messages go inside a template", text: "If your client hasn't messaged you in the last 24 hours, Meta only allows pre-approved templates. Uplift wraps your message in one. The client gets a notification with a preview and a secure link, and one reply from them reopens normal messaging." },
23
+ { title: "Who notices", text: "Clients who message you regularly rarely see any of this. It matters most for quiet clients you're re-engaging." },
24
+ ],
25
+ confirmLabel: "I understand how WhatsApp works",
26
+ },
27
+ ];
28
+ export function channelInfo(key) {
29
+ return CHANNELS.find((c) => c.key === key) ?? CHANNELS[0];
30
+ }
31
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,QAAQ,GAA2B;IAC9C;QACE,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,oBAAoB;QAC9B,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,mIAAmI;QAC5I,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,wMAAwM,EAAE;YAC/O,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,kFAAkF,EAAE;SACpH;QACD,YAAY,EAAE,qCAAqC;KACpD;IACD;QACE,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,6BAA6B;QACvC,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,0LAA0L;QACnM,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,wKAAwK,EAAE;YAC1N,EAAE,KAAK,EAAE,8CAA8C,EAAE,IAAI,EAAE,wPAAwP,EAAE;YACzT,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,iHAAiH,EAAE;SAClJ;QACD,YAAY,EAAE,iCAAiC;KAChD;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { UpliftError } from "@uplifted/sdk";
2
+ /** Normalise anything thrown by the sdk or fetch into an UpliftError so the UI switches on `code`. */
3
+ export declare function asUpliftError(err: unknown): UpliftError;
4
+ /** Seconds until a limited request may be retried; falls back to 30 when the server gave none. */
5
+ export declare function retryAfterSeconds(err: UpliftError): number;
6
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAIvD;AAED,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAO1D"}
package/dist/errors.js ADDED
@@ -0,0 +1,20 @@
1
+ import { UpliftError } from "@uplifted/sdk";
2
+ /** Normalise anything thrown by the sdk or fetch into an UpliftError so the UI switches on `code`. */
3
+ export function asUpliftError(err) {
4
+ if (err instanceof UpliftError)
5
+ return err;
6
+ const message = err instanceof Error ? err.message : "Something went wrong";
7
+ return new UpliftError(0, { code: "unknown", message, retryable: true });
8
+ }
9
+ /** Seconds until a limited request may be retried; falls back to 30 when the server gave none. */
10
+ export function retryAfterSeconds(err) {
11
+ if (typeof err.retryAfter === "number" && err.retryAfter > 0)
12
+ return Math.ceil(err.retryAfter);
13
+ if (err.resetAt) {
14
+ const ms = Date.parse(err.resetAt) - Date.now();
15
+ if (ms > 0)
16
+ return Math.ceil(ms / 1000);
17
+ }
18
+ return 30;
19
+ }
20
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,sGAAsG;AACtG,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,GAAG,YAAY,WAAW;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAC5E,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAC,GAAgB;IAChD,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/F,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
package/dist/host.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import type { PreviewEvent } from "@uplifted/sdk";
2
+ /**
3
+ * A host client that is not (yet) an Uplift client. The panel still lists them, shows the
4
+ * activity the host knows about, and drafts from it through the stateless preview (D19), so a
5
+ * coach sees Uplift at work before connecting anyone.
6
+ */
7
+ export interface HostClient {
8
+ /** The host's own id (PulseKit end_user id). */
9
+ id: string;
10
+ name: string;
11
+ /** The Uplift client this host client is linked to, when connected. Null or absent = not connected. */
12
+ upliftClientId?: string | null;
13
+ /** When the host last saw this client do anything. Null = never. */
14
+ lastActiveAt?: string | null;
15
+ }
16
+ /** One line of host activity for the preview feed, in the allow-listed preview shape plus a display title. */
17
+ export interface HostActivityEvent extends PreviewEvent {
18
+ id: string;
19
+ /** What the feed shows, e.g. "Logged Bench press · 3 sets · 8 reps · 60 kg". */
20
+ title: string;
21
+ }
22
+ export type HostActivityLoader = (hostClientId: string) => Promise<{
23
+ events: HostActivityEvent[];
24
+ }>;
25
+ /**
26
+ * The first-touch message Uplift sends on its own before a coach's first message to a client
27
+ * (partner API T6). Same copy as Uplift's leadIntroService, same name rules: the client's first
28
+ * name or "there", the coach's first name or "your coach". On WhatsApp it goes as the approved
29
+ * template with the same wording. Shown in the preview so a coach sees the opener before
30
+ * connecting anyone; nothing here is sent.
31
+ */
32
+ export declare function stockIntro({ clientName, coachName }: {
33
+ clientName: string;
34
+ coachName?: string | null | undefined;
35
+ }): string;
36
+ export declare const QUIET_DAYS = 7;
37
+ /** Host clients the coach should look at: quiet for QUIET_DAYS or more. */
38
+ export declare function hostNeedsAttention(h: Pick<HostClient, "lastActiveAt">, now: Date): boolean;
39
+ /** Not-connected host clients, quiet ones first, then most recently active, then name. */
40
+ export declare function hostOnlyRows(hostClients: ReadonlyArray<HostClient> | undefined, now: Date): HostClient[];
41
+ /** Selection ids for host-only rows share the list with Uplift client ids, so they carry a prefix. */
42
+ export declare const HOST_SEL = "host:";
43
+ export declare const hostSelId: (hostClientId: string) => string;
44
+ export declare const isHostSel: (selectedId: string | null) => boolean;
45
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,uGAAuG;IACvG,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,8GAA8G;AAC9G,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAAC;AAEpG;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAI3H;AAED,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAK1F;AAED,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,UAAU,EAAE,CAOxG;AAED,sGAAsG;AACtG,eAAO,MAAM,QAAQ,UAAU,CAAC;AAChC,eAAO,MAAM,SAAS,GAAI,cAAc,MAAM,WAAiC,CAAC;AAChF,eAAO,MAAM,SAAS,GAAI,YAAY,MAAM,GAAG,IAAI,YAAoD,CAAC"}