sanity-plugin-mux-input 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +57 -55
- package/dist/index.js +223 -88
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +227 -92
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -17
- package/src/components/EditThumbnailDialog.tsx +122 -0
- package/src/components/PlayerActionsMenu.tsx +13 -0
- package/src/components/Uploader.tsx +21 -15
- package/src/components/VideoPlayer.tsx +66 -49
- package/src/components/VideoThumbnail.tsx +15 -8
- package/src/context/DialogStateContext.tsx +36 -0
- package/src/hooks/useAssets.ts +29 -23
- package/src/util/createUrlParamsObject.ts +25 -0
- package/src/util/formatSeconds.ts +28 -1
- package/src/util/getAnimatedPosterSrc.ts +5 -13
- package/src/util/getPosterSrc.ts +10 -15
- package/src/util/getVideoMetadata.ts +1 -1
- package/src/util/types.ts +4 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/components/icons/ToolIcon.tsx","../src/hooks/useClient.ts","../src/util/createSearchFilter.ts","../src/hooks/useAssets.ts","../src/util/parsers.ts","../src/hooks/useMuxAssets.ts","../src/util/constants.ts","../src/hooks/useSecretsDocumentValues.ts","../src/hooks/useImportMuxAssets.ts","../src/hooks/useInView.ts","../src/util/readSecrets.ts","../src/util/generateJwt.ts","../src/util/getPlaybackId.ts","../src/util/getPlaybackPolicy.ts","../src/util/getAnimatedPosterSrc.ts","../src/components/VideoThumbnail.tsx","../src/components/ImportVideosFromMux.tsx","../src/components/SelectSortOptions.tsx","../src/components/SpinnerBox.tsx","../src/components/FormField.tsx","../src/components/IconInfo.tsx","../src/components/icons/Resolution.tsx","../src/components/icons/StopWatch.tsx","../src/util/getVideoSrc.ts","../src/components/VideoPlayer.tsx","../src/actions/assets.ts","../src/components/documentPreview/MissingSchemaType.tsx","../src/components/documentPreview/TimeAgo.tsx","../src/components/documentPreview/DraftStatus.tsx","../src/components/documentPreview/PublishedStatus.tsx","../src/components/documentPreview/PaneItemPreview.tsx","../src/components/documentPreview/DocumentPreview.tsx","../src/components/VideoDetails/VideoReferences.tsx","../src/components/VideoDetails/DeleteDialog.tsx","../src/hooks/useDocReferences.ts","../src/util/formatSeconds.ts","../src/util/getVideoMetadata.ts","../src/components/VideoDetails/useVideoDetails.ts","../src/components/VideoDetails/VideoDetails.tsx","../src/components/VideoMetadata.tsx","../src/components/VideoInBrowser.tsx","../src/components/VideosBrowser.tsx","../src/components/StudioTool.tsx","../src/hooks/useAssetDocumentValues.ts","../src/hooks/useDialogState.ts","../src/hooks/useMuxPolling.ts","../src/actions/secrets.ts","../src/hooks/useSaveSecrets.ts","../src/hooks/useSecretsFormState.ts","../src/components/MuxLogo.tsx","../src/components/ConfigureApi.styled.tsx","../src/components/ConfigureApi.tsx","../node_modules/use-error-boundary/lib/index.module.js","../src/components/ErrorBoundaryCard.tsx","../src/components/Input.styled.tsx","../src/components/Onboard.tsx","../src/clients/upChunkObservable.ts","../src/actions/upload.ts","../src/util/asserters.ts","../src/util/extractFiles.ts","../src/components/SelectAsset.tsx","../src/components/InputBrowser.tsx","../src/hooks/useCancelUpload.ts","../src/components/Player.styled.tsx","../src/components/UploadProgress.tsx","../src/components/Player.tsx","../src/components/withFocusRing/helpers.ts","../src/components/FileInputMenuItem.styled.tsx","../src/components/FileInputMenuItem.tsx","../src/components/PlayerActionsMenu.tsx","../src/util/formatBytes.ts","../src/util/types.ts","../src/components/TextTracksEditor.tsx","../src/components/UploadConfiguration.tsx","../src/components/withFocusRing/withFocusRing.ts","../src/components/Uploader.styled.tsx","../src/components/FileInputButton.tsx","../src/components/UploadPlaceholder.tsx","../src/components/Uploader.tsx","../src/components/Input.tsx","../src/plugin.tsx","../src/schema.ts","../src/_exports/index.ts"],"sourcesContent":["/**\n * Icon of a monitor with a play button.\n * Credits: material design icons & react-icons\n */\nconst ToolIcon = () => (\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 24 24\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-6l-7 4V7z\" />\n </svg>\n)\n\nexport default ToolIcon\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 const SANITY_API_VERSION = '2024-03-05'\n\nexport function useClient() {\n return useSanityClient({apiVersion: SANITY_API_VERSION})\n}\n","// Adaptation of Sanity's createSearchQuery for our limited use case:\n// https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/core/search/weighted/createSearchQuery.ts\nimport {compact, toLower, trim, uniq, words} from 'lodash'\n\nconst SPECIAL_CHARS = /([^!@#$%^&*(),\\\\/?\";:{}|[\\]+<>\\s-])+/g\nconst STRIP_EDGE_CHARS = /(^[.]+)|([.]+$)/\n\nfunction tokenize(string: string): string[] {\n return (string.match(SPECIAL_CHARS) || []).map((token) => token.replace(STRIP_EDGE_CHARS, ''))\n}\n\nfunction toGroqParams(terms: string[]): Record<string, string> {\n const params: Record<string, string> = {}\n return terms.reduce((acc, term, i) => {\n acc[`t${i}`] = `*${term}*` // \"t\" is short for term\n return acc\n }, params)\n}\n\n/**\n * Convert a string into an array of tokenized terms.\n *\n * Any (multi word) text wrapped in double quotes will be treated as \"phrases\", or separate tokens that\n * will not have its special characters removed.\n * E.g.`\"the\" \"fantastic mr\" fox fox book` =\\> [\"the\", `\"fantastic mr\"`, \"fox\", \"book\"]\n *\n * Phrases wrapped in quotes are assigned relevance scoring differently from regular words.\n *\n * @internal\n */\nfunction extractTermsFromQuery(query: string): string[] {\n const quotedQueries = [] as string[]\n const unquotedQuery = query.replace(/(\"[^\"]*\")/g, (match) => {\n if (words(match).length > 1) {\n quotedQueries.push(match)\n return ''\n }\n return match\n })\n\n // Lowercase and trim quoted queries\n const quotedTerms = quotedQueries.map((str) => trim(toLower(str)))\n\n /**\n * Convert (remaining) search query into an array of deduped, sanitized tokens.\n * All white space and special characters are removed.\n * e.g. \"The saint of Saint-Germain-des-Prés\" =\\> ['the', 'saint', 'of', 'germain', 'des', 'pres']\n */\n const remainingTerms = uniq(compact(tokenize(toLower(unquotedQuery))))\n\n return [...quotedTerms, ...remainingTerms]\n}\n\n/**\n * Create GROQ constraints, given search terms and the full spec of available document types and fields.\n * Essentially a large list of all possible fields (joined by logical OR) to match our search terms against.\n */\nfunction createConstraints(terms: string[], includeAssetId: boolean) {\n const searchPaths = includeAssetId ? ['filename', 'assetId'] : ['filename']\n const constraints = terms\n .map((_term, i) => searchPaths.map((joinedPath) => `${joinedPath} match $t${i}`))\n .filter((constraint) => constraint.length > 0)\n\n return constraints.map((constraint) => `(${constraint.join(' || ')})`)\n}\n\nexport function createSearchFilter(query: string) {\n const terms = extractTermsFromQuery(query)\n\n return {\n filter: createConstraints(terms, query.length >= 8), // if the search is big enough, include the assetId (mux id) in the results\n params: {\n ...toGroqParams(terms),\n },\n }\n}\n","import {useMemo, useState} from 'react'\nimport {collate, createHookFromObservableFactory, DocumentStore, useDocumentStore} from 'sanity'\n\nimport {SANITY_API_VERSION} from '../hooks/useClient'\nimport {createSearchFilter} from '../util/createSearchFilter'\nimport type {VideoAssetDocument} from '../util/types'\n\nexport const ASSET_SORT_OPTIONS = {\n createdDesc: {groq: '_createdAt desc', label: 'Newest first'},\n createdAsc: {groq: '_createdAt asc', label: 'First created (oldest)'},\n filenameAsc: {groq: 'filename asc', label: 'By filename (A-Z)'},\n filenameDesc: {groq: 'filename desc', label: 'By filename (Z-A)'},\n}\n\nexport type SortOption = keyof typeof ASSET_SORT_OPTIONS\n\nconst useAssetDocuments = createHookFromObservableFactory<\n VideoAssetDocument[],\n {\n documentStore: DocumentStore\n sort: SortOption\n searchQuery: string\n }\n>(({documentStore, sort, searchQuery}) => {\n const search = createSearchFilter(searchQuery)\n const filter = [`_type == \"mux.videoAsset\"`, ...search.filter].filter(Boolean).join(' && ')\n\n const sortFragment = ASSET_SORT_OPTIONS[sort].groq\n return documentStore.listenQuery(\n /* groq */ `*[${filter}] | order(${sortFragment})`,\n search.params,\n {\n apiVersion: SANITY_API_VERSION,\n }\n )\n})\n\nexport default function useAssets() {\n const documentStore = useDocumentStore()\n const [sort, setSort] = useState<SortOption>('createdDesc')\n const [searchQuery, setSearchQuery] = useState('')\n\n const [assetDocuments = [], isLoading] = useAssetDocuments({documentStore, sort, searchQuery})\n const assets = useMemo(\n () =>\n // Avoid displaying both drafts & published assets by collating them together and giving preference to drafts\n collate<VideoAssetDocument>(assetDocuments).map(\n (collated) =>\n ({\n ...(collated.draft || collated.published || {}),\n _id: collated.id,\n }) as VideoAssetDocument\n ),\n [assetDocuments]\n )\n\n return {\n assets,\n isLoading,\n sort,\n searchQuery,\n setSort,\n setSearchQuery,\n }\n}\n","import type {MuxAsset} from './types'\n\nexport function parseMuxDate(date: MuxAsset['created_at']): Date {\n return new Date(Number(date) * 1000)\n}\n","import {useEffect, useState} from 'react'\nimport {defer, of, timer} from 'rxjs'\nimport {concatMap, expand, tap} from 'rxjs/operators'\n\nimport type {MuxAsset, Secrets} from '../util/types'\n\nconst FIRST_PAGE = 1\nconst ASSETS_PER_PAGE = 100\n\ntype MuxAssetsState = {\n pageNum: number\n loading: boolean\n data?: MuxAsset[]\n error?: FetchError\n}\n\ntype FetchError =\n | {\n _tag: 'FetchError'\n }\n | {_tag: 'MuxError'; error: unknown}\n\ntype PageResult = (\n | {\n data: MuxAsset[]\n }\n | {\n error: FetchError\n }\n) & {\n pageNum: number\n}\n\n/**\n * @docs {@link https://docs.mux.com/api-reference#video/operation/list-assets}\n */\nasync function fetchMuxAssetsPage(\n {secretKey, token}: Secrets,\n pageNum: number\n): Promise<PageResult> {\n try {\n const res = await fetch(\n `https://api.mux.com/video/v1/assets?limit=${ASSETS_PER_PAGE}&page=${pageNum}`,\n {\n headers: {\n Authorization: `Basic ${btoa(`${token}:${secretKey}`)}`,\n },\n }\n )\n const json = await res.json()\n\n if (json.error) {\n return {\n pageNum,\n error: {\n _tag: 'MuxError',\n error: json.error,\n },\n }\n }\n\n return {\n pageNum,\n data: json.data as MuxAsset[],\n }\n } catch (error) {\n return {\n pageNum,\n error: {_tag: 'FetchError'},\n }\n }\n}\n\nfunction accumulateIntermediateState(\n currentState: MuxAssetsState,\n pageResult: PageResult\n): MuxAssetsState {\n const currentData = ('data' in currentState && currentState.data) || []\n return {\n ...currentState,\n data: [\n ...currentData,\n ...(('data' in pageResult && pageResult.data) || []).filter(\n // De-duplicate assets for safety\n (asset) => !currentData.some((a) => a.id === asset.id)\n ),\n ],\n error:\n 'error' in pageResult\n ? pageResult.error\n : // Reset error if current page is successful\n undefined,\n pageNum: pageResult.pageNum,\n loading: true,\n }\n}\n\nfunction hasMorePages(pageResult: PageResult) {\n return (\n typeof pageResult === 'object' &&\n 'data' in pageResult &&\n Array.isArray(pageResult.data) &&\n pageResult.data.length > 0\n )\n}\n\n/**\n * Fetches all assets from a Mux environment. Rules:\n * - One page at a time\n * - Mux has no information on pagination\n * - We've finished fetching if a page returns `data.length === 0`\n * - Rate limiting to one request per 2 seconds\n * - Update state while still fetching to give feedback to users\n */\nexport default function useMuxAssets({secrets, enabled}: {enabled: boolean; secrets: Secrets}) {\n const [state, setState] = useState<MuxAssetsState>({loading: true, pageNum: FIRST_PAGE})\n\n useEffect(() => {\n if (!enabled) return\n\n const subscription = defer(() =>\n fetchMuxAssetsPage(\n secrets,\n // When we've already successfully loaded before (fully or partially), we start from the following page to avoid re-fetching\n 'data' in state && state.data && state.data.length > 0 && !state.error\n ? state.pageNum + 1\n : state.pageNum\n )\n )\n .pipe(\n // Here we replace \"concatMap\" with \"expand\" to recursively fetch next pages\n expand((pageResult) => {\n // if fetched page has data, we continue emitting, requesting the next page\n // after 2s to avoid rate limiting\n if (hasMorePages(pageResult)) {\n return timer(2000).pipe(\n // eslint-disable-next-line max-nested-callbacks\n concatMap(() => defer(() => fetchMuxAssetsPage(secrets, pageResult.pageNum + 1)))\n )\n }\n\n // Else, we stop emitting\n return of()\n }),\n\n // On each iteration, persist intermediate states to give feedback to users\n tap((pageResult) =>\n setState((prevState) => accumulateIntermediateState(prevState, pageResult))\n )\n )\n .subscribe({\n // Once done, let the user know we've stopped loading\n complete: () => {\n setState((prev) => ({\n ...prev,\n loading: false,\n }))\n },\n })\n\n // Unsubscribe on component unmount to prevent memory leaks or fetching unnecessarily\n // eslint-disable-next-line consistent-return\n return () => subscription.unsubscribe()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled])\n\n return state\n}\n","export const name = 'mux-input' as const\n\n// Caching namespace, as suspend-react might be in use by other components on the page we must ensure we don't collide\nexport const cacheNs = 'sanity-plugin-mux-input' as const\n\nexport const muxSecretsDocumentId = 'secrets.mux' as const\n\nexport const DIALOGS_Z_INDEX = 60_000\n\nexport const THUMBNAIL_ASPECT_RATIO = 16 / 9\n\n/** To prevent excessive height, thumbnails and input should not go beyond to this aspect ratio. */\nexport const MIN_ASPECT_RATIO = 5 / 4\n\nexport const AUDIO_ASPECT_RATIO = 5 / 1\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 {uuid} from '@sanity/uuid'\nimport {useMemo, useState} from 'react'\nimport {\n createHookFromObservableFactory,\n type DocumentStore,\n truncateString,\n useClient,\n useDocumentStore,\n} from 'sanity'\n\nimport {parseMuxDate} from '../util/parsers'\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\nimport {SANITY_API_VERSION} from './useClient'\nimport useMuxAssets from './useMuxAssets'\nimport {useSecretsDocumentValues} from './useSecretsDocumentValues'\n\ntype ImportState = 'closed' | 'idle' | 'importing' | 'done' | 'error'\n\nexport type AssetInSanity = {\n uploadId: string\n assetId: string\n}\n\nexport default function useImportMuxAssets() {\n const documentStore = useDocumentStore()\n const client = useClient({\n apiVersion: SANITY_API_VERSION,\n })\n\n const [assetsInSanity, assetsInSanityLoading] = useAssetsInSanity(documentStore)\n\n const secretDocumentValues = useSecretsDocumentValues()\n const hasSecrets = !!secretDocumentValues.value.secrets?.secretKey\n\n const [importError, setImportError] = useState<unknown>()\n const [importState, setImportState] = useState<ImportState>('closed')\n const dialogOpen = importState !== 'closed'\n\n const muxAssets = useMuxAssets({\n secrets: secretDocumentValues.value.secrets,\n enabled: hasSecrets && dialogOpen,\n })\n\n const missingAssets = useMemo(() => {\n return assetsInSanity && muxAssets.data\n ? muxAssets.data.filter((a) => !assetExistsInSanity(a, assetsInSanity))\n : undefined\n }, [assetsInSanity, muxAssets.data])\n\n const [selectedAssets, setSelectedAssets] = useState<MuxAsset[]>([])\n\n const closeDialog = () => {\n if (importState !== 'importing') setImportState('closed')\n }\n const openDialog = () => {\n if (importState === 'closed') setImportState('idle')\n }\n\n async function importAssets() {\n setImportState('importing')\n const documents = selectedAssets.flatMap((asset) => muxAssetToSanityDocument(asset) || [])\n\n const tx = client.transaction()\n documents.forEach((doc) => tx.create(doc))\n\n try {\n await tx.commit({returnDocuments: false})\n setSelectedAssets([])\n setImportState('done')\n } catch (error) {\n setImportState('error')\n setImportError(error)\n }\n }\n\n return {\n assetsInSanityLoading,\n closeDialog,\n dialogOpen,\n importState,\n importError,\n hasSecrets,\n importAssets,\n missingAssets,\n muxAssets,\n openDialog,\n selectedAssets,\n setSelectedAssets,\n }\n}\n\nfunction muxAssetToSanityDocument(asset: MuxAsset): VideoAssetDocument | undefined {\n const playbackId = (asset.playback_ids || []).find((p) => p.id)?.id\n\n if (!playbackId) return undefined\n\n return {\n _id: uuid(),\n _type: 'mux.videoAsset',\n _updatedAt: new Date().toISOString(),\n _createdAt: parseMuxDate(asset.created_at).toISOString(),\n assetId: asset.id,\n playbackId,\n filename: `Asset #${truncateString(asset.id, 15)}`,\n status: asset.status,\n data: asset,\n }\n}\n\nconst useAssetsInSanity = createHookFromObservableFactory<AssetInSanity[], DocumentStore>(\n (documentStore) => {\n return documentStore.listenQuery(\n /* groq */ `*[_type == \"mux.videoAsset\"] {\n \"uploadId\": coalesce(uploadId, data.upload_id),\n \"assetId\": coalesce(assetId, data.id),\n }`,\n {},\n {\n apiVersion: SANITY_API_VERSION,\n }\n )\n }\n)\n\nfunction assetExistsInSanity(asset: MuxAsset, existingAssets: AssetInSanity[]) {\n // Don't allow importing assets that are not ready\n if (asset.status !== 'ready') return false\n\n return existingAssets.some(\n (existing) => existing.assetId === asset.id || existing.uploadId === asset.upload_id\n )\n}\n","import type {RefObject} from 'react'\nimport {useEffect, useRef, useState} from 'react'\n\ntype IntersectionOptions = {\n root?: Element | null\n rootMargin?: string\n threshold?: number\n onChange?: (inView: boolean) => void\n}\n\nfunction useInView<RefElement = HTMLElement>(\n options: IntersectionOptions = {}\n): {inView: boolean; ref: RefObject<RefElement>} {\n const [inView, setInView] = useState(false)\n const ref = useRef(null)\n\n useEffect(() => {\n if (!ref.current) return\n\n const observer = new IntersectionObserver(([entry], obs) => {\n // ==== from react-intersection-observer ====\n // While it would be nice if you could just look at isIntersecting to determine if the component is inside the viewport, browsers can't agree on how to use it.\n // -Firefox ignores `threshold` when considering `isIntersecting`, so it will never be false again if `threshold` is > 0\n const nowInView =\n entry.isIntersecting &&\n obs.thresholds.some((threshold) => entry.intersectionRatio >= threshold)\n\n // Update our state when observer callback fires\n setInView(nowInView)\n options?.onChange?.(nowInView)\n }, options)\n\n const toObserve = ref.current\n observer.observe(toObserve)\n\n // eslint-disable-next-line\n return () => {\n if (toObserve) observer.unobserve(toObserve)\n }\n }, [options])\n\n return {inView, ref}\n}\n\nexport default useInView\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'\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'\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 Check your plugin's configuration\")\n }\n if (!signingKeyPrivate) {\n throw new TypeError(\"Missing `signingKeyPrivate`.\\n Check your plugin's configuration\")\n }\n\n // @ts-expect-error - handle missing typings for this package\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: Pick<VideoAssetDocument, 'playbackId'>): 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(\n asset: Pick<VideoAssetDocument, 'data' | 'playbackId'>\n): PlaybackPolicy {\n return (\n asset.data?.playback_ids?.find((playbackId) => asset.playbackId === playbackId.id)?.policy ??\n 'public'\n )\n}\n","import type {SanityClient} from 'sanity'\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: Pick<VideoAssetDocument, 'playbackId' | 'data' | 'thumbTime'>\n client: SanityClient\n}\n\nexport function getAnimatedPosterSrc({\n asset,\n client,\n height,\n width,\n start = asset.thumbTime ? Math.max(0, asset.thumbTime - 2.5) : 0,\n end = start + 5,\n fps = 15,\n}: AnimatedPosterSrcOptions): MuxAnimatedThumbnailUrl {\n const params = {height, width, start, end, fps}\n const playbackId = getPlaybackId(asset)\n\n let searchParams = new URLSearchParams(\n JSON.parse(JSON.stringify(params, (_, v) => v ?? undefined))\n )\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 'g', params)\n searchParams = new URLSearchParams({token})\n }\n\n return `https://image.mux.com/${playbackId}/animated.gif?${searchParams}`\n}\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Card, CardTone, Spinner, Stack, Text} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {useClient} from '../hooks/useClient'\nimport useInView from '../hooks/useInView'\nimport {THUMBNAIL_ASPECT_RATIO} from '../util/constants'\nimport {type AnimatedPosterSrcOptions, getAnimatedPosterSrc} from '../util/getAnimatedPosterSrc'\nimport {VideoAssetDocument} from '../util/types'\n\nconst Image = styled.img`\n transition: opacity 0.175s ease-out 0s;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n object-position: center center;\n`\n\ntype ImageStatus = 'loading' | 'error' | 'loaded'\n\nconst STATUS_TO_TONE: Record<ImageStatus, CardTone> = {\n loading: 'transparent',\n error: 'critical',\n loaded: 'default',\n}\n\nexport default function VideoThumbnail({\n asset,\n width,\n}: {\n asset: AnimatedPosterSrcOptions['asset'] & Pick<VideoAssetDocument, 'filename' | 'assetId'>\n width?: number\n}) {\n const {inView, ref} = useInView()\n const posterWidth = width || 250\n\n const [status, setStatus] = useState<ImageStatus>('loading')\n const client = useClient()\n\n const animatedSrc = useMemo(() => {\n try {\n return getAnimatedPosterSrc({asset, client, width: posterWidth})\n } catch {\n if (status !== 'error') setStatus('error')\n return undefined\n }\n }, [asset, client, posterWidth, status])\n\n function handleLoad() {\n setStatus('loaded')\n }\n\n function handleError() {\n setStatus('error')\n }\n\n return (\n <Card\n style={{\n aspectRatio: THUMBNAIL_ASPECT_RATIO,\n position: 'relative',\n maxWidth: width ? `${width}px` : undefined,\n width: '100%',\n flex: 1,\n }}\n border\n radius={2}\n ref={ref as any}\n tone={STATUS_TO_TONE[status]}\n >\n {inView ? (\n <>\n {status === 'loading' && (\n <Box\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n }}\n >\n <Spinner />\n </Box>\n )}\n {status === 'error' && (\n <Stack\n space={4}\n style={{\n position: 'absolute',\n width: '100%',\n left: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n justifyItems: 'center',\n }}\n >\n <Text size={4} muted>\n <ErrorOutlineIcon style={{fontSize: '1.75em'}} />\n </Text>\n <Text muted align=\"center\">\n Failed loading thumbnail\n </Text>\n </Stack>\n )}\n <Image\n src={animatedSrc}\n alt={`Preview for video ${asset.filename || asset.assetId}`}\n onLoad={handleLoad}\n onError={handleError}\n style={{\n opacity: status === 'loaded' ? 1 : 0,\n }}\n />\n </>\n ) : null}\n </Card>\n )\n}\n","import {CheckmarkCircleIcon, ErrorOutlineIcon, RetrieveIcon, RetryIcon} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Checkbox,\n Code,\n Dialog,\n Flex,\n Heading,\n Spinner,\n Stack,\n Text,\n} from '@sanity/ui'\nimport {truncateString, useFormattedDuration} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport useImportMuxAssets from '../hooks/useImportMuxAssets'\nimport {DIALOGS_Z_INDEX} from '../util/constants'\nimport type {MuxAsset} from '../util/types'\nimport VideoThumbnail from './VideoThumbnail'\n\nconst MissingAssetCheckbox = styled(Checkbox)`\n position: static !important;\n\n input::after {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n cursor: pointer;\n z-index: 1000;\n }\n`\n\nfunction MissingAsset({\n asset,\n selectAsset,\n selected,\n}: {\n asset: MuxAsset\n selectAsset: (selected: boolean) => void\n selected: boolean\n}) {\n const duration = useFormattedDuration(asset.duration * 1000)\n\n return (\n <Card\n key={asset.id}\n tone={selected ? 'positive' : undefined}\n border\n paddingX={2}\n paddingY={3}\n style={{position: 'relative'}}\n radius={1}\n >\n <Flex align=\"center\" gap={2}>\n <MissingAssetCheckbox\n checked={selected}\n onChange={(e) => {\n selectAsset(e.currentTarget.checked)\n }}\n aria-label={selected ? `Import video ${asset.id}` : `Skip import of video ${asset.id}`}\n />\n <VideoThumbnail\n asset={{\n assetId: asset.id,\n data: asset,\n filename: asset.id,\n playbackId: asset.playback_ids.find((p) => p.id)?.id,\n }}\n width={150}\n />\n <Stack space={2}>\n <Flex align=\"center\" gap={1}>\n <Code size={2}>{truncateString(asset.id, 15)}</Code>{' '}\n <Text muted size={2}>\n ({duration.formatted})\n </Text>\n </Flex>\n <Text size={1}>\n Uploaded at{' '}\n {new Date(Number(asset.created_at) * 1000).toLocaleDateString('en', {\n year: 'numeric',\n day: '2-digit',\n month: '2-digit',\n })}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )\n}\n\n// eslint-disable-next-line complexity\nfunction ImportVideosDialog(props: ReturnType<typeof useImportMuxAssets>) {\n const {importState} = props\n\n const canTriggerImport =\n (importState === 'idle' || importState === 'error') && props.selectedAssets.length > 0\n const isImporting = importState === 'importing'\n const noAssetsToImport =\n props.missingAssets?.length === 0 && !props.muxAssets.loading && !props.assetsInSanityLoading\n\n return (\n <Dialog\n animate\n header={'Import videos from Mux'}\n zOffset={DIALOGS_Z_INDEX}\n id=\"video-details-dialog\"\n onClose={props.closeDialog}\n onClickOutside={props.closeDialog}\n width={1}\n position=\"fixed\"\n footer={\n importState !== 'done' &&\n !noAssetsToImport && (\n <Card padding={3}>\n <Flex justify=\"space-between\" align=\"center\">\n <Button\n fontSize={2}\n padding={3}\n mode=\"bleed\"\n text=\"Cancel\"\n tone=\"critical\"\n onClick={props.closeDialog}\n disabled={isImporting}\n />\n {props.missingAssets && (\n <Button\n icon={RetrieveIcon}\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text={\n props.selectedAssets?.length > 0\n ? `Import ${props.selectedAssets.length} video(s)`\n : 'No video(s) selected'\n }\n tone=\"positive\"\n onClick={props.importAssets}\n iconRight={isImporting && Spinner}\n disabled={!canTriggerImport}\n />\n )}\n </Flex>\n </Card>\n )\n }\n >\n <Box padding={3}>\n {/* LOADING ASSETS STATE */}\n {(props.muxAssets.loading || props.assetsInSanityLoading) && (\n <Card tone=\"primary\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={4}>\n <Spinner muted size={4} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n Loading assets from Mux\n </Text>\n <Text size={1}>\n This may take a while.\n {props.missingAssets &&\n props.missingAssets.length > 0 &&\n ` There are at least ${props.missingAssets.length} video${props.missingAssets.length > 1 ? 's' : ''} currently not in Sanity...`}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR LOADING MUX */}\n {props.muxAssets.error && (\n <Card tone=\"critical\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon fontSize={36} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n There was an error getting all data from Mux\n </Text>\n <Text size={1}>\n {props.missingAssets\n ? `But we've found ${props.missingAssets.length} video${props.missingAssets.length > 1 ? 's' : ''} not in Sanity, which you can start importing now.`\n : 'Please try again or contact a developer for help.'}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* IMPORTING STATE */}\n {importState === 'importing' && (\n <Card tone=\"primary\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={4}>\n <Spinner muted size={4} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n Importing {props.selectedAssets.length} video\n {props.selectedAssets.length > 1 && 's'} from Mux\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR IMPORTING */}\n {importState === 'error' && (\n <Card tone=\"critical\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon fontSize={36} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n There was an error importing videos\n </Text>\n <Text size={1}>\n {props.importError\n ? `Error: ${props.importError}`\n : 'Please try again or contact a developer for help.'}\n </Text>\n <Box marginTop={1}>\n <Button\n icon={RetryIcon}\n text=\"Retry\"\n tone=\"primary\"\n onClick={props.importAssets}\n />\n </Box>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* NO ASSETS TO IMPORT or SUCESS STATE */}\n {(noAssetsToImport || importState === 'done') && (\n <Stack paddingY={5} marginBottom={4} space={3} style={{textAlign: 'center'}}>\n <Box>\n <CheckmarkCircleIcon fontSize={48} />\n </Box>\n <Heading size={2}>\n {importState === 'done'\n ? `Videos imported successfully`\n : 'There are no Mux videos to import'}\n </Heading>\n <Text size={2}>\n {importState === 'done'\n ? 'You can now use them in your Sanity content.'\n : \"They're all in Sanity and ready to be used in your content.\"}\n </Text>\n </Stack>\n )}\n\n {/* MISSING ASSETS SELECTOR */}\n {props.missingAssets &&\n props.missingAssets.length > 0 &&\n (importState === 'idle' || importState === 'error') && (\n <Stack space={4}>\n <Heading size={1}>\n There are {props.missingAssets.length}\n {props.muxAssets.loading && '+'} Mux video{props.missingAssets.length > 1 && 's'}{' '}\n not in Sanity\n </Heading>\n {!props.muxAssets.loading && (\n <Flex align=\"center\" paddingX={2}>\n <Checkbox\n id=\"import-all\"\n style={{display: 'block'}}\n onClick={(e) => {\n const selectAll = e.currentTarget.checked\n if (selectAll) {\n // eslint-disable-next-line no-unused-expressions\n props.missingAssets && props.setSelectedAssets(props.missingAssets)\n } else {\n props.setSelectedAssets([])\n }\n }}\n checked={props.selectedAssets.length === props.missingAssets.length}\n />\n <Box flex={1} paddingLeft={3} as=\"label\" htmlFor=\"import-all\">\n <Text>Import all</Text>\n </Box>\n </Flex>\n )}\n {props.missingAssets.map((asset) => (\n <MissingAsset\n key={asset.id}\n asset={asset}\n selectAsset={(selected) => {\n if (selected) {\n props.setSelectedAssets([...props.selectedAssets, asset])\n } else {\n props.setSelectedAssets(props.selectedAssets.filter((a) => a.id !== asset.id))\n }\n }}\n selected={props.selectedAssets.some((a) => a.id === asset.id)}\n />\n ))}\n </Stack>\n )}\n </Box>\n </Dialog>\n )\n}\n\nexport default function ImportVideosFromMux() {\n const importAssets = useImportMuxAssets()\n\n if (!importAssets.hasSecrets) {\n return\n }\n\n if (importAssets.dialogOpen) {\n // eslint-disable-next-line consistent-return\n return <ImportVideosDialog {...importAssets} />\n }\n\n // eslint-disable-next-line consistent-return\n return <Button mode=\"bleed\" text=\"Import from Mux\" onClick={importAssets.openDialog} />\n}\n","import {SortIcon} from '@sanity/icons'\nimport {Button, Menu, MenuButton, MenuItem, PopoverProps} from '@sanity/ui'\nimport {useId} from 'react'\n\nimport {ASSET_SORT_OPTIONS, SortOption} from '../hooks/useAssets'\n\nexport const CONTEXT_MENU_POPOVER_PROPS: PopoverProps = {\n constrainSize: true,\n placement: 'bottom',\n portal: true,\n width: 0,\n}\n\n/**\n * @sanity/ui components adapted from:\n * https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/pane/PaneContextMenuButton.tsx#L19\n */\nexport function SelectSortOptions(props: {sort: SortOption; setSort: (s: SortOption) => void}) {\n const id = useId()\n\n return (\n <MenuButton\n button={\n <Button text=\"Sort\" icon={SortIcon} mode=\"bleed\" padding={3} style={{cursor: 'pointer'}} />\n }\n id={id}\n menu={\n <Menu>\n {Object.entries(ASSET_SORT_OPTIONS).map(([type, {label}]) => (\n <MenuItem\n key={type}\n data-as=\"button\"\n onClick={() => props.setSort(type as SortOption)}\n padding={3}\n tone=\"default\"\n text={label}\n pressed={type === props.sort}\n />\n ))}\n </Menu>\n }\n popover={CONTEXT_MENU_POPOVER_PROPS}\n />\n )\n}\n","import {Box, Spinner} from '@sanity/ui'\n\nconst SpinnerBox: React.FC = () => (\n <Box\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '150px',\n }}\n >\n <Spinner />\n </Box>\n)\n\nexport default SpinnerBox\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 <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 </Stack>\n </Box>\n </Flex>\n <div>{children}</div>\n </Stack>\n )\n}\n\nexport default memo(FormField)\n","import {Flex, Text} from '@sanity/ui'\n\nconst IconInfo: React.FC<{\n text: string\n icon: React.FC\n size?: number\n muted?: boolean\n}> = (props) => {\n const Icon = props.icon\n return (\n <Flex gap={2} align=\"center\" padding={1}>\n <Text size={(props.size || 1) + 1} muted>\n <Icon />\n </Text>\n <Text size={props.size || 1} muted={props.muted}>\n {props.text}\n </Text>\n </Flex>\n )\n}\n\nexport default IconInfo\n","import type {SVGProps} from 'react'\n\nexport function ResolutionIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20 9V6h-3V4h5v5h-2ZM2 9V4h5v2H4v3H2Zm15 11v-2h3v-3h2v5h-5ZM2 20v-5h2v3h3v2H2Zm4-4V8h12v8H6Zm2-2h8v-4H8v4Zm0 0v-4v4Z\"\n />\n </svg>\n )\n}\n","import type {SVGProps} from 'react'\n\nexport function StopWatchIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 512 512\"\n {...props}\n >\n <path d=\"M232 306.667h48V176h-48v130.667z\" fill=\"currentColor\" />\n <path\n d=\"M407.67 170.271l30.786-30.786-33.942-33.941-30.785 30.786C341.217 111.057 300.369 96 256 96 149.961 96 64 181.961 64 288s85.961 192 192 192 192-85.961 192-192c0-44.369-15.057-85.217-40.33-117.729zm-45.604 223.795C333.734 422.398 296.066 438 256 438s-77.735-15.602-106.066-43.934C121.602 365.735 106 328.066 106 288s15.602-77.735 43.934-106.066C178.265 153.602 215.934 138 256 138s77.734 15.602 106.066 43.934C390.398 210.265 406 247.934 406 288s-15.602 77.735-43.934 106.066z\"\n fill=\"currentColor\"\n />\n <path d=\"M192 32h128v48H192z\" fill=\"currentColor\" />\n </svg>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxVideoUrl, VideoAssetDocument} from './types'\n\ninterface VideoSrcOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getVideoSrc({asset, client}: VideoSrcOptions): MuxVideoUrl {\n const playbackId = getPlaybackId(asset)\n const searchParams = new URLSearchParams()\n\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 'v')\n searchParams.set('token', token)\n }\n\n return `https://stream.mux.com/${playbackId}.m3u8?${searchParams}`\n}\n","import MuxPlayer, {type MuxPlayerProps} from '@mux/mux-player-react'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Card, Text} from '@sanity/ui'\nimport {type PropsWithChildren, useMemo} from 'react'\n\nimport {useClient} from '../hooks/useClient'\nimport {AUDIO_ASPECT_RATIO, MIN_ASPECT_RATIO} from '../util/constants'\nimport {getVideoSrc} from '../util/getVideoSrc'\nimport type {VideoAssetDocument} from '../util/types'\n\nexport default function VideoPlayer({\n asset,\n children,\n ...props\n}: PropsWithChildren<\n {asset: VideoAssetDocument; forceAspectRatio?: number} & Partial<Pick<MuxPlayerProps, 'autoPlay'>>\n>) {\n const client = useClient()\n\n const isAudio = assetIsAudio(asset)\n\n const {src: videoSrc, error} = useMemo(() => {\n try {\n const src = asset?.playbackId && getVideoSrc({client, asset})\n if (src) return {src: src}\n\n return {error: new TypeError('Asset has no playback ID')}\n // eslint-disable-next-line @typescript-eslint/no-shadow\n } catch (error) {\n return {error}\n }\n }, [asset, client])\n\n const signedToken = useMemo(() => {\n try {\n const url = new URL(videoSrc!)\n return url.searchParams.get('token')\n } catch {\n return false\n }\n }, [videoSrc])\n\n const [width, height] = (asset?.data?.aspect_ratio ?? '16:9').split(':').map(Number)\n const targetAspectRatio =\n props.forceAspectRatio || (Number.isNaN(width) ? 16 / 9 : width / height)\n let aspectRatio = Math.max(MIN_ASPECT_RATIO, targetAspectRatio)\n if (isAudio) {\n aspectRatio = props.forceAspectRatio\n ? // Make it wider when forcing aspect ratio to balance with videos' rendering height (audio players overflow a bit)\n props.forceAspectRatio * 1.2\n : AUDIO_ASPECT_RATIO\n }\n\n return (\n <Card tone=\"transparent\" style={{aspectRatio: aspectRatio, position: 'relative'}}>\n {videoSrc && (\n <>\n <MuxPlayer\n {...props}\n playsInline\n playbackId={asset.playbackId}\n tokens={\n signedToken\n ? {playback: signedToken, thumbnail: signedToken, storyboard: signedToken}\n : undefined\n }\n preload=\"metadata\"\n crossOrigin=\"anonymous\"\n metadata={{\n player_name: 'Sanity Admin Dashboard',\n player_version: process.env.PKG_VERSION,\n page_type: 'Preview Player',\n }}\n audio={isAudio}\n style={{\n height: '100%',\n width: '100%',\n display: 'block',\n objectFit: 'contain',\n }}\n />\n {children}\n </>\n )}\n {error ? (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n }}\n >\n <Text muted>\n <ErrorOutlineIcon style={{marginRight: '0.15em'}} />\n {typeof error === 'object' && 'message' in error && typeof error.message === 'string'\n ? error.message\n : 'Error loading video'}\n </Text>\n </div>\n ) : null}\n {children}\n </Card>\n )\n}\n\nexport function assetIsAudio(asset: VideoAssetDocument) {\n return asset.data?.max_stored_resolution === 'Audio only'\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\n\nexport function deleteAssetOnMux(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 async function deleteAsset({\n client,\n asset,\n deleteOnMux,\n}: {\n client: SanityClient\n asset: VideoAssetDocument\n deleteOnMux: boolean\n}) {\n if (!asset?._id) return true\n\n try {\n await client.delete(asset._id)\n } catch (error) {\n return 'failed-sanity'\n }\n\n if (deleteOnMux && asset?.assetId) {\n try {\n await deleteAssetOnMux(client, asset.assetId)\n } catch (error) {\n return 'failed-mux'\n }\n }\n\n return true\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","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/MissingSchemaType.tsx\nimport {WarningOutlineIcon} from '@sanity/icons'\nimport type {SanityDocument} from 'sanity'\nimport type {GeneralPreviewLayoutKey} from 'sanity'\nimport {SanityDefaultPreview} from 'sanity'\n\nexport interface MissingSchemaTypeProps {\n layout?: GeneralPreviewLayoutKey\n value: SanityDocument\n}\n\nconst getUnknownTypeFallback = (id: string, typeName: string) => ({\n title: (\n <em>\n No schema found for type <code>{typeName}</code>\n </em>\n ),\n subtitle: (\n <em>\n Document: <code>{id}</code>\n </em>\n ),\n media: () => <WarningOutlineIcon />,\n})\n\nexport function MissingSchemaType(props: MissingSchemaTypeProps) {\n const {layout, value} = props\n\n return (\n <SanityDefaultPreview {...getUnknownTypeFallback(value._id, value._type)} layout={layout} />\n )\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/TimeAgo.tsx\nimport {useTimeAgo} from 'sanity'\n\nexport interface TimeAgoProps {\n time: string | Date\n}\n\nexport function TimeAgo({time}: TimeAgoProps) {\n const timeAgo = useTimeAgo(time)\n\n return <span title={timeAgo}>{timeAgo} ago</span>\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/DraftStatus.tsx\nimport {EditIcon} from '@sanity/icons'\nimport {Box, Text, Tooltip} from '@sanity/ui'\nimport type {PreviewValue, SanityDocument} from 'sanity'\nimport {TextWithTone} from 'sanity'\n\nimport {TimeAgo} from './TimeAgo'\n\nexport function DraftStatus(props: {document?: PreviewValue | Partial<SanityDocument> | null}) {\n const {document} = props\n const updatedAt = document && '_updatedAt' in document && document._updatedAt\n\n return (\n <Tooltip\n animate\n portal\n content={\n <Box padding={2}>\n <Text size={1}>\n {document ? (\n <>Edited {updatedAt && <TimeAgo time={updatedAt} />}</>\n ) : (\n <>No unpublished edits</>\n )}\n </Text>\n </Box>\n }\n >\n <TextWithTone tone=\"caution\" dimmed={!document} muted={!document} size={1}>\n <EditIcon />\n </TextWithTone>\n </Tooltip>\n )\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/PublishedStatus.tsx\n\nimport {PublishIcon} from '@sanity/icons'\nimport {Box, Text, Tooltip} from '@sanity/ui'\nimport type {PreviewValue, SanityDocument} from 'sanity'\nimport {TextWithTone} from 'sanity'\n\nimport {TimeAgo} from './TimeAgo'\n\nexport function PublishedStatus(props: {document?: PreviewValue | Partial<SanityDocument> | null}) {\n const {document} = props\n const updatedAt = document && '_updatedAt' in document && document._updatedAt\n\n return (\n <Tooltip\n animate\n portal\n content={\n <Box padding={2}>\n <Text size={1}>\n {document ? (\n <>Published {updatedAt && <TimeAgo time={updatedAt} />}</>\n ) : (\n <>Not published</>\n )}\n </Text>\n </Box>\n }\n >\n <TextWithTone tone=\"positive\" dimmed={!document} muted={!document} size={1}>\n <PublishIcon />\n </TextWithTone>\n </Tooltip>\n )\n}\n","// Adapted from:\n// https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/paneItem/PaneItemPreview.tsx\nimport {Inline} from '@sanity/ui'\nimport {isNumber, isString} from 'lodash'\nimport {isValidElement, useMemo} from 'react'\nimport {useObservable} from 'react-rx'\nimport type {SanityDocument, SchemaType} from 'sanity'\nimport type {PreviewValue} from 'sanity'\nimport {\n type DocumentPresence,\n DocumentPreviewPresence,\n type DocumentPreviewStore,\n type GeneralPreviewLayoutKey,\n getPreviewStateObservable,\n getPreviewValueWithFallback,\n isRecord,\n SanityDefaultPreview,\n} from 'sanity'\n\nimport {DraftStatus} from './DraftStatus'\nimport {PublishedStatus} from './PublishedStatus'\n\nexport interface PaneItemPreviewState {\n isLoading?: boolean\n draft?: PreviewValue | Partial<SanityDocument> | null\n published?: PreviewValue | Partial<SanityDocument> | null\n}\n\nexport interface PaneItemPreviewProps {\n documentPreviewStore: DocumentPreviewStore\n icon: React.ComponentType | false\n layout: GeneralPreviewLayoutKey\n presence?: DocumentPresence[]\n schemaType: SchemaType\n value: SanityDocument\n}\n\nexport function PaneItemPreview(props: PaneItemPreviewProps) {\n const {icon, layout, presence, schemaType, value} = props\n const title =\n (isRecord(value.title) && isValidElement(value.title)) ||\n isString(value.title) ||\n isNumber(value.title)\n ? value.title\n : null\n\n const observable = useMemo(\n () => getPreviewStateObservable(props.documentPreviewStore, schemaType, value._id, title),\n [props.documentPreviewStore, schemaType, title, value._id]\n )\n const {draft, published, isLoading} = useObservable(observable, {\n draft: null,\n published: null,\n isLoading: true,\n })\n\n const status = isLoading ? null : (\n <Inline space={4}>\n {presence && presence.length > 0 && <DocumentPreviewPresence presence={presence} />}\n <PublishedStatus document={published} />\n <DraftStatus document={draft} />\n </Inline>\n )\n\n return (\n <SanityDefaultPreview\n {...(getPreviewValueWithFallback({value, draft, published}) as any)}\n isPlaceholder={isLoading}\n icon={icon}\n layout={layout}\n status={status}\n />\n )\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/paneItem/PaneItem.tsx\n\nimport {DocumentIcon} from '@sanity/icons'\nimport type {PropsWithChildren} from 'react'\nimport React, {useMemo} from 'react'\nimport type {SanityDocument} from 'sanity'\nimport type {CollatedHit, FIXME, SchemaType} from 'sanity'\nimport {PreviewCard, useDocumentPresence, useDocumentPreviewStore, useSchema} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\nimport {IntentLink} from 'sanity/router'\n\nimport {PluginPlacement} from '../../util/types'\nimport {MissingSchemaType} from './MissingSchemaType'\nimport {PaneItemPreview} from './PaneItemPreview'\n\ninterface DocumentPreviewProps {\n schemaType?: SchemaType\n documentPair: CollatedHit<SanityDocument>\n placement?: PluginPlacement\n}\n\n/**\n * Return `false` if we explicitly disable the icon.\n * Otherwise return the passed icon or the schema type icon as a backup.\n */\nexport function getIconWithFallback(\n icon: React.ComponentType<any> | false | undefined,\n schemaType: SchemaType | undefined,\n defaultIcon: React.ComponentType<any>\n): React.ComponentType<any> | false {\n if (icon === false) {\n return false\n }\n\n return icon || ((schemaType && schemaType.icon) as any) || defaultIcon || false\n}\n\n/** When inside the field input, we can open the reference on a child pane */\nfunction DocumentPreviewInInput(props: PropsWithChildren<DocumentPreviewProps>) {\n const {ChildLink} = usePaneRouter()\n\n return (linkProps: PropsWithChildren) => (\n <ChildLink\n childId={props.documentPair.id}\n // Pass the schemaType of the document so `paneChild` in `buildPagesStructure` can access it\n childParameters={{type: props.documentPair.type}}\n >\n {linkProps.children}\n </ChildLink>\n )\n}\n\n/** When inside the tool, we must use a regular intent link to take users to the desk tool */\nfunction DocumentPreviewInRool(props: DocumentPreviewProps) {\n return (linkProps: PropsWithChildren) => (\n <IntentLink intent=\"edit\" params={{id: props.documentPair.id}}>\n {linkProps.children}\n </IntentLink>\n )\n}\n\nexport function DocumentPreview(props: DocumentPreviewProps) {\n const {schemaType, documentPair} = props\n const doc = documentPair?.draft || documentPair?.published\n const id = documentPair.id || ''\n const documentPreviewStore = useDocumentPreviewStore()\n const schema = useSchema()\n const documentPresence = useDocumentPresence(id)\n const hasSchemaType = Boolean(schemaType && schemaType.name && schema.get(schemaType.name))\n\n const PreviewComponent = useMemo(() => {\n if (!doc) return null\n\n if (!schemaType || !hasSchemaType) {\n return <MissingSchemaType value={doc as SanityDocument} />\n }\n\n return (\n <PaneItemPreview\n documentPreviewStore={documentPreviewStore}\n icon={getIconWithFallback(undefined, schemaType, DocumentIcon)}\n schemaType={schemaType}\n layout=\"default\"\n value={doc}\n presence={documentPresence}\n />\n )\n }, [hasSchemaType, schemaType, documentPresence, doc, documentPreviewStore])\n\n return (\n <PreviewCard\n __unstable_focusRing\n as={\n (props.placement === 'input'\n ? DocumentPreviewInInput(props)\n : DocumentPreviewInRool(props)) as FIXME\n }\n data-as=\"a\"\n data-ui=\"PaneItem\"\n padding={2}\n radius={2}\n tone=\"inherit\"\n >\n {PreviewComponent}\n </PreviewCard>\n )\n}\n","import type {SanityDocument} from '@sanity/client'\nimport {Box, Card, Text} from '@sanity/ui'\nimport {collate, useSchema} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport type {PluginPlacement} from '../../util/types'\nimport {DocumentPreview} from '../documentPreview/DocumentPreview'\nimport SpinnerBox from '../SpinnerBox'\n\nconst Container = styled(Box)`\n * {\n color: ${(props: any) => props.theme.sanity.color.base.fg};\n }\n a {\n text-decoration: none;\n }\n h2 {\n font-size: ${(props: any) => props.theme.sanity.fonts.text.sizes[1]};\n }\n`\n\nconst VideoReferences: React.FC<{\n references?: SanityDocument[]\n isLoaded: boolean\n placement: PluginPlacement\n}> = (props) => {\n const schema = useSchema()\n if (!props.isLoaded) {\n return <SpinnerBox />\n }\n\n if (!props.references?.length) {\n return (\n <Card border radius={3} padding={3}>\n <Text size={2}>No documents are using this video</Text>\n </Card>\n )\n }\n\n const documentPairs = collate(props.references || [])\n return (\n <Container>\n {documentPairs?.map((documentPair) => {\n const schemaType = schema.get(documentPair.type)\n\n return (\n <Card\n key={documentPair.id}\n marginBottom={2}\n padding={2}\n radius={2}\n shadow={1}\n style={{overflow: 'hidden'}}\n >\n <Box>\n <DocumentPreview\n documentPair={documentPair}\n schemaType={schemaType}\n placement={props.placement}\n />\n </Box>\n </Card>\n )\n })}\n </Container>\n )\n}\n\nexport default VideoReferences\n","import {TrashIcon} from '@sanity/icons'\nimport {Box, Button, Card, Checkbox, Dialog, Flex, Heading, Stack, Text, useToast} from '@sanity/ui'\nimport {useEffect, useState} from 'react'\nimport type {SanityDocument} from 'sanity'\n\nimport {deleteAsset} from '../../actions/assets'\nimport {useClient} from '../../hooks/useClient'\nimport {DIALOGS_Z_INDEX} from '../../util/constants'\nimport type {PluginPlacement, VideoAssetDocument} from '../../util/types'\nimport SpinnerBox from '../SpinnerBox'\nimport VideoReferences from './VideoReferences'\n\nexport default function DeleteDialog({\n asset,\n references,\n referencesLoading,\n cancelDelete,\n placement,\n succeededDeleting,\n}: {\n asset: VideoAssetDocument\n placement: PluginPlacement\n references?: SanityDocument[]\n referencesLoading: boolean\n cancelDelete: () => void\n succeededDeleting: () => void\n}) {\n const client = useClient()\n const [state, setState] = useState<\n 'processing_deletion' | 'checkingReferences' | 'error_deleting' | 'cantDelete' | 'confirm'\n >('checkingReferences')\n const [deleteOnMux, setDeleteOnMux] = useState(true)\n const toast = useToast()\n\n useEffect(() => {\n if (state !== 'checkingReferences' || referencesLoading) return\n\n setState(references?.length ? 'cantDelete' : 'confirm')\n }, [state, references, referencesLoading])\n\n async function confirmDelete() {\n if (state !== 'confirm') return\n\n setState('processing_deletion')\n const worked = await deleteAsset({client, asset, deleteOnMux})\n if (worked === true) {\n toast.push({title: 'Successfully deleted video', status: 'success'})\n succeededDeleting()\n } else if (worked === 'failed-mux') {\n toast.push({\n title: 'Deleted video in Sanity',\n description: \"But it wasn't deleted in Mux\",\n status: 'warning',\n })\n succeededDeleting()\n } else {\n toast.push({title: 'Failed deleting video', status: 'error'})\n\n setState('error_deleting')\n }\n }\n\n return (\n <Dialog\n animate\n header={'Delete video'}\n zOffset={DIALOGS_Z_INDEX}\n id=\"deleting-video-details-dialog\"\n onClose={cancelDelete}\n onClickOutside={cancelDelete}\n width={1}\n position=\"fixed\"\n >\n <Card\n padding={3}\n style={{\n minHeight: '150px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Stack space={3}>\n {state === 'checkingReferences' && (\n <>\n <Heading size={2}>Checking if video can be deleted</Heading>\n <SpinnerBox />\n </>\n )}\n {state === 'cantDelete' && (\n <>\n <Heading size={2}>Video can't be deleted</Heading>\n <Text size={2} style={{marginBottom: '2rem'}}>\n There are {references?.length} document{references && references.length > 0 && 's'}{' '}\n pointing to this video. Remove their references to this file or delete them before\n proceeding.\n </Text>\n <VideoReferences\n references={references}\n isLoaded={!referencesLoading}\n placement={placement}\n />\n </>\n )}\n {state === 'confirm' && (\n <>\n <Heading size={2}>Are you sure you want to delete this video?</Heading>\n <Text size={2}>This action is irreversible</Text>\n <Stack space={4} marginY={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 <Box>\n <Button\n icon={TrashIcon}\n fontSize={2}\n padding={3}\n text=\"Delete video\"\n tone=\"critical\"\n onClick={confirmDelete}\n disabled={['processing_deletion', 'checkingReferences', 'cantDelete'].some(\n (s) => s === state\n )}\n />\n </Box>\n </Stack>\n </>\n )}\n {state === 'processing_deletion' && (\n <>\n <Heading size={2}>Deleting video...</Heading>\n <SpinnerBox />\n </>\n )}\n {state === 'error_deleting' && (\n <>\n <Heading size={2}>Something went wrong!</Heading>\n <Text size={2}>Try deleting the video again by clicking the button below</Text>\n </>\n )}\n </Stack>\n </Card>\n </Dialog>\n )\n}\n","import {createHookFromObservableFactory, DocumentStore, SanityDocument} from 'sanity'\n\nimport {SANITY_API_VERSION} from './useClient'\n\nconst useDocReferences = createHookFromObservableFactory<\n SanityDocument[],\n {\n documentStore: DocumentStore\n id: string\n }\n>(({documentStore, id}) => {\n return documentStore.listenQuery(\n /* groq */ '*[references($id)]{_id, _type, _rev, _updatedAt, _createdAt}',\n {id},\n {\n apiVersion: SANITY_API_VERSION,\n }\n )\n})\n\nexport default useDocReferences\n","/* eslint-disable */\n// From: https://stackoverflow.com/a/11486026/10433647\nexport default function formatSeconds(seconds: number): string {\n if (typeof seconds !== 'number' || Number.isNaN(seconds)) {\n return ''\n }\n // Hours, minutes and seconds\n const hrs = ~~(seconds / 3600)\n const mins = ~~((seconds % 3600) / 60)\n const secs = ~~seconds % 60\n\n // Output like \"1:01\" or \"4:03:59\" or \"123:03:59\"\n let ret = ''\n\n if (hrs > 0) {\n ret += '' + hrs + ':' + (mins < 10 ? '0' : '')\n }\n\n ret += '' + mins + ':' + (secs < 10 ? '0' : '')\n ret += '' + secs\n return ret\n}\n","import formatSeconds from './formatSeconds'\nimport {VideoAssetDocument} from './types'\n\nexport default function getVideoMetadata(doc: VideoAssetDocument) {\n const id = doc.assetId || doc._id || ''\n const date = doc.data?.created_at\n ? new Date(Number(doc.data.created_at) * 1000)\n : new Date(doc._createdAt || doc._updatedAt || Date.now())\n\n return {\n title: doc.filename || id.slice(0, 12),\n id: id,\n playbackId: doc.playbackId,\n createdAt: date,\n duration: doc.data?.duration ? formatSeconds(doc.data?.duration) : undefined,\n aspect_ratio: doc.data?.aspect_ratio,\n max_stored_resolution: doc.data?.max_stored_resolution,\n max_stored_frame_rate: doc.data?.max_stored_frame_rate,\n }\n}\n","import {useToast} from '@sanity/ui'\nimport {useState} from 'react'\nimport {useDocumentStore} from 'sanity'\n\nimport {useClient} from '../../hooks/useClient'\nimport useDocReferences from '../../hooks/useDocReferences'\nimport getVideoMetadata from '../../util/getVideoMetadata'\nimport {PluginPlacement, VideoAssetDocument} from '../../util/types'\n\nexport interface VideoDetailsProps {\n placement: PluginPlacement\n closeDialog: () => void\n asset: VideoAssetDocument & {autoPlay?: boolean}\n}\n\nexport default function useVideoDetails(props: VideoDetailsProps) {\n const documentStore = useDocumentStore()\n const toast = useToast()\n const client = useClient()\n const [references, referencesLoading] = useDocReferences({\n documentStore,\n id: props.asset._id as string,\n })\n\n const [originalAsset, setOriginalAsset] = useState(() => props.asset)\n const [filename, setFilename] = useState(props.asset.filename)\n const modified = filename !== originalAsset.filename\n\n const displayInfo = getVideoMetadata({...props.asset, filename})\n\n const [state, setState] = useState<'deleting' | 'closing' | 'idle' | 'saving'>('idle')\n\n function handleClose() {\n if (state !== 'idle') return\n\n if (modified) {\n setState('closing')\n return\n }\n\n props.closeDialog()\n }\n\n function confirmClose(shouldClose: boolean) {\n if (state !== 'closing') return\n\n if (shouldClose) props.closeDialog()\n\n setState('idle')\n }\n\n async function saveChanges() {\n if (state !== 'idle') return\n setState('saving')\n\n try {\n await client.patch(props.asset._id).set({filename}).commit()\n setOriginalAsset((prev) => ({...prev, filename}))\n toast.push({\n title: 'Video title updated',\n description: `New title: ${filename}`,\n status: 'success',\n })\n props.closeDialog()\n } catch (error) {\n toast.push({\n title: 'Failed updating file name',\n status: 'error',\n description: typeof error === 'string' ? error : 'Please try again',\n })\n setFilename(originalAsset.filename)\n }\n\n setState('idle')\n }\n\n return {\n references,\n referencesLoading,\n modified,\n filename,\n setFilename,\n displayInfo,\n state,\n setState,\n handleClose,\n confirmClose,\n saveChanges,\n }\n}\n","import {\n CalendarIcon,\n CheckmarkIcon,\n ClockIcon,\n CropIcon,\n EditIcon,\n ErrorOutlineIcon,\n RevertIcon,\n SearchIcon,\n TagIcon,\n TrashIcon,\n} from '@sanity/icons'\nimport {\n Button,\n Card,\n Dialog,\n Flex,\n Heading,\n Spinner,\n Stack,\n Tab,\n TabList,\n TabPanel,\n Text,\n TextInput,\n} from '@sanity/ui'\nimport React, {useEffect, useState} from 'react'\n\nimport {DIALOGS_Z_INDEX} from '../../util/constants'\nimport FormField from '../FormField'\nimport IconInfo from '../IconInfo'\nimport {ResolutionIcon} from '../icons/Resolution'\nimport {StopWatchIcon} from '../icons/StopWatch'\nimport VideoPlayer from '../VideoPlayer'\nimport DeleteDialog from './DeleteDialog'\nimport useVideoDetails, {VideoDetailsProps} from './useVideoDetails'\nimport VideoReferences from './VideoReferences'\n\nconst AssetInput: React.FC<{\n label: string\n description?: string\n placeholder?: string\n value: string\n onInput: (e: React.FormEvent<HTMLInputElement>) => void\n disabled?: boolean\n}> = (props) => (\n <FormField title={props.label} description={props.description} inputId={props.label}>\n <TextInput\n id={props.label}\n value={props.value}\n placeholder={props.placeholder}\n onInput={props.onInput}\n disabled={props.disabled}\n />\n </FormField>\n)\n\nconst VideoDetails: React.FC<VideoDetailsProps> = (props) => {\n const [tab, setTab] = useState<'details' | 'references'>('details')\n const {\n displayInfo,\n filename,\n modified,\n references,\n referencesLoading,\n setFilename,\n state,\n setState,\n handleClose,\n confirmClose,\n saveChanges,\n } = useVideoDetails(props)\n\n const isSaving = state === 'saving'\n\n // Avoid layout shifts in large screens' 2-column dialog by setting their `minHeight` to the container's\n const [containerHeight, setContainerHeight] = useState<number | null>(null)\n const contentsRef = React.useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!contentsRef.current || !('getBoundingClientRect' in contentsRef.current)) return\n\n setContainerHeight(contentsRef.current.getBoundingClientRect().height)\n }, [])\n\n return (\n <Dialog\n animate\n header={displayInfo.title}\n zOffset={DIALOGS_Z_INDEX}\n id=\"video-details-dialog\"\n onClose={handleClose}\n onClickOutside={handleClose}\n width={2}\n position=\"fixed\"\n footer={\n <Card padding={3}>\n <Flex justify=\"space-between\" align=\"center\">\n <Button\n icon={TrashIcon}\n fontSize={2}\n padding={3}\n mode=\"bleed\"\n text=\"Delete\"\n tone=\"critical\"\n onClick={() => setState('deleting')}\n disabled={isSaving}\n />\n {modified && (\n <Button\n icon={CheckmarkIcon}\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text=\"Save and close\"\n tone=\"positive\"\n onClick={saveChanges}\n iconRight={isSaving && Spinner}\n disabled={isSaving}\n />\n )}\n </Flex>\n </Card>\n }\n >\n {/* DELETION DIALOG */}\n {state === 'deleting' && (\n <DeleteDialog\n asset={props.asset}\n cancelDelete={() => setState('idle')}\n placement={props.placement}\n referencesLoading={referencesLoading}\n references={references}\n succeededDeleting={() => {\n props.closeDialog()\n }}\n />\n )}\n\n {/* CONFIRM CLOSING DIALOG */}\n {state === 'closing' && (\n <Dialog\n animate\n header={'You have unsaved changes'}\n zOffset={DIALOGS_Z_INDEX}\n id=\"closing-video-details-dialog\"\n onClose={() => confirmClose(false)}\n onClickOutside={() => confirmClose(false)}\n width={1}\n position=\"fixed\"\n footer={\n <Card padding={3}>\n <Flex justify=\"space-between\" align=\"center\">\n <Button\n icon={ErrorOutlineIcon}\n fontSize={2}\n padding={3}\n text=\"Discard changes\"\n tone=\"critical\"\n onClick={() => confirmClose(true)}\n />\n {modified && (\n <Button\n icon={RevertIcon}\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text=\"Keep editing\"\n tone=\"primary\"\n onClick={() => confirmClose(false)}\n />\n )}\n </Flex>\n </Card>\n }\n >\n <Card padding={5}>\n <Stack style={{textAlign: 'center'}} space={3}>\n <Heading size={2}>Unsaved changes will be lost</Heading>\n <Text size={2}>Are you sure you want to discard them?</Text>\n </Stack>\n </Card>\n </Dialog>\n )}\n <Card\n padding={4}\n sizing=\"border\"\n style={{\n containerType: 'inline-size',\n }}\n >\n <Flex\n sizing=\"border\"\n gap={4}\n direction={['column', 'column', 'row']}\n align=\"flex-start\"\n ref={contentsRef}\n style={\n typeof containerHeight === 'number'\n ? {\n minHeight: containerHeight,\n }\n : undefined\n }\n >\n <Stack space={4} flex={1} sizing=\"border\">\n <VideoPlayer asset={props.asset} autoPlay={props.asset.autoPlay || false} />\n </Stack>\n <Stack space={4} flex={1} sizing=\"border\">\n <TabList space={2}>\n <Tab\n aria-controls=\"details-panel\"\n icon={EditIcon}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTab('details')}\n selected={tab === 'details'}\n />\n <Tab\n aria-controls=\"references-panel\"\n icon={SearchIcon}\n id=\"references-tab\"\n label={`Used by ${references ? `(${references.length})` : ''}`}\n onClick={() => setTab('references')}\n selected={tab === 'references'}\n />\n </TabList>\n <TabPanel\n aria-labelledby=\"details-tab\"\n id=\"details-panel\"\n hidden={tab !== 'details'}\n style={{wordBreak: 'break-word'}}\n >\n <Stack space={4}>\n <AssetInput\n label=\"Video title or file name\"\n description=\"Not visible to users. Useful for finding videos later.\"\n value={filename || ''}\n onInput={(e) => setFilename(e.currentTarget.value)}\n disabled={state !== 'idle'}\n />\n <Stack space={3}>\n {displayInfo?.duration && (\n <IconInfo\n text={`Duration: ${displayInfo.duration}`}\n icon={ClockIcon}\n size={2}\n />\n )}\n {displayInfo?.max_stored_resolution && (\n <IconInfo\n text={`Max Resolution: ${displayInfo.max_stored_resolution}`}\n icon={ResolutionIcon}\n size={2}\n />\n )}\n {displayInfo?.max_stored_frame_rate && (\n <IconInfo\n text={`Frame rate: ${displayInfo.max_stored_frame_rate}`}\n icon={StopWatchIcon}\n size={2}\n />\n )}\n {displayInfo?.aspect_ratio && (\n <IconInfo\n text={`Aspect Ratio: ${displayInfo.aspect_ratio}`}\n icon={CropIcon}\n size={2}\n />\n )}\n <IconInfo\n text={`Uploaded on: ${displayInfo.createdAt.toLocaleDateString('en', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n })}`}\n icon={CalendarIcon}\n size={2}\n />\n <IconInfo text={`Mux ID: \\n${displayInfo.id}`} icon={TagIcon} size={2} />\n {displayInfo?.playbackId && (\n <IconInfo\n text={`Playback ID: ${displayInfo.playbackId}`}\n icon={TagIcon}\n size={2}\n />\n )}\n </Stack>\n </Stack>\n </TabPanel>\n <TabPanel\n aria-labelledby=\"references-tab\"\n id=\"references-panel\"\n hidden={tab !== 'references'}\n >\n <VideoReferences\n references={references}\n isLoaded={!referencesLoading}\n placement={props.placement}\n />\n </TabPanel>\n </Stack>\n </Flex>\n </Card>\n </Dialog>\n )\n}\n\nexport default VideoDetails\n","import {CalendarIcon, ClockIcon, TagIcon} from '@sanity/icons'\nimport {Inline, Stack, Text} from '@sanity/ui'\n\nimport getVideoMetadata from '../util/getVideoMetadata'\nimport type {VideoAssetDocument} from '../util/types'\nimport IconInfo from './IconInfo'\n\nconst VideoMetadata = (props: {asset: VideoAssetDocument}) => {\n if (!props.asset) {\n return null\n }\n\n const displayInfo = getVideoMetadata(props.asset)\n return (\n <Stack space={2}>\n {displayInfo.title && (\n <Text\n size={1}\n weight=\"semibold\"\n style={{\n wordWrap: 'break-word',\n }}\n >\n {displayInfo.title}\n </Text>\n )}\n <Inline space={3}>\n {displayInfo?.duration && (\n <IconInfo text={displayInfo.duration} icon={ClockIcon} size={1} muted />\n )}\n <IconInfo\n text={displayInfo.createdAt.toISOString().split('T')[0]}\n icon={CalendarIcon}\n size={1}\n muted\n />\n {displayInfo.title != displayInfo.id.slice(0, 12) && (\n <IconInfo text={displayInfo.id.slice(0, 12)} icon={TagIcon} size={1} muted />\n )}\n </Inline>\n </Stack>\n )\n}\n\nexport default VideoMetadata\n","import {CheckmarkIcon, EditIcon, LockIcon, PlayIcon} from '@sanity/icons'\nimport {Button, Card, Stack, Text, Tooltip} from '@sanity/ui'\nimport React, {useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {THUMBNAIL_ASPECT_RATIO} from '../util/constants'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {VideoAssetDocument} from '../util/types'\nimport IconInfo from './IconInfo'\nimport VideoMetadata from './VideoMetadata'\nimport VideoPlayer, {assetIsAudio} from './VideoPlayer'\nimport VideoThumbnail from './VideoThumbnail'\n\nconst PlayButton = styled.button`\n display: block;\n padding: 0;\n margin: 0;\n border: none;\n border-radius: 0.1875rem;\n position: relative;\n cursor: pointer;\n\n &::after {\n content: '';\n background: var(--card-fg-color);\n opacity: 0;\n display: block;\n position: absolute;\n inset: 0;\n z-index: 10;\n transition: 0.15s ease-out;\n border-radius: inherit;\n }\n\n > div[data-play] {\n z-index: 11;\n opacity: 0;\n transition: 0.15s 0.05s ease-out;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n color: var(--card-fg-color);\n background: var(--card-bg-color);\n width: auto;\n height: 30%;\n aspect-ratio: 1;\n border-radius: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n > svg {\n display: block;\n width: 70%;\n height: auto;\n // Visual balance to center-align the icon\n transform: translateX(5%);\n }\n }\n\n &:hover,\n &:focus {\n &::after {\n opacity: 0.3;\n }\n > div[data-play] {\n opacity: 1;\n }\n }\n`\n\nexport default function VideoInBrowser({\n onSelect,\n onEdit,\n asset,\n}: {\n onSelect?: (asset: VideoAssetDocument) => void\n onEdit?: (asset: VideoAssetDocument) => void\n asset: VideoAssetDocument\n}) {\n const [renderVideo, setRenderVideo] = useState(false)\n const select = React.useCallback(() => onSelect?.(asset), [onSelect, asset])\n const edit = React.useCallback(() => onEdit?.(asset), [onEdit, asset])\n\n if (!asset) {\n return null\n }\n\n const playbackPolicy = getPlaybackPolicy(asset)\n\n return (\n <Card\n border\n padding={2}\n sizing=\"border\"\n radius={2}\n style={{\n position: 'relative',\n }}\n >\n {playbackPolicy === 'signed' && (\n <Tooltip\n animate\n content={\n <Card padding={2} radius={2}>\n <IconInfo icon={LockIcon} text=\"Signed playback policy\" size={2} />\n </Card>\n }\n placement=\"right\"\n fallbackPlacements={['top', 'bottom']}\n portal\n >\n <Card\n tone=\"caution\"\n style={{\n borderRadius: '100%',\n position: 'absolute',\n left: '1em',\n top: '1em',\n zIndex: 10,\n }}\n padding={2}\n border\n >\n <Text muted size={1}>\n <LockIcon />\n </Text>\n </Card>\n </Tooltip>\n )}\n <Stack\n space={3}\n height=\"fill\"\n style={{\n gridTemplateRows: 'min-content min-content 1fr',\n }}\n >\n {renderVideo ? (\n <VideoPlayer asset={asset} autoPlay forceAspectRatio={THUMBNAIL_ASPECT_RATIO} />\n ) : (\n <PlayButton onClick={() => setRenderVideo(true)}>\n <div data-play>\n <PlayIcon />\n </div>\n {assetIsAudio(asset) ? (\n <div\n style={{\n aspectRatio: THUMBNAIL_ASPECT_RATIO,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"3em\" viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n style={{opacity: '0.65'}}\n d=\"M10.75 19q.95 0 1.6-.65t.65-1.6V13h3v-2h-4v3.875q-.275-.2-.587-.288t-.663-.087q-.95 0-1.6.65t-.65 1.6t.65 1.6t1.6.65M6 22q-.825 0-1.412-.587T4 20V4q0-.825.588-1.412T6 2h8l6 6v12q0 .825-.587 1.413T18 22zm7-13V4H6v16h12V9zM6 4v5zv16z\"\n />\n </svg>\n </div>\n ) : (\n <VideoThumbnail asset={asset} />\n )}\n </PlayButton>\n )}\n <VideoMetadata asset={asset} />\n <div\n style={{\n display: 'flex',\n width: '100%',\n alignItems: 'flex-end',\n justifyContent: 'flex-start',\n gap: '.35rem',\n }}\n >\n {onSelect && (\n <Button\n icon={CheckmarkIcon}\n fontSize={2}\n padding={2}\n mode=\"ghost\"\n text=\"Select\"\n style={{flex: 1}}\n tone=\"positive\"\n onClick={select}\n />\n )}\n <Button\n icon={EditIcon}\n fontSize={2}\n padding={2}\n mode=\"ghost\"\n text=\"Details\"\n style={{flex: 1}}\n onClick={edit}\n />\n </div>\n </Stack>\n </Card>\n )\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {Card, Flex, Grid, Label, Stack, Text, TextInput} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\n\nimport useAssets from '../hooks/useAssets'\nimport type {VideoAssetDocument} from '../util/types'\nimport ImportVideosFromMux from './ImportVideosFromMux'\nimport {SelectSortOptions} from './SelectSortOptions'\nimport SpinnerBox from './SpinnerBox'\nimport type {VideoDetailsProps} from './VideoDetails/useVideoDetails'\nimport VideoDetails from './VideoDetails/VideoDetails'\nimport VideoInBrowser from './VideoInBrowser'\n\nexport interface VideosBrowserProps {\n onSelect?: (asset: VideoAssetDocument) => void\n}\n\nexport default function VideosBrowser({onSelect}: VideosBrowserProps) {\n const {assets, isLoading, searchQuery, setSearchQuery, setSort, sort} = useAssets()\n const [editedAsset, setEditedAsset] = useState<VideoDetailsProps['asset'] | null>(null)\n const freshEditedAsset = useMemo(\n () => assets.find((a) => a._id === editedAsset?._id) || editedAsset,\n [editedAsset, assets]\n )\n\n const placement = onSelect ? 'input' : 'tool'\n return (\n <>\n <Stack padding={4} space={4} style={{minHeight: '50vh'}}>\n <Flex justify=\"space-between\" align=\"center\">\n <Flex align=\"center\" gap={3}>\n <TextInput\n value={searchQuery}\n icon={SearchIcon}\n onInput={(e: React.FormEvent<HTMLInputElement>) =>\n setSearchQuery(e.currentTarget.value)\n }\n placeholder=\"Search videos\"\n />\n <SelectSortOptions setSort={setSort} sort={sort} />\n </Flex>\n {placement === 'tool' && <ImportVideosFromMux />}\n </Flex>\n <Stack space={3}>\n {assets?.length > 0 && (\n <Label muted>\n {assets.length} video{assets.length > 1 ? 's' : null}{' '}\n {searchQuery ? `matching \"${searchQuery}\"` : 'found'}\n </Label>\n )}\n <Grid\n gap={2}\n style={{\n gridTemplateColumns: 'repeat(auto-fill, minmax(250px, 1fr))',\n }}\n >\n {assets.map((asset) => (\n <VideoInBrowser\n key={asset._id}\n asset={asset}\n onEdit={setEditedAsset}\n onSelect={onSelect}\n />\n ))}\n </Grid>\n </Stack>\n {isLoading && <SpinnerBox />}\n\n {!isLoading && assets.length === 0 && (\n <Card marginY={4} paddingX={4} paddingY={6} border radius={2} tone=\"transparent\">\n <Text align=\"center\" muted size={3}>\n {searchQuery ? `No videos found for \"${searchQuery}\"` : 'No videos in this dataset'}\n </Text>\n </Card>\n )}\n </Stack>\n {freshEditedAsset && (\n <VideoDetails\n closeDialog={() => setEditedAsset(null)}\n asset={freshEditedAsset}\n placement={placement}\n />\n )}\n </>\n )\n}\n","import type {Tool} from 'sanity'\n\nimport type {PluginConfig} from '../util/types'\nimport ToolIcon from './icons/ToolIcon'\nimport VideosBrowser from './VideosBrowser'\n\nconst StudioTool: React.FC<PluginConfig> = () => {\n return <VideosBrowser />\n}\n\nexport const DEFAULT_TOOL_CONFIG = {\n icon: ToolIcon,\n title: 'Videos',\n}\n\nexport default function createStudioTool(config: PluginConfig): Tool {\n const toolConfig = typeof config.tool === 'object' ? config.tool : DEFAULT_TOOL_CONFIG\n return {\n name: 'mux',\n icon: toolConfig.icon || DEFAULT_TOOL_CONFIG.icon,\n title: toolConfig.title || DEFAULT_TOOL_CONFIG.title,\n component: (props: any) => <StudioTool {...config} {...props} />,\n }\n}\n","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","// 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","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 {defer} from 'rxjs'\nimport type {SanityClient} from 'sanity'\n\ninterface SecretsDocument {\n _id: 'secrets.mux'\n _type: 'mux.apiKey'\n token: string\n secretKey: string\n enableSignedUrls: boolean\n signingKeyId: string\n signingKeyPrivate: string\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): Promise<SecretsDocument> {\n const doc: SecretsDocument = {\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","import {useCallback} from 'react'\nimport type {SanityClient} from 'sanity'\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 {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 {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 {\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\n animate\n id={id}\n onClose={handleClose}\n header={<Header />}\n width={1}\n style={{\n maxWidth: '550px',\n }}\n >\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 {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 r,{PureComponent as t,useReducer as e,useRef as n,useCallback as o}from\"react\";var c=function(r){var t,e;function n(t){var e;return(e=r.call(this,t)||this).state={hasError:!1,error:null},e}e=r,(t=n).prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e,n.getDerivedStateFromError=function(r){return{hasError:!0,error:r}};var o=n.prototype;return o.componentDidCatch=function(r,t){return this.props.onDidCatch(r,t)},o.render=function(){var r=this.state,t=this.props,e=t.render,n=t.children,o=t.renderError;return r.hasError?o?o({error:r.error}):null:e?e():n||null},n}(t),u=function(r,t){switch(t.type){case\"catch\":return{didCatch:!0,error:t.error};case\"reset\":return{didCatch:!1,error:null};default:return r}};function a(t){var a=e(u,{didCatch:!1,error:null}),i=a[0],d=a[1],h=n(null);function l(){return e=function(r,e){d({type:\"catch\",error:r}),t&&t.onDidCatch&&t.onDidCatch(r,e)},function(t){return r.createElement(c,{onDidCatch:e,children:t.children,render:t.render,renderError:t.renderError})};var e}var p,s=o(function(){h.current=l(),d({type:\"reset\"})},[]);return{ErrorBoundary:(p=h.current,null!==p?p:(h.current=l(),h.current)),didCatch:i.didCatch,error:i.error,reset:s}}export default a;export{a as useErrorBoundary};\n//# sourceMappingURL=index.module.js.map\n","/* eslint-disable no-console */\nimport {Button, Card, Flex, Grid, Heading, Inline, Text, useToast} from '@sanity/ui'\nimport React, {memo, useCallback, useRef} from 'react'\nimport scrollIntoView from 'scroll-into-view-if-needed'\nimport {clear} from 'suspend-react'\nimport {useErrorBoundary} from 'use-error-boundary'\n\nimport {name} from '../util/constants'\nimport {type MuxInputProps} from '../util/types'\n\nexport interface Props extends Pick<MuxInputProps, 'schemaType'> {\n children: React.ReactNode\n}\nfunction ErrorBoundaryCard(props: Props) {\n const {children, schemaType} = props\n const {push: pushToast} = useToast()\n const errorRef = useRef(null)\n const {ErrorBoundary, didCatch, error, reset} = useErrorBoundary({\n onDidCatch: (err, errorInfo) => {\n console.group(err.toString())\n console.groupCollapsed('console.error')\n console.error(err)\n console.groupEnd()\n if (err.stack) {\n console.groupCollapsed('error.stack')\n console.log(err.stack)\n console.groupEnd()\n }\n if (errorInfo?.componentStack) {\n console.groupCollapsed('errorInfo.componentStack')\n console.log(errorInfo.componentStack)\n console.groupEnd()\n }\n console.groupEnd()\n pushToast({\n status: 'error',\n title: 'Plugin crashed',\n description: (\n <Flex align=\"center\">\n <Inline space={1}>\n An error happened while rendering\n <Button\n padding={1}\n fontSize={1}\n style={{transform: 'translateY(1px)'}}\n mode=\"ghost\"\n text={schemaType.title}\n onClick={() => {\n if (errorRef.current) {\n scrollIntoView(errorRef.current, {\n behavior: 'smooth',\n scrollMode: 'if-needed',\n block: 'center',\n })\n }\n }}\n />\n </Inline>\n </Flex>\n ),\n })\n },\n })\n const handleRetry = useCallback(() => {\n // Purge request cache before retrying, otherwise the cached errors will rethrow\n clear([name])\n\n reset()\n }, [reset])\n\n if (didCatch) {\n return (\n <Card ref={errorRef} paddingX={[2, 3, 4, 4]} height=\"fill\" shadow={1} overflow=\"auto\">\n <Flex justify=\"flex-start\" align=\"center\" height=\"fill\">\n <Grid columns={1} gap={[2, 3, 4, 4]}>\n <Heading as=\"h1\">\n The <code>{name}</code> plugin crashed\n </Heading>\n {error?.message && (\n <Card padding={3} tone=\"critical\" shadow={1} radius={2}>\n <Text>{error.message}</Text>\n </Card>\n )}\n <Inline>\n <Button onClick={handleRetry} text=\"Retry\" />\n </Inline>\n </Grid>\n </Flex>\n </Card>\n )\n }\n\n return <ErrorBoundary>{children}</ErrorBoundary>\n}\n\nexport default memo(ErrorBoundaryCard)\n","import {Box, Card, Flex, Spinner, Text} from '@sanity/ui'\n\nexport const InputFallback = () => {\n return (\n <div style={{padding: 1}}>\n <Card\n shadow={1}\n sizing=\"border\"\n style={{aspectRatio: '16/9', width: '100%', borderRadius: '1px'}}\n >\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\">\n <Spinner muted />\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading…\n </Text>\n </Box>\n </Flex>\n </Card>\n </div>\n )\n}\n","import {PlugIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Grid, Heading, Inline} from '@sanity/ui'\nimport {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 {UpChunk} from '@mux/upchunk'\nimport {Observable} from 'rxjs'\n\nexport function createUpChunkObservable(uuid: string, uploadUrl: string, source: File) {\n return new Observable<\n | {type: 'pause' | 'resume'; id: string}\n | {type: 'success'; id: string}\n | {type: 'progress'; percent: number}\n >((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 {uuid as generateUuid} from '@sanity/uuid'\nimport {concat, defer, from, type Observable, of, throwError} from 'rxjs'\nimport {catchError, mergeMap, mergeMapTo, switchMap} from 'rxjs/operators'\nimport type {SanityClient} from 'sanity'\n\nimport {createUpChunkObservable} from '../clients/upChunkObservable'\nimport type {MuxAsset, MuxNewAssetSettings} 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.config().dataset}/${uuid}`,\n withCredentials: true,\n method: 'DELETE',\n })\n}\n\nexport function uploadUrl({\n url,\n settings,\n client,\n}: {\n url: string\n settings: MuxNewAssetSettings\n client: SanityClient\n}) {\n return testUrl(url).pipe(\n switchMap((validUrl) => {\n return concat(\n of({type: 'url' as const, 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 muxBody = settings\n if (!muxBody.input) muxBody.input = [{type: 'video'}]\n muxBody.input[0].url = validUrl\n\n const query = {\n muxBody: JSON.stringify(muxBody),\n filename: validUrl.split('/').slice(-1)[0],\n }\n\n const dataset = client.config().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' as const, id: uuid, asset})\n })\n )\n })\n )\n )\n })\n )\n}\n\nexport function uploadFile({\n settings,\n client,\n file,\n}: {\n settings: MuxNewAssetSettings\n client: SanityClient\n file: File\n}) {\n return testFile(file).pipe(\n switchMap((fileOptions) => {\n return concat(\n of({type: 'file' as const, 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 body = settings\n\n return concat(\n of({type: 'uuid' as const, uuid}),\n defer(() =>\n client.observable.request<{\n sanityAssetId: string\n upload: {\n cors_origin: string\n id: string\n new_asset_settings: MuxNewAssetSettings\n status: 'waiting'\n timeout: number\n url: string\n }\n }>({\n url: `/addons/mux/uploads/${client.config().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) => {\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\nexport function 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\nexport function 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 undefined\n }\n return {\n name: opts.preserveFilename === false ? undefined : file.name,\n type: file.type,\n }\n}\n","import {type InputProps, isObjectInputProps, type PreviewLayoutKey, type PreviewProps} from 'sanity'\n\nimport type {MuxInputPreviewProps, MuxInputProps} from './types'\n\nexport function isMuxInputProps(props: InputProps): props is MuxInputProps {\n return isObjectInputProps(props) && props.schemaType.type?.name === 'mux.video'\n}\n\nexport function isMuxInputPreviewProps(\n props: PreviewProps<PreviewLayoutKey>\n): props is MuxInputPreviewProps {\n return props.schemaType?.type?.name === 'mux.video'\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n const parsed = new URL(url)\n return parsed && !!parsed.protocol.match(/http:|https:/)\n } catch {\n return false\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 {useCallback} from 'react'\nimport {PatchEvent, set, setIfMissing, unset} from 'sanity'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\nimport VideosBrowser, {type VideosBrowserProps} from './VideosBrowser'\n\nexport interface Props extends Pick<MuxInputProps, 'onChange'> {\n asset?: VideoAssetDocument | null | undefined\n setDialogState: SetDialogState\n}\n\nexport default function SelectAssets({asset: selectedAsset, onChange, setDialogState}: Props) {\n const handleSelect = useCallback<Required<VideosBrowserProps>['onSelect']>(\n (chosenAsset) => {\n if (!chosenAsset?._id) {\n onChange(PatchEvent.from([unset(['asset'])]))\n }\n if (chosenAsset._id !== selectedAsset?._id) {\n onChange(\n PatchEvent.from([\n setIfMissing({asset: {}, _type: 'mux.video'}),\n set({_type: 'reference', _weak: true, _ref: chosenAsset._id}, ['asset']),\n ])\n )\n }\n setDialogState(false)\n },\n [onChange, setDialogState, selectedAsset]\n )\n\n return <VideosBrowser onSelect={handleSelect} />\n}\n","import {Dialog} from '@sanity/ui'\nimport {useCallback, useId} from 'react'\nimport {styled} from 'styled-components'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport SelectAsset, {type Props as SelectAssetProps} from './SelectAsset'\n\n/** To prevent Content Layout Shift (CLS), ensure that the dialog always occupies the entire available height. */\nconst StyledDialog = styled(Dialog)`\n > div[data-ui='DialogCard'] > div[data-ui='Card'] {\n height: 100%;\n }\n`\n\nexport default function InputBrowser({\n setDialogState,\n asset,\n onChange,\n}: Pick<SelectAssetProps, 'onChange' | 'asset'> & {\n setDialogState: SetDialogState\n}) {\n const id = `InputBrowser${useId()}`\n const handleClose = useCallback(() => setDialogState(false), [setDialogState])\n return (\n <StyledDialog\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 </StyledDialog>\n )\n}\n","import {useCallback} from 'react'\nimport {PatchEvent, unset} from 'sanity'\n\nimport {deleteAssetOnMux} 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 deleteAssetOnMux(client, asset.assetId)\n }\n if (asset._id) {\n client.delete(asset._id)\n }\n }, [asset, client, onChange])\n}\n","import {useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {useClient} from '../hooks/useClient'\nimport {getStoryboardSrc} from '../util/getStoryboardSrc'\nimport type {VideoAssetDocument} from '../util/types'\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.div`\n position: absolute;\n top: 0;\n right: 0;\n justify-content: flex-end;\n button {\n height: auto;\n }\n`\n\nexport interface PosterImageProps {\n asset: VideoAssetDocument\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","// Lifted from sanity/form/inputs/files/common/UploadProgress\n\nimport {Button, Card, Code, Flex, Inline, Stack, Text} from '@sanity/ui'\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 {Card, Text} from '@sanity/ui'\nimport React, {useEffect, useMemo, useRef} from 'react'\n\nimport {useCancelUpload} from '../hooks/useCancelUpload'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\nimport {TopControls} from './Player.styled'\nimport {UploadProgress} from './UploadProgress'\nimport VideoPlayer from './VideoPlayer'\n\ninterface Props extends Pick<MuxInputProps, 'onChange' | 'readOnly'> {\n buttons?: React.ReactNode\n asset: VideoAssetDocument\n}\n\nconst Player = ({asset, buttons, readOnly, onChange}: Props) => {\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 playRef = useRef<HTMLDivElement>(null)\n const muteRef = useRef<HTMLDivElement>(null)\n const handleCancelUpload = useCancelUpload(asset, onChange)\n\n useEffect(() => {\n const style = document.createElement('style')\n style.innerHTML = 'button svg { vertical-align: middle; }'\n\n if (playRef.current?.shadowRoot) {\n playRef.current.shadowRoot.appendChild(style)\n }\n if (muteRef?.current?.shadowRoot) {\n muteRef.current.shadowRoot.appendChild(style.cloneNode(true))\n }\n }, [])\n\n useEffect(() => {\n if (asset?.status === 'errored') {\n handleCancelUpload()\n // eslint-disable-next-line no-warning-comments\n // @TODO use better error handling\n throw new Error(asset.data?.errors?.messages?.join(' '))\n }\n }, [asset.data?.errors?.messages, asset?.status, handleCancelUpload])\n\n 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 upload'}\n onCancel={readOnly ? undefined : () => handleCancelUpload()}\n />\n )\n }\n\n return (\n <VideoPlayer asset={asset}>\n {buttons && <TopControls slot=\"top-chrome\">{buttons}</TopControls>}\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 </VideoPlayer>\n )\n}\n\nexport default Player\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} from '@sanity/ui'\nimport {css, styled} from 'styled-components'\n\nimport {focusRingStyle} from './withFocusRing/helpers'\n\nexport const FileButton = styled(MenuItem)(({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 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\">\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 {...rest} htmlFor={id} disabled={disabled} ref={forwardedRef}>\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 EllipsisHorizontalIcon,\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 useClickOutsideEvent,\n} from '@sanity/ui'\nimport {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\nfunction PlayerActionsMenu(\n props: Pick<MuxInputProps, 'onChange' | 'readOnly'> & {\n asset: VideoAssetDocument\n onSelect: (files: File[]) => void\n dialogState: DialogState\n setDialogState: SetDialogState\n }\n) {\n const {asset, readOnly, dialogState, setDialogState, onChange, onSelect} = 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 useClickOutsideEvent(\n () => setOpen(false),\n () => [menuElement]\n )\n\n return (\n <Inline space={1} padding={2}>\n {isSigned && (\n <Tooltip\n animate\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 <Popover\n animate\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 onSelect={onSelect}\n text=\"Upload\"\n disabled={readOnly}\n fontSize={1}\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={EllipsisHorizontalIcon}\n mode=\"ghost\"\n fontSize={1}\n onClick={() => {\n setDialogState(false)\n setOpen(true)\n }}\n />\n </Popover>\n </Inline>\n )\n}\n\nexport default memo(PlayerActionsMenu)\n","/* eslint-disable */\n// From: https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string\n/**\n * Format bytes as human-readable text.\n *\n * @param bytes Number of bytes.\n * @param si True to use metric (SI) units, aka powers of 1000. False to use\n * binary (IEC), aka powers of 1024.\n * @param dp Number of decimal places to display.\n *\n * @return Formatted string.\n */\nexport default function formatBytes(bytes: number, si = false, dp = 1) {\n const thresh = si ? 1000 : 1024\n\n if (Math.abs(bytes) < thresh) {\n return bytes + ' B'\n }\n\n const units = si\n ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']\n let u = -1\n const r = 10 ** dp\n\n do {\n bytes /= thresh\n ++u\n } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1)\n\n return bytes.toFixed(dp) + ' ' + units[u]\n}\n","import type {ObjectInputProps, PreviewLayoutKey, PreviewProps, SchemaType} from 'sanity'\nimport type {PartialDeep} from 'type-fest'\n\nexport interface MuxInputConfig {\n /**\n * Enable static renditions by setting this to 'standard'. Can be overwritten on a per-asset basis.\n * Requires `\"encoding_tier\": \"smart\"`\n * @see {@link https://docs.mux.com/guides/video/enable-static-mp4-renditions#why-enable-mp4-support}\n * @defaultValue 'none'\n */\n mp4_support: 'none' | 'standard'\n\n /**\n * Max resolution tier can be used to control the maximum resolution_tier your asset is encoded, stored, and streamed at.\n * Requires `\"encoding_tier\": \"smart\"`\n * @see {@link https://docs.mux.com/guides/stream-videos-in-4k}\n * @defaultValue '1080p'\n */\n max_resolution_tier: '2160p' | '1440p' | '1080p'\n\n /**\n * The encoding tier informs the cost, quality, and available platform features for the asset.\n * @see {@link https://docs.mux.com/guides/use-encoding-tiers}\n * @defaultValue 'smart'\n */\n encoding_tier: 'baseline' | 'smart'\n\n /**\n * Normalize the audio track loudness level.\n * @see {@link https://docs.mux.com/guides/adjust-audio-levels#how-to-turn-on-audio-normalization}\n * @defaultValue false\n */\n normalize_audio: boolean\n\n /**\n * Enables signed URLs by default, if you configured them with your API token.\n * @see {@link https://docs.mux.com/guides/secure-video-playback}\n * @defaultValue false\n */\n defaultSigned?: boolean\n\n /**\n * Auto-generate captions for these languages by default.\n * Requires `\"encoding_tier\": \"smart\"`\n *\n * @see {@link https://docs.mux.com/guides/add-autogenerated-captions-and-use-transcripts}\n * @deprecated use `defaultAutogeneratedSubtitleLang` instead. Only a single autogenerated\n */\n defaultAutogeneratedSubtitleLangs?: SupportedMuxLanguage[]\n\n /**\n * Auto-generate captions for this language by default. Users can still\n * Requires `\"encoding_tier\": \"smart\"`\n *\n * @see {@link https://docs.mux.com/guides/add-autogenerated-captions-and-use-transcripts}\n */\n defaultAutogeneratedSubtitleLang?: SupportedMuxLanguage\n\n /**\n * Whether or not to allow content editors to override asset upload\n * configuration settings when uploading a video to Mux.\n *\n * @see {@link https://docs.mux.com/guides/secure-video-playback}\n * @defaultValue false\n */\n disableUploadConfig?: boolean\n\n /**\n * Whether or not to allow content editors to add text tracks alongside their\n * asset when uploading a video to Mux.\n *\n * @see {@link https://docs.mux.com/guides/secure-video-playback}\n * @defaultValue false\n */\n disableTextTrackConfig?: boolean\n}\n\nexport interface PluginConfig extends MuxInputConfig {\n /**\n * How the videos browser should appear as a studio tool in Sanity's top navigation\n *\n * Pass `false` if you want to disable it.\n * @defaultValue {title: 'Videos', icon: VideoIcon}\n **/\n tool:\n | false\n | {\n title?: string\n icon?: React.ComponentType\n }\n}\n\nexport const SUPPORTED_MUX_LANGUAGES = [\n {label: 'English', code: 'en', state: 'Stable'},\n {label: 'Spanish', code: 'es', state: 'Stable'},\n {label: 'Italian', code: 'it', state: 'Stable'},\n {label: 'Portuguese', code: 'pt', state: 'Stable'},\n {label: 'German', code: 'de', state: 'Stable'},\n {label: 'French', code: 'fr', state: 'Stable'},\n {label: 'Polish', code: 'pl', state: 'Beta'},\n {label: 'Russian', code: 'ru', state: 'Beta'},\n {label: 'Dutch', code: 'nl', state: 'Beta'},\n {label: 'Catalan', code: 'ca', state: 'Beta'},\n {label: 'Turkish', code: 'tr', state: 'Beta'},\n {label: 'Swedish', code: 'sv', state: 'Beta'},\n {label: 'Ukrainian', code: 'uk', state: 'Beta'},\n {label: 'Norwegian', code: 'no', state: 'Beta'},\n {label: 'Finnish', code: 'fi', state: 'Beta'},\n {label: 'Slovak', code: 'sk', state: 'Beta'},\n {label: 'Greek', code: 'el', state: 'Beta'},\n {label: 'Czech', code: 'cs', state: 'Beta'},\n {label: 'Croatian', code: 'hr', state: 'Beta'},\n {label: 'Danish', code: 'da', state: 'Beta'},\n {label: 'Romanian', code: 'ro', state: 'Beta'},\n {label: 'Bulgarian', code: 'bg', state: 'Beta'},\n] as const\n\nexport const ENCODING_TIERS = [\n {label: 'Baseline', value: 'baseline'},\n {label: 'Smart', value: 'smart'},\n] as const\n\nexport const SUPPORTED_MUX_LANGUAGES_VALUES = SUPPORTED_MUX_LANGUAGES.map((l) => l.code)\n\nexport type SupportedMuxLanguage = (typeof SUPPORTED_MUX_LANGUAGES_VALUES)[number]\n\nexport interface TextTrack {\n _id: string\n name: string\n}\n\nexport interface AutogeneratedTextTrack extends TextTrack {\n type: 'autogenerated'\n language_code: SupportedMuxLanguage\n}\n\nexport interface CustomTextTrack extends TextTrack {\n type: 'subtitles' | 'captions'\n language_code: string\n file: {\n contents: string\n type: string\n name: string\n size: number\n }\n}\n\nexport function isCustomTextTrack(track: Partial<UploadTextTrack>): track is CustomTextTrack {\n return track.type !== 'autogenerated'\n}\n\nexport function isAutogeneratedTrack(\n track: Partial<UploadTextTrack>\n): track is AutogeneratedTextTrack {\n return track.type === 'autogenerated'\n}\n\nexport type UploadTextTrack = AutogeneratedTextTrack | CustomTextTrack\n\nexport interface UploadConfig\n extends Pick<\n MuxInputConfig,\n 'encoding_tier' | 'max_resolution_tier' | 'mp4_support' | 'normalize_audio'\n > {\n text_tracks: UploadTextTrack[]\n signed: boolean\n}\n\n/**\n * Data sent to Mux to create a new asset.\n * @docs {@link https://docs.mux.com/api-reference#video/operation/create-direct-upload}\n */\nexport interface MuxNewAssetSettings\n extends Pick<\n MuxInputConfig,\n 'encoding_tier' | 'max_resolution_tier' | 'mp4_support' | 'normalize_audio'\n > {\n /** An array of objects that each describe an input file to be used to create the asset.*/\n input?: {\n /** The URL of the file that Mux should download and use. */\n url?: string\n /** Generate subtitle tracks using automatic speech recognition with this configuration. This may only be provided for the first input object (the main input file). */\n generated_subtitles?: {\n /** A name for this subtitle track. */\n name: string\n /** Arbitrary metadata set for the subtitle track. Max 255 characters. */\n passthrough?: string\n /** The language to generate subtitles in. */\n language_code: SupportedMuxLanguage\n }[]\n /** The time offset in seconds from the beginning of the video indicating the clip's starting marker. */\n start_time?: number\n /** The time offset in seconds from the beginning of the video indicating the clip's ending marker. */\n end_time?: number\n /** This parameter is required for text type tracks. */\n type: 'video' | 'audio' | 'text'\n /** Type of text track. This parameter only supports subtitles value. */\n text_type?: 'subtitles'\n /** The language code value must be a valid BCP 47 specification compliant value. */\n language_code?: string\n /** The name of the track containing a human-readable description. This value must be unique within each group of text or audio track types. */\n name?: string\n /** Indicates the track provides Subtitles for the Deaf or Hard-of-hearing (SDH). */\n closed_captions?: boolean\n /// @TODO Huhh?>?? Below\n /** This optional parameter should be used tracks with type of text and text_type set to subtitles. */\n passthrough?: string\n }[]\n\n /** An array of playback policy names that you want applied to this asset and available through playback_ids. */\n playback_policy: ('public' | 'signed')[]\n\n /** Arbitrary user-supplied metadata that will be included in the asset details and related webhooks. */\n passthrough?: string\n}\n\nexport interface Secrets {\n token: string | null\n secretKey: string | null\n enableSignedUrls: boolean\n signingKeyId: string | null\n signingKeyPrivate: string | null\n}\n\n// This narrowed type indicates that there may be assets that are signed, and we have the secrets to access them\n// enabledSignedUrls might be false but that's only relevant for future uploads and their playback policy\nexport interface SignableSecrets extends Omit<Secrets, 'signingKeyId' | 'signingKeyPrivate'> {\n signingKeyId: string\n signingKeyPrivate: string\n}\n\nexport type MuxImageOrigin = `https://image.mux.com`\nexport type MuxThumbnailUrl = `${MuxImageOrigin}/${string}/thumbnail.png?${string}`\nexport type MuxAnimatedThumbnailUrl = `${MuxImageOrigin}/${string}/animated.gif?${string}`\nexport type MuxStoryboardUrl = `${MuxImageOrigin}/${string}/storyboard.vtt?${string}`\nexport type MuxVideoOrigin = `https://stream.mux.com`\nexport type MuxVideoUrl = `${MuxVideoOrigin}/${string}.m3u8?${string}`\nexport type MuxApiUrl = MuxThumbnailUrl | MuxAnimatedThumbnailUrl | MuxStoryboardUrl | MuxVideoUrl\n\n// 'preserve' by default\n// @url: https://docs.mux.com/guides/video/get-images-from-a-video#thumbnail-query-string-parameters\nexport type FitMode = 'preserve' | 'crop' | 'smartcrop' | 'pad'\n\nexport interface ThumbnailOptions {\n fit_mode?: FitMode\n height?: number\n time?: number\n width?: number\n}\n\nexport interface AnimatedThumbnailOptions {\n // Starting time code for the animation, if no end is set it'll have a 5s duration\n // The start and end timecodes uses `asset.thumbTime` to create an iOS `Live Photo` effect by showing you the 5 secodnds before, and after, the thumb time`\n start?: number\n // End code, can't be longer than 10s after the start code\n end?: number\n // Max 640px, 320px by default\n width?: number\n // Preserves aspect ratio, like width, you can't set both the height and width, max 640\n height?: number\n // The fps is 15 by default, but can go up to 30\n fps?: number\n}\n\nexport type PlaybackPolicy = 'signed' | 'public'\n\nexport interface MuxErrors {\n type: string\n messages: string[]\n}\n\nexport interface MuxPlaybackId {\n id: string\n policy: PlaybackPolicy\n}\n\nexport interface MuxVideoTrack {\n type: 'video'\n id: string\n max_width: number\n max_height: number\n // if the fps can't be reliably determined, this will be -1\n max_frame_rate: -1 | number\n // top-level duration is always set, while track level duration is not\n duration?: number\n}\nexport interface MuxAudioTrack {\n type: 'audio'\n id: string\n duration?: number\n max_channels: number\n max_channel_layout: 'stereo' | string\n}\nexport interface MuxTextTrack {\n type: 'text'\n id: string\n text_type?: 'subtitles'\n // https://docs.mux.com/api-reference/video#operation/list-assets:~:text=text%20type%20tracks.-,tracks%5B%5D.,text_source,-string\n text_source?: 'uploaded' | 'embedded' | 'generated_live' | 'generated_live_final'\n // BCP 47 language code\n language_code?: 'en' | 'en-US' | string\n // The name of the track containing a human-readable description. The hls manifest will associate a subtitle text track with this value\n name?: 'English' | string\n closed_captions?: boolean\n // Max 255 characters\n passthrough?: string\n status: 'preparing' | 'ready' | 'errored'\n}\nexport type MuxTrack = MuxVideoTrack | MuxAudioTrack\n// Typings lifted from https://docs.mux.com/api-reference/video#tag/assets\nexport interface MuxAsset {\n id: string\n /** In seconds (instead of JS's default milliseconds) */\n created_at: string\n status: 'preparing' | 'ready' | 'errored'\n duration: number\n max_stored_resolution: 'Audio only' | 'SD' | 'HD' | 'FHD' | 'UHD'\n // if the fps can't be reliably determined, this will be -1\n max_stored_frame_rate: -1 | number\n // The aspect ratio of the asset in the form of width:height, for example 16:9\n aspect_ratio: `${number}:${number}`\n playback_ids: MuxPlaybackId[]\n tracks: MuxTrack[]\n errors?: MuxErrors\n upload_id: string\n is_live?: boolean\n // We use passthrough to set the mux.videoAsset._id of the asset that originally uploaded the video\n passthrough: string\n live_stream_id?: string\n master?: {\n status: 'ready' | 'preparing' | 'errored'\n // Temporary URL to master MP4, expires after 24 hours\n url: string\n }\n master_access: 'temporary' | 'none'\n mp4_support: 'standard' | 'none'\n // Asset Identifier of the video used as the source for creating the clip.\n source_asset_id?: string\n // Normalize the audio track loudness level. This parameter is only applicable to on-demand (not live) assets., default false\n normalize_audio?: boolean\n // The object does not exist if no static renditions have been requested\n static_renditions?: {\n status: 'ready' | 'preparing' | 'disabled' | 'errored'\n files: {\n name: 'low.mp4' | 'medium.mp4' | 'high.mp4' | 'audio.m4a'\n ext: 'mp4' | 'm4a'\n height: number\n width: number\n bitrate: number\n filesize: number\n }[]\n }\n recording_times?: {\n started_at: string\n duration: number\n type: 'content' | 'slate'\n }[]\n // https://docs.mux.com/guides/video/minimize-processing-time\n non_standard_input_reasons?: {\n video_codec?: string\n audio_codec?: string\n video_gop_size?: 'high'\n video_frame_rate?: string\n video_resolution?: string\n video_bitrate?: 'high'\n pixel_aspect_ratio?: string\n video_edit_list?: 'non-standard'\n audio_edit_list?: 'non-standard'\n unexpected_media_file_parameters?: 'non-standard'\n test?: boolean\n }\n}\n\nexport interface VideoAssetDocument {\n _id: string\n _type: 'mux.videoAsset'\n _createdAt: string\n _updatedAt?: string\n status?: string\n assetId?: string\n playbackId?: string\n filename?: string\n thumbTime?: number\n // Docs for what goes in `data` https://docs.mux.com/api-reference/video#tag/assets\n data?: PartialDeep<MuxAsset>\n}\n\nexport type Reference = {_type: 'reference'; _ref: string}\n\n// @TODO add Reference, and ReferenceSchemaType in the generic\nexport type MuxInputProps = ObjectInputProps<{\n asset?: Reference\n}>\n\nexport interface MuxInputPreviewProps extends Omit<PreviewProps<PreviewLayoutKey>, 'value'> {\n schemaType: SchemaType\n value?: {\n asset?: Reference\n } | null\n}\n\n/** Whether the VideosBrowser was opened from a field in a document, or from the standalone studio tool */\nexport type PluginPlacement = 'input' | 'tool'\n","import {TranslateIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {Dispatch} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type PluginConfig, SUPPORTED_MUX_LANGUAGES, UploadTextTrack} from '../util/types'\n\nconst ALL_LANGUAGE_CODES = LanguagesList.getAllCodes().map((code) => ({\n value: code,\n label: LanguagesList.getNativeName(code),\n}))\n\nconst SUBTITLE_LANGUAGES: Record<\n Extract<UploadTextTrack, {language_code: any}>['type'],\n {value: string; label: string}[]\n> = {\n autogenerated: SUPPORTED_MUX_LANGUAGES.map((lang) => ({\n value: lang.code,\n label: lang.label,\n })),\n subtitles: ALL_LANGUAGE_CODES,\n captions: ALL_LANGUAGE_CODES,\n}\n\ntype TrackSubAction =\n | {subAction: 'add'; value: Partial<UploadTextTrack>}\n | {subAction: 'update'; value: Partial<UploadTextTrack>}\n | {subAction: 'delete'}\n\nexport type TrackAction = {action: 'track'; id: string} & TrackSubAction\n\nexport default function TextTracksEditor({\n tracks,\n dispatch,\n defaultLang,\n}: {\n /**\n * Although the schema for tracks is an array, which we'll eventually support to allow uploading\n * multiple custom subtitles, for now we only support a single auto-generated track.\n */\n tracks: (Partial<UploadTextTrack> & {_id: string})[]\n dispatch: Dispatch<TrackAction>\n defaultLang: PluginConfig['defaultAutogeneratedSubtitleLang']\n}) {\n const track = tracks[0]\n return (\n <FormField title=\"Auto-generated subtitle or caption\">\n <Stack space={2}>\n <Flex align=\"center\">\n <Checkbox\n id=\"include-autogenerated-track\"\n style={{display: 'block'}}\n checked={!!track?.language_code}\n onChange={() => {\n if (track) {\n dispatch({action: 'track', id: track._id, subAction: 'delete'})\n } else {\n dispatch({\n action: 'track',\n id: uuid(),\n subAction: 'add',\n value: {\n type: 'autogenerated',\n name: defaultLang || undefined,\n language_code: defaultLang || undefined,\n },\n })\n }\n }}\n />\n <Box flex={1} paddingLeft={3}>\n <Text>\n <label htmlFor=\"checkbox\">Generate captions</label>\n </Text>\n </Box>\n </Flex>\n {track && (\n <Autocomplete\n id={`text-tract-editor--language`}\n value={track.language_code}\n onChange={(newValue) =>\n dispatch({\n action: 'track',\n id: track._id,\n subAction: 'update',\n value: {\n language_code: newValue,\n name: LanguagesList.getNativeName(newValue),\n },\n })\n }\n options={SUBTITLE_LANGUAGES[track.type!]}\n icon={TranslateIcon}\n placeholder=\"Select language\"\n filterOption={(query, option) =>\n option.label.toLowerCase().indexOf(query.toLowerCase()) > -1 ||\n option.value.toLowerCase().indexOf(query.toLowerCase()) > -1\n }\n openButton\n renderValue={(value) =>\n SUBTITLE_LANGUAGES[track.type!].find((l) => l.value === value)?.label || value\n }\n renderOption={(option) => (\n <Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n <Text size={2} textOverflow=\"ellipsis\">\n {option.label} ({option.value})\n </Text>\n </Card>\n )}\n />\n )}\n </Stack>\n </FormField>\n )\n}\n","import {DocumentVideoIcon, UploadIcon} from '@sanity/icons'\nimport {Box, Button, Card, Checkbox, Dialog, Flex, Label, Radio, Stack, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {useEffect, useId, useReducer, useRef} from 'react'\nimport {FormField} from 'sanity'\n\nimport formatBytes from '../util/formatBytes'\nimport {\n type AutogeneratedTextTrack,\n type CustomTextTrack,\n isAutogeneratedTrack,\n isCustomTextTrack,\n type MuxNewAssetSettings,\n type PluginConfig,\n type Secrets,\n type SupportedMuxLanguage,\n type UploadConfig,\n type UploadTextTrack,\n} from '../util/types'\nimport TextTracksEditor, {type TrackAction} from './TextTracksEditor'\nimport type {StagedUpload} from './Uploader'\n\nexport type UploadConfigurationStateAction =\n | {action: 'encoding_tier'; value: UploadConfig['encoding_tier']}\n | {action: 'max_resolution_tier'; value: UploadConfig['max_resolution_tier']}\n | {action: 'mp4_support'; value: UploadConfig['mp4_support']}\n | {action: 'normalize_audio'; value: UploadConfig['normalize_audio']}\n | {action: 'signed'; value: UploadConfig['signed']}\n | TrackAction\n\nconst ENCODING_OPTIONS = [\n {value: 'smart', label: 'Smart'},\n {value: 'baseline', label: 'Baseline'},\n] as const satisfies {value: UploadConfig['encoding_tier']; label: string}[]\n\nconst RESOLUTION_TIERS = [\n {value: '1080p', label: '1080p'},\n {value: '1440p', label: '1440p (2k)'},\n {value: '2160p', label: '2160p (4k)'},\n] as const satisfies {value: UploadConfig['max_resolution_tier']; label: string}[]\n\n/**\n * The modal for configuring a staged upload. Handles triggering of the asset\n * upload, even if no modal needs to be shown.\n *\n * @returns\n */\nexport default function UploadConfiguration({\n stagedUpload,\n secrets,\n pluginConfig,\n startUpload,\n onClose,\n}: {\n stagedUpload: StagedUpload\n secrets: Secrets\n pluginConfig: PluginConfig\n startUpload: (settings: MuxNewAssetSettings) => void\n onClose: () => void\n}) {\n const id = useId()\n const autoTextTracks = useRef<NonNullable<UploadConfig['text_tracks']>>(\n pluginConfig.encoding_tier === 'smart' && pluginConfig.defaultAutogeneratedSubtitleLang\n ? [\n {\n _id: uuid(),\n type: 'autogenerated',\n language_code: pluginConfig.defaultAutogeneratedSubtitleLang,\n name: LanguagesList.getNativeName(pluginConfig.defaultAutogeneratedSubtitleLang),\n } satisfies AutogeneratedTextTrack,\n ]\n : []\n ).current\n\n const [config, dispatch] = useReducer(\n (prev: UploadConfig, action: UploadConfigurationStateAction) => {\n switch (action.action) {\n case 'encoding_tier':\n // If encoding tier switches to baseline, remove smart-only features\n if (action.value === 'baseline') {\n return Object.assign({}, prev, {\n encoding_tier: action.value,\n mp4_support: 'none',\n max_resolution_tier: '1080p',\n text_tracks: prev.text_tracks?.filter(({type}) => type !== 'autogenerated'),\n })\n // If encoding tier switches to smart, add back in default smart features\n }\n return Object.assign({}, prev, {\n encoding_tier: action.value,\n mp4_support: pluginConfig.mp4_support,\n max_resolution_tier: pluginConfig.max_resolution_tier,\n text_tracks: [...autoTextTracks, ...(prev.text_tracks || [])],\n })\n\n case 'mp4_support':\n case 'max_resolution_tier':\n case 'normalize_audio':\n case 'signed':\n return Object.assign({}, prev, {[action.action]: action.value})\n // Updating individual tracks\n case 'track': {\n const text_tracks = [...prev.text_tracks]\n const target_track_i = text_tracks.findIndex(({_id}) => _id === action.id)\n // eslint-disable-next-line default-case\n switch (action.subAction) {\n case 'add':\n // Exit early if track already exists\n if (target_track_i !== -1) break\n text_tracks.push({\n _id: action.id,\n ...action.value,\n } as AutogeneratedTextTrack)\n break\n case 'update':\n if (target_track_i === -1) break\n text_tracks[target_track_i] = {\n ...text_tracks[target_track_i],\n ...action.value,\n } as UploadTextTrack\n break\n case 'delete':\n if (target_track_i === -1) break\n text_tracks.splice(target_track_i, 1)\n break\n }\n return Object.assign({}, prev, {text_tracks})\n }\n default:\n return prev\n }\n },\n {\n encoding_tier: pluginConfig.encoding_tier,\n max_resolution_tier: pluginConfig.max_resolution_tier,\n mp4_support: pluginConfig.mp4_support,\n signed: secrets.enableSignedUrls && pluginConfig.defaultSigned,\n normalize_audio: pluginConfig.normalize_audio,\n text_tracks: autoTextTracks,\n } as UploadConfig\n )\n\n // If user-provided config is disabled, begin the upload immediately with\n // the developer-specified values from the schema or config or defaults.\n // This can include auto-generated subtitles!\n const {disableTextTrackConfig, disableUploadConfig} = pluginConfig\n const skipConfig = disableTextTrackConfig && disableUploadConfig\n useEffect(() => {\n if (skipConfig) startUpload(formatUploadConfig(config))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (skipConfig) return null\n\n const maxSupportedResolution = RESOLUTION_TIERS.findIndex(\n (rt) => rt.value === pluginConfig.max_resolution_tier\n )\n return (\n <Dialog\n animate\n open\n id=\"upload-configuration\"\n zOffset={1000}\n width={1}\n header=\"Configure Mux Upload\"\n onClose={onClose}\n >\n <Stack padding={4} space={2}>\n <Label size={3}>FILE TO UPLOAD</Label>\n <Card\n tone=\"transparent\"\n border\n padding={3}\n paddingY={4}\n style={{borderRadius: '0.1865rem'}}\n >\n <Flex gap={2}>\n <DocumentVideoIcon fontSize=\"2em\" />\n <Stack space={2}>\n <Text textOverflow=\"ellipsis\" as=\"h2\" size={3}>\n {stagedUpload.type === 'file' ? stagedUpload.files[0].name : stagedUpload.url}\n </Text>\n <Text as=\"p\" size={1} muted>\n {stagedUpload.type === 'file'\n ? `Direct File Upload (${formatBytes(stagedUpload.files[0].size)})`\n : 'File From URL (Unknown size)'}\n </Text>\n </Stack>\n </Flex>\n </Card>\n {!disableUploadConfig && (\n <Stack space={3} paddingBottom={2}>\n <FormField\n title=\"Encoding Tier\"\n description={\n <>\n The encoding tier informs the cost, quality, and available platform features for\n the asset.{' '}\n <a\n href=\"https://docs.mux.com/guides/use-encoding-tiers\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n See the Mux guide for more details.\n </a>\n </>\n }\n >\n <Flex gap={3}>\n {ENCODING_OPTIONS.map(({value, label}) => {\n const inputId = `${id}--encodingtier-${value}`\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Radio\n checked={config.encoding_tier === value}\n name=\"asset-encodingtier\"\n onChange={(e) =>\n dispatch({\n action: 'encoding_tier' as const,\n value: e.currentTarget.value as UploadConfig['encoding_tier'],\n })\n }\n value={value}\n id={inputId}\n />\n <Text as=\"label\" htmlFor={inputId}>\n {label}\n </Text>\n </Flex>\n )\n })}\n </Flex>\n </FormField>\n\n {config.encoding_tier === 'smart' && maxSupportedResolution > 0 && (\n <FormField\n title=\"Resolution Tier\"\n description={\n <>\n The maximum{' '}\n <a\n href=\"https://docs.mux.com/api-reference#video/operation/create-direct-upload\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n resolution_tier\n </a>{' '}\n your asset is encoded, stored, and streamed at.\n </>\n }\n >\n <Flex gap={3} wrap={'wrap'}>\n {RESOLUTION_TIERS.map(({value, label}, index) => {\n const inputId = `${id}--type-${value}`\n\n if (index > maxSupportedResolution) return null\n\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Radio\n checked={config.max_resolution_tier === value}\n name=\"asset-resolutiontier\"\n onChange={(e) =>\n dispatch({\n action: 'max_resolution_tier',\n value: e.currentTarget.value as UploadConfig['max_resolution_tier'],\n })\n }\n value={value}\n id={inputId}\n />\n <Text as=\"label\" htmlFor={inputId}>\n {label}\n </Text>\n </Flex>\n )\n })}\n </Flex>\n </FormField>\n )}\n\n {(secrets.enableSignedUrls || config.encoding_tier === 'smart') && (\n <FormField title=\"Additional Configuration\">\n <Stack space={2}>\n {secrets.enableSignedUrls && (\n <Flex align=\"center\" gap={2}>\n <Checkbox\n id={`${id}--signed`}\n style={{display: 'block'}}\n name=\"signed\"\n required\n checked={config.signed}\n onChange={(e) =>\n dispatch({\n action: 'signed',\n value: e.currentTarget.checked,\n })\n }\n />\n <Text>\n <label htmlFor={`${id}--signed`}>Signed playback URL</label>\n </Text>\n </Flex>\n )}\n {config.encoding_tier === 'smart' && (\n <Flex align=\"center\" gap={2}>\n <Checkbox\n id={`${id}--mp4_support`}\n style={{display: 'block'}}\n name=\"mp4_support\"\n required\n checked={config.mp4_support === 'standard'}\n onChange={(e) =>\n dispatch({\n action: 'mp4_support',\n value: e.currentTarget.checked ? 'standard' : 'none',\n })\n }\n />\n <Text>\n <label htmlFor={`${id}--mp4_support`}>\n MP4 support (allow downloading)\n </label>\n </Text>\n </Flex>\n )}\n </Stack>\n </FormField>\n )}\n </Stack>\n )}\n\n {!disableTextTrackConfig && config.encoding_tier === 'smart' && (\n <TextTracksEditor\n tracks={config.text_tracks}\n dispatch={dispatch}\n defaultLang={pluginConfig.defaultAutogeneratedSubtitleLang}\n />\n )}\n\n <Box marginTop={4}>\n <Button\n icon={UploadIcon}\n text=\"Upload\"\n tone=\"positive\"\n onClick={() => startUpload(formatUploadConfig(config))}\n />\n </Box>\n </Stack>\n </Dialog>\n )\n}\n\nfunction formatUploadConfig(config: UploadConfig): MuxNewAssetSettings {\n const generated_subtitles = config.text_tracks\n .filter<AutogeneratedTextTrack>(isAutogeneratedTrack)\n .map<{name: string; language_code: SupportedMuxLanguage}>((track) => ({\n name: track.name,\n language_code: track.language_code,\n }))\n\n return {\n input: [\n {\n type: 'video',\n generated_subtitles: generated_subtitles.length > 0 ? generated_subtitles : undefined,\n },\n ...config.text_tracks.filter<CustomTextTrack>(isCustomTextTrack).reduce(\n (acc, track) => {\n if (track.language_code && track.file && track.name) {\n acc.push({\n url: track.file.contents,\n type: 'text',\n text_type: track.type === 'subtitles' ? 'subtitles' : undefined,\n language_code: track.language_code,\n name: track.name,\n closed_captions: track.type === 'captions',\n })\n }\n return acc\n },\n [] as NonNullable<MuxNewAssetSettings['input']>\n ),\n ],\n mp4_support: config.mp4_support,\n playback_policy: config.signed ? ['public', 'signed'] : ['public'],\n max_resolution_tier: config.max_resolution_tier,\n encoding_tier: config.encoding_tier,\n normalize_audio: config.normalize_audio,\n }\n}\n","import {rem} from '@sanity/ui'\nimport type {ComponentType} from 'react'\nimport {css, styled} 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}>((props) => {\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","/* eslint-disable no-nested-ternary */\nimport {Card, type CardTone} 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 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 {Button, type ButtonProps} 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 accept?: string\n}\nexport const FileInputButton = ({onSelect, accept, ...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={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 {Button, Card, Flex, Inline, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {FileInputButton, type FileInputButtonProps} from './FileInputButton'\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 <Card\n sizing=\"border\"\n tone={readOnly ? 'transparent' : 'inherit'}\n border\n radius={2}\n paddingX={3}\n paddingY={1}\n style={hovering ? {borderColor: 'transparent'} : undefined}\n >\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap={4}\n direction={['column', 'column', 'row']}\n paddingY={2}\n sizing=\"border\"\n >\n <Flex align=\"center\" justify=\"flex-start\" 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=\"bleed\"\n tone=\"default\"\n icon={UploadIcon}\n text=\"Upload\"\n onSelect={onSelect}\n />\n <Button mode=\"bleed\" icon={SearchIcon} text=\"Select\" onClick={handleBrowse} />\n\n <Button\n padding={3}\n radius={3}\n tone={needsSetup ? 'critical' : undefined}\n onClick={handleConfigureApi}\n icon={PlugIcon}\n mode=\"bleed\"\n title=\"Configure plugin credentials\"\n />\n </Inline>\n </Flex>\n </Card>\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Button, CardTone, Flex, Text, useToast} from '@sanity/ui'\nimport React, {useEffect, useReducer, useRef, useState} from 'react'\nimport {type Observable, Subject, Subscription} from 'rxjs'\nimport {takeUntil, tap} from 'rxjs/operators'\nimport type {SanityClient} from 'sanity'\nimport {PatchEvent, set, setIfMissing} from 'sanity'\n\nimport {uploadFile, uploadUrl} from '../actions/upload'\nimport {type DialogState, type SetDialogState} from '../hooks/useDialogState'\nimport {isValidUrl} from '../util/asserters'\nimport {extractDroppedFiles} from '../util/extractFiles'\nimport type {\n MuxInputProps,\n MuxNewAssetSettings,\n PluginConfig,\n Secrets,\n VideoAssetDocument,\n} from '../util/types'\nimport InputBrowser from './InputBrowser'\nimport Player from './Player'\nimport PlayerActionsMenu from './PlayerActionsMenu'\nimport UploadConfiguration from './UploadConfiguration'\nimport {UploadCard} from './Uploader.styled'\nimport UploadPlaceholder from './UploadPlaceholder'\nimport {UploadProgress} from './UploadProgress'\n\ninterface Props extends Pick<MuxInputProps, 'onChange' | 'readOnly'> {\n config: PluginConfig\n client: SanityClient\n secrets: Secrets\n asset: VideoAssetDocument | null | undefined\n dialogState: DialogState\n setDialogState: SetDialogState\n needsSetup: boolean\n}\n\nexport type StagedUpload = {type: 'file'; files: FileList | File[]} | {type: 'url'; url: string}\ntype UploadStatus = {\n progress: number\n file?: {name: string | undefined; type: string}\n uuid?: string\n url?: string\n}\n\ninterface State {\n stagedUpload: StagedUpload | null\n uploadStatus: UploadStatus | null\n error: Error | null\n}\n\nconst INITIAL_STATE: State = {\n stagedUpload: null,\n uploadStatus: null,\n error: null,\n}\n\ntype UploadFileEvent = ReturnType<typeof uploadFile> extends Observable<infer T> ? T : never\ntype UploadUrlEvent = ReturnType<typeof uploadUrl> extends Observable<infer T> ? T : never\ntype UploaderStateAction =\n | {action: 'stageUpload'; input: NonNullable<State['stagedUpload']>}\n | {action: 'commitUpload'}\n | ({action: 'progressInfo'} & (\n | Extract<UploadFileEvent, {type: 'uuid' | 'file'}>\n | Extract<UploadUrlEvent, {type: 'url'}>\n ))\n | {action: 'progress'; percent: number}\n | {action: 'error'; error: any}\n | {action: 'complete' | 'reset'}\n\n/**\n * The main interface for inputting a Mux Video. It handles staging an upload\n * file, setting its configuration, displaying upload progress, and showing\n * the preview player.\n */\nexport default function Uploader(props: Props) {\n const toast = useToast()\n const containerRef = useRef<HTMLDivElement>(null)\n\n const dragEnteredEls = useRef<EventTarget[]>([])\n const [dragState, setDragState] = useState<'valid' | 'invalid' | null>(null)\n\n const cancelUploadButton = useRef(\n (() => {\n const events$ = new Subject()\n return {\n observable: events$.asObservable(),\n handleClick: ((event) => events$.next(event)) as React.MouseEventHandler<HTMLButtonElement>,\n }\n })()\n ).current\n\n const uploadRef = useRef<Subscription | null>(null)\n const [state, dispatch] = useReducer(\n (prev: State, action: UploaderStateAction) => {\n switch (action.action) {\n case 'stageUpload':\n return Object.assign({}, INITIAL_STATE, {stagedUpload: action.input})\n case 'commitUpload':\n return Object.assign({}, prev, {uploadStatus: {progress: 0}})\n case 'progressInfo': {\n const {type, action: _, ...payload} = action\n return Object.assign({}, prev, {\n uploadStatus: {\n ...prev.uploadStatus,\n progress: prev.uploadStatus!.progress,\n ...payload,\n },\n } satisfies Pick<typeof prev, 'uploadStatus'>)\n }\n case 'progress':\n return Object.assign({}, prev, {\n uploadStatus: {\n ...prev.uploadStatus,\n progress: action.percent,\n },\n } satisfies Pick<typeof prev, 'uploadStatus'>)\n case 'reset':\n case 'complete':\n // Clear upload observable on completion\n uploadRef.current?.unsubscribe()\n uploadRef.current = null\n return INITIAL_STATE\n case 'error':\n // Clear upload observable on error\n uploadRef.current?.unsubscribe()\n uploadRef.current = null\n return Object.assign({}, INITIAL_STATE, {error: action.error})\n default:\n return prev\n }\n },\n {\n stagedUpload: null,\n uploadStatus: null,\n error: null,\n }\n )\n\n // Make sure we close out the upload observer on dismount\n useEffect(() => {\n return () => {\n if (uploadRef.current && !uploadRef.current.closed) {\n uploadRef.current.unsubscribe()\n }\n }\n }, [])\n\n /* -------------------------------------------------------------------------- */\n /* Uploading */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Begins a file or URL upload with the staged files or URL.\n *\n * Should only be called from the UploadConfiguration component, which provides\n * the Mux configuration for the direct asset upload.\n *\n * @param settings The Mux new_asset_settings object to send to Sanity\n * @returns\n */\n const startUpload = (settings: MuxNewAssetSettings) => {\n const {stagedUpload} = state\n if (!stagedUpload || uploadRef.current) return\n dispatch({action: 'commitUpload'})\n let uploadObservable: Observable<UploadFileEvent | UploadUrlEvent>\n // eslint-disable-next-line default-case\n switch (stagedUpload.type) {\n case 'url':\n uploadObservable = uploadUrl({\n client: props.client,\n url: stagedUpload.url,\n settings,\n })\n break\n case 'file':\n uploadObservable = uploadFile({\n client: props.client,\n file: stagedUpload.files[0],\n settings,\n }).pipe(\n takeUntil(\n cancelUploadButton.observable.pipe(\n tap(() => {\n if (state.uploadStatus?.uuid) {\n props.client.delete(state.uploadStatus.uuid)\n }\n })\n )\n )\n )\n break\n }\n uploadRef.current = uploadObservable.subscribe({\n next: (event) => {\n switch (event.type) {\n case 'uuid':\n case 'file':\n case 'url':\n dispatch({action: 'progressInfo', ...event})\n break\n case 'progress':\n dispatch({action: 'progress', percent: event.percent})\n break\n case 'success':\n dispatch({action: 'progress', percent: 100})\n props.onChange(\n PatchEvent.from([\n setIfMissing({asset: {}}),\n set({_type: 'reference', _weak: true, _ref: event.asset._id}, ['asset']),\n ])\n )\n break\n case 'pause':\n case 'resume':\n default:\n break\n }\n },\n complete: () => dispatch({action: 'complete'}),\n error: (error) => dispatch({action: 'error', error}),\n })\n }\n\n /* -------------------------- Upload Initialization ------------------------- */\n // The below populate the uploadInput state field, which then triggers the\n // upload configuration, or the startUpload function if no config is required.\n\n // Stages an upload from the file selector\n const handleUpload = (files: FileList | File[]) => {\n dispatch({\n action: 'stageUpload',\n input: {type: 'file', files},\n })\n }\n\n // Stages and validates an upload from pasting an asset URL\n const handlePaste: React.ClipboardEventHandler<HTMLInputElement> = (event) => {\n event.preventDefault()\n event.stopPropagation()\n const clipboardData = event.clipboardData || (window as any).clipboardData\n const url = clipboardData.getData('text')\n if (!isValidUrl(url)) {\n toast.push({status: 'error', title: 'Invalid URL for Mux video input.'})\n return\n }\n dispatch({action: 'stageUpload', input: {type: 'url', url: url}})\n }\n\n // Stages and validates an upload from dragging+dropping files or folders\n const handleDrop: React.DragEventHandler<HTMLDivElement> = (event) => {\n setDragState(null)\n event.preventDefault()\n event.stopPropagation()\n extractDroppedFiles(event.nativeEvent.dataTransfer!).then((files) => {\n dispatch({\n action: 'stageUpload',\n input: {type: 'file', files},\n })\n })\n }\n\n /* ------------------------------- Drag State ------------------------------- */\n\n const handleDragOver: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.preventDefault()\n event.stopPropagation()\n }\n\n const handleDragEnter: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.stopPropagation()\n dragEnteredEls.current.push(event.target)\n const type = event.dataTransfer.items?.[0]?.type\n setDragState(type?.startsWith('video/') ? 'valid' : 'invalid')\n }\n\n const handleDragLeave: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.stopPropagation()\n const idx = dragEnteredEls.current.indexOf(event.target)\n if (idx > -1) {\n dragEnteredEls.current.splice(idx, 1)\n }\n if (dragEnteredEls.current.length === 0) {\n setDragState(null)\n }\n }\n\n /* -------------------------------- Rendering ------------------------------- */\n\n // Upload has errored\n if (state.error !== null) {\n const error = {state}\n return (\n <Flex gap={3} direction=\"column\" justify=\"center\" align=\"center\">\n <Text size={5} muted>\n <ErrorOutlineIcon />\n </Text>\n <Text>Something went wrong</Text>\n {error instanceof Error && error.message && (\n <Text size={1} muted>\n {error.message}\n </Text>\n )}\n <Button text=\"Upload another file\" onClick={() => dispatch({action: 'reset'})} />\n </Flex>\n )\n }\n\n // Upload is in progress\n if (state.uploadStatus !== null) {\n const {uploadStatus} = state\n return (\n <UploadProgress\n onCancel={cancelUploadButton.handleClick}\n progress={uploadStatus.progress}\n filename={uploadStatus.file?.name || uploadStatus.url}\n />\n )\n }\n\n // Upload needs configuration\n if (state.stagedUpload !== null) {\n return (\n <UploadConfiguration\n stagedUpload={state.stagedUpload}\n pluginConfig={props.config}\n secrets={props.secrets}\n startUpload={startUpload}\n onClose={() => dispatch({action: 'reset'})}\n />\n )\n }\n\n // Default: No staged upload\n let tone: CardTone | undefined\n if (dragState) tone = dragState === 'valid' ? 'positive' : 'critical'\n\n return (\n <>\n <UploadCard\n tone={tone}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDragEnter={handleDragEnter}\n onPaste={handlePaste}\n ref={containerRef}\n >\n {props.asset ? (\n <Player\n readOnly={props.readOnly}\n asset={props.asset}\n onChange={props.onChange}\n buttons={\n <PlayerActionsMenu\n asset={props.asset}\n dialogState={props.dialogState}\n setDialogState={props.setDialogState}\n onChange={props.onChange}\n onSelect={handleUpload}\n readOnly={props.readOnly}\n />\n }\n />\n ) : (\n <UploadPlaceholder\n hovering={dragState !== null}\n onSelect={handleUpload}\n readOnly={!!props.readOnly}\n setDialogState={props.setDialogState}\n needsSetup={props.needsSetup}\n />\n )}\n </UploadCard>\n {props.dialogState === 'select-video' && (\n <InputBrowser\n asset={props.asset}\n onChange={props.onChange}\n setDialogState={props.setDialogState}\n />\n )}\n </>\n )\n}\n","import {Card} from '@sanity/ui'\nimport {memo, Suspense} 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 {MuxInputProps, PluginConfig} from '../util/types'\nimport ConfigureApi from './ConfigureApi'\nimport ErrorBoundaryCard from './ErrorBoundaryCard'\nimport {InputFallback} from './Input.styled'\nimport Onboard from './Onboard'\nimport Uploader from './Uploader'\n\nexport interface InputProps extends MuxInputProps {\n config: PluginConfig\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 <Card>\n <ErrorBoundaryCard schemaType={props.schemaType}>\n <Suspense fallback={<InputFallback />}>\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 </Suspense>\n </ErrorBoundaryCard>\n </Card>\n )\n}\n\nexport default memo(Input)\n","import Input from './components/Input'\nimport VideoThumbnail from './components/VideoThumbnail'\nimport type {MuxInputProps, PluginConfig, VideoAssetDocument} from './util/types'\n\nexport function muxVideoCustomRendering(config: PluginConfig) {\n return {\n components: {\n input: (props: MuxInputProps) => (\n <Input config={{...config, ...props.schemaType.options}} {...props} />\n ),\n },\n preview: {\n select: {\n filename: 'asset.filename',\n playbackId: 'asset.playbackId',\n status: 'asset.status',\n assetId: 'asset.assetId',\n thumbTime: 'asset.thumbTime',\n data: 'asset.data',\n },\n prepare: (asset: Partial<VideoAssetDocument>) => {\n const {filename, playbackId, status} = asset\n return {\n title: filename || playbackId || '',\n subtitle: status ? `status: ${status}` : null,\n media: asset.playbackId ? <VideoThumbnail asset={asset} width={64} /> : null,\n }\n },\n },\n }\n}\n","export const muxVideoSchema = {\n name: 'mux.video',\n type: 'object',\n title: 'Video asset reference',\n fields: [\n {\n title: 'Video',\n name: 'asset',\n type: 'reference',\n weak: true,\n to: [{type: 'mux.videoAsset'}],\n },\n ],\n}\n\nconst muxTrack = {\n name: 'mux.track',\n type: 'object',\n fields: [\n {type: 'string', name: 'id'},\n {type: 'string', name: 'type'},\n {type: 'number', name: 'max_width'},\n {type: 'number', name: 'max_frame_rate'},\n {type: 'number', name: 'duration'},\n {type: 'number', name: 'max_height'},\n ],\n}\n\nconst muxPlaybackId = {\n name: 'mux.playbackId',\n type: 'object',\n fields: [\n {type: 'string', name: 'id'},\n {type: 'string', name: 'policy'},\n ],\n}\n\nconst muxStaticRenditionFile = {\n name: 'mux.staticRenditionFile',\n type: 'object',\n fields: [\n {type: 'string', name: 'ext'},\n {type: 'string', name: 'name'},\n {type: 'number', name: 'width'},\n {type: 'number', name: 'bitrate'},\n {type: 'number', name: 'filesize'},\n {type: 'number', name: 'height'},\n ],\n}\n\nconst muxStaticRenditions = {\n name: 'mux.staticRenditions',\n type: 'object',\n fields: [\n {type: 'string', name: 'status'},\n {\n name: 'files',\n type: 'array',\n of: [{type: 'mux.staticRenditionFile'}],\n },\n ],\n}\n\nconst muxAssetData = {\n name: 'mux.assetData',\n title: 'Mux asset data',\n type: 'object',\n fields: [\n {\n type: 'string',\n name: 'resolution_tier',\n },\n {\n type: 'string',\n name: 'upload_id',\n },\n {\n type: 'string',\n name: 'created_at',\n },\n {\n type: 'string',\n name: 'id',\n },\n {\n type: 'string',\n name: 'status',\n },\n {\n type: 'string',\n name: 'max_stored_resolution',\n },\n {\n type: 'string',\n name: 'passthrough',\n },\n {\n type: 'string',\n name: 'encoding_tier',\n },\n {\n type: 'string',\n name: 'master_access',\n },\n {\n type: 'string',\n name: 'aspect_ratio',\n },\n {\n type: 'number',\n name: 'duration',\n },\n {\n type: 'number',\n name: 'max_stored_frame_rate',\n },\n {\n type: 'string',\n name: 'mp4_support',\n },\n {\n type: 'string',\n name: 'max_resolution_tier',\n },\n {\n name: 'tracks',\n type: 'array',\n of: [{type: 'mux.track'}],\n },\n {\n name: 'playback_ids',\n type: 'array',\n of: [{type: 'mux.playbackId'}],\n },\n {\n name: 'static_renditions',\n type: 'mux.staticRenditions',\n },\n ],\n}\n\nconst muxVideoAsset = {\n name: 'mux.videoAsset',\n type: 'object',\n title: 'Video asset',\n fields: [\n {\n type: 'string',\n name: 'status',\n },\n {\n type: 'string',\n name: 'assetId',\n },\n {\n type: 'string',\n name: 'playbackId',\n },\n {\n type: 'string',\n name: 'filename',\n },\n {\n type: 'number',\n name: 'thumbTime',\n },\n {\n type: 'mux.assetData',\n name: 'data',\n },\n ],\n}\n\nexport const schemaTypes = [\n muxTrack,\n muxPlaybackId,\n muxStaticRenditionFile,\n muxStaticRenditions,\n muxAssetData,\n muxVideoAsset,\n]\n","import {definePlugin} from 'sanity'\n\nimport createStudioTool, {DEFAULT_TOOL_CONFIG} from '../components/StudioTool'\nimport {muxVideoCustomRendering} from '../plugin'\nimport {muxVideoSchema, schemaTypes} from '../schema'\nimport type {PluginConfig} from '../util/types'\nexport type {VideoAssetDocument} from '../util/types'\n\nexport const defaultConfig: PluginConfig = {\n mp4_support: 'none',\n encoding_tier: 'smart',\n max_resolution_tier: '1080p',\n normalize_audio: false,\n defaultSigned: false,\n tool: DEFAULT_TOOL_CONFIG,\n}\n\nexport const muxInput = definePlugin<Partial<PluginConfig> | void>((userConfig) => {\n const config: PluginConfig = {...defaultConfig, ...(userConfig || {})}\n return {\n name: 'mux-input',\n schema: {\n types: [\n ...schemaTypes,\n {\n ...muxVideoSchema,\n ...muxVideoCustomRendering(config),\n },\n ],\n },\n tools: config.tool === false ? undefined : [createStudioTool(config)],\n }\n})\n"],"names":["useSanityClient","a","path","useClient","error","document","FormField","Label","c","secretsId","t","e","r","n","o","useErrorBoundary","uuid","uploadUrl","generateUuid","SelectAsset","u","_id","HiddenInput","PlayerActionsMenu","ErrorBoundaryCard","ConfigureApi","Input"],"mappings":"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","x_google_ignoreList":[52]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/components/icons/ToolIcon.tsx","../src/hooks/useClient.ts","../src/util/createSearchFilter.ts","../src/hooks/useAssets.ts","../src/util/parsers.ts","../src/hooks/useMuxAssets.ts","../src/util/constants.ts","../src/hooks/useSecretsDocumentValues.ts","../src/hooks/useImportMuxAssets.ts","../src/hooks/useInView.ts","../src/util/readSecrets.ts","../src/util/generateJwt.ts","../src/util/getPlaybackId.ts","../src/util/getPlaybackPolicy.ts","../src/util/createUrlParamsObject.ts","../src/util/getAnimatedPosterSrc.ts","../src/util/getPosterSrc.ts","../src/components/VideoThumbnail.tsx","../src/components/ImportVideosFromMux.tsx","../src/components/SelectSortOptions.tsx","../src/components/SpinnerBox.tsx","../src/components/FormField.tsx","../src/components/IconInfo.tsx","../src/components/icons/Resolution.tsx","../src/components/icons/StopWatch.tsx","../src/context/DialogStateContext.tsx","../src/util/getVideoSrc.ts","../node_modules/use-device-pixel-ratio/dist/index.module.js","../src/util/formatSeconds.ts","../src/components/EditThumbnailDialog.tsx","../src/components/VideoPlayer.tsx","../src/actions/assets.ts","../src/components/documentPreview/MissingSchemaType.tsx","../src/components/documentPreview/TimeAgo.tsx","../src/components/documentPreview/DraftStatus.tsx","../src/components/documentPreview/PublishedStatus.tsx","../src/components/documentPreview/PaneItemPreview.tsx","../src/components/documentPreview/DocumentPreview.tsx","../src/components/VideoDetails/VideoReferences.tsx","../src/components/VideoDetails/DeleteDialog.tsx","../src/hooks/useDocReferences.ts","../src/util/getVideoMetadata.ts","../src/components/VideoDetails/useVideoDetails.ts","../src/components/VideoDetails/VideoDetails.tsx","../src/components/VideoMetadata.tsx","../src/components/VideoInBrowser.tsx","../src/components/VideosBrowser.tsx","../src/components/StudioTool.tsx","../src/hooks/useAssetDocumentValues.ts","../src/hooks/useDialogState.ts","../src/hooks/useMuxPolling.ts","../src/actions/secrets.ts","../src/hooks/useSaveSecrets.ts","../src/hooks/useSecretsFormState.ts","../src/components/MuxLogo.tsx","../src/components/ConfigureApi.styled.tsx","../src/components/ConfigureApi.tsx","../node_modules/use-error-boundary/lib/index.module.js","../src/components/ErrorBoundaryCard.tsx","../src/components/Input.styled.tsx","../src/components/Onboard.tsx","../src/clients/upChunkObservable.ts","../src/actions/upload.ts","../src/util/asserters.ts","../src/util/extractFiles.ts","../src/components/SelectAsset.tsx","../src/components/InputBrowser.tsx","../src/hooks/useCancelUpload.ts","../src/components/Player.styled.tsx","../src/components/UploadProgress.tsx","../src/components/Player.tsx","../src/components/withFocusRing/helpers.ts","../src/components/FileInputMenuItem.styled.tsx","../src/components/FileInputMenuItem.tsx","../src/components/PlayerActionsMenu.tsx","../src/util/formatBytes.ts","../src/util/types.ts","../src/components/TextTracksEditor.tsx","../src/components/UploadConfiguration.tsx","../src/components/withFocusRing/withFocusRing.ts","../src/components/Uploader.styled.tsx","../src/components/FileInputButton.tsx","../src/components/UploadPlaceholder.tsx","../src/components/Uploader.tsx","../src/components/Input.tsx","../src/plugin.tsx","../src/schema.ts","../src/_exports/index.ts"],"sourcesContent":["/**\n * Icon of a monitor with a play button.\n * Credits: material design icons & react-icons\n */\nconst ToolIcon = () => (\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 24 24\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-6l-7 4V7z\" />\n </svg>\n)\n\nexport default ToolIcon\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 const SANITY_API_VERSION = '2024-03-05'\n\nexport function useClient() {\n return useSanityClient({apiVersion: SANITY_API_VERSION})\n}\n","// Adaptation of Sanity's createSearchQuery for our limited use case:\n// https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/core/search/weighted/createSearchQuery.ts\nimport {compact, toLower, trim, uniq, words} from 'lodash'\n\nconst SPECIAL_CHARS = /([^!@#$%^&*(),\\\\/?\";:{}|[\\]+<>\\s-])+/g\nconst STRIP_EDGE_CHARS = /(^[.]+)|([.]+$)/\n\nfunction tokenize(string: string): string[] {\n return (string.match(SPECIAL_CHARS) || []).map((token) => token.replace(STRIP_EDGE_CHARS, ''))\n}\n\nfunction toGroqParams(terms: string[]): Record<string, string> {\n const params: Record<string, string> = {}\n return terms.reduce((acc, term, i) => {\n acc[`t${i}`] = `*${term}*` // \"t\" is short for term\n return acc\n }, params)\n}\n\n/**\n * Convert a string into an array of tokenized terms.\n *\n * Any (multi word) text wrapped in double quotes will be treated as \"phrases\", or separate tokens that\n * will not have its special characters removed.\n * E.g.`\"the\" \"fantastic mr\" fox fox book` =\\> [\"the\", `\"fantastic mr\"`, \"fox\", \"book\"]\n *\n * Phrases wrapped in quotes are assigned relevance scoring differently from regular words.\n *\n * @internal\n */\nfunction extractTermsFromQuery(query: string): string[] {\n const quotedQueries = [] as string[]\n const unquotedQuery = query.replace(/(\"[^\"]*\")/g, (match) => {\n if (words(match).length > 1) {\n quotedQueries.push(match)\n return ''\n }\n return match\n })\n\n // Lowercase and trim quoted queries\n const quotedTerms = quotedQueries.map((str) => trim(toLower(str)))\n\n /**\n * Convert (remaining) search query into an array of deduped, sanitized tokens.\n * All white space and special characters are removed.\n * e.g. \"The saint of Saint-Germain-des-Prés\" =\\> ['the', 'saint', 'of', 'germain', 'des', 'pres']\n */\n const remainingTerms = uniq(compact(tokenize(toLower(unquotedQuery))))\n\n return [...quotedTerms, ...remainingTerms]\n}\n\n/**\n * Create GROQ constraints, given search terms and the full spec of available document types and fields.\n * Essentially a large list of all possible fields (joined by logical OR) to match our search terms against.\n */\nfunction createConstraints(terms: string[], includeAssetId: boolean) {\n const searchPaths = includeAssetId ? ['filename', 'assetId'] : ['filename']\n const constraints = terms\n .map((_term, i) => searchPaths.map((joinedPath) => `${joinedPath} match $t${i}`))\n .filter((constraint) => constraint.length > 0)\n\n return constraints.map((constraint) => `(${constraint.join(' || ')})`)\n}\n\nexport function createSearchFilter(query: string) {\n const terms = extractTermsFromQuery(query)\n\n return {\n filter: createConstraints(terms, query.length >= 8), // if the search is big enough, include the assetId (mux id) in the results\n params: {\n ...toGroqParams(terms),\n },\n }\n}\n","import {useMemo, useState} from 'react'\nimport {useObservable} from 'react-rx'\nimport {collate, DocumentStore, useDocumentStore} from 'sanity'\n\nimport {SANITY_API_VERSION} from '../hooks/useClient'\nimport {createSearchFilter} from '../util/createSearchFilter'\nimport type {VideoAssetDocument} from '../util/types'\n\nexport const ASSET_SORT_OPTIONS = {\n createdDesc: {groq: '_createdAt desc', label: 'Newest first'},\n createdAsc: {groq: '_createdAt asc', label: 'First created (oldest)'},\n filenameAsc: {groq: 'filename asc', label: 'By filename (A-Z)'},\n filenameDesc: {groq: 'filename desc', label: 'By filename (Z-A)'},\n}\n\nexport type SortOption = keyof typeof ASSET_SORT_OPTIONS\n\nconst useAssetDocuments = ({\n documentStore,\n sort,\n searchQuery,\n}: {\n documentStore: DocumentStore\n sort: SortOption\n searchQuery: string\n}): VideoAssetDocument[] | undefined => {\n const memoizedObservable = useMemo(() => {\n const search = createSearchFilter(searchQuery)\n const filter = [`_type == \"mux.videoAsset\"`, ...search.filter].filter(Boolean).join(' && ')\n const sortFragment = ASSET_SORT_OPTIONS[sort].groq\n return documentStore.listenQuery(\n /* groq */ `*[${filter}] | order(${sortFragment})`,\n search.params,\n {\n apiVersion: SANITY_API_VERSION,\n }\n )\n }, [documentStore, sort, searchQuery])\n\n return useObservable(memoizedObservable, undefined)\n}\n\nexport default function useAssets() {\n const documentStore = useDocumentStore()\n const [sort, setSort] = useState<SortOption>('createdDesc')\n const [searchQuery, setSearchQuery] = useState('')\n\n const assetDocumentsObservable = useAssetDocuments({documentStore, sort, searchQuery})\n const isLoading = assetDocumentsObservable === undefined\n const assets = useMemo(\n () =>\n // Avoid displaying both drafts & published assets by collating them together and giving preference to drafts\n collate<VideoAssetDocument>(assetDocumentsObservable ?? []).map(\n (collated) =>\n ({\n ...(collated.draft || collated.published || {}),\n _id: collated.id,\n }) as VideoAssetDocument\n ),\n [assetDocumentsObservable]\n )\n\n return {\n assets,\n isLoading,\n sort,\n searchQuery,\n setSort,\n setSearchQuery,\n }\n}\n","import type {MuxAsset} from './types'\n\nexport function parseMuxDate(date: MuxAsset['created_at']): Date {\n return new Date(Number(date) * 1000)\n}\n","import {useEffect, useState} from 'react'\nimport {defer, of, timer} from 'rxjs'\nimport {concatMap, expand, tap} from 'rxjs/operators'\n\nimport type {MuxAsset, Secrets} from '../util/types'\n\nconst FIRST_PAGE = 1\nconst ASSETS_PER_PAGE = 100\n\ntype MuxAssetsState = {\n pageNum: number\n loading: boolean\n data?: MuxAsset[]\n error?: FetchError\n}\n\ntype FetchError =\n | {\n _tag: 'FetchError'\n }\n | {_tag: 'MuxError'; error: unknown}\n\ntype PageResult = (\n | {\n data: MuxAsset[]\n }\n | {\n error: FetchError\n }\n) & {\n pageNum: number\n}\n\n/**\n * @docs {@link https://docs.mux.com/api-reference#video/operation/list-assets}\n */\nasync function fetchMuxAssetsPage(\n {secretKey, token}: Secrets,\n pageNum: number\n): Promise<PageResult> {\n try {\n const res = await fetch(\n `https://api.mux.com/video/v1/assets?limit=${ASSETS_PER_PAGE}&page=${pageNum}`,\n {\n headers: {\n Authorization: `Basic ${btoa(`${token}:${secretKey}`)}`,\n },\n }\n )\n const json = await res.json()\n\n if (json.error) {\n return {\n pageNum,\n error: {\n _tag: 'MuxError',\n error: json.error,\n },\n }\n }\n\n return {\n pageNum,\n data: json.data as MuxAsset[],\n }\n } catch (error) {\n return {\n pageNum,\n error: {_tag: 'FetchError'},\n }\n }\n}\n\nfunction accumulateIntermediateState(\n currentState: MuxAssetsState,\n pageResult: PageResult\n): MuxAssetsState {\n const currentData = ('data' in currentState && currentState.data) || []\n return {\n ...currentState,\n data: [\n ...currentData,\n ...(('data' in pageResult && pageResult.data) || []).filter(\n // De-duplicate assets for safety\n (asset) => !currentData.some((a) => a.id === asset.id)\n ),\n ],\n error:\n 'error' in pageResult\n ? pageResult.error\n : // Reset error if current page is successful\n undefined,\n pageNum: pageResult.pageNum,\n loading: true,\n }\n}\n\nfunction hasMorePages(pageResult: PageResult) {\n return (\n typeof pageResult === 'object' &&\n 'data' in pageResult &&\n Array.isArray(pageResult.data) &&\n pageResult.data.length > 0\n )\n}\n\n/**\n * Fetches all assets from a Mux environment. Rules:\n * - One page at a time\n * - Mux has no information on pagination\n * - We've finished fetching if a page returns `data.length === 0`\n * - Rate limiting to one request per 2 seconds\n * - Update state while still fetching to give feedback to users\n */\nexport default function useMuxAssets({secrets, enabled}: {enabled: boolean; secrets: Secrets}) {\n const [state, setState] = useState<MuxAssetsState>({loading: true, pageNum: FIRST_PAGE})\n\n useEffect(() => {\n if (!enabled) return\n\n const subscription = defer(() =>\n fetchMuxAssetsPage(\n secrets,\n // When we've already successfully loaded before (fully or partially), we start from the following page to avoid re-fetching\n 'data' in state && state.data && state.data.length > 0 && !state.error\n ? state.pageNum + 1\n : state.pageNum\n )\n )\n .pipe(\n // Here we replace \"concatMap\" with \"expand\" to recursively fetch next pages\n expand((pageResult) => {\n // if fetched page has data, we continue emitting, requesting the next page\n // after 2s to avoid rate limiting\n if (hasMorePages(pageResult)) {\n return timer(2000).pipe(\n // eslint-disable-next-line max-nested-callbacks\n concatMap(() => defer(() => fetchMuxAssetsPage(secrets, pageResult.pageNum + 1)))\n )\n }\n\n // Else, we stop emitting\n return of()\n }),\n\n // On each iteration, persist intermediate states to give feedback to users\n tap((pageResult) =>\n setState((prevState) => accumulateIntermediateState(prevState, pageResult))\n )\n )\n .subscribe({\n // Once done, let the user know we've stopped loading\n complete: () => {\n setState((prev) => ({\n ...prev,\n loading: false,\n }))\n },\n })\n\n // Unsubscribe on component unmount to prevent memory leaks or fetching unnecessarily\n // eslint-disable-next-line consistent-return\n return () => subscription.unsubscribe()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled])\n\n return state\n}\n","export const name = 'mux-input' as const\n\n// Caching namespace, as suspend-react might be in use by other components on the page we must ensure we don't collide\nexport const cacheNs = 'sanity-plugin-mux-input' as const\n\nexport const muxSecretsDocumentId = 'secrets.mux' as const\n\nexport const DIALOGS_Z_INDEX = 60_000\n\nexport const THUMBNAIL_ASPECT_RATIO = 16 / 9\n\n/** To prevent excessive height, thumbnails and input should not go beyond to this aspect ratio. */\nexport const MIN_ASPECT_RATIO = 5 / 4\n\nexport const AUDIO_ASPECT_RATIO = 5 / 1\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 {uuid} from '@sanity/uuid'\nimport {useMemo, useState} from 'react'\nimport {\n createHookFromObservableFactory,\n type DocumentStore,\n truncateString,\n useClient,\n useDocumentStore,\n} from 'sanity'\n\nimport {parseMuxDate} from '../util/parsers'\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\nimport {SANITY_API_VERSION} from './useClient'\nimport useMuxAssets from './useMuxAssets'\nimport {useSecretsDocumentValues} from './useSecretsDocumentValues'\n\ntype ImportState = 'closed' | 'idle' | 'importing' | 'done' | 'error'\n\nexport type AssetInSanity = {\n uploadId: string\n assetId: string\n}\n\nexport default function useImportMuxAssets() {\n const documentStore = useDocumentStore()\n const client = useClient({\n apiVersion: SANITY_API_VERSION,\n })\n\n const [assetsInSanity, assetsInSanityLoading] = useAssetsInSanity(documentStore)\n\n const secretDocumentValues = useSecretsDocumentValues()\n const hasSecrets = !!secretDocumentValues.value.secrets?.secretKey\n\n const [importError, setImportError] = useState<unknown>()\n const [importState, setImportState] = useState<ImportState>('closed')\n const dialogOpen = importState !== 'closed'\n\n const muxAssets = useMuxAssets({\n secrets: secretDocumentValues.value.secrets,\n enabled: hasSecrets && dialogOpen,\n })\n\n const missingAssets = useMemo(() => {\n return assetsInSanity && muxAssets.data\n ? muxAssets.data.filter((a) => !assetExistsInSanity(a, assetsInSanity))\n : undefined\n }, [assetsInSanity, muxAssets.data])\n\n const [selectedAssets, setSelectedAssets] = useState<MuxAsset[]>([])\n\n const closeDialog = () => {\n if (importState !== 'importing') setImportState('closed')\n }\n const openDialog = () => {\n if (importState === 'closed') setImportState('idle')\n }\n\n async function importAssets() {\n setImportState('importing')\n const documents = selectedAssets.flatMap((asset) => muxAssetToSanityDocument(asset) || [])\n\n const tx = client.transaction()\n documents.forEach((doc) => tx.create(doc))\n\n try {\n await tx.commit({returnDocuments: false})\n setSelectedAssets([])\n setImportState('done')\n } catch (error) {\n setImportState('error')\n setImportError(error)\n }\n }\n\n return {\n assetsInSanityLoading,\n closeDialog,\n dialogOpen,\n importState,\n importError,\n hasSecrets,\n importAssets,\n missingAssets,\n muxAssets,\n openDialog,\n selectedAssets,\n setSelectedAssets,\n }\n}\n\nfunction muxAssetToSanityDocument(asset: MuxAsset): VideoAssetDocument | undefined {\n const playbackId = (asset.playback_ids || []).find((p) => p.id)?.id\n\n if (!playbackId) return undefined\n\n return {\n _id: uuid(),\n _type: 'mux.videoAsset',\n _updatedAt: new Date().toISOString(),\n _createdAt: parseMuxDate(asset.created_at).toISOString(),\n assetId: asset.id,\n playbackId,\n filename: `Asset #${truncateString(asset.id, 15)}`,\n status: asset.status,\n data: asset,\n }\n}\n\nconst useAssetsInSanity = createHookFromObservableFactory<AssetInSanity[], DocumentStore>(\n (documentStore) => {\n return documentStore.listenQuery(\n /* groq */ `*[_type == \"mux.videoAsset\"] {\n \"uploadId\": coalesce(uploadId, data.upload_id),\n \"assetId\": coalesce(assetId, data.id),\n }`,\n {},\n {\n apiVersion: SANITY_API_VERSION,\n }\n )\n }\n)\n\nfunction assetExistsInSanity(asset: MuxAsset, existingAssets: AssetInSanity[]) {\n // Don't allow importing assets that are not ready\n if (asset.status !== 'ready') return false\n\n return existingAssets.some(\n (existing) => existing.assetId === asset.id || existing.uploadId === asset.upload_id\n )\n}\n","import type {RefObject} from 'react'\nimport {useEffect, useRef, useState} from 'react'\n\ntype IntersectionOptions = {\n root?: Element | null\n rootMargin?: string\n threshold?: number\n onChange?: (inView: boolean) => void\n}\n\nfunction useInView<RefElement = HTMLElement>(\n options: IntersectionOptions = {}\n): {inView: boolean; ref: RefObject<RefElement>} {\n const [inView, setInView] = useState(false)\n const ref = useRef(null)\n\n useEffect(() => {\n if (!ref.current) return\n\n const observer = new IntersectionObserver(([entry], obs) => {\n // ==== from react-intersection-observer ====\n // While it would be nice if you could just look at isIntersecting to determine if the component is inside the viewport, browsers can't agree on how to use it.\n // -Firefox ignores `threshold` when considering `isIntersecting`, so it will never be false again if `threshold` is > 0\n const nowInView =\n entry.isIntersecting &&\n obs.thresholds.some((threshold) => entry.intersectionRatio >= threshold)\n\n // Update our state when observer callback fires\n setInView(nowInView)\n options?.onChange?.(nowInView)\n }, options)\n\n const toObserve = ref.current\n observer.observe(toObserve)\n\n // eslint-disable-next-line\n return () => {\n if (toObserve) observer.unobserve(toObserve)\n }\n }, [options])\n\n return {inView, ref}\n}\n\nexport default useInView\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'\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'\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 Check your plugin's configuration\")\n }\n if (!signingKeyPrivate) {\n throw new TypeError(\"Missing `signingKeyPrivate`.\\n Check your plugin's configuration\")\n }\n\n // @ts-expect-error - handle missing typings for this package\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: Pick<VideoAssetDocument, 'playbackId'>): 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(\n asset: Pick<VideoAssetDocument, 'data' | 'playbackId'>\n): PlaybackPolicy {\n return (\n asset.data?.playback_ids?.find((playbackId) => asset.playbackId === playbackId.id)?.policy ??\n 'public'\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport {Audience, generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {AssetThumbnailOptions} from './types'\n\nexport function createUrlParamsObject(\n client: SanityClient,\n asset: AssetThumbnailOptions['asset'],\n params: object,\n audience: Audience\n) {\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, audience, params)\n searchParams = new URLSearchParams({token})\n }\n\n return {playbackId, searchParams}\n}\n","import type {SanityClient} from 'sanity'\n\nimport {createUrlParamsObject} from './createUrlParamsObject'\nimport type {AnimatedThumbnailOptions, MuxAnimatedThumbnailUrl} from './types'\nimport {AssetThumbnailOptions} from './types'\n\nexport interface AnimatedPosterSrcOptions extends AnimatedThumbnailOptions {\n asset: AssetThumbnailOptions['asset']\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\n const {playbackId, searchParams} = createUrlParamsObject(client, asset, params, 'g')\n\n return `https://image.mux.com/${playbackId}/animated.gif?${searchParams}`\n}\n","import type {SanityClient} from 'sanity'\n\nimport {createUrlParamsObject} from './createUrlParamsObject'\nimport type {MuxThumbnailUrl, ThumbnailOptions} from './types'\nimport {AssetThumbnailOptions} from './types'\n\nexport interface PosterSrcOptions extends ThumbnailOptions {\n asset: AssetThumbnailOptions['asset']\n client: SanityClient\n}\n\nexport function getPosterSrc({\n asset,\n client,\n fit_mode,\n height,\n time = asset.thumbTime ?? undefined,\n width,\n}: PosterSrcOptions): MuxThumbnailUrl {\n const params = {fit_mode, height, width}\n if (time) {\n ;(params as any).time = time\n }\n\n const {playbackId, searchParams} = createUrlParamsObject(client, asset, params, 't')\n\n return `https://image.mux.com/${playbackId}/thumbnail.png?${searchParams}`\n}\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Card, CardTone, Spinner, Stack, Text} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {useClient} from '../hooks/useClient'\nimport useInView from '../hooks/useInView'\nimport {THUMBNAIL_ASPECT_RATIO} from '../util/constants'\nimport {getAnimatedPosterSrc} from '../util/getAnimatedPosterSrc'\nimport {getPosterSrc} from '../util/getPosterSrc'\nimport {AssetThumbnailOptions, MuxAnimatedThumbnailUrl, MuxThumbnailUrl} from '../util/types'\n\nconst Image = styled.img`\n transition: opacity 0.175s ease-out 0s;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n object-position: center center;\n`\n\ntype ImageStatus = 'loading' | 'error' | 'loaded'\n\nconst STATUS_TO_TONE: Record<ImageStatus, CardTone> = {\n loading: 'transparent',\n error: 'critical',\n loaded: 'default',\n}\n\nexport default function VideoThumbnail({\n asset,\n width,\n staticImage = false,\n}: {\n asset: AssetThumbnailOptions['asset']\n width?: number\n staticImage?: boolean\n}) {\n const {inView, ref} = useInView()\n const posterWidth = width || 250\n\n const [status, setStatus] = useState<ImageStatus>('loading')\n const client = useClient()\n\n const src = useMemo(() => {\n try {\n let thumbnail: MuxAnimatedThumbnailUrl | MuxThumbnailUrl\n if (staticImage) thumbnail = getPosterSrc({asset, client, width: posterWidth})\n else thumbnail = getAnimatedPosterSrc({asset, client, width: posterWidth})\n\n return thumbnail\n } catch {\n if (status !== 'error') setStatus('error')\n return undefined\n }\n }, [asset, client, posterWidth, status, staticImage])\n\n function handleLoad() {\n setStatus('loaded')\n }\n\n function handleError() {\n setStatus('error')\n }\n\n return (\n <Card\n style={{\n aspectRatio: THUMBNAIL_ASPECT_RATIO,\n position: 'relative',\n maxWidth: width ? `${width}px` : undefined,\n width: '100%',\n flex: 1,\n }}\n border\n radius={2}\n ref={ref as any}\n tone={STATUS_TO_TONE[status]}\n >\n {inView ? (\n <>\n {status === 'loading' && (\n <Box\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n }}\n >\n <Spinner />\n </Box>\n )}\n {status === 'error' && (\n <Stack\n space={4}\n style={{\n position: 'absolute',\n width: '100%',\n left: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n justifyItems: 'center',\n }}\n >\n <Text size={4} muted>\n <ErrorOutlineIcon style={{fontSize: '1.75em'}} />\n </Text>\n <Text muted align=\"center\">\n Failed loading thumbnail\n </Text>\n </Stack>\n )}\n <Image\n src={src}\n alt={`Preview for ${staticImage ? 'image' : 'video'} ${asset.filename || asset.assetId}`}\n onLoad={handleLoad}\n onError={handleError}\n style={{\n opacity: status === 'loaded' ? 1 : 0,\n }}\n />\n </>\n ) : null}\n </Card>\n )\n}\n","import {CheckmarkCircleIcon, ErrorOutlineIcon, RetrieveIcon, RetryIcon} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Checkbox,\n Code,\n Dialog,\n Flex,\n Heading,\n Spinner,\n Stack,\n Text,\n} from '@sanity/ui'\nimport {truncateString, useFormattedDuration} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport useImportMuxAssets from '../hooks/useImportMuxAssets'\nimport {DIALOGS_Z_INDEX} from '../util/constants'\nimport type {MuxAsset} from '../util/types'\nimport VideoThumbnail from './VideoThumbnail'\n\nconst MissingAssetCheckbox = styled(Checkbox)`\n position: static !important;\n\n input::after {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n cursor: pointer;\n z-index: 1000;\n }\n`\n\nfunction MissingAsset({\n asset,\n selectAsset,\n selected,\n}: {\n asset: MuxAsset\n selectAsset: (selected: boolean) => void\n selected: boolean\n}) {\n const duration = useFormattedDuration(asset.duration * 1000)\n\n return (\n <Card\n key={asset.id}\n tone={selected ? 'positive' : undefined}\n border\n paddingX={2}\n paddingY={3}\n style={{position: 'relative'}}\n radius={1}\n >\n <Flex align=\"center\" gap={2}>\n <MissingAssetCheckbox\n checked={selected}\n onChange={(e) => {\n selectAsset(e.currentTarget.checked)\n }}\n aria-label={selected ? `Import video ${asset.id}` : `Skip import of video ${asset.id}`}\n />\n <VideoThumbnail\n asset={{\n assetId: asset.id,\n data: asset,\n filename: asset.id,\n playbackId: asset.playback_ids.find((p) => p.id)?.id,\n }}\n width={150}\n />\n <Stack space={2}>\n <Flex align=\"center\" gap={1}>\n <Code size={2}>{truncateString(asset.id, 15)}</Code>{' '}\n <Text muted size={2}>\n ({duration.formatted})\n </Text>\n </Flex>\n <Text size={1}>\n Uploaded at{' '}\n {new Date(Number(asset.created_at) * 1000).toLocaleDateString('en', {\n year: 'numeric',\n day: '2-digit',\n month: '2-digit',\n })}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )\n}\n\n// eslint-disable-next-line complexity\nfunction ImportVideosDialog(props: ReturnType<typeof useImportMuxAssets>) {\n const {importState} = props\n\n const canTriggerImport =\n (importState === 'idle' || importState === 'error') && props.selectedAssets.length > 0\n const isImporting = importState === 'importing'\n const noAssetsToImport =\n props.missingAssets?.length === 0 && !props.muxAssets.loading && !props.assetsInSanityLoading\n\n return (\n <Dialog\n animate\n header={'Import videos from Mux'}\n zOffset={DIALOGS_Z_INDEX}\n id=\"video-details-dialog\"\n onClose={props.closeDialog}\n onClickOutside={props.closeDialog}\n width={1}\n position=\"fixed\"\n footer={\n importState !== 'done' &&\n !noAssetsToImport && (\n <Card padding={3}>\n <Flex justify=\"space-between\" align=\"center\">\n <Button\n fontSize={2}\n padding={3}\n mode=\"bleed\"\n text=\"Cancel\"\n tone=\"critical\"\n onClick={props.closeDialog}\n disabled={isImporting}\n />\n {props.missingAssets && (\n <Button\n icon={RetrieveIcon}\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text={\n props.selectedAssets?.length > 0\n ? `Import ${props.selectedAssets.length} video(s)`\n : 'No video(s) selected'\n }\n tone=\"positive\"\n onClick={props.importAssets}\n iconRight={isImporting && Spinner}\n disabled={!canTriggerImport}\n />\n )}\n </Flex>\n </Card>\n )\n }\n >\n <Box padding={3}>\n {/* LOADING ASSETS STATE */}\n {(props.muxAssets.loading || props.assetsInSanityLoading) && (\n <Card tone=\"primary\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={4}>\n <Spinner muted size={4} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n Loading assets from Mux\n </Text>\n <Text size={1}>\n This may take a while.\n {props.missingAssets &&\n props.missingAssets.length > 0 &&\n ` There are at least ${props.missingAssets.length} video${props.missingAssets.length > 1 ? 's' : ''} currently not in Sanity...`}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR LOADING MUX */}\n {props.muxAssets.error && (\n <Card tone=\"critical\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon fontSize={36} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n There was an error getting all data from Mux\n </Text>\n <Text size={1}>\n {props.missingAssets\n ? `But we've found ${props.missingAssets.length} video${props.missingAssets.length > 1 ? 's' : ''} not in Sanity, which you can start importing now.`\n : 'Please try again or contact a developer for help.'}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* IMPORTING STATE */}\n {importState === 'importing' && (\n <Card tone=\"primary\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={4}>\n <Spinner muted size={4} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n Importing {props.selectedAssets.length} video\n {props.selectedAssets.length > 1 && 's'} from Mux\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR IMPORTING */}\n {importState === 'error' && (\n <Card tone=\"critical\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon fontSize={36} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n There was an error importing videos\n </Text>\n <Text size={1}>\n {props.importError\n ? `Error: ${props.importError}`\n : 'Please try again or contact a developer for help.'}\n </Text>\n <Box marginTop={1}>\n <Button\n icon={RetryIcon}\n text=\"Retry\"\n tone=\"primary\"\n onClick={props.importAssets}\n />\n </Box>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* NO ASSETS TO IMPORT or SUCESS STATE */}\n {(noAssetsToImport || importState === 'done') && (\n <Stack paddingY={5} marginBottom={4} space={3} style={{textAlign: 'center'}}>\n <Box>\n <CheckmarkCircleIcon fontSize={48} />\n </Box>\n <Heading size={2}>\n {importState === 'done'\n ? `Videos imported successfully`\n : 'There are no Mux videos to import'}\n </Heading>\n <Text size={2}>\n {importState === 'done'\n ? 'You can now use them in your Sanity content.'\n : \"They're all in Sanity and ready to be used in your content.\"}\n </Text>\n </Stack>\n )}\n\n {/* MISSING ASSETS SELECTOR */}\n {props.missingAssets &&\n props.missingAssets.length > 0 &&\n (importState === 'idle' || importState === 'error') && (\n <Stack space={4}>\n <Heading size={1}>\n There are {props.missingAssets.length}\n {props.muxAssets.loading && '+'} Mux video{props.missingAssets.length > 1 && 's'}{' '}\n not in Sanity\n </Heading>\n {!props.muxAssets.loading && (\n <Flex align=\"center\" paddingX={2}>\n <Checkbox\n id=\"import-all\"\n style={{display: 'block'}}\n onClick={(e) => {\n const selectAll = e.currentTarget.checked\n if (selectAll) {\n // eslint-disable-next-line no-unused-expressions\n props.missingAssets && props.setSelectedAssets(props.missingAssets)\n } else {\n props.setSelectedAssets([])\n }\n }}\n checked={props.selectedAssets.length === props.missingAssets.length}\n />\n <Box flex={1} paddingLeft={3} as=\"label\" htmlFor=\"import-all\">\n <Text>Import all</Text>\n </Box>\n </Flex>\n )}\n {props.missingAssets.map((asset) => (\n <MissingAsset\n key={asset.id}\n asset={asset}\n selectAsset={(selected) => {\n if (selected) {\n props.setSelectedAssets([...props.selectedAssets, asset])\n } else {\n props.setSelectedAssets(props.selectedAssets.filter((a) => a.id !== asset.id))\n }\n }}\n selected={props.selectedAssets.some((a) => a.id === asset.id)}\n />\n ))}\n </Stack>\n )}\n </Box>\n </Dialog>\n )\n}\n\nexport default function ImportVideosFromMux() {\n const importAssets = useImportMuxAssets()\n\n if (!importAssets.hasSecrets) {\n return\n }\n\n if (importAssets.dialogOpen) {\n // eslint-disable-next-line consistent-return\n return <ImportVideosDialog {...importAssets} />\n }\n\n // eslint-disable-next-line consistent-return\n return <Button mode=\"bleed\" text=\"Import from Mux\" onClick={importAssets.openDialog} />\n}\n","import {SortIcon} from '@sanity/icons'\nimport {Button, Menu, MenuButton, MenuItem, PopoverProps} from '@sanity/ui'\nimport {useId} from 'react'\n\nimport {ASSET_SORT_OPTIONS, SortOption} from '../hooks/useAssets'\n\nexport const CONTEXT_MENU_POPOVER_PROPS: PopoverProps = {\n constrainSize: true,\n placement: 'bottom',\n portal: true,\n width: 0,\n}\n\n/**\n * @sanity/ui components adapted from:\n * https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/pane/PaneContextMenuButton.tsx#L19\n */\nexport function SelectSortOptions(props: {sort: SortOption; setSort: (s: SortOption) => void}) {\n const id = useId()\n\n return (\n <MenuButton\n button={\n <Button text=\"Sort\" icon={SortIcon} mode=\"bleed\" padding={3} style={{cursor: 'pointer'}} />\n }\n id={id}\n menu={\n <Menu>\n {Object.entries(ASSET_SORT_OPTIONS).map(([type, {label}]) => (\n <MenuItem\n key={type}\n data-as=\"button\"\n onClick={() => props.setSort(type as SortOption)}\n padding={3}\n tone=\"default\"\n text={label}\n pressed={type === props.sort}\n />\n ))}\n </Menu>\n }\n popover={CONTEXT_MENU_POPOVER_PROPS}\n />\n )\n}\n","import {Box, Spinner} from '@sanity/ui'\n\nconst SpinnerBox: React.FC = () => (\n <Box\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '150px',\n }}\n >\n <Spinner />\n </Box>\n)\n\nexport default SpinnerBox\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 <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 </Stack>\n </Box>\n </Flex>\n <div>{children}</div>\n </Stack>\n )\n}\n\nexport default memo(FormField)\n","import {Flex, Text} from '@sanity/ui'\n\nconst IconInfo: React.FC<{\n text: string\n icon: React.FC\n size?: number\n muted?: boolean\n}> = (props) => {\n const Icon = props.icon\n return (\n <Flex gap={2} align=\"center\" padding={1}>\n <Text size={(props.size || 1) + 1} muted>\n <Icon />\n </Text>\n <Text size={props.size || 1} muted={props.muted}>\n {props.text}\n </Text>\n </Flex>\n )\n}\n\nexport default IconInfo\n","import type {SVGProps} from 'react'\n\nexport function ResolutionIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20 9V6h-3V4h5v5h-2ZM2 9V4h5v2H4v3H2Zm15 11v-2h3v-3h2v5h-5ZM2 20v-5h2v3h3v2H2Zm4-4V8h12v8H6Zm2-2h8v-4H8v4Zm0 0v-4v4Z\"\n />\n </svg>\n )\n}\n","import type {SVGProps} from 'react'\n\nexport function StopWatchIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 512 512\"\n {...props}\n >\n <path d=\"M232 306.667h48V176h-48v130.667z\" fill=\"currentColor\" />\n <path\n d=\"M407.67 170.271l30.786-30.786-33.942-33.941-30.785 30.786C341.217 111.057 300.369 96 256 96 149.961 96 64 181.961 64 288s85.961 192 192 192 192-85.961 192-192c0-44.369-15.057-85.217-40.33-117.729zm-45.604 223.795C333.734 422.398 296.066 438 256 438s-77.735-15.602-106.066-43.934C121.602 365.735 106 328.066 106 288s15.602-77.735 43.934-106.066C178.265 153.602 215.934 138 256 138s77.734 15.602 106.066 43.934C390.398 210.265 406 247.934 406 288s-15.602 77.735-43.934 106.066z\"\n fill=\"currentColor\"\n />\n <path d=\"M192 32h128v48H192z\" fill=\"currentColor\" />\n </svg>\n )\n}\n","import React, {createContext, useContext} from 'react'\n\nimport {type DialogState, type SetDialogState} from '../hooks/useDialogState'\n\ntype DialogStateContextProps = {\n dialogState: DialogState\n setDialogState: SetDialogState\n}\n\nconst DialogStateContext = createContext<DialogStateContextProps>({\n dialogState: false,\n setDialogState: () => {\n return null\n },\n})\n\ninterface DialogStateProviderProps extends DialogStateContextProps {\n children: React.ReactNode\n}\n\nexport const DialogStateProvider = ({\n dialogState,\n setDialogState,\n children,\n}: DialogStateProviderProps) => {\n return (\n <DialogStateContext.Provider value={{dialogState, setDialogState}}>\n {children}\n </DialogStateContext.Provider>\n )\n}\n\nexport const useDialogStateContext = () => {\n const context = useContext(DialogStateContext)\n return context\n}\n","import type {SanityClient} from 'sanity'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxVideoUrl, VideoAssetDocument} from './types'\n\ninterface VideoSrcOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getVideoSrc({asset, client}: VideoSrcOptions): MuxVideoUrl {\n const playbackId = getPlaybackId(asset)\n const searchParams = new URLSearchParams()\n\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 'v')\n searchParams.set('token', token)\n }\n\n return `https://stream.mux.com/${playbackId}.m3u8?${searchParams}`\n}\n","import { useState, useEffect } from 'react';\n\n/**\r\n * Get the device pixel ratio, potentially rounded and capped.\r\n * Will emit new values if it changes.\r\n *\r\n * @param options\r\n * @returns The current device pixel ratio, or the default if none can be resolved\r\n */\n\nfunction useDevicePixelRatio(options) {\n const dpr = getDevicePixelRatio(options);\n const [currentDpr, setCurrentDpr] = useState(dpr);\n const {\n defaultDpr,\n maxDpr,\n round\n } = options || {};\n useEffect(() => {\n const canListen = typeof window !== 'undefined' && 'matchMedia' in window;\n\n if (!canListen) {\n return;\n }\n\n const updateDpr = () => setCurrentDpr(getDevicePixelRatio({\n defaultDpr,\n maxDpr,\n round\n }));\n\n const mediaMatcher = window.matchMedia(`screen and (resolution: ${currentDpr}dppx)`); // Safari 13.1 does not have `addEventListener`, but does have `addListener`\n\n if (mediaMatcher.addEventListener) {\n mediaMatcher.addEventListener('change', updateDpr);\n } else {\n mediaMatcher.addListener(updateDpr);\n }\n\n return () => {\n if (mediaMatcher.removeEventListener) {\n mediaMatcher.removeEventListener('change', updateDpr);\n } else {\n mediaMatcher.removeListener(updateDpr);\n }\n };\n }, [currentDpr, defaultDpr, maxDpr, round]);\n return currentDpr;\n}\n/**\r\n * Returns the current device pixel ratio (DPR) given the passed options\r\n *\r\n * @param options\r\n * @returns current device pixel ratio\r\n */\n\nfunction getDevicePixelRatio(options) {\n const {\n defaultDpr = 1,\n maxDpr = 3,\n round = true\n } = options || {};\n const hasDprProp = typeof window !== 'undefined' && typeof window.devicePixelRatio === 'number';\n const dpr = hasDprProp ? window.devicePixelRatio : defaultDpr;\n const rounded = Math.min(Math.max(1, round ? Math.floor(dpr) : dpr), maxDpr);\n return rounded;\n}\n\nexport { getDevicePixelRatio, useDevicePixelRatio };\n//# sourceMappingURL=index.module.js.map\n","/* eslint-disable */\n// From: https://stackoverflow.com/a/11486026/10433647\nexport function formatSeconds(seconds: number): string {\n if (typeof seconds !== 'number' || Number.isNaN(seconds)) {\n return ''\n }\n // Hours, minutes and seconds\n const hrs = ~~(seconds / 3600)\n const mins = ~~((seconds % 3600) / 60)\n const secs = ~~seconds % 60\n\n // Output like \"1:01\" or \"4:03:59\" or \"123:03:59\"\n let ret = ''\n\n if (hrs > 0) {\n ret += '' + hrs + ':' + (mins < 10 ? '0' : '')\n }\n\n ret += '' + mins + ':' + (secs < 10 ? '0' : '')\n ret += '' + secs\n return ret\n}\n\n// Output like \"05:14:01\"\nexport function formatSecondsToHHMMSS(seconds: number): string {\n const hrs = Math.floor(seconds / 3600)\n .toString()\n .padStart(2, '0')\n const mins = Math.floor((seconds % 3600) / 60)\n .toString()\n .padStart(2, '0')\n const secs = Math.floor(seconds % 60)\n .toString()\n .padStart(2, '0')\n\n return `${hrs}:${mins}:${secs}`\n}\n\n// Checks if time has a HH:MM:SS format like \"05:14:01\"\nexport function isValidTimeFormat(time: string) {\n const regex = /^([0-1]?[0-9]|2[0-3]):([0-5]?[0-9]):([0-5]?[0-9])$/\n return regex.test(time) || time === ''\n}\n\n// Converts a time like \"05:14:01\" to seconds\nexport function getSecondsFromTimeFormat(time: string): number {\n const [hh = 0, mm = 0, ss = 0] = time.split(':').map(Number)\n return hh * 3600 + mm * 60 + ss\n}\n","import {Button, Dialog, Flex, Stack, Text, TextInput} from '@sanity/ui'\nimport React, {useId, useMemo, useState} from 'react'\nimport {getDevicePixelRatio} from 'use-device-pixel-ratio'\n\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport {useClient} from '../hooks/useClient'\nimport {\n formatSecondsToHHMMSS,\n getSecondsFromTimeFormat,\n isValidTimeFormat,\n} from '../util/formatSeconds'\nimport type {VideoAssetDocument} from '../util/types'\nimport VideoThumbnail from './VideoThumbnail'\n\nexport interface Props {\n asset: VideoAssetDocument\n currentTime?: number\n}\n\nexport default function EditThumbnailDialog({asset, currentTime = 0}: Props) {\n const client = useClient()\n\n const {setDialogState} = useDialogStateContext()\n const dialogId = `EditThumbnailDialog${useId()}`\n\n const [timeFormatted, setTimeFormatted] = useState<string>(() =>\n formatSecondsToHHMMSS(currentTime)\n )\n const [nextTime, setNextTime] = useState<number>(currentTime)\n const [inputError, setInputError] = useState<string>('')\n\n const assetWithNewThumbnail = useMemo(() => ({...asset, thumbTime: nextTime}), [asset, nextTime])\n const [saving, setSaving] = useState(false)\n const [saveThumbnailError, setSaveThumbnailError] = useState<Error | null>(null)\n const handleSave = () => {\n setSaving(true)\n client\n .patch(asset._id!)\n .set({thumbTime: nextTime})\n .commit({returnDocuments: false})\n .then(() => void setDialogState(false))\n .catch(setSaveThumbnailError)\n .finally(() => void setSaving(false))\n }\n const width = 300 * getDevicePixelRatio({maxDpr: 2})\n\n if (saveThumbnailError) {\n // eslint-disable-next-line no-warning-comments\n // @TODO handle errors more gracefully\n throw saveThumbnailError\n }\n\n const handleInputChange = (event: React.FormEvent<HTMLInputElement>) => {\n const value = event.currentTarget.value\n setTimeFormatted(value)\n\n if (isValidTimeFormat(value)) {\n setInputError('')\n const totalSeconds = getSecondsFromTimeFormat(value)\n setNextTime(totalSeconds)\n } else {\n setInputError('Invalid time format')\n }\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 disabled={inputError !== ''}\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} staticImage />\n </Stack>\n <Stack space={2}>\n <Text size={1} weight=\"semibold\">\n New:\n </Text>\n <VideoThumbnail asset={assetWithNewThumbnail} width={width} staticImage />\n </Stack>\n\n <Stack space={2}>\n <Flex align={'center'} justify={'center'}>\n <Text size={5} weight=\"semibold\">\n Or\n </Text>\n </Flex>\n </Stack>\n\n <Stack space={2}>\n <Text size={1} weight=\"semibold\">\n Selected time for thumbnail (hh:mm:ss):\n </Text>\n <TextInput\n size={1}\n value={timeFormatted}\n placeholder=\"hh:mm:ss\"\n onChange={handleInputChange}\n customValidity={inputError}\n />\n </Stack>\n </Stack>\n </Dialog>\n )\n}\n","import MuxPlayer, {type MuxPlayerProps, type MuxPlayerRefAttributes} from '@mux/mux-player-react'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Card, Text} from '@sanity/ui'\nimport {type PropsWithChildren, useMemo, useRef} from 'react'\n\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport {useClient} from '../hooks/useClient'\nimport {AUDIO_ASPECT_RATIO, MIN_ASPECT_RATIO} from '../util/constants'\nimport {getPosterSrc} from '../util/getPosterSrc'\nimport {getVideoSrc} from '../util/getVideoSrc'\nimport type {VideoAssetDocument} from '../util/types'\nimport EditThumbnailDialog from './EditThumbnailDialog'\n\nexport default function VideoPlayer({\n asset,\n thumbnailWidth = 250,\n children,\n ...props\n}: PropsWithChildren<\n {asset: VideoAssetDocument; thumbnailWidth?: number; forceAspectRatio?: number} & Partial<\n Pick<MuxPlayerProps, 'autoPlay'>\n >\n>) {\n const client = useClient()\n const {dialogState} = useDialogStateContext()\n\n const isAudio = assetIsAudio(asset)\n const muxPlayer = useRef<MuxPlayerRefAttributes>(null)\n const thumbnail = getPosterSrc({asset, client, width: thumbnailWidth})\n\n const {src: videoSrc, error} = useMemo(() => {\n try {\n const src = asset?.playbackId && getVideoSrc({client, asset})\n if (src) return {src: src}\n\n return {error: new TypeError('Asset has no playback ID')}\n // eslint-disable-next-line @typescript-eslint/no-shadow\n } catch (error) {\n return {error}\n }\n }, [asset, client])\n\n const signedToken = useMemo(() => {\n try {\n const url = new URL(videoSrc!)\n return url.searchParams.get('token')\n } catch {\n return false\n }\n }, [videoSrc])\n\n const [width, height] = (asset?.data?.aspect_ratio ?? '16:9').split(':').map(Number)\n const targetAspectRatio =\n props.forceAspectRatio || (Number.isNaN(width) ? 16 / 9 : width / height)\n let aspectRatio = Math.max(MIN_ASPECT_RATIO, targetAspectRatio)\n if (isAudio) {\n aspectRatio = props.forceAspectRatio\n ? // Make it wider when forcing aspect ratio to balance with videos' rendering height (audio players overflow a bit)\n props.forceAspectRatio * 1.2\n : AUDIO_ASPECT_RATIO\n }\n\n return (\n <>\n <Card tone=\"transparent\" style={{aspectRatio: aspectRatio, position: 'relative'}}>\n {videoSrc && (\n <>\n <MuxPlayer\n poster={thumbnail}\n ref={muxPlayer}\n {...props}\n playsInline\n playbackId={asset.playbackId}\n tokens={\n signedToken\n ? {playback: signedToken, thumbnail: signedToken, storyboard: signedToken}\n : undefined\n }\n preload=\"metadata\"\n crossOrigin=\"anonymous\"\n metadata={{\n player_name: 'Sanity Admin Dashboard',\n player_version: process.env.PKG_VERSION,\n page_type: 'Preview Player',\n }}\n audio={isAudio}\n style={{\n height: '100%',\n width: '100%',\n display: 'block',\n objectFit: 'contain',\n }}\n />\n {children}\n </>\n )}\n {error ? (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n }}\n >\n <Text muted>\n <ErrorOutlineIcon style={{marginRight: '0.15em'}} />\n {typeof error === 'object' && 'message' in error && typeof error.message === 'string'\n ? error.message\n : 'Error loading video'}\n </Text>\n </div>\n ) : null}\n {children}\n </Card>\n\n {dialogState === 'edit-thumbnail' && (\n <EditThumbnailDialog asset={asset} currentTime={muxPlayer?.current?.currentTime} />\n )}\n </>\n )\n}\n\nexport function assetIsAudio(asset: VideoAssetDocument) {\n return asset.data?.max_stored_resolution === 'Audio only'\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\n\nexport function deleteAssetOnMux(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 async function deleteAsset({\n client,\n asset,\n deleteOnMux,\n}: {\n client: SanityClient\n asset: VideoAssetDocument\n deleteOnMux: boolean\n}) {\n if (!asset?._id) return true\n\n try {\n await client.delete(asset._id)\n } catch (error) {\n return 'failed-sanity'\n }\n\n if (deleteOnMux && asset?.assetId) {\n try {\n await deleteAssetOnMux(client, asset.assetId)\n } catch (error) {\n return 'failed-mux'\n }\n }\n\n return true\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","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/MissingSchemaType.tsx\nimport {WarningOutlineIcon} from '@sanity/icons'\nimport type {SanityDocument} from 'sanity'\nimport type {GeneralPreviewLayoutKey} from 'sanity'\nimport {SanityDefaultPreview} from 'sanity'\n\nexport interface MissingSchemaTypeProps {\n layout?: GeneralPreviewLayoutKey\n value: SanityDocument\n}\n\nconst getUnknownTypeFallback = (id: string, typeName: string) => ({\n title: (\n <em>\n No schema found for type <code>{typeName}</code>\n </em>\n ),\n subtitle: (\n <em>\n Document: <code>{id}</code>\n </em>\n ),\n media: () => <WarningOutlineIcon />,\n})\n\nexport function MissingSchemaType(props: MissingSchemaTypeProps) {\n const {layout, value} = props\n\n return (\n <SanityDefaultPreview {...getUnknownTypeFallback(value._id, value._type)} layout={layout} />\n )\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/TimeAgo.tsx\nimport {useTimeAgo} from 'sanity'\n\nexport interface TimeAgoProps {\n time: string | Date\n}\n\nexport function TimeAgo({time}: TimeAgoProps) {\n const timeAgo = useTimeAgo(time)\n\n return <span title={timeAgo}>{timeAgo} ago</span>\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/DraftStatus.tsx\nimport {EditIcon} from '@sanity/icons'\nimport {Box, Text, Tooltip} from '@sanity/ui'\nimport type {PreviewValue, SanityDocument} from 'sanity'\nimport {TextWithTone} from 'sanity'\n\nimport {TimeAgo} from './TimeAgo'\n\nexport function DraftStatus(props: {document?: PreviewValue | Partial<SanityDocument> | null}) {\n const {document} = props\n const updatedAt = document && '_updatedAt' in document && document._updatedAt\n\n return (\n <Tooltip\n animate\n portal\n content={\n <Box padding={2}>\n <Text size={1}>\n {document ? (\n <>Edited {updatedAt && <TimeAgo time={updatedAt} />}</>\n ) : (\n <>No unpublished edits</>\n )}\n </Text>\n </Box>\n }\n >\n <TextWithTone tone=\"caution\" dimmed={!document} muted={!document} size={1}>\n <EditIcon />\n </TextWithTone>\n </Tooltip>\n )\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/PublishedStatus.tsx\n\nimport {PublishIcon} from '@sanity/icons'\nimport {Box, Text, Tooltip} from '@sanity/ui'\nimport type {PreviewValue, SanityDocument} from 'sanity'\nimport {TextWithTone} from 'sanity'\n\nimport {TimeAgo} from './TimeAgo'\n\nexport function PublishedStatus(props: {document?: PreviewValue | Partial<SanityDocument> | null}) {\n const {document} = props\n const updatedAt = document && '_updatedAt' in document && document._updatedAt\n\n return (\n <Tooltip\n animate\n portal\n content={\n <Box padding={2}>\n <Text size={1}>\n {document ? (\n <>Published {updatedAt && <TimeAgo time={updatedAt} />}</>\n ) : (\n <>Not published</>\n )}\n </Text>\n </Box>\n }\n >\n <TextWithTone tone=\"positive\" dimmed={!document} muted={!document} size={1}>\n <PublishIcon />\n </TextWithTone>\n </Tooltip>\n )\n}\n","// Adapted from:\n// https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/paneItem/PaneItemPreview.tsx\nimport {Inline} from '@sanity/ui'\nimport {isNumber, isString} from 'lodash'\nimport {isValidElement, useMemo} from 'react'\nimport {useObservable} from 'react-rx'\nimport type {SanityDocument, SchemaType} from 'sanity'\nimport type {PreviewValue} from 'sanity'\nimport {\n type DocumentPresence,\n DocumentPreviewPresence,\n type DocumentPreviewStore,\n type GeneralPreviewLayoutKey,\n getPreviewStateObservable,\n getPreviewValueWithFallback,\n isRecord,\n SanityDefaultPreview,\n} from 'sanity'\n\nimport {DraftStatus} from './DraftStatus'\nimport {PublishedStatus} from './PublishedStatus'\n\nexport interface PaneItemPreviewState {\n isLoading?: boolean\n draft?: PreviewValue | Partial<SanityDocument> | null\n published?: PreviewValue | Partial<SanityDocument> | null\n}\n\nexport interface PaneItemPreviewProps {\n documentPreviewStore: DocumentPreviewStore\n icon: React.ComponentType | false\n layout: GeneralPreviewLayoutKey\n presence?: DocumentPresence[]\n schemaType: SchemaType\n value: SanityDocument\n}\n\nexport function PaneItemPreview(props: PaneItemPreviewProps) {\n const {icon, layout, presence, schemaType, value} = props\n const title =\n (isRecord(value.title) && isValidElement(value.title)) ||\n isString(value.title) ||\n isNumber(value.title)\n ? value.title\n : null\n\n const observable = useMemo(\n () => getPreviewStateObservable(props.documentPreviewStore, schemaType, value._id, title),\n [props.documentPreviewStore, schemaType, title, value._id]\n )\n const {draft, published, isLoading} = useObservable(observable, {\n draft: null,\n published: null,\n isLoading: true,\n })\n\n const status = isLoading ? null : (\n <Inline space={4}>\n {presence && presence.length > 0 && <DocumentPreviewPresence presence={presence} />}\n <PublishedStatus document={published} />\n <DraftStatus document={draft} />\n </Inline>\n )\n\n return (\n <SanityDefaultPreview\n {...(getPreviewValueWithFallback({value, draft, published}) as any)}\n isPlaceholder={isLoading}\n icon={icon}\n layout={layout}\n status={status}\n />\n )\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/paneItem/PaneItem.tsx\n\nimport {DocumentIcon} from '@sanity/icons'\nimport type {PropsWithChildren} from 'react'\nimport React, {useMemo} from 'react'\nimport type {SanityDocument} from 'sanity'\nimport type {CollatedHit, FIXME, SchemaType} from 'sanity'\nimport {PreviewCard, useDocumentPresence, useDocumentPreviewStore, useSchema} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\nimport {IntentLink} from 'sanity/router'\n\nimport {PluginPlacement} from '../../util/types'\nimport {MissingSchemaType} from './MissingSchemaType'\nimport {PaneItemPreview} from './PaneItemPreview'\n\ninterface DocumentPreviewProps {\n schemaType?: SchemaType\n documentPair: CollatedHit<SanityDocument>\n placement?: PluginPlacement\n}\n\n/**\n * Return `false` if we explicitly disable the icon.\n * Otherwise return the passed icon or the schema type icon as a backup.\n */\nexport function getIconWithFallback(\n icon: React.ComponentType<any> | false | undefined,\n schemaType: SchemaType | undefined,\n defaultIcon: React.ComponentType<any>\n): React.ComponentType<any> | false {\n if (icon === false) {\n return false\n }\n\n return icon || ((schemaType && schemaType.icon) as any) || defaultIcon || false\n}\n\n/** When inside the field input, we can open the reference on a child pane */\nfunction DocumentPreviewInInput(props: PropsWithChildren<DocumentPreviewProps>) {\n const {ChildLink} = usePaneRouter()\n\n return (linkProps: PropsWithChildren) => (\n <ChildLink\n childId={props.documentPair.id}\n // Pass the schemaType of the document so `paneChild` in `buildPagesStructure` can access it\n childParameters={{type: props.documentPair.type}}\n >\n {linkProps.children}\n </ChildLink>\n )\n}\n\n/** When inside the tool, we must use a regular intent link to take users to the desk tool */\nfunction DocumentPreviewInRool(props: DocumentPreviewProps) {\n return (linkProps: PropsWithChildren) => (\n <IntentLink intent=\"edit\" params={{id: props.documentPair.id}}>\n {linkProps.children}\n </IntentLink>\n )\n}\n\nexport function DocumentPreview(props: DocumentPreviewProps) {\n const {schemaType, documentPair} = props\n const doc = documentPair?.draft || documentPair?.published\n const id = documentPair.id || ''\n const documentPreviewStore = useDocumentPreviewStore()\n const schema = useSchema()\n const documentPresence = useDocumentPresence(id)\n const hasSchemaType = Boolean(schemaType && schemaType.name && schema.get(schemaType.name))\n\n const PreviewComponent = useMemo(() => {\n if (!doc) return null\n\n if (!schemaType || !hasSchemaType) {\n return <MissingSchemaType value={doc as SanityDocument} />\n }\n\n return (\n <PaneItemPreview\n documentPreviewStore={documentPreviewStore}\n icon={getIconWithFallback(undefined, schemaType, DocumentIcon)}\n schemaType={schemaType}\n layout=\"default\"\n value={doc}\n presence={documentPresence}\n />\n )\n }, [hasSchemaType, schemaType, documentPresence, doc, documentPreviewStore])\n\n return (\n <PreviewCard\n __unstable_focusRing\n as={\n (props.placement === 'input'\n ? DocumentPreviewInInput(props)\n : DocumentPreviewInRool(props)) as FIXME\n }\n data-as=\"a\"\n data-ui=\"PaneItem\"\n padding={2}\n radius={2}\n tone=\"inherit\"\n >\n {PreviewComponent}\n </PreviewCard>\n )\n}\n","import type {SanityDocument} from '@sanity/client'\nimport {Box, Card, Text} from '@sanity/ui'\nimport {collate, useSchema} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport type {PluginPlacement} from '../../util/types'\nimport {DocumentPreview} from '../documentPreview/DocumentPreview'\nimport SpinnerBox from '../SpinnerBox'\n\nconst Container = styled(Box)`\n * {\n color: ${(props: any) => props.theme.sanity.color.base.fg};\n }\n a {\n text-decoration: none;\n }\n h2 {\n font-size: ${(props: any) => props.theme.sanity.fonts.text.sizes[1]};\n }\n`\n\nconst VideoReferences: React.FC<{\n references?: SanityDocument[]\n isLoaded: boolean\n placement: PluginPlacement\n}> = (props) => {\n const schema = useSchema()\n if (!props.isLoaded) {\n return <SpinnerBox />\n }\n\n if (!props.references?.length) {\n return (\n <Card border radius={3} padding={3}>\n <Text size={2}>No documents are using this video</Text>\n </Card>\n )\n }\n\n const documentPairs = collate(props.references || [])\n return (\n <Container>\n {documentPairs?.map((documentPair) => {\n const schemaType = schema.get(documentPair.type)\n\n return (\n <Card\n key={documentPair.id}\n marginBottom={2}\n padding={2}\n radius={2}\n shadow={1}\n style={{overflow: 'hidden'}}\n >\n <Box>\n <DocumentPreview\n documentPair={documentPair}\n schemaType={schemaType}\n placement={props.placement}\n />\n </Box>\n </Card>\n )\n })}\n </Container>\n )\n}\n\nexport default VideoReferences\n","import {TrashIcon} from '@sanity/icons'\nimport {Box, Button, Card, Checkbox, Dialog, Flex, Heading, Stack, Text, useToast} from '@sanity/ui'\nimport {useEffect, useState} from 'react'\nimport type {SanityDocument} from 'sanity'\n\nimport {deleteAsset} from '../../actions/assets'\nimport {useClient} from '../../hooks/useClient'\nimport {DIALOGS_Z_INDEX} from '../../util/constants'\nimport type {PluginPlacement, VideoAssetDocument} from '../../util/types'\nimport SpinnerBox from '../SpinnerBox'\nimport VideoReferences from './VideoReferences'\n\nexport default function DeleteDialog({\n asset,\n references,\n referencesLoading,\n cancelDelete,\n placement,\n succeededDeleting,\n}: {\n asset: VideoAssetDocument\n placement: PluginPlacement\n references?: SanityDocument[]\n referencesLoading: boolean\n cancelDelete: () => void\n succeededDeleting: () => void\n}) {\n const client = useClient()\n const [state, setState] = useState<\n 'processing_deletion' | 'checkingReferences' | 'error_deleting' | 'cantDelete' | 'confirm'\n >('checkingReferences')\n const [deleteOnMux, setDeleteOnMux] = useState(true)\n const toast = useToast()\n\n useEffect(() => {\n if (state !== 'checkingReferences' || referencesLoading) return\n\n setState(references?.length ? 'cantDelete' : 'confirm')\n }, [state, references, referencesLoading])\n\n async function confirmDelete() {\n if (state !== 'confirm') return\n\n setState('processing_deletion')\n const worked = await deleteAsset({client, asset, deleteOnMux})\n if (worked === true) {\n toast.push({title: 'Successfully deleted video', status: 'success'})\n succeededDeleting()\n } else if (worked === 'failed-mux') {\n toast.push({\n title: 'Deleted video in Sanity',\n description: \"But it wasn't deleted in Mux\",\n status: 'warning',\n })\n succeededDeleting()\n } else {\n toast.push({title: 'Failed deleting video', status: 'error'})\n\n setState('error_deleting')\n }\n }\n\n return (\n <Dialog\n animate\n header={'Delete video'}\n zOffset={DIALOGS_Z_INDEX}\n id=\"deleting-video-details-dialog\"\n onClose={cancelDelete}\n onClickOutside={cancelDelete}\n width={1}\n position=\"fixed\"\n >\n <Card\n padding={3}\n style={{\n minHeight: '150px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Stack space={3}>\n {state === 'checkingReferences' && (\n <>\n <Heading size={2}>Checking if video can be deleted</Heading>\n <SpinnerBox />\n </>\n )}\n {state === 'cantDelete' && (\n <>\n <Heading size={2}>Video can't be deleted</Heading>\n <Text size={2} style={{marginBottom: '2rem'}}>\n There are {references?.length} document{references && references.length > 0 && 's'}{' '}\n pointing to this video. Remove their references to this file or delete them before\n proceeding.\n </Text>\n <VideoReferences\n references={references}\n isLoaded={!referencesLoading}\n placement={placement}\n />\n </>\n )}\n {state === 'confirm' && (\n <>\n <Heading size={2}>Are you sure you want to delete this video?</Heading>\n <Text size={2}>This action is irreversible</Text>\n <Stack space={4} marginY={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 <Box>\n <Button\n icon={TrashIcon}\n fontSize={2}\n padding={3}\n text=\"Delete video\"\n tone=\"critical\"\n onClick={confirmDelete}\n disabled={['processing_deletion', 'checkingReferences', 'cantDelete'].some(\n (s) => s === state\n )}\n />\n </Box>\n </Stack>\n </>\n )}\n {state === 'processing_deletion' && (\n <>\n <Heading size={2}>Deleting video...</Heading>\n <SpinnerBox />\n </>\n )}\n {state === 'error_deleting' && (\n <>\n <Heading size={2}>Something went wrong!</Heading>\n <Text size={2}>Try deleting the video again by clicking the button below</Text>\n </>\n )}\n </Stack>\n </Card>\n </Dialog>\n )\n}\n","import {createHookFromObservableFactory, DocumentStore, SanityDocument} from 'sanity'\n\nimport {SANITY_API_VERSION} from './useClient'\n\nconst useDocReferences = createHookFromObservableFactory<\n SanityDocument[],\n {\n documentStore: DocumentStore\n id: string\n }\n>(({documentStore, id}) => {\n return documentStore.listenQuery(\n /* groq */ '*[references($id)]{_id, _type, _rev, _updatedAt, _createdAt}',\n {id},\n {\n apiVersion: SANITY_API_VERSION,\n }\n )\n})\n\nexport default useDocReferences\n","import {formatSeconds} from './formatSeconds'\nimport {VideoAssetDocument} from './types'\n\nexport default function getVideoMetadata(doc: VideoAssetDocument) {\n const id = doc.assetId || doc._id || ''\n const date = doc.data?.created_at\n ? new Date(Number(doc.data.created_at) * 1000)\n : new Date(doc._createdAt || doc._updatedAt || Date.now())\n\n return {\n title: doc.filename || id.slice(0, 12),\n id: id,\n playbackId: doc.playbackId,\n createdAt: date,\n duration: doc.data?.duration ? formatSeconds(doc.data?.duration) : undefined,\n aspect_ratio: doc.data?.aspect_ratio,\n max_stored_resolution: doc.data?.max_stored_resolution,\n max_stored_frame_rate: doc.data?.max_stored_frame_rate,\n }\n}\n","import {useToast} from '@sanity/ui'\nimport {useState} from 'react'\nimport {useDocumentStore} from 'sanity'\n\nimport {useClient} from '../../hooks/useClient'\nimport useDocReferences from '../../hooks/useDocReferences'\nimport getVideoMetadata from '../../util/getVideoMetadata'\nimport {PluginPlacement, VideoAssetDocument} from '../../util/types'\n\nexport interface VideoDetailsProps {\n placement: PluginPlacement\n closeDialog: () => void\n asset: VideoAssetDocument & {autoPlay?: boolean}\n}\n\nexport default function useVideoDetails(props: VideoDetailsProps) {\n const documentStore = useDocumentStore()\n const toast = useToast()\n const client = useClient()\n const [references, referencesLoading] = useDocReferences({\n documentStore,\n id: props.asset._id as string,\n })\n\n const [originalAsset, setOriginalAsset] = useState(() => props.asset)\n const [filename, setFilename] = useState(props.asset.filename)\n const modified = filename !== originalAsset.filename\n\n const displayInfo = getVideoMetadata({...props.asset, filename})\n\n const [state, setState] = useState<'deleting' | 'closing' | 'idle' | 'saving'>('idle')\n\n function handleClose() {\n if (state !== 'idle') return\n\n if (modified) {\n setState('closing')\n return\n }\n\n props.closeDialog()\n }\n\n function confirmClose(shouldClose: boolean) {\n if (state !== 'closing') return\n\n if (shouldClose) props.closeDialog()\n\n setState('idle')\n }\n\n async function saveChanges() {\n if (state !== 'idle') return\n setState('saving')\n\n try {\n await client.patch(props.asset._id).set({filename}).commit()\n setOriginalAsset((prev) => ({...prev, filename}))\n toast.push({\n title: 'Video title updated',\n description: `New title: ${filename}`,\n status: 'success',\n })\n props.closeDialog()\n } catch (error) {\n toast.push({\n title: 'Failed updating file name',\n status: 'error',\n description: typeof error === 'string' ? error : 'Please try again',\n })\n setFilename(originalAsset.filename)\n }\n\n setState('idle')\n }\n\n return {\n references,\n referencesLoading,\n modified,\n filename,\n setFilename,\n displayInfo,\n state,\n setState,\n handleClose,\n confirmClose,\n saveChanges,\n }\n}\n","import {\n CalendarIcon,\n CheckmarkIcon,\n ClockIcon,\n CropIcon,\n EditIcon,\n ErrorOutlineIcon,\n RevertIcon,\n SearchIcon,\n TagIcon,\n TrashIcon,\n} from '@sanity/icons'\nimport {\n Button,\n Card,\n Dialog,\n Flex,\n Heading,\n Spinner,\n Stack,\n Tab,\n TabList,\n TabPanel,\n Text,\n TextInput,\n} from '@sanity/ui'\nimport React, {useEffect, useState} from 'react'\n\nimport {DIALOGS_Z_INDEX} from '../../util/constants'\nimport FormField from '../FormField'\nimport IconInfo from '../IconInfo'\nimport {ResolutionIcon} from '../icons/Resolution'\nimport {StopWatchIcon} from '../icons/StopWatch'\nimport VideoPlayer from '../VideoPlayer'\nimport DeleteDialog from './DeleteDialog'\nimport useVideoDetails, {VideoDetailsProps} from './useVideoDetails'\nimport VideoReferences from './VideoReferences'\n\nconst AssetInput: React.FC<{\n label: string\n description?: string\n placeholder?: string\n value: string\n onInput: (e: React.FormEvent<HTMLInputElement>) => void\n disabled?: boolean\n}> = (props) => (\n <FormField title={props.label} description={props.description} inputId={props.label}>\n <TextInput\n id={props.label}\n value={props.value}\n placeholder={props.placeholder}\n onInput={props.onInput}\n disabled={props.disabled}\n />\n </FormField>\n)\n\nconst VideoDetails: React.FC<VideoDetailsProps> = (props) => {\n const [tab, setTab] = useState<'details' | 'references'>('details')\n const {\n displayInfo,\n filename,\n modified,\n references,\n referencesLoading,\n setFilename,\n state,\n setState,\n handleClose,\n confirmClose,\n saveChanges,\n } = useVideoDetails(props)\n\n const isSaving = state === 'saving'\n\n // Avoid layout shifts in large screens' 2-column dialog by setting their `minHeight` to the container's\n const [containerHeight, setContainerHeight] = useState<number | null>(null)\n const contentsRef = React.useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!contentsRef.current || !('getBoundingClientRect' in contentsRef.current)) return\n\n setContainerHeight(contentsRef.current.getBoundingClientRect().height)\n }, [])\n\n return (\n <Dialog\n animate\n header={displayInfo.title}\n zOffset={DIALOGS_Z_INDEX}\n id=\"video-details-dialog\"\n onClose={handleClose}\n onClickOutside={handleClose}\n width={2}\n position=\"fixed\"\n footer={\n <Card padding={3}>\n <Flex justify=\"space-between\" align=\"center\">\n <Button\n icon={TrashIcon}\n fontSize={2}\n padding={3}\n mode=\"bleed\"\n text=\"Delete\"\n tone=\"critical\"\n onClick={() => setState('deleting')}\n disabled={isSaving}\n />\n {modified && (\n <Button\n icon={CheckmarkIcon}\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text=\"Save and close\"\n tone=\"positive\"\n onClick={saveChanges}\n iconRight={isSaving && Spinner}\n disabled={isSaving}\n />\n )}\n </Flex>\n </Card>\n }\n >\n {/* DELETION DIALOG */}\n {state === 'deleting' && (\n <DeleteDialog\n asset={props.asset}\n cancelDelete={() => setState('idle')}\n placement={props.placement}\n referencesLoading={referencesLoading}\n references={references}\n succeededDeleting={() => {\n props.closeDialog()\n }}\n />\n )}\n\n {/* CONFIRM CLOSING DIALOG */}\n {state === 'closing' && (\n <Dialog\n animate\n header={'You have unsaved changes'}\n zOffset={DIALOGS_Z_INDEX}\n id=\"closing-video-details-dialog\"\n onClose={() => confirmClose(false)}\n onClickOutside={() => confirmClose(false)}\n width={1}\n position=\"fixed\"\n footer={\n <Card padding={3}>\n <Flex justify=\"space-between\" align=\"center\">\n <Button\n icon={ErrorOutlineIcon}\n fontSize={2}\n padding={3}\n text=\"Discard changes\"\n tone=\"critical\"\n onClick={() => confirmClose(true)}\n />\n {modified && (\n <Button\n icon={RevertIcon}\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text=\"Keep editing\"\n tone=\"primary\"\n onClick={() => confirmClose(false)}\n />\n )}\n </Flex>\n </Card>\n }\n >\n <Card padding={5}>\n <Stack style={{textAlign: 'center'}} space={3}>\n <Heading size={2}>Unsaved changes will be lost</Heading>\n <Text size={2}>Are you sure you want to discard them?</Text>\n </Stack>\n </Card>\n </Dialog>\n )}\n <Card\n padding={4}\n sizing=\"border\"\n style={{\n containerType: 'inline-size',\n }}\n >\n <Flex\n sizing=\"border\"\n gap={4}\n direction={['column', 'column', 'row']}\n align=\"flex-start\"\n ref={contentsRef}\n style={\n typeof containerHeight === 'number'\n ? {\n minHeight: containerHeight,\n }\n : undefined\n }\n >\n <Stack space={4} flex={1} sizing=\"border\">\n <VideoPlayer asset={props.asset} autoPlay={props.asset.autoPlay || false} />\n </Stack>\n <Stack space={4} flex={1} sizing=\"border\">\n <TabList space={2}>\n <Tab\n aria-controls=\"details-panel\"\n icon={EditIcon}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTab('details')}\n selected={tab === 'details'}\n />\n <Tab\n aria-controls=\"references-panel\"\n icon={SearchIcon}\n id=\"references-tab\"\n label={`Used by ${references ? `(${references.length})` : ''}`}\n onClick={() => setTab('references')}\n selected={tab === 'references'}\n />\n </TabList>\n <TabPanel\n aria-labelledby=\"details-tab\"\n id=\"details-panel\"\n hidden={tab !== 'details'}\n style={{wordBreak: 'break-word'}}\n >\n <Stack space={4}>\n <AssetInput\n label=\"Video title or file name\"\n description=\"Not visible to users. Useful for finding videos later.\"\n value={filename || ''}\n onInput={(e) => setFilename(e.currentTarget.value)}\n disabled={state !== 'idle'}\n />\n <Stack space={3}>\n {displayInfo?.duration && (\n <IconInfo\n text={`Duration: ${displayInfo.duration}`}\n icon={ClockIcon}\n size={2}\n />\n )}\n {displayInfo?.max_stored_resolution && (\n <IconInfo\n text={`Max Resolution: ${displayInfo.max_stored_resolution}`}\n icon={ResolutionIcon}\n size={2}\n />\n )}\n {displayInfo?.max_stored_frame_rate && (\n <IconInfo\n text={`Frame rate: ${displayInfo.max_stored_frame_rate}`}\n icon={StopWatchIcon}\n size={2}\n />\n )}\n {displayInfo?.aspect_ratio && (\n <IconInfo\n text={`Aspect Ratio: ${displayInfo.aspect_ratio}`}\n icon={CropIcon}\n size={2}\n />\n )}\n <IconInfo\n text={`Uploaded on: ${displayInfo.createdAt.toLocaleDateString('en', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n })}`}\n icon={CalendarIcon}\n size={2}\n />\n <IconInfo text={`Mux ID: \\n${displayInfo.id}`} icon={TagIcon} size={2} />\n {displayInfo?.playbackId && (\n <IconInfo\n text={`Playback ID: ${displayInfo.playbackId}`}\n icon={TagIcon}\n size={2}\n />\n )}\n </Stack>\n </Stack>\n </TabPanel>\n <TabPanel\n aria-labelledby=\"references-tab\"\n id=\"references-panel\"\n hidden={tab !== 'references'}\n >\n <VideoReferences\n references={references}\n isLoaded={!referencesLoading}\n placement={props.placement}\n />\n </TabPanel>\n </Stack>\n </Flex>\n </Card>\n </Dialog>\n )\n}\n\nexport default VideoDetails\n","import {CalendarIcon, ClockIcon, TagIcon} from '@sanity/icons'\nimport {Inline, Stack, Text} from '@sanity/ui'\n\nimport getVideoMetadata from '../util/getVideoMetadata'\nimport type {VideoAssetDocument} from '../util/types'\nimport IconInfo from './IconInfo'\n\nconst VideoMetadata = (props: {asset: VideoAssetDocument}) => {\n if (!props.asset) {\n return null\n }\n\n const displayInfo = getVideoMetadata(props.asset)\n return (\n <Stack space={2}>\n {displayInfo.title && (\n <Text\n size={1}\n weight=\"semibold\"\n style={{\n wordWrap: 'break-word',\n }}\n >\n {displayInfo.title}\n </Text>\n )}\n <Inline space={3}>\n {displayInfo?.duration && (\n <IconInfo text={displayInfo.duration} icon={ClockIcon} size={1} muted />\n )}\n <IconInfo\n text={displayInfo.createdAt.toISOString().split('T')[0]}\n icon={CalendarIcon}\n size={1}\n muted\n />\n {displayInfo.title != displayInfo.id.slice(0, 12) && (\n <IconInfo text={displayInfo.id.slice(0, 12)} icon={TagIcon} size={1} muted />\n )}\n </Inline>\n </Stack>\n )\n}\n\nexport default VideoMetadata\n","import {CheckmarkIcon, EditIcon, LockIcon, PlayIcon} from '@sanity/icons'\nimport {Button, Card, Stack, Text, Tooltip} from '@sanity/ui'\nimport React, {useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {THUMBNAIL_ASPECT_RATIO} from '../util/constants'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {VideoAssetDocument} from '../util/types'\nimport IconInfo from './IconInfo'\nimport VideoMetadata from './VideoMetadata'\nimport VideoPlayer, {assetIsAudio} from './VideoPlayer'\nimport VideoThumbnail from './VideoThumbnail'\n\nconst PlayButton = styled.button`\n display: block;\n padding: 0;\n margin: 0;\n border: none;\n border-radius: 0.1875rem;\n position: relative;\n cursor: pointer;\n\n &::after {\n content: '';\n background: var(--card-fg-color);\n opacity: 0;\n display: block;\n position: absolute;\n inset: 0;\n z-index: 10;\n transition: 0.15s ease-out;\n border-radius: inherit;\n }\n\n > div[data-play] {\n z-index: 11;\n opacity: 0;\n transition: 0.15s 0.05s ease-out;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n color: var(--card-fg-color);\n background: var(--card-bg-color);\n width: auto;\n height: 30%;\n aspect-ratio: 1;\n border-radius: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n > svg {\n display: block;\n width: 70%;\n height: auto;\n // Visual balance to center-align the icon\n transform: translateX(5%);\n }\n }\n\n &:hover,\n &:focus {\n &::after {\n opacity: 0.3;\n }\n > div[data-play] {\n opacity: 1;\n }\n }\n`\n\nexport default function VideoInBrowser({\n onSelect,\n onEdit,\n asset,\n}: {\n onSelect?: (asset: VideoAssetDocument) => void\n onEdit?: (asset: VideoAssetDocument) => void\n asset: VideoAssetDocument\n}) {\n const [renderVideo, setRenderVideo] = useState(false)\n const select = React.useCallback(() => onSelect?.(asset), [onSelect, asset])\n const edit = React.useCallback(() => onEdit?.(asset), [onEdit, asset])\n\n if (!asset) {\n return null\n }\n\n const playbackPolicy = getPlaybackPolicy(asset)\n\n return (\n <Card\n border\n padding={2}\n sizing=\"border\"\n radius={2}\n style={{\n position: 'relative',\n }}\n >\n {playbackPolicy === 'signed' && (\n <Tooltip\n animate\n content={\n <Card padding={2} radius={2}>\n <IconInfo icon={LockIcon} text=\"Signed playback policy\" size={2} />\n </Card>\n }\n placement=\"right\"\n fallbackPlacements={['top', 'bottom']}\n portal\n >\n <Card\n tone=\"caution\"\n style={{\n borderRadius: '100%',\n position: 'absolute',\n left: '1em',\n top: '1em',\n zIndex: 10,\n }}\n padding={2}\n border\n >\n <Text muted size={1}>\n <LockIcon />\n </Text>\n </Card>\n </Tooltip>\n )}\n <Stack\n space={3}\n height=\"fill\"\n style={{\n gridTemplateRows: 'min-content min-content 1fr',\n }}\n >\n {renderVideo ? (\n <VideoPlayer asset={asset} autoPlay forceAspectRatio={THUMBNAIL_ASPECT_RATIO} />\n ) : (\n <PlayButton onClick={() => setRenderVideo(true)}>\n <div data-play>\n <PlayIcon />\n </div>\n {assetIsAudio(asset) ? (\n <div\n style={{\n aspectRatio: THUMBNAIL_ASPECT_RATIO,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"3em\" viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n style={{opacity: '0.65'}}\n d=\"M10.75 19q.95 0 1.6-.65t.65-1.6V13h3v-2h-4v3.875q-.275-.2-.587-.288t-.663-.087q-.95 0-1.6.65t-.65 1.6t.65 1.6t1.6.65M6 22q-.825 0-1.412-.587T4 20V4q0-.825.588-1.412T6 2h8l6 6v12q0 .825-.587 1.413T18 22zm7-13V4H6v16h12V9zM6 4v5zv16z\"\n />\n </svg>\n </div>\n ) : (\n <VideoThumbnail asset={asset} />\n )}\n </PlayButton>\n )}\n <VideoMetadata asset={asset} />\n <div\n style={{\n display: 'flex',\n width: '100%',\n alignItems: 'flex-end',\n justifyContent: 'flex-start',\n gap: '.35rem',\n }}\n >\n {onSelect && (\n <Button\n icon={CheckmarkIcon}\n fontSize={2}\n padding={2}\n mode=\"ghost\"\n text=\"Select\"\n style={{flex: 1}}\n tone=\"positive\"\n onClick={select}\n />\n )}\n <Button\n icon={EditIcon}\n fontSize={2}\n padding={2}\n mode=\"ghost\"\n text=\"Details\"\n style={{flex: 1}}\n onClick={edit}\n />\n </div>\n </Stack>\n </Card>\n )\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {Card, Flex, Grid, Label, Stack, Text, TextInput} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\n\nimport useAssets from '../hooks/useAssets'\nimport type {VideoAssetDocument} from '../util/types'\nimport ImportVideosFromMux from './ImportVideosFromMux'\nimport {SelectSortOptions} from './SelectSortOptions'\nimport SpinnerBox from './SpinnerBox'\nimport type {VideoDetailsProps} from './VideoDetails/useVideoDetails'\nimport VideoDetails from './VideoDetails/VideoDetails'\nimport VideoInBrowser from './VideoInBrowser'\n\nexport interface VideosBrowserProps {\n onSelect?: (asset: VideoAssetDocument) => void\n}\n\nexport default function VideosBrowser({onSelect}: VideosBrowserProps) {\n const {assets, isLoading, searchQuery, setSearchQuery, setSort, sort} = useAssets()\n const [editedAsset, setEditedAsset] = useState<VideoDetailsProps['asset'] | null>(null)\n const freshEditedAsset = useMemo(\n () => assets.find((a) => a._id === editedAsset?._id) || editedAsset,\n [editedAsset, assets]\n )\n\n const placement = onSelect ? 'input' : 'tool'\n return (\n <>\n <Stack padding={4} space={4} style={{minHeight: '50vh'}}>\n <Flex justify=\"space-between\" align=\"center\">\n <Flex align=\"center\" gap={3}>\n <TextInput\n value={searchQuery}\n icon={SearchIcon}\n onInput={(e: React.FormEvent<HTMLInputElement>) =>\n setSearchQuery(e.currentTarget.value)\n }\n placeholder=\"Search videos\"\n />\n <SelectSortOptions setSort={setSort} sort={sort} />\n </Flex>\n {placement === 'tool' && <ImportVideosFromMux />}\n </Flex>\n <Stack space={3}>\n {assets?.length > 0 && (\n <Label muted>\n {assets.length} video{assets.length > 1 ? 's' : null}{' '}\n {searchQuery ? `matching \"${searchQuery}\"` : 'found'}\n </Label>\n )}\n <Grid\n gap={2}\n style={{\n gridTemplateColumns: 'repeat(auto-fill, minmax(250px, 1fr))',\n }}\n >\n {assets.map((asset) => (\n <VideoInBrowser\n key={asset._id}\n asset={asset}\n onEdit={setEditedAsset}\n onSelect={onSelect}\n />\n ))}\n </Grid>\n </Stack>\n {isLoading && <SpinnerBox />}\n\n {!isLoading && assets.length === 0 && (\n <Card marginY={4} paddingX={4} paddingY={6} border radius={2} tone=\"transparent\">\n <Text align=\"center\" muted size={3}>\n {searchQuery ? `No videos found for \"${searchQuery}\"` : 'No videos in this dataset'}\n </Text>\n </Card>\n )}\n </Stack>\n {freshEditedAsset && (\n <VideoDetails\n closeDialog={() => setEditedAsset(null)}\n asset={freshEditedAsset}\n placement={placement}\n />\n )}\n </>\n )\n}\n","import type {Tool} from 'sanity'\n\nimport type {PluginConfig} from '../util/types'\nimport ToolIcon from './icons/ToolIcon'\nimport VideosBrowser from './VideosBrowser'\n\nconst StudioTool: React.FC<PluginConfig> = () => {\n return <VideosBrowser />\n}\n\nexport const DEFAULT_TOOL_CONFIG = {\n icon: ToolIcon,\n title: 'Videos',\n}\n\nexport default function createStudioTool(config: PluginConfig): Tool {\n const toolConfig = typeof config.tool === 'object' ? config.tool : DEFAULT_TOOL_CONFIG\n return {\n name: 'mux',\n icon: toolConfig.icon || DEFAULT_TOOL_CONFIG.icon,\n title: toolConfig.title || DEFAULT_TOOL_CONFIG.title,\n component: (props: any) => <StudioTool {...config} {...props} />,\n }\n}\n","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","// 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","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 {defer} from 'rxjs'\nimport type {SanityClient} from 'sanity'\n\ninterface SecretsDocument {\n _id: 'secrets.mux'\n _type: 'mux.apiKey'\n token: string\n secretKey: string\n enableSignedUrls: boolean\n signingKeyId: string\n signingKeyPrivate: string\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): Promise<SecretsDocument> {\n const doc: SecretsDocument = {\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","import {useCallback} from 'react'\nimport type {SanityClient} from 'sanity'\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 {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 {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 {\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\n animate\n id={id}\n onClose={handleClose}\n header={<Header />}\n width={1}\n style={{\n maxWidth: '550px',\n }}\n >\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 {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 r,{PureComponent as t,useReducer as e,useRef as n,useCallback as o}from\"react\";var c=function(r){var t,e;function n(t){var e;return(e=r.call(this,t)||this).state={hasError:!1,error:null},e}e=r,(t=n).prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e,n.getDerivedStateFromError=function(r){return{hasError:!0,error:r}};var o=n.prototype;return o.componentDidCatch=function(r,t){return this.props.onDidCatch(r,t)},o.render=function(){var r=this.state,t=this.props,e=t.render,n=t.children,o=t.renderError;return r.hasError?o?o({error:r.error}):null:e?e():n||null},n}(t),u=function(r,t){switch(t.type){case\"catch\":return{didCatch:!0,error:t.error};case\"reset\":return{didCatch:!1,error:null};default:return r}};function a(t){var a=e(u,{didCatch:!1,error:null}),i=a[0],d=a[1],h=n(null);function l(){return e=function(r,e){d({type:\"catch\",error:r}),t&&t.onDidCatch&&t.onDidCatch(r,e)},function(t){return r.createElement(c,{onDidCatch:e,children:t.children,render:t.render,renderError:t.renderError})};var e}var p,s=o(function(){h.current=l(),d({type:\"reset\"})},[]);return{ErrorBoundary:(p=h.current,null!==p?p:(h.current=l(),h.current)),didCatch:i.didCatch,error:i.error,reset:s}}export default a;export{a as useErrorBoundary};\n//# sourceMappingURL=index.module.js.map\n","/* eslint-disable no-console */\nimport {Button, Card, Flex, Grid, Heading, Inline, Text, useToast} from '@sanity/ui'\nimport React, {memo, useCallback, useRef} from 'react'\nimport scrollIntoView from 'scroll-into-view-if-needed'\nimport {clear} from 'suspend-react'\nimport {useErrorBoundary} from 'use-error-boundary'\n\nimport {name} from '../util/constants'\nimport {type MuxInputProps} from '../util/types'\n\nexport interface Props extends Pick<MuxInputProps, 'schemaType'> {\n children: React.ReactNode\n}\nfunction ErrorBoundaryCard(props: Props) {\n const {children, schemaType} = props\n const {push: pushToast} = useToast()\n const errorRef = useRef(null)\n const {ErrorBoundary, didCatch, error, reset} = useErrorBoundary({\n onDidCatch: (err, errorInfo) => {\n console.group(err.toString())\n console.groupCollapsed('console.error')\n console.error(err)\n console.groupEnd()\n if (err.stack) {\n console.groupCollapsed('error.stack')\n console.log(err.stack)\n console.groupEnd()\n }\n if (errorInfo?.componentStack) {\n console.groupCollapsed('errorInfo.componentStack')\n console.log(errorInfo.componentStack)\n console.groupEnd()\n }\n console.groupEnd()\n pushToast({\n status: 'error',\n title: 'Plugin crashed',\n description: (\n <Flex align=\"center\">\n <Inline space={1}>\n An error happened while rendering\n <Button\n padding={1}\n fontSize={1}\n style={{transform: 'translateY(1px)'}}\n mode=\"ghost\"\n text={schemaType.title}\n onClick={() => {\n if (errorRef.current) {\n scrollIntoView(errorRef.current, {\n behavior: 'smooth',\n scrollMode: 'if-needed',\n block: 'center',\n })\n }\n }}\n />\n </Inline>\n </Flex>\n ),\n })\n },\n })\n const handleRetry = useCallback(() => {\n // Purge request cache before retrying, otherwise the cached errors will rethrow\n clear([name])\n\n reset()\n }, [reset])\n\n if (didCatch) {\n return (\n <Card ref={errorRef} paddingX={[2, 3, 4, 4]} height=\"fill\" shadow={1} overflow=\"auto\">\n <Flex justify=\"flex-start\" align=\"center\" height=\"fill\">\n <Grid columns={1} gap={[2, 3, 4, 4]}>\n <Heading as=\"h1\">\n The <code>{name}</code> plugin crashed\n </Heading>\n {error?.message && (\n <Card padding={3} tone=\"critical\" shadow={1} radius={2}>\n <Text>{error.message}</Text>\n </Card>\n )}\n <Inline>\n <Button onClick={handleRetry} text=\"Retry\" />\n </Inline>\n </Grid>\n </Flex>\n </Card>\n )\n }\n\n return <ErrorBoundary>{children}</ErrorBoundary>\n}\n\nexport default memo(ErrorBoundaryCard)\n","import {Box, Card, Flex, Spinner, Text} from '@sanity/ui'\n\nexport const InputFallback = () => {\n return (\n <div style={{padding: 1}}>\n <Card\n shadow={1}\n sizing=\"border\"\n style={{aspectRatio: '16/9', width: '100%', borderRadius: '1px'}}\n >\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\">\n <Spinner muted />\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading…\n </Text>\n </Box>\n </Flex>\n </Card>\n </div>\n )\n}\n","import {PlugIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Grid, Heading, Inline} from '@sanity/ui'\nimport {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 {UpChunk} from '@mux/upchunk'\nimport {Observable} from 'rxjs'\n\nexport function createUpChunkObservable(uuid: string, uploadUrl: string, source: File) {\n return new Observable<\n | {type: 'pause' | 'resume'; id: string}\n | {type: 'success'; id: string}\n | {type: 'progress'; percent: number}\n >((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 {uuid as generateUuid} from '@sanity/uuid'\nimport {concat, defer, from, type Observable, of, throwError} from 'rxjs'\nimport {catchError, mergeMap, mergeMapTo, switchMap} from 'rxjs/operators'\nimport type {SanityClient} from 'sanity'\n\nimport {createUpChunkObservable} from '../clients/upChunkObservable'\nimport type {MuxAsset, MuxNewAssetSettings} 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.config().dataset}/${uuid}`,\n withCredentials: true,\n method: 'DELETE',\n })\n}\n\nexport function uploadUrl({\n url,\n settings,\n client,\n}: {\n url: string\n settings: MuxNewAssetSettings\n client: SanityClient\n}) {\n return testUrl(url).pipe(\n switchMap((validUrl) => {\n return concat(\n of({type: 'url' as const, 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 muxBody = settings\n if (!muxBody.input) muxBody.input = [{type: 'video'}]\n muxBody.input[0].url = validUrl\n\n const query = {\n muxBody: JSON.stringify(muxBody),\n filename: validUrl.split('/').slice(-1)[0],\n }\n\n const dataset = client.config().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' as const, id: uuid, asset})\n })\n )\n })\n )\n )\n })\n )\n}\n\nexport function uploadFile({\n settings,\n client,\n file,\n}: {\n settings: MuxNewAssetSettings\n client: SanityClient\n file: File\n}) {\n return testFile(file).pipe(\n switchMap((fileOptions) => {\n return concat(\n of({type: 'file' as const, 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 body = settings\n\n return concat(\n of({type: 'uuid' as const, uuid}),\n defer(() =>\n client.observable.request<{\n sanityAssetId: string\n upload: {\n cors_origin: string\n id: string\n new_asset_settings: MuxNewAssetSettings\n status: 'waiting'\n timeout: number\n url: string\n }\n }>({\n url: `/addons/mux/uploads/${client.config().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) => {\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\nexport function 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\nexport function 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 undefined\n }\n return {\n name: opts.preserveFilename === false ? undefined : file.name,\n type: file.type,\n }\n}\n","import {type InputProps, isObjectInputProps, type PreviewLayoutKey, type PreviewProps} from 'sanity'\n\nimport type {MuxInputPreviewProps, MuxInputProps} from './types'\n\nexport function isMuxInputProps(props: InputProps): props is MuxInputProps {\n return isObjectInputProps(props) && props.schemaType.type?.name === 'mux.video'\n}\n\nexport function isMuxInputPreviewProps(\n props: PreviewProps<PreviewLayoutKey>\n): props is MuxInputPreviewProps {\n return props.schemaType?.type?.name === 'mux.video'\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n const parsed = new URL(url)\n return parsed && !!parsed.protocol.match(/http:|https:/)\n } catch {\n return false\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 {useCallback} from 'react'\nimport {PatchEvent, set, setIfMissing, unset} from 'sanity'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\nimport VideosBrowser, {type VideosBrowserProps} from './VideosBrowser'\n\nexport interface Props extends Pick<MuxInputProps, 'onChange'> {\n asset?: VideoAssetDocument | null | undefined\n setDialogState: SetDialogState\n}\n\nexport default function SelectAssets({asset: selectedAsset, onChange, setDialogState}: Props) {\n const handleSelect = useCallback<Required<VideosBrowserProps>['onSelect']>(\n (chosenAsset) => {\n if (!chosenAsset?._id) {\n onChange(PatchEvent.from([unset(['asset'])]))\n }\n if (chosenAsset._id !== selectedAsset?._id) {\n onChange(\n PatchEvent.from([\n setIfMissing({asset: {}, _type: 'mux.video'}),\n set({_type: 'reference', _weak: true, _ref: chosenAsset._id}, ['asset']),\n ])\n )\n }\n setDialogState(false)\n },\n [onChange, setDialogState, selectedAsset]\n )\n\n return <VideosBrowser onSelect={handleSelect} />\n}\n","import {Dialog} from '@sanity/ui'\nimport {useCallback, useId} from 'react'\nimport {styled} from 'styled-components'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport SelectAsset, {type Props as SelectAssetProps} from './SelectAsset'\n\n/** To prevent Content Layout Shift (CLS), ensure that the dialog always occupies the entire available height. */\nconst StyledDialog = styled(Dialog)`\n > div[data-ui='DialogCard'] > div[data-ui='Card'] {\n height: 100%;\n }\n`\n\nexport default function InputBrowser({\n setDialogState,\n asset,\n onChange,\n}: Pick<SelectAssetProps, 'onChange' | 'asset'> & {\n setDialogState: SetDialogState\n}) {\n const id = `InputBrowser${useId()}`\n const handleClose = useCallback(() => setDialogState(false), [setDialogState])\n return (\n <StyledDialog\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 </StyledDialog>\n )\n}\n","import {useCallback} from 'react'\nimport {PatchEvent, unset} from 'sanity'\n\nimport {deleteAssetOnMux} 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 deleteAssetOnMux(client, asset.assetId)\n }\n if (asset._id) {\n client.delete(asset._id)\n }\n }, [asset, client, onChange])\n}\n","import {useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {useClient} from '../hooks/useClient'\nimport {getStoryboardSrc} from '../util/getStoryboardSrc'\nimport type {VideoAssetDocument} from '../util/types'\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.div`\n position: absolute;\n top: 0;\n right: 0;\n justify-content: flex-end;\n button {\n height: auto;\n }\n`\n\nexport interface PosterImageProps {\n asset: VideoAssetDocument\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","// Lifted from sanity/form/inputs/files/common/UploadProgress\n\nimport {Button, Card, Code, Flex, Inline, Stack, Text} from '@sanity/ui'\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 {Card, Text} from '@sanity/ui'\nimport React, {useEffect, useMemo, useRef} from 'react'\n\nimport {useCancelUpload} from '../hooks/useCancelUpload'\nimport type {MuxInputProps, VideoAssetDocument} from '../util/types'\nimport {TopControls} from './Player.styled'\nimport {UploadProgress} from './UploadProgress'\nimport VideoPlayer from './VideoPlayer'\n\ninterface Props extends Pick<MuxInputProps, 'onChange' | 'readOnly'> {\n buttons?: React.ReactNode\n asset: VideoAssetDocument\n}\n\nconst Player = ({asset, buttons, readOnly, onChange}: Props) => {\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 playRef = useRef<HTMLDivElement>(null)\n const muteRef = useRef<HTMLDivElement>(null)\n const handleCancelUpload = useCancelUpload(asset, onChange)\n\n useEffect(() => {\n const style = document.createElement('style')\n style.innerHTML = 'button svg { vertical-align: middle; }'\n\n if (playRef.current?.shadowRoot) {\n playRef.current.shadowRoot.appendChild(style)\n }\n if (muteRef?.current?.shadowRoot) {\n muteRef.current.shadowRoot.appendChild(style.cloneNode(true))\n }\n }, [])\n\n useEffect(() => {\n if (asset?.status === 'errored') {\n handleCancelUpload()\n // eslint-disable-next-line no-warning-comments\n // @TODO use better error handling\n throw new Error(asset.data?.errors?.messages?.join(' '))\n }\n }, [asset.data?.errors?.messages, asset?.status, handleCancelUpload])\n\n 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 upload'}\n onCancel={readOnly ? undefined : () => handleCancelUpload()}\n />\n )\n }\n\n return (\n <VideoPlayer asset={asset}>\n {buttons && <TopControls slot=\"top-chrome\">{buttons}</TopControls>}\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 </VideoPlayer>\n )\n}\n\nexport default Player\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} from '@sanity/ui'\nimport {css, styled} from 'styled-components'\n\nimport {focusRingStyle} from './withFocusRing/helpers'\n\nexport const FileButton = styled(MenuItem)(({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 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\">\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 {...rest} htmlFor={id} disabled={disabled} ref={forwardedRef}>\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 EllipsisHorizontalIcon,\n ImageIcon,\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 useClickOutsideEvent,\n} from '@sanity/ui'\nimport {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\n// @TODO: add support for audio type (asset._type) when uploading an audio file so we can hide the thumbnail option.\nconst isVideoAsset = (asset: VideoAssetDocument) => {\n return asset._type === 'mux.videoAsset'\n}\n\nfunction PlayerActionsMenu(\n props: Pick<MuxInputProps, 'onChange' | 'readOnly'> & {\n asset: VideoAssetDocument\n onSelect: (files: File[]) => void\n dialogState: DialogState\n setDialogState: SetDialogState\n }\n) {\n const {asset, readOnly, dialogState, setDialogState, onChange, onSelect} = 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 useClickOutsideEvent(\n () => setOpen(false),\n () => [menuElement]\n )\n\n return (\n <Inline space={1} padding={2}>\n {isSigned && (\n <Tooltip\n animate\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 <Popover\n animate\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 onSelect={onSelect}\n text=\"Upload\"\n disabled={readOnly}\n fontSize={1}\n />\n <MenuItem\n icon={SearchIcon}\n text=\"Browse\"\n onClick={() => setDialogState('select-video')}\n />\n {isVideoAsset(asset) && (\n <MenuItem\n icon={ImageIcon}\n text=\"Thumbnail\"\n onClick={() => setDialogState('edit-thumbnail')}\n />\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={EllipsisHorizontalIcon}\n mode=\"ghost\"\n fontSize={1}\n onClick={() => {\n setDialogState(false)\n setOpen(true)\n }}\n />\n </Popover>\n </Inline>\n )\n}\n\nexport default memo(PlayerActionsMenu)\n","/* eslint-disable */\n// From: https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string\n/**\n * Format bytes as human-readable text.\n *\n * @param bytes Number of bytes.\n * @param si True to use metric (SI) units, aka powers of 1000. False to use\n * binary (IEC), aka powers of 1024.\n * @param dp Number of decimal places to display.\n *\n * @return Formatted string.\n */\nexport default function formatBytes(bytes: number, si = false, dp = 1) {\n const thresh = si ? 1000 : 1024\n\n if (Math.abs(bytes) < thresh) {\n return bytes + ' B'\n }\n\n const units = si\n ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']\n let u = -1\n const r = 10 ** dp\n\n do {\n bytes /= thresh\n ++u\n } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1)\n\n return bytes.toFixed(dp) + ' ' + units[u]\n}\n","import type {ObjectInputProps, PreviewLayoutKey, PreviewProps, SchemaType} from 'sanity'\nimport type {PartialDeep} from 'type-fest'\n\nexport interface MuxInputConfig {\n /**\n * Enable static renditions by setting this to 'standard'. Can be overwritten on a per-asset basis.\n * Requires `\"encoding_tier\": \"smart\"`\n * @see {@link https://docs.mux.com/guides/video/enable-static-mp4-renditions#why-enable-mp4-support}\n * @defaultValue 'none'\n */\n mp4_support: 'none' | 'standard'\n\n /**\n * Max resolution tier can be used to control the maximum resolution_tier your asset is encoded, stored, and streamed at.\n * Requires `\"encoding_tier\": \"smart\"`\n * @see {@link https://docs.mux.com/guides/stream-videos-in-4k}\n * @defaultValue '1080p'\n */\n max_resolution_tier: '2160p' | '1440p' | '1080p'\n\n /**\n * The encoding tier informs the cost, quality, and available platform features for the asset.\n * @see {@link https://docs.mux.com/guides/use-encoding-tiers}\n * @defaultValue 'smart'\n */\n encoding_tier: 'baseline' | 'smart'\n\n /**\n * Normalize the audio track loudness level.\n * @see {@link https://docs.mux.com/guides/adjust-audio-levels#how-to-turn-on-audio-normalization}\n * @defaultValue false\n */\n normalize_audio: boolean\n\n /**\n * Enables signed URLs by default, if you configured them with your API token.\n * @see {@link https://docs.mux.com/guides/secure-video-playback}\n * @defaultValue false\n */\n defaultSigned?: boolean\n\n /**\n * Auto-generate captions for these languages by default.\n * Requires `\"encoding_tier\": \"smart\"`\n *\n * @see {@link https://docs.mux.com/guides/add-autogenerated-captions-and-use-transcripts}\n * @deprecated use `defaultAutogeneratedSubtitleLang` instead. Only a single autogenerated\n */\n defaultAutogeneratedSubtitleLangs?: SupportedMuxLanguage[]\n\n /**\n * Auto-generate captions for this language by default. Users can still\n * Requires `\"encoding_tier\": \"smart\"`\n *\n * @see {@link https://docs.mux.com/guides/add-autogenerated-captions-and-use-transcripts}\n */\n defaultAutogeneratedSubtitleLang?: SupportedMuxLanguage\n\n /**\n * Whether or not to allow content editors to override asset upload\n * configuration settings when uploading a video to Mux.\n *\n * @see {@link https://docs.mux.com/guides/secure-video-playback}\n * @defaultValue false\n */\n disableUploadConfig?: boolean\n\n /**\n * Whether or not to allow content editors to add text tracks alongside their\n * asset when uploading a video to Mux.\n *\n * @see {@link https://docs.mux.com/guides/secure-video-playback}\n * @defaultValue false\n */\n disableTextTrackConfig?: boolean\n}\n\nexport interface PluginConfig extends MuxInputConfig {\n /**\n * How the videos browser should appear as a studio tool in Sanity's top navigation\n *\n * Pass `false` if you want to disable it.\n * @defaultValue {title: 'Videos', icon: VideoIcon}\n **/\n tool:\n | false\n | {\n title?: string\n icon?: React.ComponentType\n }\n}\n\nexport const SUPPORTED_MUX_LANGUAGES = [\n {label: 'English', code: 'en', state: 'Stable'},\n {label: 'Spanish', code: 'es', state: 'Stable'},\n {label: 'Italian', code: 'it', state: 'Stable'},\n {label: 'Portuguese', code: 'pt', state: 'Stable'},\n {label: 'German', code: 'de', state: 'Stable'},\n {label: 'French', code: 'fr', state: 'Stable'},\n {label: 'Polish', code: 'pl', state: 'Beta'},\n {label: 'Russian', code: 'ru', state: 'Beta'},\n {label: 'Dutch', code: 'nl', state: 'Beta'},\n {label: 'Catalan', code: 'ca', state: 'Beta'},\n {label: 'Turkish', code: 'tr', state: 'Beta'},\n {label: 'Swedish', code: 'sv', state: 'Beta'},\n {label: 'Ukrainian', code: 'uk', state: 'Beta'},\n {label: 'Norwegian', code: 'no', state: 'Beta'},\n {label: 'Finnish', code: 'fi', state: 'Beta'},\n {label: 'Slovak', code: 'sk', state: 'Beta'},\n {label: 'Greek', code: 'el', state: 'Beta'},\n {label: 'Czech', code: 'cs', state: 'Beta'},\n {label: 'Croatian', code: 'hr', state: 'Beta'},\n {label: 'Danish', code: 'da', state: 'Beta'},\n {label: 'Romanian', code: 'ro', state: 'Beta'},\n {label: 'Bulgarian', code: 'bg', state: 'Beta'},\n] as const\n\nexport const ENCODING_TIERS = [\n {label: 'Baseline', value: 'baseline'},\n {label: 'Smart', value: 'smart'},\n] as const\n\nexport const SUPPORTED_MUX_LANGUAGES_VALUES = SUPPORTED_MUX_LANGUAGES.map((l) => l.code)\n\nexport type SupportedMuxLanguage = (typeof SUPPORTED_MUX_LANGUAGES_VALUES)[number]\n\nexport interface TextTrack {\n _id: string\n name: string\n}\n\nexport interface AutogeneratedTextTrack extends TextTrack {\n type: 'autogenerated'\n language_code: SupportedMuxLanguage\n}\n\nexport interface CustomTextTrack extends TextTrack {\n type: 'subtitles' | 'captions'\n language_code: string\n file: {\n contents: string\n type: string\n name: string\n size: number\n }\n}\n\nexport function isCustomTextTrack(track: Partial<UploadTextTrack>): track is CustomTextTrack {\n return track.type !== 'autogenerated'\n}\n\nexport function isAutogeneratedTrack(\n track: Partial<UploadTextTrack>\n): track is AutogeneratedTextTrack {\n return track.type === 'autogenerated'\n}\n\nexport type UploadTextTrack = AutogeneratedTextTrack | CustomTextTrack\n\nexport interface UploadConfig\n extends Pick<\n MuxInputConfig,\n 'encoding_tier' | 'max_resolution_tier' | 'mp4_support' | 'normalize_audio'\n > {\n text_tracks: UploadTextTrack[]\n signed: boolean\n}\n\n/**\n * Data sent to Mux to create a new asset.\n * @docs {@link https://docs.mux.com/api-reference#video/operation/create-direct-upload}\n */\nexport interface MuxNewAssetSettings\n extends Pick<\n MuxInputConfig,\n 'encoding_tier' | 'max_resolution_tier' | 'mp4_support' | 'normalize_audio'\n > {\n /** An array of objects that each describe an input file to be used to create the asset.*/\n input?: {\n /** The URL of the file that Mux should download and use. */\n url?: string\n /** Generate subtitle tracks using automatic speech recognition with this configuration. This may only be provided for the first input object (the main input file). */\n generated_subtitles?: {\n /** A name for this subtitle track. */\n name: string\n /** Arbitrary metadata set for the subtitle track. Max 255 characters. */\n passthrough?: string\n /** The language to generate subtitles in. */\n language_code: SupportedMuxLanguage\n }[]\n /** The time offset in seconds from the beginning of the video indicating the clip's starting marker. */\n start_time?: number\n /** The time offset in seconds from the beginning of the video indicating the clip's ending marker. */\n end_time?: number\n /** This parameter is required for text type tracks. */\n type: 'video' | 'audio' | 'text'\n /** Type of text track. This parameter only supports subtitles value. */\n text_type?: 'subtitles'\n /** The language code value must be a valid BCP 47 specification compliant value. */\n language_code?: string\n /** The name of the track containing a human-readable description. This value must be unique within each group of text or audio track types. */\n name?: string\n /** Indicates the track provides Subtitles for the Deaf or Hard-of-hearing (SDH). */\n closed_captions?: boolean\n /// @TODO Huhh?>?? Below\n /** This optional parameter should be used tracks with type of text and text_type set to subtitles. */\n passthrough?: string\n }[]\n\n /** An array of playback policy names that you want applied to this asset and available through playback_ids. */\n playback_policy: ('public' | 'signed')[]\n\n /** Arbitrary user-supplied metadata that will be included in the asset details and related webhooks. */\n passthrough?: string\n}\n\nexport interface Secrets {\n token: string | null\n secretKey: string | null\n enableSignedUrls: boolean\n signingKeyId: string | null\n signingKeyPrivate: string | null\n}\n\n// This narrowed type indicates that there may be assets that are signed, and we have the secrets to access them\n// enabledSignedUrls might be false but that's only relevant for future uploads and their playback policy\nexport interface SignableSecrets extends Omit<Secrets, 'signingKeyId' | 'signingKeyPrivate'> {\n signingKeyId: string\n signingKeyPrivate: string\n}\n\nexport type MuxImageOrigin = `https://image.mux.com`\nexport type MuxThumbnailUrl = `${MuxImageOrigin}/${string}/thumbnail.png?${string}`\nexport type MuxAnimatedThumbnailUrl = `${MuxImageOrigin}/${string}/animated.gif?${string}`\nexport type MuxStoryboardUrl = `${MuxImageOrigin}/${string}/storyboard.vtt?${string}`\nexport type MuxVideoOrigin = `https://stream.mux.com`\nexport type MuxVideoUrl = `${MuxVideoOrigin}/${string}.m3u8?${string}`\nexport type MuxApiUrl = MuxThumbnailUrl | MuxAnimatedThumbnailUrl | MuxStoryboardUrl | MuxVideoUrl\n\n// 'preserve' by default\n// @url: https://docs.mux.com/guides/video/get-images-from-a-video#thumbnail-query-string-parameters\nexport type FitMode = 'preserve' | 'crop' | 'smartcrop' | 'pad'\n\nexport interface ThumbnailOptions {\n fit_mode?: FitMode\n height?: number\n time?: number\n width?: number\n}\n\nexport interface AnimatedThumbnailOptions {\n // Starting time code for the animation, if no end is set it'll have a 5s duration\n // The start and end timecodes uses `asset.thumbTime` to create an iOS `Live Photo` effect by showing you the 5 secodnds before, and after, the thumb time`\n start?: number\n // End code, can't be longer than 10s after the start code\n end?: number\n // Max 640px, 320px by default\n width?: number\n // Preserves aspect ratio, like width, you can't set both the height and width, max 640\n height?: number\n // The fps is 15 by default, but can go up to 30\n fps?: number\n}\n\nexport interface AssetThumbnailOptions {\n asset: Pick<VideoAssetDocument, 'playbackId' | 'data' | 'thumbTime' | 'filename' | 'assetId'>\n}\n\nexport type PlaybackPolicy = 'signed' | 'public'\n\nexport interface MuxErrors {\n type: string\n messages: string[]\n}\n\nexport interface MuxPlaybackId {\n id: string\n policy: PlaybackPolicy\n}\n\nexport interface MuxVideoTrack {\n type: 'video'\n id: string\n max_width: number\n max_height: number\n // if the fps can't be reliably determined, this will be -1\n max_frame_rate: -1 | number\n // top-level duration is always set, while track level duration is not\n duration?: number\n}\nexport interface MuxAudioTrack {\n type: 'audio'\n id: string\n duration?: number\n max_channels: number\n max_channel_layout: 'stereo' | string\n}\nexport interface MuxTextTrack {\n type: 'text'\n id: string\n text_type?: 'subtitles'\n // https://docs.mux.com/api-reference/video#operation/list-assets:~:text=text%20type%20tracks.-,tracks%5B%5D.,text_source,-string\n text_source?: 'uploaded' | 'embedded' | 'generated_live' | 'generated_live_final'\n // BCP 47 language code\n language_code?: 'en' | 'en-US' | string\n // The name of the track containing a human-readable description. The hls manifest will associate a subtitle text track with this value\n name?: 'English' | string\n closed_captions?: boolean\n // Max 255 characters\n passthrough?: string\n status: 'preparing' | 'ready' | 'errored'\n}\nexport type MuxTrack = MuxVideoTrack | MuxAudioTrack\n// Typings lifted from https://docs.mux.com/api-reference/video#tag/assets\nexport interface MuxAsset {\n id: string\n /** In seconds (instead of JS's default milliseconds) */\n created_at: string\n status: 'preparing' | 'ready' | 'errored'\n duration: number\n max_stored_resolution: 'Audio only' | 'SD' | 'HD' | 'FHD' | 'UHD'\n // if the fps can't be reliably determined, this will be -1\n max_stored_frame_rate: -1 | number\n // The aspect ratio of the asset in the form of width:height, for example 16:9\n aspect_ratio: `${number}:${number}`\n playback_ids: MuxPlaybackId[]\n tracks: MuxTrack[]\n errors?: MuxErrors\n upload_id: string\n is_live?: boolean\n // We use passthrough to set the mux.videoAsset._id of the asset that originally uploaded the video\n passthrough: string\n live_stream_id?: string\n master?: {\n status: 'ready' | 'preparing' | 'errored'\n // Temporary URL to master MP4, expires after 24 hours\n url: string\n }\n master_access: 'temporary' | 'none'\n mp4_support: 'standard' | 'none'\n // Asset Identifier of the video used as the source for creating the clip.\n source_asset_id?: string\n // Normalize the audio track loudness level. This parameter is only applicable to on-demand (not live) assets., default false\n normalize_audio?: boolean\n // The object does not exist if no static renditions have been requested\n static_renditions?: {\n status: 'ready' | 'preparing' | 'disabled' | 'errored'\n files: {\n name: 'low.mp4' | 'medium.mp4' | 'high.mp4' | 'audio.m4a'\n ext: 'mp4' | 'm4a'\n height: number\n width: number\n bitrate: number\n filesize: number\n }[]\n }\n recording_times?: {\n started_at: string\n duration: number\n type: 'content' | 'slate'\n }[]\n // https://docs.mux.com/guides/video/minimize-processing-time\n non_standard_input_reasons?: {\n video_codec?: string\n audio_codec?: string\n video_gop_size?: 'high'\n video_frame_rate?: string\n video_resolution?: string\n video_bitrate?: 'high'\n pixel_aspect_ratio?: string\n video_edit_list?: 'non-standard'\n audio_edit_list?: 'non-standard'\n unexpected_media_file_parameters?: 'non-standard'\n test?: boolean\n }\n}\n\nexport interface VideoAssetDocument {\n _id: string\n _type: 'mux.videoAsset'\n _createdAt: string\n _updatedAt?: string\n status?: string\n assetId?: string\n playbackId?: string\n filename?: string\n thumbTime?: number\n // Docs for what goes in `data` https://docs.mux.com/api-reference/video#tag/assets\n data?: PartialDeep<MuxAsset>\n}\n\nexport type Reference = {_type: 'reference'; _ref: string}\n\n// @TODO add Reference, and ReferenceSchemaType in the generic\nexport type MuxInputProps = ObjectInputProps<{\n asset?: Reference\n}>\n\nexport interface MuxInputPreviewProps extends Omit<PreviewProps<PreviewLayoutKey>, 'value'> {\n schemaType: SchemaType\n value?: {\n asset?: Reference\n } | null\n}\n\n/** Whether the VideosBrowser was opened from a field in a document, or from the standalone studio tool */\nexport type PluginPlacement = 'input' | 'tool'\n","import {TranslateIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {Dispatch} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type PluginConfig, SUPPORTED_MUX_LANGUAGES, UploadTextTrack} from '../util/types'\n\nconst ALL_LANGUAGE_CODES = LanguagesList.getAllCodes().map((code) => ({\n value: code,\n label: LanguagesList.getNativeName(code),\n}))\n\nconst SUBTITLE_LANGUAGES: Record<\n Extract<UploadTextTrack, {language_code: any}>['type'],\n {value: string; label: string}[]\n> = {\n autogenerated: SUPPORTED_MUX_LANGUAGES.map((lang) => ({\n value: lang.code,\n label: lang.label,\n })),\n subtitles: ALL_LANGUAGE_CODES,\n captions: ALL_LANGUAGE_CODES,\n}\n\ntype TrackSubAction =\n | {subAction: 'add'; value: Partial<UploadTextTrack>}\n | {subAction: 'update'; value: Partial<UploadTextTrack>}\n | {subAction: 'delete'}\n\nexport type TrackAction = {action: 'track'; id: string} & TrackSubAction\n\nexport default function TextTracksEditor({\n tracks,\n dispatch,\n defaultLang,\n}: {\n /**\n * Although the schema for tracks is an array, which we'll eventually support to allow uploading\n * multiple custom subtitles, for now we only support a single auto-generated track.\n */\n tracks: (Partial<UploadTextTrack> & {_id: string})[]\n dispatch: Dispatch<TrackAction>\n defaultLang: PluginConfig['defaultAutogeneratedSubtitleLang']\n}) {\n const track = tracks[0]\n return (\n <FormField title=\"Auto-generated subtitle or caption\">\n <Stack space={2}>\n <Flex align=\"center\">\n <Checkbox\n id=\"include-autogenerated-track\"\n style={{display: 'block'}}\n checked={!!track?.language_code}\n onChange={() => {\n if (track) {\n dispatch({action: 'track', id: track._id, subAction: 'delete'})\n } else {\n dispatch({\n action: 'track',\n id: uuid(),\n subAction: 'add',\n value: {\n type: 'autogenerated',\n name: defaultLang || undefined,\n language_code: defaultLang || undefined,\n },\n })\n }\n }}\n />\n <Box flex={1} paddingLeft={3}>\n <Text>\n <label htmlFor=\"checkbox\">Generate captions</label>\n </Text>\n </Box>\n </Flex>\n {track && (\n <Autocomplete\n id={`text-tract-editor--language`}\n value={track.language_code}\n onChange={(newValue) =>\n dispatch({\n action: 'track',\n id: track._id,\n subAction: 'update',\n value: {\n language_code: newValue,\n name: LanguagesList.getNativeName(newValue),\n },\n })\n }\n options={SUBTITLE_LANGUAGES[track.type!]}\n icon={TranslateIcon}\n placeholder=\"Select language\"\n filterOption={(query, option) =>\n option.label.toLowerCase().indexOf(query.toLowerCase()) > -1 ||\n option.value.toLowerCase().indexOf(query.toLowerCase()) > -1\n }\n openButton\n renderValue={(value) =>\n SUBTITLE_LANGUAGES[track.type!].find((l) => l.value === value)?.label || value\n }\n renderOption={(option) => (\n <Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n <Text size={2} textOverflow=\"ellipsis\">\n {option.label} ({option.value})\n </Text>\n </Card>\n )}\n />\n )}\n </Stack>\n </FormField>\n )\n}\n","import {DocumentVideoIcon, UploadIcon} from '@sanity/icons'\nimport {Box, Button, Card, Checkbox, Dialog, Flex, Label, Radio, Stack, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {useEffect, useId, useReducer, useRef} from 'react'\nimport {FormField} from 'sanity'\n\nimport formatBytes from '../util/formatBytes'\nimport {\n type AutogeneratedTextTrack,\n type CustomTextTrack,\n isAutogeneratedTrack,\n isCustomTextTrack,\n type MuxNewAssetSettings,\n type PluginConfig,\n type Secrets,\n type SupportedMuxLanguage,\n type UploadConfig,\n type UploadTextTrack,\n} from '../util/types'\nimport TextTracksEditor, {type TrackAction} from './TextTracksEditor'\nimport type {StagedUpload} from './Uploader'\n\nexport type UploadConfigurationStateAction =\n | {action: 'encoding_tier'; value: UploadConfig['encoding_tier']}\n | {action: 'max_resolution_tier'; value: UploadConfig['max_resolution_tier']}\n | {action: 'mp4_support'; value: UploadConfig['mp4_support']}\n | {action: 'normalize_audio'; value: UploadConfig['normalize_audio']}\n | {action: 'signed'; value: UploadConfig['signed']}\n | TrackAction\n\nconst ENCODING_OPTIONS = [\n {value: 'smart', label: 'Smart'},\n {value: 'baseline', label: 'Baseline'},\n] as const satisfies {value: UploadConfig['encoding_tier']; label: string}[]\n\nconst RESOLUTION_TIERS = [\n {value: '1080p', label: '1080p'},\n {value: '1440p', label: '1440p (2k)'},\n {value: '2160p', label: '2160p (4k)'},\n] as const satisfies {value: UploadConfig['max_resolution_tier']; label: string}[]\n\n/**\n * The modal for configuring a staged upload. Handles triggering of the asset\n * upload, even if no modal needs to be shown.\n *\n * @returns\n */\nexport default function UploadConfiguration({\n stagedUpload,\n secrets,\n pluginConfig,\n startUpload,\n onClose,\n}: {\n stagedUpload: StagedUpload\n secrets: Secrets\n pluginConfig: PluginConfig\n startUpload: (settings: MuxNewAssetSettings) => void\n onClose: () => void\n}) {\n const id = useId()\n const autoTextTracks = useRef<NonNullable<UploadConfig['text_tracks']>>(\n pluginConfig.encoding_tier === 'smart' && pluginConfig.defaultAutogeneratedSubtitleLang\n ? [\n {\n _id: uuid(),\n type: 'autogenerated',\n language_code: pluginConfig.defaultAutogeneratedSubtitleLang,\n name: LanguagesList.getNativeName(pluginConfig.defaultAutogeneratedSubtitleLang),\n } satisfies AutogeneratedTextTrack,\n ]\n : []\n ).current\n\n const [config, dispatch] = useReducer(\n (prev: UploadConfig, action: UploadConfigurationStateAction) => {\n switch (action.action) {\n case 'encoding_tier':\n // If encoding tier switches to baseline, remove smart-only features\n if (action.value === 'baseline') {\n return Object.assign({}, prev, {\n encoding_tier: action.value,\n mp4_support: 'none',\n max_resolution_tier: '1080p',\n text_tracks: prev.text_tracks?.filter(({type}) => type !== 'autogenerated'),\n })\n // If encoding tier switches to smart, add back in default smart features\n }\n return Object.assign({}, prev, {\n encoding_tier: action.value,\n mp4_support: pluginConfig.mp4_support,\n max_resolution_tier: pluginConfig.max_resolution_tier,\n text_tracks: [...autoTextTracks, ...(prev.text_tracks || [])],\n })\n\n case 'mp4_support':\n case 'max_resolution_tier':\n case 'normalize_audio':\n case 'signed':\n return Object.assign({}, prev, {[action.action]: action.value})\n // Updating individual tracks\n case 'track': {\n const text_tracks = [...prev.text_tracks]\n const target_track_i = text_tracks.findIndex(({_id}) => _id === action.id)\n // eslint-disable-next-line default-case\n switch (action.subAction) {\n case 'add':\n // Exit early if track already exists\n if (target_track_i !== -1) break\n text_tracks.push({\n _id: action.id,\n ...action.value,\n } as AutogeneratedTextTrack)\n break\n case 'update':\n if (target_track_i === -1) break\n text_tracks[target_track_i] = {\n ...text_tracks[target_track_i],\n ...action.value,\n } as UploadTextTrack\n break\n case 'delete':\n if (target_track_i === -1) break\n text_tracks.splice(target_track_i, 1)\n break\n }\n return Object.assign({}, prev, {text_tracks})\n }\n default:\n return prev\n }\n },\n {\n encoding_tier: pluginConfig.encoding_tier,\n max_resolution_tier: pluginConfig.max_resolution_tier,\n mp4_support: pluginConfig.mp4_support,\n signed: secrets.enableSignedUrls && pluginConfig.defaultSigned,\n normalize_audio: pluginConfig.normalize_audio,\n text_tracks: autoTextTracks,\n } as UploadConfig\n )\n\n // If user-provided config is disabled, begin the upload immediately with\n // the developer-specified values from the schema or config or defaults.\n // This can include auto-generated subtitles!\n const {disableTextTrackConfig, disableUploadConfig} = pluginConfig\n const skipConfig = disableTextTrackConfig && disableUploadConfig\n useEffect(() => {\n if (skipConfig) startUpload(formatUploadConfig(config))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (skipConfig) return null\n\n const maxSupportedResolution = RESOLUTION_TIERS.findIndex(\n (rt) => rt.value === pluginConfig.max_resolution_tier\n )\n return (\n <Dialog\n animate\n open\n id=\"upload-configuration\"\n zOffset={1000}\n width={1}\n header=\"Configure Mux Upload\"\n onClose={onClose}\n >\n <Stack padding={4} space={2}>\n <Label size={3}>FILE TO UPLOAD</Label>\n <Card\n tone=\"transparent\"\n border\n padding={3}\n paddingY={4}\n style={{borderRadius: '0.1865rem'}}\n >\n <Flex gap={2}>\n <DocumentVideoIcon fontSize=\"2em\" />\n <Stack space={2}>\n <Text textOverflow=\"ellipsis\" as=\"h2\" size={3}>\n {stagedUpload.type === 'file' ? stagedUpload.files[0].name : stagedUpload.url}\n </Text>\n <Text as=\"p\" size={1} muted>\n {stagedUpload.type === 'file'\n ? `Direct File Upload (${formatBytes(stagedUpload.files[0].size)})`\n : 'File From URL (Unknown size)'}\n </Text>\n </Stack>\n </Flex>\n </Card>\n {!disableUploadConfig && (\n <Stack space={3} paddingBottom={2}>\n <FormField\n title=\"Encoding Tier\"\n description={\n <>\n The encoding tier informs the cost, quality, and available platform features for\n the asset.{' '}\n <a\n href=\"https://docs.mux.com/guides/use-encoding-tiers\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n See the Mux guide for more details.\n </a>\n </>\n }\n >\n <Flex gap={3}>\n {ENCODING_OPTIONS.map(({value, label}) => {\n const inputId = `${id}--encodingtier-${value}`\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Radio\n checked={config.encoding_tier === value}\n name=\"asset-encodingtier\"\n onChange={(e) =>\n dispatch({\n action: 'encoding_tier' as const,\n value: e.currentTarget.value as UploadConfig['encoding_tier'],\n })\n }\n value={value}\n id={inputId}\n />\n <Text as=\"label\" htmlFor={inputId}>\n {label}\n </Text>\n </Flex>\n )\n })}\n </Flex>\n </FormField>\n\n {config.encoding_tier === 'smart' && maxSupportedResolution > 0 && (\n <FormField\n title=\"Resolution Tier\"\n description={\n <>\n The maximum{' '}\n <a\n href=\"https://docs.mux.com/api-reference#video/operation/create-direct-upload\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n resolution_tier\n </a>{' '}\n your asset is encoded, stored, and streamed at.\n </>\n }\n >\n <Flex gap={3} wrap={'wrap'}>\n {RESOLUTION_TIERS.map(({value, label}, index) => {\n const inputId = `${id}--type-${value}`\n\n if (index > maxSupportedResolution) return null\n\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Radio\n checked={config.max_resolution_tier === value}\n name=\"asset-resolutiontier\"\n onChange={(e) =>\n dispatch({\n action: 'max_resolution_tier',\n value: e.currentTarget.value as UploadConfig['max_resolution_tier'],\n })\n }\n value={value}\n id={inputId}\n />\n <Text as=\"label\" htmlFor={inputId}>\n {label}\n </Text>\n </Flex>\n )\n })}\n </Flex>\n </FormField>\n )}\n\n {(secrets.enableSignedUrls || config.encoding_tier === 'smart') && (\n <FormField title=\"Additional Configuration\">\n <Stack space={2}>\n {secrets.enableSignedUrls && (\n <Flex align=\"center\" gap={2}>\n <Checkbox\n id={`${id}--signed`}\n style={{display: 'block'}}\n name=\"signed\"\n required\n checked={config.signed}\n onChange={(e) =>\n dispatch({\n action: 'signed',\n value: e.currentTarget.checked,\n })\n }\n />\n <Text>\n <label htmlFor={`${id}--signed`}>Signed playback URL</label>\n </Text>\n </Flex>\n )}\n {config.encoding_tier === 'smart' && (\n <Flex align=\"center\" gap={2}>\n <Checkbox\n id={`${id}--mp4_support`}\n style={{display: 'block'}}\n name=\"mp4_support\"\n required\n checked={config.mp4_support === 'standard'}\n onChange={(e) =>\n dispatch({\n action: 'mp4_support',\n value: e.currentTarget.checked ? 'standard' : 'none',\n })\n }\n />\n <Text>\n <label htmlFor={`${id}--mp4_support`}>\n MP4 support (allow downloading)\n </label>\n </Text>\n </Flex>\n )}\n </Stack>\n </FormField>\n )}\n </Stack>\n )}\n\n {!disableTextTrackConfig && config.encoding_tier === 'smart' && (\n <TextTracksEditor\n tracks={config.text_tracks}\n dispatch={dispatch}\n defaultLang={pluginConfig.defaultAutogeneratedSubtitleLang}\n />\n )}\n\n <Box marginTop={4}>\n <Button\n icon={UploadIcon}\n text=\"Upload\"\n tone=\"positive\"\n onClick={() => startUpload(formatUploadConfig(config))}\n />\n </Box>\n </Stack>\n </Dialog>\n )\n}\n\nfunction formatUploadConfig(config: UploadConfig): MuxNewAssetSettings {\n const generated_subtitles = config.text_tracks\n .filter<AutogeneratedTextTrack>(isAutogeneratedTrack)\n .map<{name: string; language_code: SupportedMuxLanguage}>((track) => ({\n name: track.name,\n language_code: track.language_code,\n }))\n\n return {\n input: [\n {\n type: 'video',\n generated_subtitles: generated_subtitles.length > 0 ? generated_subtitles : undefined,\n },\n ...config.text_tracks.filter<CustomTextTrack>(isCustomTextTrack).reduce(\n (acc, track) => {\n if (track.language_code && track.file && track.name) {\n acc.push({\n url: track.file.contents,\n type: 'text',\n text_type: track.type === 'subtitles' ? 'subtitles' : undefined,\n language_code: track.language_code,\n name: track.name,\n closed_captions: track.type === 'captions',\n })\n }\n return acc\n },\n [] as NonNullable<MuxNewAssetSettings['input']>\n ),\n ],\n mp4_support: config.mp4_support,\n playback_policy: config.signed ? ['public', 'signed'] : ['public'],\n max_resolution_tier: config.max_resolution_tier,\n encoding_tier: config.encoding_tier,\n normalize_audio: config.normalize_audio,\n }\n}\n","import {rem} from '@sanity/ui'\nimport type {ComponentType} from 'react'\nimport {css, styled} 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}>((props) => {\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","/* eslint-disable no-nested-ternary */\nimport {Card, type CardTone} 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 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 {Button, type ButtonProps} 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 accept?: string\n}\nexport const FileInputButton = ({onSelect, accept, ...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={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 {Button, Card, Flex, Inline, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {FileInputButton, type FileInputButtonProps} from './FileInputButton'\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 <Card\n sizing=\"border\"\n tone={readOnly ? 'transparent' : 'inherit'}\n border\n radius={2}\n paddingX={3}\n paddingY={1}\n style={hovering ? {borderColor: 'transparent'} : undefined}\n >\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap={4}\n direction={['column', 'column', 'row']}\n paddingY={2}\n sizing=\"border\"\n >\n <Flex align=\"center\" justify=\"flex-start\" 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=\"bleed\"\n tone=\"default\"\n icon={UploadIcon}\n text=\"Upload\"\n onSelect={onSelect}\n />\n <Button mode=\"bleed\" icon={SearchIcon} text=\"Select\" onClick={handleBrowse} />\n\n <Button\n padding={3}\n radius={3}\n tone={needsSetup ? 'critical' : undefined}\n onClick={handleConfigureApi}\n icon={PlugIcon}\n mode=\"bleed\"\n title=\"Configure plugin credentials\"\n />\n </Inline>\n </Flex>\n </Card>\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Button, CardTone, Flex, Text, useToast} from '@sanity/ui'\nimport React, {useEffect, useReducer, useRef, useState} from 'react'\nimport {type Observable, Subject, Subscription} from 'rxjs'\nimport {takeUntil, tap} from 'rxjs/operators'\nimport type {SanityClient} from 'sanity'\nimport {PatchEvent, set, setIfMissing} from 'sanity'\n\nimport {uploadFile, uploadUrl} from '../actions/upload'\nimport {DialogStateProvider} from '../context/DialogStateContext'\nimport {type DialogState, type SetDialogState} from '../hooks/useDialogState'\nimport {isValidUrl} from '../util/asserters'\nimport {extractDroppedFiles} from '../util/extractFiles'\nimport type {\n MuxInputProps,\n MuxNewAssetSettings,\n PluginConfig,\n Secrets,\n VideoAssetDocument,\n} from '../util/types'\nimport InputBrowser from './InputBrowser'\nimport Player from './Player'\nimport PlayerActionsMenu from './PlayerActionsMenu'\nimport UploadConfiguration from './UploadConfiguration'\nimport {UploadCard} from './Uploader.styled'\nimport UploadPlaceholder from './UploadPlaceholder'\nimport {UploadProgress} from './UploadProgress'\n\ninterface Props extends Pick<MuxInputProps, 'onChange' | 'readOnly'> {\n config: PluginConfig\n client: SanityClient\n secrets: Secrets\n asset: VideoAssetDocument | null | undefined\n dialogState: DialogState\n setDialogState: SetDialogState\n needsSetup: boolean\n}\n\nexport type StagedUpload = {type: 'file'; files: FileList | File[]} | {type: 'url'; url: string}\ntype UploadStatus = {\n progress: number\n file?: {name: string | undefined; type: string}\n uuid?: string\n url?: string\n}\n\ninterface State {\n stagedUpload: StagedUpload | null\n uploadStatus: UploadStatus | null\n error: Error | null\n}\n\nconst INITIAL_STATE: State = {\n stagedUpload: null,\n uploadStatus: null,\n error: null,\n}\n\ntype UploadFileEvent = ReturnType<typeof uploadFile> extends Observable<infer T> ? T : never\ntype UploadUrlEvent = ReturnType<typeof uploadUrl> extends Observable<infer T> ? T : never\ntype UploaderStateAction =\n | {action: 'stageUpload'; input: NonNullable<State['stagedUpload']>}\n | {action: 'commitUpload'}\n | ({action: 'progressInfo'} & (\n | Extract<UploadFileEvent, {type: 'uuid' | 'file'}>\n | Extract<UploadUrlEvent, {type: 'url'}>\n ))\n | {action: 'progress'; percent: number}\n | {action: 'error'; error: any}\n | {action: 'complete' | 'reset'}\n\n/**\n * The main interface for inputting a Mux Video. It handles staging an upload\n * file, setting its configuration, displaying upload progress, and showing\n * the preview player.\n */\nexport default function Uploader(props: Props) {\n const toast = useToast()\n const containerRef = useRef<HTMLDivElement>(null)\n\n const dragEnteredEls = useRef<EventTarget[]>([])\n const [dragState, setDragState] = useState<'valid' | 'invalid' | null>(null)\n\n const cancelUploadButton = useRef(\n (() => {\n const events$ = new Subject()\n return {\n observable: events$.asObservable(),\n handleClick: ((event) => events$.next(event)) as React.MouseEventHandler<HTMLButtonElement>,\n }\n })()\n ).current\n\n const uploadRef = useRef<Subscription | null>(null)\n const [state, dispatch] = useReducer(\n (prev: State, action: UploaderStateAction) => {\n switch (action.action) {\n case 'stageUpload':\n return Object.assign({}, INITIAL_STATE, {stagedUpload: action.input})\n case 'commitUpload':\n return Object.assign({}, prev, {uploadStatus: {progress: 0}})\n case 'progressInfo': {\n const {type, action: _, ...payload} = action\n return Object.assign({}, prev, {\n uploadStatus: {\n ...prev.uploadStatus,\n progress: prev.uploadStatus!.progress,\n ...payload,\n },\n } satisfies Pick<typeof prev, 'uploadStatus'>)\n }\n case 'progress':\n return Object.assign({}, prev, {\n uploadStatus: {\n ...prev.uploadStatus,\n progress: action.percent,\n },\n } satisfies Pick<typeof prev, 'uploadStatus'>)\n case 'reset':\n case 'complete':\n // Clear upload observable on completion\n uploadRef.current?.unsubscribe()\n uploadRef.current = null\n return INITIAL_STATE\n case 'error':\n // Clear upload observable on error\n uploadRef.current?.unsubscribe()\n uploadRef.current = null\n return Object.assign({}, INITIAL_STATE, {error: action.error})\n default:\n return prev\n }\n },\n {\n stagedUpload: null,\n uploadStatus: null,\n error: null,\n }\n )\n\n // Make sure we close out the upload observer on dismount\n useEffect(() => {\n return () => {\n if (uploadRef.current && !uploadRef.current.closed) {\n uploadRef.current.unsubscribe()\n }\n }\n }, [])\n\n /* -------------------------------------------------------------------------- */\n /* Uploading */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Begins a file or URL upload with the staged files or URL.\n *\n * Should only be called from the UploadConfiguration component, which provides\n * the Mux configuration for the direct asset upload.\n *\n * @param settings The Mux new_asset_settings object to send to Sanity\n * @returns\n */\n const startUpload = (settings: MuxNewAssetSettings) => {\n const {stagedUpload} = state\n if (!stagedUpload || uploadRef.current) return\n dispatch({action: 'commitUpload'})\n let uploadObservable: Observable<UploadFileEvent | UploadUrlEvent>\n // eslint-disable-next-line default-case\n switch (stagedUpload.type) {\n case 'url':\n uploadObservable = uploadUrl({\n client: props.client,\n url: stagedUpload.url,\n settings,\n })\n break\n case 'file':\n uploadObservable = uploadFile({\n client: props.client,\n file: stagedUpload.files[0],\n settings,\n }).pipe(\n takeUntil(\n cancelUploadButton.observable.pipe(\n tap(() => {\n if (state.uploadStatus?.uuid) {\n props.client.delete(state.uploadStatus.uuid)\n }\n })\n )\n )\n )\n break\n }\n uploadRef.current = uploadObservable.subscribe({\n next: (event) => {\n switch (event.type) {\n case 'uuid':\n case 'file':\n case 'url':\n dispatch({action: 'progressInfo', ...event})\n break\n case 'progress':\n dispatch({action: 'progress', percent: event.percent})\n break\n case 'success':\n dispatch({action: 'progress', percent: 100})\n props.onChange(\n PatchEvent.from([\n setIfMissing({asset: {}}),\n set({_type: 'reference', _weak: true, _ref: event.asset._id}, ['asset']),\n ])\n )\n break\n case 'pause':\n case 'resume':\n default:\n break\n }\n },\n complete: () => dispatch({action: 'complete'}),\n error: (error) => dispatch({action: 'error', error}),\n })\n }\n\n /* -------------------------- Upload Initialization ------------------------- */\n // The below populate the uploadInput state field, which then triggers the\n // upload configuration, or the startUpload function if no config is required.\n\n // Stages an upload from the file selector\n const handleUpload = (files: FileList | File[]) => {\n dispatch({\n action: 'stageUpload',\n input: {type: 'file', files},\n })\n }\n\n // Stages and validates an upload from pasting an asset URL\n const handlePaste: React.ClipboardEventHandler<HTMLInputElement> = (event) => {\n event.preventDefault()\n event.stopPropagation()\n const clipboardData = event.clipboardData || (window as any).clipboardData\n const url = clipboardData.getData('text')\n if (!isValidUrl(url)) {\n toast.push({status: 'error', title: 'Invalid URL for Mux video input.'})\n return\n }\n dispatch({action: 'stageUpload', input: {type: 'url', url: url}})\n }\n\n // Stages and validates an upload from dragging+dropping files or folders\n const handleDrop: React.DragEventHandler<HTMLDivElement> = (event) => {\n setDragState(null)\n event.preventDefault()\n event.stopPropagation()\n extractDroppedFiles(event.nativeEvent.dataTransfer!).then((files) => {\n dispatch({\n action: 'stageUpload',\n input: {type: 'file', files},\n })\n })\n }\n\n /* ------------------------------- Drag State ------------------------------- */\n\n const handleDragOver: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.preventDefault()\n event.stopPropagation()\n }\n\n const handleDragEnter: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.stopPropagation()\n dragEnteredEls.current.push(event.target)\n const type = event.dataTransfer.items?.[0]?.type\n setDragState(type?.startsWith('video/') ? 'valid' : 'invalid')\n }\n\n const handleDragLeave: React.DragEventHandler<HTMLDivElement> = (event) => {\n event.stopPropagation()\n const idx = dragEnteredEls.current.indexOf(event.target)\n if (idx > -1) {\n dragEnteredEls.current.splice(idx, 1)\n }\n if (dragEnteredEls.current.length === 0) {\n setDragState(null)\n }\n }\n\n /* -------------------------------- Rendering ------------------------------- */\n\n // Upload has errored\n if (state.error !== null) {\n const error = {state}\n return (\n <Flex gap={3} direction=\"column\" justify=\"center\" align=\"center\">\n <Text size={5} muted>\n <ErrorOutlineIcon />\n </Text>\n <Text>Something went wrong</Text>\n {error instanceof Error && error.message && (\n <Text size={1} muted>\n {error.message}\n </Text>\n )}\n <Button text=\"Upload another file\" onClick={() => dispatch({action: 'reset'})} />\n </Flex>\n )\n }\n\n // Upload is in progress\n if (state.uploadStatus !== null) {\n const {uploadStatus} = state\n return (\n <UploadProgress\n onCancel={cancelUploadButton.handleClick}\n progress={uploadStatus.progress}\n filename={uploadStatus.file?.name || uploadStatus.url}\n />\n )\n }\n\n // Upload needs configuration\n if (state.stagedUpload !== null) {\n return (\n <UploadConfiguration\n stagedUpload={state.stagedUpload}\n pluginConfig={props.config}\n secrets={props.secrets}\n startUpload={startUpload}\n onClose={() => dispatch({action: 'reset'})}\n />\n )\n }\n\n // Default: No staged upload\n let tone: CardTone | undefined\n if (dragState) tone = dragState === 'valid' ? 'positive' : 'critical'\n\n return (\n <>\n <UploadCard\n tone={tone}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDragEnter={handleDragEnter}\n onPaste={handlePaste}\n ref={containerRef}\n >\n {props.asset ? (\n <DialogStateProvider\n dialogState={props.dialogState}\n setDialogState={props.setDialogState}\n >\n <Player\n readOnly={props.readOnly}\n asset={props.asset}\n onChange={props.onChange}\n buttons={\n <PlayerActionsMenu\n asset={props.asset}\n dialogState={props.dialogState}\n setDialogState={props.setDialogState}\n onChange={props.onChange}\n onSelect={handleUpload}\n readOnly={props.readOnly}\n />\n }\n />\n </DialogStateProvider>\n ) : (\n <UploadPlaceholder\n hovering={dragState !== null}\n onSelect={handleUpload}\n readOnly={!!props.readOnly}\n setDialogState={props.setDialogState}\n needsSetup={props.needsSetup}\n />\n )}\n </UploadCard>\n {props.dialogState === 'select-video' && (\n <InputBrowser\n asset={props.asset}\n onChange={props.onChange}\n setDialogState={props.setDialogState}\n />\n )}\n </>\n )\n}\n","import {Card} from '@sanity/ui'\nimport {memo, Suspense} 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 {MuxInputProps, PluginConfig} from '../util/types'\nimport ConfigureApi from './ConfigureApi'\nimport ErrorBoundaryCard from './ErrorBoundaryCard'\nimport {InputFallback} from './Input.styled'\nimport Onboard from './Onboard'\nimport Uploader from './Uploader'\n\nexport interface InputProps extends MuxInputProps {\n config: PluginConfig\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 <Card>\n <ErrorBoundaryCard schemaType={props.schemaType}>\n <Suspense fallback={<InputFallback />}>\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 </Suspense>\n </ErrorBoundaryCard>\n </Card>\n )\n}\n\nexport default memo(Input)\n","import Input from './components/Input'\nimport VideoThumbnail from './components/VideoThumbnail'\nimport type {MuxInputProps, PluginConfig, VideoAssetDocument} from './util/types'\n\nexport function muxVideoCustomRendering(config: PluginConfig) {\n return {\n components: {\n input: (props: MuxInputProps) => (\n <Input config={{...config, ...props.schemaType.options}} {...props} />\n ),\n },\n preview: {\n select: {\n filename: 'asset.filename',\n playbackId: 'asset.playbackId',\n status: 'asset.status',\n assetId: 'asset.assetId',\n thumbTime: 'asset.thumbTime',\n data: 'asset.data',\n },\n prepare: (asset: Partial<VideoAssetDocument>) => {\n const {filename, playbackId, status} = asset\n return {\n title: filename || playbackId || '',\n subtitle: status ? `status: ${status}` : null,\n media: asset.playbackId ? <VideoThumbnail asset={asset} width={64} /> : null,\n }\n },\n },\n }\n}\n","export const muxVideoSchema = {\n name: 'mux.video',\n type: 'object',\n title: 'Video asset reference',\n fields: [\n {\n title: 'Video',\n name: 'asset',\n type: 'reference',\n weak: true,\n to: [{type: 'mux.videoAsset'}],\n },\n ],\n}\n\nconst muxTrack = {\n name: 'mux.track',\n type: 'object',\n fields: [\n {type: 'string', name: 'id'},\n {type: 'string', name: 'type'},\n {type: 'number', name: 'max_width'},\n {type: 'number', name: 'max_frame_rate'},\n {type: 'number', name: 'duration'},\n {type: 'number', name: 'max_height'},\n ],\n}\n\nconst muxPlaybackId = {\n name: 'mux.playbackId',\n type: 'object',\n fields: [\n {type: 'string', name: 'id'},\n {type: 'string', name: 'policy'},\n ],\n}\n\nconst muxStaticRenditionFile = {\n name: 'mux.staticRenditionFile',\n type: 'object',\n fields: [\n {type: 'string', name: 'ext'},\n {type: 'string', name: 'name'},\n {type: 'number', name: 'width'},\n {type: 'number', name: 'bitrate'},\n {type: 'number', name: 'filesize'},\n {type: 'number', name: 'height'},\n ],\n}\n\nconst muxStaticRenditions = {\n name: 'mux.staticRenditions',\n type: 'object',\n fields: [\n {type: 'string', name: 'status'},\n {\n name: 'files',\n type: 'array',\n of: [{type: 'mux.staticRenditionFile'}],\n },\n ],\n}\n\nconst muxAssetData = {\n name: 'mux.assetData',\n title: 'Mux asset data',\n type: 'object',\n fields: [\n {\n type: 'string',\n name: 'resolution_tier',\n },\n {\n type: 'string',\n name: 'upload_id',\n },\n {\n type: 'string',\n name: 'created_at',\n },\n {\n type: 'string',\n name: 'id',\n },\n {\n type: 'string',\n name: 'status',\n },\n {\n type: 'string',\n name: 'max_stored_resolution',\n },\n {\n type: 'string',\n name: 'passthrough',\n },\n {\n type: 'string',\n name: 'encoding_tier',\n },\n {\n type: 'string',\n name: 'master_access',\n },\n {\n type: 'string',\n name: 'aspect_ratio',\n },\n {\n type: 'number',\n name: 'duration',\n },\n {\n type: 'number',\n name: 'max_stored_frame_rate',\n },\n {\n type: 'string',\n name: 'mp4_support',\n },\n {\n type: 'string',\n name: 'max_resolution_tier',\n },\n {\n name: 'tracks',\n type: 'array',\n of: [{type: 'mux.track'}],\n },\n {\n name: 'playback_ids',\n type: 'array',\n of: [{type: 'mux.playbackId'}],\n },\n {\n name: 'static_renditions',\n type: 'mux.staticRenditions',\n },\n ],\n}\n\nconst muxVideoAsset = {\n name: 'mux.videoAsset',\n type: 'object',\n title: 'Video asset',\n fields: [\n {\n type: 'string',\n name: 'status',\n },\n {\n type: 'string',\n name: 'assetId',\n },\n {\n type: 'string',\n name: 'playbackId',\n },\n {\n type: 'string',\n name: 'filename',\n },\n {\n type: 'number',\n name: 'thumbTime',\n },\n {\n type: 'mux.assetData',\n name: 'data',\n },\n ],\n}\n\nexport const schemaTypes = [\n muxTrack,\n muxPlaybackId,\n muxStaticRenditionFile,\n muxStaticRenditions,\n muxAssetData,\n muxVideoAsset,\n]\n","import {definePlugin} from 'sanity'\n\nimport createStudioTool, {DEFAULT_TOOL_CONFIG} from '../components/StudioTool'\nimport {muxVideoCustomRendering} from '../plugin'\nimport {muxVideoSchema, schemaTypes} from '../schema'\nimport type {PluginConfig} from '../util/types'\nexport type {VideoAssetDocument} from '../util/types'\n\nexport const defaultConfig: PluginConfig = {\n mp4_support: 'none',\n encoding_tier: 'smart',\n max_resolution_tier: '1080p',\n normalize_audio: false,\n defaultSigned: false,\n tool: DEFAULT_TOOL_CONFIG,\n}\n\nexport const muxInput = definePlugin<Partial<PluginConfig> | void>((userConfig) => {\n const config: PluginConfig = {...defaultConfig, ...(userConfig || {})}\n return {\n name: 'mux-input',\n schema: {\n types: [\n ...schemaTypes,\n {\n ...muxVideoSchema,\n ...muxVideoCustomRendering(config),\n },\n ],\n },\n tools: config.tool === false ? undefined : [createStudioTool(config)],\n }\n})\n"],"names":["useSanityClient","a","path","useClient","error","document","FormField","Label","c","secretsId","t","e","r","n","o","useErrorBoundary","uuid","uploadUrl","generateUuid","SelectAsset","u","_id","HiddenInput","PlayerActionsMenu","ErrorBoundaryCard","ConfigureApi","Input"],"mappings":"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","x_google_ignoreList":[27,57]}
|