@repzo/widget-react-native 1.3.1 → 1.5.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 +173 -5
- package/README.md +99 -13
- package/lib/commonjs/api/client.js +125 -28
- package/lib/commonjs/api/client.js.map +1 -1
- package/lib/commonjs/attachments/file-size.js +52 -0
- package/lib/commonjs/attachments/file-size.js.map +1 -0
- package/lib/commonjs/attachments/local-previews.js +40 -0
- package/lib/commonjs/attachments/local-previews.js.map +1 -0
- package/lib/commonjs/attachments/pickers.js +20 -29
- package/lib/commonjs/attachments/pickers.js.map +1 -1
- package/lib/commonjs/i18n.js +22 -3
- package/lib/commonjs/i18n.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/locales.js +12 -3
- package/lib/commonjs/locales.js.map +1 -1
- package/lib/commonjs/state/user-update-queue.js +168 -0
- package/lib/commonjs/state/user-update-queue.js.map +1 -0
- package/lib/commonjs/state/widget-store.js +303 -33
- package/lib/commonjs/state/widget-store.js.map +1 -1
- package/lib/commonjs/storage.js +3 -1
- package/lib/commonjs/storage.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/ui/WidgetProvider.js +33 -13
- package/lib/commonjs/ui/WidgetProvider.js.map +1 -1
- package/lib/commonjs/ui/components/AttachmentChips.js +109 -40
- package/lib/commonjs/ui/components/AttachmentChips.js.map +1 -1
- package/lib/commonjs/ui/components/ConversationRow.js +65 -10
- package/lib/commonjs/ui/components/ConversationRow.js.map +1 -1
- package/lib/commonjs/ui/components/ImageViewer.js +229 -24
- package/lib/commonjs/ui/components/ImageViewer.js.map +1 -1
- package/lib/commonjs/ui/components/RatingCard.js +5 -2
- package/lib/commonjs/ui/components/RatingCard.js.map +1 -1
- package/lib/commonjs/ui/components/ZoomableImage.js +58 -10
- package/lib/commonjs/ui/components/ZoomableImage.js.map +1 -1
- package/lib/commonjs/ui/hooks/use-retained-state.js +39 -0
- package/lib/commonjs/ui/hooks/use-retained-state.js.map +1 -0
- package/lib/commonjs/ui/screens/chat/ChatView.js +651 -165
- package/lib/commonjs/ui/screens/chat/ChatView.js.map +1 -1
- package/lib/commonjs/ui/screens/chat/ChatView.styles.js +138 -1
- package/lib/commonjs/ui/screens/chat/ChatView.styles.js.map +1 -1
- package/lib/commonjs/ui/screens/conversations/ConversationsList.js +1 -0
- package/lib/commonjs/ui/screens/conversations/ConversationsList.js.map +1 -1
- package/lib/commonjs/ui/screens/home/HomeView.js +38 -55
- package/lib/commonjs/ui/screens/home/HomeView.js.map +1 -1
- package/lib/commonjs/ui/screens/home/HomeView.styles.js +36 -45
- package/lib/commonjs/ui/screens/home/HomeView.styles.js.map +1 -1
- package/lib/commonjs/ui/utils/html.js +13 -0
- package/lib/commonjs/ui/utils/html.js.map +1 -1
- package/lib/commonjs/ui/utils/image-load-queue.js +114 -0
- package/lib/commonjs/ui/utils/image-load-queue.js.map +1 -0
- package/lib/commonjs/ui/utils/inline-attachments.js +88 -0
- package/lib/commonjs/ui/utils/inline-attachments.js.map +1 -0
- package/lib/module/api/client.js +123 -27
- package/lib/module/api/client.js.map +1 -1
- package/lib/module/attachments/file-size.js +47 -0
- package/lib/module/attachments/file-size.js.map +1 -0
- package/lib/module/attachments/local-previews.js +33 -0
- package/lib/module/attachments/local-previews.js.map +1 -0
- package/lib/module/attachments/pickers.js +15 -25
- package/lib/module/attachments/pickers.js.map +1 -1
- package/lib/module/i18n.js +22 -3
- package/lib/module/i18n.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/locales.js +12 -3
- package/lib/module/locales.js.map +1 -1
- package/lib/module/state/user-update-queue.js +163 -0
- package/lib/module/state/user-update-queue.js.map +1 -0
- package/lib/module/state/widget-store.js +305 -35
- package/lib/module/state/widget-store.js.map +1 -1
- package/lib/module/storage.js +2 -0
- package/lib/module/storage.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/ui/WidgetProvider.js +33 -13
- package/lib/module/ui/WidgetProvider.js.map +1 -1
- package/lib/module/ui/components/AttachmentChips.js +111 -42
- package/lib/module/ui/components/AttachmentChips.js.map +1 -1
- package/lib/module/ui/components/ConversationRow.js +65 -10
- package/lib/module/ui/components/ConversationRow.js.map +1 -1
- package/lib/module/ui/components/ImageViewer.js +231 -26
- package/lib/module/ui/components/ImageViewer.js.map +1 -1
- package/lib/module/ui/components/RatingCard.js +5 -2
- package/lib/module/ui/components/RatingCard.js.map +1 -1
- package/lib/module/ui/components/ZoomableImage.js +58 -10
- package/lib/module/ui/components/ZoomableImage.js.map +1 -1
- package/lib/module/ui/hooks/use-retained-state.js +34 -0
- package/lib/module/ui/hooks/use-retained-state.js.map +1 -0
- package/lib/module/ui/screens/chat/ChatView.js +655 -169
- package/lib/module/ui/screens/chat/ChatView.js.map +1 -1
- package/lib/module/ui/screens/chat/ChatView.styles.js +140 -2
- package/lib/module/ui/screens/chat/ChatView.styles.js.map +1 -1
- package/lib/module/ui/screens/conversations/ConversationsList.js +1 -0
- package/lib/module/ui/screens/conversations/ConversationsList.js.map +1 -1
- package/lib/module/ui/screens/home/HomeView.js +40 -57
- package/lib/module/ui/screens/home/HomeView.js.map +1 -1
- package/lib/module/ui/screens/home/HomeView.styles.js +36 -45
- package/lib/module/ui/screens/home/HomeView.styles.js.map +1 -1
- package/lib/module/ui/utils/html.js +12 -0
- package/lib/module/ui/utils/html.js.map +1 -1
- package/lib/module/ui/utils/image-load-queue.js +109 -0
- package/lib/module/ui/utils/image-load-queue.js.map +1 -0
- package/lib/module/ui/utils/inline-attachments.js +85 -0
- package/lib/module/ui/utils/inline-attachments.js.map +1 -0
- package/lib/typescript/commonjs/api/client.d.ts +20 -6
- package/lib/typescript/commonjs/api/client.d.ts.map +1 -1
- package/lib/typescript/commonjs/attachments/file-size.d.ts +15 -0
- package/lib/typescript/commonjs/attachments/file-size.d.ts.map +1 -0
- package/lib/typescript/commonjs/attachments/local-previews.d.ts +14 -0
- package/lib/typescript/commonjs/attachments/local-previews.d.ts.map +1 -0
- package/lib/typescript/commonjs/attachments/pickers.d.ts +15 -2
- package/lib/typescript/commonjs/attachments/pickers.d.ts.map +1 -1
- package/lib/typescript/commonjs/i18n.d.ts +12 -3
- package/lib/typescript/commonjs/i18n.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +5 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/locales.d.ts.map +1 -1
- package/lib/typescript/commonjs/state/user-update-queue.d.ts +62 -0
- package/lib/typescript/commonjs/state/user-update-queue.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/widget-store.d.ts +44 -1
- package/lib/typescript/commonjs/state/widget-store.d.ts.map +1 -1
- package/lib/typescript/commonjs/storage.d.ts +2 -0
- package/lib/typescript/commonjs/storage.d.ts.map +1 -1
- package/lib/typescript/commonjs/types.d.ts +53 -0
- package/lib/typescript/commonjs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/WidgetProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/AttachmentChips.d.ts +13 -3
- package/lib/typescript/commonjs/ui/components/AttachmentChips.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ConversationRow.d.ts +15 -1
- package/lib/typescript/commonjs/ui/components/ConversationRow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts +26 -6
- package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/RatingCard.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts +10 -1
- package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/use-retained-state.d.ts +11 -0
- package/lib/typescript/commonjs/ui/hooks/use-retained-state.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts +4 -4
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts +144 -0
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts +26 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/conversations/ConversationsList.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/conversations/ConversationsList.types.d.ts +2 -0
- package/lib/typescript/commonjs/ui/screens/conversations/ConversationsList.types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/home/HomeView.d.ts +7 -5
- package/lib/typescript/commonjs/ui/screens/home/HomeView.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/home/HomeView.styles.d.ts +30 -35
- package/lib/typescript/commonjs/ui/screens/home/HomeView.styles.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/home/HomeView.types.d.ts +5 -6
- package/lib/typescript/commonjs/ui/screens/home/HomeView.types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/html.d.ts +5 -0
- package/lib/typescript/commonjs/ui/utils/html.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/image-load-queue.d.ts +44 -0
- package/lib/typescript/commonjs/ui/utils/image-load-queue.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/inline-attachments.d.ts +29 -0
- package/lib/typescript/commonjs/ui/utils/inline-attachments.d.ts.map +1 -0
- package/lib/typescript/module/api/client.d.ts +20 -6
- package/lib/typescript/module/api/client.d.ts.map +1 -1
- package/lib/typescript/module/attachments/file-size.d.ts +15 -0
- package/lib/typescript/module/attachments/file-size.d.ts.map +1 -0
- package/lib/typescript/module/attachments/local-previews.d.ts +14 -0
- package/lib/typescript/module/attachments/local-previews.d.ts.map +1 -0
- package/lib/typescript/module/attachments/pickers.d.ts +15 -2
- package/lib/typescript/module/attachments/pickers.d.ts.map +1 -1
- package/lib/typescript/module/i18n.d.ts +12 -3
- package/lib/typescript/module/i18n.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +5 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/locales.d.ts.map +1 -1
- package/lib/typescript/module/state/user-update-queue.d.ts +62 -0
- package/lib/typescript/module/state/user-update-queue.d.ts.map +1 -0
- package/lib/typescript/module/state/widget-store.d.ts +44 -1
- package/lib/typescript/module/state/widget-store.d.ts.map +1 -1
- package/lib/typescript/module/storage.d.ts +2 -0
- package/lib/typescript/module/storage.d.ts.map +1 -1
- package/lib/typescript/module/types.d.ts +53 -0
- package/lib/typescript/module/types.d.ts.map +1 -1
- package/lib/typescript/module/ui/WidgetProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/AttachmentChips.d.ts +13 -3
- package/lib/typescript/module/ui/components/AttachmentChips.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ConversationRow.d.ts +15 -1
- package/lib/typescript/module/ui/components/ConversationRow.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ImageViewer.d.ts +26 -6
- package/lib/typescript/module/ui/components/ImageViewer.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/RatingCard.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ZoomableImage.d.ts +10 -1
- package/lib/typescript/module/ui/components/ZoomableImage.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/use-retained-state.d.ts +11 -0
- package/lib/typescript/module/ui/hooks/use-retained-state.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/chat/ChatView.d.ts +4 -4
- package/lib/typescript/module/ui/screens/chat/ChatView.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts +144 -0
- package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts +26 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/conversations/ConversationsList.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/conversations/ConversationsList.types.d.ts +2 -0
- package/lib/typescript/module/ui/screens/conversations/ConversationsList.types.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/home/HomeView.d.ts +7 -5
- package/lib/typescript/module/ui/screens/home/HomeView.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/home/HomeView.styles.d.ts +30 -35
- package/lib/typescript/module/ui/screens/home/HomeView.styles.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/home/HomeView.types.d.ts +5 -6
- package/lib/typescript/module/ui/screens/home/HomeView.types.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/html.d.ts +5 -0
- package/lib/typescript/module/ui/utils/html.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/image-load-queue.d.ts +44 -0
- package/lib/typescript/module/ui/utils/image-load-queue.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/inline-attachments.d.ts +29 -0
- package/lib/typescript/module/ui/utils/inline-attachments.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/api/client.ts +149 -38
- package/src/attachments/file-size.ts +42 -0
- package/src/attachments/local-previews.ts +32 -0
- package/src/attachments/pickers.ts +23 -25
- package/src/i18n.ts +22 -3
- package/src/index.tsx +5 -0
- package/src/locales.ts +12 -3
- package/src/state/user-update-queue.ts +178 -0
- package/src/state/widget-store.ts +346 -51
- package/src/storage.ts +2 -0
- package/src/types.ts +53 -0
- package/src/ui/WidgetProvider.tsx +35 -8
- package/src/ui/components/AttachmentChips.tsx +100 -29
- package/src/ui/components/ConversationRow.tsx +90 -9
- package/src/ui/components/ImageViewer.tsx +242 -24
- package/src/ui/components/RatingCard.tsx +5 -2
- package/src/ui/components/ZoomableImage.tsx +58 -5
- package/src/ui/hooks/use-retained-state.ts +35 -0
- package/src/ui/screens/chat/ChatView.styles.ts +139 -1
- package/src/ui/screens/chat/ChatView.tsx +735 -198
- package/src/ui/screens/chat/ChatView.types.ts +26 -1
- package/src/ui/screens/conversations/ConversationsList.tsx +1 -0
- package/src/ui/screens/conversations/ConversationsList.types.ts +2 -0
- package/src/ui/screens/home/HomeView.styles.ts +36 -45
- package/src/ui/screens/home/HomeView.tsx +54 -70
- package/src/ui/screens/home/HomeView.types.ts +5 -6
- package/src/ui/utils/html.ts +26 -0
- package/src/ui/utils/image-load-queue.ts +108 -0
- package/src/ui/utils/inline-attachments.ts +71 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.splitInlineAttachments = splitInlineAttachments;
|
|
7
|
+
var _html = require("./html.js");
|
|
8
|
+
/**
|
|
9
|
+
* Agent replies with images between their paragraphs. Workstation marks such
|
|
10
|
+
* images `inline` among the message's attachments and keeps an `<img>` for
|
|
11
|
+
* each in the HTML body, where the teammate put it. Same split as the web
|
|
12
|
+
* Messenger, so both show the text and images in the order they were written.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** Markdown for the bubble to draw, or one attachment. */
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The body and its inline images in order, plus the other attachments
|
|
19
|
+
* (`files`) that show after them. Null when nothing is inline: the bubble then
|
|
20
|
+
* shows the body, followed by every attachment.
|
|
21
|
+
*
|
|
22
|
+
* An `<img>` finds its attachment by the id in its URL. In a body whose
|
|
23
|
+
* images carry no ids, they take the attachments in order instead; in one
|
|
24
|
+
* that does, an image without an id (a logo, an emoji) isn't one of the files
|
|
25
|
+
* and takes nothing. One whose id names no remaining attachment (the same file
|
|
26
|
+
* twice) takes nothing either. Inline attachments with no `<img>` go at the end.
|
|
27
|
+
*/
|
|
28
|
+
function splitInlineAttachments(body, attachments) {
|
|
29
|
+
const inline = (attachments ?? []).filter(isInline);
|
|
30
|
+
if (!body || inline.length === 0) return null;
|
|
31
|
+
const remaining = [...inline];
|
|
32
|
+
const parts = [];
|
|
33
|
+
const pushText = html => {
|
|
34
|
+
const text = (0, _html.htmlToMarkdown)(html);
|
|
35
|
+
if (text) parts.push({
|
|
36
|
+
text
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
const image = /<img\b[^>]*?\bsrc=(["'])(.*?)\1[^>]*>/gi;
|
|
40
|
+
const images = [];
|
|
41
|
+
for (let match = image.exec(body); match; match = image.exec(body)) {
|
|
42
|
+
images.push({
|
|
43
|
+
start: match.index,
|
|
44
|
+
end: image.lastIndex,
|
|
45
|
+
id: mediaId(match[2] ?? '')
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const byId = images.some(found => found.id !== null);
|
|
49
|
+
let last = 0;
|
|
50
|
+
for (const {
|
|
51
|
+
start,
|
|
52
|
+
end,
|
|
53
|
+
id
|
|
54
|
+
} of images) {
|
|
55
|
+
// Left in the text, which drops it as it always has.
|
|
56
|
+
if (byId && !id) continue;
|
|
57
|
+
pushText(body.slice(last, start));
|
|
58
|
+
last = end;
|
|
59
|
+
const index = id ? remaining.findIndex(attachment => attachment.id === id) : 0;
|
|
60
|
+
if (index < 0) continue;
|
|
61
|
+
const [attachment] = remaining.splice(index, 1);
|
|
62
|
+
if (attachment) parts.push({
|
|
63
|
+
attachment
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
pushText(body.slice(last));
|
|
67
|
+
remaining.forEach(attachment => parts.push({
|
|
68
|
+
attachment
|
|
69
|
+
}));
|
|
70
|
+
return {
|
|
71
|
+
parts,
|
|
72
|
+
files: (attachments ?? []).filter(attachment => !isInline(attachment))
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Workstation's media URLs carry the attachment's id, as
|
|
78
|
+
* `/api/widget/media/<id>?…` (what replies carry) or `/api/media/<id>/download`.
|
|
79
|
+
*/
|
|
80
|
+
function mediaId(src) {
|
|
81
|
+
return /\/api\/(?:widget\/)?media\/([^/?#"'&]+)/.exec(src)?.[1] ?? null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Only Workstation's agent replies set `inline`, so it isn't on `WidgetAttachment`. */
|
|
85
|
+
function isInline(attachment) {
|
|
86
|
+
return attachment.inline === true;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=inline-attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_html","require","splitInlineAttachments","body","attachments","inline","filter","isInline","length","remaining","parts","pushText","html","text","htmlToMarkdown","push","image","images","match","exec","start","index","end","lastIndex","id","mediaId","byId","some","found","last","slice","findIndex","attachment","splice","forEach","files","src"],"sourceRoot":"../../../../src","sources":["ui/utils/inline-attachments.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/api/client.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* The token itself lives in `SecureStorage`.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import { measureFileSize } from "../attachments/file-size.js";
|
|
13
14
|
import { SecureStorage, TOKEN_KEY } from "../storage.js";
|
|
14
15
|
import { isHttpUrl, urlScheme } from "../ui/utils/safe-url.js";
|
|
15
16
|
|
|
@@ -19,24 +20,90 @@ export function isTerminalErrorCode(code) {
|
|
|
19
20
|
return !!code && TERMINAL_CODES.has(code);
|
|
20
21
|
}
|
|
21
22
|
export class RepzoWidgetError extends Error {
|
|
22
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Seconds Workstation asked to wait before trying again, on a 429
|
|
25
|
+
* (`Retry-After`). Undefined when it didn't say.
|
|
26
|
+
* @since 1.5.0
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
constructor(message, status, code = 'http', retryAfter) {
|
|
23
30
|
super(message);
|
|
24
31
|
this.name = 'RepzoWidgetError';
|
|
25
32
|
this.status = status;
|
|
26
33
|
this.code = code;
|
|
34
|
+
if (retryAfter !== undefined) this.retryAfter = retryAfter;
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
/** Builds the error for a non-2xx `{ message, code }` body. */
|
|
30
|
-
static fromResponse(status, body) {
|
|
38
|
+
static fromResponse(status, body, retryAfterHeader) {
|
|
31
39
|
const payload = body && typeof body === 'object' ? body : {};
|
|
32
40
|
const message = typeof payload.message === 'string' && payload.message ? payload.message : null;
|
|
33
41
|
const code = status === 403 && typeof payload.code === 'string' && isTerminalErrorCode(payload.code) ? payload.code : 'http';
|
|
34
|
-
|
|
42
|
+
const retryAfter = status === 429 ? parseRetryAfter(retryAfterHeader, payload.retryAfter) : undefined;
|
|
43
|
+
return new RepzoWidgetError(message || `HTTP ${status}`, status, code, retryAfter);
|
|
35
44
|
}
|
|
36
45
|
}
|
|
37
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Seconds from a `Retry-After` header (seconds or an HTTP date), falling back
|
|
49
|
+
* to the `retryAfter` seconds Workstation also puts in the 429 body.
|
|
50
|
+
*/
|
|
51
|
+
function parseRetryAfter(header, bodyValue) {
|
|
52
|
+
const value = header?.trim();
|
|
53
|
+
if (value) {
|
|
54
|
+
if (/^\d+(\.\d+)?$/.test(value)) return Number(value);
|
|
55
|
+
const at = Date.parse(value);
|
|
56
|
+
if (Number.isFinite(at)) return Math.max(0, (at - Date.now()) / 1000);
|
|
57
|
+
}
|
|
58
|
+
if (typeof bodyValue === 'number' && Number.isFinite(bodyValue) && bodyValue >= 0) return bodyValue;
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
38
62
|
/** A Send message part asked for on its own, which may share one request with others. */
|
|
39
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Sends a local file as the request body straight from disk and resolves the
|
|
66
|
+
* HTTP status. React Native streams a `{ uri }` body natively; `fetch` would
|
|
67
|
+
* stringify it, so this goes through XMLHttpRequest.
|
|
68
|
+
*/
|
|
69
|
+
function sendFileFromDisk(url, method, headers, file, signal) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
const xhr = new XMLHttpRequest();
|
|
72
|
+
const cancel = () => xhr.abort();
|
|
73
|
+
const settle = finish => {
|
|
74
|
+
signal?.removeEventListener('abort', cancel);
|
|
75
|
+
finish();
|
|
76
|
+
};
|
|
77
|
+
xhr.onload = () => settle(() => resolve(xhr.status));
|
|
78
|
+
xhr.onerror = () => settle(() => reject(new RepzoWidgetError('Network request failed', 0, 'network')));
|
|
79
|
+
xhr.ontimeout = xhr.onerror;
|
|
80
|
+
xhr.onabort = () => settle(() => reject(new RepzoWidgetError('Upload cancelled', 0, 'network')));
|
|
81
|
+
xhr.open(method, url);
|
|
82
|
+
Object.entries(headers).forEach(([name, value]) => xhr.setRequestHeader(name, value));
|
|
83
|
+
// Android refuses a `{ uri }` body without one.
|
|
84
|
+
if (!Object.keys(headers).some(name => name.toLowerCase() === 'content-type')) {
|
|
85
|
+
xhr.setRequestHeader('Content-Type', file.contentType);
|
|
86
|
+
}
|
|
87
|
+
signal?.addEventListener('abort', cancel);
|
|
88
|
+
xhr.send({
|
|
89
|
+
uri: file.uri
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* How long Workstation keeps an upload for a message to name, when its answer
|
|
96
|
+
* has no usable `expiresAt` (deployments without it, or a phone clock that
|
|
97
|
+
* reads it as already past).
|
|
98
|
+
*/
|
|
99
|
+
const UPLOAD_LIFETIME_MS = 60 * 60 * 1000;
|
|
100
|
+
|
|
101
|
+
/** A file in storage, waiting for the message that names it. */
|
|
102
|
+
|
|
103
|
+
function uploadExpiry(expiresAt, now) {
|
|
104
|
+
const at = typeof expiresAt === 'string' ? Date.parse(expiresAt) : typeof expiresAt === 'number' ? expiresAt : NaN;
|
|
105
|
+
return at > now ? at : now + UPLOAD_LIFETIME_MS;
|
|
106
|
+
}
|
|
40
107
|
export class WidgetApiClient {
|
|
41
108
|
baseUrl = '';
|
|
42
109
|
channelAccountId = '';
|
|
@@ -124,7 +191,7 @@ export class WidgetApiClient {
|
|
|
124
191
|
}
|
|
125
192
|
if (!response.ok) {
|
|
126
193
|
const body = await response.json().catch(() => null);
|
|
127
|
-
const error = RepzoWidgetError.fromResponse(response.status, body);
|
|
194
|
+
const error = RepzoWidgetError.fromResponse(response.status, body, response.headers?.get?.('Retry-After'));
|
|
128
195
|
// skipReauth calls (init, logout-time) are handled by their caller,
|
|
129
196
|
// which knows whether the result is still current.
|
|
130
197
|
if (isTerminalErrorCode(error.code) && !options.skipReauth) this.onTerminalError?.(error);
|
|
@@ -278,41 +345,70 @@ export class WidgetApiClient {
|
|
|
278
345
|
/**
|
|
279
346
|
* Puts a local file in storage ahead of the message, which then names it by
|
|
280
347
|
* the returned upload token. The target is presigned storage, or a path on
|
|
281
|
-
* the server where its storage can't presign. The
|
|
282
|
-
*
|
|
283
|
-
*
|
|
348
|
+
* the server where its storage can't presign. The upload URL is signed for
|
|
349
|
+
* exactly the size asked for: a `file://` file whose size `expo-file-system`
|
|
350
|
+
* can read streams from disk, anything else is read as a native blob and
|
|
351
|
+
* measured. `signal` cancels the transfer (the visitor removed the file, or
|
|
352
|
+
* left the conversation). Resolves the token and when it expires.
|
|
284
353
|
*/
|
|
285
|
-
async uploadAttachment(file) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
|
|
354
|
+
async uploadAttachment(file, signal) {
|
|
355
|
+
// A file removed early is never read, nor given a slot in storage.
|
|
356
|
+
const stopIfCancelled = () => {
|
|
357
|
+
if (signal?.aborted) throw new RepzoWidgetError('Upload cancelled', 0, 'network');
|
|
358
|
+
};
|
|
359
|
+
stopIfCancelled();
|
|
360
|
+
// Streaming matters on Android: React Native also copies a blob it reads
|
|
361
|
+
// into a Base64 string for its network inspector, so a file past ~30 MB
|
|
362
|
+
// runs the app out of memory. Only file:// gives an exact Content-Length.
|
|
363
|
+
const streamedSize = urlScheme(file.uri) === 'file:' ? await measureFileSize(file.uri) : null;
|
|
364
|
+
let blob = null;
|
|
365
|
+
if (streamedSize === null) {
|
|
366
|
+
try {
|
|
367
|
+
blob = await (await fetch(file.uri, {
|
|
368
|
+
signal
|
|
369
|
+
})).blob();
|
|
370
|
+
} catch (error) {
|
|
371
|
+
throw new RepzoWidgetError(error instanceof Error ? error.message : 'Could not read the file', 0, 'network');
|
|
372
|
+
}
|
|
291
373
|
}
|
|
374
|
+
stopIfCancelled();
|
|
292
375
|
const target = await this.request('/api/widget/uploads', {
|
|
293
376
|
method: 'POST',
|
|
294
377
|
body: {
|
|
295
378
|
fileName: file.name,
|
|
296
379
|
contentType: file.contentType,
|
|
297
|
-
size: blob
|
|
380
|
+
size: streamedSize ?? (blob?.size || file.size)
|
|
298
381
|
}
|
|
299
382
|
});
|
|
383
|
+
// Counted from when the token was issued, not from when the file is up.
|
|
384
|
+
const expiresAt = uploadExpiry(target.expiresAt, Date.now());
|
|
300
385
|
const uploadUrl = this.resolveUrl(target.uploadUrl);
|
|
301
386
|
if (!uploadUrl) throw new RepzoWidgetError('Invalid upload target', 0, 'http');
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
387
|
+
stopIfCancelled();
|
|
388
|
+
const method = target.method ?? 'PUT';
|
|
389
|
+
const headers = target.headers ?? {
|
|
390
|
+
'Content-Type': file.contentType
|
|
391
|
+
};
|
|
392
|
+
let status;
|
|
393
|
+
if (blob) {
|
|
394
|
+
try {
|
|
395
|
+
status = (await fetch(uploadUrl, {
|
|
396
|
+
method,
|
|
397
|
+
headers,
|
|
398
|
+
body: blob,
|
|
399
|
+
signal
|
|
400
|
+
})).status;
|
|
401
|
+
} catch (error) {
|
|
402
|
+
throw new RepzoWidgetError(error instanceof Error ? error.message : 'Upload failed', 0, 'network');
|
|
403
|
+
}
|
|
404
|
+
} else {
|
|
405
|
+
status = await sendFileFromDisk(uploadUrl, method, headers, file, signal);
|
|
313
406
|
}
|
|
314
|
-
if (
|
|
315
|
-
return
|
|
407
|
+
if (status < 200 || status >= 300) throw new RepzoWidgetError('Upload failed', status, 'http');
|
|
408
|
+
return {
|
|
409
|
+
uploadToken: target.uploadToken,
|
|
410
|
+
expiresAt
|
|
411
|
+
};
|
|
316
412
|
}
|
|
317
413
|
listConversations() {
|
|
318
414
|
return this.request('/api/widget/conversations');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SecureStorage","TOKEN_KEY","isHttpUrl","urlScheme","TERMINAL_CODES","Set","isTerminalErrorCode","code","has","RepzoWidgetError","Error","constructor","message","status","name","fromResponse","body","payload","WidgetApiClient","baseUrl","channelAccountId","token","tokenLoaded","reauthorize","onTerminalError","sendPartBatch","configure","replace","getBaseUrl","getChannelAccountId","getToken","getItem","setToken","setItem","clearToken","removeItem","resolveUrl","url","trimmed","trim","resolved","startsWith","request","path","options","sentToken","send","headers","authToken","undefined","Authorization","fetch","method","JSON","stringify","error","response","skipReauth","refreshed","ok","json","catch","getConfig","platform","query","encodeURIComponent","getOutboundMessage","askSendPart","getPost","part","own","Promise","resolve","reject","setTimeout","flushSendParts","push","asks","parts","Array","from","map","ask","answer","length","join","value","then","sendPostInteraction","campaignId","kind","init","params","visitorToken","resumeToken","user","email","phone","userId","user_id","userHash","user_hash","account","id","signedUpAt","signed_up_at","Date","toISOString","trackingVisitorId","sdkVersion","logout","sendMessage","data","uploadAttachment","file","blob","uri","target","fileName","contentType","size","uploadUrl","uploadToken","listConversations","listMessages","conversationId","cursor","markConversationRead","rateConversation","ratingId","identify","sendTyping","isTyping","trackEvent","registerPushToken","reportPushOpened","deliveryId","removePushToken","auth"],"sourceRoot":"../../../src","sources":["api/client.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["measureFileSize","SecureStorage","TOKEN_KEY","isHttpUrl","urlScheme","TERMINAL_CODES","Set","isTerminalErrorCode","code","has","RepzoWidgetError","Error","constructor","message","status","retryAfter","name","undefined","fromResponse","body","retryAfterHeader","payload","parseRetryAfter","header","bodyValue","value","trim","test","Number","at","Date","parse","isFinite","Math","max","now","sendFileFromDisk","url","method","headers","file","signal","Promise","resolve","reject","xhr","XMLHttpRequest","cancel","abort","settle","finish","removeEventListener","onload","onerror","ontimeout","onabort","open","Object","entries","forEach","setRequestHeader","keys","some","toLowerCase","contentType","addEventListener","send","uri","UPLOAD_LIFETIME_MS","uploadExpiry","expiresAt","NaN","WidgetApiClient","baseUrl","channelAccountId","token","tokenLoaded","reauthorize","onTerminalError","sendPartBatch","configure","replace","getBaseUrl","getChannelAccountId","getToken","getItem","setToken","setItem","clearToken","removeItem","resolveUrl","trimmed","resolved","startsWith","request","path","options","sentToken","authToken","Authorization","fetch","JSON","stringify","error","response","skipReauth","refreshed","ok","json","catch","get","getConfig","platform","query","encodeURIComponent","getOutboundMessage","askSendPart","getPost","part","own","setTimeout","flushSendParts","push","asks","parts","Array","from","map","ask","answer","length","join","then","sendPostInteraction","campaignId","kind","init","params","visitorToken","resumeToken","user","email","phone","userId","user_id","userHash","user_hash","account","id","signedUpAt","signed_up_at","toISOString","trackingVisitorId","sdkVersion","logout","sendMessage","data","uploadAttachment","stopIfCancelled","aborted","streamedSize","blob","target","fileName","size","uploadUrl","uploadToken","listConversations","listMessages","conversationId","cursor","markConversationRead","rateConversation","ratingId","identify","sendTyping","isTyping","trackEvent","registerPushToken","reportPushOpened","deliveryId","removePushToken","auth"],"sourceRoot":"../../../src","sources":["api/client.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Local file sizes from the host's `expo-file-system` (optional, like the
|
|
5
|
+
* pickers): read from the file's metadata, never from its contents. Shared by
|
|
6
|
+
* the pickers and the upload client, so the client doesn't pull in pickers.
|
|
7
|
+
*
|
|
8
|
+
* No `react-native` import on purpose: it stays testable in plain Node.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
let fileSystem = null;
|
|
12
|
+
try {
|
|
13
|
+
fileSystem = require('expo-file-system') ?? null;
|
|
14
|
+
} catch {
|
|
15
|
+
fileSystem = null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** A positive, finite byte count, or null. */
|
|
19
|
+
export function validSize(size) {
|
|
20
|
+
return typeof size === 'number' && Number.isFinite(size) && size > 0 ? size : null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A local file's exact size in bytes, from its metadata without reading it.
|
|
25
|
+
* Null without `expo-file-system`, or when it can't tell.
|
|
26
|
+
*/
|
|
27
|
+
export async function measureFileSize(uri) {
|
|
28
|
+
if (typeof fileSystem?.File === 'function') {
|
|
29
|
+
try {
|
|
30
|
+
const size = validSize(new fileSystem.File(uri).size);
|
|
31
|
+
if (size !== null) return size;
|
|
32
|
+
} catch {
|
|
33
|
+
// Fall through to the next reader.
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (typeof fileSystem?.getInfoAsync === 'function') {
|
|
37
|
+
try {
|
|
38
|
+
return validSize((await fileSystem.getInfoAsync(uri, {
|
|
39
|
+
size: true
|
|
40
|
+
}))?.size);
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=file-size.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["fileSystem","require","validSize","size","Number","isFinite","measureFileSize","uri","File","getInfoAsync"],"sourceRoot":"../../../src","sources":["attachments/file-size.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAIA,UAAe,GAAG,IAAI;AAC1B,IAAI;EACFA,UAAU,GAAGC,OAAO,CAAC,kBAAkB,CAAC,IAAI,IAAI;AAClD,CAAC,CAAC,MAAM;EACND,UAAU,GAAG,IAAI;AACnB;;AAEA;AACA,OAAO,SAASE,SAASA,CAACC,IAAa,EAAiB;EACtD,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,IAAI,CAAC,IAAIA,IAAI,GAAG,CAAC,GAAGA,IAAI,GAAG,IAAI;AACpF;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeG,eAAeA,CAACC,GAAW,EAA0B;EACzE,IAAI,OAAOP,UAAU,EAAEQ,IAAI,KAAK,UAAU,EAAE;IAC1C,IAAI;MACF,MAAML,IAAI,GAAGD,SAAS,CAAC,IAAIF,UAAU,CAACQ,IAAI,CAACD,GAAG,CAAC,CAACJ,IAAI,CAAC;MACrD,IAAIA,IAAI,KAAK,IAAI,EAAE,OAAOA,IAAI;IAChC,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EACA,IAAI,OAAOH,UAAU,EAAES,YAAY,KAAK,UAAU,EAAE;IAClD,IAAI;MACF,OAAOP,SAAS,CAAC,CAAC,MAAMF,UAAU,CAACS,YAAY,CAACF,GAAG,EAAE;QAAEJ,IAAI,EAAE;MAAK,CAAC,CAAC,GAAGA,IAAI,CAAC;IAC9E,CAAC,CAAC,MAAM;MACN,OAAO,IAAI;IACb;EACF;EACA,OAAO,IAAI;AACb","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The phone's copy of each file the visitor sent, by the URL of the stored
|
|
5
|
+
* copy that replaced it in the thread. Right after a send the stored copy
|
|
6
|
+
* may not load yet (Workstation can still be storing it), so a photo keeps
|
|
7
|
+
* showing from the phone instead of turning into a file row. Kept in memory
|
|
8
|
+
* only: a later session shows the stored copy.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const MAX_PREVIEWS = 50;
|
|
12
|
+
const previews = new Map();
|
|
13
|
+
export function rememberLocalPreview(storedUrl, localUrl) {
|
|
14
|
+
if (!storedUrl || !localUrl) return;
|
|
15
|
+
previews.delete(storedUrl);
|
|
16
|
+
previews.set(storedUrl, localUrl);
|
|
17
|
+
// Oldest first: a Map iterates in insertion order.
|
|
18
|
+
if (previews.size > MAX_PREVIEWS) previews.delete(previews.keys().next().value);
|
|
19
|
+
}
|
|
20
|
+
export function localPreviewFor(storedUrl) {
|
|
21
|
+
return storedUrl && previews.get(storedUrl) || null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** One that failed to load (the OS cleared the picker's cache): every view moves to the stored copy. */
|
|
25
|
+
export function forgetLocalPreview(storedUrl) {
|
|
26
|
+
previews.delete(storedUrl);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Signing out forgets them: the next visitor on the phone doesn't inherit the paths. */
|
|
30
|
+
export function clearLocalPreviews() {
|
|
31
|
+
previews.clear();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=local-previews.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MAX_PREVIEWS","previews","Map","rememberLocalPreview","storedUrl","localUrl","delete","set","size","keys","next","value","localPreviewFor","get","forgetLocalPreview","clearLocalPreviews","clear"],"sourceRoot":"../../../src","sources":["attachments/local-previews.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMA,YAAY,GAAG,EAAE;AACvB,MAAMC,QAAQ,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAE1C,OAAO,SAASC,oBAAoBA,CAACC,SAAiB,EAAEC,QAAgB,EAAQ;EAC9E,IAAI,CAACD,SAAS,IAAI,CAACC,QAAQ,EAAE;EAC7BJ,QAAQ,CAACK,MAAM,CAACF,SAAS,CAAC;EAC1BH,QAAQ,CAACM,GAAG,CAACH,SAAS,EAAEC,QAAQ,CAAC;EACjC;EACA,IAAIJ,QAAQ,CAACO,IAAI,GAAGR,YAAY,EAAEC,QAAQ,CAACK,MAAM,CAACL,QAAQ,CAACQ,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,KAAe,CAAC;AAC3F;AAEA,OAAO,SAASC,eAAeA,CAACR,SAAiB,EAAiB;EAChE,OAAQA,SAAS,IAAIH,QAAQ,CAACY,GAAG,CAACT,SAAS,CAAC,IAAK,IAAI;AACvD;;AAEA;AACA,OAAO,SAASU,kBAAkBA,CAACV,SAAiB,EAAQ;EAC1DH,QAAQ,CAACK,MAAM,CAACF,SAAS,CAAC;AAC5B;;AAEA;AACA,OAAO,SAASW,kBAAkBA,CAAA,EAAS;EACzCd,QAAQ,CAACe,KAAK,CAAC,CAAC;AAClB","ignoreList":[]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Visitor attachments: picking photos/files for `POST /api/widget/messages`.
|
|
5
5
|
*
|
|
6
6
|
* A server that takes uploads names its cap (`maxAttachmentBytes`): a picked
|
|
7
|
-
* file then stays a local URI
|
|
7
|
+
* file then stays a local URI, which the composer uploads right away. An
|
|
8
8
|
* older server only takes files inline, as base64 data URLs within the
|
|
9
9
|
* 1.5 MB / 6 MB caps below.
|
|
10
10
|
*
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
* testable in plain Node.
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
+
import { measureFileSize, validSize } from "./file-size.js";
|
|
29
|
+
|
|
28
30
|
/** The server keeps the first five and silently drops the rest. */
|
|
29
31
|
export const MAX_ATTACHMENTS = 5;
|
|
30
32
|
/** Per inline file, decoded. The server silently drops anything larger. */
|
|
@@ -86,6 +88,11 @@ let hostOptions = null;
|
|
|
86
88
|
export function setAttachmentOptions(options) {
|
|
87
89
|
hostOptions = options;
|
|
88
90
|
}
|
|
91
|
+
|
|
92
|
+
/** Whether a picked file starts uploading before Send (`attachments.uploadOnPick`). */
|
|
93
|
+
export function uploadsOnPick() {
|
|
94
|
+
return hostOptions?.uploadOnPick !== false;
|
|
95
|
+
}
|
|
89
96
|
const ALL_SOURCES = ['photo', 'camera', 'file'];
|
|
90
97
|
|
|
91
98
|
/**
|
|
@@ -323,7 +330,7 @@ async function toDraft(file) {
|
|
|
323
330
|
};
|
|
324
331
|
}
|
|
325
332
|
|
|
326
|
-
/** A file that's uploaded
|
|
333
|
+
/** A file that's uploaded on its own, ahead of the message: only its size is read here. */
|
|
327
334
|
async function toUploadDraft(file, uploadLimit) {
|
|
328
335
|
const uri = file.uri;
|
|
329
336
|
const size = validSize(file.size) ?? (await readFileSize(uri));
|
|
@@ -342,25 +349,9 @@ async function toUploadDraft(file, uploadLimit) {
|
|
|
342
349
|
|
|
343
350
|
/** A local file's size in bytes, or 0 when nothing can tell. */
|
|
344
351
|
async function readFileSize(uri) {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
if (size !== null) return size;
|
|
349
|
-
} catch {
|
|
350
|
-
// Fall through to the next reader.
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
if (typeof fileSystem?.getInfoAsync === 'function') {
|
|
354
|
-
try {
|
|
355
|
-
const size = validSize((await fileSystem.getInfoAsync(uri, {
|
|
356
|
-
size: true
|
|
357
|
-
}))?.size);
|
|
358
|
-
if (size !== null) return size;
|
|
359
|
-
} catch {
|
|
360
|
-
// Fall through to fetch.
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
// A native blob: its size is known without reading it into JS.
|
|
352
|
+
const size = await measureFileSize(uri);
|
|
353
|
+
if (size !== null) return size;
|
|
354
|
+
// Last resort: the native blob reads the whole file (on Android, into memory).
|
|
364
355
|
const blob = await (await fetch(uri)).blob();
|
|
365
356
|
return validSize(blob.size) ?? 0;
|
|
366
357
|
}
|
|
@@ -486,9 +477,6 @@ export function formatBytes(bytes) {
|
|
|
486
477
|
export function isImageAttachment(contentType) {
|
|
487
478
|
return !!contentType && contentType.toLowerCase().startsWith('image/');
|
|
488
479
|
}
|
|
489
|
-
function validSize(size) {
|
|
490
|
-
return typeof size === 'number' && Number.isFinite(size) && size > 0 ? size : null;
|
|
491
|
-
}
|
|
492
480
|
function fileNameFromUri(uri) {
|
|
493
481
|
if (!uri) return null;
|
|
494
482
|
const last = uri.split(/[?#]/)[0]?.split('/').pop();
|
|
@@ -522,7 +510,9 @@ const CONTENT_TYPES = {
|
|
|
522
510
|
mp4: 'video/mp4',
|
|
523
511
|
mov: 'video/quicktime'
|
|
524
512
|
};
|
|
525
|
-
|
|
513
|
+
|
|
514
|
+
/** The type a file name's extension implies, or null for one this table doesn't know. */
|
|
515
|
+
export function guessContentType(nameOrUri) {
|
|
526
516
|
const extension = /\.([a-z0-9]+)$/i.exec(nameOrUri?.split(/[?#]/)[0] ?? '')?.[1];
|
|
527
517
|
return extension ? CONTENT_TYPES[extension.toLowerCase()] ?? null : null;
|
|
528
518
|
}
|