{"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/PlaybackPolicyOption.tsx","../src/components/uploadConfiguration/PlaybackPolicyWarning.tsx","../src/components/uploadConfiguration/PlaybackPolicy.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(\n    useMemo(() => ({documentStore, sort, searchQuery}), [documentStore, sort, searchQuery])\n  )\n\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 {useEffect, useState} from 'react'\n\ntype IntersectionOptions = {\n  root?: Element | null\n  rootMargin?: string\n  threshold?: number\n  onChange?: (inView: boolean) => void\n}\n\nexport function useInView(\n  ref: React.RefObject<HTMLDivElement | null>,\n  options: IntersectionOptions = {}\n) {\n  const [inView, setInView] = useState(false)\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, ref])\n\n  return inView\n}\n","// Utils with a readName prefix are suspendable and should only be called in the render body\n// Not inside event callbacks or a useEffect.\n// They may be called dynamically, unlike useEffect\n\n// @TODO rename to readSigningPair\n\nimport type {SanityClient} from 'sanity'\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, useRef, 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 ref = useRef<HTMLDivElement | null>(null)\n  const inView = useInView(ref)\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}\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={{opacity: status === 'loaded' ? 1 : 0}}\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&apos;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 {useMemo, 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\n  const [references, referencesLoading] = useDocReferences(\n    useMemo(() => ({documentStore, id: props.asset._id}), [documentStore, props.asset._id])\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 async function createSigningKeys(client: SanityClient) {\n  try {\n    const {dataset} = client.config()\n    const res = await 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    return res\n  } catch (error: any) {\n    console.error('Error creating signing keys', error)\n    const message =\n      error.response?.statusCode === 401\n        ? 'Unauthorized - Failed to create the Signing Key. Please ensure that the token has \"System\" permissions'\n        : error.message\n    throw new Error(message)\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 {useTheme_v2} from '@sanity/ui'\nimport {CSSProperties, useId, useMemo} from 'react'\n\nexport interface Props {\n  height?: number\n}\nexport default function MuxLogo({height = 26}: Props) {\n  const id = useId()\n  const theme = useTheme_v2()\n  const fillColor = theme.color._dark ? 'white' : 'black'\n  const titleId = useMemo(() => `${id}-title`, [id])\n\n  const pathStyle: CSSProperties = {\n    fillRule: 'nonzero',\n  }\n\n  return (\n    <svg\n      aria-labelledby={titleId}\n      style={{height: `${height}px`}}\n      viewBox=\"0 0 1600 500\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlSpace=\"preserve\"\n    >\n      <g id=\"Layer-1\" fill={fillColor}>\n        <path\n          d=\"M994.287,93.486c-17.121,-0 -31,-13.879 -31,-31c0,-17.121 13.879,-31 31,-31c17.121,-0 31,13.879 31,31c0,17.121 -13.879,31 -31,31m0,-93.486c-34.509,-0 -62.484,27.976 -62.484,62.486l0,187.511c0,68.943 -56.09,125.033 -125.032,125.033c-68.942,-0 -125.03,-56.09 -125.03,-125.033l0,-187.511c0,-34.51 -27.976,-62.486 -62.485,-62.486c-34.509,-0 -62.484,27.976 -62.484,62.486l0,187.511c0,137.853 112.149,250.003 249.999,250.003c137.851,-0 250.001,-112.15 250.001,-250.003l0,-187.511c0,-34.51 -27.976,-62.486 -62.485,-62.486\"\n          style={pathStyle}\n        />\n        <path\n          d=\"M1537.51,468.511c-17.121,-0 -31,-13.879 -31,-31c0,-17.121 13.879,-31 31,-31c17.121,-0 31,13.879 31,31c0,17.121 -13.879,31 -31,31m-275.883,-218.509l-143.33,143.329c-24.402,24.402 -24.402,63.966 0,88.368c24.402,24.402 63.967,24.402 88.369,-0l143.33,-143.329l143.328,143.329c24.402,24.4 63.967,24.402 88.369,-0c24.403,-24.402 24.403,-63.966 0.001,-88.368l-143.33,-143.329l0.001,-0.004l143.329,-143.329c24.402,-24.402 24.402,-63.965 0,-88.367c-24.402,-24.402 -63.967,-24.402 -88.369,-0l-143.329,143.328l-143.329,-143.328c-24.402,-24.401 -63.967,-24.402 -88.369,-0c-24.402,24.402 -24.402,63.965 0,88.367l143.329,143.329l0,0.004Z\"\n          style={pathStyle}\n        />\n        <path\n          d=\"M437.511,468.521c-17.121,-0 -31,-13.879 -31,-31c0,-17.121 13.879,-31 31,-31c17.121,-0 31,13.879 31,31c0,17.121 -13.879,31 -31,31m23.915,-463.762c-23.348,-9.672 -50.226,-4.327 -68.096,13.544l-143.331,143.329l-143.33,-143.329c-17.871,-17.871 -44.747,-23.216 -68.096,-13.544c-23.349,9.671 -38.574,32.455 -38.574,57.729l0,375.026c0,34.51 27.977,62.486 62.487,62.486c34.51,-0 62.486,-27.976 62.486,-62.486l0,-224.173l80.843,80.844c24.404,24.402 63.965,24.402 88.369,-0l80.843,-80.844l0,224.173c0,34.51 27.976,62.486 62.486,62.486c34.51,-0 62.486,-27.976 62.486,-62.486l0,-375.026c0,-25.274 -15.224,-48.058 -38.573,-57.729\"\n          style={pathStyle}\n        />\n      </g>\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                    To use Signed URLs, the token must also have System permissions.\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_policy: boolean\n  public_policy: 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' | 'drm')[]\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 {Box, Checkbox, Flex, Grid, Stack, Text} from '@sanity/ui'\nimport {CSSProperties, useState} from 'react'\n\nimport {UploadConfigurationStateAction} from '../UploadConfiguration'\n\nexport default function PlaybackPolicyOption({\n  id,\n  checked,\n  optionName,\n  description,\n  dispatch,\n  action,\n}: {\n  id: string\n  checked: boolean\n  optionName: string\n  description: string\n  dispatch: any\n  action: UploadConfigurationStateAction['action']\n}) {\n  const [scale, setScale] = useState(1)\n\n  const boxStyle: CSSProperties = {\n    outline: '0.01rem solid grey',\n    transform: `scale(${scale})`,\n    transition: 'transform 0.1s ease-in-out',\n    cursor: 'pointer',\n    borderRadius: '0.25rem',\n  }\n\n  const triggerAnimation = () => {\n    setScale(0.98)\n    setTimeout(() => {\n      setScale(1)\n    }, 100)\n  }\n\n  const handleBoxClick = () => {\n    triggerAnimation()\n    dispatch({\n      action,\n      value: !checked,\n    })\n  }\n  return (\n    <label>\n      <Flex gap={3} padding={3} style={boxStyle}>\n        <Checkbox id={id} required checked={checked} onChange={handleBoxClick} />\n        <Grid gap={3}>\n          <Text size={3} weight=\"bold\">\n            {optionName}\n          </Text>\n          <Text size={2} muted>\n            {description}\n          </Text>\n        </Grid>\n      </Flex>\n    </label>\n  )\n}\n","import {WarningFilledIcon} from '@sanity/icons'\nimport {Box, Flex, Text} from '@sanity/ui'\nimport {CSSProperties} from 'react'\n\nexport default function PlaybackPolicyWarning() {\n  const textStyle: CSSProperties = {\n    color: '#13141A',\n    fontWeight: 500,\n  }\n\n  const boxStyle: CSSProperties = {\n    outline: '0.01rem solid grey',\n    backgroundColor: '#979cb0',\n    borderRadius: '0.5rem',\n    width: 'max-content',\n    color: '#13141A',\n  }\n\n  return (\n    <Box padding={2} style={boxStyle}>\n      <Flex align=\"center\" gap={2}>\n        <WarningFilledIcon />\n        <Text size={1} style={textStyle}>\n          Please select at least one Playback Policy\n        </Text>\n      </Flex>\n    </Box>\n  )\n}\n","import {Grid, Text} from '@sanity/ui'\n\nimport {Secrets, UploadConfig} from '../../util/types'\nimport PlaybackPolicyOption from './PlaybackPolicyOption'\nimport PlaybackPolicyWarning from './PlaybackPolicyWarning'\n\nexport default function PlaybackPolicy({\n  id,\n  config,\n  secrets,\n  dispatch,\n}: {\n  id: string\n  config: UploadConfig\n  secrets: Secrets\n  dispatch: any\n}) {\n  const noPolicySelected = !(config.public_policy || config.signed_policy)\n  return (\n    <Grid gap={3}>\n      <Text weight=\"bold\">Advanced Playback Policies</Text>\n      <PlaybackPolicyOption\n        id={`${id}--public`}\n        checked={config.public_policy}\n        optionName=\"Public\"\n        description=\"Playback IDs are accessible by constructing an HLS URL like https://stream.mux.com/{PLAYBACK_ID}\"\n        dispatch={dispatch}\n        action=\"public_policy\"\n      />\n      {secrets.enableSignedUrls && (\n        <PlaybackPolicyOption\n          id={`${id}--signed`}\n          checked={config.signed_policy}\n          optionName=\"Signed\"\n          description=\"Playback IDs should be used with tokens https://stream.mux.com/{PLAYBACK_ID}?token={TOKEN}. \n                // See Secure video playback for details about creating tokens.\"\n          dispatch={dispatch}\n          action=\"signed_policy\"\n        />\n      )}\n      {noPolicySelected && <PlaybackPolicyWarning />}\n    </Grid>\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 PlaybackPolicy from './uploadConfiguration/PlaybackPolicy'\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_policy'; value: UploadConfig['signed_policy']}\n  | {action: 'public_policy'; value: UploadConfig['public_policy']}\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              public_policy: true,\n              signed_policy: false,\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_policy':\n          return Object.assign({}, prev, {[action.action]: action.value})\n        case 'public_policy':\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_policy: secrets.enableSignedUrls && pluginConfig.defaultSigned,\n      public_policy: true,\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            {config.encoding_tier === 'smart' && (\n              <FormField title=\"Additional Configuration\">\n                <Stack space={2}>\n                  <PlaybackPolicy id={id} config={config} secrets={secrets} dispatch={dispatch} />\n\n                  {config.encoding_tier === 'smart' && (\n                    <Flex align=\"center\" gap={2} padding={[0, 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            disabled={\n              config.encoding_tier === 'smart' && !config.public_policy && !config.signed_policy\n            }\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 setPlaybackPolicy(config: UploadConfig): MuxNewAssetSettings['playback_policy'] {\n  const playback_policy: MuxNewAssetSettings['playback_policy'] = []\n  if (config.public_policy) {\n    playback_policy.push('public')\n  }\n  if (config.signed_policy) {\n    playback_policy.push('signed')\n  }\n  return playback_policy\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: setPlaybackPolicy(config),\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: 'document',\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","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]}