@oneplatformdev/ui 0.1.99-beta.280 → 0.1.99-beta.281
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropzoneSinglePickPreview.d.ts","sourceRoot":"","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,OAAO,wCAAwC,CAAC;AAChD,OAAO,iDAAiD,CAAC;AACzD,OAAO,yDAAyD,CAAC;AACjE,OAAO,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"DropzoneSinglePickPreview.d.ts","sourceRoot":"","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,OAAO,wCAAwC,CAAC;AAChD,OAAO,iDAAiD,CAAC;AACzD,OAAO,yDAAyD,CAAC;AACjE,OAAO,iCAAiC,CAAC;AAgBzC,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,GAAG,IAAI,GAAG,IAAI,KAAG,MAYpE,CAAC;AAqCF,UAAU,sBAAsB;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC1D,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,yBAAyB,GAAI,kEAMvC,sBAAsB,4CAsLxB,CAAC"}
|
|
@@ -1,16 +1,27 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { isVideoUrl as
|
|
4
|
-
import { X as U, FileIcon as M, Video as
|
|
5
|
-
import { MediaPlayer as
|
|
6
|
-
import { DefaultVideoLayout as
|
|
1
|
+
import { jsxs as i, jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { useState as v, useMemo as a, useRef as k, useEffect as E } from "react";
|
|
3
|
+
import { isVideoUrl as R, isFile as C } from "./DropzoneUtils.js";
|
|
4
|
+
import { X as U, FileIcon as M, Video as B, PencilIcon as V, Trash2 as Y } from "lucide-react";
|
|
5
|
+
import { MediaPlayer as T, MediaProvider as O, Poster as D } from "@vidstack/react";
|
|
6
|
+
import { DefaultVideoLayout as W, defaultLayoutIcons as $ } from "@vidstack/react/player/layouts/default";
|
|
7
7
|
import { Button as q } from "../Button/Button.js";
|
|
8
8
|
import "@vidstack/react/player/styles/base.css";
|
|
9
9
|
import "@vidstack/react/player/styles/default/theme.css";
|
|
10
10
|
import "@vidstack/react/player/styles/default/layouts/video.css";
|
|
11
11
|
/* empty css */
|
|
12
12
|
import { ButtonIcon as A } from "../ButtonIcon/ButtonIcon.js";
|
|
13
|
-
const
|
|
13
|
+
const _ = `
|
|
14
|
+
.dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,
|
|
15
|
+
.dropzone-youtube-player[data-fullscreen="false"] .vds-play-button,
|
|
16
|
+
.dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,
|
|
17
|
+
.dropzone-youtube-player[data-fullscreen="false"] .vds-buffering-indicator,
|
|
18
|
+
.dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,
|
|
19
|
+
.dropzone-youtube-player[data-fullscreen="false"] .vds-loading-indicator,
|
|
20
|
+
.dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,
|
|
21
|
+
.dropzone-youtube-player[data-fullscreen="false"] .vds-spinner {
|
|
22
|
+
display: none !important;
|
|
23
|
+
}
|
|
24
|
+
`, J = (e) => {
|
|
14
25
|
if (!e) return "";
|
|
15
26
|
switch (!0) {
|
|
16
27
|
case (typeof e == "string" && !!e.trim() && e !== "null"):
|
|
@@ -25,8 +36,8 @@ const J = (e) => {
|
|
|
25
36
|
}, X = (e) => {
|
|
26
37
|
if (!e) return !1;
|
|
27
38
|
try {
|
|
28
|
-
const
|
|
29
|
-
return
|
|
39
|
+
const u = new URL(e).hostname.toLowerCase();
|
|
40
|
+
return u.includes("youtube.com") || u.includes("youtu.be");
|
|
30
41
|
} catch {
|
|
31
42
|
return !1;
|
|
32
43
|
}
|
|
@@ -35,118 +46,119 @@ const J = (e) => {
|
|
|
35
46
|
const s = new URL(e);
|
|
36
47
|
if (s.hostname.toLowerCase().includes("youtu.be"))
|
|
37
48
|
return s.pathname.replace("/", "").trim();
|
|
38
|
-
const
|
|
39
|
-
if (
|
|
40
|
-
const f = s.pathname.split("/").filter(Boolean), l = f.findIndex((
|
|
49
|
+
const p = s.searchParams.get("v");
|
|
50
|
+
if (p) return p.trim();
|
|
51
|
+
const f = s.pathname.split("/").filter(Boolean), l = f.findIndex((h) => h === "embed");
|
|
41
52
|
return l >= 0 && f[l + 1] ? f[l + 1].trim() : "";
|
|
42
53
|
} catch {
|
|
43
54
|
return "";
|
|
44
55
|
}
|
|
45
|
-
},
|
|
56
|
+
}, ue = ({
|
|
46
57
|
item: e,
|
|
47
58
|
disabled: s,
|
|
48
|
-
onRemoveClick:
|
|
49
|
-
onReplaceClick:
|
|
59
|
+
onRemoveClick: u,
|
|
60
|
+
onReplaceClick: p,
|
|
50
61
|
labelReplace: f = "Замінити"
|
|
51
62
|
}) => {
|
|
52
|
-
const [l,
|
|
63
|
+
const [l, h] = v(""), n = C(e), y = n ? e.name : e, t = a(
|
|
53
64
|
() => typeof e == "string" && X(e),
|
|
54
65
|
[e]
|
|
55
|
-
),
|
|
56
|
-
() => typeof e == "string" && !t &&
|
|
66
|
+
), m = a(
|
|
67
|
+
() => typeof e == "string" && !t && R(e),
|
|
57
68
|
[e, t]
|
|
58
|
-
),
|
|
69
|
+
), c = a(
|
|
59
70
|
() => t && typeof e == "string" ? G(e) : "",
|
|
60
71
|
[t, e]
|
|
61
|
-
),
|
|
62
|
-
() =>
|
|
63
|
-
[
|
|
64
|
-
), [
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}, [
|
|
68
|
-
const S =
|
|
69
|
-
return
|
|
72
|
+
), x = a(() => !t || typeof e != "string" ? "" : c ? `youtube/${c}` : e, [t, e, c]), b = a(
|
|
73
|
+
() => c ? `https://img.youtube.com/vi/${c}/hqdefault.jpg` : void 0,
|
|
74
|
+
[c]
|
|
75
|
+
), [F, w] = v(!1), [I, N] = v(!0), z = k(null), P = k(null);
|
|
76
|
+
E(() => {
|
|
77
|
+
w(!1), N(!0);
|
|
78
|
+
}, [x]);
|
|
79
|
+
const S = a(() => n && e.type?.includes("image") || typeof e == "string" && !t && !m, [e, n, t, m]), d = a(() => n && e.type?.includes("video") || t || m, [e, n, t, m]), j = a(() => n ? `${(e.size / (1024 * 1024)).toFixed(0)} MB` : "", [e, n]);
|
|
80
|
+
return E(() => {
|
|
70
81
|
if (S || d) {
|
|
71
82
|
const r = J(e);
|
|
72
|
-
if (
|
|
83
|
+
if (h(r), n && r)
|
|
73
84
|
return () => URL.revokeObjectURL(r);
|
|
74
85
|
} else
|
|
75
|
-
|
|
76
|
-
}, [e, n, S, d]), /* @__PURE__ */
|
|
77
|
-
|
|
78
|
-
|
|
86
|
+
h("");
|
|
87
|
+
}, [e, n, S, d]), /* @__PURE__ */ i("div", { className: "relative w-full overflow-hidden", children: [
|
|
88
|
+
t && /* @__PURE__ */ o("style", { children: _ }),
|
|
89
|
+
d && l ? /* @__PURE__ */ o("div", { className: "w-full rounded-lg overflow-hidden bg-black", onClick: (r) => r.stopPropagation(), children: /* @__PURE__ */ o("div", { className: "aspect-video", children: /* @__PURE__ */ i(
|
|
90
|
+
T,
|
|
79
91
|
{
|
|
80
|
-
ref:
|
|
92
|
+
ref: z,
|
|
81
93
|
title: n ? e.name : t ? void 0 : typeof e == "string" ? e : void 0,
|
|
82
|
-
src: t ?
|
|
83
|
-
poster: t ?
|
|
84
|
-
className: `h-full w-full bg-black text-white ${t &&
|
|
94
|
+
src: t ? x : { src: l, type: n ? e.type : void 0 },
|
|
95
|
+
poster: t ? b : void 0,
|
|
96
|
+
className: `h-full w-full bg-black text-white ${t && F ? "dropzone-youtube-player" : ""}`,
|
|
85
97
|
playsInline: !0,
|
|
86
98
|
onPlay: () => {
|
|
87
|
-
N(!1), t &&
|
|
99
|
+
N(!1), t && w(!0);
|
|
88
100
|
},
|
|
89
101
|
onVolumeChange: (r) => {
|
|
90
102
|
if (!t) return;
|
|
91
|
-
const
|
|
92
|
-
if (
|
|
93
|
-
|
|
94
|
-
const L =
|
|
103
|
+
const g = r.volume === 0 || r.muted;
|
|
104
|
+
if (P.current === g) return;
|
|
105
|
+
P.current = g;
|
|
106
|
+
const L = z.current?.el?.querySelector("iframe");
|
|
95
107
|
L?.contentWindow && L.contentWindow.postMessage(
|
|
96
|
-
JSON.stringify({ event: "command", func:
|
|
108
|
+
JSON.stringify({ event: "command", func: g ? "mute" : "unMute", args: [] }),
|
|
97
109
|
"*"
|
|
98
110
|
);
|
|
99
111
|
},
|
|
100
112
|
children: [
|
|
101
|
-
/* @__PURE__ */ o(
|
|
102
|
-
|
|
103
|
-
|
|
113
|
+
/* @__PURE__ */ o(O, {}),
|
|
114
|
+
I && t && b && /* @__PURE__ */ o(
|
|
115
|
+
D,
|
|
104
116
|
{
|
|
105
117
|
className: "absolute inset-0 h-full w-full object-cover",
|
|
106
|
-
src:
|
|
118
|
+
src: b,
|
|
107
119
|
alt: typeof e == "string" ? e : ""
|
|
108
120
|
}
|
|
109
121
|
),
|
|
110
|
-
/* @__PURE__ */ o(
|
|
122
|
+
/* @__PURE__ */ o(W, { icons: $ })
|
|
111
123
|
]
|
|
112
124
|
}
|
|
113
|
-
) }) }) : !d && l ? /* @__PURE__ */
|
|
114
|
-
!s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick:
|
|
125
|
+
) }) }) : !d && l ? /* @__PURE__ */ i("div", { className: "relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg", children: [
|
|
126
|
+
!s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick: u, children: /* @__PURE__ */ o(U, { size: 16, strokeWidth: 2, color: "black" }) }),
|
|
115
127
|
/* @__PURE__ */ o(
|
|
116
128
|
"img",
|
|
117
129
|
{
|
|
118
130
|
src: l,
|
|
119
|
-
alt:
|
|
131
|
+
alt: y?.toString(),
|
|
120
132
|
className: "w-full h-full object-cover rounded-lg"
|
|
121
133
|
}
|
|
122
134
|
)
|
|
123
|
-
] }) : d ? null : /* @__PURE__ */
|
|
124
|
-
!s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick:
|
|
125
|
-
/* @__PURE__ */
|
|
135
|
+
] }) : d ? null : /* @__PURE__ */ i("div", { className: "relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg", children: [
|
|
136
|
+
!s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick: u, children: /* @__PURE__ */ o(U, { size: 16, strokeWidth: 2, color: "black" }) }),
|
|
137
|
+
/* @__PURE__ */ i("div", { className: "w-full h-full flex flex-col items-center justify-center text-gray-600", children: [
|
|
126
138
|
/* @__PURE__ */ o(M, { size: 28 }),
|
|
127
|
-
/* @__PURE__ */ o("span", { className: "text-sm mt-2 break-all px-2 text-center", children:
|
|
139
|
+
/* @__PURE__ */ o("span", { className: "text-sm mt-2 break-all px-2 text-center", children: y?.toString() })
|
|
128
140
|
] })
|
|
129
141
|
] }),
|
|
130
|
-
d && !t && /* @__PURE__ */
|
|
142
|
+
d && !t && /* @__PURE__ */ i(
|
|
131
143
|
"div",
|
|
132
144
|
{
|
|
133
145
|
className: "mt-2 w-full h-auto min-h-14 rounded-[8px] border border-[#E8E9EB] bg-[#FCFCFC] p-2 flex items-center gap-4",
|
|
134
146
|
onClick: (r) => r.stopPropagation(),
|
|
135
147
|
children: [
|
|
136
|
-
/* @__PURE__ */ o("div", { className: "size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0", children: /* @__PURE__ */ o(
|
|
137
|
-
/* @__PURE__ */
|
|
138
|
-
/* @__PURE__ */ o("span", { className: "w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left", children:
|
|
139
|
-
/* @__PURE__ */ o("span", { className: "w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left", children:
|
|
148
|
+
/* @__PURE__ */ o("div", { className: "size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0", children: /* @__PURE__ */ o(B, { className: "size-6 text-[#06080D]" }) }),
|
|
149
|
+
/* @__PURE__ */ i("div", { className: "flex flex-col items-start text-left gap-1 min-w-0 flex-1 justify-start", children: [
|
|
150
|
+
/* @__PURE__ */ o("span", { className: "w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left", children: y?.toString() }),
|
|
151
|
+
/* @__PURE__ */ o("span", { className: "w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left", children: j })
|
|
140
152
|
] }),
|
|
141
153
|
!s && /* @__PURE__ */ o(
|
|
142
154
|
q,
|
|
143
155
|
{
|
|
144
156
|
type: "button",
|
|
145
157
|
color: "secondary",
|
|
146
|
-
startAdornment:
|
|
158
|
+
startAdornment: V,
|
|
147
159
|
size: "md",
|
|
148
160
|
onClick: (r) => {
|
|
149
|
-
r.stopPropagation(),
|
|
161
|
+
r.stopPropagation(), p?.(r);
|
|
150
162
|
},
|
|
151
163
|
children: f
|
|
152
164
|
}
|
|
@@ -154,11 +166,11 @@ const J = (e) => {
|
|
|
154
166
|
!s && /* @__PURE__ */ o(
|
|
155
167
|
A,
|
|
156
168
|
{
|
|
157
|
-
icon:
|
|
169
|
+
icon: Y,
|
|
158
170
|
variant: "outlined",
|
|
159
171
|
size: "md",
|
|
160
172
|
color: "secondary",
|
|
161
|
-
onClick:
|
|
173
|
+
onClick: u
|
|
162
174
|
}
|
|
163
175
|
)
|
|
164
176
|
]
|
|
@@ -167,7 +179,7 @@ const J = (e) => {
|
|
|
167
179
|
] });
|
|
168
180
|
};
|
|
169
181
|
export {
|
|
170
|
-
|
|
182
|
+
ue as DropzoneSinglePickPreview,
|
|
171
183
|
J as transformImageToSrc
|
|
172
184
|
};
|
|
173
185
|
//# sourceMappingURL=DropzoneSinglePickPreview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropzoneSinglePickPreview.js","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DropzoneValueItem } from './Dropzone.types';\r\nimport { isFile, isVideoUrl } from './DropzoneUtils';\r\nimport { FileIcon, PencilIcon, Trash2, Video, X } from 'lucide-react';\r\nimport { MediaPlayer, type MediaPlayerInstance, MediaProvider, Poster } from '@vidstack/react';\r\nimport { defaultLayoutIcons, DefaultVideoLayout } from '@vidstack/react/player/layouts/default';\r\nimport { Button } from '../Button/Button';\r\n\r\nimport '@vidstack/react/player/styles/base.css';\r\nimport '@vidstack/react/player/styles/default/theme.css';\r\nimport '@vidstack/react/player/styles/default/layouts/video.css';\r\nimport './DropzoneSinglePickPreview.css';\r\nimport { ButtonIcon } from \"../ButtonIcon\";\r\n\r\nexport const transformImageToSrc = (preview?: string | File | null): string => {\r\n if (!preview) return '';\r\n switch (true) {\r\n case typeof preview === 'string' && !!preview.trim() && preview !== 'null':\r\n return preview;\r\n case preview instanceof File:\r\n return URL.createObjectURL(preview);\r\n case preview instanceof FileList:\r\n return preview[0] ? URL.createObjectURL(preview[0]) : '';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst isYoutubeUrl = (value?: string | null) => {\r\n if (!value) return false;\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n return hostname.includes('youtube.com') || hostname.includes('youtu.be');\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nconst extractYoutubeId = (value: string) => {\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n\r\n if (hostname.includes('youtu.be')) {\r\n return url.pathname.replace('/', '').trim();\r\n }\r\n\r\n const searchId = url.searchParams.get('v');\r\n if (searchId) return searchId.trim();\r\n\r\n const pathParts = url.pathname.split('/').filter(Boolean);\r\n const embedIndex = pathParts.findIndex((part) => part === 'embed');\r\n if (embedIndex >= 0 && pathParts[embedIndex + 1]) {\r\n return pathParts[embedIndex + 1].trim();\r\n }\r\n\r\n return '';\r\n } catch {\r\n return '';\r\n }\r\n};\r\n\r\ninterface SinglePickPreviewProps {\r\n item: DropzoneValueItem;\r\n disabled?: boolean;\r\n onRemoveClick: (e: React.MouseEvent<HTMLElement>) => void;\r\n onReplaceClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\r\n labelUploaded?: string;\r\n labelReplace?: string;\r\n}\r\n\r\nexport const DropzoneSinglePickPreview = ({\r\n item,\r\n disabled,\r\n onRemoveClick,\r\n onReplaceClick,\r\n labelReplace = 'Замінити',\r\n}: SinglePickPreviewProps) => {\r\n const [previewUrl, setPreviewUrl] = useState('');\r\n const isFileType = isFile(item);\r\n const fileName = isFileType ? item.name : item;\r\n\r\n const isYoutubeVideo = useMemo(\r\n () => typeof item === 'string' && isYoutubeUrl(item),\r\n [item]\r\n );\r\n const isRemoteVideo = useMemo(\r\n () => typeof item === 'string' && !isYoutubeVideo && isVideoUrl(item),\r\n [item, isYoutubeVideo]\r\n );\r\n const youtubeId = useMemo(\r\n () => (isYoutubeVideo && typeof item === 'string' ? extractYoutubeId(item) : ''),\r\n [isYoutubeVideo, item]\r\n );\r\n const youtubeSource = useMemo(() => {\r\n if (!isYoutubeVideo || typeof item !== 'string') return '';\r\n return youtubeId ? `youtube/${youtubeId}` : item;\r\n }, [isYoutubeVideo, item, youtubeId]);\r\n const youtubeThumbnail = useMemo(\r\n () => (youtubeId ? `https://img.youtube.com/vi/${youtubeId}/hqdefault.jpg` : undefined),\r\n [youtubeId]\r\n );\r\n const [youtubeStarted, setYoutubeStarted] = useState(false);\r\n const [showPoster, setShowPoster] = useState(true);\r\n const mediaPlayerRef = useRef<MediaPlayerInstance>(null);\r\n const lastMuteStateRef = useRef<boolean | null>(null);\r\n\r\n useEffect(() => {\r\n setYoutubeStarted(false);\r\n setShowPoster(true);\r\n }, [youtubeSource]);\r\n\r\n const showImage = useMemo(() => {\r\n return (isFileType && item.type?.includes('image')) || (typeof item === 'string' && !isYoutubeVideo && !isRemoteVideo);\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const showVideo = useMemo(() => {\r\n return (isFileType && item.type?.includes('video')) || isYoutubeVideo || isRemoteVideo;\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const fileSize = useMemo(() => {\r\n if (!isFileType) return '';\r\n return `${(item.size / (1024 * 1024)).toFixed(0)} MB`;\r\n }, [item, isFileType]);\r\n\r\n useEffect(() => {\r\n if (showImage || showVideo) {\r\n const nextPreview = transformImageToSrc(item);\r\n setPreviewUrl(nextPreview);\r\n\r\n if (isFileType && nextPreview) {\r\n return () => URL.revokeObjectURL(nextPreview);\r\n }\r\n } else {\r\n setPreviewUrl('');\r\n }\r\n\r\n return undefined;\r\n }, [item, isFileType, showImage, showVideo]);\r\n\r\n return (\r\n <div className=\"relative w-full overflow-hidden\">\r\n {showVideo && previewUrl ? (\r\n <div className=\"w-full rounded-lg overflow-hidden bg-black\" onClick={(event) => event.stopPropagation()}>\r\n <div className=\"aspect-video\">\r\n <MediaPlayer\r\n ref={mediaPlayerRef}\r\n title={isFileType ? (item as File).name : isYoutubeVideo ? undefined : (typeof item === 'string' ? item : undefined)}\r\n src={isYoutubeVideo ? youtubeSource : { src: previewUrl, type: isFileType ? (item as File).type : undefined }}\r\n poster={isYoutubeVideo ? youtubeThumbnail : undefined}\r\n className={`h-full w-full bg-black text-white ${\r\n isYoutubeVideo && youtubeStarted ? 'dropzone-youtube-player' : ''\r\n }`}\r\n playsInline\r\n onPlay={() => {\r\n setShowPoster(false);\r\n if (isYoutubeVideo) setYoutubeStarted(true);\r\n }}\r\n onVolumeChange={(detail) => {\r\n if (!isYoutubeVideo) return;\r\n const shouldMute = detail.volume === 0 || detail.muted;\r\n if (lastMuteStateRef.current === shouldMute) return;\r\n lastMuteStateRef.current = shouldMute;\r\n const iframe = mediaPlayerRef.current?.el?.querySelector('iframe') as HTMLIFrameElement | null;\r\n if (!iframe?.contentWindow) return;\r\n iframe.contentWindow.postMessage(\r\n JSON.stringify({ event: 'command', func: shouldMute ? 'mute' : 'unMute', args: [] }),\r\n '*'\r\n );\r\n }}\r\n >\r\n <MediaProvider />\r\n {showPoster && isYoutubeVideo && youtubeThumbnail && (\r\n <Poster\r\n className=\"absolute inset-0 h-full w-full object-cover\"\r\n src={youtubeThumbnail}\r\n alt={typeof item === 'string' ? item : ''}\r\n />\r\n )}\r\n <DefaultVideoLayout icons={defaultLayoutIcons} />\r\n </MediaPlayer>\r\n </div>\r\n </div>\r\n ) : !showVideo && previewUrl ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <img\r\n src={previewUrl}\r\n alt={fileName?.toString()}\r\n className=\"w-full h-full object-cover rounded-lg\"\r\n />\r\n </div>\r\n ) : !showVideo ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <div className=\"w-full h-full flex flex-col items-center justify-center text-gray-600\">\r\n <FileIcon size={28} />\r\n <span className=\"text-sm mt-2 break-all px-2 text-center\">\r\n {fileName?.toString()}\r\n </span>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {showVideo && !isYoutubeVideo && (\r\n <div\r\n className=\"mt-2 w-full h-auto min-h-14 rounded-[8px] border border-[#E8E9EB] bg-[#FCFCFC] p-2 flex items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0\">\r\n <Video className=\"size-6 text-[#06080D]\" />\r\n </div>\r\n\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1 justify-start\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left\">\r\n {fileName?.toString()}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left\">\r\n {fileSize}\r\n </span>\r\n </div>\r\n\r\n {!disabled && (\r\n <Button\r\n type=\"button\"\r\n color=\"secondary\"\r\n startAdornment={PencilIcon}\r\n size=\"md\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n onReplaceClick?.(event);\r\n }}\r\n >\r\n {labelReplace}\r\n </Button>\r\n )}\r\n\r\n {!disabled && (\r\n <ButtonIcon\r\n icon={Trash2}\r\n variant=\"outlined\"\r\n size=\"md\"\r\n color=\"secondary\"\r\n onClick={onRemoveClick}\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["transformImageToSrc","preview","isYoutubeUrl","value","hostname","extractYoutubeId","url","searchId","pathParts","embedIndex","part","DropzoneSinglePickPreview","item","disabled","onRemoveClick","onReplaceClick","labelReplace","previewUrl","setPreviewUrl","useState","isFileType","isFile","fileName","isYoutubeVideo","useMemo","isRemoteVideo","isVideoUrl","youtubeId","youtubeSource","youtubeThumbnail","youtubeStarted","setYoutubeStarted","showPoster","setShowPoster","mediaPlayerRef","useRef","lastMuteStateRef","useEffect","showImage","showVideo","fileSize","nextPreview","jsxs","jsx","event","MediaPlayer","detail","shouldMute","iframe","MediaProvider","Poster","DefaultVideoLayout","defaultLayoutIcons","X","FileIcon","Video","Button","PencilIcon","ButtonIcon","Trash2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropzoneSinglePickPreview.js","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DropzoneValueItem } from './Dropzone.types';\r\nimport { isFile, isVideoUrl } from './DropzoneUtils';\r\nimport { FileIcon, PencilIcon, Trash2, Video, X } from 'lucide-react';\r\nimport { MediaPlayer, type MediaPlayerInstance, MediaProvider, Poster } from '@vidstack/react';\r\nimport { defaultLayoutIcons, DefaultVideoLayout } from '@vidstack/react/player/layouts/default';\r\nimport { Button } from '../Button/Button';\r\n\r\nimport '@vidstack/react/player/styles/base.css';\r\nimport '@vidstack/react/player/styles/default/theme.css';\r\nimport '@vidstack/react/player/styles/default/layouts/video.css';\r\nimport './DropzoneSinglePickPreview.css';\r\nimport { ButtonIcon } from \"../ButtonIcon\";\r\n\r\nconst YOUTUBE_PLAYER_STYLES = `\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-play-button,\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-buffering-indicator,\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-loading-indicator,\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-spinner {\r\n display: none !important;\r\n}\r\n`;\r\n\r\nexport const transformImageToSrc = (preview?: string | File | null): string => {\r\n if (!preview) return '';\r\n switch (true) {\r\n case typeof preview === 'string' && !!preview.trim() && preview !== 'null':\r\n return preview;\r\n case preview instanceof File:\r\n return URL.createObjectURL(preview);\r\n case preview instanceof FileList:\r\n return preview[0] ? URL.createObjectURL(preview[0]) : '';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst isYoutubeUrl = (value?: string | null) => {\r\n if (!value) return false;\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n return hostname.includes('youtube.com') || hostname.includes('youtu.be');\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nconst extractYoutubeId = (value: string) => {\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n\r\n if (hostname.includes('youtu.be')) {\r\n return url.pathname.replace('/', '').trim();\r\n }\r\n\r\n const searchId = url.searchParams.get('v');\r\n if (searchId) return searchId.trim();\r\n\r\n const pathParts = url.pathname.split('/').filter(Boolean);\r\n const embedIndex = pathParts.findIndex((part) => part === 'embed');\r\n if (embedIndex >= 0 && pathParts[embedIndex + 1]) {\r\n return pathParts[embedIndex + 1].trim();\r\n }\r\n\r\n return '';\r\n } catch {\r\n return '';\r\n }\r\n};\r\n\r\ninterface SinglePickPreviewProps {\r\n item: DropzoneValueItem;\r\n disabled?: boolean;\r\n onRemoveClick: (e: React.MouseEvent<HTMLElement>) => void;\r\n onReplaceClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\r\n labelUploaded?: string;\r\n labelReplace?: string;\r\n}\r\n\r\nexport const DropzoneSinglePickPreview = ({\r\n item,\r\n disabled,\r\n onRemoveClick,\r\n onReplaceClick,\r\n labelReplace = 'Замінити',\r\n}: SinglePickPreviewProps) => {\r\n const [previewUrl, setPreviewUrl] = useState('');\r\n const isFileType = isFile(item);\r\n const fileName = isFileType ? item.name : item;\r\n\r\n const isYoutubeVideo = useMemo(\r\n () => typeof item === 'string' && isYoutubeUrl(item),\r\n [item]\r\n );\r\n const isRemoteVideo = useMemo(\r\n () => typeof item === 'string' && !isYoutubeVideo && isVideoUrl(item),\r\n [item, isYoutubeVideo]\r\n );\r\n const youtubeId = useMemo(\r\n () => (isYoutubeVideo && typeof item === 'string' ? extractYoutubeId(item) : ''),\r\n [isYoutubeVideo, item]\r\n );\r\n const youtubeSource = useMemo(() => {\r\n if (!isYoutubeVideo || typeof item !== 'string') return '';\r\n return youtubeId ? `youtube/${youtubeId}` : item;\r\n }, [isYoutubeVideo, item, youtubeId]);\r\n const youtubeThumbnail = useMemo(\r\n () => (youtubeId ? `https://img.youtube.com/vi/${youtubeId}/hqdefault.jpg` : undefined),\r\n [youtubeId]\r\n );\r\n const [youtubeStarted, setYoutubeStarted] = useState(false);\r\n const [showPoster, setShowPoster] = useState(true);\r\n const mediaPlayerRef = useRef<MediaPlayerInstance>(null);\r\n const lastMuteStateRef = useRef<boolean | null>(null);\r\n\r\n useEffect(() => {\r\n setYoutubeStarted(false);\r\n setShowPoster(true);\r\n }, [youtubeSource]);\r\n\r\n const showImage = useMemo(() => {\r\n return (isFileType && item.type?.includes('image')) || (typeof item === 'string' && !isYoutubeVideo && !isRemoteVideo);\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const showVideo = useMemo(() => {\r\n return (isFileType && item.type?.includes('video')) || isYoutubeVideo || isRemoteVideo;\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const fileSize = useMemo(() => {\r\n if (!isFileType) return '';\r\n return `${(item.size / (1024 * 1024)).toFixed(0)} MB`;\r\n }, [item, isFileType]);\r\n\r\n useEffect(() => {\r\n if (showImage || showVideo) {\r\n const nextPreview = transformImageToSrc(item);\r\n setPreviewUrl(nextPreview);\r\n\r\n if (isFileType && nextPreview) {\r\n return () => URL.revokeObjectURL(nextPreview);\r\n }\r\n } else {\r\n setPreviewUrl('');\r\n }\r\n\r\n return undefined;\r\n }, [item, isFileType, showImage, showVideo]);\r\n\r\n return (\r\n <div className=\"relative w-full overflow-hidden\">\r\n {isYoutubeVideo && <style>{YOUTUBE_PLAYER_STYLES}</style>}\r\n {showVideo && previewUrl ? (\r\n <div className=\"w-full rounded-lg overflow-hidden bg-black\" onClick={(event) => event.stopPropagation()}>\r\n <div className=\"aspect-video\">\r\n <MediaPlayer\r\n ref={mediaPlayerRef}\r\n title={isFileType ? (item as File).name : isYoutubeVideo ? undefined : (typeof item === 'string' ? item : undefined)}\r\n src={isYoutubeVideo ? youtubeSource : { src: previewUrl, type: isFileType ? (item as File).type : undefined }}\r\n poster={isYoutubeVideo ? youtubeThumbnail : undefined}\r\n className={`h-full w-full bg-black text-white ${\r\n isYoutubeVideo && youtubeStarted ? 'dropzone-youtube-player' : ''\r\n }`}\r\n playsInline\r\n onPlay={() => {\r\n setShowPoster(false);\r\n if (isYoutubeVideo) setYoutubeStarted(true);\r\n }}\r\n onVolumeChange={(detail) => {\r\n if (!isYoutubeVideo) return;\r\n const shouldMute = detail.volume === 0 || detail.muted;\r\n if (lastMuteStateRef.current === shouldMute) return;\r\n lastMuteStateRef.current = shouldMute;\r\n const iframe = mediaPlayerRef.current?.el?.querySelector('iframe') as HTMLIFrameElement | null;\r\n if (!iframe?.contentWindow) return;\r\n iframe.contentWindow.postMessage(\r\n JSON.stringify({ event: 'command', func: shouldMute ? 'mute' : 'unMute', args: [] }),\r\n '*'\r\n );\r\n }}\r\n >\r\n <MediaProvider />\r\n {showPoster && isYoutubeVideo && youtubeThumbnail && (\r\n <Poster\r\n className=\"absolute inset-0 h-full w-full object-cover\"\r\n src={youtubeThumbnail}\r\n alt={typeof item === 'string' ? item : ''}\r\n />\r\n )}\r\n <DefaultVideoLayout icons={defaultLayoutIcons} />\r\n </MediaPlayer>\r\n </div>\r\n </div>\r\n ) : !showVideo && previewUrl ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <img\r\n src={previewUrl}\r\n alt={fileName?.toString()}\r\n className=\"w-full h-full object-cover rounded-lg\"\r\n />\r\n </div>\r\n ) : !showVideo ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <div className=\"w-full h-full flex flex-col items-center justify-center text-gray-600\">\r\n <FileIcon size={28} />\r\n <span className=\"text-sm mt-2 break-all px-2 text-center\">\r\n {fileName?.toString()}\r\n </span>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {showVideo && !isYoutubeVideo && (\r\n <div\r\n className=\"mt-2 w-full h-auto min-h-14 rounded-[8px] border border-[#E8E9EB] bg-[#FCFCFC] p-2 flex items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0\">\r\n <Video className=\"size-6 text-[#06080D]\" />\r\n </div>\r\n\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1 justify-start\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left\">\r\n {fileName?.toString()}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left\">\r\n {fileSize}\r\n </span>\r\n </div>\r\n\r\n {!disabled && (\r\n <Button\r\n type=\"button\"\r\n color=\"secondary\"\r\n startAdornment={PencilIcon}\r\n size=\"md\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n onReplaceClick?.(event);\r\n }}\r\n >\r\n {labelReplace}\r\n </Button>\r\n )}\r\n\r\n {!disabled && (\r\n <ButtonIcon\r\n icon={Trash2}\r\n variant=\"outlined\"\r\n size=\"md\"\r\n color=\"secondary\"\r\n onClick={onRemoveClick}\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["YOUTUBE_PLAYER_STYLES","transformImageToSrc","preview","isYoutubeUrl","value","hostname","extractYoutubeId","url","searchId","pathParts","embedIndex","part","DropzoneSinglePickPreview","item","disabled","onRemoveClick","onReplaceClick","labelReplace","previewUrl","setPreviewUrl","useState","isFileType","isFile","fileName","isYoutubeVideo","useMemo","isRemoteVideo","isVideoUrl","youtubeId","youtubeSource","youtubeThumbnail","youtubeStarted","setYoutubeStarted","showPoster","setShowPoster","mediaPlayerRef","useRef","lastMuteStateRef","useEffect","showImage","showVideo","fileSize","nextPreview","jsxs","jsx","event","MediaPlayer","detail","shouldMute","iframe","MediaProvider","Poster","DefaultVideoLayout","defaultLayoutIcons","X","FileIcon","Video","Button","PencilIcon","ButtonIcon","Trash2"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneplatformdev/ui",
|
|
3
|
-
"version": "0.1.99-beta.
|
|
3
|
+
"version": "0.1.99-beta.281",
|
|
4
4
|
"description": "UI component library for OnePlatform",
|
|
5
5
|
"author": "One Platform Development Team",
|
|
6
6
|
"keywords": [
|
|
@@ -109,9 +109,9 @@
|
|
|
109
109
|
"recharts": "^3.2.0",
|
|
110
110
|
"sonner": "^2.0.7",
|
|
111
111
|
"vaul": "^1.1.2",
|
|
112
|
-
"@oneplatformdev/tokens": "^0.1.99-beta.
|
|
113
|
-
"@oneplatformdev/
|
|
114
|
-
"@oneplatformdev/
|
|
112
|
+
"@oneplatformdev/tokens": "^0.1.99-beta.281",
|
|
113
|
+
"@oneplatformdev/utils": "^0.1.99-beta.281",
|
|
114
|
+
"@oneplatformdev/hooks": "^0.1.99-beta.281"
|
|
115
115
|
},
|
|
116
116
|
"scripts": {
|
|
117
117
|
"chromatic": "chromatic"
|
package/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,.dropzone-youtube-player[data-fullscreen=false] .vds-play-button{display:none}.dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-buffering-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-loading-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,.dropzone-youtube-player[data-fullscreen=false] .vds-spinner{display:none}
|
|
1
|
+
.dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,.dropzone-youtube-player[data-fullscreen=false] .vds-play-button{display:none!important}.dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-buffering-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-loading-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,.dropzone-youtube-player[data-fullscreen=false] .vds-spinner{display:none!important}
|