sanity-plugin-mux-input 2.1.0 → 2.2.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.
- package/lib/index.cjs +4037 -4
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +14 -1
- package/lib/index.js +4026 -2
- package/lib/index.js.map +1 -1
- package/package.json +27 -28
- package/src/actions/assets.ts +30 -2
- package/src/clients/upChunkObservable.ts +1 -1
- package/src/components/ConfigureApi.tsx +9 -1
- package/src/components/FormField.tsx +8 -10
- package/src/components/IconInfo.tsx +23 -0
- package/src/components/Input.styled.tsx +0 -8
- package/src/components/Input.tsx +4 -3
- package/src/components/InputBrowser.tsx +1 -8
- package/src/components/Player.styled.tsx +5 -144
- package/src/components/Player.tsx +23 -109
- package/src/components/PlayerActionsMenu.tsx +0 -4
- package/src/components/SelectAsset.tsx +18 -58
- package/src/components/SelectSortOptions.tsx +45 -0
- package/src/components/SpinnerBox.tsx +17 -0
- package/src/components/StudioTool.tsx +20 -0
- package/src/components/VideoDetails/DeleteDialog.tsx +156 -0
- package/src/components/VideoDetails/VideoDetails.tsx +298 -0
- package/src/components/VideoDetails/VideoReferences.tsx +70 -0
- package/src/components/VideoDetails/useVideoDetails.ts +85 -0
- package/src/components/VideoInBrowser.tsx +183 -0
- package/src/components/VideoMetadata.tsx +43 -0
- package/src/components/VideoPlayer.tsx +69 -0
- package/src/components/VideoThumbnail.tsx +106 -0
- package/src/components/VideosBrowser.tsx +83 -0
- package/src/components/__legacy__Uploader.tsx +2 -9
- package/src/components/documentPreview/DocumentPreview.tsx +107 -0
- package/src/components/documentPreview/DraftStatus.tsx +34 -0
- package/src/components/documentPreview/MissingSchemaType.tsx +33 -0
- package/src/components/documentPreview/PaneItemPreview.tsx +71 -0
- package/src/components/documentPreview/PublishedStatus.tsx +35 -0
- package/src/components/documentPreview/TimeAgo.tsx +13 -0
- package/src/components/documentPreview/paneItemTypes.ts +7 -0
- package/src/components/icons/Resolution.tsx +12 -0
- package/src/components/icons/StopWatch.tsx +20 -0
- package/src/components/icons/ToolIcon.tsx +21 -0
- package/src/hooks/useAssets.ts +61 -0
- package/src/hooks/useCancelUpload.ts +2 -2
- package/src/hooks/useClient.ts +3 -1
- package/src/hooks/useDocReferences.ts +21 -0
- package/src/hooks/useInView.ts +45 -0
- package/src/index.ts +2 -0
- package/src/plugin.tsx +1 -1
- package/src/util/constants.ts +7 -0
- package/src/util/createSearchFilter.ts +78 -0
- package/src/util/formatSeconds.ts +22 -0
- package/src/util/getAnimatedPosterSrc.ts +1 -1
- package/src/util/getPlaybackId.ts +1 -1
- package/src/util/getPlaybackPolicy.ts +1 -1
- package/src/util/getVideoMetadata.ts +18 -0
- package/src/util/types.ts +16 -1
- package/lib/_chunks/Player-d8f163ed.cjs +0 -474
- package/lib/_chunks/Player-d8f163ed.cjs.map +0 -1
- package/lib/_chunks/Player-fb9712c0.js +0 -465
- package/lib/_chunks/Player-fb9712c0.js.map +0 -1
- package/lib/_chunks/index-0656ede8.js +0 -3229
- package/lib/_chunks/index-0656ede8.js.map +0 -1
- package/lib/_chunks/index-9cd542f1.cjs +0 -3271
- package/lib/_chunks/index-9cd542f1.cjs.map +0 -1
- package/src/components/EditThumbnailDialog.tsx +0 -74
- package/src/components/VideoSource.styled.tsx +0 -235
- package/src/components/VideoSource.tsx +0 -318
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type {VideoAssetDocument} from './types'
|
|
2
2
|
|
|
3
|
-
export function getPlaybackId(asset: VideoAssetDocument): string {
|
|
3
|
+
export function getPlaybackId(asset: Partial<VideoAssetDocument>): string {
|
|
4
4
|
if (!asset?.playbackId) {
|
|
5
5
|
console.error('Asset is missing a playbackId', {asset})
|
|
6
6
|
throw new TypeError(`Missing playbackId`)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type {PlaybackPolicy, VideoAssetDocument} from './types'
|
|
2
2
|
|
|
3
|
-
export function getPlaybackPolicy(asset: VideoAssetDocument): PlaybackPolicy {
|
|
3
|
+
export function getPlaybackPolicy(asset: Partial<VideoAssetDocument>): PlaybackPolicy {
|
|
4
4
|
return asset.data?.playback_ids?.[0]?.policy ?? 'public'
|
|
5
5
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import formatSeconds from './formatSeconds'
|
|
2
|
+
import {VideoAssetDocument} from './types'
|
|
3
|
+
|
|
4
|
+
export default function getVideoMetadata(doc: VideoAssetDocument) {
|
|
5
|
+
const id = doc.assetId || doc._id || ''
|
|
6
|
+
const date = doc.data?.created_at
|
|
7
|
+
? new Date(Number(doc.data.created_at) * 1000)
|
|
8
|
+
: new Date(doc._createdAt || doc._updatedAt || Date.now())
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
title: doc.filename || id.slice(0, 10),
|
|
12
|
+
createdAt: date,
|
|
13
|
+
duration: doc.data?.duration ? formatSeconds(doc.data?.duration) : undefined,
|
|
14
|
+
aspect_ratio: doc.data?.aspect_ratio,
|
|
15
|
+
max_stored_resolution: doc.data?.max_stored_resolution,
|
|
16
|
+
max_stored_frame_rate: doc.data?.max_stored_frame_rate,
|
|
17
|
+
}
|
|
18
|
+
}
|
package/src/util/types.ts
CHANGED
|
@@ -14,6 +14,18 @@ export interface Config {
|
|
|
14
14
|
* @defaultValue 'none'
|
|
15
15
|
*/
|
|
16
16
|
mp4_support: 'none' | 'standard'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* How the videos browser should appear as a studio tool in Sanity's top navigation
|
|
20
|
+
*
|
|
21
|
+
* Pass `false` if you want to disable it.
|
|
22
|
+
**/
|
|
23
|
+
tool?:
|
|
24
|
+
| false
|
|
25
|
+
| {
|
|
26
|
+
title?: string
|
|
27
|
+
icon?: React.ComponentType
|
|
28
|
+
}
|
|
17
29
|
}
|
|
18
30
|
|
|
19
31
|
export interface Secrets {
|
|
@@ -171,7 +183,7 @@ export interface MuxAsset {
|
|
|
171
183
|
}
|
|
172
184
|
}
|
|
173
185
|
|
|
174
|
-
export interface VideoAssetDocument extends
|
|
186
|
+
export interface VideoAssetDocument extends SanityDocument {
|
|
175
187
|
type?: 'mux.videoAsset'
|
|
176
188
|
status?: string
|
|
177
189
|
assetId?: string
|
|
@@ -195,3 +207,6 @@ export interface MuxInputPreviewProps extends Omit<PreviewProps<PreviewLayoutKey
|
|
|
195
207
|
asset?: Reference
|
|
196
208
|
} | null
|
|
197
209
|
}
|
|
210
|
+
|
|
211
|
+
/** Whether the VideosBrowser was opened from a field in a document, or from the standalone studio tool */
|
|
212
|
+
export type PluginPlacement = 'input' | 'tool'
|
|
@@ -1,474 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|