@linktr.ee/messaging-react 1.26.0 → 1.26.1-rc-1776058603
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/dist/Preview-DqAv16NS.js +87 -0
- package/dist/Preview-DqAv16NS.js.map +1 -0
- package/dist/dash.all.min-Duv4lvGS.js +18858 -0
- package/dist/dash.all.min-Duv4lvGS.js.map +1 -0
- package/dist/hls-Bogc7CBn.js +21710 -0
- package/dist/hls-Bogc7CBn.js.map +1 -0
- package/dist/index-Da-xN4Yq.js +16142 -0
- package/dist/index-Da-xN4Yq.js.map +1 -0
- package/dist/index-Dj9rqWcU.js +69 -0
- package/dist/index-Dj9rqWcU.js.map +1 -0
- package/dist/index.d.ts +65 -9
- package/dist/index.js +1815 -1225
- package/dist/index.js.map +1 -1
- package/dist/mixin-B6jYfIcp.js +808 -0
- package/dist/mixin-B6jYfIcp.js.map +1 -0
- package/dist/react-BxlQMOfz.js +419 -0
- package/dist/react-BxlQMOfz.js.map +1 -0
- package/dist/react-COAP-MIW.js +377 -0
- package/dist/react-COAP-MIW.js.map +1 -0
- package/dist/react-Cn4WlMcl.js +3108 -0
- package/dist/react-Cn4WlMcl.js.map +1 -0
- package/dist/react-CwTJArKY.js +459 -0
- package/dist/react-CwTJArKY.js.map +1 -0
- package/dist/react-DkfS_atT.js +373 -0
- package/dist/react-DkfS_atT.js.map +1 -0
- package/dist/react-Pea5fum1.js +286 -0
- package/dist/react-Pea5fum1.js.map +1 -0
- package/dist/react-RiBbsUDd.js +534 -0
- package/dist/react-RiBbsUDd.js.map +1 -0
- package/dist/react-dS1WBxxz.js +238 -0
- package/dist/react-dS1WBxxz.js.map +1 -0
- package/package.json +2 -1
- package/src/components/ChannelView.test.tsx +50 -1
- package/src/components/ChannelView.tsx +13 -3
- package/src/components/CustomMessage/CustomMessage.stories.tsx +61 -2
- package/src/components/CustomMessage/MessageTag.tsx +5 -0
- package/src/components/CustomMessage/index.tsx +46 -4
- package/src/components/LockedAttachmentCard/LockedAttachmentCard.stories.tsx +365 -0
- package/src/components/LockedAttachmentCard/index.tsx +398 -0
- package/src/components/LockedAttachmentCard/mimeType.test.ts +97 -0
- package/src/components/LockedAttachmentCard/mimeType.ts +35 -0
- package/src/index.ts +4 -0
- package/src/stream-custom-data.ts +10 -3
- package/src/types.ts +15 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
var o = Object.defineProperty;
|
|
2
|
+
var g = (n, a, c) => a in n ? o(n, a, { enumerable: !0, configurable: !0, writable: !0, value: c }) : n[a] = c;
|
|
3
|
+
var l = (n, a, c) => g(n, typeof a != "symbol" ? a + "" : a, c);
|
|
4
|
+
function R(n) {
|
|
5
|
+
return class extends n {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
l(this, "_playedRanges", []);
|
|
9
|
+
l(this, "_currentPlayedRange", null);
|
|
10
|
+
l(this, "_RANGE_EPSILON", 0.5);
|
|
11
|
+
l(this, "_seeking", !1);
|
|
12
|
+
}
|
|
13
|
+
connectedCallback() {
|
|
14
|
+
super.connectedCallback && super.connectedCallback(), this.addEventListener("play", () => this.onPlaybackStart({ time: this.currentTime })), this.addEventListener("pause", () => this.onPlaybackStop({ time: this.currentTime })), this.addEventListener("ended", () => this.onPlaybackStop({ time: this.currentTime })), this.addEventListener("seeking", () => this.onSeeking()), this.addEventListener("seeked", () => this.onSeeked({ time: this.currentTime }));
|
|
15
|
+
}
|
|
16
|
+
onPlaybackStart(e = {}) {
|
|
17
|
+
this._seeking = !1;
|
|
18
|
+
const { time: t } = e, s = typeof t == "number" ? t : this.currentTime;
|
|
19
|
+
this._currentPlayedRange || (this._currentPlayedRange = { start: s, end: s });
|
|
20
|
+
}
|
|
21
|
+
onSeeking() {
|
|
22
|
+
this._seeking = !0, this._commitCurrentRange();
|
|
23
|
+
}
|
|
24
|
+
onSeeked(e = {}) {
|
|
25
|
+
this._seeking = !1;
|
|
26
|
+
const { time: t } = e, s = typeof t == "number" ? t : this.currentTime;
|
|
27
|
+
this._currentPlayedRange = { start: s, end: s };
|
|
28
|
+
}
|
|
29
|
+
onPlaybackStop(e = {}) {
|
|
30
|
+
const { time: t } = e, s = typeof t == "number" ? t : this.currentTime;
|
|
31
|
+
this._commitCurrentRange(s);
|
|
32
|
+
}
|
|
33
|
+
_commitCurrentRange(e) {
|
|
34
|
+
if (!this._currentPlayedRange) return;
|
|
35
|
+
typeof e == "number" && (this._currentPlayedRange.end = e);
|
|
36
|
+
const { start: t, end: s } = this._currentPlayedRange;
|
|
37
|
+
this._currentPlayedRange = null, this.addPlayedRange(t, s);
|
|
38
|
+
}
|
|
39
|
+
addPlayedRange(e, t) {
|
|
40
|
+
if (e >= t) return;
|
|
41
|
+
const s = this._RANGE_EPSILON, h = [...this._playedRanges, { start: e, end: t }];
|
|
42
|
+
h.sort((i, r) => i.start - r.start);
|
|
43
|
+
const d = [];
|
|
44
|
+
for (const i of h) {
|
|
45
|
+
if (!d.length) {
|
|
46
|
+
d.push({ ...i });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const r = d[d.length - 1];
|
|
50
|
+
i.start <= r.end + s ? (r.start = Math.min(r.start, i.start), r.end = Math.max(r.end, i.end)) : d.push({ ...i });
|
|
51
|
+
}
|
|
52
|
+
this._playedRanges = d;
|
|
53
|
+
}
|
|
54
|
+
get played() {
|
|
55
|
+
const e = this.currentTime;
|
|
56
|
+
return !this.paused && !this._currentPlayedRange && typeof e == "number" && (this._currentPlayedRange = { start: e, end: e }), this._currentPlayedRange && typeof e == "number" && (e > this._currentPlayedRange.end && (this._currentPlayedRange.end = e), this.addPlayedRange(this._currentPlayedRange.start, this._currentPlayedRange.end)), this._playedRanges.length ? u(this._playedRanges.map((t) => [t.start, t.end])) : u([[0, 0]]);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function u(n) {
|
|
61
|
+
return Object.defineProperties(n, {
|
|
62
|
+
start: { value: (a) => n[a][0] },
|
|
63
|
+
end: { value: (a) => n[a][1] }
|
|
64
|
+
}), n;
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
R as M
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=index-Dj9rqWcU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-Dj9rqWcU.js","sources":["../../../node_modules/media-played-ranges-mixin/dist/index.js"],"sourcesContent":["function MediaPlayedRangesMixin(Base) {\n return class MediaPlayedRanges extends Base {\n _playedRanges = [];\n _currentPlayedRange = null;\n _RANGE_EPSILON = 0.5;\n _seeking = false;\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n this.addEventListener(\"play\", () => this.onPlaybackStart({ time: this.currentTime }));\n this.addEventListener(\"pause\", () => this.onPlaybackStop({ time: this.currentTime }));\n this.addEventListener(\"ended\", () => this.onPlaybackStop({ time: this.currentTime }));\n this.addEventListener(\"seeking\", () => this.onSeeking());\n this.addEventListener(\"seeked\", () => this.onSeeked({ time: this.currentTime }));\n }\n onPlaybackStart(param = {}) {\n this._seeking = false;\n const { time } = param;\n const t = typeof time === \"number\" ? time : this.currentTime;\n if (!this._currentPlayedRange) {\n this._currentPlayedRange = { start: t, end: t };\n }\n }\n onSeeking() {\n this._seeking = true;\n this._commitCurrentRange();\n }\n onSeeked(param = {}) {\n this._seeking = false;\n const { time } = param;\n const t = typeof time === \"number\" ? time : this.currentTime;\n this._currentPlayedRange = { start: t, end: t };\n }\n onPlaybackStop(param = {}) {\n const { time } = param;\n const t = typeof time === \"number\" ? time : this.currentTime;\n this._commitCurrentRange(t);\n }\n _commitCurrentRange(time) {\n if (!this._currentPlayedRange) return;\n if (typeof time === \"number\") {\n this._currentPlayedRange.end = time;\n }\n const { start, end } = this._currentPlayedRange;\n this._currentPlayedRange = null;\n this.addPlayedRange(start, end);\n }\n addPlayedRange(start, end) {\n if (start >= end) return;\n const EPS = this._RANGE_EPSILON;\n const allRanges = [...this._playedRanges, { start, end }];\n allRanges.sort((a, b) => a.start - b.start);\n const merged = [];\n for (const range of allRanges) {\n if (!merged.length) {\n merged.push({ ...range });\n continue;\n }\n const last = merged[merged.length - 1];\n if (range.start <= last.end + EPS) {\n last.start = Math.min(last.start, range.start);\n last.end = Math.max(last.end, range.end);\n } else {\n merged.push({ ...range });\n }\n }\n this._playedRanges = merged;\n }\n get played() {\n const time = this.currentTime;\n if (!this.paused && !this._currentPlayedRange && typeof time === \"number\") {\n this._currentPlayedRange = { start: time, end: time };\n }\n if (this._currentPlayedRange && typeof time === \"number\") {\n if (time > this._currentPlayedRange.end) {\n this._currentPlayedRange.end = time;\n }\n this.addPlayedRange(this._currentPlayedRange.start, this._currentPlayedRange.end);\n }\n if (!this._playedRanges.length) {\n return createTimeRangesObj([[0, 0]]);\n }\n return createTimeRangesObj(this._playedRanges.map((r) => [r.start, r.end]));\n }\n };\n}\nfunction createTimeRangesObj(ranges) {\n Object.defineProperties(ranges, {\n start: { value: (i) => ranges[i][0] },\n end: { value: (i) => ranges[i][1] }\n });\n return ranges;\n}\nexport {\n MediaPlayedRangesMixin\n};\n"],"names":["MediaPlayedRangesMixin","Base","__publicField","param","time","t","start","end","EPS","allRanges","a","b","merged","range","last","createTimeRangesObj","r","ranges","i"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export declare interface ActionButtonProps extends default_2.ButtonHTMLAttribute
|
|
|
20
20
|
|
|
21
21
|
declare type AgeSafetySystemType = 'SYSTEM_AGE_SAFETY_BLOCKED';
|
|
22
22
|
|
|
23
|
+
export declare type AttachmentSourceType = 'image' | 'audio' | 'video' | 'document';
|
|
24
|
+
|
|
23
25
|
/**
|
|
24
26
|
* Avatar component that displays a user image or colored initial fallback
|
|
25
27
|
*/
|
|
@@ -109,7 +111,7 @@ export declare const ChannelView: default_2.NamedExoticComponent<ChannelViewProp
|
|
|
109
111
|
* Props that MessagingShell passes through to ChannelView.
|
|
110
112
|
* ChannelViewProps is the source of truth for these props.
|
|
111
113
|
*/
|
|
112
|
-
declare type ChannelViewPassthroughProps = Pick<ChannelViewProps, 'renderMessageInputActions' | 'renderConversationFooter' | 'CustomChannelEmptyState' | 'onDeleteConversationClick' | 'onBlockParticipantClick' | 'onReportParticipantClick' | 'dmAgentEnabled' | 'messageMetadata' | 'onMessageSent' | 'showStarButton' | 'chatbotVotingEnabled' | 'renderChannelBanner' | 'customProfileContent' | 'customChannelActions' | 'renderMessage'>;
|
|
114
|
+
declare type ChannelViewPassthroughProps = Pick<ChannelViewProps, 'renderMessageInputActions' | 'renderConversationFooter' | 'CustomChannelEmptyState' | 'onDeleteConversationClick' | 'onBlockParticipantClick' | 'onReportParticipantClick' | 'dmAgentEnabled' | 'messageMetadata' | 'onMessageSent' | 'showStarButton' | 'chatbotVotingEnabled' | 'renderChannelBanner' | 'customProfileContent' | 'customChannelActions' | 'renderMessage' | 'onAttachmentUnlock' | 'onAttachmentDownload'>;
|
|
113
115
|
|
|
114
116
|
/**
|
|
115
117
|
* ChannelView component props
|
|
@@ -214,6 +216,17 @@ export declare interface ChannelViewProps {
|
|
|
214
216
|
* )}
|
|
215
217
|
*/
|
|
216
218
|
renderMessage?: (messageNode: React.ReactElement, message: LocalMessage) => React.ReactNode;
|
|
219
|
+
/**
|
|
220
|
+
* Called when the visitor clicks Unlock on a locked attachment message.
|
|
221
|
+
* Receives the message and channel. Show checkout, confirm payment, fetch
|
|
222
|
+
* the unlocked URL. `attachment_source` must NOT be stored on the Stream message metadata.
|
|
223
|
+
* The card shows a loading state for the full duration of the promise.
|
|
224
|
+
*/
|
|
225
|
+
onAttachmentUnlock?: (message: LocalMessage, channel: Channel) => Promise<string>;
|
|
226
|
+
/**
|
|
227
|
+
* Called when the visitor clicks Download on an unlocked attachment message.
|
|
228
|
+
*/
|
|
229
|
+
onAttachmentDownload?: (message: LocalMessage, channel: Channel) => void;
|
|
217
230
|
}
|
|
218
231
|
|
|
219
232
|
declare type DmAgentSystemType = 'SYSTEM_DM_AGENT_PAUSED' | 'SYSTEM_DM_AGENT_RESUMED';
|
|
@@ -253,18 +266,55 @@ export declare interface FaqListProps {
|
|
|
253
266
|
*/
|
|
254
267
|
export declare const formatRelativeTime: (date: Date) => string;
|
|
255
268
|
|
|
256
|
-
|
|
269
|
+
/** Check if a message is a locked attachment */
|
|
270
|
+
export declare const isAttachmentMessage: (message: LocalMessage) => boolean;
|
|
271
|
+
|
|
272
|
+
export declare const LockedAttachmentCard: default_2.FC<LockedAttachmentCardProps>;
|
|
273
|
+
|
|
274
|
+
export declare interface LockedAttachmentCardProps {
|
|
275
|
+
title: string;
|
|
276
|
+
amountText?: string;
|
|
277
|
+
thumbnail?: string;
|
|
278
|
+
/**
|
|
279
|
+
* The unlocked media URL. When undefined the card is in locked state.
|
|
280
|
+
* Typically undefined while the source is being fetched post-purchase.
|
|
281
|
+
*/
|
|
282
|
+
source?: string;
|
|
283
|
+
/** MIME type of the attachment (e.g. 'video/mp4', 'audio/mpeg', 'image/jpeg', 'application/pdf'). Determines the icon and player behaviour. */
|
|
284
|
+
mimeType: string;
|
|
285
|
+
detail?: string;
|
|
286
|
+
/**
|
|
287
|
+
* Called when the visitor clicks Unlock.
|
|
288
|
+
* Omit to hide the Unlock button (e.g. creator-side views).
|
|
289
|
+
*/
|
|
290
|
+
onUnlock?: () => void;
|
|
291
|
+
/** Called when the visitor clicks Download on an unlocked card. */
|
|
292
|
+
onDownload?: () => void;
|
|
293
|
+
/** Shows a loading spinner on the unlock button while the source is being fetched. */
|
|
294
|
+
loading?: boolean;
|
|
295
|
+
/**
|
|
296
|
+
* Payment has been completed but the source URL hasn't been resolved yet.
|
|
297
|
+
* Shows a "Preparing…" state instead of the lock overlay.
|
|
298
|
+
*/
|
|
299
|
+
isPurchased?: boolean;
|
|
300
|
+
/**
|
|
301
|
+
* Creator-side preview shown while composing the attachment.
|
|
302
|
+
* Hides the lock icon, shows placeholder title/price if omitted, and omits action buttons.
|
|
303
|
+
*/
|
|
304
|
+
isPreview?: boolean;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
declare type MessageCustomType = 'MESSAGE_TIP' | 'MESSAGE_PAID' | 'MESSAGE_CHATBOT' | 'MESSAGE_ATTACHMENT' | AgeSafetySystemType | DmAgentSystemType;
|
|
257
308
|
|
|
258
|
-
/**
|
|
259
|
-
* Message metadata for paid messaging and chatbot flows.
|
|
260
|
-
* Used to identify message types and payment status.
|
|
261
|
-
*/
|
|
262
309
|
export declare interface MessageMetadata {
|
|
263
310
|
custom_type?: MessageCustomType;
|
|
264
|
-
amount_text?: string;
|
|
265
|
-
payment_status?: string;
|
|
266
|
-
payment_intent_id?: string;
|
|
267
311
|
listing_id?: string;
|
|
312
|
+
amount_text?: string;
|
|
313
|
+
payment_status?: PaymentStatus;
|
|
314
|
+
attachment_title?: string;
|
|
315
|
+
attachment_mime_type?: string;
|
|
316
|
+
attachment_thumbnail?: string;
|
|
317
|
+
attachment_detail?: string;
|
|
268
318
|
}
|
|
269
319
|
|
|
270
320
|
export declare const MessageVoteButtons: default_2.FC<MessageVoteButtonsProps>;
|
|
@@ -431,6 +481,12 @@ export declare interface ParticipantSource {
|
|
|
431
481
|
loading?: boolean;
|
|
432
482
|
}
|
|
433
483
|
|
|
484
|
+
/**
|
|
485
|
+
* Message metadata for paid messaging and chatbot flows.
|
|
486
|
+
* Used to identify message types and payment status.
|
|
487
|
+
*/
|
|
488
|
+
declare type PaymentStatus = 'pending' | 'paid' | 'failed' | 'refunded';
|
|
489
|
+
|
|
434
490
|
/**
|
|
435
491
|
* Hook that wraps Stream Chat reactions to provide toggle-style
|
|
436
492
|
* upvote/downvote behavior on a message.
|