@linktr.ee/messaging-react 1.27.0 → 1.28.0-rc-1776225927

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.
@@ -0,0 +1,318 @@
1
+ import { jsxs as f, jsx as e, Fragment as j } from "react/jsx-runtime";
2
+ import { XIcon as F, CheckCircleIcon as R, PauseIcon as S, PlayIcon as X, EyeSlashIcon as M, EyeIcon as D } from "@phosphor-icons/react";
3
+ import N from "classnames";
4
+ import { useState as C, useRef as P, useEffect as x, useCallback as E } from "react";
5
+ import { g as q, r as z, M as B } from "./MediaPlayer-DE9MC6k6.js";
6
+ const L = (u) => {
7
+ const { onClose: n } = u;
8
+ return /* @__PURE__ */ e(
9
+ "button",
10
+ {
11
+ type: "button",
12
+ onClick: n,
13
+ className: "absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
14
+ "aria-label": "Close preview",
15
+ children: /* @__PURE__ */ e(D, { className: "size-4", weight: "fill" })
16
+ }
17
+ );
18
+ }, T = (u) => {
19
+ const { thumbnail: n, mimeType: s, overlayIcon: o, onClick: l } = u;
20
+ return /* @__PURE__ */ f(
21
+ "button",
22
+ {
23
+ type: "button",
24
+ disabled: !l,
25
+ className: N(
26
+ "relative aspect-video block w-full overflow-hidden border-0 bg-black/5 p-0 text-left appearance-none",
27
+ { "cursor-pointer": !!l, "cursor-default": !l }
28
+ ),
29
+ onClick: l,
30
+ "aria-label": o ? "Toggle preview" : void 0,
31
+ children: [
32
+ n ? /* @__PURE__ */ e(
33
+ "img",
34
+ {
35
+ src: n,
36
+ alt: "",
37
+ className: "absolute inset-0 h-full w-full object-cover"
38
+ }
39
+ ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: z(s, {
40
+ className: "size-12 text-black/20",
41
+ weight: "regular"
42
+ }) }),
43
+ o && /* @__PURE__ */ e("div", { className: "pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: /* @__PURE__ */ e(o, { className: "size-4", weight: "fill" }) })
44
+ ]
45
+ }
46
+ );
47
+ }, K = (u) => {
48
+ const { source: n, thumbnail: s, mimeType: o } = u, [l, i] = C(!1), [r, d] = C(0), [h, g] = C(!1), b = P(null), w = P(null), m = P(null);
49
+ x(() => {
50
+ const t = b.current;
51
+ t && (l ? t.play().catch(() => i(!1)) : t.pause());
52
+ }, [l]), x(() => {
53
+ if (!l) {
54
+ m.current !== null && cancelAnimationFrame(m.current);
55
+ return;
56
+ }
57
+ const t = () => {
58
+ const a = b.current;
59
+ a && a.duration && !h && d(a.currentTime / a.duration), m.current = requestAnimationFrame(t);
60
+ };
61
+ return m.current = requestAnimationFrame(t), () => {
62
+ m.current !== null && cancelAnimationFrame(m.current);
63
+ };
64
+ }, [l, h]), x(() => {
65
+ i(!1), d(0);
66
+ }, [n]);
67
+ const p = E(
68
+ (t) => {
69
+ var I, A;
70
+ const a = w.current;
71
+ if (!a) return 0;
72
+ const k = "touches" in t ? ((I = t.touches[0]) == null ? void 0 : I.clientX) ?? ((A = t.changedTouches[0]) == null ? void 0 : A.clientX) ?? 0 : t.clientX, y = a.getBoundingClientRect();
73
+ return Math.max(0, Math.min(1, (k - y.left) / y.width));
74
+ },
75
+ []
76
+ ), c = E((t) => {
77
+ const a = b.current;
78
+ a && a.duration && (a.currentTime = t * a.duration);
79
+ }, []);
80
+ x(() => {
81
+ if (!h) return;
82
+ const t = (k) => {
83
+ const y = p(k);
84
+ d(y), c(y);
85
+ }, a = (k) => {
86
+ g(!1), c(p(k));
87
+ };
88
+ return window.addEventListener("mousemove", t), window.addEventListener("mouseup", a), window.addEventListener("touchmove", t, { passive: !0 }), window.addEventListener("touchend", a), () => {
89
+ window.removeEventListener("mousemove", t), window.removeEventListener("mouseup", a), window.removeEventListener("touchmove", t), window.removeEventListener("touchend", a);
90
+ };
91
+ }, [h, p, c]);
92
+ const v = E(() => i((t) => !t), []);
93
+ return /* @__PURE__ */ f("div", { className: "relative", children: [
94
+ n && /* @__PURE__ */ e(
95
+ "audio",
96
+ {
97
+ ref: b,
98
+ src: n,
99
+ loop: !0,
100
+ onEnded: () => {
101
+ i(!1), d(0);
102
+ },
103
+ children: /* @__PURE__ */ e("track", { kind: "captions" })
104
+ }
105
+ ),
106
+ /* @__PURE__ */ e(
107
+ T,
108
+ {
109
+ thumbnail: s,
110
+ mimeType: o,
111
+ overlayIcon: n ? l ? S : X : void 0,
112
+ onClick: n ? v : void 0
113
+ }
114
+ ),
115
+ n && /* @__PURE__ */ e("div", { className: "absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent", children: /* @__PURE__ */ e(
116
+ "div",
117
+ {
118
+ ref: w,
119
+ role: "slider",
120
+ "aria-label": "Playback position",
121
+ "aria-valuenow": Math.round(r * 100),
122
+ "aria-valuemin": 0,
123
+ "aria-valuemax": 100,
124
+ tabIndex: 0,
125
+ className: "relative flex h-4 w-full cursor-pointer items-center",
126
+ onMouseDown: (t) => {
127
+ t.stopPropagation(), g(!0);
128
+ const a = p(t);
129
+ d(a), c(a);
130
+ },
131
+ onTouchStart: (t) => {
132
+ t.stopPropagation(), g(!0);
133
+ const a = p(t);
134
+ d(a), c(a);
135
+ },
136
+ onClick: (t) => t.stopPropagation(),
137
+ onKeyDown: (t) => {
138
+ t.key === "ArrowRight" && c(Math.min(1, r + 0.05)), t.key === "ArrowLeft" && c(Math.max(0, r - 0.05));
139
+ },
140
+ children: /* @__PURE__ */ e("div", { className: "w-full overflow-hidden rounded-full bg-white/30 h-1", children: /* @__PURE__ */ e(
141
+ "div",
142
+ {
143
+ className: "h-full rounded-full bg-white",
144
+ style: { width: `${Math.round(r * 100)}%` }
145
+ }
146
+ ) })
147
+ }
148
+ ) })
149
+ ] });
150
+ }, O = (u) => {
151
+ const { source: n, thumbnail: s, mimeType: o } = u, [l, i] = C(!1), r = () => i(!1);
152
+ return x(() => {
153
+ i(!1);
154
+ }, [n]), n ? /* @__PURE__ */ f(
155
+ "div",
156
+ {
157
+ className: N("relative overflow-hidden", {
158
+ "aspect-video": !l
159
+ }),
160
+ children: [
161
+ /* @__PURE__ */ e(
162
+ B,
163
+ {
164
+ source: n,
165
+ mimeType: o,
166
+ poster: s,
167
+ playing: l,
168
+ loop: !0,
169
+ controls: !1,
170
+ showProgress: !0,
171
+ onContainerClick: r,
172
+ muted: !0
173
+ }
174
+ ),
175
+ !l && /* @__PURE__ */ f(
176
+ "button",
177
+ {
178
+ type: "button",
179
+ className: "absolute inset-0 block cursor-pointer border-0 p-0 text-left appearance-none",
180
+ onClick: () => i(!0),
181
+ "aria-label": "Expand video preview",
182
+ children: [
183
+ s ? /* @__PURE__ */ e(
184
+ "img",
185
+ {
186
+ src: s,
187
+ alt: "",
188
+ className: "absolute inset-0 h-full w-full object-cover"
189
+ }
190
+ ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: z(o, {
191
+ className: "size-12 text-black/20",
192
+ weight: "regular"
193
+ }) }),
194
+ /* @__PURE__ */ e("div", { className: "pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: /* @__PURE__ */ e(M, { className: "size-4", weight: "fill" }) })
195
+ ]
196
+ }
197
+ ),
198
+ l && /* @__PURE__ */ e(L, { onClose: r })
199
+ ]
200
+ }
201
+ ) : /* @__PURE__ */ e(T, { thumbnail: s, mimeType: o });
202
+ }, U = (u) => {
203
+ const { source: n, thumbnail: s, mimeType: o, title: l } = u, [i, r] = C(!1), d = () => r(!1);
204
+ return x(() => {
205
+ r(!1);
206
+ }, [n]), i && n ? /* @__PURE__ */ f("div", { className: "relative", children: [
207
+ /* @__PURE__ */ e(
208
+ "button",
209
+ {
210
+ type: "button",
211
+ className: "block w-full cursor-pointer border-0 p-0 text-left appearance-none",
212
+ onClick: d,
213
+ "aria-label": "Close preview",
214
+ children: /* @__PURE__ */ e("img", { src: n, alt: l ?? "", className: "block w-full" })
215
+ }
216
+ ),
217
+ /* @__PURE__ */ e(L, { onClose: d })
218
+ ] }) : /* @__PURE__ */ e(
219
+ T,
220
+ {
221
+ thumbnail: s,
222
+ mimeType: o,
223
+ overlayIcon: n ? M : void 0,
224
+ onClick: n ? () => r(!0) : void 0
225
+ }
226
+ );
227
+ }, Q = (u) => {
228
+ const {
229
+ title: n,
230
+ mimeType: s = "application/octet-stream",
231
+ thumbnail: o,
232
+ source: l,
233
+ detail: i,
234
+ amountText: r,
235
+ placeholderTitle: d = "Attachment title",
236
+ placeholderAmountText: h,
237
+ paymentStatus: g,
238
+ onDismiss: b,
239
+ isPreview: w = !1
240
+ } = u, m = q(s), p = h ?? r, c = !!h;
241
+ let v;
242
+ return w && m === "audio" ? v = /* @__PURE__ */ e(K, { source: l, thumbnail: o, mimeType: s }) : w && m === "video" ? v = /* @__PURE__ */ e(O, { source: l, thumbnail: o, mimeType: s }) : w && m === "image" ? v = /* @__PURE__ */ e(
243
+ U,
244
+ {
245
+ source: l,
246
+ thumbnail: o,
247
+ mimeType: s,
248
+ title: n
249
+ }
250
+ ) : v = /* @__PURE__ */ e(T, { thumbnail: o, mimeType: s }), /* @__PURE__ */ f("div", { className: "relative w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card", children: [
251
+ b && /* @__PURE__ */ e(
252
+ "button",
253
+ {
254
+ type: "button",
255
+ onClick: b,
256
+ className: "absolute right-3 top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
257
+ "aria-label": "Dismiss attachment",
258
+ children: /* @__PURE__ */ e(F, { className: "size-4", weight: "bold" })
259
+ }
260
+ ),
261
+ v,
262
+ /* @__PURE__ */ f("div", { className: "px-4 pb-3 pt-3", children: [
263
+ /* @__PURE__ */ e(
264
+ "p",
265
+ {
266
+ className: N("mb-1.5 truncate text-base font-medium", {
267
+ "text-black/30": !n,
268
+ "text-black": !!n
269
+ }),
270
+ children: n || d
271
+ }
272
+ ),
273
+ /* @__PURE__ */ f("div", { className: "flex items-center gap-1", children: [
274
+ z(s, {
275
+ className: "size-5 shrink-0 text-black/55",
276
+ weight: "regular"
277
+ }),
278
+ i && /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: i }),
279
+ g === "paid" ? /* @__PURE__ */ f(j, { children: [
280
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
281
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#008236]", children: "Purchased" }),
282
+ /* @__PURE__ */ e(
283
+ R,
284
+ {
285
+ className: "size-4 text-[#008236]",
286
+ weight: "bold"
287
+ }
288
+ )
289
+ ] }) : p && /* @__PURE__ */ f(j, { children: [
290
+ /* @__PURE__ */ e(
291
+ "span",
292
+ {
293
+ className: N("text-xs font-medium", {
294
+ "text-black/30": c,
295
+ "text-black/55": !c
296
+ }),
297
+ children: "•"
298
+ }
299
+ ),
300
+ /* @__PURE__ */ e(
301
+ "span",
302
+ {
303
+ className: N("text-xs font-medium", {
304
+ "text-black/30": c,
305
+ "text-black/55": !c
306
+ }),
307
+ children: p
308
+ }
309
+ )
310
+ ] })
311
+ ] })
312
+ ] })
313
+ ] });
314
+ };
315
+ export {
316
+ Q as default
317
+ };
318
+ //# sourceMappingURL=Creator-D38dWn2X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Creator-D38dWn2X.js","sources":["../src/components/LockedAttachment/components/Creator.tsx"],"sourcesContent":["import {\n CheckCircleIcon,\n EyeIcon,\n EyeSlashIcon,\n PauseIcon,\n PlayIcon,\n XIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LockedAttachmentBaseProps } from '../types'\nimport { renderTypeIcon } from '../utils/icons'\nimport { getSourceType } from '../utils/mimeType'\n\nimport MediaPlayer from './MediaPlayer'\n\nexport interface CreatorCardProps extends LockedAttachmentBaseProps {\n title?: string\n /** When true, shows interactive media preview (composing state). When false/omitted, shows static thumbnail (sent/sold state). */\n isPreview?: boolean\n placeholderTitle?: string\n placeholderAmountText?: string\n onDismiss?: () => void\n}\n\n// ─── Shared primitives ────────────────────────────────────────────────────────\n\ninterface CloseButtonProps {\n onClose: () => void\n}\n\nconst CloseButton: React.FC<CloseButtonProps> = (props) => {\n const { onClose } = props\n return (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\"\n aria-label=\"Close preview\"\n >\n <EyeIcon className=\"size-4\" weight=\"fill\" />\n </button>\n )\n}\n\ninterface CollapsedThumbnailProps {\n thumbnail?: string\n mimeType: string\n overlayIcon?: React.ElementType\n onClick?: () => void\n}\n\nconst CollapsedThumbnail: React.FC<CollapsedThumbnailProps> = (props) => {\n const { thumbnail, mimeType, overlayIcon: OverlayIcon, onClick } = props\n return (\n <button\n type=\"button\"\n disabled={!onClick}\n className={classNames(\n 'relative aspect-video block w-full overflow-hidden border-0 bg-black/5 p-0 text-left appearance-none',\n { 'cursor-pointer': !!onClick, 'cursor-default': !onClick }\n )}\n onClick={onClick}\n aria-label={OverlayIcon ? 'Toggle preview' : undefined}\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n {OverlayIcon && (\n <div className=\"pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n <OverlayIcon className=\"size-4\" weight=\"fill\" />\n </div>\n )}\n </button>\n )\n}\n\n// ─── Per-type preview components ─────────────────────────────────────────────\n\ninterface AudioPreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n}\n\nconst AudioPreview: React.FC<AudioPreviewProps> = (props) => {\n const { source, thumbnail, mimeType } = props\n const [playing, setPlaying] = useState(false)\n const [played, setPlayed] = useState(0)\n const [seeking, setSeeking] = useState(false)\n const audioRef = useRef<HTMLAudioElement>(null)\n const trackRef = useRef<HTMLDivElement>(null)\n const rafRef = useRef<number | null>(null)\n\n useEffect(() => {\n const el = audioRef.current\n if (!el) return\n if (playing) {\n void el.play().catch(() => setPlaying(false))\n } else {\n el.pause()\n }\n }, [playing])\n\n useEffect(() => {\n if (!playing) {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n return\n }\n const tick = () => {\n const el = audioRef.current\n if (el && el.duration && !seeking) setPlayed(el.currentTime / el.duration)\n rafRef.current = requestAnimationFrame(tick)\n }\n rafRef.current = requestAnimationFrame(tick)\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n }\n }, [playing, seeking])\n\n useEffect(() => {\n setPlaying(false)\n setPlayed(0)\n }, [source])\n\n const getFraction = useCallback(\n (e: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\n const track = trackRef.current\n if (!track) return 0\n const clientX =\n 'touches' in e\n ? (e.touches[0]?.clientX ?? e.changedTouches[0]?.clientX ?? 0)\n : e.clientX\n const rect = track.getBoundingClientRect()\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n },\n []\n )\n\n const seekTo = useCallback((fraction: number) => {\n const el = audioRef.current\n if (el && el.duration) el.currentTime = fraction * el.duration\n }, [])\n\n useEffect(() => {\n if (!seeking) return\n const onMove = (e: MouseEvent | TouchEvent) => {\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }\n const onUp = (e: MouseEvent | TouchEvent) => {\n setSeeking(false)\n seekTo(getFraction(e))\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n window.addEventListener('touchmove', onMove, { passive: true })\n window.addEventListener('touchend', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n window.removeEventListener('touchmove', onMove)\n window.removeEventListener('touchend', onUp)\n }\n }, [seeking, getFraction, seekTo])\n\n const toggle = useCallback(() => setPlaying((p) => !p), [])\n\n return (\n <div className=\"relative\">\n {source && (\n <audio\n ref={audioRef}\n src={source}\n loop\n onEnded={() => {\n setPlaying(false)\n setPlayed(0)\n }}\n >\n <track kind=\"captions\" />\n </audio>\n )}\n <CollapsedThumbnail\n thumbnail={thumbnail}\n mimeType={mimeType}\n overlayIcon={source ? (playing ? PauseIcon : PlayIcon) : undefined}\n onClick={source ? toggle : undefined}\n />\n {source && (\n <div className=\"absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent\">\n <div\n ref={trackRef}\n role=\"slider\"\n aria-label=\"Playback position\"\n aria-valuenow={Math.round(played * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n className=\"relative flex h-4 w-full cursor-pointer items-center\"\n onMouseDown={(e) => {\n e.stopPropagation()\n setSeeking(true)\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }}\n onTouchStart={(e) => {\n e.stopPropagation()\n setSeeking(true)\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') seekTo(Math.min(1, played + 0.05))\n if (e.key === 'ArrowLeft') seekTo(Math.max(0, played - 0.05))\n }}\n >\n <div className=\"w-full overflow-hidden rounded-full bg-white/30 h-1\">\n <div\n className=\"h-full rounded-full bg-white\"\n style={{ width: `${Math.round(played * 100)}%` }}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\ninterface VideoPreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n}\n\nconst VideoPreview: React.FC<VideoPreviewProps> = (props) => {\n const { source, thumbnail, mimeType } = props\n const [expanded, setExpanded] = useState(false)\n const collapse = () => setExpanded(false)\n\n useEffect(() => {\n setExpanded(false)\n }, [source])\n\n if (!source) {\n return <CollapsedThumbnail thumbnail={thumbnail} mimeType={mimeType} />\n }\n\n return (\n <div\n className={classNames('relative overflow-hidden', {\n 'aspect-video': !expanded,\n })}\n >\n <MediaPlayer\n source={source}\n mimeType={mimeType}\n poster={thumbnail}\n playing={expanded}\n loop\n controls={false}\n showProgress\n onContainerClick={collapse}\n muted\n />\n {!expanded && (\n <button\n type=\"button\"\n className=\"absolute inset-0 block cursor-pointer border-0 p-0 text-left appearance-none\"\n onClick={() => setExpanded(true)}\n aria-label=\"Expand video preview\"\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n <div className=\"pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n <EyeSlashIcon className=\"size-4\" weight=\"fill\" />\n </div>\n </button>\n )}\n {expanded && <CloseButton onClose={collapse} />}\n </div>\n )\n}\n\ninterface ImagePreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n title?: string\n}\n\nconst ImagePreview: React.FC<ImagePreviewProps> = (props) => {\n const { source, thumbnail, mimeType, title } = props\n const [expanded, setExpanded] = useState(false)\n const collapse = () => setExpanded(false)\n\n useEffect(() => {\n setExpanded(false)\n }, [source])\n\n if (expanded && source) {\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"block w-full cursor-pointer border-0 p-0 text-left appearance-none\"\n onClick={collapse}\n aria-label=\"Close preview\"\n >\n <img src={source} alt={title ?? ''} className=\"block w-full\" />\n </button>\n <CloseButton onClose={collapse} />\n </div>\n )\n }\n\n return (\n <CollapsedThumbnail\n thumbnail={thumbnail}\n mimeType={mimeType}\n overlayIcon={source ? EyeSlashIcon : undefined}\n onClick={source ? () => setExpanded(true) : undefined}\n />\n )\n}\n\n// ─── Card shell ───────────────────────────────────────────────────────────────\n\nconst CreatorCard: React.FC<CreatorCardProps> = (props) => {\n const {\n title,\n mimeType = 'application/octet-stream',\n thumbnail,\n source,\n detail,\n amountText,\n placeholderTitle = 'Attachment title',\n placeholderAmountText,\n paymentStatus,\n onDismiss,\n isPreview = false,\n } = props\n const sourceType = getSourceType(mimeType)\n const displayAmountText = placeholderAmountText ?? amountText\n const isPlaceholderAmount = !!placeholderAmountText\n\n let mediaPreview: React.ReactNode\n if (isPreview && sourceType === 'audio') {\n mediaPreview = (\n <AudioPreview source={source} thumbnail={thumbnail} mimeType={mimeType} />\n )\n } else if (isPreview && sourceType === 'video') {\n mediaPreview = (\n <VideoPreview source={source} thumbnail={thumbnail} mimeType={mimeType} />\n )\n } else if (isPreview && sourceType === 'image') {\n mediaPreview = (\n <ImagePreview\n source={source}\n thumbnail={thumbnail}\n mimeType={mimeType}\n title={title}\n />\n )\n } else {\n mediaPreview = (\n <CollapsedThumbnail thumbnail={thumbnail} mimeType={mimeType} />\n )\n }\n\n return (\n <div className=\"relative w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card\">\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"absolute right-3 top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\"\n aria-label=\"Dismiss attachment\"\n >\n <XIcon className=\"size-4\" weight=\"bold\" />\n </button>\n )}\n {mediaPreview}\n <div className=\"px-4 pb-3 pt-3\">\n <p\n className={classNames('mb-1.5 truncate text-base font-medium', {\n 'text-black/30': !title,\n 'text-black': !!title,\n })}\n >\n {title || placeholderTitle}\n </p>\n <div className=\"flex items-center gap-1\">\n {renderTypeIcon(mimeType, {\n className: 'size-5 shrink-0 text-black/55',\n weight: 'regular',\n })}\n {detail && (\n <span className=\"text-xs font-medium text-black/55\">{detail}</span>\n )}\n {paymentStatus === 'paid' ? (\n <>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-[#008236]\">\n Purchased\n </span>\n <CheckCircleIcon\n className=\"size-4 text-[#008236]\"\n weight=\"bold\"\n />\n </>\n ) : (\n displayAmountText && (\n <>\n <span\n className={classNames('text-xs font-medium', {\n 'text-black/30': isPlaceholderAmount,\n 'text-black/55': !isPlaceholderAmount,\n })}\n >\n •\n </span>\n <span\n className={classNames('text-xs font-medium', {\n 'text-black/30': isPlaceholderAmount,\n 'text-black/55': !isPlaceholderAmount,\n })}\n >\n {displayAmountText}\n </span>\n </>\n )\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default CreatorCard\n"],"names":["CloseButton","props","onClose","jsx","EyeIcon","CollapsedThumbnail","thumbnail","mimeType","OverlayIcon","onClick","jsxs","classNames","AudioPreview","source","playing","setPlaying","useState","played","setPlayed","seeking","setSeeking","audioRef","useRef","trackRef","rafRef","useEffect","el","tick","getFraction","useCallback","e","track","clientX","_a","_b","rect","seekTo","fraction","onMove","f","onUp","toggle","p","PauseIcon","PlayIcon","VideoPreview","expanded","setExpanded","collapse","MediaPlayer","EyeSlashIcon","ImagePreview","title","CreatorCard","detail","amountText","placeholderTitle","placeholderAmountText","paymentStatus","onDismiss","isPreview","sourceType","getSourceType","displayAmountText","isPlaceholderAmount","mediaPreview","XIcon","renderTypeIcon","Fragment","CheckCircleIcon"],"mappings":"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"}