@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,76 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useRef, useState } from "react";
3
+ import { hostNeedsAttention } from "./host.js";
4
+ import { IconSearch, IconPlus, IconClock, IconLoader, IconZap, IconMessageSquare, IconMessagesSquare, IconSparklesLucide, IconArrowUpRight, IconActivity, IconAlert } from "./icons.js";
5
+ import { ChannelBadge } from "./ChannelBadge.js";
6
+ import { avatarColor, initials, statusTag, SORT_MODES } from "./labels.js";
7
+ import { QuickSend } from "./QuickSend.js";
8
+ import { relativeAgo, relativeShort } from "./time.js";
9
+ /** Native's collapsed search: a magnifier that opens into a field on click or focus, and closes when left empty. */
10
+ function SearchBox({ value, onChange }) {
11
+ const [open, setOpen] = useState(false);
12
+ const input = useRef(null);
13
+ const isOpen = open || value !== "";
14
+ return (_jsxs("div", { className: `u-search${isOpen ? " u-search-open" : ""}`, onClick: () => { setOpen(true); input.current?.focus(); }, children: [_jsx(IconSearch, {}), _jsx("input", { ref: input, type: "search", placeholder: "Search clients\u2026", "aria-label": "Search clients", value: value, onChange: (e) => onChange(e.target.value), onFocus: () => setOpen(true), onBlur: () => { if (!value.trim())
15
+ setOpen(false); }, onKeyDown: (e) => { if (e.key === "Escape") {
16
+ onChange("");
17
+ input.current?.blur();
18
+ } } })] }));
19
+ }
20
+ export function ClientList(p) {
21
+ const anyRows = p.rows.length > 0;
22
+ return (_jsxs("div", { className: "u-list", children: [_jsxs("div", { className: "u-toolbar", children: [_jsx(SearchBox, { value: p.search, onChange: p.onSearch }), _jsx("div", { className: "u-sortgroup", role: "group", "aria-label": "Sort clients", children: SORT_MODES.map((m) => (_jsx("button", { type: "button", "aria-pressed": p.sort === m.id, onClick: () => p.onSort(m.id), children: m.label }, m.id))) }), p.onBulk && (_jsxs("button", { type: "button", className: "u-bulkbtn", onClick: p.onBulk, disabled: p.bulkDisabled, "aria-label": "Bulk generate", title: "AI drafts for multiple clients", children: [_jsx(IconSparklesLucide, {}), _jsx(IconMessagesSquare, {})] })), !p.hostManaged && _jsx("button", { type: "button", className: "u-iconbtn u-addbtn", "aria-label": "Add client", title: "Add client", onClick: p.onAddClient, children: _jsx(IconPlus, {}) }), p.headActions && _jsx("span", { className: "u-toolbar-acts", children: p.headActions })] }), p.status === "loading" && p.rows.length === 0 && _jsx(SkeletonRows, {}), p.status === "error" && (_jsxs("div", { className: "u-state", role: "alert", children: [_jsx("h3", { children: "Couldn't load clients" }), _jsx("p", { children: p.error?.message }), _jsx("button", { type: "button", className: "u-retry", onClick: p.onRetry, children: "Retry" })] })), p.status === "ready" && p.totalCount === 0 && (_jsxs("div", { className: "u-state", children: [_jsx("h3", { children: "Your clients' activity shows up here" }), p.hostManaged
23
+ ? _jsxs("p", { children: ["Add clients in ", p.hostName ?? "your app", " and they appear here with their workouts. Connect any of them to Uplift for check-in drafts ready to send; Uplift spots who's gone quiet and drafts the message for you."] })
24
+ : (_jsxs(_Fragment, { children: [_jsx("p", { children: "Add a client and their workouts appear here with check-in drafts ready to send. Uplift spots who's gone quiet and drafts the message for you." }), _jsx("button", { type: "button", className: "u-send", onClick: p.onAddClient, children: "Add a client" })] })), _jsx(ExampleStrip, {})] })), p.status === "ready" && p.totalCount > 0 && !anyRows && (_jsxs("div", { className: "u-state", children: [_jsxs("h3", { children: ["No clients match \u201C", p.search.trim(), "\u201D"] }), _jsx("button", { type: "button", className: "u-retry", onClick: () => p.onSearch(""), children: "Clear search" })] })), anyRows && (_jsx("ul", { className: "u-rows", children: p.rows.map((r) => (r.kind === "client"
25
+ ? _jsx(Row, { client: r.client, selected: r.client.id === p.selectedId, onOpen: p.onOpen, drafts: p.drafts[r.client.id] ?? null, bulk: p.bulkStatus?.[r.client.id] ?? null, onQuickSent: p.onQuickSent, now: p.now }, r.client.id)
26
+ : _jsx(HostRow, { host: r.host, hostName: p.hostName ?? "your app", selected: p.selectedId === `host:${r.host.id}`, onOpen: p.onOpenHost, onConnect: p.onConnectHost, drafts: p.drafts[`host:${r.host.id}`] ?? null, bulk: p.bulkStatus?.[`host:${r.host.id}`] ?? null, now: p.now }, `host:${r.host.id}`))) }))] }));
27
+ }
28
+ /** The row preview, like native ClientRow's PreviewBody: the newest thread item with a direction icon, or the status line. */
29
+ function Preview({ client, now }) {
30
+ const a = client.lastActivity;
31
+ if (a && a.body) {
32
+ const inbound = a.kind === "message" && a.direction === "inbound";
33
+ const outbound = a.kind === "message" && a.direction === "outbound";
34
+ return (_jsxs("span", { className: `u-r-line u-r-prev${inbound ? " u-r-prev-in" : outbound ? " u-r-prev-out" : " u-r-prev-ev"}`, children: [_jsx("span", { className: "u-r-pico", "aria-hidden": "true", children: inbound ? _jsx(IconMessageSquare, {}) : outbound ? _jsx(IconArrowUpRight, {}) : _jsx(IconActivity, {}) }), _jsx("span", { className: "u-r-ptxt", children: a.body })] }));
35
+ }
36
+ if (client.status === "new")
37
+ return _jsx("span", { className: "u-r-line", children: "Not contacted yet" });
38
+ if (client.lastContactAt)
39
+ return _jsxs("span", { className: "u-r-line", children: ["Last contact ", relativeAgo(client.lastContactAt, now)] });
40
+ return _jsx("span", { className: "u-r-line", children: "No recent activity" });
41
+ }
42
+ /** Native's bulk states in the quick-send slot: a spinner while drafting, then "Generation failed" for a few seconds. */
43
+ function BulkChip({ status }) {
44
+ return (_jsx("span", { className: "u-r-quick", children: _jsxs("button", { type: "button", className: `u-qsend u-qsend-bulk${status === "pending" ? " u-qsend-busy" : ""}`, disabled: true, "aria-label": status === "pending" ? "Generating draft…" : "Draft generation failed", children: [status === "pending" && _jsx(IconLoader, {}), _jsx("span", { className: "u-qsend-label", children: status === "pending" ? "Generating…" : "Generation failed" })] }) }));
45
+ }
46
+ function Row({ client, selected, onOpen, drafts, bulk, onQuickSent, now }) {
47
+ const tag = statusTag(client.status);
48
+ const unread = client.unreadCount ?? 0;
49
+ // A fresh bulk draft overrides the one Uplift prepared, like native.
50
+ const quick = drafts ?? client.drafts ?? null;
51
+ const at = client.lastActivity?.at ?? client.lastContactAt;
52
+ return (_jsxs("li", { className: `${unread > 0 ? "u-row-unread" : ""}${client.followUpDue ? " u-row-follow" : ""}`, children: [_jsxs("button", { type: "button", className: "u-row-open", "aria-current": selected, onClick: () => onOpen(client), children: [_jsx("span", { className: "u-r-ind", "aria-hidden": unread === 0, children: unread > 1 ? _jsx("span", { className: "u-r-badge", "aria-label": `${unread} unread events`, title: `${unread} unread events`, children: unread }) : unread === 1 ? _jsx("span", { className: "u-r-dot", "aria-label": "Unread activity" }) : null }), _jsxs("span", { className: "u-av-wrap u-r-av", children: [_jsx("span", { className: "u-av", style: { background: avatarColor(client.id) }, "aria-hidden": "true", children: initials(client.name) }), _jsx(ChannelBadge, { channel: client.channel })] }), _jsxs("span", { className: "u-r-top", children: [_jsx("span", { className: `u-r-name${unread > 0 ? " u-r-name-unread" : ""}`, children: client.name }), client.followUpDue && _jsx("span", { className: "u-r-follow", title: "Follow up \u2014 you messaged over 24 hours ago with no reply", "aria-label": "Follow up \u2014 no reply in over 24 hours", children: _jsx(IconClock, {}) }), client.lastDeliveryFailure && _jsx("span", { className: "u-r-fail", title: `Message not delivered — ${client.lastDeliveryFailure.errorDesc || "delivery failed"}`, "aria-label": "Last message not delivered", children: _jsx(IconAlert, {}) }), _jsx("span", { className: "u-r-time", children: relativeShort(at, now) })] }), _jsx(Preview, { client: client, now: now }), _jsx("span", { className: "u-r-tags", children: tag && _jsx("span", { className: `u-tag u-${tag.kind}`, children: tag.text }) })] }), bulk === "pending" || (bulk === "error" && !drafts)
53
+ ? _jsx(BulkChip, { status: bulk })
54
+ : quick && (_jsx("span", { className: "u-r-quick", onClick: (e) => e.stopPropagation(), children: _jsx(QuickSend, { client: client, drafts: quick, onSent: onQuickSent }, quick.five_words || quick.happy) }))] }));
55
+ }
56
+ /** D19: a host client who is not on Uplift. Opens the preview pane; never a thread. */
57
+ function HostRow({ host, hostName, selected, onOpen, onConnect, drafts, bulk, now }) {
58
+ const short = drafts ? (drafts.five_words || drafts.happy || "") : "";
59
+ const words = short.trim().split(/\s+/);
60
+ const label = words.length <= 6 ? short : `${words.slice(0, 6).join(" ")}…`;
61
+ const quiet = hostNeedsAttention(host, now);
62
+ const line = host.lastActiveAt ? `Last active in ${hostName} ${relativeAgo(host.lastActiveAt, now)}` : `No ${hostName} activity yet`;
63
+ return (_jsxs("li", { children: [_jsxs("button", { type: "button", className: "u-row-open", "aria-current": selected, onClick: () => onOpen?.(host), children: [_jsx("span", { className: "u-av", style: { background: avatarColor(host.id), opacity: 0.7 }, "aria-hidden": "true", children: initials(host.name) }), _jsxs("span", { className: "u-r-top", children: [_jsx("span", { className: "u-r-name", children: host.name }), _jsx("span", { className: "u-r-time", children: relativeShort(host.lastActiveAt, now) })] }), _jsx("span", { className: "u-r-line", children: line })] }), _jsxs("span", { className: "u-r-tags u-r-hosttags", children: [quiet && _jsx("span", { className: "u-tag u-need", children: "Quiet" }), onConnect
64
+ ? _jsx("button", { type: "button", className: "u-tag u-tag-connect", title: `Connect ${host.name.split(" ")[0]} to Uplift`, onClick: () => onConnect(host), children: "Not connected" })
65
+ : _jsx("span", { className: "u-tag", children: "Not connected" })] }), bulk === "pending" || (bulk === "error" && !drafts)
66
+ ? _jsx(BulkChip, { status: bulk })
67
+ : drafts && short && (_jsx("span", { className: "u-r-quick", children: _jsxs("button", { type: "button", className: "u-qsend", title: short, "aria-label": `Open ${host.name} with the bulk drafts: ${short}`, onClick: () => onOpen?.(host), children: [_jsx(IconZap, {}), _jsx("span", { className: "u-qsend-label", children: label })] }) }))] }));
68
+ }
69
+ function SkeletonRows() {
70
+ return (_jsx("div", { "aria-busy": "true", "aria-label": "Loading clients", children: [0, 1, 2, 3, 4].map((i) => (_jsxs("div", { className: "u-skel-row", children: [_jsx("div", { className: "u-skel", style: { width: "55%" } }), _jsx("div", { className: "u-skel", style: { width: "80%" } })] }, i))) }));
71
+ }
72
+ /** D12: the empty state shows what Uplift does, always labelled as an example. */
73
+ function ExampleStrip() {
74
+ return (_jsxs("div", { className: "u-example", "aria-label": "Example", children: [_jsx("span", { className: "u-ex-lab", children: "Example" }), _jsxs("div", { className: "u-ev", style: { alignSelf: "flex-start" }, children: [_jsx(IconClock, {}), _jsxs("div", { children: [_jsx("b", { children: "Quiet 4 days" }), _jsx("div", { className: "u-meta", children: "Example client" })] })] }), _jsxs("div", { className: "u-grid", style: { marginTop: 8 }, children: [_jsxs("div", { className: "u-cell", children: [_jsx("span", { className: "u-lab", children: "Happy" }), _jsx("span", { className: "u-txt", children: "Haven't seen a log since Wednesday. All good? Want to swap chest to today?" })] }), _jsxs("div", { className: "u-cell", children: [_jsx("span", { className: "u-lab", children: "Concise" }), _jsx("span", { className: "u-txt", children: "Chest today? Reply \"in\"." })] })] })] }));
75
+ }
76
+ //# sourceMappingURL=ClientList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClientList.js","sourceRoot":"","sources":["../src/ClientList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { WhatsAppWindow } from "@uplifted/sdk";
2
+ /**
3
+ * Shown above the composer when a WhatsApp client's 24-hour window is closed, a port of native
4
+ * ClosedWindowBanner: WhatsApp only lets businesses send free-form messages for 24 hours after the
5
+ * client's last message; outside that the message goes out inside an approved template with the
6
+ * coach's text cut to a short preview, and the client taps to read it in full.
7
+ */
8
+ export declare function ClosedWindowBanner({ win, first }: {
9
+ win: WhatsAppWindow;
10
+ first: string;
11
+ }): import("react").JSX.Element;
12
+ //# sourceMappingURL=ClosedWindowBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClosedWindowBanner.d.ts","sourceRoot":"","sources":["../src/ClosedWindowBanner.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAiBxF"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { IconAlert, IconChevronDown } from "./icons.js";
4
+ /**
5
+ * Shown above the composer when a WhatsApp client's 24-hour window is closed, a port of native
6
+ * ClosedWindowBanner: WhatsApp only lets businesses send free-form messages for 24 hours after the
7
+ * client's last message; outside that the message goes out inside an approved template with the
8
+ * coach's text cut to a short preview, and the client taps to read it in full.
9
+ */
10
+ export function ClosedWindowBanner({ win, first }) {
11
+ const [open, setOpen] = useState(false);
12
+ const hrs = win.hoursSince != null ? Math.floor(win.hoursSince) : null;
13
+ return (_jsxs("div", { className: "u-wa", role: "status", children: [_jsx("span", { className: "u-wa-ico", "aria-hidden": "true", children: _jsx(IconAlert, {}) }), _jsxs("div", { className: "u-wa-body", children: [_jsxs("div", { className: "u-wa-top", children: [_jsx("strong", { children: "WhatsApp window closed." }), " ", hrs != null ? `${first} last wrote ${hrs}h ago` : `${first} hasn't written yet`, "; your message goes out as the ", win.waitingTemplate?.label ? `"${win.waitingTemplate.label}"` : "waiting", " template until they reply.", _jsxs("button", { type: "button", className: "u-wa-more", "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [open ? "Less" : "Why?", _jsx(IconChevronDown, {})] })] }), open && (_jsxs("p", { className: "u-wa-why", children: ["WhatsApp lets businesses send free-form messages for 24 hours after a client's last message. After that only approved templates go through, so Uplift wraps your text in one: ", first, " sees a short preview", win.waitingTemplate?.previewMax ? ` (about ${win.waitingTemplate.previewMax} characters)` : "", " and taps to read the full message. The preview above shows exactly where the cut lands."] }))] })] }));
14
+ }
15
+ //# sourceMappingURL=ClosedWindowBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClosedWindowBanner.js","sourceRoot":"","sources":["../src/ClosedWindowBanner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAA0C;IACvF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,aACjC,eAAM,SAAS,EAAC,UAAU,iBAAa,MAAM,YAAC,KAAC,SAAS,KAAG,GAAO,EAClE,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,UAAU,aACvB,uDAAwC,OAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,qBAAqB,qCAAiC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,iCACnO,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,mBAAgB,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAC,KAAC,eAAe,KAAG,IAAS,IACpJ,EACL,IAAI,IAAI,CACP,aAAG,SAAS,EAAC,UAAU,+LAAgL,KAAK,2BAAuB,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,eAAe,CAAC,UAAU,cAAc,CAAC,CAAC,CAAC,EAAE,gGAA6F,CAC/Z,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { Attachment, Client, Tone } from "@uplifted/sdk";
2
+ import type { Purpose } from "./purposes.js";
3
+ import { type Injection } from "./SegmentEditor.js";
4
+ import type { DraftsState } from "./useDrafts.js";
5
+ import type { SendState } from "./useSend.js";
6
+ export interface ComposerProps {
7
+ /** Who the message is to. A not-connected host client has no id or channel yet. */
8
+ recipient: {
9
+ id?: string | undefined;
10
+ name: string;
11
+ channel?: Client["channel"] | undefined;
12
+ phone?: string | undefined;
13
+ };
14
+ text: string;
15
+ onText: (t: string) => void;
16
+ /** A picked draft to show as pills. */
17
+ inject?: Injection | null | undefined;
18
+ drafts: DraftsState;
19
+ draftsLabel: string;
20
+ draftsFootnote?: string | undefined;
21
+ selectedTone: Tone | null;
22
+ onPick: (tone: Tone, text: string) => void;
23
+ /** ✨: with `purposes` the button opens the purpose menu and passes the pick; without, it generates directly. */
24
+ onGenerate: (purpose?: Purpose) => void;
25
+ purposes?: readonly Purpose[] | null | undefined;
26
+ /** Opens the editor for the ✨ options (the sliders icon in the menu's title row). */
27
+ onCustomize?: (() => void) | undefined;
28
+ generateDisabled?: boolean | undefined;
29
+ onSend: (payload: {
30
+ body: string;
31
+ attachments: Attachment[];
32
+ }) => void;
33
+ /** Absent for a not-connected client: nothing can be in flight. */
34
+ send?: SendState | undefined;
35
+ /** S1 free-tier wall: open the offer. */
36
+ onNeedsPlan: (reason?: "client_limit" | "plan_inactive") => void;
37
+ /** Attachments need a connected client (media is keyed under them). Default: when `recipient.id` is set. */
38
+ attachments?: boolean | undefined;
39
+ /** The client's WhatsApp window is closed: text goes as the template, media waits for their reply. */
40
+ windowClosed?: boolean | undefined;
41
+ }
42
+ /**
43
+ * The composer footer, a port of native Uplift's ChatPage footer: a collapsible tools rail over the
44
+ * draft grid; attachment chips with channel limits; the long-SMS notice; then the editor row with
45
+ * the iMessage-style + menu (Photo / Video / File / More… → Voice note, Audio file) and the editor
46
+ * pill whose right-edge button is Send when there is content and ✨ Generate when there is not.
47
+ */
48
+ export declare function Composer(p: ComposerProps): import("react").JSX.Element;
49
+ //# sourceMappingURL=Composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AAM3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,mFAAmF;IACnF,SAAS,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC1H,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,uCAAuC;IACvC,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,gHAAgH;IAChH,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACvC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,MAAM,EAAE,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,UAAU,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACvE,mEAAmE;IACnE,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,yCAAyC;IACzC,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,eAAe,KAAK,IAAI,CAAC;IACjE,4GAA4G;IAC5G,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,sGAAsG;IACtG,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,+BAqJxC"}
@@ -0,0 +1,99 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
+ import { AssistantGrid } from "./AssistantGrid.js";
4
+ import { AttachmentPicker, PICK_ACCEPT } from "./AttachmentPicker.js";
5
+ import { ComposerExtras } from "./ComposerExtras.js";
6
+ import { IconPlus, IconSend, IconSliders, IconSparkles } from "./icons.js";
7
+ import { channelLabel, firstName } from "./labels.js";
8
+ import { SegmentEditor } from "./SegmentEditor.js";
9
+ import { previewSmsCost } from "./smsSegments.js";
10
+ import { clockLabel } from "./time.js";
11
+ /**
12
+ * The composer footer, a port of native Uplift's ChatPage footer: a collapsible tools rail over the
13
+ * draft grid; attachment chips with channel limits; the long-SMS notice; then the editor row with
14
+ * the iMessage-style + menu (Photo / Video / File / More… → Voice note, Audio file) and the editor
15
+ * pill whose right-edge button is Send when there is content and ✨ Generate when there is not.
16
+ */
17
+ export function Composer(p) {
18
+ const first = firstName(p.recipient.name);
19
+ const sending = p.send?.status === "sending";
20
+ const attachmentsOn = p.attachments ?? !!p.recipient.id;
21
+ const [extrasCollapsed, setExtrasCollapsed] = useState(false);
22
+ const [gridOpen, setGridOpen] = useState(true);
23
+ const [attachMenu, setAttachMenu] = useState(null);
24
+ const [genMenu, setGenMenu] = useState(false);
25
+ const [attach, setAttach] = useState({ count: 0, uploading: false, ready: 0, recording: false, errors: false });
26
+ const picker = useRef(null);
27
+ // A generate into a collapsed stack would land where the coach can't see it: expand first.
28
+ const generate = useCallback((purpose) => { setGenMenu(false); setExtrasCollapsed(false); setGridOpen(true); p.onGenerate(purpose); }, [p]);
29
+ const hasText = p.text.trim().length > 0;
30
+ const showSend = hasText || attach.ready > 0 || sending;
31
+ // WhatsApp only carries media inside the 24-hour window; outside it Uplift refuses the whole send.
32
+ const mediaBlocked = !!p.windowClosed && attach.count > 0;
33
+ const canSend = (hasText || attach.ready > 0) && !sending && !attach.uploading && !attach.recording && !mediaBlocked;
34
+ const smsCost = useMemo(() => {
35
+ if (p.recipient.channel && p.recipient.channel !== "sms")
36
+ return null;
37
+ if (!p.recipient.channel)
38
+ return null;
39
+ if (!hasText)
40
+ return null;
41
+ const cost = previewSmsCost(p.text);
42
+ return cost.willSplit ? cost : null;
43
+ }, [p.text, p.recipient.channel, hasText]);
44
+ const limitsNote = p.recipient.channel === "whatsapp"
45
+ ? "WhatsApp: photos ≤5MB; video, audio & PDF ≤16MB. Multiple files arrive as separate messages."
46
+ : /^\+?1/.test((p.recipient.phone ?? "").replace(/[^\d+]/g, ""))
47
+ ? "SMS: photos ≤2MB and videos ≤1MB send as picture messages (MMS); anything larger, plus audio & PDFs, sends as a link."
48
+ : "This client is on SMS outside the US/Canada — attachments will be delivered as links in the text.";
49
+ const send = () => {
50
+ if (!canSend)
51
+ return;
52
+ const atts = picker.current?.getReady() ?? [];
53
+ p.onSend({ body: p.text.trim(), attachments: atts });
54
+ };
55
+ // After a successful send the parent clears the text; clear the chips with it.
56
+ useEffect(() => { if (p.send?.status === "sent")
57
+ picker.current?.clear(); }, [p.send?.status]);
58
+ const pickAttachment = (accept) => { setAttachMenu(null); picker.current?.openPicker(accept); };
59
+ const recordVoiceNote = () => { setAttachMenu(null); picker.current?.startRecording(); };
60
+ return (_jsxs("div", { className: "u-composer", children: [_jsx(ComposerExtras, { collapsed: extrasCollapsed, onToggle: setExtrasCollapsed, hasContent: p.drafts.status !== "idle", children: _jsx(AssistantGrid, { drafts: p.drafts, label: p.draftsLabel, footnote: p.draftsFootnote, selected: p.selectedTone, onPick: p.onPick, onRegenerate: () => generate(), regenDisabled: p.generateDisabled, open: gridOpen, onToggle: () => setGridOpen((o) => !o), clientFirstName: first, onNeedsPlan: () => p.onNeedsPlan("plan_inactive") }) }), attachmentsOn && (_jsxs("div", { className: "u-attach-row", style: { display: attach.count > 0 || attach.recording ? "flex" : "none" }, children: [_jsx(AttachmentPicker, { ref: picker, clientId: p.recipient.id, onChange: setAttach }), attach.count > 0 && (mediaBlocked
61
+ ? _jsx("span", { className: "u-limits u-limits-warn", role: "status", children: mediaWaitNote(first) })
62
+ : _jsx("span", { className: "u-limits", children: limitsNote }))] })), smsCost && (_jsxs("span", { className: "u-sms-note", role: "status", children: ["Too long for one text \u2014 this will arrive as ", smsCost.parts, " messages (", smsCost.segments, " SMS parts).", smsCost.encoding === "UCS-2" && " Emoji and special characters more than halve how much fits in each."] })), _jsxs("div", { className: "u-c-row", children: [_jsxs("div", { className: "u-attach-wrap", children: [attachMenu && (_jsxs(_Fragment, { children: [_jsx("div", { className: "u-menu-backdrop", onClick: () => setAttachMenu(null) }), _jsx("div", { className: "u-menu u-menu-left", role: "menu", "aria-label": "Attach", children: attachMenu === "main"
63
+ ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", role: "menuitem", className: "u-menu-item", onClick: () => pickAttachment(PICK_ACCEPT.photo), children: "Photo" }), _jsx("button", { type: "button", role: "menuitem", className: "u-menu-item", onClick: () => pickAttachment(PICK_ACCEPT.video), children: "Video" }), _jsx("button", { type: "button", role: "menuitem", className: "u-menu-item", onClick: () => pickAttachment(PICK_ACCEPT.file), children: "File (PDF)" }), _jsx("button", { type: "button", role: "menuitem", className: "u-menu-item", onClick: () => setAttachMenu("more"), children: "More\u2026" })] }))
64
+ : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", role: "menuitem", className: "u-menu-item", onClick: () => setAttachMenu("main"), children: "\u2190 Back" }), _jsx("button", { type: "button", role: "menuitem", className: "u-menu-item", onClick: recordVoiceNote, children: "Voice note" }), _jsx("button", { type: "button", role: "menuitem", className: "u-menu-item", onClick: () => pickAttachment("audio/*"), children: "Audio file" })] })) })] })), _jsx("button", { type: "button", className: "u-attach-btn", onClick: () => setAttachMenu((m) => (m ? null : "main")), disabled: !attachmentsOn || sending || attach.recording, title: attachmentsOn ? "Attach" : `Connect ${first} to attach files`, "aria-label": "Attach", "aria-expanded": !!attachMenu, children: _jsx(IconPlus, {}) })] }), _jsxs("div", { className: `u-pill${p.inject?.locked ? " u-pill-locked" : ""}`, children: [_jsx("div", { className: "u-pill-grow", children: _jsx(SegmentEditor, { ariaLabel: `Message to ${p.recipient.name}`, placeholder: "Write your message here\u2026", value: p.text, onChange: p.onText, inject: p.inject, disabled: sending, readOnly: !!p.inject?.locked }) }), showSend
65
+ ? (_jsx("button", { type: "button", className: "u-send-btn", onClick: send, disabled: !canSend, "aria-busy": sending, title: "Send", "aria-label": "Send message", children: _jsx(IconSend, {}) }))
66
+ : (_jsx("button", { type: "button", className: "u-gen-btn", onClick: () => (p.purposes ? setGenMenu((o) => !o) : generate()), disabled: p.generateDisabled, title: "Generate message", "aria-label": "Generate message", "aria-expanded": p.purposes ? genMenu : undefined, children: _jsx(IconSparkles, {}) })), genMenu && p.purposes && (_jsxs(_Fragment, { children: [_jsx("div", { className: "u-menu-backdrop", onClick: () => setGenMenu(false) }), _jsxs("div", { className: "u-menu u-menu-right", role: "menu", "aria-label": "Generate message", children: [_jsxs("div", { className: "u-menu-titlerow", children: [_jsx("span", { className: "u-menu-title", children: "Generate message" }), p.onCustomize && (_jsx("button", { type: "button", className: "u-menu-cfg", onClick: () => { setGenMenu(false); p.onCustomize?.(); }, title: "Customize these options", "aria-label": "Customize proactive options", children: _jsx(IconSliders, {}) }))] }), p.purposes.map((pu) => (_jsxs("button", { type: "button", role: "menuitem", className: "u-menu-item u-menu-purpose", onClick: () => generate(pu), title: pu.prompt, children: [_jsx(pu.Icon, {}), _jsx("span", { children: pu.label })] }, pu.id)))] })] }))] })] }), p.send?.status === "error" && p.send.error && _jsx(SendNote, { error: p.send.error, first: first, onRetry: send, onNeedsPlan: p.onNeedsPlan })] }));
67
+ }
68
+ /** D11: typed send errors, placed under the composer. The text above is never cleared. */
69
+ /** Why attachments can't go while a WhatsApp window is closed, and how to send the text anyway. */
70
+ const mediaWaitNote = (first) => `Attachments can't go until ${first} replies: WhatsApp only allows media inside the 24-hour window. Remove them to send your text now as the template.`;
71
+ function SendNote({ error, first, onRetry, onNeedsPlan }) {
72
+ const reason = error.details?.["reason"];
73
+ switch (error.code) {
74
+ case "subscription_required":
75
+ return (_jsxs("div", { className: "u-note u-note-warn", role: "status", children: [_jsx("span", { children: "Messaging more than 2 clients needs an Uplift plan. Your draft stays here." }), _jsx("span", { className: "u-sp" }), _jsx("button", { type: "button", className: "u-send", onClick: () => onNeedsPlan("client_limit"), children: "See the plan" })] }));
76
+ case "plan_inactive":
77
+ return (_jsxs("div", { className: "u-note u-note-warn", role: "status", children: [_jsx("span", { children: "Your Uplift plan isn't active, so this can't send yet. Your draft stays here." }), _jsx("span", { className: "u-sp" }), _jsx("button", { type: "button", className: "u-send", onClick: () => onNeedsPlan("plan_inactive"), children: "Reactivate" })] }));
78
+ case "daily_send_ceiling":
79
+ return _jsxs("div", { className: "u-note u-note-warn", role: "status", children: ["You've hit today's send limit. Your draft stays here", error.resetAt ? ` and sending reopens at ${clockLabel(error.resetAt)}` : "", "."] });
80
+ case "window_closed":
81
+ if (reason === "media_needs_open_window")
82
+ return _jsx("div", { className: "u-note u-note-warn", role: "status", children: mediaWaitNote(first) });
83
+ return _jsxs("div", { className: "u-note u-note-warn", role: "status", children: ["WhatsApp's 24-hour window with ", first, " is closed. ", first, " needs to message first, then this will send."] });
84
+ case "forbidden":
85
+ if (reason === "client_opted_out")
86
+ return _jsxs("div", { className: "u-note u-note-warn", role: "status", children: [first, " replied STOP, so Uplift can't text them. They can text START to resume."] });
87
+ if (reason === "read_only")
88
+ return _jsx("div", { className: "u-note u-note-warn", role: "status", children: "This Uplift account is read-only right now, so sending is off." });
89
+ return _jsx("div", { className: "u-note u-note-err", role: "status", children: error.message });
90
+ case "rate_limited":
91
+ return _jsxs("div", { className: "u-note u-note-warn", role: "status", children: ["Too many sends at once. Try again in ", Math.ceil(error.retryAfter ?? 30), "s."] });
92
+ case "channel_error":
93
+ case "timeout":
94
+ case "unknown":
95
+ default:
96
+ return (_jsxs("div", { className: "u-note u-note-err", role: "status", children: [_jsxs("span", { children: ["Not delivered. ", error.message] }), _jsx("span", { className: "u-sp" }), _jsx("button", { type: "button", className: "u-retry", onClick: onRetry, children: "Retry" })] }));
97
+ }
98
+ }
99
+ //# sourceMappingURL=Composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Collapsible wrapper for everything that stacks above the editor (the draft grid), a port of
4
+ * native Uplift's ComposerExtras (GH #512/#513): one control that drops the whole stack down to
5
+ * just the input. Collapse is CSS-only so children stay mounted. The rail only renders when there
6
+ * is something to collapse, or the stack is already collapsed. Open, it sits at the right end of the
7
+ * drafts header row; collapsed, it is the only row left, right-aligned.
8
+ */
9
+ export declare function ComposerExtras({ collapsed, onToggle, hasContent, children }: {
10
+ collapsed: boolean;
11
+ onToggle: (next: boolean) => void;
12
+ hasContent: boolean;
13
+ children: ReactNode;
14
+ }): import("react").JSX.Element;
15
+ //# sourceMappingURL=ComposerExtras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposerExtras.d.ts","sourceRoot":"","sources":["../src/ComposerExtras.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAoBhL"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { IconChevronDown, IconChevronUp } from "./icons.js";
3
+ /**
4
+ * Collapsible wrapper for everything that stacks above the editor (the draft grid), a port of
5
+ * native Uplift's ComposerExtras (GH #512/#513): one control that drops the whole stack down to
6
+ * just the input. Collapse is CSS-only so children stay mounted. The rail only renders when there
7
+ * is something to collapse, or the stack is already collapsed. Open, it sits at the right end of the
8
+ * drafts header row; collapsed, it is the only row left, right-aligned.
9
+ */
10
+ export function ComposerExtras({ collapsed, onToggle, hasContent, children }) {
11
+ const showRail = collapsed || hasContent;
12
+ return (_jsxs("div", { className: "u-extras-wrap", children: [showRail && (_jsxs("button", { type: "button", className: "u-rail", onClick: () => onToggle(!collapsed), "aria-expanded": !collapsed, "aria-label": collapsed ? "Show drafts & tools" : "Hide drafts & tools", title: collapsed ? "Show drafts & tools" : "Hide drafts & tools to see more of the chat", children: [collapsed ? _jsx(IconChevronUp, {}) : _jsx(IconChevronDown, {}), collapsed && _jsx("span", { className: "u-rail-label", children: "Show drafts & tools" })] })), _jsx("div", { className: collapsed ? "u-extras u-extras-off" : "u-extras", "data-testid": "composer-extras", children: children })] }));
13
+ }
14
+ //# sourceMappingURL=ComposerExtras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposerExtras.js","sourceRoot":"","sources":["../src/ComposerExtras.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAuG;IAC/K,MAAM,QAAQ,GAAG,SAAS,IAAI,UAAU,CAAC;IACzC,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC3B,QAAQ,IAAI,CACX,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,mBACpB,CAAC,SAAS,gBACb,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,EACrE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,6CAA6C,aAEvF,SAAS,CAAC,CAAC,CAAC,KAAC,aAAa,KAAG,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,EACnD,SAAS,IAAI,eAAM,SAAS,EAAC,cAAc,oCAA+B,IACpE,CACV,EACD,cAAK,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,UAAU,iBAAc,iBAAiB,YAAE,QAAQ,GAAO,IAC5G,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from "react";
2
+ import type { Client, DraftSet, Tone } from "@uplifted/sdk";
3
+ import type { InstructionsState } from "./useInstructions.js";
4
+ import { type Purpose } from "./purposes.js";
5
+ export interface ConversationPaneProps {
6
+ client: Client;
7
+ activitySourceLabel: string;
8
+ now: Date;
9
+ onBack: () => void;
10
+ /** Announce to the panel's aria-live region. */
11
+ announce: (text: string) => void;
12
+ onSent?: ((client: Client, body: string) => void) | undefined;
13
+ onNeedsPlan: (reason?: "client_limit" | "plan_inactive") => void;
14
+ /** Drafts already produced by Bulk generate for this client. */
15
+ cachedDrafts?: DraftSet | null | undefined;
16
+ /** Text to start the composer with (quick draft from a row). */
17
+ initialText?: string | undefined;
18
+ initialTone?: Tone | null | undefined;
19
+ /** The coach's ✨ options; built-ins until loaded. */
20
+ purposes?: readonly Purpose[] | undefined;
21
+ onCustomize?: (() => void) | undefined;
22
+ /** The thread was opened and its unread state cleared (native /clients/:id/read). */
23
+ onRead?: ((client: Client) => void) | undefined;
24
+ /** The coach's AI instructions, for Config AI on each item. Without it the item action rows are not shown. */
25
+ instructions?: InstructionsState | undefined;
26
+ /** The panel's AI settings and full screen buttons, at the right end of this header. */
27
+ headActions?: ReactNode;
28
+ /** Bumps on each poll tick: the thread refetches quietly. */
29
+ refreshKey?: number | undefined;
30
+ }
31
+ /** Right pane: header, timeline, composer (with the draft grid) for one client. Remount per client (key on id). */
32
+ export declare function ConversationPane({ client, activitySourceLabel, now, onBack, announce, onSent, onNeedsPlan, cachedDrafts, initialText, initialTone, purposes, onCustomize, onRead, refreshKey, instructions, headActions }: ConversationPaneProps): import("react").JSX.Element;
33
+ //# sourceMappingURL=ConversationPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationPane.d.ts","sourceRoot":"","sources":["../src/ConversationPane.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAc,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAK9D,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAS7E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,gDAAgD;IAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9D,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,eAAe,KAAK,IAAI,CAAC;IACjE,gEAAgE;IAChE,YAAY,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACvC,qFAAqF;IACrF,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAChD,8GAA8G;IAC9G,YAAY,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,wFAAwF;IACxF,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,mHAAmH;AACnH,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,YAAmB,EAAE,WAAgB,EAAE,WAAkB,EAAE,QAAmB,EAAE,WAAW,EAAE,MAAM,EAAE,UAAc,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,qBAAqB,+BA0JlR"}
@@ -0,0 +1,126 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { ClosedWindowBanner } from "./ClosedWindowBanner.js";
4
+ import { Composer } from "./Composer.js";
5
+ import { ItemActions } from "./ItemActions.js";
6
+ import { useDeliveryStatus } from "./useDeliveryStatus.js";
7
+ import { useUplift } from "./UpliftProvider.js";
8
+ import { useWhatsAppWindow } from "./useWhatsAppWindow.js";
9
+ import { WaitingTemplateGhost } from "./WaitingTemplateGhost.js";
10
+ import { PURPOSES, purposeToDraftsInput } from "./purposes.js";
11
+ import { ThreadFeed } from "./ThreadFeed.js";
12
+ import { ChannelBadge } from "./ChannelBadge.js";
13
+ import { avatarColor, channelLabel, firstName, initials, statusTag } from "./labels.js";
14
+ import { useDrafts } from "./useDrafts.js";
15
+ import { useSend } from "./useSend.js";
16
+ import { useThread } from "./useThread.js";
17
+ /** Right pane: header, timeline, composer (with the draft grid) for one client. Remount per client (key on id). */
18
+ export function ConversationPane({ client, activitySourceLabel, now, onBack, announce, onSent, onNeedsPlan, cachedDrafts = null, initialText = "", initialTone = null, purposes = PURPOSES, onCustomize, onRead, refreshKey = 0, instructions, headActions }) {
19
+ const { client: api } = useUplift();
20
+ const thread = useThread(client.id);
21
+ const drafts = useDrafts(client.id, cachedDrafts);
22
+ const sender = useSend(client.id);
23
+ const wa = useWhatsAppWindow(client, thread.messages.length);
24
+ useDeliveryStatus(client.id, thread.messages, thread.patch);
25
+ const { refresh: refreshThread } = thread;
26
+ useEffect(() => { if (refreshKey > 0)
27
+ refreshThread(); }, [refreshKey, refreshThread]);
28
+ // What the grid is showing. "reply" follows the drafts Uplift prepared for the client's latest
29
+ // activity (native ComposerAssistant's notification.drafts); "bulk" and "picked" are drafts the coach
30
+ // asked for and stay until they send or pick something else.
31
+ const [gridSource, setGridSource] = useState(cachedDrafts ? "bulk" : "reply");
32
+ // Native's coachSpokeLast: only the newest item counts. A coach text at the bottom hides reply
33
+ // drafts; an activity card after it brings them back.
34
+ const last = thread.messages[thread.messages.length - 1];
35
+ const latestInboundId = [...thread.messages].reverse().find((m) => m.kind === "message" && m.direction === "inbound")?.id ?? null;
36
+ const coachSpokeLast = last?.kind === "message" && last.direction === "outbound";
37
+ const shownReply = useRef(null);
38
+ useEffect(() => {
39
+ if (gridSource !== "reply")
40
+ return;
41
+ const next = !coachSpokeLast && thread.replyDrafts ? thread.replyDrafts : null;
42
+ const key = next ? JSON.stringify(next) : null;
43
+ if (key === shownReply.current)
44
+ return;
45
+ shownReply.current = key;
46
+ if (next) {
47
+ drafts.seed(next);
48
+ setDraftsLabel("Reply drafts");
49
+ }
50
+ else if (drafts.status === "ready")
51
+ drafts.clear();
52
+ }, [gridSource, coachSpokeLast, thread.replyDrafts, drafts]);
53
+ // Opening the thread clears its unread badge in the list only. Native never clears the
54
+ // notification on open (it holds the reply drafts and the quick reply); a send clears it.
55
+ useEffect(() => {
56
+ if (thread.status !== "ready")
57
+ return;
58
+ onRead?.({ ...client, unreadCount: thread.unreadCount });
59
+ }, [thread.status, thread.unreadCount]); // eslint-disable-line react-hooks/exhaustive-deps
60
+ const [text, setText] = useState(initialText);
61
+ const [tone, setTone] = useState(initialTone);
62
+ // Drafts land in the editor as pills; a fresh key per pick so the same draft can be re-picked.
63
+ const [inject, setInject] = useState(initialText ? { text: initialText, key: 1 } : null);
64
+ // What the grid is showing: reply drafts, or the options for a picked ✨ purpose.
65
+ const [draftsLabel, setDraftsLabel] = useState(cachedDrafts ? "Bulk drafts" : "Reply drafts");
66
+ const first = firstName(client.name);
67
+ const headTag = statusTag(client.status);
68
+ // Bulk drafts that land while this client is already open take over the grid, as on a fresh open.
69
+ const seenBulk = useRef(cachedDrafts);
70
+ useEffect(() => {
71
+ if (!cachedDrafts || cachedDrafts === seenBulk.current)
72
+ return;
73
+ seenBulk.current = cachedDrafts;
74
+ drafts.seed(cachedDrafts);
75
+ setGridSource("bulk");
76
+ setDraftsLabel("Bulk drafts");
77
+ }, [cachedDrafts, drafts]);
78
+ // A quick draft arriving for an already-open client replaces the composer text (no remount).
79
+ useEffect(() => {
80
+ if (!initialText)
81
+ return;
82
+ setText(initialText);
83
+ setTone(initialTone ?? null);
84
+ setInject((i) => ({ text: initialText, key: (i?.key ?? 0) + 1 }));
85
+ }, [initialText, initialTone]);
86
+ const onText = useCallback((t) => {
87
+ setText(t);
88
+ setTone(null);
89
+ if (sender.status === "error" || sender.status === "sent")
90
+ sender.reset();
91
+ }, [sender]);
92
+ const onPick = useCallback((picked, draft) => {
93
+ setTone(picked);
94
+ setText(draft);
95
+ setInject((i) => ({ text: draft, key: (i?.key ?? 0) + 1 }));
96
+ if (sender.status === "error" || sender.status === "sent")
97
+ sender.reset();
98
+ }, [sender]);
99
+ const onGenerate = useCallback((purpose) => {
100
+ setDraftsLabel(purpose ? `${purpose.label} options` : "Reply drafts");
101
+ setGridSource("picked");
102
+ drafts.generate(purpose ? purposeToDraftsInput(purpose) : { purpose: "general" });
103
+ }, [drafts]);
104
+ const onSend = useCallback(async ({ body, attachments }) => {
105
+ const res = await sender.send(body, attachments);
106
+ if (!res)
107
+ return;
108
+ thread.append({ id: res.messageId ?? `local_${Date.now()}`, kind: "message", direction: "outbound", body, sentAt: new Date().toISOString(), deliveryStatus: res.state === "sent" || res.state === "partial" ? "sent" : "queued", ...(res.viaTemplate ? { sentViaTemplate: true } : {}), ...(attachments.length ? { attachments } : {}) });
109
+ if (res.viaTemplate)
110
+ thread.refresh();
111
+ setText("");
112
+ setTone(null);
113
+ drafts.clear();
114
+ thread.setReplyDrafts(null);
115
+ shownReply.current = null;
116
+ setGridSource("reply");
117
+ announce(`Sent to ${first}`);
118
+ onSent?.(client, body);
119
+ }, [sender, thread, drafts, announce, first, onSent, client]);
120
+ return (_jsxs("div", { className: "u-pane", children: [_jsxs("div", { className: "u-pane-head", children: [_jsx("button", { type: "button", className: "u-back", "aria-label": "Back to clients", title: "Back to clients", onClick: onBack, children: "\u2190" }), _jsxs("span", { className: "u-av-wrap", children: [_jsx("span", { className: "u-av u-av-sm", style: { background: avatarColor(client.id) }, "aria-hidden": "true", children: initials(client.name) }), _jsx(ChannelBadge, { channel: client.channel })] }), _jsxs("span", { className: "u-who", children: [_jsxs("strong", { children: [client.name, headTag && _jsx("span", { className: `u-tag u-${headTag.kind} u-head-status`, children: headTag.text })] }), _jsxs("small", { children: ["Client \u00B7 ", channelLabel(client.channel)] })] }), _jsx("span", { className: "u-chan", children: client.phone }), headActions] }), _jsx(ThreadFeed, { thread: thread, clientName: client.name, activitySourceLabel: activitySourceLabel, now: now, actions: (m) => (m.kind === "event" || m.direction === "inbound") && instructions
121
+ ? (_jsx(ItemActions, { generate: () => api.itemDrafts(client.id, m.id), surface: m.kind === "event" ? "update" : "message",
122
+ // The latest client message starts with the reply drafts Uplift prepared, when it has none of its own.
123
+ initialDrafts: m.drafts ?? (m.id === latestInboundId ? thread.replyDrafts : null), onPick: onPick, instructions: instructions, onNeedsPlan: () => onNeedsPlan("plan_inactive") }, m.id))
124
+ : null, foot: wa.closed && wa.window ? _jsx(WaitingTemplateGhost, { win: wa.window, text: text, first: first }) : null }), wa.closed && wa.window && _jsx(ClosedWindowBanner, { win: wa.window, first: first }), _jsx(Composer, { recipient: client, text: text, onText: onText, inject: inject, drafts: drafts, draftsLabel: draftsLabel, selectedTone: tone, onPick: onPick, onGenerate: onGenerate, purposes: purposes, onCustomize: onCustomize, generateDisabled: drafts.status === "loading" || drafts.retryIn !== null, onSend: (payload) => { void onSend(payload); }, send: sender, onNeedsPlan: onNeedsPlan, windowClosed: wa.closed })] }));
125
+ }
126
+ //# sourceMappingURL=ConversationPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationPane.js","sourceRoot":"","sources":["../src/ConversationPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DeliveryStatus } from "@uplifted/sdk";
2
+ /** WhatsApp-style receipt, a port of native DeliveryReceipt: ✓ handed off, ✓✓ delivered, ⚠ failed (title carries the error). */
3
+ export declare function DeliveryReceipt({ status, error }: {
4
+ status: DeliveryStatus | null | undefined;
5
+ error?: string | null | undefined;
6
+ }): import("react").JSX.Element | null;
7
+ //# sourceMappingURL=DeliveryReceipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeliveryReceipt.d.ts","sourceRoot":"","sources":["../src/DeliveryReceipt.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,gIAAgI;AAChI,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,sCAKlI"}