sanity-plugin-mux-input 2.0.2 → 2.0.3
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/LICENSE +1 -1
- package/lib/_chunks/Input-4ec3c050.js +2666 -0
- package/lib/_chunks/Input-4ec3c050.js.map +1 -0
- package/lib/_chunks/Input-aa6d929b.js +2636 -0
- package/lib/_chunks/Input-aa6d929b.js.map +1 -0
- package/lib/_chunks/Preview-1664b7d5.js +28 -0
- package/lib/_chunks/Preview-1664b7d5.js.map +1 -0
- package/lib/_chunks/Preview-43ce9c72.js +26 -0
- package/lib/_chunks/{Preview-3195237b.js.map → Preview-43ce9c72.js.map} +1 -1
- package/lib/_chunks/VideoSource.styled-24577ec8.js +318 -0
- package/lib/_chunks/VideoSource.styled-24577ec8.js.map +1 -0
- package/lib/_chunks/VideoSource.styled-99ffa712.js +336 -0
- package/lib/_chunks/VideoSource.styled-99ffa712.js.map +1 -0
- package/lib/_chunks/index-9933dea2.js +264 -0
- package/lib/_chunks/index-9933dea2.js.map +1 -0
- package/lib/_chunks/index-c54f5393.js +247 -0
- package/lib/_chunks/index-c54f5393.js.map +1 -0
- package/lib/{src/index.d.ts → index.d.ts} +0 -0
- package/lib/index.esm.js +2 -1
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +9 -1
- package/lib/index.js.map +1 -1
- package/package.json +23 -30
- package/lib/_chunks/Input-2ba004d3.js +0 -2
- package/lib/_chunks/Input-2ba004d3.js.map +0 -1
- package/lib/_chunks/Input-af5a0a66.esm.js +0 -2
- package/lib/_chunks/Input-af5a0a66.esm.js.map +0 -1
- package/lib/_chunks/Preview-3195237b.js +0 -2
- package/lib/_chunks/Preview-bb256342.esm.js +0 -2
- package/lib/_chunks/Preview-bb256342.esm.js.map +0 -1
- package/lib/_chunks/VideoSource.styled-1b994d90.js +0 -2
- package/lib/_chunks/VideoSource.styled-1b994d90.js.map +0 -1
- package/lib/_chunks/VideoSource.styled-f92259cd.esm.js +0 -2
- package/lib/_chunks/VideoSource.styled-f92259cd.esm.js.map +0 -1
- package/lib/_chunks/index-3d8d7583.esm.js +0 -2
- package/lib/_chunks/index-3d8d7583.esm.js.map +0 -1
- package/lib/_chunks/index-efe6ce48.js +0 -2
- package/lib/_chunks/index-efe6ce48.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Input-af5a0a66.esm.js","sources":["../../src/hooks/useMuxPolling.ts","../../src/hooks/useSecretsDocumentValues.ts","../../src/clients/upChunkObservable.ts","../../src/actions/assets.ts","../../src/actions/secrets.ts","../../src/actions/upload.ts","../../src/util/extractFiles.ts","../../src/components/VideoSource.tsx","../../src/components/SelectAsset.tsx","../../src/components/InputBrowser.tsx","../../src/components/EditThumbnailDialog.tsx","../../src/components/Player.styled.tsx","../../src/util/getStoryboardSrc.ts","../../src/components/UploadProgress.tsx","../../src/components/Player.tsx","../../src/util/getVideoSrc.ts","../../src/hooks/useCancelUpload.ts","../../src/components/withFocusRing/helpers.ts","../../src/components/FileInputMenuItem.styled.tsx","../../src/components/FileInputMenuItem.tsx","../../src/components/PlayerActionsMenu.tsx","../../src/components/Uploader.styled.tsx","../../src/components/withFocusRing/withFocusRing.ts","../../src/components/FileInputButton.tsx","../../src/components/UploadPlaceholder.tsx","../../src/components/__legacy__Uploader.tsx","../../src/hooks/useSaveSecrets.ts","../../src/hooks/useSecretsFormState.ts","../../src/components/MuxLogo.tsx","../../src/components/ConfigureApi.styled.tsx","../../src/components/FormField.tsx","../../src/components/ConfigureApi.tsx","../../src/components/Onboard.tsx","../../src/components/Input.tsx","../../src/hooks/useDialogState.ts"],"sourcesContent":["import {useMemo} from 'react'\nimport {useDataset, useProjectId} from 'sanity'\nimport useSWR from 'swr'\n\nimport {useClient} from '../hooks/useClient'\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\n\n// Poll MUX if it's preparing the main document or its own static renditions\nexport const useMuxPolling = (asset?: VideoAssetDocument) => {\n const client = useClient()\n const projectId = useProjectId()\n const dataset = useDataset()\n const shouldFetch = useMemo(\n () =>\n !!asset?.assetId &&\n (asset?.status === 'preparing' || asset?.data?.static_renditions?.status === 'preparing'),\n [asset?.assetId, asset?.data?.static_renditions?.status, asset?.status]\n )\n return useSWR(\n shouldFetch ? `/${projectId}/addons/mux/assets/${dataset}/data/${asset?.assetId}` : null,\n async () => {\n const {data} = await client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/data/${asset!.assetId}`,\n withCredentials: true,\n method: 'GET',\n })\n client.patch(asset!._id!).set({status: data.status, data}).commit({returnDocuments: false})\n },\n {refreshInterval: 2000, refreshWhenHidden: true, dedupingInterval: 1000}\n )\n}\n","import {useMemo} from 'react'\nimport {useDocumentValues} from 'sanity'\n\nimport {muxSecretsDocumentId} from '../util/constants'\nimport type {Secrets} from '../util/types'\n\nconst path = ['token', 'secretKey', 'enableSignedUrls', 'signingKeyId', 'signingKeyPrivate']\nexport const useSecretsDocumentValues = () => {\n const {error, isLoading, value} = useDocumentValues<Partial<Secrets> | null | undefined>(\n muxSecretsDocumentId,\n path\n )\n const cache = useMemo(() => {\n const exists = Boolean(value)\n const secrets: Secrets = {\n token: value?.token || null,\n secretKey: value?.secretKey || null,\n enableSignedUrls: value?.enableSignedUrls || false,\n signingKeyId: value?.signingKeyId || null,\n signingKeyPrivate: value?.signingKeyPrivate || null,\n }\n return {\n isInitialSetup: !exists,\n needsSetup: !secrets?.token || !secrets?.secretKey,\n secrets,\n }\n }, [value])\n\n return {error, isLoading, value: cache}\n}\n","import * as UpChunk from '@mux/upchunk'\nimport {Observable} from 'rxjs'\n\nexport function createUpChunkObservable(uuid: string, uploadUrl: string, source: File) {\n return new Observable((subscriber) => {\n const upchunk = UpChunk.createUpload({\n endpoint: uploadUrl,\n file: source,\n dynamicChunkSize: true, // changes the chunk size based on network speeds\n })\n\n const successHandler = () => {\n subscriber.next({\n type: 'success',\n id: uuid,\n })\n subscriber.complete()\n }\n\n const errorHandler = (data: CustomEvent) => subscriber.error(new Error(data.detail.message))\n\n const progressHandler = (data: CustomEvent) => {\n return subscriber.next({type: 'progress', percent: data.detail})\n }\n\n const offlineHandler = () => {\n upchunk.pause()\n subscriber.next({\n type: 'pause',\n id: uuid,\n })\n }\n\n const onlineHandler = () => {\n upchunk.resume()\n subscriber.next({\n type: 'resume',\n id: uuid,\n })\n }\n\n upchunk.on('success', successHandler)\n upchunk.on('error', errorHandler)\n upchunk.on('progress', progressHandler)\n upchunk.on('offline', offlineHandler)\n upchunk.on('online', onlineHandler)\n\n return () => upchunk.abort()\n })\n}\n","import type {SanityClient} from '@sanity/client'\n\nimport type {MuxAsset} from '../util/types'\n\nexport function deleteAsset(client: SanityClient, assetId: string) {\n const {dataset} = client.config()\n return client.request<void>({\n url: `/addons/mux/assets/${dataset}/${assetId}`,\n withCredentials: true,\n method: 'DELETE',\n })\n}\n\nexport function getAsset(client: SanityClient, assetId: string) {\n const {dataset} = client.config()\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/data/${assetId}`,\n withCredentials: true,\n method: 'GET',\n })\n}\n","import type {SanityClient} from '@sanity/client'\nimport {defer} from 'rxjs'\n\n// eslint-disable-next-line max-params\nexport function saveSecrets(\n client: SanityClient,\n token: string,\n secretKey: string,\n enableSignedUrls: boolean,\n signingKeyId: string,\n signingKeyPrivate: string\n) {\n const doc = {\n _id: 'secrets.mux',\n _type: 'mux.apiKey',\n token,\n secretKey,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate,\n }\n\n return client.createOrReplace(doc)\n}\n\nexport function createSigningKeys(client: SanityClient) {\n const {dataset} = client.config()\n return client.request<{\n data: {private_key: string; id: string; created_at: string}\n }>({\n url: `/addons/mux/signing-keys/${dataset}`,\n withCredentials: true,\n method: 'POST',\n })\n}\n\nexport function testSecrets(client: SanityClient) {\n const {dataset} = client.config()\n return client.request<{status: boolean}>({\n url: `/addons/mux/secrets/${dataset}/test`,\n withCredentials: true,\n method: 'GET',\n })\n}\n\nexport async function haveValidSigningKeys(\n client: SanityClient,\n signingKeyId: string,\n signingKeyPrivate: string\n) {\n if (!(signingKeyId && signingKeyPrivate)) {\n return false\n }\n\n const {dataset} = client.config()\n try {\n const res = await client.request<{data: {id: string; created_at: string}}>({\n url: `/addons/mux/signing-keys/${dataset}/${signingKeyId}`,\n withCredentials: true,\n method: 'GET',\n })\n //\n // if this signing key is valid it will return { data: { id: 'xxxx' } }\n //\n return !!(res.data && res.data.id)\n } catch (e) {\n console.error('Error fetching signingKeyId', signingKeyId, 'assuming it is not valid')\n return false\n }\n}\n\nexport function testSecretsObservable(client: SanityClient) {\n const {dataset} = client.config()\n return defer(() =>\n client.observable.request<{status: boolean}>({\n url: `/addons/mux/secrets/${dataset}/test`,\n withCredentials: true,\n method: 'GET',\n })\n )\n}\n","/* eslint-disable camelcase */\nimport type {SanityClient} from '@sanity/client'\nimport {uuid as generateUuid} from '@sanity/uuid'\nimport {type Observable, concat, defer, from, of, throwError} from 'rxjs'\nimport {catchError, mergeMap, mergeMapTo, switchMap} from 'rxjs/operators'\n\nimport {createUpChunkObservable} from '../clients/upChunkObservable'\nimport type {Config, MuxAsset} from '../util/types'\nimport {getAsset} from './assets'\nimport {testSecretsObservable} from './secrets'\n\nexport function cancelUpload(client: SanityClient, uuid: string) {\n return client.observable.request({\n url: `/addons/mux/uploads/${client.clientConfig.dataset}/${uuid}`,\n withCredentials: true,\n method: 'DELETE',\n })\n}\n\nexport function uploadUrl(\n config: Config,\n client: SanityClient,\n url: string,\n options: {enableSignedUrls?: boolean} = {}\n) {\n return testUrl(url).pipe(\n switchMap((validUrl) => {\n return concat(\n of({type: 'url', url: validUrl}),\n testSecretsObservable(client).pipe(\n switchMap((json) => {\n if (!json || !json.status) {\n return throwError(new Error('Invalid credentials'))\n }\n const uuid = generateUuid()\n const {enableSignedUrls} = options\n const muxBody = {\n input: validUrl,\n playback_policy: [enableSignedUrls ? 'signed' : 'public'],\n mp4_support: config.mp4_support,\n }\n const query = {\n muxBody: JSON.stringify(muxBody),\n filename: validUrl.split('/').slice(-1)[0],\n }\n\n const dataset = client.clientConfig.dataset\n return defer(() =>\n client.observable.request({\n url: `/addons/mux/assets/${dataset}`,\n withCredentials: true,\n method: 'POST',\n headers: {\n 'MUX-Proxy-UUID': uuid,\n 'Content-Type': 'application/json',\n },\n query,\n })\n ).pipe(\n mergeMap((result) => {\n const asset =\n (result && result.results && result.results[0] && result.results[0].document) ||\n null\n\n if (!asset) {\n return throwError(new Error('No asset document returned'))\n }\n return of({type: 'success', id: uuid, asset})\n })\n )\n })\n )\n )\n })\n )\n}\n\nexport function uploadFile(\n config: Config,\n client: SanityClient,\n file: File,\n options: {enableSignedUrls?: boolean} = {}\n) {\n return testFile(file).pipe(\n switchMap((fileOptions) => {\n return concat(\n of({type: 'file', file: fileOptions}),\n testSecretsObservable(client).pipe(\n switchMap((json) => {\n if (!json || !json.status) {\n return throwError(new Error('Invalid credentials'))\n }\n const uuid = generateUuid()\n const {enableSignedUrls} = options\n const body = {\n mp4_support: config.mp4_support,\n playback_policy: [enableSignedUrls ? 'signed' : 'public'],\n }\n\n return concat(\n of({type: 'uuid', uuid}),\n defer(() =>\n client.observable.request<{\n sanityAssetId: string\n upload: {\n cors_origin: string\n id: string\n new_asset_settings: {\n mp4_support: 'standard' | 'none'\n passthrough: string\n playback_policies: ['public' | 'signed']\n }\n status: 'waiting'\n timeout: number\n url: string\n }\n }>({\n url: `/addons/mux/uploads/${client.clientConfig.dataset}`,\n withCredentials: true,\n method: 'POST',\n headers: {\n 'MUX-Proxy-UUID': uuid,\n 'Content-Type': 'application/json',\n },\n body,\n })\n ).pipe(\n mergeMap((result) => {\n return createUpChunkObservable(uuid, result.upload.url, file).pipe(\n // eslint-disable-next-line no-warning-comments\n // @TODO type the observable events\n // eslint-disable-next-line max-nested-callbacks\n mergeMap((event: any) => {\n if (event.type !== 'success') {\n return of(event)\n }\n return from(updateAssetDocumentFromUpload(client, uuid)).pipe(\n // eslint-disable-next-line max-nested-callbacks\n mergeMap((doc) => of({...event, asset: doc}))\n )\n }),\n // eslint-disable-next-line max-nested-callbacks\n catchError((err) => {\n // Delete asset document\n return cancelUpload(client, uuid).pipe(mergeMapTo(throwError(err)))\n })\n )\n })\n )\n )\n })\n )\n )\n })\n )\n}\n\ntype UploadResponse = {\n data: {\n asset_id: string\n cors_origin: string\n id: string\n new_asset_settings: {\n mp4_support: 'standard' | 'none'\n passthrough: string\n playback_policies: ['public' | 'signed']\n }\n status: string\n timeout: number\n }\n}\nexport function getUpload(client: SanityClient, assetId: string) {\n const {dataset} = client.config()\n return client.request<UploadResponse>({\n url: `/addons/mux/uploads/${dataset}/${assetId}`,\n withCredentials: true,\n method: 'GET',\n })\n}\n\nfunction pollUpload(client: SanityClient, uuid: string): Promise<UploadResponse> {\n const maxTries = 10\n let pollInterval: number\n let tries = 0\n let assetId: string\n let upload: UploadResponse\n return new Promise((resolve, reject) => {\n pollInterval = (setInterval as typeof window.setInterval)(async () => {\n try {\n upload = await getUpload(client, uuid)\n } catch (err) {\n reject(err)\n return\n }\n assetId = upload && upload.data && upload.data.asset_id\n if (assetId) {\n clearInterval(pollInterval)\n resolve(upload)\n }\n if (tries > maxTries) {\n clearInterval(pollInterval)\n reject(new Error('Upload did not finish'))\n }\n tries++\n }, 2000)\n })\n}\n\nasync function updateAssetDocumentFromUpload(client: SanityClient, uuid: string) {\n let upload: UploadResponse\n let asset: {data: MuxAsset}\n try {\n upload = await pollUpload(client, uuid)\n } catch (err) {\n return Promise.reject(err)\n }\n try {\n asset = await getAsset(client, upload.data.asset_id)\n } catch (err) {\n return Promise.reject(err)\n }\n\n const doc = {\n _id: uuid,\n _type: 'mux.videoAsset',\n status: asset.data.status,\n data: asset.data,\n assetId: asset.data.id,\n playbackId: asset.data.playback_ids[0].id,\n uploadId: upload.data.id,\n }\n return client.createOrReplace(doc).then(() => {\n return doc\n })\n}\n\nfunction testFile(file: File) {\n if (typeof window !== 'undefined' && file instanceof window.File) {\n const fileOptions = optionsFromFile({}, file)\n return of(fileOptions)\n }\n return throwError(new Error('Invalid file'))\n}\n\nfunction testUrl(url: string): Observable<string> {\n const error = new Error('Invalid URL')\n if (typeof url !== 'string') {\n return throwError(error)\n }\n let parsed\n try {\n parsed = new URL(url)\n } catch (err) {\n return throwError(error)\n }\n if (parsed && !parsed.protocol.match(/http:|https:/)) {\n return throwError(error)\n }\n return of(url)\n}\n\nfunction optionsFromFile(opts: {preserveFilename?: boolean}, file: File) {\n if (typeof window === 'undefined' || !(file instanceof window.File)) {\n return opts\n }\n return {\n name: opts.preserveFilename === false ? undefined : file.name,\n type: file.type,\n }\n}\n","/**\n * Utilities for extracting files from dataTransfer in a predictable cross-browser fashion.\n * Also recursively extracts files from a directory\n * Inspired by https://github.com/component/normalized-upload\n */\n\nexport function extractDroppedFiles(dataTransfer: DataTransfer) {\n const files = Array.from(dataTransfer.files || [])\n const items = Array.from(dataTransfer.items || [])\n if (files && files.length > 0) {\n return Promise.resolve(files)\n }\n return normalizeItems(items).then((arr) => arr.flat())\n}\n\nfunction normalizeItems(items: DataTransferItem[]) {\n return Promise.all(\n items.map((item) => {\n // directory\n if (item.kind === 'file' && item.webkitGetAsEntry) {\n let entry: FileSystemEntry | File[] | null\n // Edge throws\n try {\n entry = item.webkitGetAsEntry()\n } catch (err) {\n return [item.getAsFile()]\n }\n if (!entry) {\n return []\n }\n return entry.isDirectory ? walk(entry) : [item.getAsFile()]\n }\n\n // file\n if (item.kind === 'file') {\n const file = item.getAsFile()\n return Promise.resolve(file ? [file] : [])\n }\n\n // others\n return new Promise((resolve) => item.getAsString(resolve)).then((str?: any) =>\n str ? [new File([str], 'unknown.txt', {type: item.type})] : []\n )\n })\n )\n}\n\nfunction isFile(entry: FileSystemEntry): entry is FileSystemFileEntry {\n return entry.isFile\n}\nfunction isDirectory(entry: FileSystemEntry): entry is FileSystemDirectoryEntry {\n return entry.isDirectory\n}\n\nfunction walk(entry: FileSystemEntry): any {\n if (isFile(entry)) {\n return new Promise((resolve) => entry.file(resolve)).then((file) => [file])\n }\n\n if (isDirectory(entry)) {\n const dir = entry.createReader()\n return new Promise<any>((resolve) => dir.readEntries(resolve))\n .then((entries: FileSystemEntry[]) => entries.filter((entr) => !entr.name.startsWith('.')))\n .then((entries) => Promise.all(entries.map(walk)).then((arr) => arr.flat()))\n }\n return Promise.resolve([])\n}\n","import {EllipsisVerticalIcon, TrashIcon} from '@sanity/icons'\nimport {DownloadIcon} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Checkbox,\n Dialog,\n Flex,\n Grid,\n Menu,\n MenuButton,\n MenuItem,\n Spinner,\n Stack,\n Text,\n useClickOutside,\n useToast,\n} from '@sanity/ui'\nimport {animate} from 'motion'\nimport React, {memo, useCallback, useEffect, useId, useLayoutEffect, useRef, useState} from 'react'\nimport styled from 'styled-components'\nimport {getDevicePixelRatio} from 'use-device-pixel-ratio'\n\nimport {deleteAsset} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport type {VideoAssetDocument} from '../util/types'\nimport {AnimatedVideoThumbnail, CardLoadMore, ThumbGrid, VideoThumbnail} from './VideoSource.styled'\n\nexport interface AssetActionsMenuProps {\n asset: VideoAssetDocument\n}\n\nfunction AssetActionsMenu(props: AssetActionsMenuProps) {\n const {asset} = props\n const id = useId()\n const [dialogState, setDialogState] = useState<false | 'show-uses' | 'confirm-delete'>()\n const [open, setOpen] = useState(false)\n const [menuElement, setMenuRef] = useState<HTMLDivElement | null>(null)\n\n const handleDelete = useCallback(() => setDialogState('confirm-delete'), [])\n const handleClick = useCallback(() => {\n setDialogState(false)\n setOpen(true)\n }, [setDialogState])\n const handleClose = useCallback(() => {\n setDialogState(false)\n setOpen(false)\n }, [setDialogState])\n\n useEffect(() => {\n if (open && dialogState) {\n setOpen(false)\n }\n }, [dialogState, open])\n\n useClickOutside(\n useCallback(() => setOpen(false), []),\n [menuElement]\n )\n\n return (\n <>\n <MenuButton\n id={`${id}-asset-menu`}\n button={\n <Button icon={EllipsisVerticalIcon} mode=\"ghost\" onClick={handleClick} padding={2} />\n }\n menu={\n <Menu ref={setMenuRef}>\n <MenuItem tone=\"critical\" icon={TrashIcon} text=\"Delete\" onClick={handleDelete} />\n </Menu>\n }\n portal\n placement=\"right\"\n />\n {dialogState === 'confirm-delete' && <DeleteDialog asset={asset} onClose={handleClose} />}\n </>\n )\n}\n\ninterface DeleteDialogProps {\n asset: VideoAssetDocument\n onClose: () => void\n}\nfunction DeleteDialog(props: DeleteDialogProps) {\n const {asset, onClose} = props\n const client = useClient()\n const {push: pushToast} = useToast()\n const [deleting, setDeleting] = useState(false)\n const [deleteOnMux, setDeleteOnMux] = useState(false)\n const id = useId()\n const noPaddingOnStack = true\n const width = 200 * getDevicePixelRatio({maxDpr: 2})\n\n const handleDelete = useCallback(async () => {\n setDeleting(true)\n try {\n if (asset?._id) {\n await client.delete(asset._id)\n }\n if (deleteOnMux && asset?.assetId) {\n await deleteAsset(client, asset.assetId)\n }\n document\n .querySelector(`[data-id=\"${asset._id}\"]`)\n ?.parentElement?.setAttribute?.('hidden', 'true')\n } catch (err: any) {\n console.error('Failed during delete', err)\n pushToast({\n closable: true,\n description: err?.message,\n duration: 5000,\n title: 'Uncaught error',\n status: 'error',\n })\n } finally {\n setDeleting(false)\n onClose()\n }\n }, [asset._id, asset.assetId, client, deleteOnMux, onClose, pushToast])\n\n return (\n <Dialog\n onClose={onClose}\n id={`${id}-confirm-delete`}\n header=\"Delete video\"\n footer={\n <Grid padding={2} gap={2} columns={2}>\n <Button mode=\"bleed\" text=\"Cancel\" onClick={onClose} />\n <Button\n text=\"Delete\"\n tone=\"critical\"\n icon={TrashIcon}\n onClick={handleDelete}\n loading={deleting}\n // disabled={!canDelete}\n />\n </Grid>\n }\n // __unstable_autoFocus\n width={1}\n >\n <Stack\n paddingX={noPaddingOnStack ? 0 : [2, 3, 4]}\n paddingY={noPaddingOnStack ? 0 : [3, 3, 3, 4]}\n space={1}\n >\n <Card paddingX={[2, 3, 4]} paddingY={[3, 3, 3, 4]}>\n <Grid columns={3} gap={3}>\n <Flex style={{gridColumn: 'span 2'}} align=\"center\">\n <Box padding={4}>\n <Stack space={4}>\n <Flex align=\"center\" as=\"label\">\n <Checkbox\n checked={deleteOnMux}\n onChange={() => setDeleteOnMux((prev) => !prev)}\n />\n <Text style={{margin: '0 10px'}}>Delete asset on Mux</Text>\n </Flex>\n <Flex align=\"center\" as=\"label\">\n <Checkbox disabled checked />\n <Text style={{margin: '0 10px'}}>Delete video from dataset</Text>\n </Flex>\n </Stack>\n </Box>\n </Flex>\n <VideoThumbnail asset={asset} width={width} showTip />\n </Grid>\n </Card>\n </Stack>\n </Dialog>\n )\n}\n\nexport interface Props {\n assets: VideoAssetDocument[]\n isLoading: boolean\n isLastPage: boolean\n onSelect: (assetId: string) => void\n onLoadMore: () => void\n}\n\nexport default function VideoSource({assets, isLoading, isLastPage, onSelect, onLoadMore}: Props) {\n const handleClick = useCallback<React.MouseEventHandler<HTMLDivElement>>(\n (event) => onSelect(event.currentTarget.dataset.id!),\n [onSelect]\n )\n const handleKeyPress = useCallback<React.KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter') {\n onSelect(event.currentTarget.dataset.id!)\n }\n },\n [onSelect]\n )\n const width = 200 * getDevicePixelRatio({maxDpr: 2})\n\n return (\n <>\n <Box padding={4}>\n <ThumbGrid gap={2}>\n {assets.map((asset) => (\n <VideoSourceItem\n key={asset._id}\n asset={asset}\n onClick={handleClick}\n onKeyPress={handleKeyPress}\n width={width}\n />\n ))}\n </ThumbGrid>\n {isLoading && assets.length === 0 && (\n <Flex justify=\"center\">\n <Spinner muted />\n </Flex>\n )}\n\n {!isLoading && assets.length === 0 && (\n <Text align=\"center\" muted>\n No videos\n </Text>\n )}\n </Box>\n {assets.length > 0 && !isLastPage && (\n <CardLoadMore tone=\"default\" padding={4}>\n <Flex direction=\"column\">\n <Button\n type=\"button\"\n icon={DownloadIcon}\n loading={isLoading}\n onClick={onLoadMore}\n text=\"Load more\"\n tone=\"primary\"\n />\n </Flex>\n </CardLoadMore>\n )}\n </>\n )\n}\n\ninterface VideoSourceItemProps {\n asset: VideoAssetDocument\n onClick: React.MouseEventHandler<HTMLDivElement>\n onKeyPress: React.KeyboardEventHandler<HTMLDivElement>\n width: number\n}\nconst _VideoSourceItem = ({asset, onClick, onKeyPress, width}: VideoSourceItemProps) => {\n const [hover, setHover] = useState<boolean | null>(null)\n const ref = useRef<HTMLDivElement>(null)\n useLayoutEffect(() => {\n if (!ref.current || hover === null) {\n return\n }\n if (hover) {\n animate(ref.current, {opacity: 1})\n } else {\n animate(ref.current, {opacity: 0})\n }\n }, [hover])\n return (\n <Box height=\"fill\" style={{position: 'relative'}}>\n <Card\n as=\"button\"\n data-id={asset._id}\n onClick={onClick}\n onKeyPress={onKeyPress}\n tabIndex={0}\n radius={2}\n padding={1}\n style={{lineHeight: 0, position: 'relative'}}\n __unstable_focusRing\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n <VideoThumbnail asset={asset} width={width} showTip />\n {asset?.playbackId && (\n <AnimateWrapper tone=\"transparent\" ref={ref} margin={1} radius={1}>\n {hover !== null && <AnimatedVideoThumbnail asset={asset} width={width} />}\n </AnimateWrapper>\n )}\n </Card>\n <ActionsAssetsContainer>\n <AssetActionsMenu asset={asset} />\n </ActionsAssetsContainer>\n </Box>\n )\n}\nconst VideoSourceItem = memo(_VideoSourceItem)\nconst AnimateWrapper = styled(Card)`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n will-change: opacity;\n background: transparent;\n background-color: hsl(0deg 0% 0% / 33%);\n opacity: 0;\n pointer-events: none;\n`\n\nconst ActionsAssetsContainer = styled.div`\n box-sizing: border-box;\n position: absolute;\n z-index: 300;\n opacity: 0;\n top: 7px;\n right: 7px;\n\n button:hover + &,\n button:focus-visible + &,\n &:hover,\n &:focus-visible {\n opacity: 1;\n }\n`\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {PatchEvent, set, setIfMissing} from 'sanity'\n\nimport {useClient} from '../hooks/useClient'\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\nimport VideoSource, {type Props as VideoSourceProps} from './VideoSource'\n\nconst PER_PAGE = 200\n\nfunction createQuery(start = 0, end = PER_PAGE) {\n return /* groq */ `*[_type == \"mux.videoAsset\"] | order(_updatedAt desc) [${start}...${end}]`\n}\n\nexport interface Props extends Pick<MuxInputProps, 'onChange'> {\n asset?: VideoAssetDocument | null | undefined\n setDialogState: SetDialogState\n}\n\nexport default function SelectAssets({asset, onChange, setDialogState}: Props) {\n const client = useClient()\n const pageNoRef = useRef(0)\n const [isLastPage, setLastPage] = useState(false)\n const [isLoading, setLoading] = useState(false)\n const [assets, setAssets] = useState<VideoAssetDocument[]>([])\n\n const fetchPage = useCallback(\n (pageNo: number) => {\n const start = pageNo * PER_PAGE\n const end = start + PER_PAGE\n setLoading(true)\n return client\n .fetch(createQuery(start, end))\n .then((result: VideoAssetDocument[]) => {\n setLastPage(result.length < PER_PAGE)\n setAssets((prev) => prev.concat(result))\n })\n .finally(() => setLoading(false))\n },\n [client]\n )\n const handleSelect = useCallback<VideoSourceProps['onSelect']>(\n (id) => {\n const selected = assets.find((doc) => doc._id === id)\n if (!selected) {\n throw new TypeError(`Failed to find video asset with id: ${id}`)\n }\n onChange(\n PatchEvent.from([\n setIfMissing({asset: {}}),\n set({_type: 'reference', _weak: true, _ref: selected._id}, ['asset']),\n ])\n )\n setDialogState(false)\n },\n [assets, onChange, setDialogState]\n )\n const handleLoadMore = useCallback<VideoSourceProps['onLoadMore']>(() => {\n fetchPage(++pageNoRef.current)\n }, [fetchPage])\n\n useEffect(() => void fetchPage(pageNoRef.current), [fetchPage])\n\n return (\n <VideoSource\n onSelect={handleSelect}\n assets={assets}\n isLastPage={isLastPage}\n isLoading={isLoading}\n onLoadMore={handleLoadMore}\n />\n )\n}\n","import {Dialog} from '@sanity/ui'\nimport React, {useCallback, useId} from 'react'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport SelectAsset, {type Props as SelectAssetProps} from './SelectAsset'\n\ninterface Props extends Pick<SelectAssetProps, 'onChange' | 'asset'> {\n setDialogState: SetDialogState\n}\nexport default function InputBrowser({setDialogState, asset, onChange}: Props) {\n const id = `InputBrowser${useId()}`\n const handleClose = useCallback(() => setDialogState(false), [setDialogState])\n return (\n <Dialog\n scheme=\"dark\"\n __unstable_autoFocus\n header=\"Select video\"\n id={id}\n onClose={handleClose}\n width={2}\n >\n <SelectAsset asset={asset} onChange={onChange} setDialogState={setDialogState} />\n </Dialog>\n )\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 {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 type {SanityClient} from '@sanity/client'\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","// Lifted from sanity/form/inputs/files/common/UploadProgress\n\nimport {Button, Card, Code, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport React from 'react'\nimport {LinearProgress} from 'sanity'\nimport styled from 'styled-components'\n\nexport const CardWrapper = styled(Card)`\n min-height: 82px;\n box-sizing: border-box;\n`\n\nexport const FlexWrapper = styled(Flex)`\n text-overflow: ellipsis;\n overflow: hidden;\n`\n\nexport const LeftSection = styled(Stack)`\n position: relative;\n width: 60%;\n`\n\nexport const CodeWrapper = styled(Code)`\n position: relative;\n width: 100%;\n\n code {\n overflow: hidden;\n text-overflow: ellipsis;\n position: relative;\n max-width: 200px;\n }\n`\n\nexport const UploadProgress = ({\n progress = 100,\n onCancel,\n filename,\n text = 'Uploading',\n}: {\n progress: number\n filename?: React.ReactNode\n onCancel?: React.MouseEventHandler<HTMLButtonElement>\n text?: React.ReactNode\n}) => {\n return (\n <CardWrapper tone=\"primary\" padding={4} border height=\"fill\">\n <FlexWrapper align=\"center\" justify=\"space-between\" height=\"fill\" direction=\"row\" gap={2}>\n <LeftSection>\n <Flex justify=\"center\" gap={[3, 3, 2, 2]} direction={['column', 'column', 'row']}>\n <Text size={1}>\n <Inline space={2}>\n {text}\n <CodeWrapper size={1}>{filename ? filename : '...'}</CodeWrapper>\n </Inline>\n </Text>\n </Flex>\n\n <Card marginTop={3} radius={5} shadow={1}>\n <LinearProgress value={progress} />\n </Card>\n </LeftSection>\n\n {onCancel ? (\n <Button\n fontSize={2}\n text=\"Cancel upload\"\n mode=\"ghost\"\n tone=\"critical\"\n onClick={onCancel}\n />\n ) : null}\n </FlexWrapper>\n </CardWrapper>\n )\n}\n","import {type PlaybackEngine, generatePlayerInitTime, initialize} from '@mux/playback-core'\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 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 MuxVideo = ({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 const [playerInitTime] = useState(() => generatePlayerInitTime())\n const playbackEngineRef = useRef<PlaybackEngine | undefined>(undefined)\n\n useEffect(() => {\n if (isLoading || !videoSrc) {\n return\n }\n const nextPlaybackEngineRef = initialize(\n {\n src: videoSrc,\n playerInitTime,\n playerSoftwareName: 'sanity-plugin-mux-input',\n playerSoftwareVersion: 'dev-preview',\n },\n video.current,\n playbackEngineRef.current\n )\n playbackEngineRef.current = nextPlaybackEngineRef\n }, [videoSrc, isLoading, playerInitTime])\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 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 <video\n playsInline\n ref={video}\n onError={handleError}\n slot=\"media\"\n preload=\"metadata\"\n crossOrigin=\"anonomous\"\n >\n <ThumbnailsMetadataTrack asset={asset} />\n </video>\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 MuxVideo\n","import type {SanityClient} from '@sanity/client'\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 {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","// todo: get these utils from @sanity/ui instead\nexport function focusRingBorderStyle(border: {color: string; width: number}): string {\n return `inset 0 0 0 ${border.width}px ${border.color}`\n}\n\nexport function focusRingStyle(opts: {\n base?: {bg: string}\n border?: {color: string; width: number}\n focusRing: {offset: number; width: number}\n}): string {\n const {base, border, focusRing} = opts\n const focusRingOutsetWidth = focusRing.offset + focusRing.width\n const focusRingInsetWidth = 0 - focusRing.offset\n const bgColor = base ? base.bg : 'var(--card-bg-color)'\n\n return [\n focusRingInsetWidth > 0 && `inset 0 0 0 ${focusRingInsetWidth}px var(--card-focus-ring-color)`,\n border && focusRingBorderStyle(border),\n focusRingInsetWidth < 0 && `0 0 0 ${0 - focusRingInsetWidth}px ${bgColor}`,\n focusRingOutsetWidth > 0 && `0 0 0 ${focusRingOutsetWidth}px var(--card-focus-ring-color)`,\n ]\n .filter(Boolean)\n .join(',')\n}\n","import {MenuItem, Theme} from '@sanity/ui'\nimport styled, {css} from 'styled-components'\n\nimport {focusRingStyle} from './withFocusRing/helpers'\n\nexport const FileButton = styled(MenuItem)(({theme}: {theme: Theme}) => {\n const {focusRing} = theme.sanity\n const base = theme.sanity.color.base\n const border = {width: 1, color: 'var(--card-border-color)'}\n\n return css`\n position: relative;\n\n &:not([data-disabled='true']) {\n &:focus-within {\n box-shadow: ${focusRingStyle({base, border, focusRing})};\n }\n }\n\n & input {\n overflow: hidden;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n min-width: 0;\n display: block;\n appearance: none;\n padding: 0;\n margin: 0;\n border: 0;\n opacity: 0;\n }\n `\n})\n","import {Box, ButtonProps, Flex, Text} from '@sanity/ui'\nimport React, {createElement, isValidElement, useId} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport {FileButton} from './FileInputMenuItem.styled'\n\nexport interface FileInputMenuItemProps extends ButtonProps {\n accept?: string\n capture?: 'user' | 'environment'\n multiple?: boolean\n onSelect?: (files: File[]) => void\n disabled?: boolean\n}\n\nexport const FileInputMenuItem = React.forwardRef(function FileInputMenuItem(\n props: FileInputMenuItemProps &\n Omit<React.HTMLProps<HTMLButtonElement>, 'as' | 'ref' | 'type' | 'value' | 'onSelect'>,\n forwardedRef: React.ForwardedRef<HTMLInputElement>\n) {\n const {\n icon,\n id: idProp,\n accept,\n capture,\n fontSize,\n multiple,\n onSelect,\n padding = 3,\n space = 3,\n textAlign,\n text,\n disabled,\n ...rest\n } = props\n const idHook = useId()\n const id = idProp || idHook\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (onSelect && event.target.files) {\n onSelect(Array.from(event.target.files))\n }\n },\n [onSelect]\n )\n\n const content = (\n <Flex align=\"center\" justify=\"flex-start\" padding={padding}>\n {/* Icon */}\n {icon && (\n <Box marginRight={text ? space : undefined}>\n <Text size={fontSize}>\n {isValidElement(icon) && icon}\n {isValidElementType(icon) && createElement(icon)}\n </Text>\n </Box>\n )}\n\n {/* Text */}\n {text && (\n <Text align={textAlign} size={fontSize} textOverflow=\"ellipsis\">\n {text}\n </Text>\n )}\n </Flex>\n )\n\n return (\n <FileButton\n {...rest}\n htmlFor={id}\n padding={0}\n fontSize={2}\n disabled={disabled}\n ref={forwardedRef}\n >\n {content}\n\n {/* Visibly hidden input */}\n <input\n data-testid=\"file-button-input\"\n accept={accept}\n capture={capture}\n id={id}\n multiple={multiple}\n onChange={handleChange}\n type=\"file\"\n value=\"\"\n disabled={disabled}\n />\n </FileButton>\n )\n})\n","import {\n EditIcon,\n EllipsisVerticalIcon,\n LockIcon,\n PlugIcon,\n ResetIcon,\n SearchIcon,\n UploadIcon,\n} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Inline,\n Label,\n Menu,\n MenuDivider,\n MenuItem,\n Popover,\n Text,\n Tooltip,\n useClickOutside,\n} from '@sanity/ui'\nimport React, {memo, useCallback, useEffect, useMemo, useState} from 'react'\nimport {PatchEvent, unset} from 'sanity'\nimport styled from 'styled-components'\n\nimport {type DialogState, type SetDialogState} from '../hooks/useDialogState'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\nimport {FileInputMenuItem} from './FileInputMenuItem'\n\nconst LockCard = styled(Card)`\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0.6;\n mix-blend-mode: screen;\n background: transparent;\n`\n\nconst LockButton = styled(Button)`\n background: transparent;\n color: white;\n`\n\nexport interface Props extends Pick<MuxInputProps, 'onChange' | 'readOnly'> {\n asset: VideoAssetDocument\n onUpload: (files: File[]) => void\n dialogState: DialogState\n setDialogState: SetDialogState\n}\nfunction PlayerActionsMenu(props: Props) {\n const {asset, readOnly, dialogState, setDialogState, onChange, onUpload} = props\n const [open, setOpen] = useState(false)\n const [menuElement, setMenuRef] = useState<HTMLDivElement | null>(null)\n const isSigned = useMemo(() => getPlaybackPolicy(asset) === 'signed', [asset])\n\n const onReset = useCallback(() => onChange(PatchEvent.from(unset([]))), [onChange])\n\n useEffect(() => {\n if (open && dialogState) {\n setOpen(false)\n }\n }, [dialogState, open])\n\n useClickOutside(\n useCallback(() => setOpen(false), []),\n [menuElement]\n )\n\n return (\n <Inline space={1} padding={2}>\n {isSigned && (\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Signed playback policy\n </Text>\n </Box>\n }\n placement=\"right\"\n portal\n >\n <LockCard radius={2} margin={2} scheme=\"dark\" tone=\"positive\">\n <LockButton icon={LockIcon} mode=\"bleed\" tone=\"positive\" />\n </LockCard>\n </Tooltip>\n )}\n {!readOnly && (\n <Button icon={EditIcon} mode=\"ghost\" onClick={() => setDialogState('edit-thumbnail')} />\n )}\n <Popover\n content={\n <Menu ref={setMenuRef}>\n <Box padding={2}>\n <Label muted size={1}>\n Replace\n </Label>\n </Box>\n <FileInputMenuItem\n accept=\"video/*\"\n icon={UploadIcon}\n mode=\"bleed\"\n onSelect={onUpload}\n text=\"Upload\"\n disabled={readOnly}\n fontSize={2}\n />\n <MenuItem\n icon={SearchIcon}\n text=\"Browse\"\n onClick={() => setDialogState('select-video')}\n />\n <MenuDivider />\n <MenuItem\n icon={PlugIcon}\n text=\"Configure API\"\n onClick={() => setDialogState('secrets')}\n />\n <MenuDivider />\n <MenuItem\n tone=\"critical\"\n icon={ResetIcon}\n text=\"Clear field\"\n onClick={onReset}\n disabled={readOnly}\n />\n </Menu>\n }\n portal\n open={open}\n >\n <Button\n icon={EllipsisVerticalIcon}\n mode=\"ghost\"\n onClick={() => {\n setDialogState(false)\n setOpen(true)\n }}\n />\n </Popover>\n </Inline>\n )\n}\n\nexport default memo(PlayerActionsMenu)\n","/* eslint-disable no-nested-ternary */\nimport {type CardTone, Card} from '@sanity/ui'\nimport React, {forwardRef, useCallback, useRef} from 'react'\nimport styled from 'styled-components'\n\nimport {withFocusRing} from './withFocusRing'\n\nconst ctrlKey = 17\nconst cmdKey = 91\n\nconst UploadCardWithFocusRing = withFocusRing(Card)\n\ninterface UploadCardProps {\n tone?: CardTone\n children: React.ReactNode\n onPaste: React.ClipboardEventHandler<HTMLInputElement>\n onDrop: React.DragEventHandler<HTMLDivElement>\n onDragOver: React.DragEventHandler<HTMLDivElement>\n onDragLeave: React.DragEventHandler<HTMLDivElement>\n onDragEnter: React.DragEventHandler<HTMLDivElement>\n}\nexport const UploadCard = forwardRef<HTMLDivElement, UploadCardProps>(\n ({children, tone, onPaste, onDrop, onDragEnter, onDragLeave, onDragOver}, forwardedRef) => {\n const ctrlDown = useRef(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const handleKeyDown = useCallback<React.KeyboardEventHandler<HTMLDivElement>>((event) => {\n if (event.keyCode == ctrlKey || event.keyCode == cmdKey) {\n ctrlDown.current = true\n }\n const vKey = 86\n if (ctrlDown.current && event.keyCode == vKey) {\n inputRef.current!.focus()\n }\n }, [])\n const handleKeyUp = useCallback<React.KeyboardEventHandler<HTMLDivElement>>((event) => {\n if (event.keyCode == ctrlKey || event.keyCode == cmdKey) {\n ctrlDown.current = false\n }\n }, [])\n\n return (\n <UploadCardWithFocusRing\n tone={tone}\n height=\"fill\"\n ref={forwardedRef}\n padding={0}\n radius={2}\n shadow={0}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onPaste={onPaste}\n onDrop={onDrop}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={onDragOver}\n >\n <HiddenInput ref={inputRef} onPaste={onPaste} />\n {children}\n </UploadCardWithFocusRing>\n )\n }\n)\n\nconst HiddenInput = styled.input.attrs({type: 'text'})`\n position: absolute;\n border: 0;\n color: white;\n opacity: 0;\n\n &:focus {\n outline: none;\n }\n`\n","import {rem, Theme} from '@sanity/ui'\nimport {type ComponentType} from 'react'\nimport styled, {css} from 'styled-components'\n\nimport {focusRingBorderStyle, focusRingStyle} from './helpers'\n\nexport function withFocusRing<Props>(component: ComponentType<Props>) {\n return styled(component as unknown as any)<Props & {$border?: boolean}>(\n (props: {theme: Theme; $border?: boolean}) => {\n const border = {\n width: props.$border ? 1 : 0,\n color: 'var(--card-border-color)',\n }\n\n return css`\n --card-focus-box-shadow: ${focusRingBorderStyle(border)};\n\n border-radius: ${rem(props.theme.sanity.radius[1])};\n outline: none;\n box-shadow: var(--card-focus-box-shadow);\n\n &:focus {\n --card-focus-box-shadow: ${focusRingStyle({\n base: props.theme.sanity.color.base,\n border,\n focusRing: props.theme.sanity.focusRing,\n })};\n }\n `\n }\n )\n}\n","import {type ButtonProps, Button} from '@sanity/ui'\nimport React, {useCallback, useId, useRef} from 'react'\nimport styled from 'styled-components'\n\nconst HiddenInput = styled.input`\n overflow: hidden;\n width: 0.1px;\n height: 0.1px;\n opacity: 0;\n position: absolute;\n z-index: -1;\n`\n\nconst Label = styled.label`\n position: relative;\n`\n\nexport interface FileInputButtonProps extends ButtonProps {\n onSelect: (files: FileList) => void\n}\nexport const FileInputButton = ({onSelect, ...props}: FileInputButtonProps) => {\n const inputId = `FileSelect${useId()}`\n const inputRef = useRef<HTMLInputElement>(null)\n const handleSelect = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (event) => {\n if (onSelect) {\n onSelect(event.target.files!)\n }\n },\n [onSelect]\n )\n const handleButtonClick = useCallback(() => inputRef.current?.click(), [])\n return (\n <Label htmlFor={inputId}>\n <HiddenInput\n accept=\"video/*\"\n ref={inputRef}\n tabIndex={0}\n type=\"file\"\n id={inputId}\n onChange={handleSelect}\n value=\"\"\n />\n <Button\n onClick={handleButtonClick}\n mode=\"default\"\n tone=\"primary\"\n style={{width: '100%'}}\n {...props}\n />\n </Label>\n )\n}\n","import {PlugIcon, SearchIcon, UploadIcon} from '@sanity/icons'\nimport {DocumentVideoIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Inline, Text} from '@sanity/ui'\nimport React, {useCallback} from 'react'\nimport styled from 'styled-components'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {type FileInputButtonProps, FileInputButton} from './FileInputButton'\n\nconst UploadCard = styled(Card)`\n && {\n border-style: dashed;\n }\n`\n\nconst ConfigureApiBox = styled(Box)`\n position: absolute;\n top: 0;\n right: 0;\n`\n\ninterface UploadPlaceholderProps {\n setDialogState: SetDialogState\n readOnly: boolean\n hovering: boolean\n needsSetup: boolean\n onSelect: FileInputButtonProps['onSelect']\n}\nexport default function UploadPlaceholder(props: UploadPlaceholderProps) {\n const {setDialogState, readOnly, onSelect, hovering, needsSetup} = props\n const handleBrowse = useCallback(() => setDialogState('select-video'), [setDialogState])\n const handleConfigureApi = useCallback(() => setDialogState('secrets'), [setDialogState])\n\n return (\n <Box style={{padding: 1, position: 'relative'}} height=\"stretch\">\n <UploadCard\n sizing=\"border\"\n height=\"fill\"\n tone={readOnly ? 'transparent' : 'inherit'}\n border\n padding={3}\n style={hovering ? {borderColor: 'transparent'} : undefined}\n >\n <ConfigureApiBox padding={3}>\n <Button\n padding={3}\n radius={3}\n tone={needsSetup ? 'critical' : undefined}\n onClick={handleConfigureApi}\n icon={PlugIcon}\n mode=\"bleed\"\n />\n </ConfigureApiBox>\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap={4}\n direction={['column', 'column', 'row']}\n paddingY={[2, 2, 0]}\n sizing=\"border\"\n height=\"fill\"\n >\n <Flex align=\"center\" justify=\"center\" gap={2} flex={1}>\n <Flex justify=\"center\">\n <Text muted>\n <DocumentVideoIcon />\n </Text>\n </Flex>\n <Flex justify=\"center\">\n <Text size={1} muted>\n Drag video or paste URL here\n </Text>\n </Flex>\n </Flex>\n <Inline space={2}>\n <FileInputButton\n mode=\"ghost\"\n tone=\"default\"\n icon={UploadIcon}\n text=\"Upload\"\n onSelect={onSelect}\n />\n <Button mode=\"ghost\" icon={SearchIcon} text=\"Select\" onClick={handleBrowse} />\n </Inline>\n </Flex>\n </UploadCard>\n </Box>\n )\n}\n","/* eslint-disable no-nested-ternary */\n// This component needs to be refactored into a functional component\n\nimport type {SanityClient} from '@sanity/client'\nimport React, {Component} from 'react'\nimport {type Observable, Subject} from 'rxjs'\nimport {takeUntil, tap} from 'rxjs/operators'\nimport {PatchEvent, set, setIfMissing} from 'sanity'\n\nimport {uploadFile, uploadUrl} from '../actions/upload'\nimport {type DialogState, type SetDialogState} from '../hooks/useDialogState'\nimport {extractDroppedFiles} from '../util/extractFiles'\nimport type {Config, MuxInputProps, Secrets, VideoAssetDocument} from '../util/types'\nimport InputBrowser from './InputBrowser'\nimport Player from './Player'\nimport PlayerActionsMenu from './PlayerActionsMenu'\nimport {UploadCard} from './Uploader.styled'\nimport UploadPlaceholder from './UploadPlaceholder'\nimport {UploadProgress} from './UploadProgress'\n\ninterface Props extends Pick<MuxInputProps, 'onChange' | 'readOnly'> {\n config: Config\n client: SanityClient\n secrets: Secrets\n asset: VideoAssetDocument | null | undefined\n dialogState: DialogState\n setDialogState: SetDialogState\n needsSetup: boolean\n}\n\ninterface State {\n isDraggingOver: boolean\n invalidPaste: boolean\n invalidFile: boolean\n fileInfo: {name?: string; type?: string} | null\n uuid: null\n uploadProgress: number | null\n error: Error | null\n url: string | null\n}\n\nclass MuxVideoInputUploader extends Component<Props, State> {\n state: State = {\n isDraggingOver: false,\n invalidPaste: false,\n invalidFile: false,\n uploadProgress: null,\n fileInfo: null,\n uuid: null,\n error: null,\n url: null,\n }\n dragEnteredEls: EventTarget[] = []\n\n ctrlDown = false\n\n // eslint-disable-next-line no-warning-comments\n // @TODO add proper typings for the return values of uploadFile and uploadUrl\n upload: any | null = null\n\n container = React.createRef<HTMLDivElement>()\n\n onCancelUploadButtonClick$: Observable<unknown> | undefined\n handleCancelUploadButtonClick: React.MouseEventHandler<HTMLButtonElement> | undefined\n\n componentWillUnmount() {\n this.unSubscribeToUpload()\n }\n\n componentDidMount() {\n const events$ = new Subject()\n this.onCancelUploadButtonClick$ = events$.asObservable()\n this.handleCancelUploadButtonClick = (event) => events$.next(event)\n }\n\n unSubscribeToUpload() {\n if (this.upload && !this.upload.closed) {\n this.upload.unsubscribe()\n }\n }\n\n handleProgress = (evt: {percent: number}) => {\n this.setState({uploadProgress: evt.percent})\n }\n\n onUpload = (files: FileList | File[]) => {\n this.setState({uploadProgress: 0, fileInfo: null, uuid: null})\n this.upload = uploadFile(this.props.config, this.props.client, files[0], {\n enableSignedUrls: this.props.secrets.enableSignedUrls,\n })\n .pipe(\n takeUntil(\n this.onCancelUploadButtonClick$!.pipe(\n tap(() => {\n if (this.state.uuid) {\n this.props.client.delete(this.state.uuid)\n }\n })\n )\n )\n )\n .subscribe({\n complete: () => {\n this.setState({error: null, uploadProgress: null, uuid: null})\n },\n next: (event) => {\n this.handleUploadEvent(event)\n },\n error: (err) => {\n this.setState({error: err, uploadProgress: null, uuid: null})\n },\n })\n }\n\n // eslint-disable-next-line no-warning-comments\n // @TODO add proper typings for the Observable events\n handleUploadEvent = (event: any) => {\n switch (event.type) {\n case 'success':\n return this.handleUploadSuccess(event.asset)\n case 'progress':\n return this.handleProgress(event)\n case 'file':\n return this.setState({fileInfo: event.file})\n case 'uuid':\n // Means we created a mux.videoAsset document with an uuid\n return this.setState({uuid: event.uuid})\n case 'url':\n return this.setState({url: event.url, uploadProgress: 100})\n default:\n return null\n }\n }\n\n handleUploadSuccess = (asset: VideoAssetDocument) => {\n this.setState({uploadProgress: 100})\n this.props.onChange(\n PatchEvent.from([\n setIfMissing({asset: {}}),\n set({_type: 'reference', _weak: true, _ref: asset._id}, ['asset']),\n ])\n )\n }\n\n handlePaste: React.ClipboardEventHandler<HTMLInputElement> = (event) => {\n const clipboardData = event.clipboardData || (window as any).clipboardData\n const url = clipboardData.getData('text')\n const options = {enableSignedUrls: this.props.secrets.enableSignedUrls}\n\n this.upload = uploadUrl(this.props.config, this.props.client, url, options).subscribe({\n complete: () => {\n this.setState({error: null, uploadProgress: null, url: null})\n },\n next: (sEvent) => {\n this.handleUploadEvent(sEvent)\n },\n error: (err) => {\n let error\n // Don't output error dialog when just invalid url\n if (!err.message.toLowerCase().match('invalid url')) {\n error = err\n }\n this.setState({invalidPaste: true, error}, () => {\n setTimeout(() => {\n this.setState({invalidPaste: false, uploadProgress: null})\n }, 2000)\n })\n },\n })\n }\n\n handleDrop: React.DragEventHandler<HTMLDivElement> = (event) => {\n this.setState({isDraggingOver: false})\n event.preventDefault()\n event.stopPropagation()\n extractDroppedFiles(event.nativeEvent.dataTransfer!).then((files) => {\n if (files) {\n // eslint-disable-next-line no-warning-comments\n // @TODO fix the typing on files\n this.onUpload(files as any)\n }\n })\n }\n\n handleDragOver: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.preventDefault()\n event.stopPropagation()\n }\n\n handleDragEnter: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.stopPropagation()\n this.dragEnteredEls.push(event.target)\n this.setState({isDraggingOver: true})\n const type = event.dataTransfer.items?.[0]?.type\n this.setState({invalidFile: !type.startsWith('video/')})\n }\n\n handleDragLeave: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.stopPropagation()\n const idx = this.dragEnteredEls.indexOf(event.target)\n if (idx > -1) {\n this.dragEnteredEls.splice(idx, 1)\n }\n if (this.dragEnteredEls.length === 0) {\n this.setState({isDraggingOver: false})\n }\n }\n\n render() {\n if (this.state.uploadProgress !== null) {\n return (\n <UploadProgress\n onCancel={this.handleCancelUploadButtonClick!}\n progress={this.state.uploadProgress}\n filename={this.state.fileInfo?.name || this.state.url}\n />\n )\n }\n\n if (this.state.error) {\n // @TODO better error handling\n throw this.state.error\n }\n\n return (\n <>\n <UploadCard\n tone={\n this.state.isDraggingOver && (this.state.invalidPaste || this.state.invalidFile)\n ? 'critical'\n : this.state.isDraggingOver\n ? 'positive'\n : undefined\n }\n onDrop={this.handleDrop}\n onDragOver={this.handleDragOver}\n onDragLeave={this.handleDragLeave}\n onDragEnter={this.handleDragEnter}\n onPaste={this.handlePaste}\n ref={this.container}\n >\n {this.props.asset ? (\n <Player\n readOnly={this.props.readOnly}\n asset={this.props.asset}\n onChange={this.props.onChange}\n dialogState={this.props.dialogState}\n setDialogState={this.props.setDialogState}\n buttons={\n <PlayerActionsMenu\n asset={this.props.asset}\n dialogState={this.props.dialogState}\n setDialogState={this.props.setDialogState}\n onChange={this.props.onChange}\n onUpload={this.onUpload}\n readOnly={this.props.readOnly}\n />\n }\n />\n ) : (\n <UploadPlaceholder\n hovering={this.state.isDraggingOver}\n onSelect={this.onUpload}\n readOnly={this.props.readOnly!}\n setDialogState={this.props.setDialogState}\n needsSetup={this.props.needsSetup}\n />\n )}\n </UploadCard>\n {this.props.dialogState === 'select-video' && (\n <InputBrowser\n asset={this.props.asset}\n onChange={this.props.onChange}\n setDialogState={this.props.setDialogState}\n />\n )}\n </>\n )\n }\n}\n\nexport default MuxVideoInputUploader\n","import type {SanityClient} from '@sanity/client'\nimport {useCallback} from 'react'\n\nimport {createSigningKeys, haveValidSigningKeys, saveSecrets, testSecrets} from '../actions/secrets'\nimport type {Secrets} from '../util/types'\n\nexport const useSaveSecrets = (client: SanityClient, secrets: Secrets) => {\n return useCallback(\n async ({\n token,\n secretKey,\n enableSignedUrls,\n }: Pick<Secrets, 'token' | 'secretKey' | 'enableSignedUrls'>): Promise<Secrets> => {\n let {signingKeyId, signingKeyPrivate} = secrets\n\n try {\n await saveSecrets(\n client,\n token!,\n secretKey!,\n enableSignedUrls,\n signingKeyId!,\n signingKeyPrivate!\n )\n const valid = await testSecrets(client)\n if (!valid?.status && token && secretKey) {\n throw new Error('Invalid secrets')\n }\n } catch (err) {\n console.error('Error while trying to save secrets:', err)\n throw err\n }\n\n if (enableSignedUrls) {\n const hasValidSigningKeys = await haveValidSigningKeys(\n client,\n signingKeyId!,\n signingKeyPrivate!\n )\n\n if (!hasValidSigningKeys) {\n try {\n const {data} = await createSigningKeys(client)\n signingKeyId = data.id\n signingKeyPrivate = data.private_key\n await saveSecrets(\n client,\n token!,\n secretKey!,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate\n )\n } catch (err: any) {\n // eslint-disable-next-line no-console\n console.log('Error while creating and saving signing key:', err?.message)\n throw err\n }\n }\n }\n return {\n token,\n secretKey,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate,\n }\n },\n [client, secrets]\n )\n}\n","import {useReducer} from 'react'\n\nimport type {Secrets} from '../util/types'\n\nexport interface State extends Pick<Secrets, 'token' | 'secretKey' | 'enableSignedUrls'> {\n submitting: boolean\n error: string | null\n}\nexport type Action =\n | {type: 'submit'}\n | {type: 'error'; payload: string}\n | {type: 'reset'; payload: Secrets}\n | {type: 'change'; payload: {name: 'token'; value: string}}\n | {type: 'change'; payload: {name: 'secretKey'; value: string}}\n | {type: 'change'; payload: {name: 'enableSignedUrls'; value: boolean}}\nfunction init({token, secretKey, enableSignedUrls}: Secrets): State {\n return {\n submitting: false,\n error: null,\n // Form inputs don't set the state back to null when clearing a field, but uses empty strings\n // This ensures the `dirty` check works correctly\n token: token ?? '',\n secretKey: secretKey ?? '',\n enableSignedUrls: enableSignedUrls ?? false,\n }\n}\nfunction reducer(state: State, action: Action) {\n switch (action?.type) {\n case 'submit':\n return {...state, submitting: true, error: null}\n case 'error':\n return {...state, submitting: false, error: action.payload}\n case 'reset':\n return init(action.payload)\n case 'change':\n return {...state, [action.payload.name]: action.payload.value}\n default:\n throw new Error(`Unknown action type: ${(action as any)?.type}`)\n }\n}\n\nexport const useSecretsFormState = (secrets: Secrets) => useReducer(reducer, secrets, init)\n","import React, {useId, useMemo} from 'react'\n\n// Mapping ids to ensure filter refs are unique, otherwise all Logo instances are hidden if the first SVG is hidden, due to how SVGs deal with relative links and ids\nconst ids = [\n 'title',\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'f',\n 'g',\n 'h',\n 'i',\n 'j',\n 'k',\n 'l',\n 'm',\n 'n',\n 'o',\n 'p',\n 'q',\n 'r',\n] as const\nexport interface Props {\n height?: number\n}\nexport default function MuxLogo({height = 26}) {\n const id = useId()\n const [titleId, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r] = useMemo<typeof ids>(\n () => ids.map((field) => `${id}-${field}`) as unknown as typeof ids,\n [id]\n )\n\n return (\n <svg\n aria-labelledby={titleId}\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlSpace=\"preserve\"\n viewBox=\"92.08878326416016 102.66712188720703 692.76123046875 219.99948120117188\"\n style={{height: `${height}px`}}\n >\n <title id={titleId}>Mux Logo</title>\n <defs>\n <linearGradient\n id={c}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(528.38055 0 0 -528.38055 63.801 159.5)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={d}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(523.66766 0 0 -523.66766 67.897 159.5)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={g}\n spreadMethod=\"pad\"\n gradientTransform=\"rotate(180 296.075 79.75) scale(524.84045)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={i}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(524.84045 0 0 -524.84045 63.801 159.5)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={j}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(523.08514 0 0 -523.08514 67.897 224.446)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={k}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(524.84045 0 0 -524.84045 63.801 94.553)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={l}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(524.84045 0 0 -524.84045 63.801 159.5)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={m}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(524.84045 0 0 -524.84045 63.801 94.554)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={p}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(521.97632 0 0 -521.97632 69.067 191.973)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={q}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(523.09039 0 0 -523.09039 67.312 191.973)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <linearGradient\n id={r}\n spreadMethod=\"pad\"\n gradientTransform=\"matrix(524.84045 0 0 -524.84045 63.801 159.5)\"\n gradientUnits=\"userSpaceOnUse\"\n y2={0}\n x2={1}\n y1={0}\n x1={0}\n >\n <stop\n offset={0}\n style={{\n stopOpacity: 1,\n stopColor: '#ff4e00',\n }}\n />\n <stop\n offset={1}\n style={{\n stopOpacity: 1,\n stopColor: '#ff1791',\n }}\n />\n </linearGradient>\n <clipPath id={a} clipPathUnits=\"userSpaceOnUse\">\n <path d=\"M0 319h657.706V0H0Z\" />\n </clipPath>\n <clipPath id={b} clipPathUnits=\"userSpaceOnUse\">\n <path d=\"M423.64 242h164.999V77H423.64Z\" />\n </clipPath>\n <clipPath id={e} clipPathUnits=\"userSpaceOnUse\">\n <path d=\"M0 319h657.706V0H0Z\" />\n </clipPath>\n <clipPath id={f} clipPathUnits=\"userSpaceOnUse\">\n <path d=\"M311.3 242h93.031V77H311.3Z\" />\n </clipPath>\n <clipPath id={h} clipPathUnits=\"userSpaceOnUse\">\n <path d=\"M198.96 242h35.106V77H198.96Z\" />\n </clipPath>\n <clipPath id={n} clipPathUnits=\"userSpaceOnUse\">\n <path d=\"M0 319h657.706V0H0Z\" />\n </clipPath>\n <clipPath id={o} clipPathUnits=\"userSpaceOnUse\">\n <path d=\"M69.067 242H169.12V141.947H69.067Z\" />\n </clipPath>\n </defs>\n <g clipPath={`url(#${a})`} transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\">\n <g\n style={{\n opacity: 0.69999701,\n }}\n clipPath={`url(#${b})`}\n >\n <path\n style={{\n fill: `url(#${c})`,\n stroke: 'none',\n }}\n d=\"M558.674 82.142c6.855-6.855 17.969-6.855 24.824 0 6.854 6.855 6.854 17.969 0 24.823L453.605 236.858c-6.855 6.855-17.969 6.855-24.824 0s-6.855-17.969 0-24.823z\"\n />\n </g>\n </g>\n <path\n style={{\n fill: `url(#${d})`,\n stroke: 'none',\n }}\n d=\"M558.674 236.858 428.781 106.966c-6.855-6.855-6.855-17.969 0-24.825 6.855-6.854 17.969-6.854 24.823 0l129.894 129.894c6.854 6.855 6.854 17.968 0 24.823A17.498 17.498 0 0 1 571.086 242a17.495 17.495 0 0 1-12.412-5.142\"\n transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\"\n />\n <g clipPath={`url(#${e})`} transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\">\n <g\n style={{\n opacity: 0.69999701,\n }}\n clipPath={`url(#${f})`}\n >\n <path\n style={{\n fill: `url(#${g})`,\n stroke: 'none',\n }}\n d=\"M328.853 112.107c22.297 0 40.372 18.075 40.372 40.372v71.315c0 10.054 7.505 18.206 17.554 18.206 10.048 0 17.552-8.152 17.552-18.206v-71.315c0-41.686-33.793-75.479-75.478-75.479-9.694 0-17.553 7.859-17.553 17.554 0 9.694 7.859 17.553 17.553 17.553\"\n />\n </g>\n <g\n style={{\n opacity: 0.69999701,\n }}\n clipPath={`url(#${h})`}\n >\n <path\n style={{\n fill: `url(#${i})`,\n stroke: 'none',\n }}\n d=\"M216.513 242c-10.049 0-17.553-8.152-17.553-18.206V95.206c0-10.054 7.504-18.206 17.553-18.206 10.048 0 17.553 8.152 17.553 18.206v128.588c0 10.054-7.505 18.206-17.553 18.206\"\n />\n </g>\n </g>\n <path\n style={{\n fill: `url(#${j})`,\n stroke: 'none',\n }}\n d=\"M369.225 224.447c0-9.694 7.859-17.553 17.553-17.553 9.695 0 17.553 7.859 17.553 17.553s-7.858 17.552-17.553 17.552c-9.694 0-17.553-7.858-17.553-17.552\"\n transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\"\n />\n <path\n style={{\n fill: `url(#${k})`,\n stroke: 'none',\n }}\n d=\"M553.532 94.554c0-9.695 7.859-17.554 17.553-17.554 9.695 0 17.554 7.859 17.554 17.554 0 9.694-7.859 17.552-17.554 17.552-9.694 0-17.553-7.858-17.553-17.552\"\n transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\"\n />\n <path\n style={{\n fill: `url(#${l})`,\n stroke: 'none',\n }}\n d=\"M69.067 223.794V95.206C69.067 85.152 76.571 77 86.62 77c10.048 0 17.553 8.152 17.553 18.206v128.588c0 10.055-7.505 18.205-17.553 18.205-10.049 0-17.553-8.15-17.553-18.205\"\n transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\"\n />\n <path\n style={{\n fill: `url(#${m})`,\n stroke: 'none',\n }}\n d=\"M198.96 94.554c0-9.695 7.859-17.554 17.553-17.554 9.695 0 17.554 7.859 17.554 17.554 0 9.694-7.859 17.553-17.554 17.553-9.694 0-17.553-7.859-17.553-17.553\"\n transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\"\n />\n <g clipPath={`url(#${n})`} transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\">\n <g\n style={{\n opacity: 0.69999701,\n }}\n clipPath={`url(#${o})`}\n >\n <path\n style={{\n fill: `url(#${p})`,\n stroke: 'none',\n }}\n d=\"M139.155 147.088c6.855-6.855 17.969-6.855 24.824 0s6.855 17.969 0 24.824l-64.947 64.946c-6.855 6.855-17.969 6.855-24.824 0s-6.855-17.969 0-24.823z\"\n />\n </g>\n </g>\n <path\n style={{\n fill: `url(#${q})`,\n stroke: 'none',\n }}\n d=\"m204.101 236.858-64.947-64.946c-6.854-6.855-6.854-17.969 0-24.824 6.856-6.855 17.97-6.855 24.824 0l64.947 64.947c6.855 6.855 6.855 17.968 0 24.823A17.495 17.495 0 0 1 216.513 242a17.498 17.498 0 0 1-12.412-5.142\"\n transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\"\n />\n <path\n style={{\n fill: `url(#${r})`,\n stroke: 'none',\n }}\n d=\"M253.374 223.794v-71.315c0-41.685 33.793-75.479 75.479-75.479 9.695 0 17.553 7.859 17.553 17.554 0 9.694-7.858 17.553-17.553 17.553-22.297 0-40.372 18.075-40.372 40.372v71.315c0 10.055-7.505 18.205-17.554 18.205s-17.553-8.15-17.553-18.205\"\n transform=\"matrix(1.33333 0 0 -1.33333 0 425.333)\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\n\nimport MuxLogo from './MuxLogo'\n\nconst Logo = styled.span`\n display: inline-block;\n height: 0.8em;\n margin-right: 1em;\n transform: translate(0.3em, -0.2em);\n`\n\nexport const Header = () => (\n <>\n <Logo>\n <MuxLogo height={13} />\n </Logo>\n API Credentials\n </>\n)\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport React, {memo} from 'react'\n\n// @TODO: get rid of this once v3 core is stable\n\nexport interface Props {\n children: React.ReactNode\n title: React.ReactNode\n description?: React.ReactNode\n inputId: string\n}\n\nfunction FormField(props: Props) {\n const {children, title, description, inputId} = props\n\n return (\n <Stack space={1}>\n <Flex align=\"flex-end\">\n <Box flex={1} paddingY={2}>\n <Stack space={2}>\n <Flex>\n <Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {title || <em>Untitled</em>}\n </Text>\n\n {description && (\n <Text muted size={1}>\n {description}\n </Text>\n )}\n </Flex>\n </Stack>\n </Box>\n </Flex>\n <div>{children}</div>\n </Stack>\n )\n}\n\nexport default memo(FormField)\n","import {\n Box,\n Button,\n Card,\n Checkbox,\n Code,\n Dialog,\n Flex,\n Inline,\n Stack,\n Text,\n TextInput,\n} from '@sanity/ui'\nimport React, {memo, useCallback, useEffect, useId, useMemo, useRef} from 'react'\nimport {clear, preload} from 'suspend-react'\n\nimport {useClient} from '../hooks/useClient'\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {useSaveSecrets} from '../hooks/useSaveSecrets'\nimport {useSecretsFormState} from '../hooks/useSecretsFormState'\nimport {cacheNs} from '../util/constants'\nimport {_id as secretsId} from '../util/readSecrets'\nimport type {Secrets} from '../util/types'\nimport {Header} from './ConfigureApi.styled'\nimport FormField from './FormField'\n\nexport interface Props {\n setDialogState: SetDialogState\n secrets: Secrets\n}\nconst fieldNames = ['token', 'secretKey', 'enableSignedUrls'] as const\nfunction ConfigureApi({secrets, setDialogState}: Props) {\n const client = useClient()\n const [state, dispatch] = useSecretsFormState(secrets)\n const hasSecretsInitially = useMemo(() => secrets.token && secrets.secretKey, [secrets])\n const handleClose = useCallback(() => setDialogState(false), [setDialogState])\n const dirty = useMemo(\n () =>\n secrets.token !== state.token ||\n secrets.secretKey !== state.secretKey ||\n secrets.enableSignedUrls !== state.enableSignedUrls,\n [secrets, state]\n )\n const id = `ConfigureApi${useId()}`\n const [tokenId, secretKeyId, enableSignedUrlsId] = useMemo<typeof fieldNames>(\n () => fieldNames.map((field) => `${id}-${field}`) as unknown as typeof fieldNames,\n [id]\n )\n const firstField = useRef<HTMLInputElement>(null)\n const handleSaveSecrets = useSaveSecrets(client, secrets)\n const saving = useRef(false)\n\n const handleSubmit = useCallback(\n (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n\n if (!saving.current && event.currentTarget.reportValidity()) {\n saving.current = true\n dispatch({type: 'submit'})\n const {token, secretKey, enableSignedUrls} = state\n handleSaveSecrets({token, secretKey, enableSignedUrls})\n .then((savedSecrets) => {\n const {projectId, dataset} = client.config()\n clear([cacheNs, secretsId, projectId, dataset])\n preload(() => Promise.resolve(savedSecrets), [cacheNs, secretsId, projectId, dataset])\n setDialogState(false)\n })\n .catch((err) => dispatch({type: 'error', payload: err.message}))\n .finally(() => {\n saving.current = false\n })\n }\n },\n [client, dispatch, handleSaveSecrets, setDialogState, state]\n )\n const handleChangeToken = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n dispatch({\n type: 'change',\n payload: {name: 'token', value: event.currentTarget.value},\n })\n },\n [dispatch]\n )\n const handleChangeSecretKey = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n dispatch({\n type: 'change',\n payload: {name: 'secretKey', value: event.currentTarget.value},\n })\n },\n [dispatch]\n )\n const handleChangeEnableSignedUrls = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n dispatch({\n type: 'change',\n payload: {name: 'enableSignedUrls', value: event.currentTarget.checked},\n })\n },\n [dispatch]\n )\n\n useEffect(() => {\n if (firstField.current) {\n firstField.current.focus()\n }\n }, [firstField])\n\n return (\n <Dialog id={id} onClose={handleClose} header={<Header />} width={0}>\n <Box padding={4} style={{position: 'relative'}}>\n <form onSubmit={handleSubmit} noValidate>\n <Stack space={4}>\n {!hasSecretsInitially && (\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"primary\">\n <Stack space={3}>\n <Text size={1}>\n To set up a new access token, go to your{' '}\n <a\n href=\"https://dashboard.mux.com/settings/access-tokens\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n account on mux.com\n </a>\n .\n </Text>\n <Text size={1}>\n The access token needs permissions: <strong>Mux Video </strong>\n (Full Access) and <strong>Mux Data</strong> (Read)\n <br />\n The credentials will be stored safely in a hidden document only available to\n editors.\n </Text>\n </Stack>\n </Card>\n )}\n <FormField title=\"Access Token\" inputId={tokenId}>\n <TextInput\n id={tokenId}\n ref={firstField}\n onChange={handleChangeToken}\n type=\"text\"\n value={state.token ?? ''}\n required={!!state.secretKey || state.enableSignedUrls}\n />\n </FormField>\n <FormField title=\"Secret Key\" inputId={secretKeyId}>\n <TextInput\n id={secretKeyId}\n onChange={handleChangeSecretKey}\n type=\"text\"\n value={state.secretKey ?? ''}\n required={!!state.token || state.enableSignedUrls}\n />\n </FormField>\n\n <Stack space={4}>\n <Flex align=\"center\">\n <Checkbox\n id={enableSignedUrlsId}\n onChange={handleChangeEnableSignedUrls}\n checked={state.enableSignedUrls}\n style={{display: 'block'}}\n />\n <Box flex={1} paddingLeft={3}>\n <Text>\n <label htmlFor={enableSignedUrlsId}>Enable Signed Urls</label>\n </Text>\n </Box>\n </Flex>\n {/* TODO: use a popover instead to avoid jumping around */}\n {secrets.signingKeyId && state.enableSignedUrls ? (\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"caution\">\n <Stack space={3}>\n <Text size={1}>The signing key ID that Sanity will use is:</Text>\n <Code size={1}>{secrets.signingKeyId}</Code>\n <Text size={1}>\n This key is only used for previewing content in the Sanity UI.\n <br />\n You should generate a different key to use in your application server.\n </Text>\n </Stack>\n </Card>\n ) : null}\n </Stack>\n\n <Inline space={2}>\n <Button\n text=\"Save\"\n disabled={!dirty}\n loading={state.submitting}\n tone=\"primary\"\n mode=\"default\"\n type=\"submit\"\n />\n <Button\n disabled={state.submitting}\n text=\"Cancel\"\n mode=\"bleed\"\n onClick={handleClose}\n />\n </Inline>\n {state.error && (\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"critical\">\n <Text>{state.error}</Text>\n </Card>\n )}\n </Stack>\n </form>\n </Box>\n </Dialog>\n )\n}\n\nexport default memo(ConfigureApi)\n","import {PlugIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Grid, Heading, Inline} from '@sanity/ui'\nimport React, {useCallback} from 'react'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport MuxLogo from './MuxLogo'\n\ninterface OnboardProps {\n setDialogState: SetDialogState\n}\n\nexport default function Onboard(props: OnboardProps) {\n const {setDialogState} = props\n const handleOpen = useCallback(() => setDialogState('secrets'), [setDialogState])\n\n return (\n <>\n <div style={{padding: 2}}>\n <Card\n display=\"flex\"\n sizing=\"border\"\n style={{\n aspectRatio: '16/9',\n width: '100%',\n boxShadow: 'var(--card-bg-color) 0 0 0 2px',\n }}\n paddingX={[2, 3, 4, 4]}\n radius={1}\n tone=\"transparent\"\n >\n <Flex justify=\"flex-start\" align=\"center\">\n <Grid columns={1} gap={[2, 3, 4, 4]}>\n <Inline paddingY={1}>\n <div style={{height: '32px'}}>\n <MuxLogo />\n </div>\n </Inline>\n <Inline paddingY={1}>\n <Heading size={[0, 1, 2, 2]}>\n Upload and preview videos directly from your studio.\n </Heading>\n </Inline>\n <Inline paddingY={1}>\n <Button mode=\"ghost\" icon={PlugIcon} text=\"Configure API\" onClick={handleOpen} />\n </Inline>\n </Grid>\n </Flex>\n </Card>\n </div>\n </>\n )\n}\n","import React, {memo} from 'react'\n\nimport {useAssetDocumentValues} from '../hooks/useAssetDocumentValues'\nimport {useClient} from '../hooks/useClient'\nimport {useDialogState} from '../hooks/useDialogState'\nimport {useMuxPolling} from '../hooks/useMuxPolling'\nimport {useSecretsDocumentValues} from '../hooks/useSecretsDocumentValues'\nimport type {Config, MuxInputProps} from '../util/types'\nimport Uploader from './__legacy__Uploader'\nimport ConfigureApi from './ConfigureApi'\nimport {InputFallback} from './Input.styled'\nimport Onboard from './Onboard'\n\nexport interface InputProps extends MuxInputProps {\n config: Config\n}\nconst Input = (props: InputProps) => {\n const client = useClient()\n const secretDocumentValues = useSecretsDocumentValues()\n const assetDocumentValues = useAssetDocumentValues(props.value?.asset)\n const poll = useMuxPolling(props.readOnly ? undefined : assetDocumentValues?.value || undefined)\n const [dialogState, setDialogState] = useDialogState()\n\n const error = secretDocumentValues.error || assetDocumentValues.error || poll.error /*||\n // @TODO move errored logic to Uploader, where handleRemoveVideo can be called\n (assetDocumentValues.value?.status === 'errored'\n ? new Error(assetDocumentValues.value.data?.errors?.messages?.join(' '))\n : undefined)\n // */\n if (error) {\n // @TODO deal with it more gracefully\n throw error\n }\n const isLoading = secretDocumentValues.isLoading || assetDocumentValues.isLoading\n\n return (\n <>\n {isLoading ? (\n <InputFallback />\n ) : (\n <>\n {secretDocumentValues.value.needsSetup && !assetDocumentValues.value ? (\n <Onboard setDialogState={setDialogState} />\n ) : (\n <Uploader\n {...props}\n config={props.config}\n onChange={props.onChange}\n client={client}\n secrets={secretDocumentValues.value.secrets}\n asset={assetDocumentValues.value}\n dialogState={dialogState}\n setDialogState={setDialogState}\n needsSetup={secretDocumentValues.value.needsSetup}\n />\n )}\n\n {dialogState === 'secrets' && (\n <ConfigureApi\n setDialogState={setDialogState}\n secrets={secretDocumentValues.value.secrets}\n />\n )}\n </>\n )}\n </>\n )\n}\n\nexport default memo(Input)\n","// Handy little state machine to simplify managing which root level dialog to open\n\nimport {useState} from 'react'\n\nexport type DialogState = 'secrets' | 'select-video' | 'edit-thumbnail' | false\n\nexport function useDialogState() {\n return useState<DialogState>(false)\n}\n\nexport type SetDialogState = ReturnType<typeof useDialogState>[1]\n"],"names":["path","createUpChunkObservable","uuid","uploadUrl","source","Observable","subscriber","upchunk","UpChunk","createUpload","endpoint","file","dynamicChunkSize","on","next","type","id","complete","data","error","Error","detail","message","percent","pause","resume","abort","deleteAsset","client","assetId","dataset","config","request","url","withCredentials","method","saveSecrets","token","secretKey","enableSignedUrls","signingKeyId","signingKeyPrivate","doc","_id","_type","createOrReplace","testSecretsObservable","defer","observable","cancelUpload","concat","clientConfig","async","updateAssetDocumentFromUpload","upload","asset","pollInterval","tries","Promise","resolve","reject","setInterval","getUpload","err","asset_id","clearInterval","pollUpload","getAsset","status","playbackId","playback_ids","uploadId","then","testFile","window","File","fileOptions","opts","name","preserveFilename","optionsFromFile","of","throwError","testUrl","parsed","URL","protocol","match","extractDroppedFiles","dataTransfer","files","Array","from","items","length","all","map","item","kind","webkitGetAsEntry","entry","getAsFile","isDirectory","walk","getAsString","str","normalizeItems","arr","flat","isFile","dir","createReader","readEntries","entries","filter","entr","startsWith","AssetActionsMenu","props","useId","dialogState","setDialogState","useState","open","setOpen","menuElement","setMenuRef","handleDelete","useCallback","handleClick","handleClose","useEffect","useClickOutside","jsxs","Fragment","children","jsx","MenuButton","button","Button","icon","EllipsisVerticalIcon","mode","onClick","padding","menu","Menu","ref","MenuItem","tone","TrashIcon","text","portal","placement","DeleteDialog","onClose","useClient","push","pushToast","useToast","deleting","setDeleting","deleteOnMux","setDeleteOnMux","width","getDevicePixelRatio","maxDpr","_a","_b","_c","delete","document","querySelector","parentElement","setAttribute","call","console","closable","description","duration","title","Dialog","header","footer","Grid","gap","columns","loading","Stack","paddingX","paddingY","space","Card","Flex","style","gridColumn","align","Box","as","Checkbox","checked","onChange","prev","Text","margin","disabled","VideoThumbnail","showTip","VideoSource","_ref","assets","isLoading","isLastPage","onSelect","onLoadMore","event","currentTarget","handleKeyPress","key","ThumbGrid","VideoSourceItem","onKeyPress","justify","Spinner","muted","CardLoadMore","direction","DownloadIcon","memo","_ref2","hover","setHover","useRef","useLayoutEffect","current","animate","opacity","height","position","tabIndex","radius","lineHeight","__unstable_focusRing","onMouseEnter","onMouseLeave","AnimateWrapper","AnimatedVideoThumbnail","ActionsAssetsContainer","styled","_templateObject","_taggedTemplateLiteral","div","_templateObject2","SelectAssets","_ref3","pageNoRef","setLastPage","setLoading","setAssets","fetchPage","pageNo","start","end","fetch","createQuery","result","finally","handleSelect","selected","find","TypeError","PatchEvent","setIfMissing","set","_weak","handleLoadMore","InputBrowser","_ref4","scheme","__unstable_autoFocus","SelectAsset","EditThumbnailDialog","_ref6","getCurrentTime","dialogId","nextTime","useMemo","assetWithNewThumbnail","thumbTime","saving","setSaving","setError","handleSave","patch","commit","returnDocuments","catch","size","weight","VideoContainer","_templateObject3","StyledCenterControls","_templateObject4","TopControls","MediaControlBar","_templateObject5","PosterImage","_ref8","src","getPosterSrc","createElement","innerHTML","shadowRoot","appendChild","MediaPosterImage","slot","ThumbnailsMetadataTrack","_ref9","_ref7","getPlaybackId","searchParams","URLSearchParams","getPlaybackPolicy","generateJwt","getStoryboardSrc","label","default","CardWrapper","_templateObject6","FlexWrapper","_templateObject7","LeftSection","_templateObject8","CodeWrapper","Code","_templateObject9","UploadProgress","_ref10","progress","onCancel","filename","border","Inline","marginTop","shadow","LinearProgress","value","fontSize","MuxVideo","_ref11","buttons","readOnly","_d","isPreparingStaticRenditions","static_renditions","videoSrc","_ref5","getVideoSrc","handleError","playRef","muteRef","video","currentTime","handleCancelUpload","unset","useCancelUpload","cloneNode","playerInitTime","generatePlayerInitTime","playbackEngineRef","nextPlaybackEngineRef","initialize","playerSoftwareName","playerSoftwareVersion","errors","messages","join","MediaController","playsInline","onError","preload","crossOrigin","MediaLoadingIndicator","noAutoHide","MediaPlayButton","MediaMuteButton","MediaTimeDisplay","MediaTimeRange","MediaDurationDisplay","MediaFullscreenButton","background","top","left","color","focusRingBorderStyle","focusRingStyle","base","focusRing","focusRingOutsetWidth","offset","focusRingInsetWidth","bgColor","bg","Boolean","FileButton","_ref12","theme","sanity","css","FileInputMenuItem","React","forwardRef","forwardedRef","idProp","accept","capture","multiple","textAlign","rest","_excluded","idHook","handleChange","target","content","marginRight","isValidElement","isValidElementType","textOverflow","htmlFor","LockCard","_templateObject11","LockButton","_templateObject12","PlayerActionsMenu$1","onUpload","isSigned","onReset","Tooltip","LockIcon","EditIcon","Popover","Label","UploadIcon","SearchIcon","MenuDivider","PlugIcon","ResetIcon","UploadCardWithFocusRing","$border","rem","UploadCard","_ref13","onPaste","onDrop","onDragEnter","onDragLeave","onDragOver","ctrlDown","inputRef","handleKeyDown","keyCode","focus","handleKeyUp","onKeyDown","onKeyUp","HiddenInput","input","attrs","_templateObject14","_templateObject15","_templateObject16","FileInputButton","_ref14","inputId","handleButtonClick","click","_objectSpread","_templateObject17","ConfigureApiBox","_templateObject18","UploadPlaceholder","hovering","needsSetup","handleBrowse","handleConfigureApi","sizing","borderColor","flex","DocumentVideoIcon","MuxVideoInputUploader","Component","constructor","super","arguments","this","state","isDraggingOver","invalidPaste","invalidFile","uploadProgress","fileInfo","dragEnteredEls","container","createRef","handleProgress","evt","setState","options","undefined","pipe","switchMap","json","generateUuid","body","mp4_support","playback_policy","headers","mergeMap","catchError","mergeMapTo","uploadFile","secrets","takeUntil","onCancelUploadButtonClick$","tap","subscribe","handleUploadEvent","handleUploadSuccess","handlePaste","clipboardData","getData","validUrl","muxBody","query","JSON","stringify","split","slice","results","sEvent","toLowerCase","setTimeout","handleDrop","preventDefault","stopPropagation","nativeEvent","handleDragOver","handleDragEnter","handleDragLeave","idx","indexOf","splice","componentWillUnmount","unSubscribeToUpload","componentDidMount","events$","Subject","asObservable","handleCancelUploadButtonClick","closed","unsubscribe","render","Player","PlayerActionsMenu","useSaveSecrets","_ref15","valid","testSecrets","hasValidSigningKeys","res","e","haveValidSigningKeys","createSigningKeys","private_key","log","init","_ref16","submitting","reducer","action","payload","ids","MuxLogo","_ref17","titleId","a","b","c","d","f","g","h","i","j","k","l","m","n","o","p","q","r","field","role","xmlns","xmlSpace","viewBox","spreadMethod","gradientTransform","gradientUnits","y2","x2","y1","x1","stopOpacity","stopColor","clipPathUnits","clipPath","transform","fill","stroke","Logo","span","_templateObject19","Header","FormField$1","fieldNames","ConfigureApi$1","_ref18","dispatch","useReducer","useSecretsFormState","hasSecretsInitially","dirty","tokenId","secretKeyId","enableSignedUrlsId","firstField","handleSaveSecrets","handleSubmit","reportValidity","savedSecrets","projectId","clear","cacheNs","secretsId","handleChangeToken","handleChangeSecretKey","handleChangeEnableSignedUrls","onSubmit","noValidate","href","rel","FormField","TextInput","required","display","paddingLeft","Onboard","handleOpen","aspectRatio","boxShadow","Heading","Input$1","secretDocumentValues","useDocumentValues","muxSecretsDocumentId","exists","isInitialSetup","useSecretsDocumentValues","assetDocumentValues","useAssetDocumentValues","poll","useProjectId","useDataset","shouldFetch","useSWR","refreshInterval","refreshWhenHidden","dedupingInterval","useMuxPolling","InputFallback","Uploader","ConfigureApi"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),r=require("sanity"),t=require("./VideoSource.styled-1b994d90.js");require("@sanity/icons"),require("@sanity/ui"),require("react"),require("styled-components"),require("suspend-react"),require("use-error-boundary"),require("./index-efe6ce48.js"),require("scroll-into-view-if-needed");exports.default=u=>{let{value:s}=u;const i=t.useAssetDocumentValues(null==s?void 0:s.asset);if(i.value)return e.jsx(t.VideoThumbnail,{asset:i.value,width:640});const{filename:a,playbackId:n,status:l}=null!=s?s:{};return e.jsx(r.SanityDefaultPreview,{title:a||n||"",subtitle:l?"status: ".concat(l):null})};
|
|
2
|
-
//# sourceMappingURL=Preview-3195237b.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{jsx as t}from"react/jsx-runtime";import{SanityDefaultPreview as e}from"sanity";import{d as s,V as o}from"./VideoSource.styled-f92259cd.esm.js";import"@sanity/icons";import"@sanity/ui";import"react";import"styled-components";import"suspend-react";import"use-error-boundary";import"./index-3d8d7583.esm.js";import"scroll-into-view-if-needed";const r=r=>{let{value:i}=r;const a=s(null==i?void 0:i.asset);if(a.value)return t(o,{asset:a.value,width:640});const{filename:n,playbackId:l,status:m}=null!=i?i:{};return t(e,{title:n||l||"",subtitle:m?"status: ".concat(m):null})};export{r as default};
|
|
2
|
-
//# sourceMappingURL=Preview-bb256342.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Preview-bb256342.esm.js","sources":["../../src/components/Preview.tsx"],"sourcesContent":["import React from 'react'\nimport {SanityDefaultPreview} from 'sanity'\n\nimport {useAssetDocumentValues} from '../hooks/useAssetDocumentValues'\nimport {VideoThumbnail} from './VideoSource.styled'\n\nexport interface MuxVideoPreviewProps {\n value: {\n asset: {\n _type: 'reference'\n _ref: string\n }\n }\n}\nconst MuxVideoPreview = ({value}: MuxVideoPreviewProps) => {\n const assetDocumentValues = useAssetDocumentValues(value?.asset!)\n\n if (assetDocumentValues.value) {\n return <VideoThumbnail asset={assetDocumentValues.value} width={640} />\n }\n\n // @ts-expect-error\n const {filename, playbackId, status} = value ?? {}\n\n return (\n <SanityDefaultPreview\n title={filename || playbackId || ''}\n subtitle={status ? `status: ${status}` : null}\n />\n )\n}\n\nexport default MuxVideoPreview\n"],"names":["MuxVideoPreview","_ref","value","assetDocumentValues","useAssetDocumentValues","asset","jsx","VideoThumbnail","width","filename","playbackId","status","SanityDefaultPreview","title","subtitle"],"mappings":"2VAcA,MAAMA,EAAkBC,IAAmC,IAAlCC,MAACA,GAAiCD,EACnD,MAAAE,EAAsBC,EAAuB,MAAAF,OAAA,EAAAA,EAAOG,OAE1D,GAAIF,EAAoBD,MACtB,OAAQI,EAAAC,EAAA,CAAeF,MAAOF,EAAoBD,MAAOM,MAAO,MAIlE,MAAMC,SAACA,EAAUC,WAAAA,EAAAC,OAAYA,SAAUT,IAAS,GAEhD,OACGI,EAAAM,EAAA,CACCC,MAAOJ,GAAYC,GAAc,GACjCI,SAAUH,EAAoBA,WAAAA,OAAAA,GAAW,MAC3C"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var e,t,n,i,s;function r(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var o=require("sanity"),a=require("react/jsx-runtime"),l=require("@sanity/icons"),d=require("@sanity/ui"),c=require("react"),u=require("styled-components"),m=require("suspend-react"),h=require("use-error-boundary"),g=require("./index-efe6ce48.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function f(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var y=p(u);const b=["assetId","data","playbackId","status","thumbTime","filename"];function x(){return o.useClient({apiVersion:"2022-09-14"})}const w="secrets.mux";function j(e,t,n,i){const{signingKeyId:s,signingKeyPrivate:r}=function(e){const{projectId:t,dataset:n}=e.config();return m.suspend((async()=>{const t=await e.fetch("*[_id == $_id][0]{\n token,\n secretKey,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate\n }",{_id:w});return{token:(null==t?void 0:t.token)||null,secretKey:(null==t?void 0:t.secretKey)||null,enableSignedUrls:Boolean(null==t?void 0:t.enableSignedUrls)||!1,signingKeyId:(null==t?void 0:t.signingKeyId)||null,signingKeyPrivate:(null==t?void 0:t.signingKeyPrivate)||null}}),[g.cacheNs,w,t,n])}(e);if(!s)throw new TypeError("Missing signingKeyId");if(!r)throw new TypeError("Missing signingKeyPrivate");const{default:o}=m.suspend((()=>Promise.resolve().then((function(){return f(require("jsonwebtoken-esm/sign"))}))),["jsonwebtoken-esm/sign"]);return o(i?JSON.parse(JSON.stringify(i,((e,t)=>null!=t?t:void 0))):{},atob(r),{algorithm:"RS256",keyid:s,audience:n,subject:t,noTimestamp:!0,expiresIn:"12h"})}function v(e){if(!(null==e?void 0:e.playbackId))throw console.error("Asset is missing a playbackId",{asset:e}),new TypeError("Missing playbackId");return e.playbackId}function k(e){var t,n,i,s;return null!=(s=null==(i=null==(n=null==(t=e.data)?void 0:t.playback_ids)?void 0:n[0])?void 0:i.policy)?s:"public"}function P(e){let{asset:t,client:n,fit_mode:i,height:s,time:r=t.thumbTime,width:o}=e;const a={fit_mode:i,height:s,time:r,width:o},l=v(t);let d=new URLSearchParams(JSON.parse(JSON.stringify(a,((e,t)=>null!=t?t:void 0))));if("signed"===k(t)){const e=j(n,l,"t",a);d=new URLSearchParams({token:e})}return"https://image.mux.com/".concat(l,"/thumbnail.png?").concat(d)}const I={aspect:16/9},S=c.memo((function(e){let{alt:t,src:n,height:i,width:s,aspectRatio:r}=e;return m.suspend((async()=>{const e=new Image(s,i);e.decoding="async",e.src=n,await e.decode()}),["sanity-plugin-mux-input","image",n]),a.jsx("img",{alt:t,src:n,height:i,width:s,style:{aspectRatio:r}})})),O=y.default(o.MediaPreview)(e||(e=r(["\n img {\n object-fit: cover;\n }\n"]))),T=e=>{let{solo:t}=e;return a.jsxs(d.Inline,{space:1,style:{marginTop:t?"-1.35em":void 0,marginBottom:t?void 0:"0.35rem"},children:[a.jsx(l.LockIcon,{}),"Signed playback policy"]})},K=e=>{let{asset:t,height:n,width:i,showTip:s}=e;const r=x(),o=P({asset:t,client:r,height:n,width:i,fit_mode:"smartcrop"}),l=c.useMemo((()=>s&&"signed"===k(t)?a.jsx(T,{solo:!0}):void 0),[t,s]);return a.jsx(O,{mediaDimensions:I,subtitle:l,title:a.jsx(a.Fragment,{children:null}),media:a.jsx(S,{alt:"",src:o,height:n,width:i})})},M=c.memo((function(e){let{asset:t,width:n,showTip:i}=e;const{ErrorBoundary:s,didCatch:r,error:o}=h.useErrorBoundary(),u=Math.round(9*n/16),m=c.useMemo((()=>i&&"signed"===k(t)?a.jsx(T,{}):void 0),[i,t]);return r?a.jsx(O,{subtitle:o.message,mediaDimensions:I,title:"Error when loading thumbnail",media:a.jsx(d.Card,{radius:2,height:"fill",style:{position:"relative",width:"100%"},children:a.jsx(d.Box,{style:{display:"flex",justifyContent:"center",alignItems:"center",position:"absolute",top:0,left:0,right:0,bottom:0},children:a.jsx(l.UnknownIcon,{})})})}):a.jsx(s,{children:a.jsx(c.Suspense,{fallback:a.jsx(O,{isPlaceholder:!0,title:"Loading thumbnail...",subtitle:m,mediaDimensions:I}),children:a.jsx(K,{showTip:i,asset:t,height:u,width:n})})})})),_=y.default(o.MediaPreview)(t||(t=r(["\n img {\n object-fit: contain;\n }\n"]))),q=e=>{let{asset:t,width:n}=e;const i=function(e){let{asset:t,client:n,height:i,width:s,start:r=(t.thumbTime?Math.max(0,t.thumbTime-2.5):0),end:o=r+5,fps:a=15}=e;const l={height:i,width:s,start:r,end:o,fps:a},d=v(t);let c=new URLSearchParams(JSON.parse(JSON.stringify(l,((e,t)=>null!=t?t:void 0))));if("signed"===k(t)){const e=j(n,d,"g",l);c=new URLSearchParams({token:e})}return"https://image.mux.com/".concat(d,"/animated.gif?").concat(c)}({asset:t,client:x(),width:n});return a.jsx(_,{withBorder:!1,mediaDimensions:I,media:a.jsx(S,{alt:"",src:i,width:n,aspectRatio:"16:9"})})},B=c.memo((function(e){let{asset:t,width:n}=e;const{ErrorBoundary:i,didCatch:s}=h.useErrorBoundary();return s?null:a.jsx(i,{children:a.jsx(c.Suspense,{fallback:a.jsx(C,{children:a.jsx(O,{mediaDimensions:I,withBorder:!1,media:a.jsx(d.Spinner,{muted:!0})})}),children:a.jsx(d.Card,{height:"fill",tone:"transparent",children:a.jsx(q,{asset:t,width:n})})})})})),C=y.default(d.Box)(n||(n=r(["\n backdrop-filter: blur(8px) brightness(0.5) saturate(2);\n mix-blend-mode: color-dodge;\n"]))),E=y.default(d.Grid)(i||(i=r(["\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n"]))),R=y.default(d.Card)(s||(s=r(["\n border-top: 1px solid var(--card-border-color);\n position: sticky;\n bottom: 0;\n z-index: 200;\n"])));exports.AnimatedVideoThumbnail=B,exports.CardLoadMore=R,exports.ThumbGrid=E,exports.VideoThumbnail=M,exports._id=w,exports.generateJwt=j,exports.getPlaybackId=v,exports.getPlaybackPolicy=k,exports.getPosterSrc=P,exports.useAssetDocumentValues=e=>o.useDocumentValues(o.isReference(e)?e._ref:"",b),exports.useClient=x;
|
|
2
|
-
//# sourceMappingURL=VideoSource.styled-1b994d90.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VideoSource.styled-1b994d90.js","sources":["../../src/hooks/useAssetDocumentValues.ts","../../src/hooks/useClient.ts","../../src/util/readSecrets.ts","../../src/util/generateJwt.ts","../../src/util/getPlaybackId.ts","../../src/util/getPlaybackPolicy.ts","../../src/util/getPosterSrc.ts","../../src/components/VideoSource.styled.tsx","../../src/util/getAnimatedPosterSrc.ts"],"sourcesContent":["import {isReference} from 'sanity'\nimport {useDocumentValues} from 'sanity'\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","// As it's required to specify the API Version this custom hook ensures it's all using the same version\nimport {useClient as useSanityClient} from 'sanity'\n\nexport function useClient() {\n return useSanityClient({apiVersion: '2022-09-14'})\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 {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 const {default: sign} = suspend(() => import('jsonwebtoken-esm/sign'), ['jsonwebtoken-esm/sign'])\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","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","import {LockIcon, UnknownIcon} from '@sanity/icons'\nimport {Box, Card, Grid, Inline, Spinner} from '@sanity/ui'\nimport React, {memo, Suspense, useMemo} from 'react'\nimport {MediaPreview} from 'sanity'\nimport styled from 'styled-components'\nimport {suspend} from 'suspend-react'\nimport {useErrorBoundary} from 'use-error-boundary'\n\nimport {useClient} from '../hooks/useClient'\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\n// @TODO fix typings errors due to props.renderDefault\nconst VideoMediaPreview = styled<any>(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={{\n marginTop: solo ? '-1.35em' : undefined,\n marginBottom: solo ? undefined : '0.35rem',\n }}\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({\n asset,\n client,\n height,\n width,\n fit_mode: 'smartcrop',\n })\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\n// @TODO fix typings errors due to props.renderDefault\nconst AnimatedVideoMediaPreview = styled<any>(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"],"names":["path","useClient","useSanityClient","apiVersion","_id","generateJwt","client","playbackId","aud","payload","signingKeyId","signingKeyPrivate","projectId","dataset","config","suspend","async","data","fetch","token","secretKey","enableSignedUrls","Boolean","cacheNs","readSecrets","TypeError","default","sign","Promise","resolve","then","_interopNamespace","require","JSON","parse","stringify","_","v","atob","algorithm","keyid","audience","subject","noTimestamp","expiresIn","getPlaybackId","asset","console","error","getPlaybackPolicy","_a","_b","_c","_d","playback_ids","policy","getPosterSrc","_ref2","fit_mode","height","time","thumbTime","width","params","searchParams","URLSearchParams","mediaDimensions","aspect","ImageLoader","memo","_ref3","alt","src","aspectRatio","img","Image","decoding","decode","jsx","style","VideoMediaPreview","styled","MediaPreview","_templateObject","_taggedTemplateLiteral","VideoMediaPreviewSignedSubtitle","_ref4","solo","jsxs","Inline","space","marginTop","marginBottom","children","LockIcon","PosterImage","_ref5","showTip","subtitle","useMemo","title","Fragment","media","VideoThumbnail","_ref6","ErrorBoundary","didCatch","useErrorBoundary","Math","round","message","Card","radius","position","Box","display","justifyContent","alignItems","top","left","right","bottom","UnknownIcon","Suspense","fallback","isPlaceholder","AnimatedVideoMediaPreview","_templateObject2","AnimatedPosterImage","_ref7","_ref","start","max","end","fps","getAnimatedPosterSrc","withBorder","AnimatedVideoThumbnail","_ref8","FancyBackdrop","Spinner","muted","tone","_templateObject3","ThumbGrid","Grid","_templateObject4","CardLoadMore","_templateObject5","useDocumentValues","isReference"],"mappings":"uvBAKA,MAAMA,EAAO,CAAC,UAAW,OAAQ,aAAc,SAAU,YAAa,YCF/D,SAASC,IACd,OAAOC,YAAgB,CAACC,WAAY,cACtC,CCOO,MAAMC,EAAM,cCMZ,SAASC,EACdC,EACAC,EACAC,EACAC,GAEA,MAAMC,aAACA,EAAAC,kBAAcA,GDVhB,SAAqBL,GAC1B,MAAMM,UAACA,EAAAC,QAAWA,GAAWP,EAAOQ,SACpC,OAAOC,WAAQC,UACP,MAAAC,QAAaX,EAAOY,MAQxB,+IAAA,CAACd,QAEI,MAAA,CACLe,aAAOF,WAAME,QAAS,KACtBC,iBAAWH,WAAMG,YAAa,KAC9BC,iBAAkBC,QAAc,MAANL,OAAM,EAAAA,EAAAI,oBAAqB,EACrDX,oBAAcO,WAAMP,eAAgB,KACpCC,yBAAmBM,WAAMN,oBAAqB,KAChD,GACC,CAACY,EAAAA,QAASnB,EAAKQ,EAAWC,GAC/B,CCX4CW,CAAYlB,GACtD,IAAKI,EACG,MAAA,IAAIe,UAAU,wBAEtB,IAAKd,EACG,MAAA,IAAIc,UAAU,6BAGhB,MAACC,QAASC,GAAQZ,EAAAA,SAAQ,IAAMa,QAAAC,UAAAC,MAAA,WAAA,OAAAC,EAAAC,QAAO,yBAAA,KAA0B,CAAC,0BAEjE,OAAAL,EACLlB,EAAUwB,KAAKC,MAAMD,KAAKE,UAAU1B,GAAS,CAAC2B,EAAGC,IAAM,MAAAA,EAAAA,OAAK,KAAc,CAAC,EAC3EC,KAAK3B,GACL,CACE4B,UAAW,QACXC,MAAO9B,EACP+B,SAAUjC,EACVkC,QAASnC,EACToC,aAAa,EACbC,UAAW,OAGjB,CC5CO,SAASC,EAAcC,GACxB,WAACA,WAAOvC,YAEJ,MADNwC,QAAQC,MAAM,gCAAiC,CAACF,UAC1C,IAAIrB,UAA8B,sBAE1C,OAAOqB,EAAMvC,UACf,CCNO,SAAS0C,EAAkBH,GAFlC,IAAAI,EAAAC,EAAAC,EAAAC,EAGS,OAAA,OAAAA,EAAA,OAAAD,EAAA,OAAAD,EAAA,OAAAD,EAAAJ,EAAM7B,WAAM,EAAAiC,EAAAI,uBAAe,SAA3B,EAAAF,EAA+BG,QAAUF,EAAA,QAClD,CCQO,SAASG,EAOsBC,GAAA,IAPTX,MAC3BA,EAAAxC,OACAA,EAAAoD,SACAA,EAAAC,OACAA,EAAAC,KACAA,EAAOd,EAAMe,UAAAC,MACbA,GACoCL,EACpC,MAAMM,EAAS,CAACL,WAAUC,SAAQC,OAAME,SAClCvD,EAAasC,EAAcC,GAEjC,IAAIkB,EAAe,IAAIC,gBACrBhC,KAAKC,MAAMD,KAAKE,UAAU4B,GAAQ,CAAC3B,EAAGC,IAAW,MAALA,EAAKA,OAAA,MAE/C,GAA6B,WAA7BY,EAAkBH,GAAqB,CACzC,MAAM3B,EAAQd,EAAYC,EAAQC,EAAY,IAAKwD,GACnDC,EAAe,IAAIC,gBAAgB,CAAC9C,SACtC,CAEA,MAAgCZ,yBAAAA,OAAAA,4BAA4ByD,EAC9D,CClBA,MAAME,EAAkB,CAACC,OAAQ,GAAK,GAShCC,EAAcC,EAAAA,MAAK,SAMJC,GAAA,IANyBC,IAC5CA,EAAAC,IACAA,EAAAb,OACAA,EAAAG,MACAA,EAAAW,YACAA,GACmBH,EAQnB,OAPAvD,EAAAA,SAAQC,UACN,MAAM0D,EAAM,IAAIC,MAAMb,EAAOH,GAC7Be,EAAIE,SAAW,QACfF,EAAIF,IAAMA,QACJE,EAAIG,QAAO,GAChB,CAAC,0BAA2B,QAASL,IAEhCM,EAAAA,IAAA,MAAA,CAAIP,MAAUC,MAAUb,SAAgBG,QAAciB,MAAO,CAACN,gBACxE,IAGMO,EAAoBC,EAAAA,QAAYC,EAAAA,aAAZD,CAAwBE,IAAAA,EAAAC,EAAA,CAAA,+CAS5CC,EAAkCC,IAAkD,IAAjDC,KAACA,GAAgDD,EACxF,OACGE,EAAAA,KAAAC,EAAAA,OAAA,CACCC,MAAO,EACPX,MAAO,CACLY,UAAWJ,EAAO,eAAY,EAC9BK,aAAcL,OAAO,EAAY,WAGnCM,SAAA,CAAAf,EAAAA,IAACgB,EAASA,SAAA,IAAE,2BAEd,EAQEC,EAAcC,IAAuD,IAAtDlD,MAACA,SAAOa,EAAQG,MAAAA,EAAAmC,QAAOA,GAA+BD,EACzE,MAAM1F,EAASL,IACTuE,EAAMhB,EAAa,CACvBV,QACAxC,SACAqD,SACAG,QACAJ,SAAU,cAENwC,EAAWC,EAAAA,SACf,IACEF,GAAwC,WAA7BhD,EAAkBH,GAC1BgC,EAAAA,IAAAO,EAAA,CAAgCE,MAAI,SACnC,GACN,CAACzC,EAAOmD,IAKV,OACGnB,EAAAA,IAAAE,EAAA,CACCd,kBACAgC,WACAE,MAAOtB,EAAAA,IAAAuB,WAAA,CAAGR,SAAA,OACVS,MAAQxB,EAAAA,IAAAV,EAAA,CAAYG,IAAI,GAAGC,MAAUb,SAAgBG,WACvD,EAOSyC,EAAiBlC,EAAAA,MAAK,SAIXmC,GAAA,IAJmC1D,MACzDA,EAAAgB,MACAA,EAAAmC,QACAA,GACsBO,EACtB,MAAMC,cAACA,EAAAC,SAAeA,EAAU1D,MAAAA,GAAS2D,EAAiBA,mBACpDhD,EAASiD,KAAKC,MAAe,EAAR/C,EAAa,IAClCoC,EAAWC,EAAAA,SACf,IACEF,GAAwC,WAA7BhD,EAAkBH,GAC3BgC,EAAAA,IAACO,WACC,GACN,CAACY,EAASnD,IAGZ,OAAI4D,EAEC5B,EAAAA,IAAAE,EAAA,CACCkB,SAAUlD,EAAM8D,QAChB5C,kBACAkC,MAAM,+BACNE,MACGxB,EAAAA,IAAAiC,OAAA,CAAKC,OAAQ,EAAGrD,OAAO,OAAOoB,MAAO,CAACkC,SAAU,WAAYnD,MAAO,QAClE+B,SAACf,EAAAA,IAAAoC,MAAA,CACCnC,MAAO,CACLoC,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZJ,SAAU,WACVK,IAAK,EACLC,KAAM,EACNC,MAAO,EACPC,OAAQ,GAGV5B,eAAC6B,EAAYA,YAAA,UAStB5C,EAAAA,IAAA2B,EAAA,CACCZ,SAACf,EAAAA,IAAA6C,WAAA,CACCC,SACG9C,EAAAA,IAAAE,EAAA,CACC6C,eAAa,EACbzB,MAAM,uBACNF,WACAhC,oBAIJ2B,SAACf,EAAAA,IAAAiB,EAAA,CAAYE,UAAkBnD,QAAca,SAAgBG,aAIrE,IAGMgE,EAA4B7C,EAAAA,QAAYC,EAAAA,aAAZD,CAAwB8C,IAAAA,EAAA3C,EAAA,CAAA,iDASpD4C,EAAsBC,IAA8C,IAA7CnF,MAACA,EAAAgB,MAAOA,GAAqCmE,EACxE,MACMzD,EClKD,SAQ+C0D,GAAA,IARjBpF,MACnCA,EAAAxC,OACAA,EAAAqD,OACAA,EAAAG,MACAA,EAAAqE,MACAA,GAAQrF,EAAMe,UAAY+C,KAAKwB,IAAI,EAAGtF,EAAMe,UAAY,KAAO,GAAAwE,IAC/DA,EAAMF,EAAQ,EAAAG,IACdA,EAAM,IAC8CJ,EACpD,MAAMnE,EAAS,CAACJ,SAAQG,QAAOqE,QAAOE,MAAKC,OACrC/H,EAAasC,EAAcC,GAEjC,IAAIkB,EAAe,IAAIC,gBACrBhC,KAAKC,MAAMD,KAAKE,UAAU4B,GAAQ,CAAC3B,EAAGC,IAAW,MAALA,EAAKA,OAAA,MAE/C,GAA6B,WAA7BY,EAAkBH,GAAqB,CACzC,MAAM3B,EAAQd,EAAYC,EAAQC,EAAY,IAAKwD,GACnDC,EAAe,IAAIC,gBAAgB,CAAC9C,SACtC,CAEA,MAAgCZ,yBAAAA,OAAAA,2BAA2ByD,EAC7D,CD6IcuE,CAAqB,CAACzF,QAAOxC,OAD1BL,IACkC6D,UAIjD,OACGgB,EAAAA,IAAAgD,EAAA,CACCU,YAAY,EACZtE,kBACAoC,MAAQxB,EAAAA,IAAAV,EAAA,CAAYG,IAAI,GAAGC,MAAUV,QAAcW,YAAY,UACjE,EAOSgE,EAAyBpE,EAAAA,MAAK,SAGXqE,GAAA,IAH2C5F,MACzEA,EAAAgB,MACAA,GAC8B4E,EAC9B,MAAMjC,cAACA,EAAAC,SAAeA,GAAYC,EAAiBA,mBAEnD,OAAID,EACK,KAIN5B,EAAAA,IAAA2B,EAAA,CACCZ,SAACf,EAAAA,IAAA6C,WAAA,CACCC,SACG9C,EAAAA,IAAA6D,EAAA,CACC9C,SAACf,EAAAA,IAAAE,EAAA,CACCd,kBACAsE,YAAY,EACZlC,MAAQxB,EAAAA,IAAA8D,UAAA,CAAQC,OAAK,QAK3BhD,SAACf,EAAAA,IAAAiC,OAAA,CAAKpD,OAAO,OAAOmF,KAAK,cACvBjD,SAACf,EAAAA,IAAAkD,EAAA,CAAoBlF,QAAcgB,eAK7C,IACM6E,EAAgB1D,EAAAA,QAAOiC,EAAAA,IAAPjC,CAAU8D,IAAAA,EAAA3D,EAAA,CAAA,oGAKnB4D,EAAY/D,EAAAA,QAAOgE,EAAAA,KAAPhE,CAAWiE,IAAAA,EAAA9D,EAAA,CAAA,0EAIvB+D,EAAelE,EAAAA,QAAO8B,EAAAA,KAAP9B,CAAWmE,IAAAA,EAAAhE,EAAA,CAAA,mWP/NAtC,GACrCuG,EAAAA,kBACEC,EAAAA,YAAYxG,GAASA,EAAMoF,KAAQ,GACnClI"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var e,t,i,n,s;function r(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}import{useDocumentValues as o,isReference as a,useClient as l,MediaPreview as d}from"sanity";import{jsx as c,jsxs as m,Fragment as u}from"react/jsx-runtime";import{UnknownIcon as h,LockIcon as g}from"@sanity/icons";import{Card as p,Box as f,Spinner as y,Grid as b,Inline as w}from"@sanity/ui";import{memo as v,useMemo as k,Suspense as x}from"react";import I from"styled-components";import{suspend as S}from"suspend-react";import{useErrorBoundary as K}from"use-error-boundary";import{c as T}from"./index-3d8d7583.esm.js";const j=["assetId","data","playbackId","status","thumbTime","filename"],P=e=>o(a(e)?e._ref:"",j);function O(){return l({apiVersion:"2022-09-14"})}const _="secrets.mux";function R(e,t,i,n){const{signingKeyId:s,signingKeyPrivate:r}=function(e){const{projectId:t,dataset:i}=e.config();return S((async()=>{const t=await e.fetch("*[_id == $_id][0]{\n token,\n secretKey,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate\n }",{_id:_});return{token:(null==t?void 0:t.token)||null,secretKey:(null==t?void 0:t.secretKey)||null,enableSignedUrls:Boolean(null==t?void 0:t.enableSignedUrls)||!1,signingKeyId:(null==t?void 0:t.signingKeyId)||null,signingKeyPrivate:(null==t?void 0:t.signingKeyPrivate)||null}}),[T,_,t,i])}(e);if(!s)throw new TypeError("Missing signingKeyId");if(!r)throw new TypeError("Missing signingKeyPrivate");const{default:o}=S((()=>import("jsonwebtoken-esm/sign")),["jsonwebtoken-esm/sign"]);return o(n?JSON.parse(JSON.stringify(n,((e,t)=>null!=t?t:void 0))):{},atob(r),{algorithm:"RS256",keyid:s,audience:i,subject:t,noTimestamp:!0,expiresIn:"12h"})}function U(e){if(!(null==e?void 0:e.playbackId))throw console.error("Asset is missing a playbackId",{asset:e}),new TypeError("Missing playbackId");return e.playbackId}function B(e){var t,i,n,s;return null!=(s=null==(n=null==(i=null==(t=e.data)?void 0:t.playback_ids)?void 0:i[0])?void 0:n.policy)?s:"public"}function E(e){let{asset:t,client:i,fit_mode:n,height:s,time:r=t.thumbTime,width:o}=e;const a={fit_mode:n,height:s,time:r,width:o},l=U(t);let d=new URLSearchParams(JSON.parse(JSON.stringify(a,((e,t)=>null!=t?t:void 0))));if("signed"===B(t)){const e=R(i,l,"t",a);d=new URLSearchParams({token:e})}return"https://image.mux.com/".concat(l,"/thumbnail.png?").concat(d)}const J={aspect:16/9},N=v((function(e){let{alt:t,src:i,height:n,width:s,aspectRatio:r}=e;return S((async()=>{const e=new Image(s,n);e.decoding="async",e.src=i,await e.decode()}),["sanity-plugin-mux-input","image",i]),c("img",{alt:t,src:i,height:n,width:s,style:{aspectRatio:r}})})),C=I(d)(e||(e=r(["\n img {\n object-fit: cover;\n }\n"]))),D=e=>{let{solo:t}=e;return m(w,{space:1,style:{marginTop:t?"-1.35em":void 0,marginBottom:t?void 0:"0.35rem"},children:[c(g,{}),"Signed playback policy"]})},L=e=>{let{asset:t,height:i,width:n,showTip:s}=e;const r=O(),o=E({asset:t,client:r,height:i,width:n,fit_mode:"smartcrop"}),a=k((()=>s&&"signed"===B(t)?c(D,{solo:!0}):void 0),[t,s]);return c(C,{mediaDimensions:J,subtitle:a,title:c(u,{children:null}),media:c(N,{alt:"",src:o,height:i,width:n})})},M=v((function(e){let{asset:t,width:i,showTip:n}=e;const{ErrorBoundary:s,didCatch:r,error:o}=K(),a=Math.round(9*i/16),l=k((()=>n&&"signed"===B(t)?c(D,{}):void 0),[n,t]);return r?c(C,{subtitle:o.message,mediaDimensions:J,title:"Error when loading thumbnail",media:c(p,{radius:2,height:"fill",style:{position:"relative",width:"100%"},children:c(f,{style:{display:"flex",justifyContent:"center",alignItems:"center",position:"absolute",top:0,left:0,right:0,bottom:0},children:c(h,{})})})}):c(s,{children:c(x,{fallback:c(C,{isPlaceholder:!0,title:"Loading thumbnail...",subtitle:l,mediaDimensions:J}),children:c(L,{showTip:n,asset:t,height:a,width:i})})})})),z=I(d)(t||(t=r(["\n img {\n object-fit: contain;\n }\n"]))),A=e=>{let{asset:t,width:i}=e;const n=function(e){let{asset:t,client:i,height:n,width:s,start:r=(t.thumbTime?Math.max(0,t.thumbTime-2.5):0),end:o=r+5,fps:a=15}=e;const l={height:n,width:s,start:r,end:o,fps:a},d=U(t);let c=new URLSearchParams(JSON.parse(JSON.stringify(l,((e,t)=>null!=t?t:void 0))));if("signed"===B(t)){const e=R(i,d,"g",l);c=new URLSearchParams({token:e})}return"https://image.mux.com/".concat(d,"/animated.gif?").concat(c)}({asset:t,client:O(),width:i});return c(z,{withBorder:!1,mediaDimensions:J,media:c(N,{alt:"",src:n,width:i,aspectRatio:"16:9"})})},V=v((function(e){let{asset:t,width:i}=e;const{ErrorBoundary:n,didCatch:s}=K();return s?null:c(n,{children:c(x,{fallback:c($,{children:c(C,{mediaDimensions:J,withBorder:!1,media:c(y,{muted:!0})})}),children:c(p,{height:"fill",tone:"transparent",children:c(A,{asset:t,width:i})})})})})),$=I(f)(i||(i=r(["\n backdrop-filter: blur(8px) brightness(0.5) saturate(2);\n mix-blend-mode: color-dodge;\n"]))),q=I(b)(n||(n=r(["\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n"]))),F=I(p)(s||(s=r(["\n border-top: 1px solid var(--card-border-color);\n position: sticky;\n bottom: 0;\n z-index: 200;\n"])));export{V as A,F as C,q as T,M as V,_,B as a,R as b,E as c,P as d,U as g,O as u};
|
|
2
|
-
//# sourceMappingURL=VideoSource.styled-f92259cd.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VideoSource.styled-f92259cd.esm.js","sources":["../../src/hooks/useAssetDocumentValues.ts","../../src/hooks/useClient.ts","../../src/util/readSecrets.ts","../../src/util/generateJwt.ts","../../src/util/getPlaybackId.ts","../../src/util/getPlaybackPolicy.ts","../../src/util/getPosterSrc.ts","../../src/components/VideoSource.styled.tsx","../../src/util/getAnimatedPosterSrc.ts"],"sourcesContent":["import {isReference} from 'sanity'\nimport {useDocumentValues} from 'sanity'\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","// As it's required to specify the API Version this custom hook ensures it's all using the same version\nimport {useClient as useSanityClient} from 'sanity'\n\nexport function useClient() {\n return useSanityClient({apiVersion: '2022-09-14'})\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 {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 const {default: sign} = suspend(() => import('jsonwebtoken-esm/sign'), ['jsonwebtoken-esm/sign'])\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","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","import {LockIcon, UnknownIcon} from '@sanity/icons'\nimport {Box, Card, Grid, Inline, Spinner} from '@sanity/ui'\nimport React, {memo, Suspense, useMemo} from 'react'\nimport {MediaPreview} from 'sanity'\nimport styled from 'styled-components'\nimport {suspend} from 'suspend-react'\nimport {useErrorBoundary} from 'use-error-boundary'\n\nimport {useClient} from '../hooks/useClient'\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\n// @TODO fix typings errors due to props.renderDefault\nconst VideoMediaPreview = styled<any>(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={{\n marginTop: solo ? '-1.35em' : undefined,\n marginBottom: solo ? undefined : '0.35rem',\n }}\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({\n asset,\n client,\n height,\n width,\n fit_mode: 'smartcrop',\n })\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\n// @TODO fix typings errors due to props.renderDefault\nconst AnimatedVideoMediaPreview = styled<any>(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"],"names":["path","useAssetDocumentValues","asset","useDocumentValues","isReference","_ref","useClient","useSanityClient","apiVersion","_id","generateJwt","client","playbackId","aud","payload","signingKeyId","signingKeyPrivate","projectId","dataset","config","suspend","async","data","fetch","token","secretKey","enableSignedUrls","Boolean","cacheNs","readSecrets","TypeError","default","sign","import","JSON","parse","stringify","_","v","atob","algorithm","keyid","audience","subject","noTimestamp","expiresIn","getPlaybackId","console","error","getPlaybackPolicy","_a","_b","_c","_d","playback_ids","policy","getPosterSrc","_ref2","fit_mode","height","time","thumbTime","width","params","searchParams","URLSearchParams","mediaDimensions","aspect","ImageLoader","memo","_ref3","alt","src","aspectRatio","img","Image","decoding","decode","jsx","style","VideoMediaPreview","styled","MediaPreview","_templateObject","_taggedTemplateLiteral","VideoMediaPreviewSignedSubtitle","_ref4","solo","jsxs","Inline","space","marginTop","marginBottom","children","LockIcon","PosterImage","_ref5","showTip","subtitle","useMemo","title","Fragment","media","VideoThumbnail","_ref6","ErrorBoundary","didCatch","useErrorBoundary","Math","round","message","Card","radius","position","Box","display","justifyContent","alignItems","top","left","right","bottom","UnknownIcon","Suspense","fallback","isPlaceholder","AnimatedVideoMediaPreview","_templateObject2","AnimatedPosterImage","_ref7","start","max","end","fps","getAnimatedPosterSrc","withBorder","AnimatedVideoThumbnail","_ref8","FancyBackdrop","Spinner","muted","tone","_templateObject3","ThumbGrid","Grid","_templateObject4","CardLoadMore","_templateObject5"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var e;function r(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function t(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?r(Object(o),!0).forEach((function(r){n(e,r,o[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):r(Object(o)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(o,r))}))}return e}function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}import{isObjectInputProps as o,definePlugin as i}from"sanity";import{jsx as c,jsxs as s}from"react/jsx-runtime";import{memo as a,useRef as l,useCallback as d,lazy as p,Suspense as u}from"react";import{useToast as m,Flex as f,Inline as h,Button as g,Card as y,Grid as b,Heading as v,Text as j,Spinner as O,Box as w}from"@sanity/ui";import x from"scroll-into-view-if-needed";import{clear as k}from"suspend-react";import{useErrorBoundary as P}from"use-error-boundary";import T from"styled-components";const C="sanity-plugin-mux-input",D="secrets.mux";var E=a((function(e){const{children:r,schemaType:t}=e,{push:n}=m(),o=l(null),{ErrorBoundary:i,didCatch:a,error:p,reset:u}=P({onDidCatch:(e,r)=>{console.group(e.toString()),console.groupCollapsed("console.error"),console.error(e),console.groupEnd(),e.stack&&(console.groupCollapsed("error.stack"),console.log(e.stack),console.groupEnd()),(null==r?void 0:r.componentStack)&&(console.groupCollapsed("errorInfo.componentStack"),console.log(r.componentStack),console.groupEnd()),console.groupEnd(),n({status:"error",title:"Plugin crashed",description:c(f,{align:"center",children:s(h,{space:1,children:["An error happened while rendering",c(g,{padding:1,fontSize:1,style:{transform:"translateY(1px)"},mode:"ghost",text:t.title,onClick:()=>{o.current&&x(o.current,{behavior:"smooth",scrollMode:"if-needed",block:"center"})}})]})})})}}),O=d((()=>{k(["mux-input"]),u()}),[u]);return a?c(y,{ref:o,paddingX:[2,3,4,4],height:"fill",shadow:1,overflow:"auto",children:c(f,{justify:"flex-start",align:"center",height:"fill",children:s(b,{columns:1,gap:[2,3,4,4],children:[s(v,{as:"h1",children:["The ",c("code",{children:"mux-input"})," plugin crashed"]}),(null==p?void 0:p.message)&&c(y,{padding:3,tone:"critical",shadow:1,radius:2,children:c(j,{children:p.message})}),c(h,{children:c(g,{onClick:O,text:"Retry"})})]})})}):c(i,{children:r})}));const S=T(y)(e||(z=["\n aspect-ratio: 16 / 9;\n position: relative;\n width: 100%;\n"],I||(I=z.slice(0)),e=Object.freeze(Object.defineProperties(z,{raw:{value:Object.freeze(I)}}))));var z,I;const A=()=>c("div",{style:{padding:1},children:c(y,{shadow:1,sizing:"border",style:{aspectRatio:"16/9",width:"100%",borderRadius:"1px"},children:s(f,{align:"center",direction:"column",height:"fill",justify:"center",children:[c(O,{muted:!0}),c(w,{marginTop:3,children:c(j,{align:"center",muted:!0,size:1,children:"Loading…"})})]})})}),R=p((()=>import("./Input-af5a0a66.esm.js")));var V=e=>a((function(r){return function(e){var r;return o(e)&&"mux.video"===(null==(r=e.schemaType.type)?void 0:r.name)}(r)?c(S,{children:c(E,{schemaType:r.schemaType,children:c(u,{fallback:c(A,{}),children:c(R,t({config:e},r))})})}):r.renderDefault(r)}));const B=p((()=>import("./Preview-bb256342.esm.js")));var L=a((function(e){return function(e){var r,t;return"mux.video"===(null==(t=null==(r=e.schemaType)?void 0:r.type)?void 0:t.name)}(e)?c(S,{children:c(B,t({},e))}):e.renderDefault(e)}));const M={mp4_support:"none"},X=i((e=>{const r=t(t({},M),e);return{name:"mux-input",form:{components:{input:V(r),preview:L}},schema:{types:[{name:"mux.video",type:"object",title:"Video asset reference",fields:[{title:"Video",name:"asset",type:"reference",weak:!0,to:[{type:"mux.videoAsset"}]}]},{name:"mux.videoAsset",type:"object",title:"Video asset",fields:[{type:"string",name:"status"},{type:"string",name:"assetId"},{type:"string",name:"playbackId"},{type:"string",name:"filename"},{type:"number",name:"thumbTime"}]}]}}}));export{A as I,X as a,C as c,M as d,D as m};
|
|
2
|
-
//# sourceMappingURL=index-3d8d7583.esm.js.map
|