@uplifted/react 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +24 -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/icons.d.ts +1 -0
  49. package/dist/icons.d.ts.map +1 -1
  50. package/dist/icons.js +1 -0
  51. package/dist/icons.js.map +1 -1
  52. package/dist/index.d.ts +4 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +4 -0
  55. package/dist/index.js.map +1 -1
  56. package/dist/labels.js +1 -1
  57. package/dist/labels.js.map +1 -1
  58. package/dist/styles.d.ts +1 -1
  59. package/dist/styles.d.ts.map +1 -1
  60. package/dist/styles.js +96 -0
  61. package/dist/styles.js.map +1 -1
  62. package/dist/useChatUnread.d.ts +8 -0
  63. package/dist/useChatUnread.d.ts.map +1 -0
  64. package/dist/useChatUnread.js +63 -0
  65. package/dist/useChatUnread.js.map +1 -0
  66. package/dist/useClientChat.d.ts +57 -0
  67. package/dist/useClientChat.d.ts.map +1 -0
  68. package/dist/useClientChat.js +360 -0
  69. package/dist/useClientChat.js.map +1 -0
  70. package/dist/useStickToBottom.d.ts +2 -0
  71. package/dist/useStickToBottom.d.ts.map +1 -1
  72. package/dist/useStickToBottom.js +5 -1
  73. package/dist/useStickToBottom.js.map +1 -1
  74. package/dist/useThread.d.ts +3 -1
  75. package/dist/useThread.d.ts.map +1 -1
  76. package/dist/useThread.js +4 -1
  77. package/dist/useThread.js.map +1 -1
  78. package/package.json +3 -3
@@ -0,0 +1,63 @@
1
+ import { useEffect, useState } from "react";
2
+ const BACKOFF_MS = [2000, 5000, 15000, 30000];
3
+ /**
4
+ * How many coach messages the client has not read, kept live, for a tab badge or the app icon
5
+ * (`navigator.setAppBadge`) while <ClientChat> is not on screen. Pass null to stop. Counts the
6
+ * newest page of the thread (up to 50), which is plenty for a badge.
7
+ */
8
+ export function useChatUnread(client) {
9
+ const [count, setCount] = useState(0);
10
+ useEffect(() => {
11
+ if (!client) {
12
+ setCount(0);
13
+ return;
14
+ }
15
+ const ctrl = new AbortController();
16
+ let readAt = null;
17
+ const coach = new Map();
18
+ const recount = () => {
19
+ let n = 0;
20
+ for (const at of coach.values())
21
+ if (!readAt || at > readAt)
22
+ n++;
23
+ setCount(n);
24
+ };
25
+ const take = (m) => { if (m.from === "coach")
26
+ coach.set(m.id, m.at); };
27
+ (async () => {
28
+ let step = 0;
29
+ while (!ctrl.signal.aborted) {
30
+ try {
31
+ const page = await client.thread();
32
+ readAt = page.clientReadAt;
33
+ page.messages.forEach(take);
34
+ recount();
35
+ await client.stream((e) => {
36
+ if (e.type === "connected")
37
+ step = 0;
38
+ else if (e.type === "message") {
39
+ take(e.data);
40
+ recount();
41
+ }
42
+ else if (e.type === "read" && e.data.side === "client") {
43
+ if (!readAt || e.data.at > readAt)
44
+ readAt = e.data.at;
45
+ recount();
46
+ }
47
+ }, { signal: ctrl.signal });
48
+ }
49
+ catch (e) {
50
+ const code = e?.code;
51
+ if (code === "unauthorized" || code === "origin_not_allowed")
52
+ return;
53
+ }
54
+ if (ctrl.signal.aborted)
55
+ return;
56
+ await new Promise((r) => setTimeout(r, BACKOFF_MS[Math.min(step++, BACKOFF_MS.length - 1)]));
57
+ }
58
+ })();
59
+ return () => ctrl.abort();
60
+ }, [client]);
61
+ return count;
62
+ }
63
+ //# sourceMappingURL=useChatUnread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatUnread.js","sourceRoot":"","sources":["../src/useChatUnread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAyB;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE;gBAAE,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM;oBAAE,CAAC,EAAE,CAAC;YACjE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACd,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,CAAc,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;oBAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC5B,OAAO,EAAE,CAAC;oBACV,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;wBACxB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;4BAAE,IAAI,GAAG,CAAC,CAAC;6BAChC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;4BAAC,OAAO,EAAE,CAAC;wBAAC,CAAC;6BACtD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM;gCAAE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;4BAAC,OAAO,EAAE,CAAC;wBAAC,CAAC;oBAC/H,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9B,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,IAAI,GAAI,CAAuB,EAAE,IAAI,CAAC;oBAC5C,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,oBAAoB;wBAAE,OAAO;gBACvE,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAChC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -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":"AACA,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,360 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { ChatError, newClientMessageId, } from "@uplifted/sdk";
3
+ const BACKOFF_MS = [1000, 2000, 5000, 10000, 30000];
4
+ const READ_DEBOUNCE_MS = 800;
5
+ const typeOf = (mime) => mime.startsWith("image/") ? "image" : mime.startsWith("video/") ? "video" : mime.startsWith("audio/") ? "audio" : "document";
6
+ function mergeMessages(prev, incoming) {
7
+ if (!incoming.length)
8
+ return prev;
9
+ const byId = new Map(prev.map((m) => [m.id, m]));
10
+ for (const m of incoming)
11
+ if (m && m.id)
12
+ byId.set(m.id, m);
13
+ return [...byId.values()].sort((a, b) => (a.at === b.at ? a.id.localeCompare(b.id) : a.at < b.at ? -1 : 1));
14
+ }
15
+ const isAuth = (e) => e instanceof ChatError && (e.code === "unauthorized" || e.code === "origin_not_allowed");
16
+ /**
17
+ * Everything <ClientChat> needs: the thread, the live stream (reconnecting with backoff and catching
18
+ * up on what it missed), and the outbox, which sends messages in order, uploads files first, retries
19
+ * network failures by itself and keeps refusals for the client to retry or delete.
20
+ */
21
+ export function useClientChat(client, outbox, opts = {}) {
22
+ const [status, setStatus] = useState("loading");
23
+ const [error, setError] = useState(null);
24
+ const [me, setMe] = useState(null);
25
+ const [messages, setMessages] = useState([]);
26
+ const [items, setItems] = useState([]);
27
+ const [hasMore, setHasMore] = useState(false);
28
+ const [nextBefore, setNextBefore] = useState(null);
29
+ const [loadingOlder, setLoadingOlder] = useState(false);
30
+ const [channel, setChannel] = useState("webchat");
31
+ const [readOnly, setReadOnly] = useState(false);
32
+ const [coachReadAt, setCoachReadAt] = useState(null);
33
+ const [clientReadAt, setClientReadAt] = useState(null);
34
+ const [online, setOnline] = useState(() => (typeof navigator === "undefined" ? true : navigator.onLine !== false));
35
+ const [live, setLive] = useState(true);
36
+ const [epoch, setEpoch] = useState(0);
37
+ const onAuthError = useRef(opts.onAuthError);
38
+ onAuthError.current = opts.onAuthError;
39
+ const itemsRef = useRef(items);
40
+ itemsRef.current = items;
41
+ const messagesRef = useRef(messages);
42
+ messagesRef.current = messages;
43
+ const meRef = useRef(me);
44
+ meRef.current = me;
45
+ const onlineRef = useRef(online);
46
+ onlineRef.current = online;
47
+ const pumping = useRef(false);
48
+ const retryTimer = useRef(null);
49
+ const retryStep = useRef(0);
50
+ const uploads = useRef(new Map());
51
+ const previews = useRef(new Map());
52
+ const readTimer = useRef(null);
53
+ const readSent = useRef(null);
54
+ const alive = useRef(true);
55
+ const fail = useCallback((e) => {
56
+ if (!isAuth(e))
57
+ return false;
58
+ setError(e);
59
+ setStatus("error");
60
+ onAuthError.current?.(e);
61
+ return true;
62
+ }, []);
63
+ const preview = useCallback((f) => {
64
+ let url = previews.current.get(f.id);
65
+ if (!url && typeof URL !== "undefined" && typeof URL.createObjectURL === "function") {
66
+ url = URL.createObjectURL(f.blob);
67
+ previews.current.set(f.id, url);
68
+ }
69
+ return url ?? "";
70
+ }, []);
71
+ const dropPreviews = useCallback((item) => {
72
+ for (const f of item.files) {
73
+ const url = previews.current.get(f.id);
74
+ if (url && typeof URL.revokeObjectURL === "function")
75
+ URL.revokeObjectURL(url);
76
+ previews.current.delete(f.id);
77
+ }
78
+ }, []);
79
+ const patch = useCallback((id, change) => {
80
+ setItems((prev) => prev.map((i) => (i.clientMessageId === id ? { ...i, ...change } : i)));
81
+ itemsRef.current = itemsRef.current.map((i) => (i.clientMessageId === id ? { ...i, ...change } : i));
82
+ }, []);
83
+ const forget = useCallback((id) => {
84
+ const item = itemsRef.current.find((i) => i.clientMessageId === id);
85
+ if (item)
86
+ dropPreviews(item);
87
+ setItems((prev) => prev.filter((i) => i.clientMessageId !== id));
88
+ itemsRef.current = itemsRef.current.filter((i) => i.clientMessageId !== id);
89
+ void outbox.remove(id).catch(() => { });
90
+ }, [outbox, dropPreviews]);
91
+ // ── Sending: one message at a time, oldest first ─────────────────────────
92
+ const pump = useCallback(async () => {
93
+ if (pumping.current)
94
+ return;
95
+ pumping.current = true;
96
+ try {
97
+ for (;;) {
98
+ if (!alive.current || !onlineRef.current)
99
+ return;
100
+ const next = itemsRef.current.find((i) => i.state === "queued");
101
+ if (!next)
102
+ return;
103
+ const id = next.clientMessageId;
104
+ let item = next;
105
+ try {
106
+ while (item.files.length) {
107
+ const [file, ...rest] = item.files;
108
+ const ctrl = new AbortController();
109
+ uploads.current.set(id, ctrl);
110
+ patch(id, { state: "uploading", progress: 0 });
111
+ const att = await client.upload(file.blob, { filename: file.name, signal: ctrl.signal, onProgress: (p) => patch(id, { progress: p }) });
112
+ uploads.current.delete(id);
113
+ item = { ...item, attachments: [...item.attachments, att], files: rest };
114
+ patch(id, { attachments: item.attachments, files: rest, progress: null });
115
+ await outbox.put(item).catch(() => { });
116
+ }
117
+ patch(id, { state: "sending", progress: null });
118
+ const res = await client.send({ clientMessageId: id, ...(item.text ? { text: item.text } : {}), ...(item.attachments.length ? { attachments: item.attachments } : {}) });
119
+ if (res.message)
120
+ setMessages((prev) => mergeMessages(prev, [res.message]));
121
+ forget(id);
122
+ retryStep.current = 0;
123
+ }
124
+ catch (e) {
125
+ uploads.current.delete(id);
126
+ if (e?.name === "AbortError") {
127
+ forget(id);
128
+ continue;
129
+ }
130
+ if (fail(e))
131
+ return;
132
+ const err = e instanceof ChatError ? e : new ChatError(0, "network", "Network error");
133
+ if (err.code === "chat_moved") {
134
+ setReadOnly(true);
135
+ const c = typeof err.details.channel === "string" ? err.details.channel : "sms";
136
+ setChannel(c);
137
+ patch(id, { state: "moved", progress: null });
138
+ for (const other of itemsRef.current)
139
+ if (other.state === "queued")
140
+ patch(other.clientMessageId, { state: "moved" });
141
+ return;
142
+ }
143
+ if (err.retryable) {
144
+ patch(id, { state: "queued", progress: null });
145
+ const wait = err.code === "rate_limited" ? 60_000 : BACKOFF_MS[Math.min(retryStep.current++, BACKOFF_MS.length - 1)];
146
+ if (retryTimer.current)
147
+ clearTimeout(retryTimer.current);
148
+ retryTimer.current = setTimeout(() => { void pump(); }, wait);
149
+ return;
150
+ }
151
+ const failed = { code: err.code, message: err.message };
152
+ patch(id, { state: "failed", progress: null, failed });
153
+ await outbox.put({ ...item, failed }).catch(() => { });
154
+ }
155
+ }
156
+ }
157
+ finally {
158
+ pumping.current = false;
159
+ }
160
+ }, [client, outbox, patch, forget, fail]);
161
+ const send = useCallback((text, files = []) => {
162
+ const body = text.trim();
163
+ if (!body && !files.length)
164
+ return;
165
+ const me = meRef.current;
166
+ if (!me)
167
+ return;
168
+ const item = {
169
+ clientMessageId: newClientMessageId(),
170
+ clientId: me.clientId,
171
+ text: body,
172
+ attachments: [],
173
+ files: files.map((f, n) => ({ id: `${Date.now().toString(36)}_${n}_${Math.random().toString(36).slice(2, 8)}`, blob: f, name: f.name || "file" })),
174
+ createdAt: new Date().toISOString(),
175
+ };
176
+ const row = { ...item, state: "queued", progress: null };
177
+ setItems((prev) => [...prev, row]);
178
+ itemsRef.current = [...itemsRef.current, row];
179
+ void outbox.put(item).catch(() => { }).finally(() => { void pump(); });
180
+ }, [outbox, pump]);
181
+ const retry = useCallback((id) => {
182
+ const item = itemsRef.current.find((i) => i.clientMessageId === id);
183
+ if (!item || (item.state !== "failed" && item.state !== "moved"))
184
+ return;
185
+ const { failed: _drop, ...rest } = item;
186
+ setItems((prev) => prev.map((i) => (i.clientMessageId === id ? { ...rest, state: "queued", progress: null } : i)));
187
+ itemsRef.current = itemsRef.current.map((i) => (i.clientMessageId === id ? { ...rest, state: "queued", progress: null } : i));
188
+ retryStep.current = 0;
189
+ void pump();
190
+ }, [pump]);
191
+ const remove = useCallback((id) => {
192
+ uploads.current.get(id)?.abort();
193
+ forget(id);
194
+ }, [forget]);
195
+ // ── Loading ───────────────────────────────────────────────────────────────
196
+ useEffect(() => {
197
+ alive.current = true;
198
+ let cancelled = false;
199
+ setStatus("loading");
200
+ setError(null);
201
+ (async () => {
202
+ try {
203
+ const [who, page] = await Promise.all([client.me(), client.thread()]);
204
+ if (cancelled)
205
+ return;
206
+ const saved = await outbox.list(who.clientId).catch(() => []);
207
+ if (cancelled)
208
+ return;
209
+ setMe(who);
210
+ setMessages(page.messages);
211
+ setHasMore(page.hasMore);
212
+ setNextBefore(page.nextBefore);
213
+ setChannel(page.channel || who.channel);
214
+ setReadOnly(page.readOnly);
215
+ setCoachReadAt(page.coachReadAt);
216
+ setClientReadAt(page.clientReadAt);
217
+ readSent.current = page.clientReadAt;
218
+ const rows = saved.map((i) => ({ ...i, state: (i.failed ? "failed" : page.readOnly ? "moved" : "queued"), progress: null }));
219
+ setItems(rows);
220
+ itemsRef.current = rows;
221
+ setStatus("ready");
222
+ void pump();
223
+ }
224
+ catch (e) {
225
+ if (cancelled)
226
+ return;
227
+ const err = e instanceof ChatError ? e : new ChatError(0, "unknown", "Could not load the chat");
228
+ setError(err);
229
+ setStatus("error");
230
+ if (isAuth(err))
231
+ onAuthError.current?.(err);
232
+ }
233
+ })();
234
+ return () => { cancelled = true; };
235
+ }, [client, outbox, epoch, pump]);
236
+ // ── Live stream with reconnect + catch-up ─────────────────────────────────
237
+ useEffect(() => {
238
+ if (status !== "ready")
239
+ return;
240
+ const ctrl = new AbortController();
241
+ let step = 0;
242
+ const catchUp = async () => {
243
+ for (let n = 0; n < 5; n++) {
244
+ const newest = messagesRef.current.at(-1)?.at ?? null;
245
+ const page = newest ? await client.thread({ after: newest }) : await client.thread();
246
+ setMessages((prev) => mergeMessages(prev, page.messages));
247
+ setChannel(page.channel);
248
+ setReadOnly(page.readOnly);
249
+ setCoachReadAt((p) => (page.coachReadAt && (!p || page.coachReadAt > p) ? page.coachReadAt : p));
250
+ if (!newest || !page.hasMore)
251
+ return;
252
+ }
253
+ };
254
+ (async () => {
255
+ while (!ctrl.signal.aborted) {
256
+ try {
257
+ await client.stream((e) => {
258
+ if (e.type === "connected") {
259
+ setLive(true);
260
+ step = 0;
261
+ // Anything that arrived between the first load (or the drop) and now.
262
+ void catchUp().catch(() => { });
263
+ void pump();
264
+ }
265
+ else if (e.type === "message") {
266
+ setMessages((prev) => mergeMessages(prev, [e.data]));
267
+ }
268
+ else if (e.type === "read") {
269
+ if (e.data.side === "coach")
270
+ setCoachReadAt((p) => (!p || e.data.at > p ? e.data.at : p));
271
+ else
272
+ setClientReadAt((p) => (!p || e.data.at > p ? e.data.at : p));
273
+ }
274
+ else if (e.type === "channel") {
275
+ setChannel(e.data.channel);
276
+ setReadOnly(e.data.readOnly);
277
+ if (!e.data.readOnly)
278
+ for (const i of itemsRef.current)
279
+ if (i.state === "moved")
280
+ patch(i.clientMessageId, { state: "queued" });
281
+ if (!e.data.readOnly)
282
+ void pump();
283
+ }
284
+ }, { signal: ctrl.signal });
285
+ }
286
+ catch (e) {
287
+ if (fail(e))
288
+ return;
289
+ }
290
+ if (ctrl.signal.aborted)
291
+ return;
292
+ setLive(false);
293
+ await new Promise((r) => setTimeout(r, BACKOFF_MS[Math.min(step++, BACKOFF_MS.length - 1)]));
294
+ }
295
+ })();
296
+ return () => ctrl.abort();
297
+ }, [status, client, pump, patch, fail]);
298
+ // ── Online / offline ──────────────────────────────────────────────────────
299
+ useEffect(() => {
300
+ if (typeof window === "undefined")
301
+ return;
302
+ const up = () => { setOnline(true); onlineRef.current = true; retryStep.current = 0; void pump(); };
303
+ const down = () => { setOnline(false); onlineRef.current = false; };
304
+ window.addEventListener("online", up);
305
+ window.addEventListener("offline", down);
306
+ return () => { window.removeEventListener("online", up); window.removeEventListener("offline", down); };
307
+ }, [pump]);
308
+ useEffect(() => () => {
309
+ alive.current = false;
310
+ if (retryTimer.current)
311
+ clearTimeout(retryTimer.current);
312
+ if (readTimer.current)
313
+ clearTimeout(readTimer.current);
314
+ for (const c of uploads.current.values())
315
+ c.abort();
316
+ for (const url of previews.current.values())
317
+ if (typeof URL.revokeObjectURL === "function")
318
+ URL.revokeObjectURL(url);
319
+ }, []);
320
+ const loadOlder = useCallback(() => {
321
+ if (!hasMore || loadingOlder || !nextBefore)
322
+ return;
323
+ setLoadingOlder(true);
324
+ client.thread({ before: nextBefore }).then((page) => {
325
+ setMessages((prev) => mergeMessages(prev, page.messages));
326
+ setHasMore(page.hasMore);
327
+ setNextBefore(page.nextBefore);
328
+ }).catch((e) => { fail(e); }).finally(() => setLoadingOlder(false));
329
+ }, [client, hasMore, loadingOlder, nextBefore, fail]);
330
+ const markRead = useCallback((at) => {
331
+ if (readSent.current && at <= readSent.current)
332
+ return;
333
+ setClientReadAt((p) => (!p || at > p ? at : p));
334
+ readSent.current = at;
335
+ if (readTimer.current)
336
+ clearTimeout(readTimer.current);
337
+ readTimer.current = setTimeout(() => {
338
+ client.markRead(readSent.current ?? at).catch((e) => { fail(e); });
339
+ }, READ_DEBOUNCE_MS);
340
+ }, [client, fail]);
341
+ const reload = useCallback(() => setEpoch((n) => n + 1), []);
342
+ const pending = useMemo(() => items.map((i) => ({
343
+ clientMessageId: i.clientMessageId,
344
+ text: i.text,
345
+ createdAt: i.createdAt,
346
+ state: i.state,
347
+ progress: i.progress,
348
+ media: [
349
+ ...i.attachments.map((a, n) => ({ id: `${i.clientMessageId}_a${n}`, type: a.type, url: a.url, name: a.filename ?? "" })),
350
+ ...i.files.map((f) => ({ id: f.id, type: typeOf(f.blob.type || ""), url: preview(f), name: f.name })),
351
+ ],
352
+ ...(i.failed ? { failed: i.failed } : {}),
353
+ })), [items, preview]);
354
+ const unread = useMemo(() => messages.filter((m) => m.from === "coach" && (!clientReadAt || m.at > clientReadAt)).length, [messages, clientReadAt]);
355
+ return {
356
+ status, error, me, messages, pending, hasMore, loadingOlder, channel, readOnly, coachReadAt, clientReadAt, online, live, unread,
357
+ send, retry, remove, loadOlder, markRead, reload,
358
+ };
359
+ }
360
+ //# 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