@uplifted/react 0.25.0 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/AddClientSheet.d.ts +4 -4
  3. package/dist/AddClientSheet.d.ts.map +1 -1
  4. package/dist/AddClientSheet.js.map +1 -1
  5. package/dist/ChannelBadge.d.ts +5 -1
  6. package/dist/ChannelBadge.d.ts.map +1 -1
  7. package/dist/ChannelBadge.js +8 -4
  8. package/dist/ChannelBadge.js.map +1 -1
  9. package/dist/ChannelControl.d.ts +24 -0
  10. package/dist/ChannelControl.d.ts.map +1 -0
  11. package/dist/ChannelControl.js +96 -0
  12. package/dist/ChannelControl.js.map +1 -0
  13. package/dist/ChannelExplainer.d.ts +1 -1
  14. package/dist/ChannelExplainer.d.ts.map +1 -1
  15. package/dist/ClientChat.d.ts +37 -0
  16. package/dist/ClientChat.d.ts.map +1 -0
  17. package/dist/ClientChat.js +365 -0
  18. package/dist/ClientChat.js.map +1 -0
  19. package/dist/Composer.d.ts +1 -1
  20. package/dist/Composer.d.ts.map +1 -1
  21. package/dist/Composer.js +7 -5
  22. package/dist/Composer.js.map +1 -1
  23. package/dist/ConnectClientSheet.d.ts +5 -3
  24. package/dist/ConnectClientSheet.d.ts.map +1 -1
  25. package/dist/ConnectClientSheet.js +2 -2
  26. package/dist/ConnectClientSheet.js.map +1 -1
  27. package/dist/ConversationPane.d.ts +5 -1
  28. package/dist/ConversationPane.d.ts.map +1 -1
  29. package/dist/ConversationPane.js +5 -3
  30. package/dist/ConversationPane.js.map +1 -1
  31. package/dist/HostPreviewPane.d.ts.map +1 -1
  32. package/dist/HostPreviewPane.js +1 -0
  33. package/dist/HostPreviewPane.js.map +1 -1
  34. package/dist/ThreadFeed.d.ts.map +1 -1
  35. package/dist/ThreadFeed.js +3 -2
  36. package/dist/ThreadFeed.js.map +1 -1
  37. package/dist/UpliftPanel.d.ts +7 -1
  38. package/dist/UpliftPanel.d.ts.map +1 -1
  39. package/dist/UpliftPanel.js +20 -3
  40. package/dist/UpliftPanel.js.map +1 -1
  41. package/dist/build-info.json +3 -3
  42. package/dist/channels.d.ts +1 -1
  43. package/dist/channels.d.ts.map +1 -1
  44. package/dist/chatStrings.d.ts +56 -0
  45. package/dist/chatStrings.d.ts.map +1 -0
  46. package/dist/chatStrings.js +50 -0
  47. package/dist/chatStrings.js.map +1 -0
  48. package/dist/chatUnread.d.ts +9 -0
  49. package/dist/chatUnread.d.ts.map +1 -0
  50. package/dist/chatUnread.js +10 -0
  51. package/dist/chatUnread.js.map +1 -0
  52. package/dist/icons.d.ts +1 -0
  53. package/dist/icons.d.ts.map +1 -1
  54. package/dist/icons.js +1 -0
  55. package/dist/icons.js.map +1 -1
  56. package/dist/index.d.ts +4 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +4 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/labels.js +1 -1
  61. package/dist/labels.js.map +1 -1
  62. package/dist/styles.d.ts +1 -1
  63. package/dist/styles.d.ts.map +1 -1
  64. package/dist/styles.js +96 -0
  65. package/dist/styles.js.map +1 -1
  66. package/dist/useChatUnread.d.ts +8 -0
  67. package/dist/useChatUnread.d.ts.map +1 -0
  68. package/dist/useChatUnread.js +64 -0
  69. package/dist/useChatUnread.js.map +1 -0
  70. package/dist/useClientChat.d.ts +57 -0
  71. package/dist/useClientChat.d.ts.map +1 -0
  72. package/dist/useClientChat.js +361 -0
  73. package/dist/useClientChat.js.map +1 -0
  74. package/dist/useStickToBottom.d.ts +2 -0
  75. package/dist/useStickToBottom.d.ts.map +1 -1
  76. package/dist/useStickToBottom.js +5 -1
  77. package/dist/useStickToBottom.js.map +1 -1
  78. package/dist/useThread.d.ts +3 -1
  79. package/dist/useThread.d.ts.map +1 -1
  80. package/dist/useThread.js +4 -1
  81. package/dist/useThread.js.map +1 -1
  82. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatUnread.d.ts","sourceRoot":"","sources":["../src/useChatUnread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,eAAe,CAAC;AAK7D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAqC/D"}
@@ -0,0 +1,64 @@
1
+ import { useEffect, useState } from "react";
2
+ import { unreadForClient } from "./chatUnread.js";
3
+ const BACKOFF_MS = [2000, 5000, 15000, 30000];
4
+ /**
5
+ * How many coach messages the client has not read in the app (texts don't count), kept live, for a tab badge or the app icon
6
+ * (`navigator.setAppBadge`) while <ClientChat> is not on screen. Pass null to stop. Counts the
7
+ * newest page of the thread (up to 50), which is plenty for a badge.
8
+ */
9
+ export function useChatUnread(client) {
10
+ const [count, setCount] = useState(0);
11
+ useEffect(() => {
12
+ if (!client) {
13
+ setCount(0);
14
+ return;
15
+ }
16
+ const ctrl = new AbortController();
17
+ let readAt = null;
18
+ const coach = new Map();
19
+ const recount = () => {
20
+ let n = 0;
21
+ for (const m of coach.values())
22
+ if (unreadForClient(m, readAt))
23
+ n++;
24
+ setCount(n);
25
+ };
26
+ const take = (m) => { if (m.from === "coach")
27
+ coach.set(m.id, m); };
28
+ (async () => {
29
+ let step = 0;
30
+ while (!ctrl.signal.aborted) {
31
+ try {
32
+ const page = await client.thread();
33
+ readAt = page.clientReadAt;
34
+ page.messages.forEach(take);
35
+ recount();
36
+ await client.stream((e) => {
37
+ if (e.type === "connected")
38
+ step = 0;
39
+ else if (e.type === "message") {
40
+ take(e.data);
41
+ recount();
42
+ }
43
+ else if (e.type === "read" && e.data.side === "client") {
44
+ if (!readAt || e.data.at > readAt)
45
+ readAt = e.data.at;
46
+ recount();
47
+ }
48
+ }, { signal: ctrl.signal });
49
+ }
50
+ catch (e) {
51
+ const code = e?.code;
52
+ if (code === "unauthorized" || code === "origin_not_allowed")
53
+ return;
54
+ }
55
+ if (ctrl.signal.aborted)
56
+ return;
57
+ await new Promise((r) => setTimeout(r, BACKOFF_MS[Math.min(step++, BACKOFF_MS.length - 1)]));
58
+ }
59
+ })();
60
+ return () => ctrl.abort();
61
+ }, [client]);
62
+ return count;
63
+ }
64
+ //# sourceMappingURL=useChatUnread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatUnread.js","sourceRoot":"","sources":["../src/useChatUnread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { ChatError, type ChatClient, type ChatMe, type ChatMessage, type ChatOutboxStore } from "@uplifted/sdk";
2
+ export type PendingState = "queued" | "uploading" | "sending" | "failed" | "moved";
3
+ /** A message the client wrote that Uplift has not confirmed yet, as the chat shows it. */
4
+ export interface PendingMessage {
5
+ clientMessageId: string;
6
+ text: string;
7
+ createdAt: string;
8
+ state: PendingState;
9
+ /** 0..1 while a file uploads. */
10
+ progress: number | null;
11
+ /** Uploaded, or still waiting, with a local preview for each. */
12
+ media: {
13
+ id: string;
14
+ type: "image" | "video" | "audio" | "document";
15
+ url: string;
16
+ name: string;
17
+ }[];
18
+ failed?: {
19
+ code: string;
20
+ message: string;
21
+ };
22
+ }
23
+ export interface ClientChatState {
24
+ status: "loading" | "ready" | "error";
25
+ error: ChatError | null;
26
+ me: ChatMe | null;
27
+ /** Confirmed messages, oldest first. */
28
+ messages: ChatMessage[];
29
+ pending: PendingMessage[];
30
+ hasMore: boolean;
31
+ loadingOlder: boolean;
32
+ channel: string;
33
+ readOnly: boolean;
34
+ coachReadAt: string | null;
35
+ clientReadAt: string | null;
36
+ online: boolean;
37
+ /** False while the live connection is down and being retried. */
38
+ live: boolean;
39
+ /** Coach messages after the client's read mark. */
40
+ unread: number;
41
+ send(text: string, files?: File[]): void;
42
+ retry(clientMessageId: string): void;
43
+ remove(clientMessageId: string): void;
44
+ loadOlder(): void;
45
+ /** Moves the read mark up to `at` (debounced). */
46
+ markRead(at: string): void;
47
+ reload(): void;
48
+ }
49
+ /**
50
+ * Everything <ClientChat> needs: the thread, the live stream (reconnecting with backoff and catching
51
+ * up on what it missed), and the outbox, which sends messages in order, uploads files first, retries
52
+ * network failures by itself and keeps refusals for the client to retry or delete.
53
+ */
54
+ export declare function useClientChat(client: ChatClient, outbox: ChatOutboxStore, opts?: {
55
+ onAuthError?: (e: ChatError) => void;
56
+ }): ClientChatState;
57
+ //# sourceMappingURL=useClientChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClientChat.d.ts","sourceRoot":"","sources":["../src/useClientChat.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EACiB,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAC/F,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnF,0FAA0F;AAC1F,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iEAAiE;IACjE,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnG,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,wCAAwC;IACxC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAC;IACd,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,SAAS,IAAI,IAAI,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,IAAI,IAAI,CAAC;CAChB;AAiBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;CAAO,GAAG,eAAe,CAuT/I"}
@@ -0,0 +1,361 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { unreadForClient } from "./chatUnread.js";
3
+ import { ChatError, newClientMessageId, } from "@uplifted/sdk";
4
+ const BACKOFF_MS = [1000, 2000, 5000, 10000, 30000];
5
+ const READ_DEBOUNCE_MS = 800;
6
+ const typeOf = (mime) => mime.startsWith("image/") ? "image" : mime.startsWith("video/") ? "video" : mime.startsWith("audio/") ? "audio" : "document";
7
+ function mergeMessages(prev, incoming) {
8
+ if (!incoming.length)
9
+ return prev;
10
+ const byId = new Map(prev.map((m) => [m.id, m]));
11
+ for (const m of incoming)
12
+ if (m && m.id)
13
+ byId.set(m.id, m);
14
+ return [...byId.values()].sort((a, b) => (a.at === b.at ? a.id.localeCompare(b.id) : a.at < b.at ? -1 : 1));
15
+ }
16
+ const isAuth = (e) => e instanceof ChatError && (e.code === "unauthorized" || e.code === "origin_not_allowed");
17
+ /**
18
+ * Everything <ClientChat> needs: the thread, the live stream (reconnecting with backoff and catching
19
+ * up on what it missed), and the outbox, which sends messages in order, uploads files first, retries
20
+ * network failures by itself and keeps refusals for the client to retry or delete.
21
+ */
22
+ export function useClientChat(client, outbox, opts = {}) {
23
+ const [status, setStatus] = useState("loading");
24
+ const [error, setError] = useState(null);
25
+ const [me, setMe] = useState(null);
26
+ const [messages, setMessages] = useState([]);
27
+ const [items, setItems] = useState([]);
28
+ const [hasMore, setHasMore] = useState(false);
29
+ const [nextBefore, setNextBefore] = useState(null);
30
+ const [loadingOlder, setLoadingOlder] = useState(false);
31
+ const [channel, setChannel] = useState("webchat");
32
+ const [readOnly, setReadOnly] = useState(false);
33
+ const [coachReadAt, setCoachReadAt] = useState(null);
34
+ const [clientReadAt, setClientReadAt] = useState(null);
35
+ const [online, setOnline] = useState(() => (typeof navigator === "undefined" ? true : navigator.onLine !== false));
36
+ const [live, setLive] = useState(true);
37
+ const [epoch, setEpoch] = useState(0);
38
+ const onAuthError = useRef(opts.onAuthError);
39
+ onAuthError.current = opts.onAuthError;
40
+ const itemsRef = useRef(items);
41
+ itemsRef.current = items;
42
+ const messagesRef = useRef(messages);
43
+ messagesRef.current = messages;
44
+ const meRef = useRef(me);
45
+ meRef.current = me;
46
+ const onlineRef = useRef(online);
47
+ onlineRef.current = online;
48
+ const pumping = useRef(false);
49
+ const retryTimer = useRef(null);
50
+ const retryStep = useRef(0);
51
+ const uploads = useRef(new Map());
52
+ const previews = useRef(new Map());
53
+ const readTimer = useRef(null);
54
+ const readSent = useRef(null);
55
+ const alive = useRef(true);
56
+ const fail = useCallback((e) => {
57
+ if (!isAuth(e))
58
+ return false;
59
+ setError(e);
60
+ setStatus("error");
61
+ onAuthError.current?.(e);
62
+ return true;
63
+ }, []);
64
+ const preview = useCallback((f) => {
65
+ let url = previews.current.get(f.id);
66
+ if (!url && typeof URL !== "undefined" && typeof URL.createObjectURL === "function") {
67
+ url = URL.createObjectURL(f.blob);
68
+ previews.current.set(f.id, url);
69
+ }
70
+ return url ?? "";
71
+ }, []);
72
+ const dropPreviews = useCallback((item) => {
73
+ for (const f of item.files) {
74
+ const url = previews.current.get(f.id);
75
+ if (url && typeof URL.revokeObjectURL === "function")
76
+ URL.revokeObjectURL(url);
77
+ previews.current.delete(f.id);
78
+ }
79
+ }, []);
80
+ const patch = useCallback((id, change) => {
81
+ setItems((prev) => prev.map((i) => (i.clientMessageId === id ? { ...i, ...change } : i)));
82
+ itemsRef.current = itemsRef.current.map((i) => (i.clientMessageId === id ? { ...i, ...change } : i));
83
+ }, []);
84
+ const forget = useCallback((id) => {
85
+ const item = itemsRef.current.find((i) => i.clientMessageId === id);
86
+ if (item)
87
+ dropPreviews(item);
88
+ setItems((prev) => prev.filter((i) => i.clientMessageId !== id));
89
+ itemsRef.current = itemsRef.current.filter((i) => i.clientMessageId !== id);
90
+ void outbox.remove(id).catch(() => { });
91
+ }, [outbox, dropPreviews]);
92
+ // ── Sending: one message at a time, oldest first ─────────────────────────
93
+ const pump = useCallback(async () => {
94
+ if (pumping.current)
95
+ return;
96
+ pumping.current = true;
97
+ try {
98
+ for (;;) {
99
+ if (!alive.current || !onlineRef.current)
100
+ return;
101
+ const next = itemsRef.current.find((i) => i.state === "queued");
102
+ if (!next)
103
+ return;
104
+ const id = next.clientMessageId;
105
+ let item = next;
106
+ try {
107
+ while (item.files.length) {
108
+ const [file, ...rest] = item.files;
109
+ const ctrl = new AbortController();
110
+ uploads.current.set(id, ctrl);
111
+ patch(id, { state: "uploading", progress: 0 });
112
+ const att = await client.upload(file.blob, { filename: file.name, signal: ctrl.signal, onProgress: (p) => patch(id, { progress: p }) });
113
+ uploads.current.delete(id);
114
+ item = { ...item, attachments: [...item.attachments, att], files: rest };
115
+ patch(id, { attachments: item.attachments, files: rest, progress: null });
116
+ await outbox.put(item).catch(() => { });
117
+ }
118
+ patch(id, { state: "sending", progress: null });
119
+ const res = await client.send({ clientMessageId: id, ...(item.text ? { text: item.text } : {}), ...(item.attachments.length ? { attachments: item.attachments } : {}) });
120
+ if (res.message)
121
+ setMessages((prev) => mergeMessages(prev, [res.message]));
122
+ forget(id);
123
+ retryStep.current = 0;
124
+ }
125
+ catch (e) {
126
+ uploads.current.delete(id);
127
+ if (e?.name === "AbortError") {
128
+ forget(id);
129
+ continue;
130
+ }
131
+ if (fail(e))
132
+ return;
133
+ const err = e instanceof ChatError ? e : new ChatError(0, "network", "Network error");
134
+ if (err.code === "chat_moved") {
135
+ setReadOnly(true);
136
+ const c = typeof err.details.channel === "string" ? err.details.channel : "sms";
137
+ setChannel(c);
138
+ patch(id, { state: "moved", progress: null });
139
+ for (const other of itemsRef.current)
140
+ if (other.state === "queued")
141
+ patch(other.clientMessageId, { state: "moved" });
142
+ return;
143
+ }
144
+ if (err.retryable) {
145
+ patch(id, { state: "queued", progress: null });
146
+ const wait = err.code === "rate_limited" ? 60_000 : BACKOFF_MS[Math.min(retryStep.current++, BACKOFF_MS.length - 1)];
147
+ if (retryTimer.current)
148
+ clearTimeout(retryTimer.current);
149
+ retryTimer.current = setTimeout(() => { void pump(); }, wait);
150
+ return;
151
+ }
152
+ const failed = { code: err.code, message: err.message };
153
+ patch(id, { state: "failed", progress: null, failed });
154
+ await outbox.put({ ...item, failed }).catch(() => { });
155
+ }
156
+ }
157
+ }
158
+ finally {
159
+ pumping.current = false;
160
+ }
161
+ }, [client, outbox, patch, forget, fail]);
162
+ const send = useCallback((text, files = []) => {
163
+ const body = text.trim();
164
+ if (!body && !files.length)
165
+ return;
166
+ const me = meRef.current;
167
+ if (!me)
168
+ return;
169
+ const item = {
170
+ clientMessageId: newClientMessageId(),
171
+ clientId: me.clientId,
172
+ text: body,
173
+ attachments: [],
174
+ files: files.map((f, n) => ({ id: `${Date.now().toString(36)}_${n}_${Math.random().toString(36).slice(2, 8)}`, blob: f, name: f.name || "file" })),
175
+ createdAt: new Date().toISOString(),
176
+ };
177
+ const row = { ...item, state: "queued", progress: null };
178
+ setItems((prev) => [...prev, row]);
179
+ itemsRef.current = [...itemsRef.current, row];
180
+ void outbox.put(item).catch(() => { }).finally(() => { void pump(); });
181
+ }, [outbox, pump]);
182
+ const retry = useCallback((id) => {
183
+ const item = itemsRef.current.find((i) => i.clientMessageId === id);
184
+ if (!item || (item.state !== "failed" && item.state !== "moved"))
185
+ return;
186
+ const { failed: _drop, ...rest } = item;
187
+ setItems((prev) => prev.map((i) => (i.clientMessageId === id ? { ...rest, state: "queued", progress: null } : i)));
188
+ itemsRef.current = itemsRef.current.map((i) => (i.clientMessageId === id ? { ...rest, state: "queued", progress: null } : i));
189
+ retryStep.current = 0;
190
+ void pump();
191
+ }, [pump]);
192
+ const remove = useCallback((id) => {
193
+ uploads.current.get(id)?.abort();
194
+ forget(id);
195
+ }, [forget]);
196
+ // ── Loading ───────────────────────────────────────────────────────────────
197
+ useEffect(() => {
198
+ alive.current = true;
199
+ let cancelled = false;
200
+ setStatus("loading");
201
+ setError(null);
202
+ (async () => {
203
+ try {
204
+ const [who, page] = await Promise.all([client.me(), client.thread()]);
205
+ if (cancelled)
206
+ return;
207
+ const saved = await outbox.list(who.clientId).catch(() => []);
208
+ if (cancelled)
209
+ return;
210
+ setMe(who);
211
+ setMessages(page.messages);
212
+ setHasMore(page.hasMore);
213
+ setNextBefore(page.nextBefore);
214
+ setChannel(page.channel || who.channel);
215
+ setReadOnly(page.readOnly);
216
+ setCoachReadAt(page.coachReadAt);
217
+ setClientReadAt(page.clientReadAt);
218
+ readSent.current = page.clientReadAt;
219
+ const rows = saved.map((i) => ({ ...i, state: (i.failed ? "failed" : page.readOnly ? "moved" : "queued"), progress: null }));
220
+ setItems(rows);
221
+ itemsRef.current = rows;
222
+ setStatus("ready");
223
+ void pump();
224
+ }
225
+ catch (e) {
226
+ if (cancelled)
227
+ return;
228
+ const err = e instanceof ChatError ? e : new ChatError(0, "unknown", "Could not load the chat");
229
+ setError(err);
230
+ setStatus("error");
231
+ if (isAuth(err))
232
+ onAuthError.current?.(err);
233
+ }
234
+ })();
235
+ return () => { cancelled = true; };
236
+ }, [client, outbox, epoch, pump]);
237
+ // ── Live stream with reconnect + catch-up ─────────────────────────────────
238
+ useEffect(() => {
239
+ if (status !== "ready")
240
+ return;
241
+ const ctrl = new AbortController();
242
+ let step = 0;
243
+ const catchUp = async () => {
244
+ for (let n = 0; n < 5; n++) {
245
+ const newest = messagesRef.current.at(-1)?.at ?? null;
246
+ const page = newest ? await client.thread({ after: newest }) : await client.thread();
247
+ setMessages((prev) => mergeMessages(prev, page.messages));
248
+ setChannel(page.channel);
249
+ setReadOnly(page.readOnly);
250
+ setCoachReadAt((p) => (page.coachReadAt && (!p || page.coachReadAt > p) ? page.coachReadAt : p));
251
+ if (!newest || !page.hasMore)
252
+ return;
253
+ }
254
+ };
255
+ (async () => {
256
+ while (!ctrl.signal.aborted) {
257
+ try {
258
+ await client.stream((e) => {
259
+ if (e.type === "connected") {
260
+ setLive(true);
261
+ step = 0;
262
+ // Anything that arrived between the first load (or the drop) and now.
263
+ void catchUp().catch(() => { });
264
+ void pump();
265
+ }
266
+ else if (e.type === "message") {
267
+ setMessages((prev) => mergeMessages(prev, [e.data]));
268
+ }
269
+ else if (e.type === "read") {
270
+ if (e.data.side === "coach")
271
+ setCoachReadAt((p) => (!p || e.data.at > p ? e.data.at : p));
272
+ else
273
+ setClientReadAt((p) => (!p || e.data.at > p ? e.data.at : p));
274
+ }
275
+ else if (e.type === "channel") {
276
+ setChannel(e.data.channel);
277
+ setReadOnly(e.data.readOnly);
278
+ if (!e.data.readOnly)
279
+ for (const i of itemsRef.current)
280
+ if (i.state === "moved")
281
+ patch(i.clientMessageId, { state: "queued" });
282
+ if (!e.data.readOnly)
283
+ void pump();
284
+ }
285
+ }, { signal: ctrl.signal });
286
+ }
287
+ catch (e) {
288
+ if (fail(e))
289
+ return;
290
+ }
291
+ if (ctrl.signal.aborted)
292
+ return;
293
+ setLive(false);
294
+ await new Promise((r) => setTimeout(r, BACKOFF_MS[Math.min(step++, BACKOFF_MS.length - 1)]));
295
+ }
296
+ })();
297
+ return () => ctrl.abort();
298
+ }, [status, client, pump, patch, fail]);
299
+ // ── Online / offline ──────────────────────────────────────────────────────
300
+ useEffect(() => {
301
+ if (typeof window === "undefined")
302
+ return;
303
+ const up = () => { setOnline(true); onlineRef.current = true; retryStep.current = 0; void pump(); };
304
+ const down = () => { setOnline(false); onlineRef.current = false; };
305
+ window.addEventListener("online", up);
306
+ window.addEventListener("offline", down);
307
+ return () => { window.removeEventListener("online", up); window.removeEventListener("offline", down); };
308
+ }, [pump]);
309
+ useEffect(() => () => {
310
+ alive.current = false;
311
+ if (retryTimer.current)
312
+ clearTimeout(retryTimer.current);
313
+ if (readTimer.current)
314
+ clearTimeout(readTimer.current);
315
+ for (const c of uploads.current.values())
316
+ c.abort();
317
+ for (const url of previews.current.values())
318
+ if (typeof URL.revokeObjectURL === "function")
319
+ URL.revokeObjectURL(url);
320
+ }, []);
321
+ const loadOlder = useCallback(() => {
322
+ if (!hasMore || loadingOlder || !nextBefore)
323
+ return;
324
+ setLoadingOlder(true);
325
+ client.thread({ before: nextBefore }).then((page) => {
326
+ setMessages((prev) => mergeMessages(prev, page.messages));
327
+ setHasMore(page.hasMore);
328
+ setNextBefore(page.nextBefore);
329
+ }).catch((e) => { fail(e); }).finally(() => setLoadingOlder(false));
330
+ }, [client, hasMore, loadingOlder, nextBefore, fail]);
331
+ const markRead = useCallback((at) => {
332
+ if (readSent.current && at <= readSent.current)
333
+ return;
334
+ setClientReadAt((p) => (!p || at > p ? at : p));
335
+ readSent.current = at;
336
+ if (readTimer.current)
337
+ clearTimeout(readTimer.current);
338
+ readTimer.current = setTimeout(() => {
339
+ client.markRead(readSent.current ?? at).catch((e) => { fail(e); });
340
+ }, READ_DEBOUNCE_MS);
341
+ }, [client, fail]);
342
+ const reload = useCallback(() => setEpoch((n) => n + 1), []);
343
+ const pending = useMemo(() => items.map((i) => ({
344
+ clientMessageId: i.clientMessageId,
345
+ text: i.text,
346
+ createdAt: i.createdAt,
347
+ state: i.state,
348
+ progress: i.progress,
349
+ media: [
350
+ ...i.attachments.map((a, n) => ({ id: `${i.clientMessageId}_a${n}`, type: a.type, url: a.url, name: a.filename ?? "" })),
351
+ ...i.files.map((f) => ({ id: f.id, type: typeOf(f.blob.type || ""), url: preview(f), name: f.name })),
352
+ ],
353
+ ...(i.failed ? { failed: i.failed } : {}),
354
+ })), [items, preview]);
355
+ const unread = useMemo(() => messages.filter((m) => unreadForClient(m, clientReadAt)).length, [messages, clientReadAt]);
356
+ return {
357
+ status, error, me, messages, pending, hasMore, loadingOlder, channel, readOnly, coachReadAt, clientReadAt, online, live, unread,
358
+ send, retry, remove, loadOlder, markRead, reload,
359
+ };
360
+ }
361
+ //# sourceMappingURL=useClientChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClientChat.js","sourceRoot":"","sources":["../src/useClientChat.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,7 @@ export declare function useStickToBottom<T extends HTMLElement>(firstKey: string
8
8
  ref: import("react").RefObject<T | null>;
9
9
  onScroll: () => void;
10
10
  onLoadCapture: () => void;
11
+ isPinned: () => boolean;
12
+ scrollToBottom: () => void;
11
13
  };
12
14
  //# sourceMappingURL=useStickToBottom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStickToBottom.d.ts","sourceRoot":"","sources":["../src/useStickToBottom.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;;;;EAqDnF"}
1
+ {"version":3,"file":"useStickToBottom.d.ts","sourceRoot":"","sources":["../src/useStickToBottom.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;;;;;;EA0DnF"}
@@ -66,6 +66,10 @@ export function useStickToBottom(firstKey) {
66
66
  lastTop.current = el.scrollTop;
67
67
  fromBottom.current = el.scrollHeight - el.scrollTop;
68
68
  }, []);
69
- return { ref, onScroll, onLoadCapture: pin };
69
+ /** Whether the reader is at the newest message. */
70
+ const isPinned = useCallback(() => pinned.current, []);
71
+ /** Jump to the newest message and follow new ones again. */
72
+ const scrollToBottom = useCallback(() => { pinned.current = true; pin(); }, [pin]);
73
+ return { ref, onScroll, onLoadCapture: pin, isPinned, scrollToBottom };
70
74
  }
71
75
  //# sourceMappingURL=useStickToBottom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStickToBottom.js","sourceRoot":"","sources":["../src/useStickToBottom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useStickToBottom.js","sourceRoot":"","sources":["../src/useStickToBottom.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { DraftSet, Message, UpliftError } from "@uplifted/sdk";
1
+ import type { DraftSet, Message, ThreadChat, UpliftError } from "@uplifted/sdk";
2
2
  import type { LoadStatus } from "./useClients.js";
3
3
  export interface ThreadState {
4
4
  status: LoadStatus;
@@ -15,6 +15,8 @@ export interface ThreadState {
15
15
  /** Reply drafts Uplift prepared when the client last wrote (shown without a request). */
16
16
  replyDrafts: DraftSet | null;
17
17
  unreadCount: number;
18
+ /** Web chat clients: reachability ("Notifications on") and how far they have read. Null otherwise. */
19
+ chat: ThreadChat | null;
18
20
  setReplyDrafts: (d: DraftSet | null) => void;
19
21
  /** Refetch the first page quietly and merge anything new (polling). */
20
22
  refresh: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useThread.d.ts","sourceRoot":"","sources":["../src/useThread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,oBAAoB;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,mFAAmF;IACnF,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,+DAA+D;IAC/D,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,yFAAyF;IACzF,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,uEAAuE;IACvE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oDAAoD;IACpD,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CACxD;AAID,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAqE9D"}
1
+ {"version":3,"file":"useThread.d.ts","sourceRoot":"","sources":["../src/useThread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,oBAAoB;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,mFAAmF;IACnF,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,+DAA+D;IAC/D,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,yFAAyF;IACzF,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,sGAAsG;IACtG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,uEAAuE;IACvE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oDAAoD;IACpD,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CACxD;AAID,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAwE9D"}
package/dist/useThread.js CHANGED
@@ -14,6 +14,7 @@ export function useThread(clientId) {
14
14
  const [tick, setTick] = useState(0);
15
15
  const [replyDrafts, setReplyDrafts] = useState(null);
16
16
  const [unreadCount, setUnreadCount] = useState(0);
17
+ const [chat, setChat] = useState(null);
17
18
  const olderInFlight = useRef(false);
18
19
  useEffect(() => {
19
20
  setMessages([]);
@@ -35,6 +36,7 @@ export function useThread(clientId) {
35
36
  setNextBefore(page.nextBefore);
36
37
  setReplyDrafts(page.replyDrafts ?? null);
37
38
  setUnreadCount(page.unreadCount ?? 0);
39
+ setChat(page.chat ?? null);
38
40
  setStatus("ready");
39
41
  }, (err) => { if (live) {
40
42
  setError(asUpliftError(err));
@@ -69,8 +71,9 @@ export function useThread(clientId) {
69
71
  });
70
72
  setReplyDrafts(page.replyDrafts ?? null);
71
73
  setUnreadCount(page.unreadCount ?? 0);
74
+ setChat(page.chat ?? null);
72
75
  }, () => { });
73
76
  }, [client, clientId]);
74
- return { status, messages, error, hasMore, loadingOlder, loadOlder, append, reload, replyDrafts, unreadCount, setReplyDrafts, refresh, patch };
77
+ return { status, messages, error, hasMore, loadingOlder, loadOlder, append, reload, replyDrafts, unreadCount, chat, setReplyDrafts, refresh, patch };
75
78
  }
76
79
  //# sourceMappingURL=useThread.js.map