sanity-plugin-mux-input 2.1.1 → 2.2.1

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