sanity-plugin-mux-input 1.2.0-main.8 → 1.2.0-main.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,412 @@
1
+ var $e9PUl$sanity = require("sanity");
2
+ var $e9PUl$sanity_unstable = require("sanity/_unstable");
3
+ var $e9PUl$reactjsxruntime = require("react/jsx-runtime");
4
+ var $e9PUl$sanityicons = require("@sanity/icons");
5
+ var $e9PUl$sanityui = require("@sanity/ui");
6
+ var $e9PUl$react = require("react");
7
+ var $e9PUl$styledcomponents = require("styled-components");
8
+ var $e9PUl$suspendreact = require("suspend-react");
9
+ var $e9PUl$useerrorboundary = require("use-error-boundary");
10
+
11
+ function $parcel$export(e, n, v, s) {
12
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
13
+ }
14
+ function $parcel$interopDefault(a) {
15
+ return a && a.__esModule ? a.default : a;
16
+ }
17
+ var $parcel$global =
18
+ typeof globalThis !== 'undefined'
19
+ ? globalThis
20
+ : typeof self !== 'undefined'
21
+ ? self
22
+ : typeof window !== 'undefined'
23
+ ? window
24
+ : typeof global !== 'undefined'
25
+ ? global
26
+ : {};
27
+ var parcelRequire = $parcel$global["parcelRequire4c51"];
28
+ parcelRequire.register("1de5N", function(module, exports) {
29
+
30
+ $parcel$export(module.exports, "useAssetDocumentValues", () => $eef844dd0892040d$export$e11a382d55e07f75);
31
+
32
+
33
+ const $eef844dd0892040d$var$path = [
34
+ "assetId",
35
+ "data",
36
+ "playbackId",
37
+ "status",
38
+ "thumbTime",
39
+ "filename"
40
+ ];
41
+ const $eef844dd0892040d$export$e11a382d55e07f75 = (asset)=>(0, $e9PUl$sanity_unstable.useDocumentValues)((0, $e9PUl$sanity.isReference)(asset) ? asset._ref : "", $eef844dd0892040d$var$path);
42
+
43
+ });
44
+
45
+ parcelRequire.register("5msAV", function(module, exports) {
46
+
47
+ $parcel$export(module.exports, "VideoThumbnail", () => $6de6709202a3b061$export$bd4b73f15688a160);
48
+ $parcel$export(module.exports, "AnimatedVideoThumbnail", () => $6de6709202a3b061$export$357b57aa2db6117e);
49
+ $parcel$export(module.exports, "ThumbGrid", () => $6de6709202a3b061$export$e20c438ffc62921);
50
+ $parcel$export(module.exports, "CardLoadMore", () => $6de6709202a3b061$export$7431cee690d58bc9);
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+ var $3OvmU = parcelRequire("3OvmU");
62
+
63
+ var $j8DZc = parcelRequire("j8DZc");
64
+
65
+ var $bRIzd = parcelRequire("bRIzd");
66
+ const $6de6709202a3b061$var$mediaDimensions = {
67
+ aspect: 16 / 9
68
+ };
69
+ const $6de6709202a3b061$var$ImageLoader = /*#__PURE__*/ (0, $e9PUl$react.memo)(function ImageLoader({ alt: alt , src: src , height: height , width: width , aspectRatio: aspectRatio }) {
70
+ (0, $e9PUl$suspendreact.suspend)(async ()=>{
71
+ const img = new Image(width, height);
72
+ img.decoding = "async";
73
+ img.src = src;
74
+ await img.decode();
75
+ }, [
76
+ "sanity-plugin-mux-input",
77
+ "image",
78
+ src
79
+ ]);
80
+ return /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)("img", {
81
+ alt: alt,
82
+ src: src,
83
+ height: height,
84
+ width: width,
85
+ style: {
86
+ aspectRatio: aspectRatio
87
+ }
88
+ });
89
+ });
90
+ const $6de6709202a3b061$var$VideoMediaPreview = (0, ($parcel$interopDefault($e9PUl$styledcomponents)))((0, $e9PUl$sanity_unstable.MediaPreview))`
91
+ img {
92
+ object-fit: cover;
93
+ }
94
+ `;
95
+ const $6de6709202a3b061$var$VideoMediaPreviewSignedSubtitle = ({ solo: solo })=>{
96
+ return /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsxs)((0, $e9PUl$sanityui.Inline), {
97
+ space: 1,
98
+ style: {
99
+ marginTop: solo ? "-1.35em" : undefined,
100
+ marginBottom: solo ? undefined : "0.35rem"
101
+ },
102
+ children: [
103
+ /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$sanityicons.LockIcon), {}),
104
+ "Signed playback policy"
105
+ ]
106
+ });
107
+ };
108
+ const $6de6709202a3b061$var$PosterImage = ({ asset: asset , height: height , width: width , showTip: showTip })=>{
109
+ const client = (0, $e9PUl$sanity.useClient)();
110
+ const src = (0, $bRIzd.getPosterSrc)({
111
+ asset: asset,
112
+ client: client,
113
+ height: height,
114
+ width: width,
115
+ fit_mode: "smartcrop"
116
+ });
117
+ const subtitle = (0, $e9PUl$react.useMemo)(()=>showTip && (0, $j8DZc.getPlaybackPolicy)(asset) === "signed" ? /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$VideoMediaPreviewSignedSubtitle, {
118
+ solo: true
119
+ }) : undefined, [
120
+ asset,
121
+ showTip
122
+ ]);
123
+ // eslint-disable-next-line no-warning-comments
124
+ // @TODO support setting the alt text in the schema, like how we deal with images
125
+ return /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$VideoMediaPreview, {
126
+ mediaDimensions: $6de6709202a3b061$var$mediaDimensions,
127
+ subtitle: subtitle,
128
+ title: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$reactjsxruntime.Fragment), {
129
+ children: null
130
+ }),
131
+ media: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$ImageLoader, {
132
+ alt: "",
133
+ src: src,
134
+ height: height,
135
+ width: width
136
+ })
137
+ });
138
+ };
139
+ const $6de6709202a3b061$export$bd4b73f15688a160 = /*#__PURE__*/ (0, $e9PUl$react.memo)(function VideoThumbnail({ asset: asset , width: width , showTip: showTip }) {
140
+ const { ErrorBoundary: ErrorBoundary , didCatch: didCatch , error: error } = (0, $e9PUl$useerrorboundary.useErrorBoundary)();
141
+ const height = Math.round(width * 9 / 16);
142
+ const subtitle = (0, $e9PUl$react.useMemo)(()=>showTip && (0, $j8DZc.getPlaybackPolicy)(asset) === "signed" ? /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$VideoMediaPreviewSignedSubtitle, {}) : undefined, [
143
+ showTip,
144
+ asset
145
+ ]);
146
+ if (didCatch) return /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$VideoMediaPreview, {
147
+ subtitle: error.message,
148
+ mediaDimensions: $6de6709202a3b061$var$mediaDimensions,
149
+ title: "Error when loading thumbnail",
150
+ media: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$sanityui.Card), {
151
+ radius: 2,
152
+ height: "fill",
153
+ style: {
154
+ position: "relative",
155
+ width: "100%"
156
+ },
157
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$sanityui.Box), {
158
+ style: {
159
+ display: "flex",
160
+ justifyContent: "center",
161
+ alignItems: "center",
162
+ position: "absolute",
163
+ top: 0,
164
+ left: 0,
165
+ right: 0,
166
+ bottom: 0
167
+ },
168
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$sanityicons.UnknownIcon), {})
169
+ })
170
+ })
171
+ });
172
+ return /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)(ErrorBoundary, {
173
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$react.Suspense), {
174
+ fallback: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$VideoMediaPreview, {
175
+ isPlaceholder: true,
176
+ title: "Loading thumbnail...",
177
+ subtitle: subtitle,
178
+ mediaDimensions: $6de6709202a3b061$var$mediaDimensions
179
+ }),
180
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$PosterImage, {
181
+ showTip: showTip,
182
+ asset: asset,
183
+ height: height,
184
+ width: width
185
+ })
186
+ })
187
+ });
188
+ });
189
+ const $6de6709202a3b061$var$AnimatedVideoMediaPreview = (0, ($parcel$interopDefault($e9PUl$styledcomponents)))((0, $e9PUl$sanity_unstable.MediaPreview))`
190
+ img {
191
+ object-fit: contain;
192
+ }
193
+ `;
194
+ const $6de6709202a3b061$var$AnimatedPosterImage = ({ asset: asset , width: width })=>{
195
+ const client = (0, $e9PUl$sanity.useClient)();
196
+ const src = (0, $3OvmU.getAnimatedPosterSrc)({
197
+ asset: asset,
198
+ client: client,
199
+ width: width
200
+ });
201
+ // eslint-disable-next-line no-warning-comments
202
+ // @TODO support setting the alt text in the schema, like how we deal with images
203
+ return /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$AnimatedVideoMediaPreview, {
204
+ withBorder: false,
205
+ mediaDimensions: $6de6709202a3b061$var$mediaDimensions,
206
+ media: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$ImageLoader, {
207
+ alt: "",
208
+ src: src,
209
+ width: width,
210
+ aspectRatio: "16:9"
211
+ })
212
+ });
213
+ };
214
+ const $6de6709202a3b061$export$357b57aa2db6117e = /*#__PURE__*/ (0, $e9PUl$react.memo)(function AnimatedVideoThumbnail({ asset: asset , width: width }) {
215
+ const { ErrorBoundary: ErrorBoundary , didCatch: didCatch } = (0, $e9PUl$useerrorboundary.useErrorBoundary)();
216
+ if (didCatch) return null;
217
+ return /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)(ErrorBoundary, {
218
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$react.Suspense), {
219
+ fallback: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$FancyBackdrop, {
220
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$VideoMediaPreview, {
221
+ mediaDimensions: $6de6709202a3b061$var$mediaDimensions,
222
+ withBorder: false,
223
+ media: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$sanityui.Spinner), {
224
+ muted: true
225
+ })
226
+ })
227
+ }),
228
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)((0, $e9PUl$sanityui.Card), {
229
+ height: "fill",
230
+ tone: "transparent",
231
+ children: /*#__PURE__*/ (0, $e9PUl$reactjsxruntime.jsx)($6de6709202a3b061$var$AnimatedPosterImage, {
232
+ asset: asset,
233
+ width: width
234
+ })
235
+ })
236
+ })
237
+ });
238
+ });
239
+ const $6de6709202a3b061$var$FancyBackdrop = (0, ($parcel$interopDefault($e9PUl$styledcomponents)))((0, $e9PUl$sanityui.Box))`
240
+ backdrop-filter: blur(8px) brightness(0.5) saturate(2);
241
+ mix-blend-mode: color-dodge;
242
+ `;
243
+ const $6de6709202a3b061$export$e20c438ffc62921 = (0, ($parcel$interopDefault($e9PUl$styledcomponents)))((0, $e9PUl$sanityui.Grid))`
244
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
245
+ `;
246
+ const $6de6709202a3b061$export$7431cee690d58bc9 = (0, ($parcel$interopDefault($e9PUl$styledcomponents)))((0, $e9PUl$sanityui.Card))`
247
+ border-top: 1px solid var(--card-border-color);
248
+ position: sticky;
249
+ bottom: 0;
250
+ z-index: 200;
251
+ `;
252
+
253
+ });
254
+ parcelRequire.register("3OvmU", function(module, exports) {
255
+
256
+ $parcel$export(module.exports, "getAnimatedPosterSrc", () => $d116a96f272a1c22$export$6adb108e2a577699);
257
+
258
+ var $gsx5r = parcelRequire("gsx5r");
259
+
260
+ var $kQyCX = parcelRequire("kQyCX");
261
+
262
+ var $j8DZc = parcelRequire("j8DZc");
263
+ function $d116a96f272a1c22$export$6adb108e2a577699({ asset: asset , client: client , height: height , width: width , start: start = asset.thumbTime ? Math.max(0, asset.thumbTime - 2.5) : 0 , end: end = start + 5 , fps: fps = 15 }) {
264
+ const params = {
265
+ height: height,
266
+ width: width,
267
+ start: start,
268
+ end: end,
269
+ fps: fps
270
+ };
271
+ const playbackId = (0, $kQyCX.getPlaybackId)(asset);
272
+ let searchParams = new URLSearchParams(JSON.parse(JSON.stringify(params, (_, v)=>v ?? undefined)));
273
+ if ((0, $j8DZc.getPlaybackPolicy)(asset) === "signed") {
274
+ const token = (0, $gsx5r.generateJwt)(client, playbackId, "g", params);
275
+ searchParams = new URLSearchParams({
276
+ token: token
277
+ });
278
+ }
279
+ return `https://image.mux.com/${playbackId}/animated.gif?${searchParams}`;
280
+ }
281
+
282
+ });
283
+ parcelRequire.register("gsx5r", function(module, exports) {
284
+
285
+ $parcel$export(module.exports, "generateJwt", () => $d8ba7896129c9d6c$export$87b96baf1080652a);
286
+
287
+
288
+ var $b6Vzu = parcelRequire("b6Vzu");
289
+ function $d8ba7896129c9d6c$export$87b96baf1080652a(client, playbackId, aud, payload) {
290
+ const { signingKeyId: signingKeyId , signingKeyPrivate: signingKeyPrivate } = (0, $b6Vzu.readSecrets)(client);
291
+ if (!signingKeyId) throw new TypeError("Missing signingKeyId");
292
+ if (!signingKeyPrivate) throw new TypeError("Missing signingKeyPrivate");
293
+ // /*
294
+ const { default: sign } = (0, $e9PUl$suspendreact.suspend)(()=>{
295
+ // eslint-disable-next-line @typescript-eslint/no-shadow
296
+ // This whole skypack thing is an extreme, temporary, measure to get around Parcel bugs with code splitting, dynamic import, and CJS + ESM interop
297
+ // Otherwise known as the unholy trinity of reasons I might consider going back to doing only design work
298
+ // const {default: sign} = await import('jsonwebtoken-esm/sign')
299
+ // eslint-disable-next-line @typescript-eslint/no-shadow
300
+ return import(/* webpackIgnore: true */ // @ts-expect-error -- TS don't like URL classes in dynamic imports even though it's valid
301
+ new URL("https://cdn.skypack.dev/pin/jsonwebtoken-esm@v1.0.3-p8N0qksX2r9oYz3jfz0a/mode=imports,min/optimized/jsonwebtoken-esm/sign.js"));
302
+ }, [
303
+ "sanity-plugin-mux-input",
304
+ "jsonwebtoken-esm/sign"
305
+ ]);
306
+ // */
307
+ return sign(payload ? JSON.parse(JSON.stringify(payload, (_, v)=>v ?? undefined)) : {}, atob(signingKeyPrivate), {
308
+ algorithm: "RS256",
309
+ keyid: signingKeyId,
310
+ audience: aud,
311
+ subject: playbackId,
312
+ noTimestamp: true,
313
+ expiresIn: "12h"
314
+ });
315
+ }
316
+
317
+ });
318
+ parcelRequire.register("b6Vzu", function(module, exports) {
319
+
320
+ $parcel$export(module.exports, "_id", () => $edbbfc11873e0f23$export$9c7ae676ac45430a);
321
+ $parcel$export(module.exports, "readSecrets", () => $edbbfc11873e0f23$export$e6f48a1ef9de02f7);
322
+
323
+
324
+ var $bf6Cb = parcelRequire("bf6Cb");
325
+ const $edbbfc11873e0f23$export$9c7ae676ac45430a = "secrets.mux";
326
+ function $edbbfc11873e0f23$export$e6f48a1ef9de02f7(client) {
327
+ const { projectId: projectId , dataset: dataset } = client.config();
328
+ return (0, $e9PUl$suspendreact.suspend)(async ()=>{
329
+ const data = await client.fetch(/* groq */ `*[_id == $_id][0]{
330
+ token,
331
+ secretKey,
332
+ enableSignedUrls,
333
+ signingKeyId,
334
+ signingKeyPrivate
335
+ }`, {
336
+ _id: $edbbfc11873e0f23$export$9c7ae676ac45430a
337
+ });
338
+ return {
339
+ token: data?.token || null,
340
+ secretKey: data?.secretKey || null,
341
+ enableSignedUrls: Boolean(data?.enableSignedUrls) || false,
342
+ signingKeyId: data?.signingKeyId || null,
343
+ signingKeyPrivate: data?.signingKeyPrivate || null
344
+ };
345
+ }, [
346
+ (0, $bf6Cb.cacheNs),
347
+ $edbbfc11873e0f23$export$9c7ae676ac45430a,
348
+ projectId,
349
+ dataset
350
+ ]);
351
+ }
352
+
353
+ });
354
+
355
+
356
+ parcelRequire.register("kQyCX", function(module, exports) {
357
+
358
+ $parcel$export(module.exports, "getPlaybackId", () => $96cfb4479805b243$export$bdfa34d24bb44333);
359
+ function $96cfb4479805b243$export$bdfa34d24bb44333(asset) {
360
+ if (!asset?.playbackId) {
361
+ console.error("Asset is missing a playbackId", {
362
+ asset: asset
363
+ });
364
+ throw new TypeError(`Missing playbackId`);
365
+ }
366
+ return asset.playbackId;
367
+ }
368
+
369
+ });
370
+
371
+ parcelRequire.register("j8DZc", function(module, exports) {
372
+
373
+ $parcel$export(module.exports, "getPlaybackPolicy", () => $5bbe48978fdc9616$export$f7d2546fac75bbd);
374
+ function $5bbe48978fdc9616$export$f7d2546fac75bbd(asset) {
375
+ return asset.data?.playback_ids?.[0]?.policy ?? "public";
376
+ }
377
+
378
+ });
379
+
380
+
381
+ parcelRequire.register("bRIzd", function(module, exports) {
382
+
383
+ $parcel$export(module.exports, "getPosterSrc", () => $2ed67348dc6c5cb5$export$8081e7a11b9f1345);
384
+
385
+ var $gsx5r = parcelRequire("gsx5r");
386
+
387
+ var $kQyCX = parcelRequire("kQyCX");
388
+
389
+ var $j8DZc = parcelRequire("j8DZc");
390
+ function $2ed67348dc6c5cb5$export$8081e7a11b9f1345({ asset: asset , client: client , fit_mode: fit_mode , height: height , time: time = asset.thumbTime , width: width }) {
391
+ const params = {
392
+ fit_mode: fit_mode,
393
+ height: height,
394
+ time: time,
395
+ width: width
396
+ };
397
+ const playbackId = (0, $kQyCX.getPlaybackId)(asset);
398
+ let searchParams = new URLSearchParams(JSON.parse(JSON.stringify(params, (_, v)=>v ?? undefined)));
399
+ if ((0, $j8DZc.getPlaybackPolicy)(asset) === "signed") {
400
+ const token = (0, $gsx5r.generateJwt)(client, playbackId, "t", params);
401
+ searchParams = new URLSearchParams({
402
+ token: token
403
+ });
404
+ }
405
+ return `https://image.mux.com/${playbackId}/thumbnail.png?${searchParams}`;
406
+ }
407
+
408
+ });
409
+
410
+
411
+
412
+ //# sourceMappingURL=Input.7afee4dd.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/hooks/useAssetDocumentValues.ts","src/components/VideoSource.styled.tsx","src/util/getAnimatedPosterSrc.ts","src/util/generateJwt.ts","src/util/readSecrets.ts","src/util/getPlaybackId.ts","src/util/getPlaybackPolicy.ts","src/util/getPosterSrc.ts"],"sourcesContent":["import {isReference} from 'sanity'\nimport {useDocumentValues} from 'sanity/_unstable'\n\nimport type {Reference, VideoAssetDocument} from '../util/types'\n\nconst path = ['assetId', 'data', 'playbackId', 'status', 'thumbTime', 'filename']\nexport const useAssetDocumentValues = (asset: Reference | null | undefined) =>\n useDocumentValues<VideoAssetDocument | null | undefined>(\n isReference(asset) ? asset._ref! : '',\n path\n )\n","import {LockIcon, UnknownIcon} from '@sanity/icons'\nimport {Box, Card, Grid, Inline, Spinner} from '@sanity/ui'\nimport React, {memo, Suspense, useMemo} from 'react'\nimport {useClient} from 'sanity'\nimport {MediaPreview} from 'sanity/_unstable'\nimport styled from 'styled-components'\nimport {suspend} from 'suspend-react'\nimport {useErrorBoundary} from 'use-error-boundary'\n\nimport {getAnimatedPosterSrc} from '../util/getAnimatedPosterSrc'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {getPosterSrc} from '../util/getPosterSrc'\nimport type {VideoAssetDocument} from '../util/types'\n\nconst mediaDimensions = {aspect: 16 / 9}\n\ninterface ImageLoaderProps {\n alt: string\n src: string\n height?: number\n width: number\n aspectRatio?: string\n}\nconst ImageLoader = memo(function ImageLoader({\n alt,\n src,\n height,\n width,\n aspectRatio,\n}: ImageLoaderProps) {\n suspend(async () => {\n const img = new Image(width, height)\n img.decoding = 'async'\n img.src = src\n await img.decode()\n }, ['sanity-plugin-mux-input', 'image', src])\n\n return <img alt={alt} src={src} height={height} width={width} style={{aspectRatio}} />\n})\n\nconst VideoMediaPreview = styled(MediaPreview)`\n img {\n object-fit: cover;\n }\n`\n\ninterface VideoMediaPreviewSignedSubtitleProps {\n solo?: boolean\n}\nconst VideoMediaPreviewSignedSubtitle = ({solo}: VideoMediaPreviewSignedSubtitleProps) => {\n return (\n <Inline\n space={1}\n style={{marginTop: solo ? '-1.35em' : undefined, marginBottom: solo ? undefined : '0.35rem'}}\n >\n <LockIcon />\n Signed playback policy\n </Inline>\n )\n}\n\ninterface PosterImageProps extends Omit<ImageLoaderProps, 'src' | 'alt'> {\n asset: VideoAssetDocument\n showTip?: boolean\n}\nconst PosterImage = ({asset, height, width, showTip}: PosterImageProps) => {\n const client = useClient()\n const src = getPosterSrc({asset, client, height, width, fit_mode: 'smartcrop'})\n const subtitle = useMemo(\n () =>\n showTip && getPlaybackPolicy(asset) === 'signed' ? (\n <VideoMediaPreviewSignedSubtitle solo />\n ) : undefined,\n [asset, showTip]\n )\n\n // eslint-disable-next-line no-warning-comments\n // @TODO support setting the alt text in the schema, like how we deal with images\n return (\n <VideoMediaPreview\n mediaDimensions={mediaDimensions}\n subtitle={subtitle}\n title={<>{null}</>}\n media={<ImageLoader alt=\"\" src={src} height={height} width={width} />}\n />\n )\n}\n\nexport interface VideoThumbnailProps extends Omit<PosterImageProps, 'height'> {\n width: number\n}\nexport const VideoThumbnail = memo(function VideoThumbnail({\n asset,\n width,\n showTip,\n}: VideoThumbnailProps) {\n const {ErrorBoundary, didCatch, error} = useErrorBoundary()\n const height = Math.round((width * 9) / 16)\n const subtitle = useMemo(\n () =>\n showTip && getPlaybackPolicy(asset) === 'signed' ? (\n <VideoMediaPreviewSignedSubtitle />\n ) : undefined,\n [showTip, asset]\n )\n\n if (didCatch) {\n return (\n <VideoMediaPreview\n subtitle={error.message}\n mediaDimensions={mediaDimensions}\n title=\"Error when loading thumbnail\"\n media={\n <Card radius={2} height=\"fill\" style={{position: 'relative', width: '100%'}}>\n <Box\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n }}\n >\n <UnknownIcon />\n </Box>\n </Card>\n }\n />\n )\n }\n\n return (\n <ErrorBoundary>\n <Suspense\n fallback={\n <VideoMediaPreview\n isPlaceholder\n title=\"Loading thumbnail...\"\n subtitle={subtitle}\n mediaDimensions={mediaDimensions}\n />\n }\n >\n <PosterImage showTip={showTip} asset={asset} height={height} width={width} />\n </Suspense>\n </ErrorBoundary>\n )\n})\n\nconst AnimatedVideoMediaPreview = styled(MediaPreview)`\n img {\n object-fit: contain;\n }\n`\n\ninterface AnimatedPosterImageProps extends Omit<ImageLoaderProps, 'src' | 'alt' | 'height'> {\n asset: VideoAssetDocument\n}\nconst AnimatedPosterImage = ({asset, width}: AnimatedPosterImageProps) => {\n const client = useClient()\n const src = getAnimatedPosterSrc({asset, client, width})\n\n // eslint-disable-next-line no-warning-comments\n // @TODO support setting the alt text in the schema, like how we deal with images\n return (\n <AnimatedVideoMediaPreview\n withBorder={false}\n mediaDimensions={mediaDimensions}\n media={<ImageLoader alt=\"\" src={src} width={width} aspectRatio=\"16:9\" />}\n />\n )\n}\n\nexport interface AnimatedVideoThumbnailProps extends Omit<PosterImageProps, 'height'> {\n width: number\n}\nexport const AnimatedVideoThumbnail = memo(function AnimatedVideoThumbnail({\n asset,\n width,\n}: AnimatedVideoThumbnailProps) {\n const {ErrorBoundary, didCatch} = useErrorBoundary()\n\n if (didCatch) {\n return null\n }\n\n return (\n <ErrorBoundary>\n <Suspense\n fallback={\n <FancyBackdrop>\n <VideoMediaPreview\n mediaDimensions={mediaDimensions}\n withBorder={false}\n media={<Spinner muted />}\n />\n </FancyBackdrop>\n }\n >\n <Card height=\"fill\" tone=\"transparent\">\n <AnimatedPosterImage asset={asset} width={width} />\n </Card>\n </Suspense>\n </ErrorBoundary>\n )\n})\nconst FancyBackdrop = styled(Box)`\n backdrop-filter: blur(8px) brightness(0.5) saturate(2);\n mix-blend-mode: color-dodge;\n`\n\nexport const ThumbGrid = styled(Grid)`\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n`\n\nexport const CardLoadMore = styled(Card)`\n border-top: 1px solid var(--card-border-color);\n position: sticky;\n bottom: 0;\n z-index: 200;\n`\n","import type {SanityClient} from '@sanity/client'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {AnimatedThumbnailOptions, MuxAnimatedThumbnailUrl, VideoAssetDocument} from './types'\n\nexport interface AnimatedPosterSrcOptions extends AnimatedThumbnailOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getAnimatedPosterSrc({\n asset,\n client,\n height,\n width,\n start = asset.thumbTime ? Math.max(0, asset.thumbTime - 2.5) : 0,\n end = start + 5,\n fps = 15,\n}: AnimatedPosterSrcOptions): MuxAnimatedThumbnailUrl {\n const params = {height, width, start, end, fps}\n const playbackId = getPlaybackId(asset)\n\n let searchParams = new URLSearchParams(\n JSON.parse(JSON.stringify(params, (_, v) => v ?? undefined))\n )\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 'g', params)\n searchParams = new URLSearchParams({token})\n }\n\n return `https://image.mux.com/${playbackId}/animated.gif?${searchParams}`\n}\n","import type {SanityClient} from '@sanity/client'\nimport {suspend} from 'suspend-react'\n\nimport {readSecrets} from './readSecrets'\nimport type {AnimatedThumbnailOptions, ThumbnailOptions} from './types'\n\nexport type Audience = 'g' | 's' | 't' | 'v'\n\nexport type Payload<T extends Audience> = T extends 'g'\n ? AnimatedThumbnailOptions\n : T extends 's'\n ? never\n : T extends 't'\n ? ThumbnailOptions\n : T extends 'v'\n ? never\n : never\n\nexport function generateJwt<T extends Audience>(\n client: SanityClient,\n playbackId: string,\n aud: T,\n payload?: Payload<T>\n): string {\n const {signingKeyId, signingKeyPrivate} = readSecrets(client)\n if (!signingKeyId) {\n throw new TypeError('Missing signingKeyId')\n }\n if (!signingKeyPrivate) {\n throw new TypeError('Missing signingKeyPrivate')\n }\n\n // /*\n const {default: sign}: {default: typeof import('jsonwebtoken-esm/sign')['default']} =\n suspend(() => {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n // This whole skypack thing is an extreme, temporary, measure to get around Parcel bugs with code splitting, dynamic import, and CJS + ESM interop\n // Otherwise known as the unholy trinity of reasons I might consider going back to doing only design work\n // const {default: sign} = await import('jsonwebtoken-esm/sign')\n // eslint-disable-next-line @typescript-eslint/no-shadow\n return import(\n /* webpackIgnore: true */\n // @ts-expect-error -- TS don't like URL classes in dynamic imports even though it's valid\n new URL(\n 'https://cdn.skypack.dev/pin/jsonwebtoken-esm@v1.0.3-p8N0qksX2r9oYz3jfz0a/mode=imports,min/optimized/jsonwebtoken-esm/sign.js'\n )\n )\n }, ['sanity-plugin-mux-input', 'jsonwebtoken-esm/sign'])\n // */\n\n return sign(\n payload ? JSON.parse(JSON.stringify(payload, (_, v) => v ?? undefined)) : {},\n atob(signingKeyPrivate),\n {\n algorithm: 'RS256',\n keyid: signingKeyId,\n audience: aud,\n subject: playbackId,\n noTimestamp: true,\n expiresIn: '12h',\n }\n )\n}\n","// Utils with a readName prefix are suspendable and should only be called in the render body\n// Not inside event callbacks or a useEffect.\n// They may be called dynamically, unlike useEffect\n\n// @TODO rename to readSigningPair\n\nimport type {SanityClient} from '@sanity/client'\nimport {suspend} from 'suspend-react'\n\nimport {cacheNs} from '../util/constants'\nimport {type Secrets} from '../util/types'\n\nexport const _id = 'secrets.mux' as const\n\nexport function readSecrets(client: SanityClient): Secrets {\n const {projectId, dataset} = client.config()\n return suspend(async () => {\n const data = await client.fetch(\n /* groq */ `*[_id == $_id][0]{\n token,\n secretKey,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate\n }`,\n {_id}\n )\n return {\n token: data?.token || null,\n secretKey: data?.secretKey || null,\n enableSignedUrls: Boolean(data?.enableSignedUrls) || false,\n signingKeyId: data?.signingKeyId || null,\n signingKeyPrivate: data?.signingKeyPrivate || null,\n }\n }, [cacheNs, _id, projectId, dataset])\n}\n","import type {VideoAssetDocument} from './types'\n\nexport function getPlaybackId(asset: VideoAssetDocument): string {\n if (!asset?.playbackId) {\n console.error('Asset is missing a playbackId', {asset})\n throw new TypeError(`Missing playbackId`)\n }\n return asset.playbackId\n}\n","import type {PlaybackPolicy, VideoAssetDocument} from './types'\n\nexport function getPlaybackPolicy(asset: VideoAssetDocument): PlaybackPolicy {\n return asset.data?.playback_ids?.[0]?.policy ?? 'public'\n}\n","import type {SanityClient} from '@sanity/client'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxThumbnailUrl, ThumbnailOptions, VideoAssetDocument} from './types'\n\nexport interface PosterSrcOptions extends ThumbnailOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getPosterSrc({\n asset,\n client,\n fit_mode,\n height,\n time = asset.thumbTime,\n width,\n}: PosterSrcOptions): MuxThumbnailUrl {\n const params = {fit_mode, height, time, width}\n const playbackId = getPlaybackId(asset)\n\n let searchParams = new URLSearchParams(\n JSON.parse(JSON.stringify(params, (_, v) => v ?? undefined))\n )\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 't', params)\n searchParams = new URLSearchParams({token})\n }\n\n return `https://image.mux.com/${playbackId}/thumbnail.png?${searchParams}`\n}\n"],"names":[],"version":3,"file":"Input.7afee4dd.js.map","sourceRoot":"../../"}