sanity-plugin-mux-input 2.0.17 → 2.1.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.
Files changed (36) hide show
  1. package/lib/_chunks/Player-d8f163ed.cjs +474 -0
  2. package/lib/_chunks/Player-d8f163ed.cjs.map +1 -0
  3. package/lib/_chunks/Player-fb9712c0.js +465 -0
  4. package/lib/_chunks/Player-fb9712c0.js.map +1 -0
  5. package/lib/_chunks/index-0656ede8.js +3229 -0
  6. package/lib/_chunks/index-0656ede8.js.map +1 -0
  7. package/lib/_chunks/index-9cd542f1.cjs +3271 -0
  8. package/lib/_chunks/index-9cd542f1.cjs.map +1 -0
  9. package/lib/index.cjs +1 -1
  10. package/lib/index.d.ts +97 -0
  11. package/lib/index.js +1 -1
  12. package/package.json +7 -8
  13. package/src/components/Input.tsx +34 -29
  14. package/src/components/__legacy__Uploader.tsx +7 -2
  15. package/src/index.ts +8 -49
  16. package/src/plugin.tsx +31 -0
  17. package/src/schema.tsx +42 -0
  18. package/lib/_chunks/Input-1b053a16.js +0 -189
  19. package/lib/_chunks/Input-1b053a16.js.map +0 -1
  20. package/lib/_chunks/Input-42aef09c.cjs +0 -189
  21. package/lib/_chunks/Input-42aef09c.cjs.map +0 -1
  22. package/lib/_chunks/Preview-22ff2e4a.cjs +0 -28
  23. package/lib/_chunks/Preview-22ff2e4a.cjs.map +0 -1
  24. package/lib/_chunks/Preview-af721846.js +0 -26
  25. package/lib/_chunks/Preview-af721846.js.map +0 -1
  26. package/lib/_chunks/VideoSource.styled-81ae8d6c.js +0 -318
  27. package/lib/_chunks/VideoSource.styled-81ae8d6c.js.map +0 -1
  28. package/lib/_chunks/VideoSource.styled-dda7be42.cjs +0 -336
  29. package/lib/_chunks/VideoSource.styled-dda7be42.cjs.map +0 -1
  30. package/lib/_chunks/index-376871b4.js +0 -248
  31. package/lib/_chunks/index-376871b4.js.map +0 -1
  32. package/lib/_chunks/index-3999f947.cjs +0 -265
  33. package/lib/_chunks/index-3999f947.cjs.map +0 -1
  34. package/src/components/FormInput.tsx +0 -26
  35. package/src/components/FormPreview.tsx +0 -19
  36. package/src/components/Preview.tsx +0 -33
@@ -0,0 +1,474 @@
1
+ 'use strict';
2
+
3
+ var _templateObject, _templateObject2, _templateObject3;
4
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var MuxVideo = require('@mux/mux-video-react');
7
+ var ui = require('@sanity/ui');
8
+ var react = require('media-chrome/dist/react');
9
+ var React = require('react');
10
+ var sanity = require('sanity');
11
+ var index = require('./index-9cd542f1.cjs');
12
+ var useDevicePixelRatio = require('use-device-pixel-ratio');
13
+ var styled = require('styled-components');
14
+ function _interopDefaultCompat(e) {
15
+ return e && typeof e === 'object' && 'default' in e ? e : {
16
+ default: e
17
+ };
18
+ }
19
+ var MuxVideo__default = /*#__PURE__*/_interopDefaultCompat(MuxVideo);
20
+ var styled__default = /*#__PURE__*/_interopDefaultCompat(styled);
21
+ const useCancelUpload = (asset, onChange) => {
22
+ const client = index.useClient();
23
+ return React.useCallback(() => {
24
+ if (!asset) {
25
+ return;
26
+ }
27
+ onChange(sanity.PatchEvent.from(sanity.unset()));
28
+ if (asset.assetId) {
29
+ index.deleteAsset(client, asset.assetId);
30
+ }
31
+ if (asset._id) {
32
+ client.delete(asset._id);
33
+ }
34
+ }, [asset, client, onChange]);
35
+ };
36
+ function getVideoSrc(_ref) {
37
+ let {
38
+ asset,
39
+ client
40
+ } = _ref;
41
+ const playbackId = index.getPlaybackId(asset);
42
+ const searchParams = new URLSearchParams();
43
+ if (index.getPlaybackPolicy(asset) === "signed") {
44
+ const token = index.generateJwt(client, playbackId, "v");
45
+ searchParams.set("token", token);
46
+ }
47
+ return "https://stream.mux.com/".concat(playbackId, ".m3u8?").concat(searchParams);
48
+ }
49
+ var name = "sanity-plugin-mux-input";
50
+ var version = "2.1.0";
51
+ var description = "An input component that integrates Sanity Studio with Mux video encoding/hosting service.";
52
+ var keywords = ["sanity", "video", "mux", "input", "plugin", "sanity-plugin", "media"];
53
+ var homepage = "https://github.com/sanity-io/sanity-plugin-mux-input#readme";
54
+ var bugs = {
55
+ url: "https://github.com/sanity-io/sanity-plugin-mux-input/issues"
56
+ };
57
+ var repository = {
58
+ type: "git",
59
+ url: "git@github.com:sanity-io/sanity-plugin-mux-input.git"
60
+ };
61
+ var license = "MIT";
62
+ var author = "Sanity.io <hello@sanity.io>";
63
+ var sideEffects = false;
64
+ var type = "module";
65
+ var exports$1 = {
66
+ ".": {
67
+ types: "./lib/index.d.ts",
68
+ source: "./src/index.ts",
69
+ require: "./lib/index.cjs",
70
+ node: {
71
+ "import": "./lib/index.cjs.js",
72
+ require: "./lib/index.cjs"
73
+ },
74
+ "import": "./lib/index.js",
75
+ "default": "./lib/index.js"
76
+ },
77
+ "./package.json": "./package.json"
78
+ };
79
+ var main = "./lib/index.cjs";
80
+ var module$1 = "./lib/index.js";
81
+ var source = "./src/index.ts";
82
+ var types = "./lib/index.d.ts";
83
+ var files = ["src", "lib", "sanity.json", "v2-incompatible.js"];
84
+ var scripts = {
85
+ build: "run-s clean && plugin-kit verify-package --silent && pkg-utils build --strict && pkg-utils --strict",
86
+ clean: "rimraf lib",
87
+ dev: "next dev",
88
+ format: "prettier --write --cache --ignore-unknown .",
89
+ "link-watch": "plugin-kit link-watch",
90
+ lint: "eslint .",
91
+ prepare: "husky install || true",
92
+ prepublishOnly: "run-s build",
93
+ test: "npm run lint && npm run type-check && npm run build",
94
+ "type-check": "tsc --noEmit",
95
+ watch: "pkg-utils watch --strict"
96
+ };
97
+ var dependencies = {
98
+ "@mux/mux-video-react": "^0.7.7",
99
+ "@mux/upchunk": "^3",
100
+ "@sanity/icons": "^2",
101
+ "@sanity/incompatible-plugin": "^1",
102
+ "@sanity/ui": "^1",
103
+ "@sanity/uuid": "^3",
104
+ classnames: "^2.3.2",
105
+ "jsonwebtoken-esm": "^1.0.5",
106
+ "media-chrome": "^0.21.0",
107
+ motion: "^10",
108
+ rxjs: "^7",
109
+ "scroll-into-view-if-needed": "^3",
110
+ "suspend-react": "^0.0.10",
111
+ swr: "^2.1.0",
112
+ "use-device-pixel-ratio": "^1.1.2",
113
+ "use-error-boundary": "^2.0.6"
114
+ };
115
+ var devDependencies = {
116
+ "@commitlint/cli": "^17.4.4",
117
+ "@commitlint/config-conventional": "^17.4.4",
118
+ "@sanity/pkg-utils": "^2.2.13",
119
+ "@sanity/plugin-kit": "^3.1.7",
120
+ "@sanity/semantic-release-preset": "^4.0.0",
121
+ "@sanity/vision": "^3.6.0",
122
+ "@types/react": "^18.0.28",
123
+ "@types/styled-components": "^5.1.26",
124
+ "@typescript-eslint/eslint-plugin": "^5.54.1",
125
+ "@typescript-eslint/parser": "^5.54.1",
126
+ "cz-conventional-changelog": "^3.3.0",
127
+ eslint: "^8.36.0",
128
+ "eslint-config-prettier": "^8.7.0",
129
+ "eslint-config-react-app": "^7.0.1",
130
+ "eslint-config-sanity": "^6.0.0",
131
+ "eslint-plugin-import": "^2.27.5",
132
+ "eslint-plugin-prettier": "^4.2.1",
133
+ "eslint-plugin-react": "^7.32.2",
134
+ "eslint-plugin-react-hooks": "^4.6.0",
135
+ "eslint-plugin-simple-import-sort": "^10.0.0",
136
+ husky: "^8.0.3",
137
+ "lint-staged": "^13.2.0",
138
+ next: "^13.2.4",
139
+ "next-sanity": "^4.1.5",
140
+ "npm-run-all": "^4.1.5",
141
+ prettier: "^2.8.4",
142
+ "prettier-plugin-packagejson": "^2.4.3",
143
+ react: "^18.2.0",
144
+ "react-dom": "^18.2.0",
145
+ "react-is": "^18.2.0",
146
+ rimraf: "^5.0.0",
147
+ sanity: "^3.6.0",
148
+ "styled-components": "^5.3.9",
149
+ "type-fest": "^3.6.1",
150
+ typescript: "^5.0.2"
151
+ };
152
+ var peerDependencies = {
153
+ react: "^18",
154
+ sanity: "^3",
155
+ "styled-components": "^5.2"
156
+ };
157
+ var engines = {
158
+ node: ">=14"
159
+ };
160
+ var publishConfig = {
161
+ access: "public"
162
+ };
163
+ var sanityExchangeUrl = "https://www.sanity.io/plugins/sanity-plugin-mux-input";
164
+ var pluginPkg = {
165
+ name: name,
166
+ version: version,
167
+ description: description,
168
+ keywords: keywords,
169
+ homepage: homepage,
170
+ bugs: bugs,
171
+ repository: repository,
172
+ license: license,
173
+ author: author,
174
+ sideEffects: sideEffects,
175
+ type: type,
176
+ exports: exports$1,
177
+ main: main,
178
+ module: module$1,
179
+ source: source,
180
+ types: types,
181
+ files: files,
182
+ scripts: scripts,
183
+ dependencies: dependencies,
184
+ devDependencies: devDependencies,
185
+ peerDependencies: peerDependencies,
186
+ engines: engines,
187
+ publishConfig: publishConfig,
188
+ sanityExchangeUrl: sanityExchangeUrl
189
+ };
190
+ function EditThumbnailDialog(_ref2) {
191
+ let {
192
+ asset,
193
+ getCurrentTime,
194
+ setDialogState
195
+ } = _ref2;
196
+ const client = index.useClient();
197
+ const dialogId = "EditThumbnailDialog".concat(React.useId());
198
+ const nextTime = React.useMemo(() => getCurrentTime(), [getCurrentTime]);
199
+ const assetWithNewThumbnail = React.useMemo(() => ({
200
+ ...asset,
201
+ thumbTime: nextTime
202
+ }), [asset, nextTime]);
203
+ const [saving, setSaving] = React.useState(false);
204
+ const [error, setError] = React.useState(null);
205
+ const handleSave = React.useCallback(() => {
206
+ setSaving(true);
207
+ client.patch(asset._id).set({
208
+ thumbTime: nextTime
209
+ }).commit({
210
+ returnDocuments: false
211
+ }).then(() => void setDialogState(false)).catch(setError).finally(() => void setSaving(false));
212
+ }, [client, asset._id, nextTime, setDialogState]);
213
+ const width = 300 * useDevicePixelRatio.getDevicePixelRatio({
214
+ maxDpr: 2
215
+ });
216
+ if (error) {
217
+ throw error;
218
+ }
219
+ return /* @__PURE__ */jsxRuntime.jsx(ui.Dialog, {
220
+ id: dialogId,
221
+ header: "Edit thumbnail",
222
+ onClose: () => setDialogState(false),
223
+ footer: /* @__PURE__ */jsxRuntime.jsx(ui.Stack, {
224
+ padding: 3,
225
+ children: /* @__PURE__ */jsxRuntime.jsx(ui.Button, {
226
+ mode: "ghost",
227
+ tone: "primary",
228
+ loading: saving,
229
+ onClick: handleSave,
230
+ text: "Set new thumbnail"
231
+ }, "thumbnail")
232
+ }),
233
+ children: /* @__PURE__ */jsxRuntime.jsxs(ui.Stack, {
234
+ space: 3,
235
+ padding: 3,
236
+ children: [/* @__PURE__ */jsxRuntime.jsxs(ui.Stack, {
237
+ space: 2,
238
+ children: [/* @__PURE__ */jsxRuntime.jsx(ui.Text, {
239
+ size: 1,
240
+ weight: "semibold",
241
+ children: "Current:"
242
+ }), /* @__PURE__ */jsxRuntime.jsx(index.VideoThumbnail, {
243
+ asset,
244
+ width
245
+ })]
246
+ }), /* @__PURE__ */jsxRuntime.jsxs(ui.Stack, {
247
+ space: 2,
248
+ children: [/* @__PURE__ */jsxRuntime.jsx(ui.Text, {
249
+ size: 1,
250
+ weight: "semibold",
251
+ children: "New:"
252
+ }), /* @__PURE__ */jsxRuntime.jsx(index.VideoThumbnail, {
253
+ asset: assetWithNewThumbnail,
254
+ width
255
+ })]
256
+ })]
257
+ })
258
+ });
259
+ }
260
+ function getStoryboardSrc(_ref3) {
261
+ let {
262
+ asset,
263
+ client
264
+ } = _ref3;
265
+ const playbackId = index.getPlaybackId(asset);
266
+ const searchParams = new URLSearchParams();
267
+ if (index.getPlaybackPolicy(asset) === "signed") {
268
+ const token = index.generateJwt(client, playbackId, "s");
269
+ searchParams.set("token", token);
270
+ }
271
+ return "https://image.mux.com/".concat(playbackId, "/storyboard.vtt?").concat(searchParams);
272
+ }
273
+ const VideoContainer = styled__default.default(ui.Card)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n min-height: 150px;\n aspect-ratio: 16 / 9;\n overflow: hidden;\n border-radius: 1px;\n media-airplay-button[media-airplay-unavailable] {\n display: none;\n }\n media-volume-range[media-volume-unavailable] {\n display: none;\n }\n media-pip-button[media-pip-unavailable] {\n display: none;\n }\n media-controller {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n --media-range-track-background-color: rgba(255, 255, 255, 0.5);\n --media-range-track-border-radius: 3px;\n width: 100%;\n height: 100%;\n background-color: transparent;\n }\n media-control-bar {\n --media-button-icon-width: 18px;\n --media-preview-time-margin: 0px;\n }\n media-control-bar:not([slot]) :is([role='button'], [role='switch'], button) {\n height: 44px;\n }\n .size-extra-small media-control-bar [role='button'],\n .size-extra-small media-control-bar [role='switch'] {\n height: auto;\n padding: 4.4% 3.2%;\n }\n .mxp-spacer {\n flex-grow: 1;\n height: 100%;\n background-color: var(--media-control-background, rgba(20, 20, 30, 0.7));\n }\n media-controller::part(vertical-layer) {\n transition: background-color 1s;\n }\n media-controller:is([media-paused], :not([user-inactive]))::part(vertical-layer) {\n background-color: rgba(0, 0, 0, 0.6);\n transition: background-color 0.25s;\n }\n .mxp-center-controls {\n --media-background-color: transparent;\n --media-button-icon-width: 100%;\n --media-button-icon-height: auto;\n pointer-events: none;\n width: 100%;\n display: flex;\n flex-flow: row;\n align-items: center;\n justify-content: center;\n }\n .mxp-center-controls media-play-button {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n padding: 0;\n width: max(27px, min(9%, 90px));\n }\n .mxp-center-controls media-seek-backward-button,\n .mxp-center-controls media-seek-forward-button {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n padding: 0;\n margin: 0 10%;\n width: min(7%, 70px);\n }\n media-loading-indicator {\n --media-loading-icon-width: 100%;\n --media-button-icon-height: auto;\n pointer-events: none;\n position: absolute;\n width: min(15%, 150px);\n display: flex;\n flex-flow: row;\n align-items: center;\n justify-content: center;\n }\n /* Intentionally don't target the div for transition but the children\n of the div. Prevents messing with media-chrome's autohide feature. */\n media-loading-indicator + div * {\n transition: opacity 0.15s;\n opacity: 1;\n }\n media-loading-indicator[media-loading]:not([media-paused]) ~ div > * {\n opacity: 0;\n transition-delay: 400ms;\n }\n media-volume-range {\n width: min(100%, 100px);\n }\n media-time-display {\n white-space: nowrap;\n }\n :is(media-time-display, media-text-display, media-playback-rate-button) {\n color: inherit;\n }\n media-controller:fullscreen media-control-bar[slot='top-chrome'] {\n /* Hide menus and buttons that trigger modals when in full-screen */\n display: none;\n }\n video {\n background: transparent;\n }\n media-controller:not(:fullscreen) video {\n aspect-ratio: 16 / 9;\n }\n media-controller:not(:-webkit-full-screen) video {\n aspect-ratio: 16 / 9;\n }\n"])));
274
+ const StyledCenterControls = styled__default.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n && {\n --media-background-color: transparent;\n --media-button-icon-width: 100%;\n --media-button-icon-height: auto;\n pointer-events: none;\n width: 100%;\n display: flex;\n flex-flow: row;\n align-items: center;\n justify-content: center;\n media-play-button {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n padding: 0;\n width: max(27px, min(9%, 90px));\n }\n }\n"])));
275
+ const TopControls = styled__default.default(react.MediaControlBar)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n justify-content: flex-end;\n button {\n height: auto;\n }\n"])));
276
+ function PosterImage(_ref4) {
277
+ let {
278
+ asset
279
+ } = _ref4;
280
+ const client = index.useClient();
281
+ const ref = React.useRef(null);
282
+ const src = React.useMemo(() => index.getPosterSrc({
283
+ client,
284
+ asset,
285
+ width: 1920,
286
+ height: 1080
287
+ }), [client, asset]);
288
+ React.useEffect(() => {
289
+ var _a;
290
+ if (ref.current) {
291
+ const style = document.createElement("style");
292
+ style.innerHTML = "img { object-fit: contain; }";
293
+ if ((_a = ref.current) == null ? void 0 : _a.shadowRoot) {
294
+ ref.current.shadowRoot.appendChild(style);
295
+ }
296
+ }
297
+ }, []);
298
+ return /* @__PURE__ */jsxRuntime.jsx(react.MediaPosterImage, {
299
+ ref,
300
+ slot: "poster",
301
+ src
302
+ });
303
+ }
304
+ function ThumbnailsMetadataTrack(_ref5) {
305
+ let {
306
+ asset
307
+ } = _ref5;
308
+ const client = index.useClient();
309
+ const [src] = React.useState(() => getStoryboardSrc({
310
+ asset,
311
+ client
312
+ }));
313
+ return /* @__PURE__ */jsxRuntime.jsx("track", {
314
+ label: "thumbnails",
315
+ default: true,
316
+ kind: "metadata",
317
+ src
318
+ });
319
+ }
320
+ const MuxVideoOld = _ref6 => {
321
+ let {
322
+ asset,
323
+ buttons,
324
+ readOnly,
325
+ onChange,
326
+ dialogState,
327
+ setDialogState
328
+ } = _ref6;
329
+ var _a, _b, _c, _d;
330
+ const client = index.useClient();
331
+ const isLoading = React.useMemo(() => {
332
+ if ((asset == null ? void 0 : asset.status) === "preparing") {
333
+ return "Preparing the video";
334
+ }
335
+ if ((asset == null ? void 0 : asset.status) === "waiting_for_upload") {
336
+ return "Waiting for upload to start";
337
+ }
338
+ if ((asset == null ? void 0 : asset.status) === "waiting") {
339
+ return "Processing upload";
340
+ }
341
+ if ((asset == null ? void 0 : asset.status) === "ready") {
342
+ return false;
343
+ }
344
+ if (typeof (asset == null ? void 0 : asset.status) === "undefined") {
345
+ return false;
346
+ }
347
+ return true;
348
+ }, [asset]);
349
+ const isPreparingStaticRenditions = React.useMemo(() => {
350
+ var _a2, _b2, _c2, _d2;
351
+ if (((_b2 = (_a2 = asset == null ? void 0 : asset.data) == null ? void 0 : _a2.static_renditions) == null ? void 0 : _b2.status) === "preparing") {
352
+ return true;
353
+ }
354
+ if (((_d2 = (_c2 = asset == null ? void 0 : asset.data) == null ? void 0 : _c2.static_renditions) == null ? void 0 : _d2.status) === "ready") {
355
+ return false;
356
+ }
357
+ return false;
358
+ }, [(_b = (_a = asset == null ? void 0 : asset.data) == null ? void 0 : _a.static_renditions) == null ? void 0 : _b.status]);
359
+ const videoSrc = React.useMemo(() => asset.playbackId && getVideoSrc({
360
+ client,
361
+ asset
362
+ }), [asset, client]);
363
+ const [error, setError] = React.useState(null);
364
+ const handleError = React.useCallback(event => setError(event.currentTarget.error), []);
365
+ const playRef = React.useRef(null);
366
+ const muteRef = React.useRef(null);
367
+ const video = React.useRef(null);
368
+ const getCurrentTime = React.useCallback(() => {
369
+ var _a2, _b2;
370
+ return (_b2 = (_a2 = video.current) == null ? void 0 : _a2.currentTime) != null ? _b2 : 0;
371
+ }, [video]);
372
+ const handleCancelUpload = useCancelUpload(asset, onChange);
373
+ React.useEffect(() => {
374
+ var _a2, _b2;
375
+ const style = document.createElement("style");
376
+ style.innerHTML = "button svg { vertical-align: middle; }";
377
+ if ((_a2 = playRef.current) == null ? void 0 : _a2.shadowRoot) {
378
+ playRef.current.shadowRoot.appendChild(style);
379
+ }
380
+ if ((_b2 = muteRef == null ? void 0 : muteRef.current) == null ? void 0 : _b2.shadowRoot) {
381
+ muteRef.current.shadowRoot.appendChild(style.cloneNode(true));
382
+ }
383
+ }, []);
384
+ React.useEffect(() => {
385
+ var _a2, _b2, _c2;
386
+ if ((asset == null ? void 0 : asset.status) === "errored") {
387
+ handleCancelUpload();
388
+ throw new Error((_c2 = (_b2 = (_a2 = asset.data) == null ? void 0 : _a2.errors) == null ? void 0 : _b2.messages) == null ? void 0 : _c2.join(" "));
389
+ }
390
+ }, [(_d = (_c = asset.data) == null ? void 0 : _c.errors) == null ? void 0 : _d.messages, asset == null ? void 0 : asset.status, handleCancelUpload]);
391
+ const signedToken = React.useMemo(() => {
392
+ try {
393
+ const url = new URL(videoSrc);
394
+ return url.searchParams.get("token");
395
+ } catch {
396
+ return false;
397
+ }
398
+ }, [videoSrc]);
399
+ if (error) {
400
+ throw error;
401
+ }
402
+ if (!asset || !asset.status) {
403
+ return null;
404
+ }
405
+ if (isLoading) {
406
+ return /* @__PURE__ */jsxRuntime.jsx(index.UploadProgress, {
407
+ progress: 100,
408
+ filename: asset == null ? void 0 : asset.filename,
409
+ text: isLoading !== true && isLoading || "Waiting for Mux to complete the file",
410
+ onCancel: readOnly ? void 0 : () => handleCancelUpload()
411
+ });
412
+ }
413
+ return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, {
414
+ children: [/* @__PURE__ */jsxRuntime.jsxs(VideoContainer, {
415
+ shadow: 1,
416
+ tone: "transparent",
417
+ scheme: "dark",
418
+ children: [/* @__PURE__ */jsxRuntime.jsxs(react.MediaController, {
419
+ children: [/* @__PURE__ */jsxRuntime.jsx(MuxVideo__default.default, {
420
+ playsInline: true,
421
+ ref: video,
422
+ playbackId: "".concat(asset.playbackId).concat(signedToken ? "?token=".concat(signedToken) : ""),
423
+ onError: handleError,
424
+ slot: "media",
425
+ preload: "metadata",
426
+ crossOrigin: "anonymous",
427
+ metadata: {
428
+ player_name: "Sanity Admin Dashboard",
429
+ player_version: pluginPkg.version,
430
+ page_type: "Preview Player"
431
+ },
432
+ children: /* @__PURE__ */jsxRuntime.jsx(ThumbnailsMetadataTrack, {
433
+ asset
434
+ })
435
+ }), /* @__PURE__ */jsxRuntime.jsx(PosterImage, {
436
+ asset
437
+ }), /* @__PURE__ */jsxRuntime.jsx(react.MediaLoadingIndicator, {
438
+ slot: "centered-chrome",
439
+ noAutoHide: true
440
+ }), /* @__PURE__ */jsxRuntime.jsx(StyledCenterControls, {
441
+ slot: "centered-chrome",
442
+ children: /* @__PURE__ */jsxRuntime.jsx(react.MediaPlayButton, {})
443
+ }), buttons && /* @__PURE__ */jsxRuntime.jsx(TopControls, {
444
+ slot: "top-chrome",
445
+ children: buttons
446
+ }), /* @__PURE__ */jsxRuntime.jsxs(react.MediaControlBar, {
447
+ children: [/* @__PURE__ */jsxRuntime.jsx(react.MediaMuteButton, {}), /* @__PURE__ */jsxRuntime.jsx(react.MediaTimeDisplay, {}), /* @__PURE__ */jsxRuntime.jsx(react.MediaTimeRange, {}), /* @__PURE__ */jsxRuntime.jsx(react.MediaDurationDisplay, {}), /* @__PURE__ */jsxRuntime.jsx(react.MediaFullscreenButton, {})]
448
+ })]
449
+ }), isPreparingStaticRenditions && /* @__PURE__ */jsxRuntime.jsx(ui.Card, {
450
+ padding: 2,
451
+ radius: 1,
452
+ style: {
453
+ background: "var(--card-fg-color)",
454
+ position: "absolute",
455
+ top: "0.5em",
456
+ left: "0.5em"
457
+ },
458
+ children: /* @__PURE__ */jsxRuntime.jsx(ui.Text, {
459
+ size: 1,
460
+ style: {
461
+ color: "var(--card-bg-color)"
462
+ },
463
+ children: "MUX is preparing static renditions, please stand by"
464
+ })
465
+ })]
466
+ }), dialogState === "edit-thumbnail" && /* @__PURE__ */jsxRuntime.jsx(EditThumbnailDialog, {
467
+ asset,
468
+ getCurrentTime,
469
+ setDialogState
470
+ })]
471
+ });
472
+ };
473
+ exports.default = MuxVideoOld;
474
+ //# sourceMappingURL=Player-d8f163ed.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Player-d8f163ed.cjs","sources":["../../src/hooks/useCancelUpload.ts","../../src/util/getVideoSrc.ts","../../src/components/EditThumbnailDialog.tsx","../../src/util/getStoryboardSrc.ts","../../src/components/Player.styled.tsx","../../src/components/Player.tsx"],"sourcesContent":["import {useCallback} from 'react'\nimport {PatchEvent, unset} from 'sanity'\n\nimport {deleteAsset} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\n\nexport const useCancelUpload = (asset: VideoAssetDocument, onChange: MuxInputProps['onChange']) => {\n const client = useClient()\n return useCallback(() => {\n if (!asset) {\n return\n }\n onChange(PatchEvent.from(unset()))\n if (asset.assetId) {\n deleteAsset(client, asset.assetId)\n }\n if (asset._id) {\n client.delete(asset._id)\n }\n }, [asset, client, onChange])\n}\n","import type {SanityClient} from 'sanity'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxVideoUrl, VideoAssetDocument} from './types'\n\ninterface VideoSrcOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getVideoSrc({asset, client}: VideoSrcOptions): MuxVideoUrl {\n const playbackId = getPlaybackId(asset)\n const searchParams = new URLSearchParams()\n\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 'v')\n searchParams.set('token', token)\n }\n\n return `https://stream.mux.com/${playbackId}.m3u8?${searchParams}`\n}\n","import {Button, Dialog, Stack, Text} from '@sanity/ui'\nimport React, {useCallback, useId, useMemo, useState} from 'react'\nimport {getDevicePixelRatio} from 'use-device-pixel-ratio'\n\nimport {useClient} from '../hooks/useClient'\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport type {VideoAssetDocument} from '../util/types'\nimport {VideoThumbnail} from './VideoSource.styled'\n\nexport interface Props {\n asset: VideoAssetDocument\n getCurrentTime: () => number\n setDialogState: SetDialogState\n}\nexport default function EditThumbnailDialog({asset, getCurrentTime, setDialogState}: Props) {\n const client = useClient()\n const dialogId = `EditThumbnailDialog${useId()}`\n const nextTime = useMemo(() => getCurrentTime(), [getCurrentTime])\n const assetWithNewThumbnail = useMemo(() => ({...asset, thumbTime: nextTime}), [asset, nextTime])\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const handleSave = useCallback(() => {\n setSaving(true)\n client\n .patch(asset._id!)\n .set({thumbTime: nextTime})\n .commit({returnDocuments: false})\n .then(() => void setDialogState(false))\n .catch(setError)\n .finally(() => void setSaving(false))\n }, [client, asset._id, nextTime, setDialogState])\n const width = 300 * getDevicePixelRatio({maxDpr: 2})\n\n if (error) {\n // eslint-disable-next-line no-warning-comments\n // @TODO handle errors more gracefully\n throw error\n }\n\n return (\n <Dialog\n id={dialogId}\n header=\"Edit thumbnail\"\n onClose={() => setDialogState(false)}\n footer={\n <Stack padding={3}>\n <Button\n key=\"thumbnail\"\n mode=\"ghost\"\n tone=\"primary\"\n loading={saving}\n onClick={handleSave}\n text=\"Set new thumbnail\"\n />\n </Stack>\n }\n >\n <Stack space={3} padding={3}>\n <Stack space={2}>\n <Text size={1} weight=\"semibold\">\n Current:\n </Text>\n <VideoThumbnail asset={asset} width={width} />\n </Stack>\n <Stack space={2}>\n <Text size={1} weight=\"semibold\">\n New:\n </Text>\n <VideoThumbnail asset={assetWithNewThumbnail} width={width} />\n </Stack>\n </Stack>\n </Dialog>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxStoryboardUrl, VideoAssetDocument} from './types'\n\ninterface StoryboardSrcOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getStoryboardSrc({asset, client}: StoryboardSrcOptions): MuxStoryboardUrl {\n const playbackId = getPlaybackId(asset)\n const searchParams = new URLSearchParams()\n\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 's')\n searchParams.set('token', token)\n }\n\n return `https://image.mux.com/${playbackId}/storyboard.vtt?${searchParams}`\n}\n","import {Card} from '@sanity/ui'\nimport {MediaControlBar, MediaPosterImage} from 'media-chrome/dist/react'\nimport React, {useEffect, useMemo, useRef, useState} from 'react'\nimport styled from 'styled-components'\n\nimport {useClient} from '../hooks/useClient'\nimport {getPosterSrc} from '../util/getPosterSrc'\nimport {getStoryboardSrc} from '../util/getStoryboardSrc'\nimport type {VideoAssetDocument} from '../util/types'\n\nexport const VideoContainer = styled(Card)`\n position: relative;\n min-height: 150px;\n aspect-ratio: 16 / 9;\n overflow: hidden;\n border-radius: 1px;\n media-airplay-button[media-airplay-unavailable] {\n display: none;\n }\n media-volume-range[media-volume-unavailable] {\n display: none;\n }\n media-pip-button[media-pip-unavailable] {\n display: none;\n }\n media-controller {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n --media-range-track-background-color: rgba(255, 255, 255, 0.5);\n --media-range-track-border-radius: 3px;\n width: 100%;\n height: 100%;\n background-color: transparent;\n }\n media-control-bar {\n --media-button-icon-width: 18px;\n --media-preview-time-margin: 0px;\n }\n media-control-bar:not([slot]) :is([role='button'], [role='switch'], button) {\n height: 44px;\n }\n .size-extra-small media-control-bar [role='button'],\n .size-extra-small media-control-bar [role='switch'] {\n height: auto;\n padding: 4.4% 3.2%;\n }\n .mxp-spacer {\n flex-grow: 1;\n height: 100%;\n background-color: var(--media-control-background, rgba(20, 20, 30, 0.7));\n }\n media-controller::part(vertical-layer) {\n transition: background-color 1s;\n }\n media-controller:is([media-paused], :not([user-inactive]))::part(vertical-layer) {\n background-color: rgba(0, 0, 0, 0.6);\n transition: background-color 0.25s;\n }\n .mxp-center-controls {\n --media-background-color: transparent;\n --media-button-icon-width: 100%;\n --media-button-icon-height: auto;\n pointer-events: none;\n width: 100%;\n display: flex;\n flex-flow: row;\n align-items: center;\n justify-content: center;\n }\n .mxp-center-controls media-play-button {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n padding: 0;\n width: max(27px, min(9%, 90px));\n }\n .mxp-center-controls media-seek-backward-button,\n .mxp-center-controls media-seek-forward-button {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n padding: 0;\n margin: 0 10%;\n width: min(7%, 70px);\n }\n media-loading-indicator {\n --media-loading-icon-width: 100%;\n --media-button-icon-height: auto;\n pointer-events: none;\n position: absolute;\n width: min(15%, 150px);\n display: flex;\n flex-flow: row;\n align-items: center;\n justify-content: center;\n }\n /* Intentionally don't target the div for transition but the children\n of the div. Prevents messing with media-chrome's autohide feature. */\n media-loading-indicator + div * {\n transition: opacity 0.15s;\n opacity: 1;\n }\n media-loading-indicator[media-loading]:not([media-paused]) ~ div > * {\n opacity: 0;\n transition-delay: 400ms;\n }\n media-volume-range {\n width: min(100%, 100px);\n }\n media-time-display {\n white-space: nowrap;\n }\n :is(media-time-display, media-text-display, media-playback-rate-button) {\n color: inherit;\n }\n media-controller:fullscreen media-control-bar[slot='top-chrome'] {\n /* Hide menus and buttons that trigger modals when in full-screen */\n display: none;\n }\n video {\n background: transparent;\n }\n media-controller:not(:fullscreen) video {\n aspect-ratio: 16 / 9;\n }\n media-controller:not(:-webkit-full-screen) video {\n aspect-ratio: 16 / 9;\n }\n`\n\nexport const StyledCenterControls = styled.div`\n && {\n --media-background-color: transparent;\n --media-button-icon-width: 100%;\n --media-button-icon-height: auto;\n pointer-events: none;\n width: 100%;\n display: flex;\n flex-flow: row;\n align-items: center;\n justify-content: center;\n media-play-button {\n --media-control-background: transparent;\n --media-control-hover-background: transparent;\n padding: 0;\n width: max(27px, min(9%, 90px));\n }\n }\n`\n\nexport const TopControls = styled(MediaControlBar)`\n justify-content: flex-end;\n button {\n height: auto;\n }\n`\n\nexport interface PosterImageProps {\n asset: VideoAssetDocument\n}\nexport function PosterImage({asset}: PosterImageProps) {\n const client = useClient()\n const ref = useRef<HTMLElement>(null)\n const src = useMemo(\n () => getPosterSrc({client, asset, width: 1920, height: 1080}),\n [client, asset]\n )\n\n useEffect(() => {\n if (ref.current) {\n const style = document.createElement('style')\n style.innerHTML = 'img { object-fit: contain; }'\n if (ref.current?.shadowRoot) {\n ref.current.shadowRoot.appendChild(style)\n }\n }\n }, [])\n\n return <MediaPosterImage ref={ref} slot=\"poster\" src={src} />\n}\n\nexport interface ThumbnailsMetadataTrackProps {\n asset: VideoAssetDocument\n}\nexport function ThumbnailsMetadataTrack({asset}: ThumbnailsMetadataTrackProps) {\n const client = useClient()\n // Why useState instead of useMemo? Because we really really only want to run it exactly once and useMemo doesn't make that guarantee\n const [src] = useState<string>(() => getStoryboardSrc({asset, client}))\n\n return <track label=\"thumbnails\" default kind=\"metadata\" src={src} />\n}\n","import MuxVideo from '@mux/mux-video-react'\nimport {Card, Text} from '@sanity/ui'\nimport {\n MediaControlBar,\n MediaController,\n MediaDurationDisplay,\n MediaFullscreenButton,\n MediaLoadingIndicator,\n MediaMuteButton,\n MediaPlayButton,\n MediaTimeDisplay,\n MediaTimeRange,\n} from 'media-chrome/dist/react'\nimport React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport {useCancelUpload} from '../hooks/useCancelUpload'\nimport {useClient} from '../hooks/useClient'\nimport type {DialogState, SetDialogState} from '../hooks/useDialogState'\nimport {getVideoSrc} from '../util/getVideoSrc'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\nimport pluginPkg from './../../package.json'\nimport EditThumbnailDialog from './EditThumbnailDialog'\nimport {\n PosterImage,\n StyledCenterControls,\n ThumbnailsMetadataTrack,\n TopControls,\n VideoContainer,\n} from './Player.styled'\nimport {UploadProgress} from './UploadProgress'\n\ninterface Props extends Pick<MuxInputProps, 'onChange' | 'readOnly'> {\n buttons?: React.ReactNode\n asset: VideoAssetDocument\n dialogState: DialogState\n setDialogState: SetDialogState\n}\n\nconst MuxVideoOld = ({asset, buttons, readOnly, onChange, dialogState, setDialogState}: Props) => {\n const client = useClient()\n const isLoading = useMemo<boolean | string>(() => {\n if (asset?.status === 'preparing') {\n return 'Preparing the video'\n }\n if (asset?.status === 'waiting_for_upload') {\n return 'Waiting for upload to start'\n }\n if (asset?.status === 'waiting') {\n return 'Processing upload'\n }\n if (asset?.status === 'ready') {\n return false\n }\n if (typeof asset?.status === 'undefined') {\n return false\n }\n\n return true\n }, [asset])\n const isPreparingStaticRenditions = useMemo<boolean>(() => {\n if (asset?.data?.static_renditions?.status === 'preparing') {\n return true\n }\n if (asset?.data?.static_renditions?.status === 'ready') {\n return false\n }\n return false\n }, [asset?.data?.static_renditions?.status])\n const videoSrc = useMemo(() => asset.playbackId && getVideoSrc({client, asset}), [asset, client])\n const [error, setError] = useState<MediaError | Error | null>(null)\n const handleError = useCallback<React.ReactEventHandler<HTMLVideoElement>>(\n (event) => setError(event.currentTarget.error),\n []\n )\n const playRef = useRef<HTMLDivElement>(null)\n const muteRef = useRef<HTMLDivElement>(null)\n const video = useRef<HTMLVideoElement>(null)\n const getCurrentTime = useCallback(() => video.current?.currentTime ?? 0, [video])\n const handleCancelUpload = useCancelUpload(asset, onChange)\n\n useEffect(() => {\n const style = document.createElement('style')\n style.innerHTML = 'button svg { vertical-align: middle; }'\n\n if (playRef.current?.shadowRoot) {\n playRef.current.shadowRoot.appendChild(style)\n }\n if (muteRef?.current?.shadowRoot) {\n muteRef.current.shadowRoot.appendChild(style.cloneNode(true))\n }\n }, [])\n\n useEffect(() => {\n if (asset?.status === 'errored') {\n handleCancelUpload()\n // eslint-disable-next-line no-warning-comments\n // @TODO use better error handling\n throw new Error(asset.data?.errors?.messages?.join(' '))\n }\n }, [asset.data?.errors?.messages, asset?.status, handleCancelUpload])\n\n const signedToken = useMemo(() => {\n try {\n const url = new URL(videoSrc!)\n return url.searchParams.get('token')\n } catch {\n return false\n }\n }, [videoSrc])\n\n if (error) {\n // @TODO better error handling\n throw error\n }\n\n if (!asset || !asset.status) {\n return null\n }\n\n if (isLoading) {\n return (\n <UploadProgress\n progress={100}\n filename={asset?.filename}\n text={(isLoading !== true && isLoading) || 'Waiting for Mux to complete the file'}\n onCancel={readOnly ? undefined : () => handleCancelUpload()}\n />\n )\n }\n\n return (\n <>\n <VideoContainer shadow={1} tone=\"transparent\" scheme=\"dark\">\n <MediaController>\n <MuxVideo\n playsInline\n ref={video}\n playbackId={`${asset.playbackId}${signedToken ? `?token=${signedToken}` : ''}`}\n onError={handleError}\n slot=\"media\"\n preload=\"metadata\"\n crossOrigin=\"anonymous\"\n metadata={{\n player_name: 'Sanity Admin Dashboard',\n player_version: pluginPkg.version,\n page_type: 'Preview Player',\n }}\n >\n <ThumbnailsMetadataTrack asset={asset} />\n </MuxVideo>\n <PosterImage asset={asset} />\n <MediaLoadingIndicator slot=\"centered-chrome\" noAutoHide />\n <StyledCenterControls slot=\"centered-chrome\">\n <MediaPlayButton />\n </StyledCenterControls>\n {buttons && <TopControls slot=\"top-chrome\">{buttons}</TopControls>}\n <MediaControlBar>\n <MediaMuteButton />\n <MediaTimeDisplay />\n <MediaTimeRange />\n <MediaDurationDisplay />\n <MediaFullscreenButton />\n </MediaControlBar>\n </MediaController>\n {isPreparingStaticRenditions && (\n <Card\n padding={2}\n radius={1}\n style={{\n background: 'var(--card-fg-color)',\n position: 'absolute',\n top: '0.5em',\n left: '0.5em',\n }}\n >\n <Text size={1} style={{color: 'var(--card-bg-color)'}}>\n MUX is preparing static renditions, please stand by\n </Text>\n </Card>\n )}\n </VideoContainer>\n {dialogState === 'edit-thumbnail' && (\n <EditThumbnailDialog\n asset={asset}\n getCurrentTime={getCurrentTime}\n setDialogState={setDialogState}\n />\n )}\n </>\n )\n}\n\nexport default MuxVideoOld\n"],"names":["useCancelUpload","asset","onChange","client","useClient","useCallback","PatchEvent","from","unset","assetId","deleteAsset","_id","delete","getVideoSrc","_ref","playbackId","getPlaybackId","searchParams","URLSearchParams","getPlaybackPolicy","token","generateJwt","set","concat","EditThumbnailDialog","_ref2","getCurrentTime","setDialogState","dialogId","useId","nextTime","useMemo","assetWithNewThumbnail","thumbTime","saving","setSaving","useState","error","setError","handleSave","patch","commit","returnDocuments","then","catch","finally","width","getDevicePixelRatio","maxDpr","jsx","Dialog","id","header","onClose","footer","Stack","padding","children","Button","mode","tone","loading","onClick","text","jsxs","space","Text","size","weight","VideoThumbnail","getStoryboardSrc","_ref3","VideoContainer","styled","Card","_templateObject","_taggedTemplateLiteral","StyledCenterControls","default","div","_templateObject2","TopControls","MediaControlBar","_templateObject3","PosterImage","_ref4","ref","useRef","src","getPosterSrc","height","useEffect","_a","current","style","document","createElement","innerHTML","shadowRoot","appendChild","MediaPosterImage","slot","ThumbnailsMetadataTrack","_ref5","label","kind","MuxVideoOld","_ref6","buttons","readOnly","dialogState","_b","_c","_d","isLoading","status","isPreparingStaticRenditions","data","static_renditions","videoSrc","handleError","event","currentTarget","playRef","muteRef","video","currentTime","handleCancelUpload","cloneNode","Error","errors","messages","join","signedToken","url","URL","get","UploadProgress","progress","filename","onCancel","Fragment","shadow","scheme","MediaController","MuxVideo","playsInline","onError","preload","crossOrigin","metadata","player_name","player_version","pluginPkg","version","page_type","MediaLoadingIndicator","noAutoHide","MediaPlayButton","MediaMuteButton","MediaTimeDisplay","MediaTimeRange","MediaDurationDisplay","MediaFullscreenButton","radius","background","position","top","left","color"],"mappings":"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"}