@uplifted/react 0.24.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.
- package/CHANGELOG.md +43 -0
- package/dist/AddClientSheet.d.ts +4 -4
- package/dist/AddClientSheet.d.ts.map +1 -1
- package/dist/AddClientSheet.js.map +1 -1
- package/dist/BulkGenerateSheet.d.ts +13 -5
- package/dist/BulkGenerateSheet.d.ts.map +1 -1
- package/dist/BulkGenerateSheet.js +25 -11
- package/dist/BulkGenerateSheet.js.map +1 -1
- package/dist/ChannelBadge.d.ts +5 -1
- package/dist/ChannelBadge.d.ts.map +1 -1
- package/dist/ChannelBadge.js +8 -4
- package/dist/ChannelBadge.js.map +1 -1
- package/dist/ChannelControl.d.ts +24 -0
- package/dist/ChannelControl.d.ts.map +1 -0
- package/dist/ChannelControl.js +96 -0
- package/dist/ChannelControl.js.map +1 -0
- package/dist/ChannelExplainer.d.ts +1 -1
- package/dist/ChannelExplainer.d.ts.map +1 -1
- package/dist/ClientChat.d.ts +37 -0
- package/dist/ClientChat.d.ts.map +1 -0
- package/dist/ClientChat.js +365 -0
- package/dist/ClientChat.js.map +1 -0
- package/dist/ClientList.js +3 -3
- package/dist/ClientList.js.map +1 -1
- package/dist/Composer.d.ts +4 -2
- package/dist/Composer.d.ts.map +1 -1
- package/dist/Composer.js +10 -11
- package/dist/Composer.js.map +1 -1
- package/dist/ConnectClientSheet.d.ts +5 -3
- package/dist/ConnectClientSheet.d.ts.map +1 -1
- package/dist/ConnectClientSheet.js +2 -2
- package/dist/ConnectClientSheet.js.map +1 -1
- package/dist/ConversationPane.d.ts +5 -1
- package/dist/ConversationPane.d.ts.map +1 -1
- package/dist/ConversationPane.js +5 -3
- package/dist/ConversationPane.js.map +1 -1
- package/dist/HostPreviewPane.d.ts.map +1 -1
- package/dist/HostPreviewPane.js +2 -1
- package/dist/HostPreviewPane.js.map +1 -1
- package/dist/SegmentEditor.d.ts +1 -1
- package/dist/SegmentEditor.d.ts.map +1 -1
- package/dist/SegmentEditor.js +4 -3
- package/dist/SegmentEditor.js.map +1 -1
- package/dist/ThreadFeed.d.ts.map +1 -1
- package/dist/ThreadFeed.js +3 -2
- package/dist/ThreadFeed.js.map +1 -1
- package/dist/UpliftPanel.d.ts +7 -1
- package/dist/UpliftPanel.d.ts.map +1 -1
- package/dist/UpliftPanel.js +43 -8
- package/dist/UpliftPanel.js.map +1 -1
- package/dist/build-info.json +3 -3
- package/dist/channels.d.ts +1 -1
- package/dist/channels.d.ts.map +1 -1
- package/dist/chatStrings.d.ts +56 -0
- package/dist/chatStrings.d.ts.map +1 -0
- package/dist/chatStrings.js +50 -0
- package/dist/chatStrings.js.map +1 -0
- package/dist/icons.d.ts +2 -0
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +2 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/labels.js +1 -1
- package/dist/labels.js.map +1 -1
- package/dist/styles.d.ts +1 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +108 -16
- package/dist/styles.js.map +1 -1
- package/dist/useChatUnread.d.ts +8 -0
- package/dist/useChatUnread.d.ts.map +1 -0
- package/dist/useChatUnread.js +63 -0
- package/dist/useChatUnread.js.map +1 -0
- package/dist/useClientChat.d.ts +57 -0
- package/dist/useClientChat.d.ts.map +1 -0
- package/dist/useClientChat.js +360 -0
- package/dist/useClientChat.js.map +1 -0
- package/dist/useStickToBottom.d.ts +2 -0
- package/dist/useStickToBottom.d.ts.map +1 -1
- package/dist/useStickToBottom.js +5 -1
- package/dist/useStickToBottom.js.map +1 -1
- package/dist/useThread.d.ts +3 -1
- package/dist/useThread.d.ts.map +1 -1
- package/dist/useThread.js +4 -1
- package/dist/useThread.js.map +1 -1
- package/package.json +3 -3
- package/dist/ComposerExtras.d.ts +0 -15
- package/dist/ComposerExtras.d.ts.map +0 -1
- package/dist/ComposerExtras.js +0 -14
- package/dist/ComposerExtras.js.map +0 -1
|
@@ -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
|
|
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"}
|
package/dist/useStickToBottom.js
CHANGED
|
@@ -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
|
-
|
|
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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"}
|
package/dist/useThread.d.ts
CHANGED
|
@@ -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;
|
package/dist/useThread.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/useThread.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useThread.js","sourceRoot":"","sources":["../src/useThread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"useThread.js","sourceRoot":"","sources":["../src/useThread.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uplifted/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Uplift messaging screens as host-agnostic React components and hooks.",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
],
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@uplifted/sdk": "^0.
|
|
22
|
+
"@uplifted/sdk": "^0.12.0",
|
|
23
23
|
"react": "^18.3.0 || ^19.0.0",
|
|
24
24
|
"react-dom": "^18.3.0 || ^19.0.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@uplifted/sdk": "0.
|
|
27
|
+
"@uplifted/sdk": "0.12.0"
|
|
28
28
|
},
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "restricted"
|
package/dist/ComposerExtras.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|