sanity-plugin-mux-input
5.0.85.0.9
dist/index.js.map~
dist/index.js.mapModified+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["ToolIcon","$","_c","t0","Symbol","for","MuxPlayerElement","ObjectInputProps","PartialDeep","StaticRenditionResolution","MuxInputConfig","static_renditions","mp4_support","max_resolution_tier","encoding_tier","video_quality","normalize_audio","defaultSigned","defaultPublic","defaultDrm","defaultAutogeneratedSubtitleLangs","SupportedMuxLanguage","defaultAutogeneratedSubtitleLang","disableUploadConfig","disableTextTrackConfig","disableDrmPlaybackWarning","acceptedMimeTypes","maxAssetFileSize","maxAssetDuration","hlsConfig","PluginConfig","tool","title","icon","React","ComponentType","allowedRolesForConfiguration","SUPPORTED_MUX_LANGUAGES","label","code","state","const","SUPPORTED_MUX_LANGUAGES_VALUES","map","l","TextTrack","_id","name","AutogeneratedTextTrack","type","language_code","CustomTextTrack","file","contents","size","isCustomTextTrack","track","Partial","UploadTextTrack","isAutogeneratedTrack","WatermarkConfig","enabled","imageUrl","imageAspectRatio","overlay_settings","MuxOverlaySettings","position","x","y","opacity","vertical_align","vertical_margin","horizontal_align","horizontal_margin","width","height","UploadConfig","Pick","text_tracks","signed_policy","public_policy","watermark","drm_policy","MuxNewAssetSettings","resolution","input","url","generated_subtitles","passthrough","start_time","end_time","text_type","closed_captions","playback_policy","PlaybackPolicy","advanced_playback_policies","AdvancedPlaybackPolicy","policy","drm_configuration_id","Secrets","token","secretKey","enableSignedUrls","signingKeyId","signingKeyPrivate","drmConfigId","MuxImageOrigin","MuxThumbnailUrl","MuxAnimatedThumbnailUrl","MuxVideoOrigin","MuxVideoUrl","FitMode","ThumbnailOptions","fit_mode","time","AnimatedThumbnailOptions","start","end","fps","AssetThumbnailOptions","asset","VideoAssetDocument","MuxErrors","messages","MuxPlaybackId","id","MuxVideoTrack","max_width","max_height","max_frame_rate","duration","MuxAudioTrack","max_channels","max_channel_layout","MuxTextTrack","text_source","status","error","MuxTrack","MuxAsset","created_at","max_stored_resolution","max_stored_frame_rate","aspect_ratio","playback_ids","tracks","errors","upload_id","is_live","live_stream_id","master","master_access","source_asset_id","files","ext","bitrate","filesize","resolution_tier","recording_times","started_at","non_standard_input_reasons","video_codec","audio_codec","video_gop_size","video_frame_rate","video_resolution","video_bitrate","pixel_aspect_ratio","video_edit_list","audio_edit_list","unexpected_media_file_parameters","test","meta","_type","_createdAt","_updatedAt","assetId","playbackId","filename","thumbTime","data","Reference","_ref","MuxInputProps","Button","Card","Dialog","Stack","Text","createContext","useCallback","useContext","useMemo","useState","PluginConfig","LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY","DrmPlaybackWarningContextContextProps","hasShownWarning","setHasWarnedAboutDrmPlayback","b","DrmPlaybackWarningContext","DrmPlaybackWarningContextProviderProps","config","children","React","ReactNode","DrmPlaybackWarningContextProvider","t0","$","_c","warningDisabled","disableDrmPlaybackWarning","t1","window","localStorage","getItem","hasWarned","hasWarnedAboutDrmPlayback","t2","Symbol","for","setItem","toString","setHasShownWarning","t3","value","t4","useDrmPlaybackWarningContext","context","DRMWarningDialog","onClose","_onClose","t5","t6","t7","useClient","useSanityClient","SANITY_API_VERSION","$","_c","t0","Symbol","for","apiVersion","compact","toLower","trim","uniq","words","SPECIAL_CHARS","STRIP_EDGE_CHARS","tokenize","string","match","map","token","replace","toGroqParams","terms","Record","params","reduce","acc","term","i","extractTermsFromQuery","query","quotedQueries","unquotedQuery","length","push","quotedTerms","str","remainingTerms","createConstraints","includeAssetId","searchPaths","constraints","_term","joinedPath","filter","constraint","join","createSearchFilter","useMemo","useState","collate","createHookFromObservableFactory","DocumentStore","useDocumentStore","SANITY_API_VERSION","createSearchFilter","VideoAssetDocument","ASSET_SORT_OPTIONS","createdDesc","groq","label","createdAsc","filenameAsc","filenameDesc","SortOption","useAssetDocuments","documentStore","sort","searchQuery","search","filter","Boolean","join","sortFragment","listenQuery","params","apiVersion","useAssets","$","_c","setSort","setSearchQuery","t0","t1","isLoading","t2","undefined","assetDocuments","t3","map","_temp","assets","t4","collated","draft","published","_id","id","useState","DialogState","useDialogState","SetDialogState","ReturnType","global","__PKG_VERSION__","PLUGIN_VERSION","PLUGIN_VERSION","PLUGIN_VERSION_QUERY","sanityVersion","defer","SanityClient","PLUGIN_VERSION_QUERY","SecretsDocument","_id","_type","token","secretKey","enableSignedUrls","signingKeyId","signingKeyPrivate","drmConfigId","saveSecrets","client","Promise","doc","createOrReplace","createSigningKeys","dataset","config","res","request","data","private_key","id","created_at","url","withCredentials","method","query","error","console","message","response","statusCode","Error","cause","testSecrets","status","haveValidSigningKeys","e","testSecretsObservable","observable","useCallback","SanityClient","createSigningKeys","haveValidSigningKeys","saveSecrets","testSecrets","Secrets","useSaveSecrets","client","secrets","token","secretKey","enableSignedUrls","drmConfigId","Pick","Promise","signingKeyId","signingKeyPrivate","valid","status","Error","err","console","error","hasValidSigningKeys","data","id","private_key","log","message","name","const","cacheNs","muxSecretsDocumentId","DIALOGS_Z_INDEX","MEZZANINE_LEARN_MORE_URL","THUMBNAIL_ASPECT_RATIO","MIN_ASPECT_RATIO","AUDIO_ASPECT_RATIO","useMemo","useDocumentValues","muxSecretsDocumentId","Secrets","path","useSecretsDocumentValues","$","_c","error","isLoading","value","exists","Boolean","t0","token","t1","secretKey","t2","enableSignedUrls","t3","signingKeyId","t4","signingKeyPrivate","t5","drmConfigId","t6","secrets","t7","t8","t9","isInitialSetup","needsSetup","cache","t10","useReducer","Secrets","State","Pick","submitting","error","Action","type","payload","name","value","init","token","secretKey","enableSignedUrls","drmConfigId","reducer","state","action","Error","useSecretsFormState","secrets","SanityClient","suspend","cacheNs","Secrets","_id","const","readSecrets","client","projectId","dataset","config","data","fetch","token","secretKey","enableSignedUrls","Boolean","signingKeyId","signingKeyPrivate","drmConfigId","useTheme_v2","CSSProperties","useId","useMemo","Props","height","MuxLogo","t0","$","_c","t1","undefined","id","theme","fillColor","color","_dark","titleId","t2","Symbol","for","fillRule","pathStyle","t3","t4","t5","t6","t7","t8","t9","styled","MuxLogo","Logo","span","Header","$","_c","t0","Symbol","for","Box","Flex","Stack","Text","memo","Props","children","React","ReactNode","title","description","inputId","FormField","props","$","_c","t0","t1","t2","t3","t4","t5","Box","Button","Card","Checkbox","Code","Dialog","Flex","Inline","Stack","Text","TextInput","useCallback","useEffect","useId","useMemo","useRef","clear","preload","useClient","SetDialogState","useDialogState","useSaveSecrets","useSecretsDocumentValues","useSecretsFormState","cacheNs","DIALOGS_Z_INDEX","_id","secretsId","Secrets","Header","FormField","ConfigureApiDialogProps","setDialogState","secrets","fieldNames","const","ConfigureApiDialog","t0","$","_c","client","state","dispatch","hasSecretsInitially","token","secretKey","t1","handleClose","dirty","enableSignedUrls","drmConfigId","id","t2","map","field","tokenId","secretKeyId","enableSignedUrlsId","drmConfigIdId","firstField","handleSaveSecrets","saving","t3","event","preventDefault","current","currentTarget","reportValidity","type","then","savedSecrets","projectId","dataset","config","Promise","resolve","catch","err","payload","message","finally","handleSubmit","t4","event_0","name","value","handleChangeToken","t5","event_1","handleChangeSecretKey","t6","event_2","checked","handleChangeEnableSignedUrls","t7","event_3","handleChangeDrmConfigId","t8","t9","Symbol","for","focus","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","display","t21","t22","t23","t24","signingKeyId","t25","t26","t27","t28","t29","t30","t31","t32","t33","submitting","t34","t35","t36","error","t37","t38","t39","ConfigureApi","dialogOpen","setDialogOpen","secretDocumentValues","openDialog","truncateString","generateAssetPlaceholder","assetId","isEmptyOrPlaceholderTitle","filename","trim","placeholder","MuxAsset","parseMuxDate","date","Date","Number","SanityClient","PLUGIN_VERSION_QUERY","MuxAsset","VideoAssetDocument","deleteAssetOnMux","client","assetId","dataset","config","request","url","withCredentials","method","query","deleteAsset","asset","deleteOnMux","_id","delete","getAsset","data","listAssets","options","limit","cursor","toString","next_cursor","addTextTrackFromUrl","vttUrl","language_code","name","text_type","body","type","headers","generateSubtitles","audioTrackId","generated_subtitles","deleteTextTrack","trackId","updateMasterAccess","masterAccess","master_access","useEffect","useState","defer","of","timer","concatMap","expand","tap","SanityClient","listAssets","MuxAsset","ASSETS_PER_PAGE","MuxAssetsState","cursor","loading","data","error","FetchError","hasSkippedAssetsWithoutPlayback","_tag","PageResult","next_cursor","fetchMuxAssetsPage","client","Promise","response","limit","accumulateIntermediateState","currentState","pageResult","currentData","newAssets","validAssets","skippedInThisPage","reduce","acc","asset","hasPlaybackIds","playback_ids","length","isDuplicate","some","a","id","push","undefined","hasMorePages","useMuxAssets","t0","$","_c","enabled","t1","Symbol","for","state","setState","t2","subscription","pipe","pageResult_0","prevState","subscribe","complete","_temp","unsubscribe","t3","prev","uuid","useMemo","useState","createHookFromObservableFactory","DocumentStore","useClient","useDocumentStore","generateAssetPlaceholder","parseMuxDate","MuxAsset","VideoAssetDocument","SANITY_API_VERSION","useMuxAssets","useSecretsDocumentValues","ImportState","AssetInSanity","uploadId","assetId","useImportMuxAssets","$","_c","documentStore","t0","Symbol","for","apiVersion","client","assetsInSanity","assetsInSanityLoading","useAssetsInSanity","secretDocumentValues","hasSecrets","value","secrets","secretKey","importError","setImportError","importState","setImportState","dialogOpen","t1","t2","enabled","muxAssets","t3","data","filter","a","assetExistsInSanity","undefined","missingAssets","t4","selectedAssets","setSelectedAssets","t5","closeDialog","t6","openDialog","t7","importAssets","documents","flatMap","_temp","tx","transaction","forEach","doc","create","commit","returnDocuments","t8","error","asset","muxAssetToSanityDocument","playbackId","playback_ids","find","p","id","_id","_type","_updatedAt","Date","toISOString","_createdAt","created_at","filename","meta","title","status","listenQuery","existingAssets","some","existing","upload_id","useEffect","useState","IntersectionOptions","root","Element","rootMargin","threshold","onChange","inView","useInView","ref","t0","$","_c","t1","undefined","options","setInView","t2","t3","current","observer","IntersectionObserver","t4","obs","entry","nowInView","isIntersecting","thresholds","some","intersectionRatio","toObserve","observe","unobserve","AdvancedPlaybackPolicy","MuxPlaybackId","PlaybackPolicy","VideoAssetDocument","getPlaybackId","asset","Pick","priority","TypeError","playbackIds","data","playback_ids","length","policy","match","find","entry","id","e","console","error","getPlaybackPolicy","playbackId","getPlaybackPolicyById","hasPlaybackPolicy","Partial","playback_policy","advanced_playback_policies","p","SanityClient","suspend","readSecrets","AnimatedThumbnailOptions","ThumbnailOptions","Audience","Payload","T","generateJwt","client","playbackId","aud","payload","signingKeyId","signingKeyPrivate","TypeError","default","sign","JSON","parse","stringify","_","v","undefined","atob","algorithm","keyid","audience","subject","noTimestamp","expiresIn","SanityClient","getPlaybackId","Audience","generateJwt","getPlaybackPolicyById","AssetThumbnailOptions","createUrlParamsObject","client","asset","params","audience","playbackId","searchParams","URLSearchParams","JSON","parse","stringify","_","v","undefined","playbackPolicy","policy","token","SanityClient","createUrlParamsObject","AnimatedThumbnailOptions","MuxAnimatedThumbnailUrl","AssetThumbnailOptions","AnimatedPosterSrcOptions","asset","client","getAnimatedPosterSrc","height","width","start","thumbTime","Math","max","end","fps","params","playbackId","searchParams","SanityClient","createUrlParamsObject","MuxThumbnailUrl","ThumbnailOptions","AssetThumbnailOptions","PosterSrcOptions","asset","client","getPosterSrc","fit_mode","height","time","thumbTime","undefined","width","params","playbackId","searchParams","tryWithSuspend","block","T","onError","error","Error","E","errorOrPromise","Promise","undefined","ErrorOutlineIcon","Box","Card","CardTone","Spinner","Stack","Text","Suspense","useMemo","useRef","useState","styled","useClient","useInView","THUMBNAIL_ASPECT_RATIO","getAnimatedPosterSrc","getPosterSrc","tryWithSuspend","AssetThumbnailOptions","MuxAnimatedThumbnailUrl","MuxThumbnailUrl","Image","img","ImageStatus","STATUS_TO_TONE","Record","loading","error","loaded","VideoThumbnail","asset","width","staticImage","posterWidth","client","ref","HTMLDivElement","inView","status","setStatus","setError","thumbnailSrc","thumbnail","err","Error","handleError","message","undefined","handleLoad","aspectRatio","position","maxWidth","flex","left","top","transform","justifyItems","fontSize","filename","assetId","opacity","CheckmarkCircleIcon","ErrorOutlineIcon","InfoOutlineIcon","RetrieveIcon","RetryIcon","Box","Button","Card","Checkbox","Code","Dialog","Flex","Heading","Spinner","Stack","Text","truncateString","useFormattedDuration","styled","useImportMuxAssets","DIALOGS_Z_INDEX","MuxAsset","VideoThumbnail","MissingAssetCheckbox","MissingAsset","t0","$","_c","asset","selectAsset","selected","duration","t1","id","t2","undefined","t3","Symbol","for","position","t4","e","currentTarget","checked","t5","t6","t7","playback_ids","find","_temp","t8","assetId","data","filename","playbackId","t9","t10","t11","formatted","t12","t13","created_at","Date","Number","toLocaleDateString","year","day","month","t14","t15","t16","t17","p","ImportVideosDialog","props","importState","canTriggerImport","selectedAssets","length","isImporting","noAssetsToImport","missingAssets","muxAssets","loading","assetsInSanityLoading","closeDialog","importAssets","hasSkippedAssetsWithoutPlayback","error","importError","textAlign","display","selectAll","setSelectedAssets","map","filter","a","some","a_0","ImportVideosFromMux","hasSecrets","dialogOpen","openDialog","ChevronLeftIcon","ChevronRightIcon","Button","Label","Dispatch","SetStateAction","useEffect","PageSelector","props","$","_c","page","setPage","t0","t1","total","clamped","Math","min","max","t2","Symbol","for","cursor","t3","t4","p","t5","t6","t7","t8","t9","t10","p_0","t11","t12","MuxAsset","addKeysToMuxData","data","tracks","map","track","index","_key","id","playback_ids","playbackId","static_renditions","files","file","undefined","useMemo","useState","createHookFromObservableFactory","DocumentStore","useClient","useDocumentStore","addKeysToMuxData","isEmptyOrPlaceholderTitle","VideoAssetDocument","SANITY_API_VERSION","useMuxAssets","useSecretsDocumentValues","ResyncState","useResyncMuxMetadata","$","_c","documentStore","t0","Symbol","for","apiVersion","client","sanityAssets","sanityAssetsLoading","useSanityAssets","secretDocumentValues","hasSecrets","value","secrets","secretKey","resyncError","setResyncError","resyncState","setResyncState","dialogOpen","t1","t2","enabled","muxAssets","t3","data","map","sanityDoc","muxAsset","find","m","id","assetId","muxTitle","meta","title","currentTitle","filename","undefined","matchedAssets","t4","closeDialog","t5","openDialog","t6","syncAllVideos","tx","transaction","forEach","matched","newTitle","patch","_id","set","commit","returnDocuments","t7","error","syncOnlyEmpty","tx_0","matched_0","t8","syncFullData","tx_1","matched_1","dataWithKeys","status","t9","listenQuery","CheckmarkCircleIcon","ErrorOutlineIcon","SyncIcon","Box","Button","Card","Dialog","Flex","Heading","Radio","Spinner","Stack","Text","useState","useResyncMuxMetadata","isEmptyOrPlaceholderTitle","DIALOGS_Z_INDEX","SyncOption","OptionCardProps","id","selected","onSelect","title","count","description","disabled","OptionCard","t0","$","_c","t1","t2","t3","t4","cursor","opacity","t5","t6","t7","t8","t9","t10","t11","ResyncMetadataDialog","props","resyncState","matchedAssets","filter","_temp","length","videosToUpdate","_temp2","videosWithEmptyOrPlaceholder","hasEmptyTitles","defaultOption","selectedOption","setSelectedOption","canTriggerResync","isResyncing","isDone","isLoading","muxAssets","loading","sanityAssetsLoading","bb54","syncOnlyEmpty","syncAllVideos","syncFullData","handleSync","closeDialog","error","resyncError","textAlign","m_0","m","muxAsset","muxTitle","currentTitle","ResyncMetadata","resyncMetadata","hasSecrets","dialogOpen","openDialog","SortIcon","Button","Menu","MenuButton","MenuItem","PopoverProps","useId","ASSET_SORT_OPTIONS","SortOption","CONTEXT_MENU_POPOVER_PROPS","constrainSize","placement","portal","width","SelectSortOptions","props","$","_c","id","t0","Symbol","for","cursor","t1","Object","entries","t2","map","t3","type","t4","label","setSort","sort","Box","Spinner","SpinnerBox","React","FC","$","_c","t0","Symbol","for","display","alignItems","justifyContent","minHeight","Flex","Text","IconInfo","React","FC","text","icon","size","muted","props","$","_c","Icon","t0","t1","t2","t3","t4","t5","SVGProps","ResolutionIcon","props","$","_c","t0","Symbol","for","t1","SVGProps","StopWatchIcon","props","$","_c","t0","t1","t2","Symbol","for","t3","useToast","useCallback","useEffect","useMemo","useState","getAsset","updateMasterAccess","addKeysToMuxData","MuxAsset","VideoAssetDocument","useClient","MezzanineStatus","POLL_INTERVAL_MS","UseMezzanineReturn","status","busy","expired","resolution","enable","Promise","download","getMezzanineStatus","asset","master","data","url","useMezzanine","client","toast","setBusy","setExpired","prevAssetId","setPrevAssetId","assetId","max_resolution_tier","max_stored_resolution","undefined","persist","_id","patch","set","commit","returnDocuments","refresh","cancelled","running","interval","setInterval","clearInterval","error","console","push","title","description","Error","message","triggerMezzanineDownload","masterUrl","window","anchor","document","createElement","href","target","rel","body","appendChild","click","removeChild","Stack","Text","MezzanineExplanation","$","_c","t0","Symbol","for","DownloadIcon","Button","Card","Flex","Label","Spinner","Stack","Text","useMezzanine","MEZZANINE_LEARN_MORE_URL","VideoAssetDocument","MezzanineExplanation","Props","asset","withExplanation","Mezzanine","t0","$","_c","t1","undefined","status","busy","expired","resolution","enable","download","assetReady","data","isReady","isPreparing","showExplanation","t2","Symbol","for","t3","t4","t5","t6","t7","t8","t9","color","t10","t11","t12","t13","useToast","useCallback","useState","getAsset","addKeysToMuxData","MuxAsset","VideoAssetDocument","useClient","ResyncAssetState","UseResyncAssetOptions","showToast","onSuccess","updatedData","onError","error","UseResyncAssetReturn","resyncState","resyncError","resyncAsset","asset","Promise","isResyncing","useResyncAsset","options","client","toast","setResyncState","setResyncError","assetId","push","title","description","status","Error","undefined","_id","response","muxData","data","dataWithKeys","patch","set","meta","filename","commit","returnDocuments","console","SanityClient","getAsset","generateJwt","getPlaybackId","getPlaybackPolicy","MuxTextTrack","VideoAssetDocument","extractErrorMessage","error","defaultMessage","message","err","response","body","match","includes","parts","split","length","replace","trim","PollTrackStatusOptions","client","assetId","trackName","trackLanguageCode","maxAttempts","onTrackFound","track","onTrackErrored","onTrackReady","PollTrackStatusResult","found","status","pollTrackStatus","options","Promise","trimmedName","trimmedLanguageCode","newTrack","attempts","trackFound","findTrack","textTracks","foundTrack","find","name","language_code","resolve","setTimeout","assetData","data","tracks","filter","type","console","undefined","downloadVttFile","asset","id","Error","playbackId","playbackPolicy","policy","downloadUrl","token","fetch","ok","statusText","blob","blobUrl","URL","createObjectURL","link","document","createElement","href","download","filename","appendChild","click","removeChild","revokeObjectURL","TranslateIcon","UploadIcon","Autocomplete","Button","Card","Checkbox","Dialog","Flex","Label","Spinner","Stack","Text","TextInput","useToast","LanguagesList","useId","useRef","useState","addTextTrackFromUrl","generateSubtitles","getAsset","useClient","addKeysToMuxData","extractErrorMessage","pollTrackStatus","MuxTextTrack","SUPPORTED_MUX_LANGUAGES","VideoAssetDocument","LANGUAGE_OPTIONS","getAllCodes","map","code","value","label","getNativeName","MUX_LANGUAGE_OPTIONS","lang","Props","asset","onAdd","track","onClose","AddCaptionDialog","client","toast","dialogId","isAutogenerated","setIsAutogenerated","vttUrl","setVttUrl","languageCode","setLanguageCode","selectedLanguage","setSelectedLanguage","name","setName","isSubmitting","setIsSubmitting","selectedFile","setSelectedFile","File","fileInputRef","HTMLInputElement","uploadVttFile","file","Promise","assetDocument","assets","upload","filename","url","refreshAssetData","_id","assetId","latestAssetData","dataWithKeys","data","patch","set","status","commit","returnDocuments","refreshError","console","error","handleAddTrackFromUrl","Error","trimmedName","trim","trimmedLanguageCode","vttUrlToUse","uploadError","push","title","description","language_code","text_type","result","trackName","trackLanguageCode","onTrackErrored","errorMessage","messages","type","found","handleGenerateSubtitles","assetData","audioTrack","tracks","find","id","mockTrackId","Date","now","Math","random","toString","slice","mockTrack","text_source","handleSubmit","URL","display","e","currentTarget","checked","current","click","target","files","length","textAlign","newValue","options","selected","opt","query","option","toLowerCase","indexOf","l","verticalAlign","marginBottom","width","height","marginRight","DownloadIcon","TranslateIcon","UploadIcon","Autocomplete","Button","Card","Dialog","Flex","Label","Spinner","Stack","Text","TextInput","useToast","LanguagesList","useEffect","useId","useRef","useState","addTextTrackFromUrl","deleteTextTrack","getAsset","useClient","addKeysToMuxData","generateJwt","getPlaybackId","getPlaybackPolicy","downloadVttFile","extractErrorMessage","pollTrackStatus","MuxTextTrack","VideoAssetDocument","LANGUAGE_OPTIONS","getAllCodes","map","code","value","label","getNativeName","Props","asset","track","onUpdate","oldTrackId","onClose","EditCaptionDialog","client","toast","dialogId","isAutogenerated","text_source","vttUrl","setVttUrl","languageCode","setLanguageCode","language_code","selectedLanguage","setSelectedLanguage","baseCode","split","found","find","opt","name","foundByName","setName","isSubmitting","setIsSubmitting","downloading","setDownloading","selectedFile","setSelectedFile","File","fileInputRef","HTMLInputElement","foundByCode","handleDownloadCurrentFile","error","errorMessage","title","Error","message","includes","push","status","description","getCurrentFileName","id","filename","uploadVttFile","file","Promise","assetDocument","assets","upload","url","refreshAssetData","_id","assetId","latestAssetData","dataWithKeys","data","patch","set","commit","returnDocuments","refreshError","console","handleUpdateTrackWithNewUrl","trimmedName","trim","trimmedLanguageCode","deleteError","vttUrlToUse","uploadError","text_type","result","trackName","trackLanguageCode","onTrackErrored","erroredTrack","messages","type","handleSubmit","originalVttUrl","playbackId","policy","token","urlChanged","URL","verticalAlign","display","marginTop","width","height","current","click","e","target","files","length","currentTarget","newValue","selected","query","option","toLowerCase","indexOf","l","marginBottom","marginRight","AddIcon","ChevronDownIcon","ChevronUpIcon","DownloadIcon","EditIcon","ErrorOutlineIcon","TrashIcon","Box","Button","Card","Dialog","Flex","Heading","Spinner","Stack","Text","useToast","useEffect","useId","useMemo","useState","deleteTextTrack","useClient","useResyncAsset","downloadVttFile","MuxTextTrack","VideoAssetDocument","AddCaptionDialog","EditCaptionDialog","TrackCardProps","track","iconOnly","downloadingTrackId","deletingTrackId","trackToEdit","getTrackSourceLabel","handleDownload","setTrackToEdit","setTrackToDelete","TrackCard","t0","$","_c","t1","id","action","isDisabled","t2","status","width","height","verticalAlign","display","marginBottom","marginTop","undefined","renderActionButtons","t3","t4","name","t5","t6","t7","t8","color","t9","t10","language_code","t11","error","messages","type","t12","t13","t14","t15","TextTracksManagerProps","asset","tracks","collapseTracks","TextTracksManager","propTracks","client","toast","dialogId","resyncAsset","setDownloadingTrackId","setDeletingTrackId","addedTracks","setAddedTracks","updatedTracks","setUpdatedTracks","Map","trackActivityOrder","setTrackActivityOrder","autogeneratedTrackIds","setAutogeneratedTrackIds","Set","trackToDelete","showAddDialog","setShowAddDialog","isExpanded","setIsExpanded","MAX_VISIBLE_TRACKS","realTracks","data","filter","activeTracks","allTracks","tracksWithUpdates","map","updated","get","isMockTrackReplaced","mockTrack","realTracksList","startsWith","some","realTrack","nameMatches","languageMatches","isGenerated","text_source","isTrackAlreadyInRealTracks","addedTrack","tracksToKeep","newAutogeneratedIds","forEach","add","find","rt","prev","hasNew","has","preparingTracks","length","assetId","_id","interval","setInterval","muxData","fetchedTracks","fetchedTracksList","findMatchingRealTrack","tracksList","replaced","prevOrder","mockOrder","newMap","set","size","prevIds","console","clearInterval","visibleTracks","sort","a","b","orderA","orderB","aIsPreparing","bIsPreparing","aIsAutogenerated","bIsAutogenerated","push","title","description","Error","message","confirmDelete","t","delete","handleAddTrack","handleUpdateTrack","updatedTrack","oldTrackId","isAddedTrack","displayedTracks","slice","hasMoreTracks","minHeight","alignItems","justifyContent","createContext","useContext","useMemo","DialogState","SetDialogState","DialogStateContextProps","dialogState","setDialogState","DialogStateContext","DialogStateProviderProps","children","React","ReactNode","DialogStateProvider","t0","$","_c","t1","value","t2","useDialogStateContext","context","SanityClient","generateJwt","MuxPlaybackId","MuxVideoUrl","VideoSrcOptions","muxPlaybackId","client","getVideoSrc","searchParams","URLSearchParams","policy","token","id","set","Dialog","Stack","useId","useDialogStateContext","VideoAssetDocument","TextTracksManager","Props","asset","CaptionsDialog","t0","$","_c","setDialogState","dialogId","t1","t2","t3","formatSeconds","seconds","Number","isNaN","hrs","mins","secs","ret","formatSecondsToHHMMSS","Math","floor","toString","padStart","isValidTimeFormat","time","regex","test","getSecondsFromTimeFormat","hh","mm","ss","split","map","Button","Dialog","Flex","Stack","Text","TextInput","useId","useMemo","useState","getDevicePixelRatio","useDialogStateContext","useClient","formatSecondsToHHMMSS","getSecondsFromTimeFormat","isValidTimeFormat","VideoAssetDocument","VideoThumbnail","Props","asset","currentTime","EditThumbnailDialog","t0","$","_c","t1","undefined","client","setDialogState","dialogId","t2","timeFormatted","setTimeFormatted","nextTime","setNextTime","inputError","setInputError","t3","thumbTime","assetWithNewThumbnail","saving","setSaving","saveThumbnailError","setSaveThumbnailError","t4","_id","patch","set","commit","returnDocuments","then","catch","finally","handleSave","t5","Symbol","for","maxDpr","width","t6","event","value","currentTarget","totalSeconds","handleInputChange","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","SVGProps","AudioIcon","props","$","_c","t0","Symbol","for","opacity","t1","Box","Dialog","Stack","useId","useDialogStateContext","getMezzanineStatus","DIALOGS_Z_INDEX","VideoAssetDocument","Mezzanine","MezzanineExplanation","Props","asset","onClose","MezzanineDialog","t0","$","_c","setDialogState","dialogId","t1","closing","t2","status","showExplanation","t3","t4","t5","t6","MuxPlayerProps","MuxPlayerRefAttributes","MuxPlayer","ErrorOutlineIcon","Card","Text","PropsWithChildren","Suspense","useMemo","useRef","useState","PLUGIN_VERSION","useDialogStateContext","useClient","AUDIO_ASPECT_RATIO","MIN_ASPECT_RATIO","generateJwt","getPlaybackId","getPlaybackPolicyById","getPosterSrc","getVideoSrc","tryWithSuspend","VideoAssetDocument","CaptionsDialog","EditThumbnailDialog","AudioIcon","MezzanineDialog","VideoPlayer","asset","thumbnailWidth","children","hlsConfig","props","forceAspectRatio","Partial","Pick","client","dialogState","isAudio","assetIsAudio","muxPlayer","playerContainerRef","HTMLDivElement","error","setError","Error","playbackId","e","TypeError","cause","undefined","muxPlaybackId","src","poster","width","signedToken","url","URL","searchParams","get","drmToken","policy","tokens","playback","thumbnail","storyboard","drm","partialTokens","height","data","aspect_ratio","split","map","Number","targetAspectRatio","isNaN","aspectRatio","Math","max","position","display","alignItems","padding","top","left","zIndex","player_name","player_version","page_type","objectFit","alignSelf","transform","marginRight","message","current","currentTime","max_stored_resolution","WarningOutlineIcon","SanityDocument","GeneralPreviewLayoutKey","SanityDefaultPreview","MissingSchemaTypeProps","layout","value","getUnknownTypeFallback","id","typeName","title","subtitle","media","MissingSchemaType","props","$","_c","t0","_id","_type","t1","useTimeAgo","TimeAgoProps","time","Date","TimeAgo","t0","$","_c","timeAgo","t1","EditIcon","Box","Text","Tooltip","PreviewValue","SanityDocument","TextWithTone","TimeAgo","DraftStatus","props","$","_c","document","updatedAt","_updatedAt","t0","t1","t2","t3","Symbol","for","t4","t5","PublishIcon","Box","Text","Tooltip","PreviewValue","SanityDocument","TextWithTone","TimeAgo","PublishedStatus","props","$","_c","document","updatedAt","_updatedAt","t0","t1","t2","t3","Symbol","for","t4","t5","Inline","isNumber","isString","isValidElement","useMemo","useObservable","SanityDocument","SchemaType","DocumentPresence","DocumentPreviewPresence","DocumentPreviewStore","GeneralPreviewLayoutKey","getPreviewStateObservable","getPreviewValueWithFallback","isRecord","SanityDefaultPreview","DraftStatus","PublishedStatus","PaneItemPreviewProps","documentPreviewStore","icon","React","ComponentType","layout","presence","schemaType","value","PaneItemPreview","props","$","_c","title","t0","_id","observable","t1","Symbol","for","isLoading","snapshot","original","t2","length","status","t3","fallback","t4","t5","DocumentIcon","useMemo","CollatedHit","SanityDocument","SchemaType","PreviewCard","useDocumentPresence","useDocumentPreviewStore","useSchema","IntentLink","MissingSchemaType","PaneItemPreview","DocumentPreviewProps","schemaType","documentPair","getIconWithFallback","icon","React","ComponentType","defaultIcon","DocumentPreview","props","$","_c","doc","draft","published","id","documentPreviewStore","schema","documentPresence","hasSchemaType","Boolean","name","get","t0","bb0","t1","undefined","t2","children","SanityDocument","Box","Card","Text","collate","useSchema","styled","DocumentPreview","SpinnerBox","Container","props","theme","sanity","color","base","fg","fonts","text","sizes","VideoReferences","React","FC","references","isLoaded","$","_c","schema","t0","Symbol","for","length","T0","documentPairs","map","documentPair","schemaType","get","type","id","overflow","t1","TrashIcon","Box","Button","Card","Checkbox","Dialog","Flex","Heading","Stack","Text","useToast","useEffect","useState","SanityDocument","deleteAsset","useClient","DIALOGS_Z_INDEX","VideoAssetDocument","SpinnerBox","VideoReferences","DeleteDialog","t0","$","_c","asset","references","referencesLoading","cancelDelete","succeededDeleting","client","state","setState","deleteOnMux","setDeleteOnMux","toast","t1","length","t2","t3","confirmDelete","worked","push","title","status","description","t4","Symbol","for","minHeight","display","alignItems","justifyContent","t5","t6","marginBottom","t7","_temp","margin","some","s","t8","t9","t10","t11","prev","createHookFromObservableFactory","DocumentStore","SanityDocument","SANITY_API_VERSION","useDocReferences","documentStore","id","listenQuery","apiVersion","formatSeconds","MuxTextTrack","VideoAssetDocument","getVideoMetadata","doc","id","assetId","_id","date","data","created_at","Date","Number","_createdAt","_updatedAt","now","title","filename","slice","playbackId","createdAt","duration","undefined","playback_ids","aspect_ratio","max_stored_resolution","max_stored_frame_rate","text_tracks","tracks","filter","track","type","useToast","useMemo","useState","useDocumentStore","useClient","useDocReferences","useResyncAsset","getVideoMetadata","VideoAssetDocument","VideoDetailsState","VideoDetailsProps","closeDialog","asset","autoPlay","useVideoDetails","props","$","_c","documentStore","toast","client","t0","_id","id","references","referencesLoading","t1","originalAsset","setOriginalAsset","filename","setFilename","modified","t2","displayInfo","state","setState","t3","Symbol","for","showToast","resyncAsset","isResyncing","t4","handleResync","t5","handleClose","t6","confirmClose","shouldClose","t7","saveChanges","patch","set","commit","prev","push","title","description","status","t8","error","CalendarIcon","CheckmarkIcon","ClockIcon","CropIcon","EditIcon","ErrorOutlineIcon","RevertIcon","SearchIcon","SyncIcon","TagIcon","TrashIcon","Button","Card","Dialog","Flex","Heading","Spinner","Stack","Tab","TabList","TabPanel","Text","TextInput","useEffect","useRef","useState","DIALOGS_Z_INDEX","MuxPlaybackId","MuxTextTrack","PlaybackPolicy","FormField","IconInfo","ResolutionIcon","StopWatchIcon","Mezzanine","TextTracksManager","VideoPlayer","DeleteDialog","useVideoDetails","VideoDetailsProps","VideoReferences","AssetInput","React","FC","label","description","placeholder","value","onInput","e","FormEvent","HTMLInputElement","disabled","props","$","_c","t0","t1","VideoDetails","tab","setTab","displayInfo","filename","modified","references","referencesLoading","setFilename","state","setState","handleClose","confirmClose","saveChanges","handleResync","isResyncing","isSaving","containerHeight","setContainerHeight","contentsRef","Symbol","for","current","getBoundingClientRect","height","t2","title","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","asset","closeDialog","t13","textAlign","t14","containerType","t15","t16","minHeight","undefined","t17","autoPlay","t18","t19","text_tracks","data","tracks","filter","_temp","t20","t21","t22","t23","t24","length","t25","t26","t27","t28","t29","t30","wordBreak","t31","t32","currentTarget","t33","t34","t35","duration","t36","max_stored_resolution","t37","max_stored_frame_rate","t38","aspect_ratio","t39","createdAt","toLocaleDateString","year","month","day","hour","minute","hour12","t40","t41","t42","id","t43","t44","playback_ids","t45","t46","t47","t48","t49","t50","t51","t52","t53","t54","PlaybackIds","map","_temp2","policyToText","policy","track","type","entry","CalendarIcon","ClockIcon","TagIcon","Inline","Stack","Text","getVideoMetadata","VideoAssetDocument","IconInfo","VideoMetadata","props","$","_c","asset","T0","T1","t0","t1","t2","t3","t4","t5","displayInfo","title","wordWrap","duration","createdAt","toISOString","split","id","slice","t6","t7","CheckmarkIcon","EditIcon","LockIcon","PlayIcon","Button","Card","Stack","Text","Tooltip","useCallback","useState","styled","DRMWarningDialog","useDrmPlaybackWarningContext","THUMBNAIL_ASPECT_RATIO","getPlaybackPolicy","VideoAssetDocument","IconInfo","AudioIcon","VideoMetadata","VideoPlayer","assetIsAudio","VideoThumbnail","PlayButton","button","RenderState","VideoInBrowser","t0","$","_c","onSelect","onEdit","asset","renderVideo","setRenderVideo","t1","select","t2","edit","hasShownWarning","t3","playbackPolicy","t4","policy","onClickPlay","t5","Symbol","for","position","t6","borderRadius","left","top","zIndex","t7","color","t8","gridTemplateRows","t9","t10","aspectRatio","display","alignItems","justifyContent","t11","t12","width","gap","t13","flex","t14","t15","t16","t17","t18","SearchIcon","Card","Flex","Grid","Inline","Label","Stack","Text","TextInput","useMemo","useState","DrmPlaybackWarningContextProvider","useAssets","PluginConfig","VideoAssetDocument","ConfigureApi","ImportVideosFromMux","PageSelector","ResyncMetadata","SelectSortOptions","SpinnerBox","VideoDetailsProps","VideoDetails","VideoInBrowser","VideosBrowserProps","config","onSelect","asset","VideosBrowser","t0","$","_c","assets","isLoading","searchQuery","setSearchQuery","setSort","sort","page","setPage","pageTotal","Math","floor","length","editedAsset","setEditedAsset","t1","find","a","_id","freshEditedAsset","pageStart","pageEnd","placement","t2","Symbol","for","minHeight","t3","e","currentTarget","value","t4","t5","t6","t7","t8","t9","t10","t11","gridTemplateColumns","t12","t13","slice","map","t14","t15","t16","t17","t18","t19","Tool","PluginConfig","ToolIcon","VideosBrowser","StudioTool","React","FC","config","$","_c","t0","DEFAULT_TOOL_CONFIG","icon","title","createStudioTool","toolConfig","tool","name","component","props","useCurrentUser","PluginConfig","useAccessControl","config","$","_c","user","t0","roles","allowedRolesForConfiguration","length","some","role","includes","name","hasConfigAccess","t1","isReference","useDocumentValues","Reference","VideoAssetDocument","path","useAssetDocumentValues","asset","_ref","useMemo","useRef","useDataset","useProjectId","useSWR","useClient","addKeysToMuxData","PLUGIN_VERSION_QUERY","MuxAsset","VideoAssetDocument","useMuxPolling","asset","client","projectId","dataset","isPreparingStaticRenditions","data","static_renditions","status","files","length","some","file","shouldFetch","assetId","errorLoggedRef","request","url","withCredentials","method","query","_id","patch","set","commit","returnDocuments","current","error","console","documentId","refreshInterval","refreshWhenHidden","dedupingInterval","Button","Card","Flex","Grid","Heading","Inline","Text","useToast","memo","useCallback","useRef","scrollIntoView","clear","useErrorBoundary","name","MuxInputProps","Props","Pick","children","React","ReactNode","ErrorBoundaryCard","props","$","_c","schemaType","push","pushToast","errorRef","t0","onDidCatch","err","errorInfo","console","group","toString","groupCollapsed","error","groupEnd","stack","log","componentStack","status","title","description","transform","current","behavior","scrollMode","block","ErrorBoundary","didCatch","reset","t1","handleRetry","t2","Symbol","for","t3","t4","t5","message","t6","t7","Box","Card","Flex","Spinner","Text","InputFallback","$","_c","t0","Symbol","for","padding","t1","aspectRatio","width","borderRadius","t2","t3","PlugIcon","Button","Card","Flex","Grid","Heading","Inline","Text","useCallback","useAccessControl","SetDialogState","PluginConfig","MuxLogo","OnboardProps","setDialogState","config","Onboard","props","$","_c","t0","handleOpen","hasConfigAccess","t1","Symbol","for","padding","t2","t3","aspectRatio","width","boxShadow","t4","t5","height","t6","t7","UpChunk","Observable","createUpChunkObservable","uuid","uploadUrl","source","File","type","id","percent","subscriber","upchunk","createUpload","endpoint","file","dynamicChunkSize","successHandler","next","complete","errorHandler","data","CustomEvent","error","Error","detail","message","progressHandler","offlineHandler","pause","onlineHandler","resume","on","abort","formatDriveShareLink","url","formatExportLink","id","trimmed","trim","parsed","URL","hostname","Error","searchParams","get","length","path","pathname","split","includes","index","findIndex","value","fileId","at","folderId","roundPxString","value","undefined","trimmed","trim","endsWith","n","Number","slice","isFinite","rounded","Math","round","uuid","generateUuid","concat","defer","from","Observable","of","throwError","catchError","mergeMap","mergeMapTo","switchMap","SanityClient","createUpChunkObservable","formatDriveShareLink","PLUGIN_VERSION_QUERY","roundPxString","MuxAsset","MuxNewAssetSettings","WatermarkConfig","getAsset","testSecretsObservable","sanitizeOverlaySettingsInPlace","settings","inputs","input","overlay","overlay_settings","Record","hm","vm","w","sanitizePxStringsInJson","json","replace","_match","num","n","Number","isFinite","rounded","Math","round","cancelUpload","client","observable","request","url","config","dataset","withCredentials","method","query","uploadUrl","watermark","testUrl","pipe","validUrl","type","const","status","Error","muxBody","JSON","stringify","filename","split","slice","headers","result","asset","results","document","id","uploadFile","file","File","testFile","fileOptions","body","sanityAssetId","upload","cors_origin","new_asset_settings","timeout","event","updateAssetDocumentFromUpload","doc","err","UploadResponse","data","asset_id","static_renditions","resolution","passthrough","playback_policies","getUpload","assetId","pollUpload","Promise","maxTries","pollInterval","tries","resolve","reject","setInterval","window","clearInterval","_watermark","_id","_type","playbackId","playback_ids","uploadId","createOrReplace","then","optionsFromFile","error","formattedUrl","trim","parsed","URL","protocol","match","opts","preserveFilename","undefined","name","ServerError","isValidUrl","url","parsed","URL","protocol","match","isServerError","error","Error","statusCode","extractDroppedFiles","dataTransfer","DataTransfer","files","Array","from","items","length","Promise","resolve","normalizeItems","then","arr","flat","DataTransferItem","all","map","item","kind","webkitGetAsEntry","entry","FileSystemEntry","File","getAsFile","isDirectory","walk","file","getAsString","str","type","isFile","FileSystemFileEntry","FileSystemDirectoryEntry","dir","createReader","readEntries","entries","filter","entr","name","startsWith","useCallback","PatchEvent","set","setIfMissing","unset","SetDialogState","MuxInputProps","PluginConfig","VideoAssetDocument","VideosBrowser","VideosBrowserProps","Props","Pick","asset","setDialogState","config","SelectAssets","t0","$","_c","selectedAsset","onChange","t1","_id","chosenAsset","from","_type","_weak","_ref","handleSelect","t2","Dialog","useCallback","useId","styled","SetDialogState","SelectAsset","Props","SelectAssetProps","StyledDialog","InputBrowser","t0","$","_c","setDialogState","asset","onChange","config","id","t1","handleClose","t2","t3","useCallback","PatchEvent","unset","deleteAssetOnMux","useClient","MuxInputProps","VideoAssetDocument","useCancelUpload","asset","onChange","$","_c","client","t0","from","assetId","_id","delete","styled","TopControls","div","Button","Card","Code","Flex","Inline","Stack","Text","LinearProgress","styled","CardWrapper","FlexWrapper","LeftSection","CodeWrapper","UploadProgress","t0","$","_c","progress","t1","onCancel","filename","text","t2","undefined","isCancelDisabled","t3","t4","Symbol","for","t5","t6","t7","t8","t9","t10","t11","Card","Text","useEffect","useMemo","useRef","useCancelUpload","MuxInputProps","PluginConfig","VideoAssetDocument","TopControls","UploadProgress","VideoPlayer","Props","Pick","buttons","React","ReactNode","asset","config","Player","readOnly","onChange","isLoading","status","isPreparingStaticRenditions","data","static_renditions","files","length","some","file","playRef","HTMLDivElement","muteRef","handleCancelUpload","style","document","createElement","innerHTML","current","shadowRoot","appendChild","cloneNode","Error","errors","messages","join","filename","undefined","hlsConfig","background","position","top","left","color","focusRingBorderStyle","border","color","width","focusRingStyle","opts","base","bg","focusRing","offset","focusRingOutsetWidth","focusRingInsetWidth","bgColor","filter","Boolean","join","MenuItem","css","styled","focusRingStyle","FileButton","theme","focusRing","sanity","base","color","border","width","Box","ButtonProps","Flex","Text","isValidElement","useId","useCallback","isValidElementType","FileButton","FileInputMenuItemProps","Omit","accept","capture","multiple","onSelect","files","File","disabled","FileInputMenuItem","props","$","_c","Icon","fontSize","idProp","ref","rest","t0","text","textAlign","icon","id","space","undefined","idHook","t1","event","target","Array","from","handleChange","t2","t3","t4","content","t5","t6","DownloadIcon","EllipsisHorizontalIcon","ImageIcon","LockIcon","PlugIcon","ResetIcon","SearchIcon","SyncIcon","TranslateIcon","UploadIcon","Box","Button","Card","Inline","Label","Menu","MenuDivider","MenuItem","Popover","Text","Tooltip","useClickOutsideEvent","memo","useCallback","useEffect","useMemo","useState","PatchEvent","unset","styled","useAccessControl","DialogState","SetDialogState","useResyncAsset","getPlaybackPolicy","MuxInputProps","PluginConfig","VideoAssetDocument","FileInputMenuItem","LockCard","LockButton","isVideoAsset","asset","_type","PlayerActionsMenu","props","$","_c","readOnly","dialogState","setDialogState","onChange","onSelect","accept","open","setOpen","menuElement","setMenuRef","isSigned","policy","hasConfigAccess","config","t0","Symbol","for","showToast","resyncAsset","isResyncing","t1","from","onReset","t2","handleResync","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","useEffect","useState","StagedUpload","useFetchFileSize","stagedUpload","maxFileSize","fileSize","setFileSize","isLoadingFileSize","setIsLoadingFileSize","canSkipFileSizeValidation","setCanSkipFileSizeValidation","type","url","fetchFileSize","response","fetch","method","contentLength","headers","get","newFileSize","parseInt","undefined","console","warn","files","size","useEffect","useState","StagedUpload","VideoAssetMetadata","width","height","isAudioOnly","duration","size","aspectRatio","useMediaMetadata","stagedUpload","$","_c","videoAssetMetadata","setVideoAssetMetadata","isLoadingMetadata","setIsLoadingMetadata","t0","files","type","url","videoSrc","file","URL","createObjectURL","_temp","_temp2","videoElement","document","createElement","preload","metadataListeners","videoWidth","videoHeight","old_0","old","cleanupVideo","videoEl","currentVideoSrc","src","forEach","listener","removeEventListener","onerror","load","startsWith","revokeObjectURL","push","setTimeout","console","warn","listener_0","addEventListener","t1","t2","undefined","roundPxString","MuxOverlaySettings","WatermarkConfig","convertWatermarkToMuxOverlay","watermark","options","videoAspectRatio","units","enabled","imageUrl","size","opacity","toPxString","valuePercent","axis","isVertical","baseW","baseH","base","px","rounded","Math","round","normalizeToPixels","value","trimmed","trim","endsWith","n","Number","slice","isFinite","overlay_settings","widthValue","width","widthNormalized","horizontal_margin","vertical_margin","position","x","y","clampPercent","max","min","toPercentString","epsilon","isZeroish","Object","is","abs","watermarkWidthPercentOfVideoWidth","imageAspectRatio","watermarkHeightPercentOfVideoHeight","halfWidth","halfHeight","leftMargin","topMargin","marginX","marginY","overlaySettings","vertical_align","horizontal_align","formatBytes","bytes","si","dp","thresh","Math","abs","units","u","r","round","length","toFixed","CheckmarkCircleIcon","ErrorOutlineIcon","Box","Button","Card","Flex","Grid","Stack","Text","TextInput","useCallback","useEffect","useRef","useState","styled","convertWatermarkToMuxOverlay","MuxOverlaySettings","WatermarkConfig","RangeInput","input","WatermarkOverlay","div","$opacity","props","DraggableWatermarkProps","watermark","onChange","containerRef","React","RefObject","HTMLDivElement","videoElementRef","HTMLVideoElement","DraggableWatermark","isDragging","setIsDragging","dragStart","setDragStart","x","y","startPosition","setStartPosition","watermarkRef","debounceTimeoutRef","NodeJS","Timeout","localPosition","setLocalPosition","position","size","opacity","parseOpacityPercent","value","trimmed","trim","endsWith","num","Number","slice","isFinite","Math","max","min","getVideoContentBox","container","current","width","height","rect","getBoundingClientRect","containerW","containerH","videoEl","videoW","videoWidth","videoH","videoHeight","scale","contentW","contentH","offsetX","offsetY","parseOverlayValue","n","unit","px","pct","replace","computeManualStyle","overlay","w","h","isVertical","baseW","baseH","hm","horizontal_margin","vm","vertical_margin","ww","manualOpacity","toCss","v","axis","undefined","computeHorizontalStyle","horizontal_align","left","right","transform","computeVerticalStyle","vertical_align","top","bottom","hStyle","vStyle","const","cursor","debouncedOnChange","newWatermark","clearTimeout","setTimeout","handleMouseDown","e","MouseEvent","preventDefault","clientX","clientY","handleMouseMove","content","dx","dy","deltaXPercent","deltaYPercent","newX","newY","handleMouseUp","document","addEventListener","removeEventListener","imageUrl","hasManualOverlay","Boolean","overlay_settings","opacityForRender","contentBox","hasContentBox","computeWatermarkStyle","WatermarkControlsProps","onValidationChange","error","previewContainerRef","previewVideoRef","WatermarkControls","urlInput","setUrlInput","urlError","setUrlError","isValidating","setIsValidating","isValid","setIsValid","validationTimeoutRef","mode","setMode","isUpdatingRef","isValidExtension","extension","validateUrl","url","enabled","urlObj","URL","pathname","toLowerCase","img","Image","onload","imageAspectRatio","naturalWidth","naturalHeight","onerror","src","errorMsg","handleUrlChange","ChangeEvent","HTMLInputElement","target","normalizeZeroPercent","epsilon","Object","is","abs","updateOverlaySettings","next","Partial","prev","base","round","merged","padding","paddingRight","border","borderRadius","maxWidth","boxSizing","fontSize","display","alignItems","gap","color","flexShrink","flexWrap","minWidth","flex","currentTarget","sizePct","raw","nextPct","clampedPct","TranslateIcon","Autocomplete","Box","Card","Checkbox","Flex","Stack","Text","uuid","LanguagesList","Dispatch","FormField","PluginConfig","SUPPORTED_MUX_LANGUAGES","UploadTextTrack","ALL_LANGUAGE_CODES","getAllCodes","map","code","value","label","getNativeName","SUBTITLE_LANGUAGES","Record","Extract","language_code","autogenerated","lang","subtitles","captions","TrackSubAction","subAction","Partial","TrackAction","action","id","TextTracksEditor","t0","$","_c","tracks","dispatch","defaultLang","track","t1","Symbol","for","t2","display","t3","t4","_id","type","name","undefined","t5","t6","t7","t8","newValue","_temp","find","l","_temp2","t9","option_0","option","query","toLowerCase","indexOf","Checkbox","Flex","Grid","Text","ActionDispatch","CSSProperties","ReactNode","useState","UploadConfigurationStateAction","PlaybackPolicyOption","t0","$","_c","id","checked","optionName","description","dispatch","action","disabled","scale","setScale","t1","t2","t3","outline","transform","transition","cursor","borderRadius","boxStyle","t4","Symbol","for","setTimeout","triggerAnimation","t5","value","handleBoxClick","t6","descriptionJsx","t7","t8","t9","t10","WarningFilledIcon","Box","Flex","Text","CSSProperties","PlaybackPolicyWarning","$","_c","t0","Symbol","for","color","fontWeight","textStyle","t1","outline","backgroundColor","borderRadius","width","boxStyle","t2","Code","Grid","Text","ActionDispatch","Secrets","UploadConfig","UploadConfigurationStateAction","PlaybackPolicyOption","PlaybackPolicyWarning","PlaybackPolicy","t0","$","_c","id","config","secrets","dispatch","noPolicySelected","public_policy","signed_policy","drm_policy","drmPolicyDisabled","drmConfigId","t1","Symbol","for","t2","t3","t4","t5","enableSignedUrls","t6","t7","t8","Flex","Radio","Text","ActionDispatch","FormField","UploadConfig","UploadConfigurationStateAction","RESOLUTION_TIERS","value","label","const","ResolutionTierSelector","t0","$","_c","id","config","dispatch","maxSupportedResolution","t1","Symbol","for","t2","t3","map","t4","index","inputId","max_resolution_tier","e","action","currentTarget","Checkbox","Flex","Label","Radio","Stack","Text","ActionDispatch","useMemo","useState","FormField","StaticRenditionResolution","UploadConfig","UploadConfigurationStateAction","ADVANCED_RESOLUTIONS","value","label","StaticRenditionSelector","t0","$","_c","id","config","dispatch","specificResolutions","static_renditions","filter","_temp","isAdvancedMode","length","renditionMode","setRenditionMode","t1","rendition","current","hasRendition","includes","action","r_0","r","toggleRendition","t2","mode","_temp2","_temp3","handleModeChange","t3","Symbol","for","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","display","t20","map","t21","inputId","r_1","r_2","DocumentVideoIcon","ErrorOutlineIcon","UploadIcon","Box","Button","Card","Dialog","Flex","Label","Radio","Stack","Text","uuid","LanguagesList","memo","useEffect","useId","useReducer","useRef","useState","FormField","useFetchFileSize","useMediaMetadata","VideoAssetMetadata","convertWatermarkToMuxOverlay","formatBytes","formatSeconds","AutogeneratedTextTrack","CustomTextTrack","isAutogeneratedTrack","isCustomTextTrack","MuxNewAssetSettings","PluginConfig","Secrets","StaticRenditionResolution","SupportedMuxLanguage","UploadConfig","UploadTextTrack","WatermarkConfig","DraggableWatermark","WatermarkControls","TextTracksEditor","TrackAction","PlaybackPolicy","RESOLUTION_TIERS","ResolutionTierSelector","StaticRenditionSelector","StagedUpload","UploadConfigurationStateAction","action","value","VIDEO_QUALITY_LEVELS","label","const","sanitizeStaticRenditions","renditions","hasHighest","includes","hasSpecificResolutions","some","r","filter","UploadConfiguration","stagedUpload","secrets","pluginConfig","startUpload","onClose","settings","watermark","id","watermarkValidationError","setWatermarkValidationError","watermarkPreviewContainerRef","HTMLDivElement","watermarkPreviewVideoRef","HTMLVideoElement","autoTextTracks","NonNullable","video_quality","defaultAutogeneratedSubtitleLang","_id","type","language_code","name","getNativeName","current","config","dispatch","prev","Object","assign","static_renditions","max_resolution_tier","text_tracks","public_policy","signed_policy","drm_policy","target_track_i","findIndex","subAction","push","splice","enableSignedUrls","defaultSigned","defaultPublic","defaultDrm","drmConfigId","normalize_audio","validationError","setValidationError","MAX_FILE_SIZE","maxAssetFileSize","MAX_DURATION_SECONDS","maxAssetDuration","fileSize","isLoadingFileSize","canSkipFileSizeValidation","videoAssetMetadata","setVideoAssetMetadata","isLoadingMetadata","old","size","validateDuration","duration","validateFileSize","undefined","validateDrmAvailability","isAudioOnly","valid","height","width","disableTextTrackConfig","disableUploadConfig","skipConfig","formatUploadConfig","videoAspectRatio","aspectRatio","basicConfig","playbackPolicySelected","maxSupportedResolution","rt","borderRadius","files","url","map","inputId","e","currentTarget","setAdvancedPlaybackPolicy","advanced_playback_policies","policy","drm_configuration_id","console","error","options","generated_subtitles","track","inputs","length","reduce","acc","file","contents","text_type","closed_captions","imageUrl","watermarkForMux","enabled","overlaySettings","units","overlay_settings","input","resolution","WatermarkSection","t0","$","_c","onValidationChange","t1","Symbol","for","t2","t3","t4","t5","t6","watermark_0","t7","WatermarkPreview","onWatermarkChange","previewContainerRef","videoRef","URL","createObjectURL","src","revokeObjectURL","isVertical","overflow","display","justifyContent","String","maxHeight","minHeight","position","t8","top","left","objectFit","t9","t10","React","RefObject","t11","t12","t13","rem","ComponentType","css","styled","focusRingBorderStyle","focusRingStyle","withFocusRing","component","Props","$border","props","border","width","color","theme","sanity","radius","base","focusRing","Card","CardTone","useCallback","useRef","styled","withFocusRing","UploadCardWithFocusRing","UploadCardProps","tone","children","React","ReactNode","onPaste","ClipboardEventHandler","HTMLInputElement","onDrop","DragEventHandler","HTMLDivElement","onDragOver","onDragLeave","onDragEnter","UploadCard","t0","$","_c","ref","inputRef","t1","Symbol","for","event","target","HTMLElement","closest","ctrlKey","metaKey","key","current","focus","handleKeyDown","t2","t3","HiddenInput","input","attrs","type","Button","ButtonProps","useCallback","useId","useRef","styled","HiddenInput","input","Label","label","FileInputButtonProps","Omit","onSelect","files","FileList","accept","FileInputButton","t0","$","_c","props","inputId","inputRef","t1","event","target","handleSelect","t2","Symbol","for","current","click","handleButtonClick","t3","t4","width","t5","t6","DocumentVideoIcon","PlugIcon","SearchIcon","UploadIcon","Button","Card","Flex","Inline","Text","useCallback","useAccessControl","SetDialogState","PluginConfig","FileInputButton","FileInputButtonProps","formatAcceptString","accept","split","map","type","trim","replace","join","UploadPlaceholderProps","setDialogState","readOnly","hovering","needsSetup","onSelect","config","UploadPlaceholder","props","$","_c","t0","handleBrowse","t1","handleConfigureApi","hasConfigAccess","t2","t3","borderColor","undefined","t4","Symbol","for","t5","t6","t7","t8","t9","t10","t11","t12","t13","ErrorOutlineIcon","Button","CardTone","Flex","Text","useToast","useCallback","useEffect","useReducer","useRef","useState","Observable","Subject","Subscription","takeUntil","tap","SanityClient","PatchEvent","set","setIfMissing","uploadFile","uploadUrl","DialogStateProvider","DialogState","SetDialogState","isServerError","isValidUrl","extractDroppedFiles","hasPlaybackPolicy","MuxInputProps","MuxNewAssetSettings","PluginConfig","Secrets","VideoAssetDocument","InputBrowser","Player","PlayerActionsMenu","UploadConfiguration","UploadCard","UploadPlaceholder","UploadProgress","Props","Pick","config","client","secrets","asset","dialogState","setDialogState","needsSetup","StagedUpload","type","files","FileList","File","url","UploadStatus","progress","file","name","uuid","State","stagedUpload","uploadStatus","error","Error","INITIAL_STATE","UploadFileEvent","ReturnType","T","UploadUrlEvent","UploaderStateAction","action","input","NonNullable","Extract","percent","settings","Uploader","props","toast","containerRef","HTMLDivElement","dragEnteredEls","EventTarget","dragState","setDragState","cancelUploadButton","events$","observable","asObservable","handleClick","event","React","MouseEvent","HTMLButtonElement","next","current","uploadRef","uploadingDocumentId","state","dispatch","prev","Object","assign","_","payload","unsubscribe","cleanup","closed","_id","docId","delete","catch","err","console","warn","handleBeforeUnload","window","addEventListener","removeEventListener","startUpload","watermark","WatermarkConfig","uploadObservable","pipe","subscribe","onChange","from","_type","_weak","_ref","complete","invalidFileToast","push","status","title","acceptedMimeTypes","join","isInvalidFile","isInvalid","Array","some","acceptedType","pattern","replace","RegExp","test","handleUpload","handlePaste","ClipboardEventHandler","HTMLInputElement","target","HTMLElement","closest","preventDefault","stopPropagation","clipboardData","Window","DataTransfer","getData","trim","handleDrop","DragEventHandler","nativeEvent","dataTransfer","then","handleDragOver","handleDragEnter","items","mimeTypes","isValidType","handleDragLeave","idx","indexOf","splice","length","message","textAlign","tone","acceptMimeString","readOnly","Card","memo","Suspense","useAccessControl","useAssetDocumentValues","useClient","useDialogState","useMuxPolling","useSecretsDocumentValues","MuxInputProps","PluginConfig","ConfigureApiDialog","ErrorBoundaryCard","InputFallback","Onboard","Uploader","InputProps","config","Input","props","$","_c","client","secretDocumentValues","assetDocumentValues","value","asset","poll","readOnly","undefined","dialogState","setDialogState","hasConfigAccess","error","isLoading","t0","Symbol","for","t1","needsSetup","onChange","secrets","t2","schemaType","Input","VideoThumbnail","MuxInputProps","PluginConfig","VideoAssetDocument","muxVideoCustomRendering","config","components","input","props","schemaType","options","preview","select","filename","playbackId","status","assetId","thumbTime","data","prepare","asset","Partial","title","subtitle","media","definePlugin","createStudioTool","DEFAULT_TOOL_CONFIG","muxVideoCustomRendering","muxVideoSchema","schemaTypes","PluginConfig","StaticRenditionResolution","VideoAssetDocument","defaultConfig","static_renditions","mp4_support","video_quality","max_resolution_tier","normalize_audio","defaultPublic","defaultSigned","defaultDrm","tool","allowedRolesForConfiguration","acceptedMimeTypes","convertLegacyConfig","config","Partial","length","muxInput","userConfig","deprecated_encoding_tier","encoding_tier","name","schema","types","tools","undefined"],"sources":["../src/components/icons/ToolIcon.tsx","../src/util/types.ts","../src/context/DrmPlaybackWarningContext.tsx","../src/hooks/useClient.ts","../src/util/createSearchFilter.ts","../src/hooks/useAssets.ts","../src/hooks/useDialogState.ts","../src/constants.ts","../src/util/pluginVersion.ts","../src/actions/secrets.ts","../src/hooks/useSaveSecrets.ts","../src/util/constants.ts","../src/hooks/useSecretsDocumentValues.ts","../src/hooks/useSecretsFormState.ts","../src/util/readSecrets.ts","../src/components/MuxLogo.tsx","../src/components/ConfigureApi.styled.tsx","../src/components/FormField.tsx","../src/components/ConfigureApi.tsx","../src/util/assetTitlePlaceholder.ts","../src/util/parsers.ts","../src/actions/assets.ts","../src/hooks/useMuxAssets.ts","../src/hooks/useImportMuxAssets.ts","../src/hooks/useInView.ts","../src/util/getPlaybackPolicy.ts","../src/util/generateJwt.ts","../src/util/createUrlParamsObject.ts","../src/util/getAnimatedPosterSrc.ts","../src/util/getPosterSrc.ts","../src/util/tryWithSuspend.ts","../src/components/VideoThumbnail.tsx","../src/components/ImportVideosFromMux.tsx","../src/components/PageSelector.tsx","../src/util/addKeysToMuxData.ts","../src/hooks/useResyncMuxMetadata.ts","../src/components/ResyncMetadata.tsx","../src/components/SelectSortOptions.tsx","../src/components/SpinnerBox.tsx","../src/components/IconInfo.tsx","../src/components/icons/Resolution.tsx","../src/components/icons/StopWatch.tsx","../src/hooks/useMezzanine.ts","../src/components/MezzanineExplanation.tsx","../src/components/Mezzanine.tsx","../src/hooks/useResyncAsset.ts","../src/util/textTracks.ts","../src/components/AddCaptionDialog.tsx","../src/components/EditCaptionDialog.tsx","../src/components/TextTracksManager.tsx","../src/context/DialogStateContext.tsx","../src/util/getVideoSrc.ts","../src/components/CaptionsDialog.tsx","../src/util/formatSeconds.ts","../src/components/EditThumbnailDialog.tsx","../src/components/icons/Audio.tsx","../src/components/MezzanineDialog.tsx","../src/components/VideoPlayer.tsx","../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/useAccessControl.ts","../src/hooks/useAssetDocumentValues.ts","../src/hooks/useMuxPolling.ts","../src/components/ErrorBoundaryCard.tsx","../src/components/Input.styled.tsx","../src/components/Onboard.tsx","../src/clients/upChunkObservable.ts","../src/util/formatDriveShareLink.ts","../src/util/roundPxString.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/hooks/useFetchFileSize.ts","../src/hooks/useMediaMetadata.ts","../src/util/convertWatermarkToMux.ts","../src/util/formatBytes.ts","../src/components/DraggableWatermark.tsx","../src/components/TextTracksEditor.tsx","../src/components/uploadConfiguration/PlaybackPolicyOption.tsx","../src/components/uploadConfiguration/PlaybackPolicyWarning.tsx","../src/components/uploadConfiguration/PlaybackPolicy.tsx","../src/components/uploadConfiguration/ResolutionTierSelector.tsx","../src/components/uploadConfiguration/StaticRenditionSelector.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","import type MuxPlayerElement from '@mux/mux-player'\nimport type {ObjectInputProps} from 'sanity'\nimport type {PartialDeep} from 'type-fest'\n\n/**\n * All static rendition resolution options supported by Mux\n */\nexport type StaticRenditionResolution =\n | 'highest'\n | 'audio-only'\n | '270p'\n | '360p'\n | '480p'\n | '540p'\n | '720p'\n | '1080p'\n | '1440p'\n | '2160p'\n\nexport interface MuxInputConfig {\n /**\n * Enable static renditions by default. Can be overwritten on a per-asset basis.\n * Supports:\n * - Standard mode: 'highest' (up to 4K MP4) and/or 'audio-only' (M4A)\n * - Advanced mode: Specific resolutions ('270p', '360p', '480p', '540p', '720p', '1080p', '1440p', '2160p') and/or 'audio-only'\n *\n * **Important**: 'highest' cannot be mixed with specific resolutions. If both are provided, only 'highest' will be used.\n *\n * @see {@link https://docs.mux.com/guides/video/enable-static-mp4-renditions}\n * @defaultValue []\n */\n static_renditions: StaticRenditionResolution[]\n\n /**\n * @deprecated Use `static_renditions` instead. This field is kept for backward compatibility.\n * Enable static renditions by setting this to 'standard'. Can be overwritten on a per-asset basis.\n * Requires `\"video_quality\": \"plus\"`\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 `\"video_quality\": \"plus\"`\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 * @deprecated Use {@link video_quality}\n * <br>\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 * The video quality level informs the cost, quality, and available platform features for the asset.\n * @see {@link https://www.mux.com/docs/guides/use-video-quality-levels}\n * @defaultValue 'plus'\n */\n video_quality: 'basic' | 'plus' | 'premium'\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 * Enables public URLs by default.\n * @defaultValue true\n */\n defaultPublic?: boolean\n\n /**\n * Enables DRM Protection by default, if you configured your DRM Configuration Id.\n * @see {@link https://www.mux.com/docs/guides/protect-videos-with-drm}\n * @defaultValue true\n */\n defaultDrm?: boolean\n\n /**\n * Auto-generate captions for these languages by default.\n * Requires `\"video_quality\": \"plus\"`\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 `\"video_quality\": \"plus\"`\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 /**\n * Whether or not to show the playback warning when trying to watch DRM content for the first time.\n *\n * @defaultValue false\n */\n disableDrmPlaybackWarning?: boolean\n\n /**\n * The mime types that are accepted by the input.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept}\n * @defaultValue ['video/*','audio/*']\n\n */\n acceptedMimeTypes?: ('audio/*' | 'video/*')[]\n\n /**\n * Maximum file size allowed for video uploads in bytes.\n * If not specified, no file size validation will be performed.\n *\n * @example 1024 * 1024 * 1024 // 1 GB\n * @defaultValue undefined\n */\n maxAssetFileSize?: number\n\n /**\n * Maximum video duration allowed in seconds.\n * If not specified, no duration validation will be performed.\n *\n * @example 2 * 60 * 60 // 2 hours\n * @defaultValue undefined\n */\n maxAssetDuration?: number\n\n /**\n * HLS.js configuration options to be passed to the Mux Player.\n * These options allow you to customize the underlying HLS.js playback engine behavior.\n *\n * @see {@link https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning}\n * @defaultValue undefined\n * @example\n * ```ts\n * {\n * maxBufferLength: 30,\n * lowLatencyMode: true,\n * capLevelToPlayerSize: true\n * }\n * ```\n */\n hlsConfig?: MuxPlayerElement['_hlsConfig']\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 /**\n * The roles that are allowed to configure the plugin.\n *\n * If not set, all roles will be allowed to configure the plugin.\n * @defaultValue []\n */\n allowedRolesForConfiguration: string[]\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 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\n/**\n * Watermark configuration for UI (draggable position)\n */\nexport interface WatermarkConfig {\n enabled: boolean\n imageUrl?: string\n /**\n * Aspect ratio (width / height) of the watermark image.\n * Used to convert between our center-based UI coords and Mux overlay margins.\n */\n imageAspectRatio?: number\n /**\n * Optional explicit Mux `overlay_settings`.\n * When set, these values should be used as-is for the upload request and preview.\n * @see {@link https://www.mux.com/docs/guides/add-watermarks-to-your-videos}\n */\n overlay_settings?: MuxOverlaySettings\n position?: {\n x: number // percentage (0-100)\n y: number // percentage (0-100)\n }\n size?: number // percentage of video width (0-100)\n opacity?: number // 0-1 (converted to percentage string for Mux API)\n}\n\n/**\n * Mux overlay_settings format for watermark API\n * @see {@link https://www.mux.com/docs/guides/add-watermarks-to-your-videos}\n */\nexport interface MuxOverlaySettings {\n vertical_align: 'top' | 'middle' | 'bottom'\n vertical_margin: string // percentage (e.g., \"10%\") or pixels (e.g., \"40px\")\n horizontal_align: 'left' | 'center' | 'right'\n horizontal_margin: string // percentage (e.g., \"10%\") or pixels (e.g., \"40px\")\n width?: string // percentage (e.g., \"25%\") or pixels (e.g., \"80px\")\n height?: string // percentage or pixels\n opacity?: string // percentage string (e.g., \"90%\")\n}\n\nexport interface UploadConfig extends Pick<\n MuxInputConfig,\n 'max_resolution_tier' | 'normalize_audio' | 'video_quality'\n> {\n static_renditions: StaticRenditionResolution[]\n text_tracks: UploadTextTrack[]\n signed_policy: boolean\n public_policy: boolean\n watermark?: WatermarkConfig\n drm_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 extends Pick<\n MuxInputConfig,\n 'max_resolution_tier' | 'normalize_audio' | 'video_quality'\n> {\n /** Static renditions configuration for downloadable files */\n static_renditions?: {resolution: StaticRenditionResolution}[]\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 /** This optional parameter should be used tracks with type of text and text_type set to subtitles. */\n passthrough?: string\n /** Overlay settings for watermarks. Used when adding a watermark image as a second input. */\n overlay_settings?: MuxOverlaySettings\n }[]\n\n /** An array of playback policy names that you want applied to this asset and available through playback_ids. */\n playback_policy?: PlaybackPolicy[]\n\n /** An array of playback policy objects that you want applied to this asset and available through playback_ids. advanced_playback_policies must be used instead of playback_policies when creating a DRM playback ID. */\n advanced_playback_policies: AdvancedPlaybackPolicy[]\n\n /** Arbitrary user-supplied metadata that will be included in the asset details and related webhooks. */\n passthrough?: string\n}\n\n/** Used by advanced_playback_policies, allows to define DRM config. */\nexport type AdvancedPlaybackPolicy = {\n policy: PlaybackPolicy\n drm_configuration_id?: 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 drmConfigId: string | null\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 MuxVideoOrigin = `https://stream.mux.com`\nexport type MuxVideoUrl = `${MuxVideoOrigin}/${string}.m3u8?${string}`\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' | 'drm'\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?:\n | 'uploaded'\n | 'embedded'\n | 'generated_live'\n | 'generated_live_final'\n | 'generated_vod'\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 error?: {\n type: string\n messages?: string[]\n }\n}\nexport type MuxTrack = MuxVideoTrack | MuxAudioTrack | MuxTextTrack\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 max_resolution_tier?: '2160p' | '1440p' | '1080p'\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 // Only present once `status` is 'ready'.\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: string\n ext: 'mp4' | 'm4a'\n height: number\n width: number\n bitrate: number\n filesize: string\n type: 'standard' | 'advanced'\n status: 'ready' | 'preparing' | 'skipped' | 'errored'\n resolution_tier?: string\n resolution?: string\n id: string\n passthrough?: string\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 meta?: {\n title?: string\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","import {Button, Card, Dialog, Stack, Text} from '@sanity/ui'\nimport {createContext, useCallback, useContext, useMemo, useState} from 'react'\n\nimport {type PluginConfig} from '../util/types'\n\nconst LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY = 'mux-plugin-has-shown-drm-playback-warning'\n\ntype DrmPlaybackWarningContextContextProps = {\n hasShownWarning: boolean\n setHasWarnedAboutDrmPlayback: (b: boolean) => void\n}\n\nconst DrmPlaybackWarningContext = createContext<DrmPlaybackWarningContextContextProps>({\n hasShownWarning: false,\n setHasWarnedAboutDrmPlayback: () => {\n return null\n },\n})\n\ninterface DrmPlaybackWarningContextProviderProps {\n config?: PluginConfig\n children: React.ReactNode\n}\n\nexport const DrmPlaybackWarningContextProvider = ({\n config,\n children,\n}: DrmPlaybackWarningContextProviderProps) => {\n const warningDisabled = config?.disableDrmPlaybackWarning ?? false\n const hasWarned: boolean =\n warningDisabled || window.localStorage.getItem(LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY) === 'true'\n const [hasWarnedAboutDrmPlayback, setHasWarnedAboutDrmPlayback] = useState(hasWarned)\n\n const setHasShownWarning = useCallback((b: boolean) => {\n window.localStorage.setItem(LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY, b.toString())\n setHasWarnedAboutDrmPlayback(b)\n }, [])\n\n const value = useMemo(\n () => ({\n hasShownWarning: hasWarnedAboutDrmPlayback,\n setHasWarnedAboutDrmPlayback: setHasShownWarning,\n }),\n [hasWarnedAboutDrmPlayback, setHasShownWarning],\n )\n\n return (\n <DrmPlaybackWarningContext.Provider value={value}>\n {children}\n </DrmPlaybackWarningContext.Provider>\n )\n}\n\nexport const useDrmPlaybackWarningContext = () => {\n const context = useContext(DrmPlaybackWarningContext)\n return context\n}\n\nexport const DRMWarningDialog = ({onClose}: {onClose: () => void}) => {\n const {setHasWarnedAboutDrmPlayback} = useDrmPlaybackWarningContext()\n const _onClose = () => {\n setHasWarnedAboutDrmPlayback(true)\n onClose()\n }\n return (\n <Dialog\n open\n id=\"drm-playback-warn\"\n onClose={_onClose}\n header=\"DRM Playback Warning\"\n footer={\n <Stack padding={3}>\n <Button mode=\"ghost\" tone=\"primary\" onClick={_onClose} text=\"Ok\" />\n </Stack>\n }\n >\n <Stack space={3} padding={3}>\n <Card padding={[3, 3, 3]} radius={2}>\n <Stack space={3}>\n <Text size={1} weight=\"semibold\">\n DRM-protected playback will generate a license with a small associated cost. The\n plugin will attempt to play signed or public playback IDs instead whenever possible.\n </Text>\n </Stack>\n </Card>\n <Card padding={[3, 3, 3]} radius={2} tone=\"suggest\">\n <Stack space={3}>\n <Text size={1} weight=\"semibold\">\n This is a one time warning. If it persists, you can disable it from your plugin\n configuration.\n </Text>\n </Stack>\n </Card>\n </Stack>\n </Dialog>\n )\n}\n","// As it's required to specify the API Version this custom hook ensures it's all using the same version\nimport {useClient as useSanityClient} from 'sanity'\n\nexport 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 {\n collate,\n createHookFromObservableFactory,\n type DocumentStore,\n useDocumentStore,\n} 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","// Handy little state machine to simplify managing which root level dialog to open\n\nimport {useState} from 'react'\n\nexport type DialogState =\n | 'secrets'\n | 'mezzanine'\n | 'select-video'\n | 'edit-thumbnail'\n | 'edit-captions'\n | false\n\nexport function useDialogState() {\n return useState<DialogState>(false)\n}\n\nexport type SetDialogState = ReturnType<typeof useDialogState>[1]\n","declare global {\n var __PKG_VERSION__: string | undefined\n}\nexport const PLUGIN_VERSION = typeof __PKG_VERSION__ === 'string' ? __PKG_VERSION__ : '0.0.0-dev'\n","import {PLUGIN_VERSION} from '../constants'\n\nexport const PLUGIN_VERSION_QUERY = {\n sanityVersion: PLUGIN_VERSION,\n}\n","import {defer} from 'rxjs'\nimport type {SanityClient} from 'sanity'\n\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\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 drmConfigId: string\n}\nexport function saveSecrets(\n client: SanityClient,\n token: string,\n secretKey: string,\n enableSignedUrls: boolean,\n signingKeyId: string,\n signingKeyPrivate: string,\n drmConfigId: 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 drmConfigId,\n }\n doc.signingKeyId = enableSignedUrls ? signingKeyId : ''\n doc.signingKeyPrivate = enableSignedUrls ? signingKeyPrivate : ''\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 query: PLUGIN_VERSION_QUERY,\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, {cause: error})\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 query: PLUGIN_VERSION_QUERY,\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 query: PLUGIN_VERSION_QUERY,\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', e)\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 query: PLUGIN_VERSION_QUERY,\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 drmConfigId,\n }: Pick<\n Secrets,\n 'token' | 'secretKey' | 'enableSignedUrls' | 'drmConfigId'\n >): 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 drmConfigId!,\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 drmConfigId ?? '',\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 drmConfigId,\n }\n },\n [client, secrets],\n )\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\n/** Mux guide explaining the mezzanine (\"master access\") file and how it differs from MP4 renditions. */\nexport const MEZZANINE_LEARN_MORE_URL =\n 'https://www.mux.com/docs/guides/download-for-offline-editing#enable-master-access'\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 = [\n 'token',\n 'secretKey',\n 'enableSignedUrls',\n 'signingKeyId',\n 'signingKeyPrivate',\n 'drmConfigId',\n]\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 drmConfigId: value?.drmConfigId || 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 {useReducer} from 'react'\n\nimport type {Secrets} from '../util/types'\n\nexport interface State extends Pick<\n Secrets,\n 'token' | 'secretKey' | 'enableSignedUrls' | 'drmConfigId'\n> {\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}}\n | {type: 'change'; payload: {name: 'drmConfigId'; value: string}}\nfunction init({token, secretKey, enableSignedUrls, drmConfigId}: 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 drmConfigId: drmConfigId ?? '',\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 unknown as Action)?.type}`)\n }\n}\n\nexport const useSecretsFormState = (secrets: Secrets) => useReducer(reducer, secrets, init)\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 drmConfigId\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 drmConfigId: data?.drmConfigId || null,\n }\n }, [cacheNs, _id, projectId, dataset])\n}\n","import {useTheme_v2} from '@sanity/ui'\nimport {type 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 {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {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 {\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 {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 {useDialogState} from '../hooks/useDialogState'\nimport {useSaveSecrets} from '../hooks/useSaveSecrets'\nimport {useSecretsDocumentValues} from '../hooks/useSecretsDocumentValues'\nimport {useSecretsFormState} from '../hooks/useSecretsFormState'\nimport {cacheNs, DIALOGS_Z_INDEX} 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\n// Props for the dialog component when used with external state management\nexport interface ConfigureApiDialogProps {\n setDialogState: SetDialogState\n secrets: Secrets\n}\n\nconst fieldNames = ['token', 'secretKey', 'enableSignedUrls', 'drmConfigId'] as const\n\n// Internal dialog component that can be used with external state\nexport function ConfigureApiDialog({secrets, setDialogState}: ConfigureApiDialogProps) {\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.drmConfigId !== state.drmConfigId,\n [secrets, state],\n )\n const id = `ConfigureApi${useId()}`\n const [tokenId, secretKeyId, enableSignedUrlsId, drmConfigIdId] = 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, drmConfigId} = state\n handleSaveSecrets({token, secretKey, enableSignedUrls, drmConfigId})\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 const handleChangeDrmConfigId = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n dispatch({\n type: 'change',\n payload: {name: 'drmConfigId', value: event.currentTarget.value},\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 onClickOutside={handleClose}\n header={<Header />}\n zOffset={DIALOGS_Z_INDEX}\n position=\"fixed\"\n width={1}\n >\n <Box padding={3}>\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 <FormField title=\"DRM Configuration ID\" inputId={drmConfigIdId}>\n <TextInput\n id={drmConfigIdId}\n onChange={handleChangeDrmConfigId}\n type=\"text\"\n value={state.drmConfigId ?? ''}\n required={false}\n />\n </FormField>\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"neutral\">\n <Stack space={3}>\n <Text size={1}>\n DRM (Digital Rights Management) provides an extra layer of content security for\n video content streamed from Mux. For additional information check out our{' '}\n <a\n href=\"https://www.mux.com/docs/guides/protect-videos-with-drm#play-drm-protected-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n DRM Guide\n </a>\n .\n </Text>\n <Text size={1}>\n <a\n href=\"https://www.mux.com/support/human\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Contact us\n </a>{' '}\n to get started using DRM.\n </Text>\n </Stack>\n </Card>\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\n// Wrapper component that manages its own dialog state (used in VideosBrowser)\nexport default function ConfigureApi() {\n const [dialogOpen, setDialogOpen] = useDialogState()\n const secretDocumentValues = useSecretsDocumentValues()\n\n const openDialog = useCallback(() => setDialogOpen('secrets'), [setDialogOpen])\n\n if (dialogOpen === 'secrets') {\n return (\n <ConfigureApiDialog\n secrets={secretDocumentValues.value.secrets}\n setDialogState={setDialogOpen}\n />\n )\n }\n\n return <Button mode=\"bleed\" text=\"Configure plugin\" onClick={openDialog} />\n}\n","import {truncateString} from 'sanity'\n\n/**\n * Generates a placeholder title for a Mux asset when no title is available.\n * This format is used when importing assets that don't have a title in Mux.\n *\n * @param assetId - The Mux asset ID\n * @returns A placeholder title in the format \"Asset #[truncated-id]\"\n */\nexport function generateAssetPlaceholder(assetId: string): string {\n return `Asset #${truncateString(assetId, 15)}`\n}\n\n/**\n * Checks if a filename is empty or has the placeholder format.\n * This is used to determine if a video title should be updated during metadata sync.\n *\n * @param filename - The current filename/title of the video\n * @param assetId - The Mux asset ID to check against\n * @returns true if the filename is empty or matches the placeholder format\n */\nexport function isEmptyOrPlaceholderTitle(filename: string | undefined, assetId: string): boolean {\n // Check if filename is empty/undefined\n if (!filename || filename.trim() === '') {\n return true\n }\n\n // Check if filename matches the placeholder format for this asset\n const placeholder = generateAssetPlaceholder(assetId)\n return filename === placeholder\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 type {SanityClient} from 'sanity'\n\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\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 query: PLUGIN_VERSION_QUERY,\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 {\n return 'failed-sanity'\n }\n\n if (deleteOnMux && asset?.assetId) {\n try {\n await deleteAssetOnMux(client, asset.assetId)\n } catch {\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 query: PLUGIN_VERSION_QUERY,\n })\n}\n\nexport function listAssets(\n client: SanityClient,\n options: {limit?: number; cursor?: string | null},\n) {\n const {dataset} = client.config()\n const query: {limit?: string; cursor?: string} = {}\n\n if (options.limit) {\n query.limit = options.limit.toString()\n }\n if (options.cursor) {\n query.cursor = options.cursor\n }\n\n return client.request<{data: MuxAsset[]; next_cursor?: string | null}>({\n url: `/addons/mux/assets/${dataset}/data/list`,\n withCredentials: true,\n method: 'GET',\n query: {...query, ...PLUGIN_VERSION_QUERY},\n })\n}\n\n/**\n * Adds a new text track to an existing asset using a VTT file URL\n */\nexport function addTextTrackFromUrl(\n client: SanityClient,\n assetId: string,\n vttUrl: string,\n options: {\n language_code: string\n name: string\n text_type?: 'subtitles'\n },\n) {\n const {dataset} = client.config()\n\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/tracks`,\n withCredentials: true,\n method: 'POST',\n body: {\n url: vttUrl,\n type: 'text',\n language_code: options.language_code,\n name: options.name,\n text_type: options.text_type || 'subtitles',\n },\n headers: {\n 'Content-Type': 'application/json',\n },\n query: PLUGIN_VERSION_QUERY,\n })\n}\n\n/**\n * Generates subtitles automatically for an audio track\n */\nexport function generateSubtitles(\n client: SanityClient,\n assetId: string,\n audioTrackId: string,\n options: {\n language_code: string\n name: string\n },\n) {\n const {dataset} = client.config()\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/tracks/${audioTrackId}/generate-subtitles`,\n withCredentials: true,\n method: 'POST',\n body: {\n generated_subtitles: [\n {\n language_code: options.language_code,\n name: options.name,\n },\n ],\n },\n headers: {\n 'Content-Type': 'application/json',\n },\n query: PLUGIN_VERSION_QUERY,\n })\n}\n\n/**\n * Deletes a text track from an asset\n */\nexport function deleteTextTrack(client: SanityClient, assetId: string, trackId: string) {\n const {dataset} = client.config()\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/tracks/${trackId}`,\n withCredentials: true,\n method: 'DELETE',\n query: PLUGIN_VERSION_QUERY,\n })\n}\n\n/**\n * Updates master access (the \"mezzanine\" file in Mux's docs) on a Mux asset, via the addon proxy.\n * @see {@link https://docs.mux.com/api-reference/video/assets/update-asset-master-access}\n */\nexport function updateMasterAccess(\n client: SanityClient,\n assetId: string,\n masterAccess: 'temporary' | 'none',\n) {\n const {dataset} = client.config()\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/master-access`,\n withCredentials: true,\n method: 'PUT',\n body: {master_access: masterAccess},\n headers: {\n 'Content-Type': 'application/json',\n },\n query: PLUGIN_VERSION_QUERY,\n })\n}\n","import {useEffect, useState} from 'react'\nimport {defer, of, timer} from 'rxjs'\nimport {concatMap, expand, tap} from 'rxjs/operators'\nimport type {SanityClient} from 'sanity'\n\nimport {listAssets} from '../actions/assets'\nimport type {MuxAsset} from '../util/types'\n\nconst ASSETS_PER_PAGE = 100\n\ntype MuxAssetsState = {\n cursor: string | null\n loading: boolean\n data?: MuxAsset[]\n error?: FetchError\n hasSkippedAssetsWithoutPlayback?: boolean\n}\n\ntype FetchError =\n | {\n _tag: 'FetchError'\n }\n | {_tag: 'MuxError'; error: unknown}\n\ntype PageResult = (\n | {\n data: MuxAsset[]\n next_cursor: string | null\n }\n | {\n error: FetchError\n }\n) & {\n cursor: string | null\n}\n\n/**\n * @docs {@link https://docs.mux.com/api-reference#video/operation/list-assets}\n */\nasync function fetchMuxAssetsPage(\n client: SanityClient,\n cursor: string | null,\n): Promise<PageResult> {\n try {\n const response = await listAssets(client, {\n limit: ASSETS_PER_PAGE,\n cursor,\n })\n\n return {\n cursor,\n data: response.data,\n next_cursor: response.next_cursor || null,\n }\n } catch {\n return {\n cursor,\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 const newAssets = ('data' in pageResult && pageResult.data) || []\n\n // Filter assets and check for skipped items\n const {validAssets, skippedInThisPage} = newAssets.reduce<{\n validAssets: MuxAsset[]\n skippedInThisPage: boolean\n }>(\n (acc, asset) => {\n const hasPlaybackIds = asset.playback_ids && asset.playback_ids.length > 0\n const isDuplicate = currentData.some((a) => a.id === asset.id)\n\n if (!hasPlaybackIds) {\n acc.skippedInThisPage = true\n }\n\n if (hasPlaybackIds && !isDuplicate) {\n acc.validAssets.push(asset)\n }\n\n return acc\n },\n {validAssets: [], skippedInThisPage: false},\n )\n\n return {\n ...currentState,\n data: [...currentData, ...validAssets],\n error:\n 'error' in pageResult\n ? pageResult.error\n : // Reset error if current page is successful\n undefined,\n cursor: 'next_cursor' in pageResult ? pageResult.next_cursor : pageResult.cursor,\n loading: true,\n hasSkippedAssetsWithoutPlayback:\n currentState.hasSkippedAssetsWithoutPlayback || skippedInThisPage,\n }\n}\n\nfunction hasMorePages(pageResult: PageResult) {\n return (\n typeof pageResult === 'object' && 'next_cursor' in pageResult && pageResult.next_cursor !== null\n )\n}\n\n/**\n * Fetches all assets from a Mux environment. Rules:\n * - One page at a time\n * - Uses cursor-based pagination\n * - We've finished fetching when `next_cursor` is null\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({client, enabled}: {client: SanityClient; enabled: boolean}) {\n const [state, setState] = useState<MuxAssetsState>({loading: true, cursor: null})\n\n useEffect(() => {\n if (!enabled) return\n\n const subscription = defer(() =>\n fetchMuxAssetsPage(\n client,\n // When we've already successfully loaded before (fully or partially), we start from the next cursor to avoid re-fetching\n 'data' in state && state.data && state.data.length > 0 && !state.error\n ? state.cursor\n : null,\n ),\n )\n .pipe(\n // Here we use \"expand\" to recursively fetch next pages\n expand((pageResult) => {\n // if fetched page has next_cursor, we continue emitting, requesting the next page\n // after 2s to avoid rate limiting\n if (hasMorePages(pageResult)) {\n return timer(2000).pipe(\n concatMap(() =>\n defer(() =>\n fetchMuxAssetsPage(\n client,\n 'next_cursor' in pageResult ? pageResult.next_cursor : null,\n ),\n ),\n ),\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 return () => subscription.unsubscribe()\n // oxlint-disable-next-line react/exhaustive-deps -- secrets/pluginConfig are stable for the asset fetch lifecycle once enabled\n }, [enabled])\n\n return state\n}\n","import {uuid} from '@sanity/uuid'\nimport {useMemo, useState} from 'react'\nimport {\n createHookFromObservableFactory,\n type DocumentStore,\n useClient,\n useDocumentStore,\n} from 'sanity'\n\nimport {generateAssetPlaceholder} from '../util/assetTitlePlaceholder'\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 client,\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.meta?.title ?? generateAssetPlaceholder(asset.id),\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 return () => {\n if (toObserve) observer.unobserve(toObserve)\n }\n }, [options, ref])\n\n return inView\n}\n","import type {\n AdvancedPlaybackPolicy,\n MuxPlaybackId,\n PlaybackPolicy,\n VideoAssetDocument,\n} from './types'\n\n/* - Returns the playback id of the asset based on the specified priority.\n By default chooses the \"strongest\" policy\n - Otherwise, returns the first playback id in the array.\n */\nexport function getPlaybackId(\n asset: Pick<VideoAssetDocument, 'data'>,\n priority: string[] = ['drm', 'signed', 'public'],\n): string {\n try {\n if (!asset) {\n throw new TypeError('Tried to get playback Id with no asset')\n }\n\n const playbackIds = asset.data?.playback_ids\n if (playbackIds && playbackIds.length > 0) {\n for (const policy of priority) {\n const match = playbackIds.find((entry) => entry.policy === policy)\n if (match) {\n return match.id\n }\n }\n\n return playbackIds[0]!.id\n }\n\n throw new TypeError('Missing playbackId')\n } catch (e) {\n console.error('Asset is missing a playbackId', {asset}, e)\n throw e\n }\n}\n\nexport function getPlaybackPolicy(\n asset: Pick<VideoAssetDocument, 'data' | 'playbackId'>,\n): MuxPlaybackId | undefined {\n return (\n asset.data?.playback_ids?.find(\n (playbackId) => getPlaybackId(asset, ['drm', 'signed', 'public']) === playbackId.id,\n ) ?? {id: '', policy: 'public'}\n )\n}\n\nexport function getPlaybackPolicyById(\n asset: Pick<VideoAssetDocument, 'data'>,\n playbackId: string,\n): MuxPlaybackId | undefined {\n return asset.data?.playback_ids?.find((entry) => playbackId === entry.id)\n}\n\nexport function hasPlaybackPolicy(\n data: Partial<{\n playback_policy?: PlaybackPolicy[]\n advanced_playback_policies: AdvancedPlaybackPolicy[]\n }>,\n policy: PlaybackPolicy,\n) {\n return (\n (data.advanced_playback_policies &&\n data.advanced_playback_policies.find((p) => p.policy === policy)) ||\n data.playback_policy?.find((p) => p === policy)\n )\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' | 'd'\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 : T extends 'd'\n ? never\n : never\n\n/**\n * Uses suspend. Call this with {@link tryWithSuspend} or rethrow the Promise\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 /* Using suspend means we need to use Suspense on parent components.\n Also, this will throw a Promise under the hood (apparently common in React), \n so if we want to catch errors we have to take this into account in catch blocks\n and rethrow promises. */\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 {SanityClient} from 'sanity'\n\nimport {getPlaybackId} from '../util/getPlaybackPolicy'\nimport {type Audience, generateJwt} from './generateJwt'\nimport {getPlaybackPolicyById} from './getPlaybackPolicy'\nimport type {AssetThumbnailOptions} from './types'\n\n/**\n * May throw a Promise. Call this with {@link tryWithSuspend} or rethrow the Promise\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 const playbackPolicy = getPlaybackPolicyById(asset, playbackId)?.policy\n if (playbackPolicy === 'signed' || playbackPolicy === 'drm') {\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 {type 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 {type 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 !== undefined) {\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","/**\n * When running `suspend()` from react-suspend a function may throw a Promise\n * causing unexpected behavior when catching.\n * @param block Your block of code that uses suspend\n * @param onError (optional) How to handle a regular Error\n * @returns Whatever is returned by the block if it succeeds, otherwise whatever is resolved by onError if defined\n * @throws rethrows the caught Promise to comply with Suspense logic\n */\nexport function tryWithSuspend<T, E>(\n block: () => T,\n onError?: (error: Error) => E,\n): T | E | undefined {\n try {\n return block()\n } catch (errorOrPromise) {\n if (errorOrPromise instanceof Promise) {\n // react-suspend will throw a Promise\n throw errorOrPromise\n }\n return onError ? onError(errorOrPromise as Error) : undefined\n }\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Card, type CardTone, Spinner, Stack, Text} from '@sanity/ui'\nimport {Suspense, 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 {tryWithSuspend} from '../util/tryWithSuspend'\nimport type {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 posterWidth = width || 250\n const client = useClient()\n const ref = useRef<HTMLDivElement | null>(null)\n const inView = useInView(ref)\n\n const [status, setStatus] = useState<ImageStatus>('loading')\n const [error, setError] = useState<string | null>(null)\n\n const thumbnailSrc = useMemo(() => {\n return tryWithSuspend(\n () => {\n let thumbnail: MuxAnimatedThumbnailUrl | MuxThumbnailUrl | undefined\n\n if (staticImage) thumbnail = getPosterSrc({asset, client, width: posterWidth})\n else thumbnail = getAnimatedPosterSrc({asset, client, width: posterWidth})\n return thumbnail\n },\n (err: Error) => {\n handleError(err.message)\n return undefined\n },\n )\n }, [asset, client, posterWidth, staticImage])\n\n function handleLoad() {\n setStatus('loaded')\n }\n\n function handleError(err?: string) {\n setStatus('error')\n if (err) {\n setError(err)\n } else {\n setError('Failed loading thumbnail')\n }\n }\n\n return (\n <Suspense fallback={<span>Preparing thumbnail</span>}>\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 {error}\n </Text>\n </Stack>\n )}\n <Image\n src={thumbnailSrc ?? undefined}\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 </Suspense>\n )\n}\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {InfoOutlineIcon} from '@sanity/icons/InfoOutline'\nimport {RetrieveIcon} from '@sanity/icons/Retrieve'\nimport {RetryIcon} from '@sanity/icons/Retry'\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\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=\"ghost\"\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 {/* WARNING: SKIPPED ASSETS WITHOUT PLAYBACK */}\n {props.muxAssets.hasSkippedAssetsWithoutPlayback && (\n <Card tone=\"caution\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={2}>\n <InfoOutlineIcon fontSize={36} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n Some videos were skipped\n </Text>\n <Text size={1}>\n Videos without playback IDs cannot be imported and have been excluded from the\n list.\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\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 return <ImportVideosDialog {...importAssets} />\n }\n\n return <Button mode=\"bleed\" text=\"Import from Mux\" onClick={importAssets.openDialog} />\n}\n","import {ChevronLeftIcon} from '@sanity/icons/ChevronLeft'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {Button, Label} from '@sanity/ui'\nimport {type Dispatch, type SetStateAction, useEffect} from 'react'\n\nconst PageSelector = (props: {\n page: number\n setPage: Dispatch<SetStateAction<number>>\n total: number\n}) => {\n const page = props.page\n const setPage = props.setPage\n\n useEffect(() => {\n // Constraint in bounds.\n const clamped = Math.min(props.total - 1, Math.max(0, page))\n if (page !== clamped) {\n setPage(clamped)\n }\n }, [page, props.total, setPage])\n\n return (\n <>\n <Button\n icon={ChevronLeftIcon}\n mode=\"bleed\"\n padding={3}\n style={{cursor: 'pointer'}}\n disabled={page <= 0}\n onClick={() => {\n setPage((p) => {\n return Math.min(props.total - 1, Math.max(0, p - 1))\n })\n }}\n />\n <Label muted>\n Page {page + 1}/{props.total}\n </Label>\n <Button\n icon={ChevronRightIcon}\n mode=\"bleed\"\n padding={3}\n style={{cursor: 'pointer'}}\n disabled={page >= props.total - 1}\n onClick={() => {\n setPage((p) => {\n return Math.min(props.total - 1, Math.max(0, p + 1))\n })\n }}\n />\n </>\n )\n}\n\nexport default PageSelector\n","import type {MuxAsset} from './types'\n\n/**\n * Adds a `_key` to array items in MuxAsset data (Sanity requires `_key` on array\n * items). Keys are derived from each item's stable Mux `id`, so repeated calls\n * are idempotent and don't churn the document — important because the asset is\n * persisted on every poll while it prepares.\n */\nexport function addKeysToMuxData(data: MuxAsset): MuxAsset {\n return {\n ...data,\n tracks: data.tracks?.map((track, index) => ({\n ...track,\n _key: track.id || `track-${index}`,\n })),\n playback_ids: data.playback_ids?.map((playbackId, index) => ({\n ...playbackId,\n _key: playbackId.id || `playback-${index}`,\n })),\n static_renditions: data.static_renditions\n ? {\n ...data.static_renditions,\n files: data.static_renditions.files?.map((file, index) => ({\n ...file,\n _key: file.id || `rendition-${index}`,\n })),\n }\n : undefined,\n }\n}\n","import {useMemo, useState} from 'react'\nimport {\n createHookFromObservableFactory,\n type DocumentStore,\n useClient,\n useDocumentStore,\n} from 'sanity'\n\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {isEmptyOrPlaceholderTitle} from '../util/assetTitlePlaceholder'\nimport type {VideoAssetDocument} from '../util/types'\nimport {SANITY_API_VERSION} from './useClient'\nimport useMuxAssets from './useMuxAssets'\nimport {useSecretsDocumentValues} from './useSecretsDocumentValues'\n\ntype ResyncState = 'closed' | 'idle' | 'syncing' | 'done' | 'error'\n\nexport default function useResyncMuxMetadata() {\n const documentStore = useDocumentStore()\n const client = useClient({\n apiVersion: SANITY_API_VERSION,\n })\n\n const [sanityAssets, sanityAssetsLoading] = useSanityAssets(documentStore)\n\n const secretDocumentValues = useSecretsDocumentValues()\n const hasSecrets = !!secretDocumentValues.value.secrets?.secretKey\n\n const [resyncError, setResyncError] = useState<unknown>()\n const [resyncState, setResyncState] = useState<ResyncState>('closed')\n const dialogOpen = resyncState !== 'closed'\n\n const muxAssets = useMuxAssets({\n client,\n enabled: hasSecrets && dialogOpen,\n })\n\n const matchedAssets = useMemo(() => {\n return sanityAssets && muxAssets.data\n ? sanityAssets.map((sanityDoc) => {\n const muxAsset = muxAssets.data?.find(\n (m) => m.id === sanityDoc.assetId || m.id === sanityDoc.data?.id,\n )\n return {\n sanityDoc,\n muxAsset,\n muxTitle: muxAsset?.meta?.title,\n currentTitle: sanityDoc.filename,\n }\n })\n : undefined\n }, [sanityAssets, muxAssets.data])\n\n const closeDialog = () => {\n if (resyncState !== 'syncing') setResyncState('closed')\n }\n\n const openDialog = () => {\n if (resyncState === 'closed') setResyncState('idle')\n }\n\n async function syncAllVideos() {\n if (!matchedAssets) return\n\n setResyncState('syncing')\n\n try {\n const tx = client.transaction()\n\n matchedAssets.forEach((matched) => {\n // Update all videos with the Mux title, even if it's undefined/empty\n const newTitle = matched.muxTitle || ''\n tx.patch(matched.sanityDoc._id, {set: {filename: newTitle}})\n })\n\n await tx.commit({returnDocuments: false})\n setResyncState('done')\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n }\n }\n\n async function syncOnlyEmpty() {\n if (!matchedAssets) return\n\n setResyncState('syncing')\n\n try {\n const tx = client.transaction()\n\n matchedAssets.forEach((matched) => {\n // Only update if the current title is empty or has the placeholder format\n // AND there's a new title available from Mux\n if (\n matched.muxAsset &&\n matched.muxTitle &&\n isEmptyOrPlaceholderTitle(matched.currentTitle, matched.muxAsset.id)\n ) {\n tx.patch(matched.sanityDoc._id, {set: {filename: matched.muxTitle}})\n }\n })\n\n await tx.commit({returnDocuments: false})\n setResyncState('done')\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n }\n }\n\n async function syncFullData() {\n if (!matchedAssets) return\n\n setResyncState('syncing')\n\n try {\n const tx = client.transaction()\n\n matchedAssets.forEach((matched) => {\n if (!matched.muxAsset) return\n\n const dataWithKeys = addKeysToMuxData(matched.muxAsset)\n\n // Update all fields: filename, status, and full data from Mux\n tx.patch(matched.sanityDoc._id, {\n set: {\n filename: matched.muxTitle || matched.currentTitle || '',\n status: matched.muxAsset.status,\n data: dataWithKeys,\n },\n })\n })\n\n await tx.commit({returnDocuments: false})\n setResyncState('done')\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n }\n }\n\n return {\n sanityAssetsLoading,\n closeDialog,\n dialogOpen,\n resyncState,\n resyncError,\n hasSecrets,\n syncAllVideos,\n syncOnlyEmpty,\n syncFullData,\n matchedAssets,\n muxAssets,\n openDialog,\n }\n}\n\nconst useSanityAssets = createHookFromObservableFactory<VideoAssetDocument[], DocumentStore>(\n (documentStore) => {\n return documentStore.listenQuery(\n /* groq */ `*[_type == \"mux.videoAsset\"]`,\n {},\n {\n apiVersion: SANITY_API_VERSION,\n },\n )\n },\n)\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {Box, Button, Card, Dialog, Flex, Heading, Radio, Spinner, Stack, Text} from '@sanity/ui'\nimport {useState} from 'react'\n\nimport useResyncMuxMetadata from '../hooks/useResyncMuxMetadata'\nimport {isEmptyOrPlaceholderTitle} from '../util/assetTitlePlaceholder'\nimport {DIALOGS_Z_INDEX} from '../util/constants'\n\ntype SyncOption = 'fillEmpty' | 'syncTitles' | 'fullResync'\n\ninterface OptionCardProps {\n id: SyncOption\n selected: boolean\n onSelect: (id: SyncOption) => void\n title: string\n count: number\n description: string\n disabled?: boolean\n}\n\nfunction OptionCard({\n id,\n selected,\n onSelect,\n title,\n count,\n description,\n disabled,\n}: OptionCardProps) {\n return (\n <Card\n as=\"label\"\n padding={3}\n radius={2}\n border\n tone={selected ? 'primary' : 'default'}\n style={{\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n }}\n >\n <Flex gap={3} align=\"flex-start\">\n <Box paddingTop={1}>\n <Radio\n checked={selected}\n onChange={() => onSelect(id)}\n disabled={disabled}\n name=\"sync-option\"\n />\n </Box>\n <Stack space={2} flex={1}>\n <Flex align=\"center\" gap={2}>\n <Text size={2} weight=\"semibold\">\n {title} ({count})\n </Text>\n </Flex>\n <Text size={1} muted>\n {description}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )\n}\n\nfunction ResyncMetadataDialog(props: ReturnType<typeof useResyncMuxMetadata>) {\n const {resyncState} = props\n\n const videosToUpdate = props.matchedAssets?.filter((m) => m.muxAsset).length || 0\n const videosWithEmptyOrPlaceholder =\n props.matchedAssets?.filter(\n (m) => m.muxAsset && m.muxTitle && isEmptyOrPlaceholderTitle(m.currentTitle, m.muxAsset.id),\n ).length || 0\n\n const hasEmptyTitles = videosWithEmptyOrPlaceholder > 0\n const defaultOption: SyncOption = hasEmptyTitles ? 'fillEmpty' : 'syncTitles'\n const [selectedOption, setSelectedOption] = useState<SyncOption>(defaultOption)\n\n const canTriggerResync = resyncState === 'idle' || resyncState === 'error'\n const isResyncing = resyncState === 'syncing'\n const isDone = resyncState === 'done'\n const isLoading = props.muxAssets.loading || props.sanityAssetsLoading\n\n const handleSync = () => {\n switch (selectedOption) {\n case 'fillEmpty':\n void props.syncOnlyEmpty()\n break\n case 'syncTitles':\n void props.syncAllVideos()\n break\n case 'fullResync':\n void props.syncFullData()\n break\n default:\n break\n }\n }\n\n return (\n <Dialog\n animate\n header=\"Sync with Mux\"\n zOffset={DIALOGS_Z_INDEX}\n id=\"resync-metadata-dialog\"\n onClose={props.closeDialog}\n onClickOutside={props.closeDialog}\n width={1}\n position=\"fixed\"\n footer={\n !isDone && (\n <Card padding={3}>\n <Flex justify=\"flex-end\" gap={2}>\n <Button\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text=\"Cancel\"\n onClick={props.closeDialog}\n disabled={isResyncing}\n />\n <Button\n icon={SyncIcon}\n fontSize={2}\n padding={3}\n text=\"Run sync\"\n tone=\"primary\"\n onClick={handleSync}\n iconRight={isResyncing && Spinner}\n disabled={!canTriggerResync || isLoading}\n />\n </Flex>\n </Card>\n )\n }\n >\n <Box padding={4}>\n {/* LOADING ASSETS STATE */}\n {isLoading && (\n <Card tone=\"primary\" marginBottom={4} padding={3} border radius={2}>\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} muted>\n This may take a while.\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR LOADING MUX */}\n {props.muxAssets.error && (\n <Card tone=\"critical\" marginBottom={4} padding={3} border radius={2}>\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 data from Mux\n </Text>\n <Text size={1}>Please try again or contact a developer for help.</Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* SYNCING STATE */}\n {resyncState === 'syncing' && (\n <Card tone=\"primary\" marginBottom={4} padding={3} border radius={2}>\n <Flex align=\"center\" gap={4}>\n <Spinner muted size={4} />\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n Syncing metadata\n </Text>\n <Text size={1} muted>\n Updating videos from Mux...\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR SYNCING */}\n {resyncState === 'error' && (\n <Card tone=\"critical\" marginBottom={4} padding={3} border radius={2}>\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 syncing metadata\n </Text>\n <Text size={1}>\n {props.resyncError\n ? `Error: ${props.resyncError}`\n : 'Please try again or contact a developer for help.'}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* SUCCESS STATE */}\n {resyncState === 'done' && (\n <Stack paddingY={5} space={3} style={{textAlign: 'center'}}>\n <Box>\n <CheckmarkCircleIcon fontSize={48} />\n </Box>\n <Heading size={2}>Sync completed</Heading>\n <Text size={2} muted>\n Videos have been updated from Mux.\n </Text>\n </Stack>\n )}\n\n {/* OPTIONS */}\n {!isDone && !isLoading && !props.muxAssets.error && (\n <Stack space={4}>\n <Text size={1} muted>\n Found {videosToUpdate} video{videosToUpdate === 1 ? '' : 's'} linked to Mux.\n </Text>\n\n <Stack space={3}>\n {hasEmptyTitles && (\n <OptionCard\n id=\"fillEmpty\"\n selected={selectedOption === 'fillEmpty'}\n onSelect={setSelectedOption}\n title=\"Fill missing titles only\"\n count={videosWithEmptyOrPlaceholder}\n description=\"Updates only videos without a title or with placeholder titles (e.g., 'Asset #123') using the title from Mux.\"\n disabled={isResyncing}\n />\n )}\n\n <OptionCard\n id=\"syncTitles\"\n selected={selectedOption === 'syncTitles'}\n onSelect={setSelectedOption}\n title=\"Sync all titles\"\n count={videosToUpdate}\n description=\"Replaces the title in Sanity with the title from Mux for all videos.\"\n disabled={isResyncing}\n />\n\n <OptionCard\n id=\"fullResync\"\n selected={selectedOption === 'fullResync'}\n onSelect={setSelectedOption}\n title=\"Full resync\"\n count={videosToUpdate}\n description=\"Updates all fields from Mux including status, duration, tracks, captions, and renditions.\"\n disabled={isResyncing}\n />\n </Stack>\n </Stack>\n )}\n </Box>\n </Dialog>\n )\n}\n\nexport default function ResyncMetadata() {\n const resyncMetadata = useResyncMuxMetadata()\n\n if (!resyncMetadata.hasSecrets) {\n return\n }\n\n if (resyncMetadata.dialogOpen) {\n return <ResyncMetadataDialog {...resyncMetadata} />\n }\n\n return <Button mode=\"bleed\" text=\"Sync with Mux\" onClick={resyncMetadata.openDialog} />\n}\n","import {SortIcon} from '@sanity/icons/Sort'\nimport {Button, Menu, MenuButton, MenuItem, type PopoverProps} from '@sanity/ui'\nimport {useId} from 'react'\n\nimport {ASSET_SORT_OPTIONS, type SortOption} from '../hooks/useAssets'\n\nconst 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 {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 {useToast} from '@sanity/ui'\nimport {useCallback, useEffect, useMemo, useState} from 'react'\n\nimport {getAsset, updateMasterAccess} from '../actions/assets'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\nimport {useClient} from './useClient'\n\n/**\n * UI status for the mezzanine (\"master access\") file of a Mux asset, derived\n * solely from the stored `master` object.\n * - `disabled`: master access is not enabled (or reverted to `none`).\n * - `preparing`: Mux is preparing the file (we poll until it's ready).\n * - `ready`: the file is ready to download.\n * - `errored`: Mux failed to prepare the file.\n */\nexport type MezzanineStatus = 'disabled' | 'preparing' | 'ready' | 'errored'\n\n// Poll cadence while the mezzanine is preparing.\nconst POLL_INTERVAL_MS = 3000\n\nexport interface UseMezzanineReturn {\n status: MezzanineStatus\n /** `true` while an enable or pre-download check request is in flight. */\n busy: boolean\n /**\n * `true` when the last download attempt found the file gone (the 24h window\n * elapsed). Used to show a \"enable it again\" hint; the button state still\n * comes from `status`.\n */\n expired: boolean\n /** Mezzanine resolution label (e.g. `1080p`), when known. */\n resolution?: string\n /** Enables master access and starts polling until the file is ready. */\n enable: () => Promise<void>\n /** Re-fetches the asset and, if the file is still alive, triggers the download. */\n download: () => Promise<void>\n}\n\n/** Derives the mezzanine status from the persisted asset data alone (no polling or local state). */\nexport function getMezzanineStatus(\n asset: VideoAssetDocument,\n): 'disabled' | 'preparing' | 'ready' | 'errored' {\n const master = asset.data?.master\n if (master?.status === 'preparing') return 'preparing'\n if (master?.status === 'ready' && master.url) return 'ready'\n if (master?.status === 'errored') return 'errored'\n return 'disabled'\n}\n\n/**\n * Encapsulates the mezzanine (Mux \"master access\") lifecycle for an asset:\n * enabling it through the Mux addon proxy, persisting the result on the Sanity\n * document, polling until it's ready, and downloading by redirecting to the\n * fresh, short-lived Mux URL.\n *\n * The full Mux asset `data` (including the `master` object) is stored on the\n * Sanity document via `client.patch`, so the status survives reloads and is\n * already present for assets imported from Mux.\n */\nexport function useMezzanine(asset: VideoAssetDocument): UseMezzanineReturn {\n const client = useClient()\n const toast = useToast()\n\n const master = asset.data?.master\n const [busy, setBusy] = useState(false)\n const [expired, setExpired] = useState(false)\n // Track the previous assetId so we can reset transient flags during render\n // when the asset changes, without triggering a cascading setState-in-effect.\n const [prevAssetId, setPrevAssetId] = useState(asset.assetId)\n if (prevAssetId !== asset.assetId) {\n setPrevAssetId(asset.assetId)\n setExpired(false)\n }\n\n const resolution = useMemo(\n () => asset.data?.max_resolution_tier || asset.data?.max_stored_resolution || undefined,\n [asset.data?.max_resolution_tier, asset.data?.max_stored_resolution],\n )\n\n const status: MezzanineStatus = getMezzanineStatus(asset)\n\n // Persist a Mux asset payload on the Sanity document.\n const persist = useCallback(\n async (data: MuxAsset) => {\n if (!asset._id) return\n await client\n .patch(asset._id)\n .set({status: data.status, data: addKeysToMuxData(data)})\n .commit({returnDocuments: false})\n },\n [asset._id, client],\n )\n\n // Fetch the latest asset from Mux (through the proxy) and persist it on the Sanity document.\n const refresh = useCallback(async (): Promise<MuxAsset | undefined> => {\n if (!asset.assetId || !asset._id) return undefined\n const {data} = await getAsset(client, asset.assetId)\n await persist(data)\n return data\n }, [asset.assetId, asset._id, client, persist])\n\n // Poll while the mezzanine is preparing; stop once it's ready or no longer preparing.\n useEffect(() => {\n if (master?.status !== 'preparing' || !asset.assetId || !asset._id) return undefined\n\n let cancelled = false\n let running = false\n const interval = setInterval(async () => {\n // Skip this tick if the previous refresh hasn't finished, so a slow\n // request can't pile up overlapping reads/writes.\n if (running) return\n running = true\n try {\n const data = await refresh()\n if (cancelled) return\n if (!data || data.master?.status !== 'preparing') {\n clearInterval(interval)\n }\n } catch (error) {\n console.error('Failed to poll mezzanine status:', error)\n } finally {\n running = false\n }\n }, POLL_INTERVAL_MS)\n\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }, [master?.status, asset.assetId, asset._id, refresh])\n\n const enable = useCallback(async () => {\n if (!asset.assetId || !asset._id) return\n\n setBusy(true)\n setExpired(false)\n try {\n const {data} = await updateMasterAccess(client, asset.assetId, 'temporary')\n // Persist the PUT response directly — it already reports master.status\n // 'preparing', so polling starts without relying on a follow-up GET that\n // could read stale data and miss it.\n await persist(data)\n } catch (error) {\n toast.push({\n status: 'error',\n title: 'Could not enable the mezzanine file',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setBusy(false)\n }\n }, [asset.assetId, asset._id, client, persist, toast])\n\n const download = useCallback(async () => {\n if (!asset.assetId) return\n\n setBusy(true)\n try {\n // The Mux URL is short-lived (24h), so re-fetch the asset right before\n // downloading and only redirect if the file is still alive.\n const data = await refresh()\n const url = data?.master?.status === 'ready' ? data.master.url : undefined\n\n if (url) {\n setExpired(false)\n triggerMezzanineDownload(url)\n } else {\n // The window elapsed and master_access reverted: prompt to re-enable.\n setExpired(true)\n }\n } catch (error) {\n toast.push({\n status: 'error',\n title: 'Could not download the mezzanine file',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setBusy(false)\n }\n }, [asset.assetId, refresh, toast])\n\n return {status, busy, expired, resolution, enable, download}\n}\n\n/**\n * Redirects the browser to the Mux mezzanine URL to start the download. The URL\n * already serves the file with its default name (`mezzanine.mp4`).\n * @see {@link https://www.mux.com/docs/guides/download-for-offline-editing}\n */\nfunction triggerMezzanineDownload(masterUrl: string): void {\n if (typeof window === 'undefined') return\n\n const anchor = document.createElement('a')\n anchor.href = masterUrl\n anchor.target = '_blank'\n anchor.rel = 'noopener noreferrer'\n document.body.appendChild(anchor)\n anchor.click()\n document.body.removeChild(anchor)\n}\n","import {Stack, Text} from '@sanity/ui'\n\n/** Explains what the mezzanine file is and how it differs from the streamable MP4 renditions. */\nexport default function MezzanineExplanation() {\n return (\n <Stack space={3}>\n <Text size={1} muted>\n When you enable the mezzanine file, Mux creates a copy equivalent in quality to your\n original video — ideal for offline editing or archiving. Unlike the streamable MP4 (static)\n renditions, it is not meant for streaming.\n </Text>\n <Text size={1} muted>\n The file is prepared in the background and may take a few minutes depending on the\n asset's duration and resolution. Enabling is free and the download stays available for\n 24 hours.\n </Text>\n </Stack>\n )\n}\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {Button, Card, Flex, Label, Spinner, Stack, Text} from '@sanity/ui'\n\nimport {useMezzanine} from '../hooks/useMezzanine'\nimport {MEZZANINE_LEARN_MORE_URL} from '../util/constants'\nimport type {VideoAssetDocument} from '../util/types'\nimport MezzanineExplanation from './MezzanineExplanation'\n\nexport interface Props {\n asset: VideoAssetDocument\n /**\n * Render the mezzanine explanation copy inside the card.\n * @defaultValue true\n */\n withExplanation?: boolean\n}\n\n/**\n * \"Mezzanine\" panel, modeled after Mux's dashboard card: enable the\n * master-access copy, watch it prepare, then download it.\n */\nexport default function Mezzanine({asset, withExplanation = true}: Props) {\n const {status, busy, expired, resolution, enable, download} = useMezzanine(asset)\n\n const assetReady = asset.status === 'ready' || asset.data?.status === 'ready'\n // Once a download finds the file gone, treat it as not-ready even if the\n // (stale) asset prop still reports `ready`, so we show the re-enable path\n // instead of a dead Download button.\n const isReady = status === 'ready' && !expired\n const isPreparing = status === 'preparing'\n const showExplanation = !isReady && !isPreparing\n\n return (\n <Card padding={3} radius={2} tone=\"transparent\" border>\n <Stack space={4}>\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Label muted size={1}>\n Mezzanine\n </Label>\n <Text size={1}>\n <a href={MEZZANINE_LEARN_MORE_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Learn more\n </a>\n </Text>\n </Flex>\n\n <Stack space={2}>\n <Text size={1} muted={!isReady}>\n mezzanine.mp4\n </Text>\n {resolution && (\n <Text size={1} muted>\n {resolution}\n </Text>\n )}\n </Stack>\n\n {withExplanation && showExplanation && <MezzanineExplanation />}\n\n {showExplanation && (expired || status === 'errored') && (\n <Stack space={2}>\n {expired && (\n <Text size={1} muted>\n The previous mezzanine file expired. Enable it again to download.\n </Text>\n )}\n {status === 'errored' && (\n <Text size={1} style={{color: 'var(--card-critical-color)'}}>\n Mux could not prepare the mezzanine file. Please try again.\n </Text>\n )}\n </Stack>\n )}\n\n {isPreparing && (\n <Text size={1} muted>\n Preparing the mezzanine file… this can take a few minutes. You can close this and come\n back later.\n </Text>\n )}\n\n {isReady && (\n <Text size={1} muted>\n Ready to download. The link stays available for about 24 hours.\n </Text>\n )}\n\n <Flex justify=\"flex-end\" gap={2}>\n {isPreparing ? (\n <Flex align=\"center\" gap={2}>\n <Spinner muted size={1} />\n <Text size={1} muted>\n Preparing…\n </Text>\n </Flex>\n ) : isReady ? (\n <Button\n icon={DownloadIcon}\n text=\"Download\"\n tone=\"positive\"\n fontSize={1}\n padding={3}\n loading={busy}\n disabled={busy}\n onClick={() => void download()}\n />\n ) : (\n <Button\n text={status === 'errored' ? 'Try again' : 'Enable'}\n tone=\"primary\"\n fontSize={1}\n padding={3}\n loading={busy}\n disabled={busy || !assetReady}\n onClick={() => void enable()}\n />\n )}\n </Flex>\n </Stack>\n </Card>\n )\n}\n","import {useToast} from '@sanity/ui'\nimport {useCallback, useState} from 'react'\n\nimport {getAsset} from '../actions/assets'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\nimport {useClient} from './useClient'\n\ntype ResyncAssetState = 'idle' | 'syncing' | 'success' | 'error'\n\ninterface UseResyncAssetOptions {\n showToast?: boolean\n onSuccess?: (updatedData: MuxAsset) => void\n onError?: (error: unknown) => void\n}\n\ninterface UseResyncAssetReturn {\n resyncState: ResyncAssetState\n resyncError: unknown\n resyncAsset: (asset: VideoAssetDocument) => Promise<MuxAsset | undefined>\n isResyncing: boolean\n}\n\nexport function useResyncAsset(options?: UseResyncAssetOptions): UseResyncAssetReturn {\n const client = useClient()\n const toast = useToast()\n const [resyncState, setResyncState] = useState<ResyncAssetState>('idle')\n const [resyncError, setResyncError] = useState<unknown>(null)\n\n const showToast = options?.showToast ?? false\n\n const resyncAsset = useCallback(\n async (asset: VideoAssetDocument) => {\n if (!asset.assetId) {\n if (showToast) {\n toast.push({\n title: 'Cannot resync',\n description: 'Asset has no Mux ID',\n status: 'error',\n })\n }\n options?.onError?.(new Error('Asset has no Mux ID'))\n return undefined\n }\n\n if (!asset._id) {\n if (showToast) {\n toast.push({\n title: 'Cannot resync',\n description: 'Asset has no document ID',\n status: 'error',\n })\n }\n options?.onError?.(new Error('Asset has no document ID'))\n return undefined\n }\n\n setResyncState('syncing')\n setResyncError(null)\n\n try {\n const response = await getAsset(client, asset.assetId)\n const muxData = response.data\n const dataWithKeys = addKeysToMuxData(muxData)\n\n await client\n .patch(asset._id)\n .set({\n status: muxData.status,\n data: dataWithKeys,\n ...(muxData.meta?.title && {filename: muxData.meta.title}),\n })\n .commit({returnDocuments: false})\n\n setResyncState('success')\n if (showToast) {\n toast.push({\n title: 'Asset synced',\n description: 'Data has been updated from Mux',\n status: 'success',\n })\n }\n\n options?.onSuccess?.(muxData)\n return muxData\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n console.error('Failed to refresh asset data:', error)\n if (showToast) {\n toast.push({\n title: 'Sync failed',\n description: 'Could not sync asset from Mux',\n status: 'error',\n })\n }\n options?.onError?.(error)\n return undefined\n }\n },\n [client, toast, options, showToast],\n )\n\n return {\n resyncState,\n resyncError,\n resyncAsset,\n isResyncing: resyncState === 'syncing',\n }\n}\n","import type {SanityClient} from '@sanity/client'\n\nimport {getAsset} from '../actions/assets'\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackPolicy'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxTextTrack, VideoAssetDocument} from './types'\n\nexport function extractErrorMessage(\n error: unknown,\n defaultMessage = 'Failed to process request',\n): string {\n let message = ''\n\n if (error && typeof error === 'object') {\n const err = error as {response?: {body?: {message?: string}}; message?: string}\n message = err.response?.body?.message || err.message || ''\n } else if (typeof error === 'string') {\n message = error\n }\n\n if (!message) {\n return defaultMessage\n }\n\n const match = message.match(/\\(([^)]+)\\)/)\n if (match && match[1]) {\n return match[1]\n }\n\n if (message.includes('responded with')) {\n const parts = message.split('(')\n if (parts.length > 1) {\n return parts[parts.length - 1]!.replace(')', '').trim()\n }\n }\n\n return message\n}\n\nexport interface PollTrackStatusOptions {\n client: SanityClient\n assetId: string\n trackName: string\n trackLanguageCode: string\n maxAttempts?: number\n onTrackFound?: (track: MuxTextTrack) => void\n onTrackErrored?: (track: MuxTextTrack) => void\n onTrackReady?: (track: MuxTextTrack) => void\n}\n\nexport interface PollTrackStatusResult {\n track: MuxTextTrack | undefined\n found: boolean\n status: 'ready' | 'preparing' | 'errored' | 'not-found'\n}\n\n/**\n * Polls Mux API to find and track the status of a newly added text track.\n * The track may be in \"preparing\" state initially, then become \"ready\" or \"errored\".\n *\n * @param options - Configuration options for polling\n * @returns Promise resolving to the poll result\n */\nexport async function pollTrackStatus(\n options: PollTrackStatusOptions,\n): Promise<PollTrackStatusResult> {\n const {\n client,\n assetId,\n trackName,\n trackLanguageCode,\n maxAttempts = 10,\n onTrackFound,\n onTrackErrored,\n onTrackReady,\n } = options\n\n const trimmedName = trackName.trim()\n const trimmedLanguageCode = trackLanguageCode.trim()\n let newTrack: MuxTextTrack | undefined\n let attempts = 0\n let trackFound = false\n\n const findTrack = (textTracks: MuxTextTrack[]): MuxTextTrack | undefined => {\n let foundTrack = textTracks.find(\n (track) => track.name === trimmedName && track.language_code === trimmedLanguageCode,\n )\n\n if (!foundTrack) {\n foundTrack = textTracks.find((track) => track.language_code === trimmedLanguageCode)\n }\n\n if (!foundTrack && textTracks.length > 0) {\n foundTrack = textTracks[textTracks.length - 1]\n }\n\n return foundTrack\n }\n\n while (attempts < maxAttempts) {\n try {\n if (attempts > 0) {\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n\n const assetData = await getAsset(client, assetId)\n const textTracks =\n assetData.data.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || []\n\n const foundTrack = findTrack(textTracks)\n\n if (!foundTrack) {\n attempts++\n continue\n }\n\n trackFound = true\n newTrack = foundTrack\n\n if (onTrackFound) {\n onTrackFound(foundTrack)\n }\n\n if (foundTrack.status === 'ready') {\n if (onTrackReady) {\n onTrackReady(foundTrack)\n }\n break\n }\n\n if (foundTrack.status === 'errored') {\n if (onTrackErrored) {\n onTrackErrored(foundTrack)\n }\n return {\n track: foundTrack,\n found: true,\n status: 'errored',\n }\n }\n } catch (error) {\n console.error('Failed to fetch updated asset:', error)\n }\n\n attempts++\n }\n\n if (!newTrack || !trackFound) {\n return {\n track: undefined,\n found: false,\n status: 'not-found',\n }\n }\n\n if (newTrack.status === 'preparing') {\n return {\n track: newTrack,\n found: true,\n status: 'preparing',\n }\n }\n\n return {\n track: newTrack,\n found: true,\n status: 'ready',\n }\n}\n\n/**\n * May throw a Promise. Call this with {@link tryWithSuspend} or rethrow the Promise\n */\nexport async function downloadVttFile(\n client: SanityClient,\n asset: VideoAssetDocument,\n track: MuxTextTrack,\n): Promise<void> {\n if (!track.id) {\n throw new Error('Track ID is missing')\n }\n\n if (track.status !== 'ready') {\n throw new Error(`Track is not ready yet. Status: ${track.status}`)\n }\n\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const playbackId = getPlaybackId(asset)\n if (!playbackId) {\n throw new Error('Playback ID is required')\n }\n\n const playbackPolicy = getPlaybackPolicy(asset)?.policy\n\n let downloadUrl = `https://stream.mux.com/${playbackId}/text/${track.id}.vtt`\n\n if (playbackPolicy === 'signed' || playbackPolicy === 'drm') {\n const token = generateJwt(client, playbackId, 'v')\n downloadUrl += `?token=${token}`\n }\n\n const response = await fetch(downloadUrl)\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`)\n }\n\n const blob = await response.blob()\n const blobUrl = URL.createObjectURL(blob)\n\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = `${asset.filename || 'captions'}-${track.language_code || 'en'}.vtt`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(blobUrl)\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {\n Autocomplete,\n Button,\n Card,\n Checkbox,\n Dialog,\n Flex,\n Label,\n Spinner,\n Stack,\n Text,\n TextInput,\n useToast,\n} from '@sanity/ui'\nimport LanguagesList from 'iso-639-1'\nimport {useId, useRef, useState} from 'react'\n\nimport {addTextTrackFromUrl, generateSubtitles, getAsset} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {extractErrorMessage, pollTrackStatus} from '../util/textTracks'\nimport {type MuxTextTrack, SUPPORTED_MUX_LANGUAGES, type VideoAssetDocument} from '../util/types'\n\nconst LANGUAGE_OPTIONS = LanguagesList.getAllCodes().map((code) => ({\n value: code,\n label: LanguagesList.getNativeName(code),\n}))\n\nconst MUX_LANGUAGE_OPTIONS = SUPPORTED_MUX_LANGUAGES.map((lang) => ({\n value: lang.code,\n label: lang.label,\n}))\n\nexport interface Props {\n asset: VideoAssetDocument\n onAdd: (track: MuxTextTrack) => void\n onClose: () => void\n}\n\nexport default function AddCaptionDialog({asset, onAdd, onClose}: Props) {\n const client = useClient()\n const toast = useToast()\n const dialogId = `AddCaptionDialog${useId()}`\n\n const [isAutogenerated, setIsAutogenerated] = useState(false)\n const [vttUrl, setVttUrl] = useState('')\n const [languageCode, setLanguageCode] = useState('')\n const [selectedLanguage, setSelectedLanguage] = useState<{value: string; label: string} | null>(\n null,\n )\n const [name, setName] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadVttFile = async (file: File): Promise<string> => {\n const assetDocument = await client.assets.upload('file', file, {\n filename: file.name,\n })\n return assetDocument.url\n }\n\n const refreshAssetData = async () => {\n if (!asset._id || !asset.assetId) return\n try {\n const latestAssetData = await getAsset(client, asset.assetId)\n const dataWithKeys = addKeysToMuxData(latestAssetData.data)\n await client\n .patch(asset._id)\n .set({data: dataWithKeys, status: latestAssetData.data.status})\n .commit({returnDocuments: false})\n } catch (refreshError) {\n console.error('Failed to refresh asset data:', refreshError)\n }\n }\n\n const handleAddTrackFromUrl = async () => {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const trimmedName = name.trim()\n const trimmedLanguageCode = languageCode.trim()\n\n let vttUrlToUse = vttUrl.trim()\n\n if (selectedFile) {\n try {\n vttUrlToUse = await uploadVttFile(selectedFile)\n } catch (uploadError) {\n toast.push({\n title: 'Failed to upload caption file',\n status: 'error',\n description: 'Could not upload the caption file to Sanity. Please try again.',\n })\n setIsSubmitting(false)\n throw uploadError\n }\n }\n\n await addTextTrackFromUrl(client, asset.assetId, vttUrlToUse, {\n language_code: trimmedLanguageCode,\n name: trimmedName,\n text_type: 'subtitles',\n })\n\n const result = await pollTrackStatus({\n client,\n assetId: asset.assetId,\n trackName: trimmedName,\n trackLanguageCode: trimmedLanguageCode,\n onTrackErrored: async (track) => {\n const errorMessage =\n track.error?.messages?.[0] ||\n track.error?.type ||\n 'The track failed to download from the provided URL'\n toast.push({\n title: 'Caption track failed',\n status: 'error',\n description: errorMessage,\n })\n await refreshAssetData()\n onAdd(track)\n onClose()\n },\n })\n\n if (!result.found || !result.track) {\n toast.push({\n title: 'Caption track may have been added',\n status: 'warning',\n description:\n 'The track was created but its status could not be determined. It may still be processing. Please refresh the page to see if it appears.',\n })\n onClose()\n return\n }\n\n if (result.status === 'errored') {\n return\n }\n\n if (result.status === 'preparing') {\n toast.push({\n title: 'Caption track is processing',\n status: 'info',\n description:\n 'The track was created and is being processed. It will appear in the list shortly.',\n })\n await refreshAssetData()\n onAdd(result.track)\n onClose()\n return\n }\n\n await refreshAssetData()\n toast.push({\n title: 'Caption track added',\n status: 'success',\n description: 'Caption track added successfully',\n })\n\n onAdd(result.track)\n onClose()\n }\n\n const handleGenerateSubtitles = async () => {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const assetData = await getAsset(client, asset.assetId)\n const audioTrack = assetData.data.tracks?.find((track) => track.type === 'audio')\n\n if (!audioTrack || !audioTrack.id) {\n toast.push({\n title: 'No audio track found',\n status: 'error',\n description:\n 'The asset does not have an audio track. Auto-generated subtitles require an audio track.',\n })\n throw new Error('No audio track found')\n }\n\n await generateSubtitles(client, asset.assetId, audioTrack.id, {\n language_code: languageCode.trim(),\n name: name.trim(),\n })\n\n const mockTrackId = `generating-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n const mockTrack: MuxTextTrack = {\n type: 'text',\n id: mockTrackId,\n text_type: 'subtitles',\n text_source: 'generated_live',\n language_code: languageCode.trim(),\n name: name.trim(),\n status: 'preparing',\n }\n\n toast.push({\n title: 'Generating subtitles',\n status: 'success',\n description: 'This may take a few minutes',\n })\n\n onAdd(mockTrack)\n onClose()\n }\n\n const handleSubmit = async () => {\n if (!isAutogenerated) {\n if (!selectedFile && !vttUrl.trim()) {\n toast.push({\n title: 'Caption file or URL required',\n status: 'error',\n description: 'Please select a VTT or SRT file or enter a caption file URL',\n })\n return\n }\n\n if (vttUrl.trim() && !selectedFile) {\n try {\n void new URL(vttUrl.trim())\n } catch {\n toast.push({\n title: 'Invalid URL',\n status: 'error',\n description:\n 'Please enter a valid URL (e.g., https://example.com/subtitles.vtt or subtitles.srt)',\n })\n return\n }\n }\n }\n\n if (!name.trim()) {\n toast.push({\n title: 'Audio name required',\n status: 'error',\n description: 'Please enter an audio name for this caption track',\n })\n return\n }\n\n if (!languageCode.trim()) {\n toast.push({\n title: 'Language code required',\n status: 'error',\n description: 'Please enter a language code (e.g., en, es, fr)',\n })\n return\n }\n\n setIsSubmitting(true)\n\n try {\n if (isAutogenerated) {\n await handleGenerateSubtitles()\n } else {\n await handleAddTrackFromUrl()\n }\n } catch (error) {\n toast.push({\n title: 'Failed to add caption track',\n status: 'error',\n description: extractErrorMessage(error, 'Failed to add caption track'),\n })\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return (\n <Dialog\n id={dialogId}\n header=\"Add Caption Track\"\n onClose={onClose}\n width={1}\n onClickOutside={onClose}\n >\n <Stack padding={4} space={4}>\n <Stack space={2}>\n <Flex align=\"center\" marginBottom={3}>\n <Checkbox\n id=\"autogenerated-checkbox\"\n style={{display: 'block'}}\n checked={isAutogenerated}\n onChange={(e) => {\n setIsAutogenerated(e.currentTarget.checked)\n if (e.currentTarget.checked) {\n setVttUrl('')\n }\n }}\n disabled={isSubmitting}\n />\n <Flex flex={1} paddingLeft={2}>\n <Text>\n <label htmlFor=\"autogenerated-checkbox\">Generate captions</label>\n </Text>\n </Flex>\n </Flex>\n {!isAutogenerated && (\n <Stack space={2}>\n <Card padding={3} marginBottom={2} tone=\"transparent\" border radius={2}>\n <Flex align=\"center\" justify=\"space-between\">\n <Text size={1} muted>\n {selectedFile ? `Selected: ${selectedFile.name}` : 'No file selected'}\n </Text>\n <Button\n icon={UploadIcon}\n text=\"Select File\"\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={() => fileInputRef.current?.click()}\n disabled={isSubmitting}\n />\n </Flex>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".vtt,text/vtt,.srt,application/x-subrip\"\n style={{display: 'none'}}\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0 && !isSubmitting) {\n setSelectedFile(e.target.files[0]!)\n setVttUrl('')\n }\n }}\n />\n </Card>\n <Text size={1} muted style={{textAlign: 'center'}}>\n Or enter the caption file URL\n </Text>\n <Stack space={2}>\n <Label as=\"label\" htmlFor=\"vtt-url\">\n Caption File URL (.vtt or .srt)\n </Label>\n <TextInput\n id=\"vtt-url\"\n placeholder=\"https://example.com/subtitles.vtt\"\n value={vttUrl}\n onChange={(e) => {\n setVttUrl(e.currentTarget.value)\n setSelectedFile(null)\n }}\n disabled={isSubmitting}\n />\n </Stack>\n </Stack>\n )}\n </Stack>\n\n <Stack space={2}>\n <Label as=\"label\" htmlFor=\"caption-name\">\n Audio name\n </Label>\n <Autocomplete\n id=\"caption-name\"\n value={selectedLanguage?.value || ''}\n onChange={(newValue) => {\n const options = isAutogenerated ? MUX_LANGUAGE_OPTIONS : LANGUAGE_OPTIONS\n const selected = options.find((opt) => opt.value === newValue)\n if (selected) {\n setSelectedLanguage(selected)\n setLanguageCode(selected.value)\n setName(selected.label)\n }\n }}\n options={isAutogenerated ? MUX_LANGUAGE_OPTIONS : LANGUAGE_OPTIONS}\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 (isAutogenerated ? MUX_LANGUAGE_OPTIONS : LANGUAGE_OPTIONS).find(\n (l) => l.value === value,\n )?.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 disabled={isSubmitting}\n />\n </Stack>\n\n <Stack space={2}>\n <Label as=\"label\" htmlFor=\"caption-language\">\n Language Code\n </Label>\n <TextInput\n id=\"caption-language\"\n placeholder=\"en-US\"\n value={languageCode}\n onChange={(e) => {\n setLanguageCode(e.currentTarget.value)\n if (selectedLanguage && selectedLanguage.value !== e.currentTarget.value) {\n setSelectedLanguage(null)\n if (!name || name === selectedLanguage.label) {\n setName('')\n }\n }\n }}\n disabled={isSubmitting}\n />\n </Stack>\n\n <Flex gap={2} justify=\"flex-end\" marginTop={2}>\n <Button text=\"Cancel\" mode=\"ghost\" onClick={onClose} disabled={isSubmitting} />\n <Button\n text=\"Add Caption Track\"\n tone=\"primary\"\n icon={\n isSubmitting ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginBottom: '-3px',\n width: '1em',\n height: '1em',\n marginRight: '-6px',\n }}\n />\n ) : (\n <UploadIcon />\n )\n }\n onClick={handleSubmit}\n disabled={isSubmitting}\n />\n </Flex>\n </Stack>\n </Dialog>\n )\n}\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {TranslateIcon} from '@sanity/icons/Translate'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {\n Autocomplete,\n Button,\n Card,\n Dialog,\n Flex,\n Label,\n Spinner,\n Stack,\n Text,\n TextInput,\n useToast,\n} from '@sanity/ui'\nimport LanguagesList from 'iso-639-1'\nimport {useEffect, useId, useRef, useState} from 'react'\n\nimport {addTextTrackFromUrl, deleteTextTrack, getAsset} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {generateJwt} from '../util/generateJwt'\nimport {getPlaybackId} from '../util/getPlaybackPolicy'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {downloadVttFile, extractErrorMessage, pollTrackStatus} from '../util/textTracks'\nimport type {MuxTextTrack, VideoAssetDocument} from '../util/types'\n\nconst LANGUAGE_OPTIONS = LanguagesList.getAllCodes().map((code) => ({\n value: code,\n label: LanguagesList.getNativeName(code),\n}))\n\nexport interface Props {\n asset: VideoAssetDocument\n track: MuxTextTrack\n onUpdate: (track: MuxTextTrack, oldTrackId?: string) => void\n onClose: () => void\n}\n\nexport default function EditCaptionDialog({asset, track, onUpdate, onClose}: Props) {\n const client = useClient()\n const toast = useToast()\n const dialogId = `EditCaptionDialog${useId()}`\n\n const isAutogenerated =\n track.text_source === 'generated_live' ||\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_vod'\n\n const [vttUrl, setVttUrl] = useState('')\n const [languageCode, setLanguageCode] = useState(track.language_code || '')\n const [selectedLanguage, setSelectedLanguage] = useState<{value: string; label: string} | null>(\n () => {\n const baseCode = track.language_code?.split('-')[0]\n const found = LANGUAGE_OPTIONS.find(\n (opt) => opt.value === track.language_code || opt.value === baseCode,\n )\n if (found) return found\n if (track.name) {\n const foundByName = LANGUAGE_OPTIONS.find((opt) => opt.label === track.name)\n if (foundByName) return foundByName\n }\n return null\n },\n )\n const [name, setName] = useState(track.name || '')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [downloading, setDownloading] = useState(false)\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n // oxlint-disable-next-line react/react-compiler\n setLanguageCode(track.language_code || '')\n setName(track.name || '')\n setVttUrl('')\n const baseCode = track.language_code?.split('-')[0]\n const foundByCode = LANGUAGE_OPTIONS.find(\n (opt) => opt.value === track.language_code || opt.value === baseCode,\n )\n const foundByName = track.name ? LANGUAGE_OPTIONS.find((opt) => opt.label === track.name) : null\n setSelectedLanguage(foundByCode || foundByName || null)\n }, [track, asset, client])\n\n const handleDownloadCurrentFile = async () => {\n setDownloading(true)\n try {\n await downloadVttFile(client, asset, track)\n } catch (error) {\n let errorMessage = 'Please try again'\n let title = 'Failed to download VTT file'\n\n if (error instanceof Error) {\n errorMessage = error.message\n if (error.message.includes('Track')) {\n title = 'Cannot download'\n }\n } else if (error === 'Track ID is missing' || error === 'Track is not ready yet') {\n errorMessage = error\n title = 'Cannot download'\n }\n\n toast.push({\n title,\n status: 'error',\n description: errorMessage,\n })\n } finally {\n setDownloading(false)\n }\n }\n\n const getCurrentFileName = () => {\n if (track.id && asset.filename) {\n return `${asset.filename}-${track.language_code || 'en'}.vtt`\n }\n return `captions-${track.language_code || 'en'}.vtt`\n }\n\n const uploadVttFile = async (file: File): Promise<string> => {\n const assetDocument = await client.assets.upload('file', file, {\n filename: file.name,\n })\n return assetDocument.url\n }\n\n const refreshAssetData = async () => {\n if (!asset._id || !asset.assetId) return\n try {\n const latestAssetData = await getAsset(client, asset.assetId)\n const dataWithKeys = addKeysToMuxData(latestAssetData.data)\n await client\n .patch(asset._id)\n .set({data: dataWithKeys, status: latestAssetData.data.status})\n .commit({returnDocuments: false})\n } catch (refreshError) {\n console.error('Failed to refresh asset data:', refreshError)\n }\n }\n\n const handleUpdateTrackWithNewUrl = async () => {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const trimmedName = name.trim()\n const trimmedLanguageCode = languageCode.trim()\n\n const oldTrackId = track.id\n\n try {\n await deleteTextTrack(client, asset.assetId, oldTrackId)\n } catch (deleteError) {\n toast.push({\n title: 'Failed to delete old track',\n status: 'error',\n description: 'Could not delete the old track. Please try again or delete it manually.',\n })\n setIsSubmitting(false)\n throw deleteError\n }\n\n let vttUrlToUse = vttUrl.trim()\n\n if (selectedFile) {\n try {\n vttUrlToUse = await uploadVttFile(selectedFile)\n } catch (uploadError) {\n toast.push({\n title: 'Failed to upload VTT file',\n status: 'error',\n description: 'Could not upload the VTT file to Sanity. Please try again.',\n })\n setIsSubmitting(false)\n throw uploadError\n }\n }\n\n try {\n await addTextTrackFromUrl(client, asset.assetId, vttUrlToUse, {\n language_code: trimmedLanguageCode,\n name: trimmedName,\n text_type: 'subtitles',\n })\n } catch (error: unknown) {\n toast.push({\n title: 'Failed to update caption track',\n status: 'error',\n description: extractErrorMessage(error, 'Failed to update caption track'),\n })\n setIsSubmitting(false)\n throw error\n }\n\n const result = await pollTrackStatus({\n client,\n assetId: asset.assetId,\n trackName: trimmedName,\n trackLanguageCode: trimmedLanguageCode,\n onTrackErrored: async (erroredTrack) => {\n const errorMessage =\n erroredTrack.error?.messages?.[0] ||\n erroredTrack.error?.type ||\n 'The track failed to download from the provided URL'\n toast.push({\n title: 'Caption track failed',\n status: 'error',\n description: errorMessage,\n })\n await refreshAssetData()\n onUpdate(erroredTrack, oldTrackId)\n setIsSubmitting(false)\n },\n })\n\n if (!result.found || !result.track) {\n toast.push({\n title: 'Caption track may have been updated',\n status: 'warning',\n description:\n 'The track was updated but its status could not be determined. It may still be processing. Please refresh the page to see if it appears.',\n })\n setIsSubmitting(false)\n return\n }\n\n if (result.status === 'errored') {\n return\n }\n\n await refreshAssetData()\n\n if (result.status === 'preparing') {\n toast.push({\n title: 'Caption track is processing',\n status: 'info',\n description:\n 'The track was updated and is being processed. It will appear in the list shortly.',\n })\n } else {\n toast.push({\n title: 'Caption track updated',\n status: 'success',\n description: 'Caption track updated successfully',\n })\n }\n\n onUpdate(result.track, oldTrackId)\n setIsSubmitting(false)\n }\n\n const handleSubmit = async () => {\n if (!name.trim()) {\n toast.push({\n title: 'Audio name required',\n status: 'error',\n description: 'Please enter an audio name for this caption track',\n })\n return\n }\n\n if (!languageCode.trim()) {\n toast.push({\n title: 'Language code required',\n status: 'error',\n description: 'Please enter a language code (e.g., en, es, fr)',\n })\n return\n }\n\n setIsSubmitting(true)\n\n try {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const originalVttUrl = (() => {\n if (isAutogenerated || !track.id) return ''\n const playbackId = getPlaybackId(asset)\n if (!playbackId) return ''\n let url = `https://stream.mux.com/${playbackId}/text/${track.id}.vtt`\n if (getPlaybackPolicy(asset)?.policy === 'signed') {\n const token = generateJwt(client, playbackId, 'v')\n url += `?token=${token}`\n }\n return url\n })()\n\n const urlChanged =\n selectedFile !== null || (vttUrl.trim() && vttUrl.trim() !== originalVttUrl)\n\n if (!urlChanged) {\n toast.push({\n title: 'No changes',\n status: 'info',\n description:\n 'Please provide a new VTT file or URL using the \"Replace\" button or URL field to update the track.',\n })\n setIsSubmitting(false)\n return\n }\n\n if (urlChanged) {\n if (!selectedFile && vttUrl.trim()) {\n try {\n void new URL(vttUrl.trim())\n } catch {\n toast.push({\n title: 'Invalid URL',\n status: 'error',\n description: 'Please enter a valid URL (e.g., https://example.com/subtitles.vtt)',\n })\n setIsSubmitting(false)\n return\n }\n }\n\n if (!selectedFile && !vttUrl.trim()) {\n toast.push({\n title: 'VTT file or URL required',\n status: 'error',\n description: 'Please select a VTT file or enter a VTT file URL',\n })\n setIsSubmitting(false)\n return\n }\n\n await handleUpdateTrackWithNewUrl()\n }\n\n onClose()\n } catch (error) {\n toast.push({\n title: 'Failed to update caption track',\n status: 'error',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return (\n <Dialog\n id={dialogId}\n header=\"Edit Caption Track\"\n onClose={onClose}\n width={1}\n onClickOutside={onClose}\n >\n <Stack padding={4} space={4}>\n <Stack space={2}>\n <Card padding={3} marginBottom={2} tone=\"transparent\" border radius={2}>\n <Flex align=\"center\" justify=\"space-between\">\n <Text>{getCurrentFileName()}</Text>\n <Flex gap={2}>\n {track.status !== 'errored' && (\n <Button\n icon={\n downloading ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <DownloadIcon />\n )\n }\n text=\"Download\"\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={handleDownloadCurrentFile}\n disabled={downloading || isSubmitting}\n />\n )}\n <Button\n icon={UploadIcon}\n text=\"Replace\"\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={() => fileInputRef.current?.click()}\n disabled={isSubmitting}\n />\n </Flex>\n </Flex>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".vtt,text/vtt\"\n style={{display: 'none'}}\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0 && !isSubmitting) {\n setSelectedFile(e.target.files[0]!)\n setVttUrl('')\n }\n }}\n />\n {selectedFile && (\n <Text size={1} muted style={{marginTop: 8}}>\n Selected: {selectedFile.name}\n </Text>\n )}\n </Card>\n <Stack space={2}>\n <Label as=\"label\" htmlFor=\"vtt-url\">\n VTT File URL\n </Label>\n <TextInput\n id=\"vtt-url\"\n placeholder=\"https://example.com/subtitles.vtt\"\n value={vttUrl}\n onChange={(e) => {\n setVttUrl(e.currentTarget.value)\n setSelectedFile(null)\n }}\n disabled={isSubmitting}\n />\n <Text size={1} muted>\n Add a URL to replace the existing VTT file with a new one\n </Text>\n </Stack>\n </Stack>\n\n <Stack space={2}>\n <Label as=\"label\" htmlFor=\"caption-name\">\n Audio name\n </Label>\n <Autocomplete\n id=\"caption-name\"\n value={selectedLanguage?.value || ''}\n onChange={(newValue) => {\n const selected = LANGUAGE_OPTIONS.find((opt) => opt.value === newValue)\n if (selected) {\n setSelectedLanguage(selected)\n setLanguageCode(selected.value)\n setName(selected.label)\n }\n }}\n options={LANGUAGE_OPTIONS}\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) => LANGUAGE_OPTIONS.find((l) => l.value === value)?.label || value}\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 disabled={isSubmitting}\n />\n </Stack>\n\n <Stack space={2}>\n <Label as=\"label\" htmlFor=\"caption-language\">\n Language Code\n </Label>\n <TextInput\n id=\"caption-language\"\n placeholder=\"en-US\"\n value={languageCode}\n onChange={(e) => {\n setLanguageCode(e.currentTarget.value)\n if (selectedLanguage && selectedLanguage.value !== e.currentTarget.value) {\n setSelectedLanguage(null)\n if (!name || name === selectedLanguage.label) {\n setName('')\n }\n }\n }}\n disabled={isSubmitting}\n />\n </Stack>\n\n <Flex gap={2} justify=\"flex-end\" marginTop={2}>\n <Button text=\"Cancel\" mode=\"ghost\" onClick={onClose} disabled={isSubmitting} />\n <Button\n text=\"Update Caption Track\"\n tone=\"primary\"\n icon={\n isSubmitting ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginBottom: '-3px',\n width: '1em',\n height: '1em',\n marginRight: '-6px',\n }}\n />\n ) : (\n UploadIcon\n )\n }\n onClick={handleSubmit}\n disabled={isSubmitting}\n />\n </Flex>\n </Stack>\n </Dialog>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {DownloadIcon} from '@sanity/icons/Download'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Card, Dialog, Flex, Heading, Spinner, Stack, Text, useToast} from '@sanity/ui'\nimport {useEffect, useId, useMemo, useState} from 'react'\n\nimport {deleteTextTrack} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport {useResyncAsset} from '../hooks/useResyncAsset'\nimport {downloadVttFile} from '../util/textTracks'\nimport type {MuxTextTrack, VideoAssetDocument} from '../util/types'\nimport AddCaptionDialog from './AddCaptionDialog'\nimport EditCaptionDialog from './EditCaptionDialog'\n\ninterface TrackCardProps {\n track: MuxTextTrack\n iconOnly: boolean\n downloadingTrackId: string | null\n deletingTrackId: string | null\n trackToEdit: MuxTextTrack | null\n getTrackSourceLabel: (track: MuxTextTrack) => string\n handleDownload: (track: MuxTextTrack) => void\n setTrackToEdit: (track: MuxTextTrack) => void\n setTrackToDelete: (track: MuxTextTrack) => void\n}\n\nfunction TrackCard({\n track,\n iconOnly,\n downloadingTrackId,\n deletingTrackId,\n trackToEdit,\n getTrackSourceLabel,\n handleDownload,\n setTrackToEdit,\n setTrackToDelete,\n}: TrackCardProps) {\n const isDisabled = (action: 'download' | 'edit' | 'delete') => {\n if (action === 'download') {\n return (\n downloadingTrackId !== null || deletingTrackId === track.id || trackToEdit?.id === track.id\n )\n }\n if (action === 'edit') {\n return (\n downloadingTrackId === track.id ||\n deletingTrackId === track.id ||\n trackToEdit?.id === track.id\n )\n }\n return (\n downloadingTrackId === track.id || deletingTrackId !== null || trackToEdit?.id === track.id\n )\n }\n\n const renderActionButtons = () => {\n if (track.status === 'preparing') {\n return (\n <Flex align=\"center\" gap={2}>\n <Spinner\n muted\n style={{\n width: '0.75em',\n height: '0.75em',\n verticalAlign: 'middle',\n display: 'inline-block',\n marginBottom: '-2px',\n }}\n />\n <Text size={1} muted>\n Processing...\n </Text>\n </Flex>\n )\n }\n\n return (\n <Flex gap={2}>\n {track.status !== 'errored' && (\n <Button\n icon={\n downloadingTrackId === track.id ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <DownloadIcon />\n )\n }\n text={iconOnly ? undefined : 'Download'}\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={() => handleDownload(track)}\n disabled={isDisabled('download')}\n title=\"Download\"\n />\n )}\n <Button\n icon={<EditIcon />}\n text={iconOnly ? undefined : 'Edit'}\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n disabled={isDisabled('edit')}\n onClick={() => setTrackToEdit(track)}\n title=\"Edit\"\n />\n <Button\n icon={\n deletingTrackId === track.id ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <TrashIcon />\n )\n }\n text={iconOnly ? undefined : 'Delete'}\n mode=\"ghost\"\n tone=\"critical\"\n fontSize={1}\n padding={2}\n disabled={isDisabled('delete')}\n onClick={() => setTrackToDelete(track)}\n title=\"Delete\"\n />\n </Flex>\n )\n }\n\n return (\n <Card\n padding={3}\n radius={2}\n tone={track.status === 'errored' ? 'caution' : 'transparent'}\n border\n >\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Stack space={2} flex={1}>\n <Flex align=\"center\" gap={2}>\n <Text weight=\"semibold\">{track.name || 'Untitled'}</Text>\n <Text size={1} muted>\n ({getTrackSourceLabel(track)})\n </Text>\n {track.status === 'errored' && (\n <ErrorOutlineIcon\n style={{color: 'var(--card-critical-color)'}}\n aria-label=\"Error\"\n fontSize={20}\n />\n )}\n </Flex>\n {track.language_code && (\n <Text size={1} muted>\n Language: {track.language_code}\n </Text>\n )}\n {track.status === 'errored' && track.error && (\n <Text size={1} style={{color: 'var(--card-critical-color)'}}>\n {track.error.messages?.[0] || track.error.type || 'Failed to process track'}\n </Text>\n )}\n </Stack>\n {renderActionButtons()}\n </Flex>\n </Card>\n )\n}\n\ninterface TextTracksManagerProps {\n asset: VideoAssetDocument\n iconOnly?: boolean\n tracks?: MuxTextTrack[]\n collapseTracks?: boolean\n}\n\nexport default function TextTracksManager({\n asset,\n iconOnly = false,\n tracks: propTracks,\n collapseTracks = false,\n}: TextTracksManagerProps) {\n const client = useClient()\n const toast = useToast()\n const dialogId = `DeleteCaptionDialog${useId()}`\n const {resyncAsset} = useResyncAsset()\n const [downloadingTrackId, setDownloadingTrackId] = useState<string | null>(null)\n const [deletingTrackId, setDeletingTrackId] = useState<string | null>(null)\n const [addedTracks, setAddedTracks] = useState<MuxTextTrack[]>([])\n const [updatedTracks, setUpdatedTracks] = useState<Map<string, MuxTextTrack>>(new Map())\n const [trackActivityOrder, setTrackActivityOrder] = useState<Map<string, number>>(new Map())\n const [autogeneratedTrackIds, setAutogeneratedTrackIds] = useState<Set<string>>(new Set())\n const [trackToDelete, setTrackToDelete] = useState<MuxTextTrack | null>(null)\n const [trackToEdit, setTrackToEdit] = useState<MuxTextTrack | null>(null)\n const [showAddDialog, setShowAddDialog] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n\n const MAX_VISIBLE_TRACKS = 4\n\n const realTracks: MuxTextTrack[] = propTracks\n ? propTracks\n : asset.data?.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || []\n\n const activeTracks = realTracks.filter(\n (track) =>\n track.id &&\n (track.status === 'ready' || track.status === 'preparing' || track.status === 'errored'),\n )\n\n const allTracks = useMemo(() => {\n const tracksWithUpdates = activeTracks.map((track) => {\n const updated = updatedTracks.get(track.id)\n return updated || track\n })\n\n const isMockTrackReplaced = (mockTrack: MuxTextTrack, realTracksList: MuxTextTrack[]) => {\n if (!mockTrack.id || !mockTrack.id.startsWith('generating-')) {\n return false\n }\n return realTracksList.some((realTrack) => {\n const nameMatches = realTrack.name === mockTrack.name\n const languageMatches = realTrack.language_code === mockTrack.language_code\n if (!nameMatches || !languageMatches) {\n return false\n }\n if (realTrack.status === 'ready') {\n const isGenerated =\n realTrack.text_source === 'generated_live' ||\n realTrack.text_source === 'generated_live_final' ||\n realTrack.text_source === 'generated_vod'\n return isGenerated\n }\n if (realTrack.status === 'preparing') {\n return true\n }\n return false\n })\n }\n\n const isTrackAlreadyInRealTracks = (\n addedTrack: MuxTextTrack,\n realTracksList: MuxTextTrack[],\n ) => {\n if (!addedTrack.id) return false\n if (addedTrack.id.startsWith('generating-')) {\n return isMockTrackReplaced(addedTrack, realTracksList)\n }\n return realTracksList.some((realTrack) => realTrack.id === addedTrack.id)\n }\n\n const tracksToKeep = addedTracks.filter((addedTrack) => {\n if (addedTrack.id && addedTrack.id.startsWith('generating-')) {\n return !isMockTrackReplaced(addedTrack, tracksWithUpdates)\n }\n return !isTrackAlreadyInRealTracks(addedTrack, tracksWithUpdates)\n })\n\n return [...tracksWithUpdates, ...tracksToKeep]\n }, [activeTracks, addedTracks, updatedTracks])\n\n useEffect(() => {\n const newAutogeneratedIds = new Set<string>()\n\n activeTracks.forEach((track) => {\n if (\n track.id &&\n (track.text_source === 'generated_live' ||\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_vod')\n ) {\n newAutogeneratedIds.add(track.id)\n }\n })\n\n addedTracks.forEach((mockTrack) => {\n if (mockTrack.id && mockTrack.id.startsWith('generating-')) {\n const realTrack = activeTracks.find((rt) => {\n const nameMatches = rt.name === mockTrack.name\n const languageMatches = rt.language_code === mockTrack.language_code\n return nameMatches && languageMatches\n })\n if (realTrack?.id) {\n newAutogeneratedIds.add(realTrack.id)\n }\n }\n })\n\n // oxlint-disable-next-line react/react-compiler\n setAutogeneratedTrackIds((prev) => {\n let hasNew = false\n const updated = new Set(prev)\n newAutogeneratedIds.forEach((id) => {\n if (!prev.has(id)) {\n updated.add(id)\n hasNew = true\n }\n })\n return hasNew ? updated : prev\n })\n }, [activeTracks, addedTracks])\n\n useEffect(() => {\n const preparingTracks = allTracks.filter((track) => track.status === 'preparing')\n if (preparingTracks.length === 0 || !asset.assetId || !asset._id) {\n return undefined\n }\n\n const interval = setInterval(async () => {\n try {\n const muxData = await resyncAsset(asset)\n if (!muxData) return\n\n const fetchedTracks =\n muxData.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || []\n\n const isMockTrackReplaced = (\n mockTrack: MuxTextTrack,\n fetchedTracksList: MuxTextTrack[],\n ) => {\n if (!mockTrack.id || !mockTrack.id.startsWith('generating-')) {\n return false\n }\n return fetchedTracksList.some((realTrack) => {\n const nameMatches = realTrack.name === mockTrack.name\n const languageMatches = realTrack.language_code === mockTrack.language_code\n if (!nameMatches || !languageMatches) {\n return false\n }\n if (realTrack.status === 'ready') {\n const isGenerated =\n realTrack.text_source === 'generated_live' ||\n realTrack.text_source === 'generated_live_final' ||\n realTrack.text_source === 'generated_vod'\n return isGenerated\n }\n if (realTrack.status === 'preparing') {\n return true\n }\n return false\n })\n }\n\n const newAutogeneratedIds = new Set<string>()\n fetchedTracks.forEach((track) => {\n if (\n track.id &&\n (track.text_source === 'generated_live' ||\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_vod')\n ) {\n newAutogeneratedIds.add(track.id)\n }\n })\n\n const findMatchingRealTrack = (mockTrack: MuxTextTrack, tracksList: MuxTextTrack[]) => {\n return tracksList.find((rt) => {\n const nameMatches = rt.name === mockTrack.name\n const languageMatches = rt.language_code === mockTrack.language_code\n return nameMatches && languageMatches\n })\n }\n\n setAddedTracks((prev) => {\n return prev.filter((mockTrack) => {\n if (mockTrack.id && mockTrack.id.startsWith('generating-')) {\n const replaced = isMockTrackReplaced(mockTrack, fetchedTracks)\n if (replaced) {\n const realTrack = findMatchingRealTrack(mockTrack, fetchedTracks)\n if (realTrack?.id) {\n newAutogeneratedIds.add(realTrack.id)\n setTrackActivityOrder((prevOrder) => {\n const mockOrder = prevOrder.get(mockTrack.id)\n if (mockOrder) {\n const newMap = new Map(prevOrder)\n newMap.set(realTrack.id, mockOrder)\n return newMap\n }\n return prevOrder\n })\n }\n }\n return !replaced\n }\n return true\n })\n })\n\n if (newAutogeneratedIds.size > 0) {\n setAutogeneratedTrackIds((prevIds) => {\n const updated = new Set(prevIds)\n newAutogeneratedIds.forEach((id) => updated.add(id))\n return updated\n })\n }\n } catch (error) {\n console.error('Failed to refresh asset data:', error)\n }\n }, 3000) // Poll every 3 seconds\n\n return () => clearInterval(interval)\n }, [allTracks, asset, resyncAsset])\n\n const visibleTracks = allTracks\n .filter(\n (track) =>\n track.status === 'ready' || track.status === 'preparing' || track.status === 'errored',\n )\n .sort((a, b) => {\n const orderA = trackActivityOrder.get(a.id) || 0\n const orderB = trackActivityOrder.get(b.id) || 0\n\n if (orderA > 0 && orderB > 0) {\n return orderB - orderA\n }\n\n if (orderA > 0) return -1\n if (orderB > 0) return 1\n\n const aIsPreparing = a.status === 'preparing'\n const bIsPreparing = b.status === 'preparing'\n if (aIsPreparing && !bIsPreparing) return -1\n if (!aIsPreparing && bIsPreparing) return 1\n\n const aIsAutogenerated =\n (a.id && a.id.startsWith('generating-')) || (a.id && autogeneratedTrackIds.has(a.id))\n const bIsAutogenerated =\n (b.id && b.id.startsWith('generating-')) || (b.id && autogeneratedTrackIds.has(b.id))\n if (aIsAutogenerated && !bIsAutogenerated) return -1\n if (!aIsAutogenerated && bIsAutogenerated) return 1\n\n return 0\n })\n\n const handleDownload = async (track: MuxTextTrack) => {\n if (!track.id) return\n\n setDownloadingTrackId(track.id)\n try {\n await downloadVttFile(client, asset, track)\n } catch (error) {\n toast.push({\n title: 'Failed to download VTT file',\n status: 'error',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setDownloadingTrackId(null)\n }\n }\n\n const confirmDelete = async () => {\n if (!trackToDelete || !trackToDelete.id) return\n\n const track = trackToDelete\n setTrackToDelete(null)\n setDeletingTrackId(track.id)\n try {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n await deleteTextTrack(client, asset.assetId, track.id)\n\n // Refresh asset data after deletion\n await resyncAsset(asset)\n\n toast.push({\n title: 'Successfully deleted caption track',\n status: 'success',\n })\n\n setAddedTracks((prev) => prev.filter((t) => t.id !== track.id))\n setUpdatedTracks((prev) => {\n const newMap = new Map(prev)\n newMap.delete(track.id)\n return newMap\n })\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.delete(track.id)\n return newMap\n })\n setAutogeneratedTrackIds((prev) => {\n const updated = new Set(prev)\n updated.delete(track.id)\n return updated\n })\n } catch (error) {\n toast.push({\n title: 'Failed to delete caption track',\n status: 'error',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setDeletingTrackId(null)\n }\n }\n\n const handleAddTrack = (track: MuxTextTrack) => {\n setAddedTracks((prev) => [...prev, track])\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.set(track.id, prev.size + 1)\n return newMap\n })\n setShowAddDialog(false)\n }\n\n const handleUpdateTrack = async (updatedTrack: MuxTextTrack, oldTrackId?: string) => {\n if (oldTrackId) {\n setAddedTracks((prev) => prev.filter((t) => t.id !== oldTrackId))\n setUpdatedTracks((prev) => {\n const newMap = new Map(prev)\n newMap.delete(oldTrackId)\n return newMap\n })\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.delete(oldTrackId)\n return newMap\n })\n setAutogeneratedTrackIds((prev) => {\n const updated = new Set(prev)\n updated.delete(oldTrackId)\n return updated\n })\n }\n\n const isAddedTrack = addedTracks.some((t) => t.id === updatedTrack.id)\n\n if (isAddedTrack) {\n setAddedTracks((prev) => prev.map((t) => (t.id === updatedTrack.id ? updatedTrack : t)))\n } else {\n setUpdatedTracks((prev) => {\n const newMap = new Map(prev)\n newMap.set(updatedTrack.id, updatedTrack)\n return newMap\n })\n }\n\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.set(updatedTrack.id, prev.size + 1)\n return newMap\n })\n\n setTrackToEdit(null)\n\n // Refresh asset data after update\n await resyncAsset(asset)\n }\n\n const getTrackSourceLabel = (track: MuxTextTrack) => {\n if (track.id && track.id.startsWith('generating-')) {\n return 'Auto-generated'\n }\n if (track.id && autogeneratedTrackIds.has(track.id)) {\n return 'Auto-generated'\n }\n if (\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_live' ||\n track.text_source === 'generated_vod'\n ) {\n return 'Auto-generated'\n }\n if (track.text_source === 'uploaded') {\n return 'Uploaded'\n }\n return 'Custom'\n }\n\n if (visibleTracks.length === 0 && !showAddDialog) {\n return (\n <Stack space={3}>\n <Flex justify=\"flex-end\">\n <Button\n icon={AddIcon}\n text=\"Add Caption\"\n tone=\"primary\"\n onClick={() => setShowAddDialog(true)}\n />\n </Flex>\n <Card padding={4} radius={2} tone=\"transparent\" border>\n <Text size={1} muted>\n No captions available. Add captions when uploading a video or add them manually.\n </Text>\n </Card>\n {showAddDialog && (\n <AddCaptionDialog\n asset={asset}\n onAdd={handleAddTrack}\n onClose={() => setShowAddDialog(false)}\n />\n )}\n </Stack>\n )\n }\n\n const displayedTracks =\n collapseTracks && !isExpanded ? visibleTracks.slice(0, MAX_VISIBLE_TRACKS) : visibleTracks\n const hasMoreTracks = collapseTracks && visibleTracks.length > MAX_VISIBLE_TRACKS\n\n return (\n <Stack space={3}>\n <Flex justify=\"flex-end\">\n <Button\n icon={AddIcon}\n text=\"Add Caption\"\n tone=\"primary\"\n onClick={() => setShowAddDialog(true)}\n />\n </Flex>\n\n {displayedTracks.map((track) => (\n <TrackCard\n key={track.id}\n track={track}\n iconOnly={iconOnly}\n downloadingTrackId={downloadingTrackId}\n deletingTrackId={deletingTrackId}\n trackToEdit={trackToEdit}\n getTrackSourceLabel={getTrackSourceLabel}\n handleDownload={handleDownload}\n setTrackToEdit={setTrackToEdit}\n setTrackToDelete={setTrackToDelete}\n />\n ))}\n\n {hasMoreTracks && (\n <Flex justify=\"center\">\n <Button\n icon={isExpanded ? ChevronUpIcon : ChevronDownIcon}\n text={\n isExpanded ? 'Show less' : `Show ${visibleTracks.length - MAX_VISIBLE_TRACKS} more`\n }\n mode=\"ghost\"\n tone=\"primary\"\n onClick={() => setIsExpanded(!isExpanded)}\n />\n </Flex>\n )}\n\n {trackToDelete && (\n <Dialog\n animate\n id={dialogId}\n header=\"Delete track\"\n onClose={() => setTrackToDelete(null)}\n onClickOutside={() => setTrackToDelete(null)}\n width={1}\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 <Heading size={2}>\n Are you sure you want to delete "\n {trackToDelete.name || trackToDelete.language_code || 'Untitled'}"?\n </Heading>\n <Text size={2}>This action is irreversible</Text>\n <Stack space={4} marginY={4}>\n <Box>\n <Button\n icon={\n deletingTrackId === trackToDelete.id ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <TrashIcon />\n )\n }\n fontSize={2}\n padding={3}\n text=\"Delete track\"\n tone=\"critical\"\n onClick={confirmDelete}\n disabled={deletingTrackId !== null}\n />\n </Box>\n </Stack>\n </Stack>\n </Card>\n </Dialog>\n )}\n\n {showAddDialog && (\n <AddCaptionDialog\n asset={asset}\n onAdd={handleAddTrack}\n onClose={() => setShowAddDialog(false)}\n />\n )}\n\n {trackToEdit && (\n <EditCaptionDialog\n asset={asset}\n track={trackToEdit}\n onUpdate={handleUpdateTrack}\n onClose={() => setTrackToEdit(null)}\n />\n )}\n </Stack>\n )\n}\n","import {createContext, useContext, useMemo} 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 const value = useMemo(() => ({dialogState, setDialogState}), [dialogState, setDialogState])\n return <DialogStateContext.Provider value={value}>{children}</DialogStateContext.Provider>\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 type {MuxPlaybackId, MuxVideoUrl} from './types'\n\ninterface VideoSrcOptions {\n muxPlaybackId: MuxPlaybackId\n client: SanityClient\n}\n\n/**\n * May throw a Promise. Call this with {@link tryWithSuspend} or rethrow the Promise\n */\nexport function getVideoSrc({client, muxPlaybackId}: VideoSrcOptions): MuxVideoUrl {\n const searchParams = new URLSearchParams()\n\n if (muxPlaybackId.policy === 'signed' || muxPlaybackId.policy === 'drm') {\n const token = generateJwt(client, muxPlaybackId.id, 'v')\n searchParams.set('token', token)\n }\n\n return `https://stream.mux.com/${muxPlaybackId.id}.m3u8?${searchParams}`\n}\n","import {Dialog, Stack} from '@sanity/ui'\nimport {useId} from 'react'\n\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport type {VideoAssetDocument} from '../util/types'\nimport TextTracksManager from './TextTracksManager'\n\nexport interface Props {\n asset: VideoAssetDocument\n}\n\nexport default function CaptionsDialog({asset}: Props) {\n const {setDialogState} = useDialogStateContext()\n const dialogId = `CaptionsDialog${useId()}`\n\n return (\n <Dialog id={dialogId} header=\"Edit Captions\" onClose={() => setDialogState(false)} width={1}>\n <Stack padding={4}>\n <TextTracksManager asset={asset} />\n </Stack>\n </Dialog>\n )\n}\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 {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(() => setDialogState(false))\n .catch(setSaveThumbnailError)\n .finally(() => setSaving(false))\n }\n const width = 300 * getDevicePixelRatio({maxDpr: 2})\n\n if (saveThumbnailError) {\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 type {SVGProps} from 'react'\n\nexport function AudioIcon(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 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 )\n}\n","import {Box, Dialog, Stack} from '@sanity/ui'\nimport {useId} from 'react'\n\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport {getMezzanineStatus} from '../hooks/useMezzanine'\nimport {DIALOGS_Z_INDEX} from '../util/constants'\nimport type {VideoAssetDocument} from '../util/types'\nimport Mezzanine from './Mezzanine'\nimport MezzanineExplanation from './MezzanineExplanation'\n\nexport interface Props {\n asset: VideoAssetDocument\n onClose?: () => void\n}\n\n/**\n * Player actions menu entry point: the explanation in the dialog body (until the\n * file is enabled) with the {@link Mezzanine} card below for the action/status.\n */\nexport default function MezzanineDialog({asset, onClose}: Props) {\n const {setDialogState} = useDialogStateContext()\n const dialogId = `MezzanineDialog${useId()}`\n\n const closing = () => {\n onClose?.()\n setDialogState(false)\n }\n\n const status = getMezzanineStatus(asset)\n const showExplanation = status !== 'preparing' && status !== 'ready'\n\n return (\n <Dialog\n id={dialogId}\n header=\"Mezzanine file\"\n onClose={closing}\n zOffset={DIALOGS_Z_INDEX}\n width={1}\n >\n <Box padding={4}>\n <Stack space={4}>\n {showExplanation && <MezzanineExplanation />}\n <Mezzanine asset={asset} withExplanation={false} />\n </Stack>\n </Box>\n </Dialog>\n )\n}\n","import {type MuxPlayerProps, type MuxPlayerRefAttributes} from '@mux/mux-player-react'\nimport MuxPlayer from '@mux/mux-player-react/lazy'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Card, Text} from '@sanity/ui'\nimport {type PropsWithChildren, Suspense, useMemo, useRef, useState} from 'react'\n\nimport {PLUGIN_VERSION} from '../constants'\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport {useClient} from '../hooks/useClient'\nimport {AUDIO_ASPECT_RATIO, MIN_ASPECT_RATIO} from '../util/constants'\nimport {generateJwt} from '../util/generateJwt'\nimport {getPlaybackId} from '../util/getPlaybackPolicy'\nimport {getPlaybackPolicyById} from '../util/getPlaybackPolicy'\nimport {getPosterSrc} from '../util/getPosterSrc'\nimport {getVideoSrc} from '../util/getVideoSrc'\nimport {tryWithSuspend} from '../util/tryWithSuspend'\nimport type {VideoAssetDocument} from '../util/types'\nimport CaptionsDialog from './CaptionsDialog'\nimport EditThumbnailDialog from './EditThumbnailDialog'\nimport {AudioIcon} from './icons/Audio'\nimport MezzanineDialog from './MezzanineDialog'\n\nexport default function VideoPlayer({\n asset,\n thumbnailWidth = 250,\n children,\n hlsConfig,\n ...props\n}: PropsWithChildren<\n {\n asset: VideoAssetDocument\n thumbnailWidth?: number\n forceAspectRatio?: number\n hlsConfig?: MuxPlayerProps['_hlsConfig']\n } & Partial<Pick<MuxPlayerProps, 'autoPlay'>>\n>) {\n const client = useClient()\n const {dialogState} = useDialogStateContext()\n\n const isAudio = assetIsAudio(asset)\n const muxPlayer = useRef<MuxPlayerRefAttributes>(null)\n const playerContainerRef = useRef<HTMLDivElement>(null)\n const [error, setError] = useState<Error>()\n\n /* Playback ID that will be used to play the video */\n const playbackId = useMemo(() => {\n try {\n return getPlaybackId(asset, ['public', 'signed', 'drm'])\n } catch (e) {\n // oxlint-disable-next-line react/react-compiler\n setError(new TypeError('Asset has no playback ID', {cause: e}))\n return undefined\n }\n }, [asset])\n\n const muxPlaybackId = useMemo(() => {\n if (!playbackId) return undefined\n return getPlaybackPolicyById(asset, playbackId)\n }, [asset, playbackId])\n\n const src = useMemo(() => {\n if (!playbackId) return undefined\n if (!muxPlaybackId) return undefined\n return tryWithSuspend(\n () => getVideoSrc({muxPlaybackId, client}),\n (e: Error) => {\n setError(e)\n return undefined\n },\n )\n }, [muxPlaybackId, playbackId, client])\n\n const poster = useMemo(() => {\n return tryWithSuspend(\n () => getPosterSrc({asset, client, width: thumbnailWidth}),\n (e: Error) => {\n setError(e)\n return undefined\n },\n )\n }, [asset, client, thumbnailWidth])\n\n const signedToken = useMemo(() => {\n try {\n const url = new URL(src!)\n return url.searchParams.get('token')\n } catch {\n return undefined\n }\n }, [src])\n const drmToken = useMemo(() => {\n if (!playbackId) return undefined\n if (muxPlaybackId?.policy !== 'drm') return undefined\n\n return tryWithSuspend(\n () => generateJwt(client, playbackId, 'd'),\n (e: Error) => {\n setError(e)\n return undefined\n },\n )\n }, [client, muxPlaybackId?.policy, playbackId])\n const tokens:\n | Partial<{\n playback?: string\n thumbnail?: string\n storyboard?: string\n drm?: string\n }>\n | undefined = useMemo(() => {\n try {\n const partialTokens: {\n playback?: string\n thumbnail?: string\n storyboard?: string\n drm?: string\n } = {\n playback: undefined,\n thumbnail: undefined,\n storyboard: undefined,\n drm: undefined,\n }\n\n if (signedToken) {\n partialTokens.playback = signedToken\n partialTokens.thumbnail = signedToken\n partialTokens.storyboard = signedToken\n }\n\n if (drmToken) {\n partialTokens.drm = drmToken\n }\n\n return {...partialTokens}\n } catch {\n return undefined\n }\n }, [signedToken, drmToken])\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 /* We use Suspense here because `generateJwt` and related functions use suspend()\n under the hood */\n return (\n <>\n <Card\n ref={playerContainerRef}\n tone=\"transparent\"\n style={{\n aspectRatio: aspectRatio,\n position: 'relative',\n ...(isAudio && {display: 'flex', alignItems: 'flex-end'}),\n }}\n >\n {src && poster && (\n <>\n {isAudio && (\n <AudioIcon\n style={{\n padding: '0.5em',\n width: '2.2em',\n height: '2.2em',\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 1,\n }}\n />\n )}\n <Suspense fallback={null}>\n <MuxPlayer\n poster={isAudio ? undefined : poster}\n ref={muxPlayer}\n {...props}\n playsInline\n playbackId={playbackId}\n tokens={tokens}\n preload=\"metadata\"\n crossOrigin=\"anonymous\"\n metadata={{\n player_name: 'Sanity Admin Dashboard',\n player_version: PLUGIN_VERSION,\n page_type: 'Preview Player',\n }}\n audio={isAudio}\n _hlsConfig={hlsConfig}\n style={{\n ...(!isAudio && {height: '100%'}),\n width: '100%',\n display: 'block',\n objectFit: 'contain',\n ...(isAudio && {alignSelf: 'end'}),\n }}\n />\n {children}\n </Suspense>\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\n asset={asset}\n // oxlint-disable-next-line react/react-compiler\n currentTime={muxPlayer?.current?.currentTime}\n />\n )}\n {dialogState === 'edit-captions' && <CaptionsDialog asset={asset} />}\n {dialogState === 'mezzanine' && <MezzanineDialog asset={asset} />}\n </>\n )\n}\n\nexport function assetIsAudio(asset: VideoAssetDocument) {\n return asset.data?.max_stored_resolution === 'Audio only'\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/MissingSchemaType.tsx\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\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/Edit'\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/Publish'\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 {\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 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),\n [props.documentPreviewStore, schemaType, value._id],\n )\n const {snapshot, original, isLoading} = useObservable(observable, {\n isLoading: true,\n snapshot: null,\n original: null,\n })\n\n const status = isLoading ? null : (\n <Inline space={4}>\n {presence && presence.length > 0 && <DocumentPreviewPresence presence={presence} />}\n <PublishedStatus document={original} />\n <DraftStatus document={snapshot} />\n </Inline>\n )\n\n return (\n <SanityDefaultPreview\n {...(getPreviewValueWithFallback({snapshot, original, fallback: {title}}) 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/Document'\nimport {useMemo} from 'react'\nimport type {CollatedHit, SanityDocument, SchemaType} from 'sanity'\nimport {PreviewCard, useDocumentPresence, useDocumentPreviewStore, useSchema} from 'sanity'\nimport {IntentLink} from 'sanity/router'\n\nimport {MissingSchemaType} from './MissingSchemaType'\nimport {PaneItemPreview} from './PaneItemPreview'\n\ninterface DocumentPreviewProps {\n schemaType?: SchemaType\n documentPair: CollatedHit<SanityDocument>\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 */\nfunction 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\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 children = useMemo(() => {\n if (!doc) return null\n\n if (!schemaType || !hasSchemaType) {\n return <MissingSchemaType value={doc} />\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={IntentLink}\n intent=\"edit\"\n params={{id: props.documentPair.id}}\n data-as=\"a\"\n data-ui=\"PaneItem\"\n padding={2}\n radius={2}\n tone=\"inherit\"\n >\n {children}\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 {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}> = (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 documentPair={documentPair} schemaType={schemaType} />\n </Box>\n </Card>\n )\n })}\n </Container>\n )\n}\n\nexport default VideoReferences\n","import {TrashIcon} from '@sanity/icons/Trash'\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 {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 succeededDeleting,\n}: {\n asset: VideoAssetDocument\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 // oxlint-disable-next-line react/react-compiler\n setState(references?.length ? 'cantDelete' : 'confirm')\n }, [state, references, referencesLoading])\n\n async function confirmDelete() {\n if (state !== 'confirm') return\n\n setState('processing_deletion')\n const worked = await deleteAsset({client, asset, deleteOnMux})\n if (worked === true) {\n toast.push({title: 'Successfully deleted video', status: 'success'})\n succeededDeleting()\n } else if (worked === 'failed-mux') {\n toast.push({\n title: 'Deleted video in Sanity',\n description: \"But it wasn't deleted in Mux\",\n status: 'warning',\n })\n succeededDeleting()\n } else {\n toast.push({title: 'Failed deleting video', status: 'error'})\n\n setState('error_deleting')\n }\n }\n\n return (\n <Dialog\n animate\n header={'Delete video'}\n zOffset={DIALOGS_Z_INDEX}\n id=\"deleting-video-details-dialog\"\n onClose={cancelDelete}\n onClickOutside={cancelDelete}\n width={1}\n position=\"fixed\"\n >\n <Card\n padding={3}\n style={{\n minHeight: '150px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Stack space={3}>\n {state === 'checkingReferences' && (\n <>\n <Heading size={2}>Checking if video can be deleted</Heading>\n <SpinnerBox />\n </>\n )}\n {state === 'cantDelete' && (\n <>\n <Heading size={2}>Video can't be deleted</Heading>\n <Text size={2} style={{marginBottom: '2rem'}}>\n There are {references?.length} document{references && references.length > 0 && 's'}{' '}\n pointing to this video. Remove their references to this file or delete them before\n proceeding.\n </Text>\n <VideoReferences references={references} isLoaded={!referencesLoading} />\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, type DocumentStore, type 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 type {MuxTextTrack, 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 playback_ids: doc.data?.playback_ids,\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 text_tracks:\n doc.data?.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || [],\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 {useResyncAsset} from '../../hooks/useResyncAsset'\nimport getVideoMetadata from '../../util/getVideoMetadata'\nimport {type VideoAssetDocument} from '../../util/types'\n\ntype VideoDetailsState = 'idle' | 'saving' | 'deleting' | 'closing' | 'resyncing'\n\nexport interface VideoDetailsProps {\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<VideoDetailsState>('idle')\n\n const {resyncAsset, isResyncing} = useResyncAsset({showToast: true})\n\n async function handleResync() {\n if (state !== 'idle') return\n setState('resyncing')\n await resyncAsset(props.asset)\n setState('idle')\n }\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 handleResync,\n isResyncing,\n }\n}\n","import {CalendarIcon} from '@sanity/icons/Calendar'\nimport {CheckmarkIcon} from '@sanity/icons/Checkmark'\nimport {ClockIcon} from '@sanity/icons/Clock'\nimport {CropIcon} from '@sanity/icons/Crop'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {RevertIcon} from '@sanity/icons/Revert'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {TagIcon} from '@sanity/icons/Tag'\nimport {TrashIcon} from '@sanity/icons/Trash'\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 {useEffect, useRef, useState} from 'react'\n\nimport {DIALOGS_Z_INDEX} from '../../util/constants'\nimport type {MuxPlaybackId, MuxTextTrack, PlaybackPolicy} from '../../util/types'\nimport FormField from '../FormField'\nimport IconInfo from '../IconInfo'\nimport {ResolutionIcon} from '../icons/Resolution'\nimport {StopWatchIcon} from '../icons/StopWatch'\nimport Mezzanine from '../Mezzanine'\nimport TextTracksManager from '../TextTracksManager'\nimport VideoPlayer from '../VideoPlayer'\nimport DeleteDialog from './DeleteDialog'\nimport useVideoDetails, {type 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 handleResync,\n isResyncing,\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 = 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 <Flex gap={2}>\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 || isResyncing}\n />\n <Button\n icon={SyncIcon}\n fontSize={2}\n padding={3}\n mode=\"bleed\"\n text=\"Resync\"\n tone=\"primary\"\n onClick={handleResync}\n disabled={isSaving || isResyncing}\n iconRight={isResyncing && Spinner}\n />\n </Flex>\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 || isResyncing}\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 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 {tab === 'details' && (\n <>\n <TextTracksManager\n asset={props.asset}\n iconOnly\n collapseTracks\n tracks={\n displayInfo?.text_tracks ||\n props.asset.data?.tracks?.filter(\n (track): track is MuxTextTrack => track.type === 'text',\n ) ||\n []\n }\n />\n <Mezzanine asset={props.asset} />\n </>\n )}\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 <PlaybackIds playback_ids={displayInfo.playback_ids} />\n </Stack>\n </Stack>\n </TabPanel>\n <TabPanel\n aria-labelledby=\"references-tab\"\n id=\"references-panel\"\n hidden={tab !== 'references'}\n >\n <VideoReferences references={references} isLoaded={!referencesLoading} />\n </TabPanel>\n </Stack>\n </Flex>\n </Card>\n </Dialog>\n )\n}\n\nconst PlaybackIds = ({playback_ids}: {playback_ids?: MuxPlaybackId[]}) => {\n if (playback_ids) {\n return playback_ids.map((entry) => (\n <IconInfo\n key={entry.id}\n text={`Playback ID [${policyToText(entry.policy)}]: ${entry.id}`}\n icon={TagIcon}\n size={2}\n />\n ))\n }\n return <IconInfo text={'No Playback ID'} icon={TagIcon} size={2} />\n}\n\nconst policyToText = (policy: PlaybackPolicy) => {\n switch (policy) {\n case 'drm':\n return 'DRM'\n case 'signed':\n return 'Signed'\n case 'public':\n return 'Public'\n default:\n return policy\n }\n}\nexport default VideoDetails\n","import {CalendarIcon} from '@sanity/icons/Calendar'\nimport {ClockIcon} from '@sanity/icons/Clock'\nimport {TagIcon} from '@sanity/icons/Tag'\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} from '@sanity/icons/Checkmark'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {LockIcon} from '@sanity/icons/Lock'\nimport {PlayIcon} from '@sanity/icons/Play'\nimport {Button, Card, Stack, Text, Tooltip} from '@sanity/ui'\nimport {useCallback, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {DRMWarningDialog, useDrmPlaybackWarningContext} from '../context/DrmPlaybackWarningContext'\nimport {THUMBNAIL_ASPECT_RATIO} from '../util/constants'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {type VideoAssetDocument} from '../util/types'\nimport IconInfo from './IconInfo'\nimport {AudioIcon} from './icons/Audio'\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\ntype RenderState = 'render-video' | 'pre-render-warn' | false\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<RenderState>(false)\n const select = useCallback(() => onSelect?.(asset), [onSelect, asset])\n const edit = useCallback(() => onEdit?.(asset), [onEdit, asset])\n const {hasShownWarning} = useDrmPlaybackWarningContext()\n\n if (!asset) {\n return null\n }\n\n const playbackPolicy = getPlaybackPolicy(asset)\n const onClickPlay = () => {\n if (playbackPolicy?.policy === 'drm' && !hasShownWarning) {\n setRenderVideo('pre-render-warn')\n } else {\n setRenderVideo('render-video')\n }\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?.policy === '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: 11,\n }}\n padding={2}\n border\n >\n <Text muted size={1}>\n <LockIcon />\n </Text>\n </Card>\n </Tooltip>\n )}\n {playbackPolicy?.policy === 'drm' && (\n <Tooltip\n animate\n content={\n <Card padding={2} radius={2}>\n <IconInfo icon={LockIcon} text=\"DRM 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: '0.25rem',\n position: 'absolute',\n left: '1em',\n top: '1em',\n zIndex: 11,\n }}\n padding={2}\n border\n >\n <Text muted size={1} weight=\"semibold\" style={{color: 'var(--card-icon-color)'}}>\n DRM\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 === 'pre-render-warn' && (\n <DRMWarningDialog\n onClose={() => {\n setRenderVideo('render-video')\n }}\n />\n )}\n {renderVideo === 'render-video' ? (\n <VideoPlayer asset={asset} autoPlay forceAspectRatio={THUMBNAIL_ASPECT_RATIO} />\n ) : (\n <PlayButton onClick={onClickPlay}>\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 <AudioIcon width=\"3em\" height=\"3em\" />\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/Search'\nimport {Card, Flex, Grid, Inline, Label, Stack, Text, TextInput} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\n\nimport {DrmPlaybackWarningContextProvider} from '../context/DrmPlaybackWarningContext'\nimport useAssets from '../hooks/useAssets'\nimport type {PluginConfig, VideoAssetDocument} from '../util/types'\nimport ConfigureApi from './ConfigureApi'\nimport ImportVideosFromMux from './ImportVideosFromMux'\nimport PageSelector from './PageSelector'\nimport ResyncMetadata from './ResyncMetadata'\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 config: PluginConfig\n onSelect?: (asset: VideoAssetDocument) => void\n}\n\nexport default function VideosBrowser({onSelect, config}: VideosBrowserProps) {\n const {assets, isLoading, searchQuery, setSearchQuery, setSort, sort} = useAssets()\n const [page, setPage] = useState<number>(0)\n const pageLimit = 20\n const pageTotal = Math.floor(assets.length / pageLimit) + 1\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 pageStart = page * pageLimit\n const pageEnd = pageStart + pageLimit\n\n const placement = onSelect ? 'input' : 'tool'\n return (\n <DrmPlaybackWarningContextProvider config={config}>\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 <PageSelector page={page} setPage={setPage} total={pageTotal} />\n </Flex>\n {placement === 'tool' && (\n <Inline space={2}>\n <ImportVideosFromMux />\n <ResyncMetadata />\n <ConfigureApi />\n </Inline>\n )}\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.slice(pageStart, pageEnd).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 closeDialog={() => setEditedAsset(null)} asset={freshEditedAsset} />\n )}\n </DrmPlaybackWarningContextProvider>\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> = (config) => {\n return <VideosBrowser config={config} />\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 {useCurrentUser} from 'sanity'\n\nimport {type PluginConfig} from '../util/types'\n\nexport const useAccessControl = (config: PluginConfig) => {\n const user = useCurrentUser()\n\n const hasConfigAccess =\n !config?.allowedRolesForConfiguration?.length ||\n user?.roles?.some((role) => config.allowedRolesForConfiguration.includes(role.name))\n\n return {hasConfigAccess}\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","import {useMemo, useRef} from 'react'\nimport {useDataset, useProjectId} from 'sanity'\nimport useSWR from 'swr'\n\nimport {useClient} from '../hooks/useClient'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\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 isPreparingStaticRenditions = useMemo(() => {\n // Legacy: If static_renditions has a status field, it was created with mp4_support (deprecated)\n // We don't process this old format, just return false\n // Note: 'disabled' status is valid in the new format when no renditions were requested\n if (\n asset?.data?.static_renditions?.status &&\n asset?.data?.static_renditions?.status !== 'disabled'\n ) {\n return false\n }\n\n const files = asset?.data?.static_renditions?.files\n if (!files || files.length === 0) {\n return false\n }\n return files.some((file) => file.status === 'preparing')\n }, [asset?.data?.static_renditions?.status, asset?.data?.static_renditions?.files])\n\n const shouldFetch = useMemo(\n () => !!asset?.assetId && (asset?.status === 'preparing' || isPreparingStaticRenditions),\n [asset?.assetId, asset?.status, isPreparingStaticRenditions],\n )\n // Only log the first failure of a streak so a persistent error doesn't flood\n // the console on every interval.\n const errorLoggedRef = useRef(false)\n return useSWR(\n shouldFetch ? `/${projectId}/addons/mux/assets/${dataset}/data/${asset?.assetId}` : null,\n async () => {\n try {\n const {data} = await client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/data/${asset!.assetId}`,\n withCredentials: true,\n method: 'GET',\n query: PLUGIN_VERSION_QUERY,\n })\n if (!asset?._id || !data) return\n await client\n .patch(asset._id)\n .set({status: data.status, data: addKeysToMuxData(data)})\n .commit({returnDocuments: false})\n errorLoggedRef.current = false\n } catch (error) {\n // Input re-throws `poll.error`, so a background polling failure would\n // crash the whole field. Swallow it instead.\n if (!errorLoggedRef.current) {\n errorLoggedRef.current = true\n console.error('[sanity-plugin-mux-input] Mux polling failed', {\n assetId: asset?.assetId,\n documentId: asset?._id,\n error,\n })\n }\n }\n },\n {refreshInterval: 2000, refreshWhenHidden: true, dedupingInterval: 1000},\n )\n}\n","/* eslint-disable no-console */\nimport {Button, Card, Flex, Grid, Heading, Inline, Text, useToast} from '@sanity/ui'\nimport {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 // oxlint-disable-next-line no-unstable-nested-components\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/Plug'\nimport {Button, Card, Flex, Grid, Heading, Inline, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {useAccessControl} from '../hooks/useAccessControl'\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {type PluginConfig} from '../util/types'\nimport MuxLogo from './MuxLogo'\n\ninterface OnboardProps {\n setDialogState: SetDialogState\n config: PluginConfig\n}\n\nexport default function Onboard(props: OnboardProps) {\n const {setDialogState} = props\n const handleOpen = useCallback(() => setDialogState('secrets'), [setDialogState])\n const {hasConfigAccess} = useAccessControl(props.config)\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 {hasConfigAccess ? (\n <Button mode=\"ghost\" icon={PlugIcon} text=\"Configure API\" onClick={handleOpen} />\n ) : (\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"critical\">\n <Text>\n You do not have access to configure the Mux API. Please contact your\n administrator.\n </Text>\n </Card>\n )}\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","/**\n * Format Google Drive share links as Google Drive export links.\n * Supported formats:\n * - https://drive.google.com/uc?id=<ID>...\n * - https://drive.google.com/open?id=<ID>...\n * - https://drive.google.com/file/d/<ID>...\n * - https://drive.google.com/folder/<ID>...\n *\n * @param url Google Drive share link to format.\n * @returns Google Drive export link (URL passthrough if not share link).\n */\nexport function formatDriveShareLink(url: string): string {\n // Export link formatter.\n const formatExportLink = (id: string) => {\n return `https://drive.google.com/uc?export=download&id=${id}`\n }\n\n // URL formatting.\n try {\n // Parse URL.\n const trimmed = url.trim()\n const parsed = new URL(trimmed)\n\n // Enforce strict host name.\n if (parsed.hostname !== 'drive.google.com') {\n throw new Error('URL is not from Google Drive.')\n }\n\n // Look for ID in search parameters.\n const id = parsed.searchParams.get('id') || ''\n if (id.length) {\n return formatExportLink(id)\n }\n\n // Look for ID in path name.\n const path = parsed.pathname.split('/') || []\n\n // Path is /file/d/<ID>...\n if (path.includes('file') && path.includes('d')) {\n const index =\n path.findIndex((value: string) => {\n return value === 'd'\n }) + 1\n const fileId = path.at(index) || ''\n return formatExportLink(fileId)\n }\n\n // Path is /folder/<ID>...\n if (path.includes('folders')) {\n const index =\n path.findIndex((value: string) => {\n return value === 'folders'\n }) + 1\n const folderId = path.at(index) || ''\n return formatExportLink(folderId)\n }\n\n // URL not recognized.\n throw new Error('URL was not recognized.')\n } catch {\n // URL passthrough by default.\n return url\n }\n}\n","/**\n * Rounds the numeric part of a px string to the nearest integer.\n * Returns undefined if the value is not a valid px string or not a finite number.\n * Avoids sending 0px (and JS -0); snaps to ±1 instead.\n */\nexport function roundPxString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n if (!trimmed.endsWith('px')) return undefined\n const n = Number(trimmed.slice(0, -2))\n if (!Number.isFinite(n)) return undefined\n let rounded = Math.round(n)\n // Avoid sending 0px (and JS -0); keep sign when negative.\n if (rounded === 0) rounded = n < 0 ? -1 : 1\n return `${rounded}px`\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 {formatDriveShareLink} from '../util/formatDriveShareLink'\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\nimport {roundPxString} from '../util/roundPxString'\nimport type {MuxAsset, MuxNewAssetSettings, WatermarkConfig} from '../util/types'\nimport {getAsset} from './assets'\nimport {testSecretsObservable} from './secrets'\n\nfunction sanitizeOverlaySettingsInPlace(settings: MuxNewAssetSettings) {\n const inputs = settings.input\n if (!inputs) return\n for (const input of inputs) {\n const overlay = (input as {overlay_settings?: Record<string, unknown>}).overlay_settings\n if (!overlay) continue\n\n const hm = roundPxString(overlay['horizontal_margin'])\n const vm = roundPxString(overlay['vertical_margin'])\n const w = roundPxString(overlay['width'])\n\n if (hm) overlay['horizontal_margin'] = hm\n if (vm) overlay['vertical_margin'] = vm\n if (w) overlay['width'] = w\n }\n}\n\nfunction sanitizePxStringsInJson(json: string): string {\n return json.replace(/\"(-?\\d+(?:\\.\\d+)?)px\"/g, (_match, num) => {\n const n = Number(num)\n if (!Number.isFinite(n)) return _match\n let rounded = Math.round(n)\n if (rounded === 0) rounded = n < 0 ? -1 : 1\n return `\"${rounded}px\"`\n })\n}\n\nfunction 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 query: PLUGIN_VERSION_QUERY,\n })\n}\n\nexport function uploadUrl({\n url,\n settings,\n client,\n}: {\n url: string\n settings: MuxNewAssetSettings\n client: SanityClient\n watermark?: WatermarkConfig\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 sanitizeOverlaySettingsInPlace(muxBody)\n\n const query: Record<string, string> = {\n muxBody: sanitizePxStringsInJson(JSON.stringify(muxBody)),\n }\n const filename = validUrl.split('/').slice(-1)[0]\n if (filename) {\n query['filename'] = filename\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: {...query, ...PLUGIN_VERSION_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 watermark,\n}: {\n settings: MuxNewAssetSettings\n client: SanityClient\n file: File\n watermark?: WatermarkConfig\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 sanitizeOverlaySettingsInPlace(body)\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 query: PLUGIN_VERSION_QUERY,\n }),\n ).pipe(\n mergeMap((result) => {\n return createUpChunkObservable(uuid, result.upload.url, file).pipe(\n // @TODO type the observable events\n mergeMap((event) => {\n if (event.type !== 'success') {\n return of(event)\n }\n return from(updateAssetDocumentFromUpload(client, uuid, watermark)).pipe(\n mergeMap((doc) => of({...event, asset: doc})),\n )\n }),\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 static_renditions?: {resolution: string}[]\n passthrough: string\n playback_policies: ['public' | 'signed' | 'drm']\n }\n status: string\n timeout: number\n }\n}\nfunction 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 query: PLUGIN_VERSION_QUERY,\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(\n client: SanityClient,\n uuid: string,\n _watermark?: WatermarkConfig,\n) {\n let upload: UploadResponse\n let asset: {data: MuxAsset}\n try {\n upload = await pollUpload(client, uuid)\n } catch (err) {\n return Promise.reject(err)\n }\n try {\n asset = await getAsset(client, upload.data.asset_id)\n } catch (err) {\n return Promise.reject(err)\n }\n\n const doc = {\n _id: uuid,\n _type: 'mux.videoAsset',\n status: asset.data.status,\n data: asset.data,\n assetId: asset.data.id,\n playbackId: asset.data.playback_ids[0]?.id,\n uploadId: upload.data.id,\n }\n return client.createOrReplace(doc).then(() => {\n return doc\n })\n}\n\nfunction testFile(file: File) {\n if (typeof window !== 'undefined' && file instanceof window.File) {\n const fileOptions = optionsFromFile({}, file)\n return of(fileOptions)\n }\n return throwError(new Error('Invalid file'))\n}\n\nfunction testUrl(url: string): Observable<string> {\n const error = new Error('Invalid URL')\n if (typeof url !== 'string') {\n return throwError(error)\n }\n let formattedUrl = url.trim()\n formattedUrl = formatDriveShareLink(formattedUrl)\n let parsed\n try {\n parsed = new URL(formattedUrl)\n } catch {\n return throwError(error)\n }\n if (parsed && !parsed.protocol.match(/http:|https:/)) {\n return throwError(error)\n }\n return of(formattedUrl)\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 {ServerError} from '@sanity/client'\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/**\n * We consider a server error one with status code 5XX.\n * Used mainly to handle unknown Proxy issues.\n */\nexport function isServerError(error: Error): error is ServerError {\n return (\n 'statusCode' in error &&\n typeof error.statusCode === 'number' &&\n 500 <= error.statusCode &&\n error.statusCode <= 600\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 {\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, PluginConfig, 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 config: PluginConfig\n}\n\nexport default function SelectAssets({\n asset: selectedAsset,\n onChange,\n setDialogState,\n config,\n}: 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} config={config} />\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 config,\n}: Pick<SelectAssetProps, 'onChange' | 'asset' | 'config'> & {\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\n config={config}\n asset={asset}\n onChange={onChange}\n setDialogState={setDialogState}\n />\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 void deleteAssetOnMux(client, asset.assetId)\n }\n if (asset._id) {\n void client.delete(asset._id)\n }\n }, [asset, client, onChange])\n}\n","import {styled} from 'styled-components'\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","// 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\nconst CardWrapper = styled(Card)`\n min-height: 82px;\n box-sizing: border-box;\n`\n\nconst FlexWrapper = styled(Flex)`\n text-overflow: ellipsis;\n overflow: hidden;\n`\n\nconst LeftSection = styled(Stack)`\n position: relative;\n width: 60%;\n`\n\nconst 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 // Disable cancel button when upload is 90% or more complete\n // to prevent inconsistency between Mux and Sanity\n const isCancelDisabled = progress >= 90\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 disabled={isCancelDisabled}\n />\n ) : null}\n </FlexWrapper>\n </CardWrapper>\n )\n}\n","import {Card, Text} from '@sanity/ui'\nimport {useEffect, useMemo, useRef} from 'react'\n\nimport {useCancelUpload} from '../hooks/useCancelUpload'\nimport type {MuxInputProps, PluginConfig, 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 config?: PluginConfig\n}\n\nconst Player = ({asset, buttons, readOnly, onChange, config}: 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 // oxlint-disable-next-line react/react-compiler\n const isPreparingStaticRenditions = useMemo<boolean>(() => {\n // Legacy: If static_renditions has a status field, it was created with mp4_support (deprecated)\n // We don't process this old format, just return false\n // Note: 'disabled' status is valid in the new format when no renditions were requested\n if (\n asset?.data?.static_renditions?.status &&\n asset?.data?.static_renditions?.status !== 'disabled'\n ) {\n return false\n }\n\n // Check if any file in static_renditions is still preparing\n const files = asset?.data?.static_renditions?.files\n if (!files || files.length === 0) {\n return false\n }\n return files.some((file) => file.status === 'preparing')\n }, [asset?.data?.static_renditions?.status, asset?.data?.static_renditions?.files])\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 // @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} hlsConfig={config?.hlsConfig}>\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, type ButtonProps, Flex, Text} from '@sanity/ui'\nimport {isValidElement, useId, useCallback} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport {FileButton} from './FileInputMenuItem.styled'\n\nexport interface FileInputMenuItemProps extends Omit<ButtonProps, 'onSelect'> {\n accept?: string\n capture?: 'user' | 'environment'\n multiple?: boolean\n onSelect?: (files: File[]) => void\n disabled?: boolean\n}\n\nexport function FileInputMenuItem(\n props: FileInputMenuItemProps &\n Omit<React.HTMLProps<HTMLButtonElement>, 'as' | 'ref' | 'type' | 'value' | 'onSelect'> & {\n ref?: React.Ref<HTMLInputElement>\n },\n) {\n const {\n icon: Icon,\n id: idProp,\n accept,\n capture,\n fontSize,\n multiple,\n onSelect,\n space = 3,\n textAlign,\n text,\n disabled,\n ref,\n ...rest\n } = props\n const idHook = useId()\n const id = idProp || idHook\n\n const handleChange = 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) && <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={ref}>\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 {DownloadIcon} from '@sanity/icons/Download'\nimport {EllipsisHorizontalIcon} from '@sanity/icons/EllipsisHorizontal'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {LockIcon} from '@sanity/icons/Lock'\nimport {PlugIcon} from '@sanity/icons/Plug'\nimport {ResetIcon} from '@sanity/icons/Reset'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {TranslateIcon} from '@sanity/icons/Translate'\nimport {UploadIcon} from '@sanity/icons/Upload'\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 {useAccessControl} from '../hooks/useAccessControl'\nimport {type DialogState, type SetDialogState} from '../hooks/useDialogState'\nimport {useResyncAsset} from '../hooks/useResyncAsset'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport type {MuxInputProps, PluginConfig, 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 config: PluginConfig\n accept: string\n },\n) {\n const {asset, readOnly, dialogState, setDialogState, onChange, onSelect, accept} = props\n const [open, setOpen] = useState(false)\n const [menuElement, setMenuRef] = useState<HTMLDivElement | null>(null)\n const isSigned = useMemo(() => getPlaybackPolicy(asset)?.policy === 'signed', [asset])\n const {hasConfigAccess} = useAccessControl(props.config)\n const {resyncAsset, isResyncing} = useResyncAsset({showToast: true})\n\n const onReset = useCallback(() => onChange(PatchEvent.from(unset([]))), [onChange])\n\n const handleResync = useCallback(async () => {\n setOpen(false)\n await resyncAsset(asset)\n }, [resyncAsset, asset])\n\n useEffect(() => {\n if (open && dialogState) {\n // oxlint-disable-next-line react/react-compiler\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={accept}\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 <>\n <MenuItem\n icon={ImageIcon}\n text=\"Thumbnail\"\n onClick={() => setDialogState('edit-thumbnail')}\n />\n <MenuItem\n icon={TranslateIcon}\n text=\"Captions\"\n onClick={() => setDialogState('edit-captions')}\n />\n <MenuItem\n icon={SyncIcon}\n text=\"Resync from Mux\"\n onClick={handleResync}\n disabled={readOnly || isResyncing}\n />\n </>\n )}\n <MenuDivider />\n <MenuItem\n icon={DownloadIcon}\n text=\"Mezzanine\"\n onClick={() => setDialogState('mezzanine')}\n />\n <MenuDivider />\n {hasConfigAccess && (\n <>\n <MenuItem\n icon={PlugIcon}\n text=\"Configure API\"\n onClick={() => setDialogState('secrets')}\n />\n <MenuDivider />\n </>\n )}\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","import {useEffect, useState} from 'react'\n\nimport {type StagedUpload} from '../components/Uploader'\n\nexport function useFetchFileSize(stagedUpload: StagedUpload, maxFileSize?: number) {\n const [fileSize, setFileSize] = useState<number | null>(null)\n const [isLoadingFileSize, setIsLoadingFileSize] = useState(false)\n const [canSkipFileSizeValidation, setCanSkipFileSizeValidation] = useState(false)\n\n useEffect(() => {\n // Fetch URL Upload file size\n if (stagedUpload.type === 'url') {\n // oxlint-disable-next-line react/react-compiler\n setIsLoadingFileSize(false)\n setCanSkipFileSizeValidation(false)\n setFileSize(null)\n const url = stagedUpload.url\n\n // Get file size from URL\n const fetchFileSize = async () => {\n setIsLoadingFileSize(true)\n try {\n const response = await fetch(url, {method: 'HEAD'})\n const contentLength = response.headers.get('content-length')\n const newFileSize = contentLength ? parseInt(contentLength, 10) : null\n\n setIsLoadingFileSize(false)\n if (newFileSize) {\n setFileSize(newFileSize)\n }\n if (newFileSize === null && maxFileSize !== undefined) {\n // Size unknown but size limit is configured - skip file size validation\n setCanSkipFileSizeValidation(true)\n }\n } catch {\n console.warn('Could not validate file size from URL')\n // Skip validation of file size, but still validate duration\n setCanSkipFileSizeValidation(true)\n setIsLoadingFileSize(false)\n }\n }\n\n void fetchFileSize()\n }\n if (stagedUpload.type === 'file') {\n setFileSize(stagedUpload.files[0]!.size)\n }\n }, [maxFileSize, stagedUpload, stagedUpload.type])\n\n return {\n fileSize,\n isLoadingFileSize,\n canSkipFileSizeValidation,\n }\n}\n","import {useEffect, useState} from 'react'\n\nimport {type StagedUpload} from '../components/Uploader'\n\nexport interface VideoAssetMetadata {\n width?: number\n height?: number\n isAudioOnly?: boolean\n duration?: number\n size?: number\n aspectRatio?: number\n}\n\nexport function useMediaMetadata(stagedUpload: StagedUpload) {\n const [videoAssetMetadata, setVideoAssetMetadata] = useState<VideoAssetMetadata | null>(null)\n const [isLoadingMetadata, setIsLoadingMetadata] = useState(false)\n useEffect(() => {\n let videoSrc = null\n // Validate file uploads\n if (stagedUpload.type === 'file') {\n const file = stagedUpload.files[0]\n videoSrc = URL.createObjectURL(file!)\n }\n\n // Validate URL uploads\n if (stagedUpload.type === 'url') {\n videoSrc = stagedUpload.url\n }\n\n // oxlint-disable-next-line react/react-compiler\n setVideoAssetMetadata((old) => ({\n ...old,\n duration: undefined,\n width: undefined,\n height: undefined,\n }))\n\n if (!videoSrc) return () => null\n\n setIsLoadingMetadata(true)\n const videoElement = document.createElement('video')\n videoElement.preload = 'metadata'\n\n const metadataListeners = [\n () => {\n setIsLoadingMetadata(false)\n },\n () => {\n const duration = videoElement.duration\n const width = videoElement.videoWidth\n const height = videoElement.videoHeight\n const isAudioOnly = width <= 0 && height <= 0\n const aspectRatio = width / height\n setVideoAssetMetadata((old) => {\n return {\n ...old,\n duration: duration,\n width: width,\n height: height,\n isAudioOnly: isAudioOnly,\n aspectRatio: aspectRatio,\n }\n })\n },\n ]\n\n const cleanupVideo = (videoEl: HTMLVideoElement) => {\n const currentVideoSrc = videoEl?.src\n if (videoEl) {\n metadataListeners.forEach((listener) =>\n videoEl.removeEventListener('loadedmetadata', listener),\n )\n videoEl.onerror = null\n videoEl.src = ''\n videoEl.load()\n }\n if (currentVideoSrc?.startsWith('blob:')) {\n URL.revokeObjectURL(currentVideoSrc)\n }\n }\n metadataListeners.push(() => setTimeout(() => cleanupVideo(videoElement), 0))\n\n videoElement.onerror = () => {\n setIsLoadingMetadata(false)\n console.warn('Could not read video metadata for validation')\n cleanupVideo(videoElement)\n }\n\n metadataListeners.forEach((listener) =>\n videoElement.addEventListener('loadedmetadata', listener),\n )\n videoElement.src = videoSrc\n\n return () => {\n cleanupVideo(videoElement)\n }\n }, [stagedUpload.type, stagedUpload])\n\n return {\n videoAssetMetadata,\n setVideoAssetMetadata,\n isLoadingMetadata,\n }\n}\n","import {roundPxString} from './roundPxString'\nimport type {MuxOverlaySettings, WatermarkConfig} from './types'\n\n/**\n * Converts a draggable watermark position (x, y percentages) to Mux's overlay_settings format.\n *\n * @param watermark - The watermark configuration with position, size, and opacity\n * @returns Mux overlay_settings object\n * @see {@link https://www.mux.com/docs/guides/add-watermarks-to-your-videos}\n */\nexport function convertWatermarkToMuxOverlay(\n watermark: WatermarkConfig,\n options?: {\n /**\n * Video aspect ratio (width / height). Needed for correct vertical positioning,\n * especially on vertical videos.\n */\n videoAspectRatio?: number\n /**\n * Unit to emit for margins/width when generating overlay_settings from Canvas mode.\n * - 'px' will generate pixel strings according to Mux's scaling rules:\n * values are applied as if the video were scaled to 1920x1080 (horizontal)\n * or 1080x1920 (vertical).\n * - '%' preserves existing behavior.\n */\n units?: '%' | 'px'\n },\n): MuxOverlaySettings | null {\n if (!watermark.enabled || !watermark.imageUrl) {\n return null\n }\n\n const size = watermark.size || 20\n const opacity = watermark.opacity ?? 0.7\n\n /**\n * Convert a percentage to whole-pixel string, using Mux's base dimensions:\n * - Horizontal video: 1920x1080\n * - Vertical video: 1080x1920\n */\n const toPxString = (valuePercent: number, axis: 'x' | 'y') => {\n const videoAspectRatio = options?.videoAspectRatio ?? 16 / 9\n const isVertical = videoAspectRatio > 0 && videoAspectRatio < 1\n const baseW = isVertical ? 1080 : 1920\n const baseH = isVertical ? 1920 : 1080\n const base = axis === 'x' ? baseW : baseH\n const px = (valuePercent / 100) * base\n let rounded = Math.round(px)\n // Avoid sending 0px (and JS -0); keep sign for negative margins.\n if (rounded === 0) rounded = px < 0 ? -1 : 1\n return `${rounded}px`\n }\n\n const normalizeToPixels = (value: string | undefined, axis: 'x' | 'y'): string | undefined => {\n if (!value) return value\n const trimmed = value.trim()\n if (trimmed.endsWith('px')) {\n return roundPxString(trimmed)\n }\n if (trimmed.endsWith('%')) {\n const n = Number(trimmed.slice(0, -1))\n if (!Number.isFinite(n)) return value\n return toPxString(n, axis)\n }\n return value\n }\n\n // If user provided explicit overlay settings, use them (Mux-documented format).\n // When `options.units === 'px'`, we normalize both % and px to whole-pixel strings,\n // honoring vertical vs horizontal video bases.\n if (watermark.overlay_settings) {\n const widthValue = watermark.overlay_settings.width\n const widthNormalized =\n options?.units === 'px' ? normalizeToPixels(widthValue, 'x') : widthValue\n return {\n ...watermark.overlay_settings,\n horizontal_margin:\n options?.units === 'px'\n ? (normalizeToPixels(watermark.overlay_settings.horizontal_margin, 'x') ??\n watermark.overlay_settings.horizontal_margin)\n : watermark.overlay_settings.horizontal_margin,\n vertical_margin:\n options?.units === 'px'\n ? (normalizeToPixels(watermark.overlay_settings.vertical_margin, 'y') ??\n watermark.overlay_settings.vertical_margin)\n : watermark.overlay_settings.vertical_margin,\n width: widthNormalized ?? `${size}%`,\n opacity: watermark.overlay_settings.opacity ?? `${Math.round(opacity * 100)}%`,\n }\n }\n\n const position = watermark.position || {x: 50, y: 50}\n\n /**\n * Our UI stores watermark position as the *center point* in percentages.\n * Mux margins are interpreted relative to an *edge* (based on align).\n *\n * To make \"corner\" placements match what the user dragged, we convert from\n * center-position to top-left margins by subtracting half the watermark size.\n *\n * Note: `size` is a percentage of video width. Mux `width` is also expressed\n * as a percentage of the video width, so we can reuse it for horizontal math.\n * For vertical math, we approximate using the same percentage to keep behavior\n * consistent with the current draggable UI (which also uses `size` in both axes\n * for bounds).\n */\n // Allow negative margins to compensate for rounding / letterboxing edge-cases.\n // We still clamp to a sane range so values don't explode.\n const clampPercent = (value: number) => Math.max(-100, Math.min(100, value))\n\n // Mux accepts percentage strings; avoid sending an exact \"0%\" by nudging to 0.01%.\n // This also handles the JS -0 edge case and tiny floating point remnants.\n const toPercentString = (value: number) => {\n const epsilon = 1e-9\n const isZeroish = value === 0 || Object.is(value, -0) || Math.abs(value) < epsilon\n return `${isZeroish ? 0.01 : value}%`\n }\n\n const watermarkWidthPercentOfVideoWidth = size\n\n /**\n * Convert watermark height into % of video height.\n * height% = (watermarkWidthPx / imageAspectRatio) / videoHeightPx\n * = (size% * videoWidthPx / imageAspectRatio) / videoHeightPx\n * = size% * (videoWidthPx/videoHeightPx) / imageAspectRatio\n * = size% * videoAspectRatio / imageAspectRatio\n */\n const videoAspectRatio = options?.videoAspectRatio ?? 16 / 9\n const imageAspectRatio = watermark.imageAspectRatio ?? 1\n const watermarkHeightPercentOfVideoHeight = Math.max(\n 0,\n Math.min(100, (size * videoAspectRatio) / imageAspectRatio),\n )\n\n const halfWidth = watermarkWidthPercentOfVideoWidth / 2\n const halfHeight = watermarkHeightPercentOfVideoHeight / 2\n\n const leftMargin = clampPercent(\n Math.min(position.x - halfWidth, 100 - watermarkWidthPercentOfVideoWidth),\n )\n const topMargin = clampPercent(\n Math.min(position.y - halfHeight, 100 - watermarkHeightPercentOfVideoHeight),\n )\n\n const units = options?.units ?? '%'\n const marginX = units === 'px' ? toPxString(leftMargin, 'x') : toPercentString(leftMargin)\n const marginY = units === 'px' ? toPxString(topMargin, 'y') : toPercentString(topMargin)\n const width = units === 'px' ? toPxString(size, 'x') : `${size}%`\n\n const overlaySettings: MuxOverlaySettings = {\n vertical_align: 'top',\n vertical_margin: marginY,\n horizontal_align: 'left',\n horizontal_margin: marginX,\n width,\n opacity: `${Math.round(opacity * 100)}%`,\n }\n\n return overlaySettings\n}\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 {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Button, Card, Flex, Grid, Stack, Text, TextInput} from '@sanity/ui'\nimport {useCallback, useEffect, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {convertWatermarkToMuxOverlay} from '../util/convertWatermarkToMux'\nimport type {MuxOverlaySettings, WatermarkConfig} from '../util/types'\n\nconst RangeInput = styled.input`\n width: 100%;\n height: 4px;\n border-radius: 2px;\n background: var(--card-border-color);\n outline: none;\n -webkit-appearance: none;\n appearance: none;\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--card-focus-ring-color, #2276fc);\n cursor: pointer;\n border: 2px solid white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n &::-moz-range-thumb {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--card-focus-ring-color, #2276fc);\n cursor: pointer;\n border: 2px solid white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n &:hover::-webkit-slider-thumb {\n background: var(--card-focus-ring-color, #1a5fc7);\n }\n\n &:hover::-moz-range-thumb {\n background: var(--card-focus-ring-color, #1a5fc7);\n }\n`\n\nconst WatermarkOverlay = styled.div<{$opacity: number}>`\n position: absolute;\n max-width: 200px;\n opacity: ${(props) => props.$opacity};\n cursor: move;\n user-select: none;\n z-index: 10;\n pointer-events: auto;\n\n img {\n width: 100%;\n height: auto;\n display: block;\n pointer-events: none;\n }\n\n &:hover {\n outline: 2px dashed rgba(255, 255, 255, 0.8);\n outline-offset: 4px;\n }\n`\n\ninterface DraggableWatermarkProps {\n watermark: WatermarkConfig\n onChange: (watermark: WatermarkConfig) => void\n containerRef?: React.RefObject<HTMLDivElement>\n videoElementRef?: React.RefObject<HTMLVideoElement>\n}\n\nexport default function DraggableWatermark({\n watermark,\n onChange,\n containerRef,\n videoElementRef,\n}: DraggableWatermarkProps) {\n const [isDragging, setIsDragging] = useState(false)\n const [dragStart, setDragStart] = useState({x: 0, y: 0})\n const [startPosition, setStartPosition] = useState({x: 0, y: 0})\n const watermarkRef = useRef<HTMLDivElement>(null)\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const [localPosition, setLocalPosition] = useState(watermark.position || {x: 50, y: 50})\n\n const position = localPosition\n const size = watermark.size || 20\n const opacity = watermark.opacity ?? 0.7\n\n const parseOpacityPercent = (value: string | undefined): number | null => {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed.endsWith('%')) return null\n const num = Number(trimmed.slice(0, -1))\n if (!Number.isFinite(num)) return null\n return Math.max(0, Math.min(1, num / 100))\n }\n\n const getVideoContentBox = useCallback(() => {\n const container = containerRef?.current\n if (!container) return {x: 0, y: 0, width: 0, height: 0}\n\n const rect = container.getBoundingClientRect()\n const containerW = rect.width\n const containerH = rect.height\n\n const videoEl = videoElementRef?.current\n const videoW = videoEl?.videoWidth || 0\n const videoH = videoEl?.videoHeight || 0\n\n if (!videoW || !videoH || !containerW || !containerH) {\n return {x: 0, y: 0, width: containerW, height: containerH}\n }\n\n // object-fit: contain sizing\n const scale = Math.min(containerW / videoW, containerH / videoH)\n const contentW = videoW * scale\n const contentH = videoH * scale\n const offsetX = (containerW - contentW) / 2\n const offsetY = (containerH - contentH) / 2\n\n return {x: offsetX, y: offsetY, width: contentW, height: contentH}\n }, [containerRef, videoElementRef])\n\n const parseOverlayValue = (value: string | undefined): {n: number; unit: '%' | 'px'} | null => {\n if (!value) return null\n const trimmed = value.trim()\n const px = trimmed.endsWith('px')\n const pct = trimmed.endsWith('%')\n const num = Number(trimmed.replace(/px|%/g, ''))\n if (!Number.isFinite(num)) return null\n if (px) return {n: num, unit: 'px'}\n if (pct) return {n: num, unit: '%'}\n return null\n }\n\n const computeManualStyle = (overlay: MuxOverlaySettings) => {\n const rect = containerRef?.current?.getBoundingClientRect()\n const w = rect?.width ?? 0\n const h = rect?.height ?? 0\n const isVertical = h > w\n const baseW = isVertical ? 1080 : 1920\n const baseH = isVertical ? 1920 : 1080\n\n const hm = parseOverlayValue(overlay.horizontal_margin)\n const vm = parseOverlayValue(overlay.vertical_margin)\n const ww = parseOverlayValue(overlay.width)\n const manualOpacity = parseOpacityPercent(overlay.opacity)\n\n const toCss = (v: {n: number; unit: '%' | 'px'} | null, axis: 'x' | 'y') => {\n if (!v) return undefined\n if (v.unit === '%') return `${v.n}%`\n if (axis === 'x') return `${(v.n * w) / baseW}px`\n return `${(v.n * h) / baseH}px`\n }\n\n const computeHorizontalStyle = () => {\n if (overlay.horizontal_align === 'left') {\n return {left: toCss(hm, 'x'), right: undefined, transform: 'translate(0, 0)'}\n }\n if (overlay.horizontal_align === 'right') {\n return {right: toCss(hm, 'x'), left: undefined, transform: 'translate(0, 0)'}\n }\n return {left: '50%', right: undefined, transform: 'translate(-50%, 0)'}\n }\n\n const computeVerticalStyle = () => {\n if (overlay.vertical_align === 'top') {\n return {top: toCss(vm, 'y'), bottom: undefined}\n }\n if (overlay.vertical_align === 'bottom') {\n return {bottom: toCss(vm, 'y'), top: undefined}\n }\n return {top: '50%', bottom: undefined}\n }\n\n const hStyle = computeHorizontalStyle()\n const vStyle = computeVerticalStyle()\n\n let transform = hStyle.transform\n if (overlay.vertical_align === 'middle') {\n transform =\n overlay.horizontal_align === 'center' ? 'translate(-50%, -50%)' : 'translate(0, -50%)'\n }\n\n return {\n position: 'absolute' as const,\n ...hStyle,\n ...vStyle,\n transform,\n width: ww ? toCss(ww, 'x') : `${size}%`,\n opacity: manualOpacity ?? opacity,\n cursor: 'default',\n }\n }\n\n const debouncedOnChange = useCallback(\n (newWatermark: WatermarkConfig) => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n debounceTimeoutRef.current = setTimeout(() => {\n onChange(newWatermark)\n }, 300)\n },\n [onChange],\n )\n\n useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n }\n }, [])\n\n useEffect(() => {\n if (!isDragging && watermark.position) {\n // oxlint-disable-next-line react/react-compiler\n setLocalPosition(watermark.position)\n }\n }, [watermark.position, isDragging])\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault()\n setIsDragging(true)\n setDragStart({x: e.clientX, y: e.clientY})\n setStartPosition({x: position.x, y: position.y})\n },\n [position],\n )\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !containerRef?.current) return\n\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const content = getVideoContentBox()\n const contentW = content.width || rect.width\n const contentH = content.height || rect.height\n const dx = e.clientX - dragStart.x\n const dy = e.clientY - dragStart.y\n\n const deltaXPercent = (dx / contentW) * 100\n const deltaYPercent = (dy / contentH) * 100\n\n let newX = startPosition.x + deltaXPercent\n let newY = startPosition.y + deltaYPercent\n\n newX = Math.max(0, Math.min(100, newX))\n newY = Math.max(0, Math.min(100, newY))\n\n setLocalPosition({x: newX, y: newY})\n\n debouncedOnChange({\n ...watermark,\n position: {x: newX, y: newY},\n })\n },\n [\n isDragging,\n dragStart,\n startPosition,\n containerRef,\n watermark,\n debouncedOnChange,\n getVideoContentBox,\n ],\n )\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false)\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n debounceTimeoutRef.current = null\n }\n onChange({\n ...watermark,\n position: localPosition,\n })\n }, [watermark, localPosition, onChange])\n\n useEffect(() => {\n if (isDragging) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n }\n return undefined\n }, [isDragging, handleMouseMove, handleMouseUp])\n\n if (!watermark.imageUrl) {\n return null\n }\n\n const hasManualOverlay = Boolean(watermark.overlay_settings)\n const opacityForRender = hasManualOverlay\n ? (parseOpacityPercent(watermark.overlay_settings?.opacity) ?? opacity)\n : opacity\n // oxlint-disable-next-line react/react-compiler\n const contentBox = getVideoContentBox()\n const hasContentBox = contentBox.width > 0 && contentBox.height > 0\n\n const computeWatermarkStyle = () => {\n if (hasManualOverlay) {\n return computeManualStyle(watermark.overlay_settings!)\n }\n if (hasContentBox) {\n return {\n left: `${contentBox.x + (position.x / 100) * contentBox.width}px`,\n top: `${contentBox.y + (position.y / 100) * contentBox.height}px`,\n transform: 'translate(-50%, -50%)',\n width: `${Math.max(1, (size / 100) * contentBox.width)}px`,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n }\n return {\n left: `${position.x}%`,\n top: `${position.y}%`,\n transform: 'translate(-50%, -50%)',\n width: `${size}%`,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n }\n\n return (\n <WatermarkOverlay\n ref={watermarkRef}\n $opacity={opacityForRender}\n onMouseDown={hasManualOverlay ? undefined : handleMouseDown}\n // oxlint-disable-next-line react/react-compiler\n style={computeWatermarkStyle()}\n >\n <img src={watermark.imageUrl} alt=\"Watermark\" draggable={false} />\n </WatermarkOverlay>\n )\n}\n\ninterface WatermarkControlsProps {\n watermark: WatermarkConfig\n onChange: (watermark: WatermarkConfig) => void\n onValidationChange?: (error: string | null) => void\n previewContainerRef?: React.RefObject<HTMLDivElement | null>\n previewVideoRef?: React.RefObject<HTMLVideoElement | null>\n}\n\nexport function WatermarkControls({\n watermark,\n onChange,\n onValidationChange,\n previewContainerRef,\n previewVideoRef,\n}: WatermarkControlsProps) {\n const [urlInput, setUrlInput] = useState(watermark.imageUrl || '')\n const [urlError, setUrlError] = useState<string | null>(null)\n const [isValidating, setIsValidating] = useState(false)\n const [isValid, setIsValid] = useState<boolean | null>(null)\n const validationTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const [mode, setMode] = useState<'canvas' | 'manual'>(\n watermark.overlay_settings ? 'manual' : 'canvas',\n )\n\n const isUpdatingRef = useRef(false)\n\n const isValidExtension = useCallback((extension: string) => {\n return extension.endsWith('.png') || extension.endsWith('.jpg') || extension.endsWith('.jpeg')\n }, [])\n\n const validateUrl = useCallback(\n (url: string) => {\n if (validationTimeoutRef.current) {\n clearTimeout(validationTimeoutRef.current)\n }\n\n if (!url) {\n setUrlError(null)\n setIsValid(null)\n setIsValidating(false)\n onValidationChange?.(null)\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n overlay_settings: undefined,\n })\n return\n }\n\n setIsValidating(true)\n setIsValid(null)\n setUrlError(null)\n\n validationTimeoutRef.current = setTimeout(() => {\n try {\n const urlObj = new URL(url)\n const pathname = urlObj.pathname.toLowerCase()\n if (isValidExtension(pathname)) {\n setIsValid(true)\n setUrlError(null)\n onValidationChange?.(null)\n const img = new Image()\n img.onload = () => {\n const imageAspectRatio =\n img.naturalWidth && img.naturalHeight ? img.naturalWidth / img.naturalHeight : 1\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: true,\n imageUrl: url,\n imageAspectRatio,\n })\n }\n img.onerror = () => {\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: true,\n imageUrl: url,\n imageAspectRatio: watermark.imageAspectRatio,\n })\n }\n img.src = url\n } else {\n const errorMsg =\n 'Mux only supports PNG and JPG watermark images. Please use a .png or .jpg file.'\n setIsValid(false)\n setUrlError(errorMsg)\n onValidationChange?.(errorMsg)\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n imageAspectRatio: undefined,\n overlay_settings: undefined,\n })\n }\n } catch {\n setIsValid(false)\n const errorMsg = 'Please enter a valid URL (e.g., https://example.com/watermark.png)'\n setUrlError(errorMsg)\n onValidationChange?.(errorMsg)\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n imageAspectRatio: undefined,\n overlay_settings: undefined,\n })\n } finally {\n setIsValidating(false)\n }\n }, 500)\n },\n [watermark, onChange, onValidationChange, isValidExtension],\n )\n\n useEffect(() => {\n return () => {\n if (validationTimeoutRef.current) {\n clearTimeout(validationTimeoutRef.current)\n }\n }\n }, [])\n\n useEffect(() => {\n // oxlint-disable-next-line react/react-compiler\n setMode(watermark.overlay_settings ? 'manual' : 'canvas')\n }, [watermark.overlay_settings])\n\n const handleUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const url = e.target.value\n setUrlInput(url)\n\n if (watermark.imageUrl && url !== watermark.imageUrl) {\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n imageAspectRatio: undefined,\n overlay_settings: undefined,\n })\n }\n\n validateUrl(url)\n }\n\n const normalizeZeroPercent = (value: string | undefined) => {\n if (!value) return value\n const trimmed = value.trim()\n if (!trimmed.endsWith('%')) return value\n const n = Number(trimmed.slice(0, -1))\n if (!Number.isFinite(n)) return value\n const epsilon = 1e-9\n if (n === 0 || Object.is(n, -0) || Math.abs(n) < epsilon) return '0.01%'\n return `${n}%`\n }\n\n const updateOverlaySettings = (next: Partial<MuxOverlaySettings>) => {\n const prev = watermark.overlay_settings\n const base: MuxOverlaySettings = prev ?? {\n vertical_align: 'bottom',\n vertical_margin: '2%',\n horizontal_align: 'right',\n horizontal_margin: '2%',\n width: `${watermark.size ?? 20}%`,\n opacity: `${Math.round((watermark.opacity ?? 0.7) * 100)}%`,\n }\n\n const merged: MuxOverlaySettings = {\n ...base,\n ...next,\n }\n\n onChange({\n ...watermark,\n enabled: true,\n overlay_settings: {\n ...merged,\n horizontal_margin:\n normalizeZeroPercent(merged.horizontal_margin) || merged.horizontal_margin,\n vertical_margin: normalizeZeroPercent(merged.vertical_margin) || merged.vertical_margin,\n },\n })\n }\n\n const getVideoContentBox = () => {\n const container = previewContainerRef?.current\n if (!container) return {x: 0, y: 0, width: 0, height: 0}\n\n const rect = container.getBoundingClientRect()\n const containerW = rect.width\n const containerH = rect.height\n\n const videoEl = previewVideoRef?.current\n const videoW = videoEl?.videoWidth || 0\n const videoH = videoEl?.videoHeight || 0\n\n if (!videoW || !videoH || !containerW || !containerH) {\n return {x: 0, y: 0, width: containerW, height: containerH}\n }\n\n const scale = Math.min(containerW / videoW, containerH / videoH)\n const contentW = videoW * scale\n const contentH = videoH * scale\n const offsetX = (containerW - contentW) / 2\n const offsetY = (containerH - contentH) / 2\n\n return {x: offsetX, y: offsetY, width: contentW, height: contentH}\n }\n\n return (\n <Stack space={3}>\n <Stack space={2}>\n <Text size={1} weight=\"medium\">\n Watermark Image URL\n </Text>\n <Text size={0} muted>\n Enter a URL to a PNG or JPG image. Mux will download this image and overlay it on your\n video.\n </Text>\n <Box style={{position: 'relative', width: '100%'}}>\n <input\n type=\"url\"\n value={urlInput}\n onChange={handleUrlChange}\n placeholder=\"https://example.com/watermark.png\"\n style={{\n padding: '8px 12px',\n paddingRight: (() => {\n if (urlInput) return '96px'\n if (isValid !== null) return '36px'\n return '12px'\n })(),\n border: (() => {\n if (urlError || isValid === false) return '1px solid #e74c3c'\n if (isValid === true) return '1px solid #4caf50'\n return '1px solid #ccc'\n })(),\n borderRadius: '4px',\n width: '100%',\n maxWidth: '100%',\n boxSizing: 'border-box',\n fontSize: '14px',\n }}\n />\n {(urlInput || isValidating || isValid !== null) && (\n <Box\n style={{\n position: 'absolute',\n right: '8px',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {urlInput && (\n <Button\n text=\"Clear\"\n mode=\"bleed\"\n tone=\"critical\"\n onClick={() => {\n setUrlInput('')\n validateUrl('')\n }}\n disabled={isValidating}\n style={{fontSize: '11px', height: '24px'}}\n />\n )}\n {isValidating && (\n <Text size={0} muted>\n Validating...\n </Text>\n )}\n {isValid === true && !isValidating && (\n <CheckmarkCircleIcon style={{color: '#4caf50', fontSize: '18px'}} />\n )}\n {isValid === false && !isValidating && (\n <ErrorOutlineIcon style={{color: '#e74c3c', fontSize: '18px'}} />\n )}\n </Box>\n )}\n </Box>\n {urlError && (\n <Card padding={2} tone=\"critical\" radius={2}>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon style={{color: '#e74c3c', flexShrink: 0}} />\n <Text size={0} style={{color: '#e74c3c'}}>\n {urlError}\n </Text>\n </Flex>\n </Card>\n )}\n </Stack>\n\n {watermark.imageUrl && (\n <Stack space={2}>\n <Card padding={3} tone=\"transparent\" border radius={2}>\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap={3}\n style={{flexWrap: 'wrap', alignItems: 'flex-start'}}\n >\n <Stack space={2} style={{minWidth: 240, flex: 1}}>\n <Text size={1} weight=\"medium\">\n Positioning mode\n </Text>\n <Text size={0} muted>\n Choose between dragging on the canvas or manually editing the Mux{' '}\n <code>overlay_settings</code> fields (as in{' '}\n <a\n href=\"https://www.mux.com/docs/guides/add-watermarks-to-your-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n the docs\n </a>\n ).\n </Text>\n </Stack>\n <Flex gap={2} style={{flexWrap: 'wrap'}}>\n <Button\n text=\"Canvas\"\n mode={mode === 'canvas' ? 'default' : 'ghost'}\n onClick={() => {\n setMode('canvas')\n onChange({...watermark, enabled: true, overlay_settings: undefined})\n }}\n />\n <Button\n text=\"Manual\"\n mode={mode === 'manual' ? 'default' : 'ghost'}\n onClick={() => {\n setMode('manual')\n const overlay = convertWatermarkToMuxOverlay({...watermark, enabled: true})\n updateOverlaySettings(overlay ?? {})\n }}\n />\n </Flex>\n </Flex>\n </Card>\n\n {mode === 'manual' && (\n <Card padding={3} tone=\"transparent\" border radius={2}>\n <Stack space={3}>\n <Text size={1} weight=\"medium\">\n Mux overlay_settings\n </Text>\n <Grid columns={[1, 2]} gap={3} style={{width: '100%'}}>\n <Stack space={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n horizontal_align\n </Text>\n <select\n value={watermark.overlay_settings?.horizontal_align || 'right'}\n onChange={(e) =>\n updateOverlaySettings({\n horizontal_align: (e.target.value ||\n 'right') as MuxOverlaySettings['horizontal_align'],\n })\n }\n style={{\n width: '100%',\n padding: '8px 10px',\n border: '1px solid #ccc',\n borderRadius: 4,\n }}\n >\n <option value=\"left\">left</option>\n <option value=\"center\">center</option>\n <option value=\"right\">right</option>\n </select>\n </Stack>\n <Stack space={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n horizontal_margin (e.g. 2% or 40px)\n </Text>\n <TextInput\n value={watermark.overlay_settings?.horizontal_margin || '2%'}\n onChange={(e) =>\n updateOverlaySettings({horizontal_margin: e.currentTarget.value})\n }\n />\n </Stack>\n <Stack space={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n vertical_align\n </Text>\n <select\n value={watermark.overlay_settings?.vertical_align || 'bottom'}\n onChange={(e) =>\n updateOverlaySettings({\n vertical_align: (e.target.value ||\n 'bottom') as MuxOverlaySettings['vertical_align'],\n })\n }\n style={{\n width: '100%',\n padding: '8px 10px',\n border: '1px solid #ccc',\n borderRadius: 4,\n }}\n >\n <option value=\"top\">top</option>\n <option value=\"middle\">middle</option>\n <option value=\"bottom\">bottom</option>\n </select>\n </Stack>\n <Stack space={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n vertical_margin (e.g. 2% or 40px)\n </Text>\n <TextInput\n value={watermark.overlay_settings?.vertical_margin || '2%'}\n onChange={(e) =>\n updateOverlaySettings({vertical_margin: e.currentTarget.value})\n }\n />\n </Stack>\n <Stack space={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n width (e.g. 25% or 80px)\n </Text>\n <TextInput\n value={watermark.overlay_settings?.width || `${watermark.size ?? 20}%`}\n onChange={(e) => updateOverlaySettings({width: e.currentTarget.value})}\n />\n </Stack>\n <Stack space={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n opacity (e.g. 90%)\n </Text>\n <TextInput\n value={\n watermark.overlay_settings?.opacity ||\n `${Math.round((watermark.opacity ?? 0.7) * 100)}%`\n }\n onChange={(e) => updateOverlaySettings({opacity: e.currentTarget.value})}\n />\n </Stack>\n </Grid>\n <Text size={0} muted>\n Margins and width accept either percentages or pixels, per the Mux guide.\n </Text>\n </Stack>\n </Card>\n )}\n\n {mode === 'canvas' && (\n <>\n <Box>\n <Text size={1} weight=\"medium\">\n {/* oxlint-disable-next-line react/react-compiler */}\n {(() => {\n const sizePct = watermark.size || 20\n const contentW = getVideoContentBox().width\n if (!contentW) return `Size: ${sizePct}%`\n const px = Math.max(1, Math.round((sizePct / 100) * contentW))\n return `Size: ${px}px`\n })()}\n </Text>\n <RangeInput\n type=\"range\"\n // oxlint-disable-next-line react/react-compiler\n value={(() => {\n const sizePct = watermark.size || 20\n const contentW = getVideoContentBox().width\n if (!contentW) return sizePct\n return Math.max(1, Math.round((sizePct / 100) * contentW))\n })()}\n // oxlint-disable-next-line react/react-compiler\n min={(() => {\n const contentW = getVideoContentBox().width\n if (!contentW) return 5\n return Math.max(1, Math.round(contentW * 0.05))\n })()}\n // oxlint-disable-next-line react/react-compiler\n max={(() => {\n const contentW = getVideoContentBox().width\n if (!contentW) return 50\n return Math.max(1, Math.round(contentW * 0.5))\n })()}\n step={1}\n onChange={(e) => {\n const raw = Number(e.target.value)\n const contentW = getVideoContentBox().width\n const nextPct = contentW ? (raw / contentW) * 100 : raw\n const clampedPct = Math.max(5, Math.min(50, nextPct))\n onChange({\n ...watermark,\n size: clampedPct,\n })\n }}\n />\n </Box>\n\n <Box>\n <Text size={1} weight=\"medium\">\n Opacity: {Math.round((watermark.opacity ?? 0.7) * 100)}%\n </Text>\n <RangeInput\n type=\"range\"\n value={watermark.opacity ?? 0.7}\n min={0}\n max={1}\n step={0.05}\n onChange={(e) =>\n onChange({\n ...watermark,\n opacity: Number(e.target.value),\n })\n }\n />\n </Box>\n </>\n )}\n\n <Card padding={2} tone=\"transparent\" border radius={2}>\n <Text size={0} muted>\n {mode === 'manual'\n ? 'Manual mode: edit the overlay_settings fields above'\n : '💡 Drag the watermark on the preview to position it'}\n </Text>\n </Card>\n </Stack>\n )}\n </Stack>\n )\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {Autocomplete, Box, Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {type Dispatch} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type PluginConfig, SUPPORTED_MUX_LANGUAGES, type 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\" path={[]}>\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 {Checkbox, Flex, Grid, Text} from '@sanity/ui'\nimport {type ActionDispatch, type CSSProperties, type ReactNode, useState} from 'react'\n\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\n\nexport default function PlaybackPolicyOption({\n id,\n checked,\n optionName,\n description,\n dispatch,\n action,\n disabled,\n}: {\n id: string\n checked: boolean\n optionName: string\n description: string | ReactNode\n dispatch: ActionDispatch<[action: UploadConfigurationStateAction]>\n action?: 'public_policy' | 'signed_policy' | 'drm_policy'\n disabled?: boolean\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: disabled ? 'not-allowed' : '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 if (!action) return\n triggerAnimation()\n dispatch({\n action,\n value: !checked,\n })\n }\n\n const descriptionJsx =\n typeof description === 'string' ? (\n <Text size={2} muted>\n {description}\n </Text>\n ) : (\n description\n )\n return (\n <label>\n <Flex gap={3} padding={3} style={boxStyle}>\n <Checkbox\n id={id}\n required\n checked={checked}\n onChange={handleBoxClick}\n disabled={disabled}\n />\n <Grid gap={3}>\n <Text size={3} weight=\"bold\">\n {optionName}\n </Text>\n {descriptionJsx}\n </Grid>\n </Flex>\n </label>\n )\n}\n","import {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {Box, Flex, Text} from '@sanity/ui'\nimport {type 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 {Code, Grid, Text} from '@sanity/ui'\nimport {type ActionDispatch} from 'react'\n\nimport {type Secrets, type UploadConfig} from '../../util/types'\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\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: ActionDispatch<[action: UploadConfigurationStateAction]>\n}) {\n const noPolicySelected = !(config.public_policy || config.signed_policy || config.drm_policy)\n const drmPolicyDisabled = !secrets.drmConfigId\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={\n <>\n <Text size={2} muted>\n Playback IDs are accessible by constructing an HLS URL like\n </Text>\n <Code>{'https://stream.mux.com/{PLAYBACK_ID}'}</Code>\n </>\n }\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={\n <>\n <Text size={2} muted>\n Playback IDs should be used with tokens\n </Text>\n <Code>{'https://stream.mux.com/{PLAYBACK_ID}?token={TOKEN}'}</Code>\n <Text size={2} muted>\n See{' '}\n <a\n href=\"https://www.mux.com/docs/guides/secure-video-playback\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Secure video playback\n </a>{' '}\n for details about creating tokens.\n </Text>\n </>\n }\n // See Secure video playback for details about creating tokens.\"\n dispatch={dispatch}\n action=\"signed_policy\"\n />\n )}\n {drmPolicyDisabled ? (\n <PlaybackPolicyOption\n id={`${id}--drm`}\n checked={false}\n optionName=\"DRM - Disabled\"\n description={\n <>\n <Text size={2} muted>\n To enable DRM add your DRM Configuration Id to your plugin configuration in the API\n Credentials view.{' '}\n <a\n href=\"https://www.mux.com/support/human\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Contact us\n </a>{' '}\n to get started using DRM.\n </Text>\n </>\n }\n dispatch={dispatch}\n disabled\n />\n ) : (\n <PlaybackPolicyOption\n id={`${id}--drm`}\n checked={config.drm_policy}\n optionName=\"DRM\"\n description={\n <>\n <Text size={2} muted>\n Playback IDs should be used with tokens as with Signed playback, but require extra\n configuration.\n </Text>\n <Code>{'https://stream.mux.com/{PLAYBACK_ID}?token={TOKEN}'}</Code>\n <Text size={2} muted>\n See{' '}\n <a\n href=\"https://www.mux.com/docs/guides/protect-videos-with-drm#play-drm-protected-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Protect videos with DRM\n </a>{' '}\n for details about configuring your player for DRM playback and{' '}\n <a\n href=\"https://www.mux.com/docs/guides/secure-video-playback\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Secure video playback\n </a>{' '}\n for details about creating tokens.\n </Text>\n </>\n }\n dispatch={dispatch}\n action=\"drm_policy\"\n />\n )}\n {noPolicySelected && <PlaybackPolicyWarning />}\n </Grid>\n )\n}\n","import {Flex, Radio, Text} from '@sanity/ui'\nimport {type ActionDispatch} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type UploadConfig} from '../../util/types'\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\n\nexport const 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\nexport const ResolutionTierSelector = ({\n id,\n config,\n dispatch,\n maxSupportedResolution,\n}: {\n id: string\n config: UploadConfig\n dispatch: ActionDispatch<[action: UploadConfigurationStateAction]>\n maxSupportedResolution: number\n}) => {\n return (\n <FormField\n path={[]}\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","import {Checkbox, Flex, Label, Radio, Stack, Text} from '@sanity/ui'\nimport {type ActionDispatch, useMemo, useState} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type StaticRenditionResolution, type UploadConfig} from '../../util/types'\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\n\nconst ADVANCED_RESOLUTIONS: {value: StaticRenditionResolution; label: string}[] = [\n {value: '270p', label: '270p'},\n {value: '360p', label: '360p'},\n {value: '480p', label: '480p'},\n {value: '540p', label: '540p'},\n {value: '720p', label: '720p'},\n {value: '1080p', label: '1080p'},\n {value: '1440p', label: '1440p'},\n {value: '2160p', label: '2160p'},\n]\n\nexport const StaticRenditionSelector = ({\n id,\n config,\n dispatch,\n}: {\n id: string\n config: UploadConfig\n dispatch: ActionDispatch<[action: UploadConfigurationStateAction]>\n}) => {\n // Determine if user is in advanced mode based on selected renditions\n const isAdvancedMode = useMemo(() => {\n const specificResolutions = config.static_renditions.filter(\n (r) => r !== 'highest' && r !== 'audio-only',\n )\n return specificResolutions.length > 0\n }, [config.static_renditions])\n\n const [renditionMode, setRenditionMode] = useState<'standard' | 'advanced'>(\n isAdvancedMode ? 'advanced' : 'standard',\n )\n\n // Helper to toggle a rendition\n const toggleRendition = (rendition: StaticRenditionResolution) => {\n const current = config.static_renditions\n const hasRendition = current.includes(rendition)\n\n if (hasRendition) {\n dispatch({\n action: 'static_renditions',\n value: current.filter((r) => r !== rendition),\n })\n } else {\n dispatch({\n action: 'static_renditions',\n value: [...current, rendition],\n })\n }\n }\n\n // When switching modes, clear renditions that don't apply\n const handleModeChange = (mode: 'standard' | 'advanced') => {\n setRenditionMode(mode)\n if (mode === 'standard') {\n // Remove specific resolutions, keep only highest and audio-only\n dispatch({\n action: 'static_renditions',\n value: config.static_renditions.filter((r) => r === 'highest' || r === 'audio-only'),\n })\n } else {\n // Remove highest, keep specific resolutions and audio-only\n dispatch({\n action: 'static_renditions',\n value: config.static_renditions.filter((r) => r !== 'highest'),\n })\n }\n }\n return (\n <Stack space={3}>\n <FormField\n path={[]}\n title=\"Static Renditions\"\n description=\"Generate downloadable MP4 or M4A files. Note: Mux will not upscale to produce MP4 renditions - renditions that would cause upscaling are skipped.\"\n >\n <Stack space={3}>\n {/* Mode Selector */}\n <Flex gap={3}>\n <Flex align=\"center\" gap={2}>\n <Radio\n checked={renditionMode === 'standard'}\n name=\"rendition-mode\"\n onChange={() => handleModeChange('standard')}\n value=\"standard\"\n id={`${id}--mode-standard`}\n />\n <Text as=\"label\" htmlFor={`${id}--mode-standard`}>\n Standard\n </Text>\n </Flex>\n <Flex align=\"center\" gap={2}>\n <Radio\n checked={renditionMode === 'advanced'}\n name=\"rendition-mode\"\n onChange={() => handleModeChange('advanced')}\n value=\"advanced\"\n id={`${id}--mode-advanced`}\n />\n <Text as=\"label\" htmlFor={`${id}--mode-advanced`}>\n Advanced\n </Text>\n </Flex>\n </Flex>\n\n {/* Standard Mode Options */}\n {renditionMode === 'standard' && (\n <Stack space={2}>\n <Flex align=\"center\" gap={2} padding={[0, 2]}>\n <Checkbox\n id={`${id}--highest`}\n style={{display: 'block'}}\n checked={config.static_renditions.includes('highest')}\n onChange={() => toggleRendition('highest')}\n />\n <Text as=\"label\" htmlFor={`${id}--highest`}>\n Highest Resolution (up to 4K)\n </Text>\n </Flex>\n <Flex align=\"center\" gap={2} padding={[0, 2]}>\n <Checkbox\n id={`${id}--audio-only-standard`}\n style={{display: 'block'}}\n checked={config.static_renditions.includes('audio-only')}\n onChange={() => toggleRendition('audio-only')}\n />\n <Text as=\"label\" htmlFor={`${id}--audio-only-standard`}>\n Audio Only (M4A)\n </Text>\n </Flex>\n </Stack>\n )}\n\n {/* Advanced Mode Options */}\n {renditionMode === 'advanced' && (\n <Stack space={2}>\n <Label size={1} muted>\n Select specific resolutions:\n </Label>\n <Flex gap={2} wrap=\"wrap\">\n {ADVANCED_RESOLUTIONS.map(({value, label}) => {\n const inputId = `${id}--resolution-${value}`\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Checkbox\n id={inputId}\n style={{display: 'block'}}\n checked={config.static_renditions.includes(value)}\n onChange={() => toggleRendition(value)}\n />\n <Text as=\"label\" htmlFor={inputId} size={1}>\n {label}\n </Text>\n </Flex>\n )\n })}\n </Flex>\n <Flex align=\"center\" gap={2} padding={[2, 2, 0, 2]}>\n <Checkbox\n id={`${id}--audio-only-advanced`}\n style={{display: 'block'}}\n checked={config.static_renditions.includes('audio-only')}\n onChange={() => toggleRendition('audio-only')}\n />\n <Text as=\"label\" htmlFor={`${id}--audio-only-advanced`}>\n Audio Only (M4A)\n </Text>\n </Flex>\n </Stack>\n )}\n </Stack>\n </FormField>\n </Stack>\n )\n}\n","import {DocumentVideoIcon} from '@sanity/icons/DocumentVideo'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button, Card, Dialog, Flex, Label, Radio, Stack, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {memo, useEffect, useId, useReducer, useRef, useState} from 'react'\nimport {FormField} from 'sanity'\n\nimport {useFetchFileSize} from '../hooks/useFetchFileSize'\nimport {useMediaMetadata, type VideoAssetMetadata} from '../hooks/useMediaMetadata'\nimport {convertWatermarkToMuxOverlay} from '../util/convertWatermarkToMux'\nimport formatBytes from '../util/formatBytes'\nimport {formatSeconds} from '../util/formatSeconds'\nimport {\n type AutogeneratedTextTrack,\n type CustomTextTrack,\n isAutogeneratedTrack,\n isCustomTextTrack,\n type MuxNewAssetSettings,\n type PluginConfig,\n type Secrets,\n type StaticRenditionResolution,\n type SupportedMuxLanguage,\n type UploadConfig,\n type UploadTextTrack,\n type WatermarkConfig,\n} from '../util/types'\nimport DraggableWatermark, {WatermarkControls} from './DraggableWatermark'\nimport TextTracksEditor, {type TrackAction} from './TextTracksEditor'\nimport PlaybackPolicy from './uploadConfiguration/PlaybackPolicy'\nimport {\n RESOLUTION_TIERS,\n ResolutionTierSelector,\n} from './uploadConfiguration/ResolutionTierSelector'\nimport {StaticRenditionSelector} from './uploadConfiguration/StaticRenditionSelector'\nimport type {StagedUpload} from './Uploader'\n\nexport type UploadConfigurationStateAction =\n | {action: 'video_quality'; value: UploadConfig['video_quality']}\n | {action: 'max_resolution_tier'; value: UploadConfig['max_resolution_tier']}\n | {action: 'static_renditions'; value: UploadConfig['static_renditions']}\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 | {action: 'drm_policy'; value: UploadConfig['drm_policy']}\n | {action: 'watermark'; value: WatermarkConfig}\n | TrackAction\n\nconst VIDEO_QUALITY_LEVELS = [\n {value: 'basic', label: 'Basic'},\n {value: 'plus', label: 'Plus'},\n {value: 'premium', label: 'Premium'},\n] as const satisfies {value: UploadConfig['video_quality']; label: string}[]\n\n/**\n * Sanitizes static renditions configuration to ensure 'highest' is not mixed with specific resolutions.\n * If both are present, only 'highest' (and 'audio-only' if present) will be kept.\n */\nfunction sanitizeStaticRenditions(\n renditions: StaticRenditionResolution[],\n): StaticRenditionResolution[] {\n const hasHighest = renditions.includes('highest')\n const hasSpecificResolutions = renditions.some((r) => r !== 'highest' && r !== 'audio-only')\n\n if (hasHighest && hasSpecificResolutions) {\n return renditions.filter((r) => r === 'highest' || r === 'audio-only')\n }\n\n return renditions\n}\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, watermark: WatermarkConfig | undefined) => void\n onClose: () => void\n}) {\n const id = useId()\n const [watermarkValidationError, setWatermarkValidationError] = useState<string | null>(null)\n const watermarkPreviewContainerRef = useRef<HTMLDivElement>(null)\n const watermarkPreviewVideoRef = useRef<HTMLVideoElement>(null)\n // oxlint-disable-next-line react/react-compiler -- `.current` is read once to seed immutable default subtitle tracks\n const autoTextTracks = useRef<NonNullable<UploadConfig['text_tracks']>>(\n pluginConfig.video_quality === 'plus' && 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 // oxlint-disable-next-line react/react-compiler -- reducer closes over `autoTextTracks` ref seed\n (prev: UploadConfig, action: UploadConfigurationStateAction) => {\n switch (action.action) {\n case 'video_quality':\n // If video quality level switches to basic, remove plus-only features\n if (action.value === 'basic') {\n return Object.assign({}, prev, {\n video_quality: action.value,\n static_renditions: [],\n max_resolution_tier: '1080p',\n text_tracks: prev.text_tracks?.filter(({type}) => type !== 'autogenerated'),\n public_policy: true,\n signed_policy: false,\n drm_policy: false,\n })\n // If video quality level switches to plus, add back in default plus features\n }\n return Object.assign({}, prev, {\n video_quality: action.value,\n static_renditions: sanitizeStaticRenditions(pluginConfig.static_renditions || []),\n max_resolution_tier: pluginConfig.max_resolution_tier,\n text_tracks: [...autoTextTracks, ...(prev.text_tracks || [])],\n })\n\n case 'static_renditions':\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 case 'drm_policy':\n return Object.assign({}, prev, {[action.action]: action.value})\n case 'watermark':\n return Object.assign({}, prev, {watermark: 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 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 video_quality: pluginConfig.video_quality,\n max_resolution_tier: pluginConfig.max_resolution_tier,\n static_renditions: sanitizeStaticRenditions(pluginConfig.static_renditions || []),\n signed_policy: secrets.enableSignedUrls && pluginConfig.defaultSigned,\n public_policy: pluginConfig.defaultPublic,\n drm_policy: pluginConfig.defaultDrm && !!secrets.drmConfigId,\n normalize_audio: pluginConfig.normalize_audio,\n text_tracks: autoTextTracks,\n } as UploadConfig,\n )\n\n // Video validations\n const [validationError, setValidationError] = useState<string | null>(null)\n const MAX_FILE_SIZE = pluginConfig.maxAssetFileSize\n const MAX_DURATION_SECONDS = pluginConfig.maxAssetDuration\n\n const {fileSize, isLoadingFileSize, canSkipFileSizeValidation} = useFetchFileSize(\n stagedUpload,\n MAX_FILE_SIZE,\n )\n const {videoAssetMetadata, setVideoAssetMetadata, isLoadingMetadata} =\n useMediaMetadata(stagedUpload)\n\n useEffect(() => {\n if (fileSize) {\n setVideoAssetMetadata((old) => ({...old, size: fileSize}))\n }\n }, [fileSize, setVideoAssetMetadata])\n\n useEffect(() => {\n const validateDuration = (duration: number) => {\n if (MAX_DURATION_SECONDS && duration > MAX_DURATION_SECONDS) {\n setValidationError(\n `Video duration (${formatSeconds(duration)}) exceeds maximum allowed duration of ${formatSeconds(MAX_DURATION_SECONDS)}`,\n )\n return false\n }\n return true\n }\n\n const validateFileSize = (size: number): boolean => {\n if (MAX_FILE_SIZE === undefined || size <= MAX_FILE_SIZE) {\n return true\n }\n\n setValidationError(\n `File size (${formatBytes(size)}) exceeds maximum allowed size of ${formatBytes(MAX_FILE_SIZE)}`,\n )\n return false\n }\n\n const validateDrmAvailability = (isAudioOnly: boolean) => {\n if (config.drm_policy && isAudioOnly) {\n setValidationError('Audio-only asset cannot be DRM protected')\n return false\n }\n return true\n }\n\n let valid = true\n if (videoAssetMetadata?.size) {\n valid = valid && (canSkipFileSizeValidation || validateFileSize(videoAssetMetadata.size))\n }\n if (videoAssetMetadata?.duration) {\n valid = valid && validateDuration(videoAssetMetadata.duration)\n }\n if (videoAssetMetadata?.isAudioOnly != undefined) {\n valid = valid && validateDrmAvailability(videoAssetMetadata.isAudioOnly)\n }\n if (valid) {\n // oxlint-disable-next-line react/react-compiler -- sync validationError from derived validity checks\n setValidationError(null)\n }\n }, [\n MAX_FILE_SIZE,\n MAX_DURATION_SECONDS,\n canSkipFileSizeValidation,\n videoAssetMetadata?.duration,\n videoAssetMetadata?.size,\n videoAssetMetadata?.height,\n videoAssetMetadata?.width,\n videoAssetMetadata,\n config.drm_policy,\n validationError,\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) {\n const {settings, watermark} = formatUploadConfig(config, secrets, {\n videoAspectRatio: videoAssetMetadata?.aspectRatio,\n })\n startUpload(settings, watermark)\n }\n // oxlint-disable-next-line react/exhaustive-deps -- intentionally mount-only: start upload once with developer-specified config\n }, [])\n if (skipConfig) return null\n\n const basicConfig = config.video_quality !== 'plus' && config.video_quality !== 'premium'\n const playbackPolicySelected = config.public_policy || config.signed_policy || config.drm_policy\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 {(validationError || watermarkValidationError) && (\n <Card padding={3} tone=\"critical\" radius={2} marginBottom={2}>\n <Flex gap={2} align=\"flex-start\">\n <ErrorOutlineIcon width={20} height={20} />\n <Stack space={2}>\n <Text size={1} weight=\"semibold\">\n Validation Error\n </Text>\n <Text size={1}>{validationError || watermarkValidationError}</Text>\n </Stack>\n </Flex>\n </Card>\n )}\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 : (() => {\n if (videoAssetMetadata?.size) {\n return `File From URL (${formatBytes(videoAssetMetadata.size)})`\n }\n if (isLoadingFileSize) {\n return 'File From URL (Loading size...)'\n }\n return 'File From URL (Unknown size)'\n })()}\n </Text>\n {stagedUpload.type === 'file' && (\n <Stack space={1}>\n {isLoadingMetadata && (\n <Text as=\"p\" size={1} muted>\n Reading video metadata...\n </Text>\n )}\n {videoAssetMetadata?.duration && !validationError && (\n <Text as=\"p\" size={1} muted>\n Duration: {formatSeconds(videoAssetMetadata.duration)}\n </Text>\n )}\n </Stack>\n )}\n </Stack>\n </Flex>\n </Card>\n {!disableUploadConfig && (\n <Stack space={3} paddingBottom={2}>\n <FormField\n path={[]}\n title=\"Video Quality Level\"\n description={\n <>\n The video quality level informs the cost, quality, and available platform features\n for 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 {VIDEO_QUALITY_LEVELS.map(({value, label}) => {\n const inputId = `${id}--encodingtier-${value}`\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Radio\n checked={config.video_quality === value}\n name=\"asset-encodingtier\"\n onChange={(e) =>\n dispatch({\n action: 'video_quality' as const,\n value: e.currentTarget.value as UploadConfig['video_quality'],\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 {!basicConfig && (\n <>\n <FormField title=\"Additional Configuration\" path={[]}>\n <Stack space={3}>\n <PlaybackPolicy id={id} config={config} secrets={secrets} dispatch={dispatch} />\n {maxSupportedResolution > 0 && (\n <ResolutionTierSelector\n id={id}\n config={config}\n dispatch={dispatch}\n maxSupportedResolution={maxSupportedResolution}\n />\n )}\n <StaticRenditionSelector id={id} config={config} dispatch={dispatch} />\n {!disableTextTrackConfig && (\n <TextTracksEditor\n tracks={config.text_tracks}\n dispatch={dispatch}\n defaultLang={pluginConfig.defaultAutogeneratedSubtitleLang}\n />\n )}\n </Stack>\n </FormField>\n <WatermarkSection\n config={config}\n dispatch={dispatch}\n stagedUpload={stagedUpload}\n videoAssetMetadata={videoAssetMetadata}\n watermarkPreviewContainerRef={watermarkPreviewContainerRef}\n watermarkPreviewVideoRef={watermarkPreviewVideoRef}\n onValidationChange={setWatermarkValidationError}\n />\n </>\n )}\n </Stack>\n )}\n\n <Box marginTop={4}>\n <Button\n disabled={\n (!basicConfig && !playbackPolicySelected) ||\n validationError !== null ||\n isLoadingMetadata ||\n (isLoadingFileSize && !canSkipFileSizeValidation)\n }\n icon={UploadIcon}\n text=\"Upload\"\n tone=\"positive\"\n onClick={() => {\n if (!validationError) {\n const {settings, watermark} = formatUploadConfig(config, secrets, {\n videoAspectRatio: videoAssetMetadata?.aspectRatio,\n })\n startUpload(settings, watermark)\n }\n }}\n />\n </Box>\n </Stack>\n </Dialog>\n )\n}\n\nfunction setAdvancedPlaybackPolicy(\n config: UploadConfig,\n secrets: Secrets,\n): MuxNewAssetSettings['advanced_playback_policies'] {\n const advanced_playback_policies: MuxNewAssetSettings['advanced_playback_policies'] = []\n if (config.public_policy) {\n advanced_playback_policies.push({policy: 'public'})\n }\n if (config.signed_policy) {\n advanced_playback_policies.push({policy: 'signed'})\n }\n if (config.drm_policy) {\n if (secrets.drmConfigId)\n advanced_playback_policies.push({\n policy: 'drm',\n drm_configuration_id: secrets.drmConfigId ?? undefined,\n })\n else {\n console.error('Selected DRM Policy but missing DRM Configuration Id')\n }\n }\n return advanced_playback_policies\n}\n\nfunction formatUploadConfig(\n config: UploadConfig,\n secrets: Secrets,\n options?: {videoAspectRatio?: number | null},\n): {\n settings: MuxNewAssetSettings\n watermark?: WatermarkConfig\n} {\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 const inputs: NonNullable<MuxNewAssetSettings['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\n if (config.watermark?.imageUrl) {\n const watermarkForMux: WatermarkConfig = {...config.watermark, enabled: true}\n const overlaySettings = convertWatermarkToMuxOverlay(watermarkForMux, {\n videoAspectRatio: options?.videoAspectRatio ?? undefined,\n units: 'px',\n })\n if (overlaySettings) {\n inputs.push({\n url: config.watermark.imageUrl,\n overlay_settings: overlaySettings,\n })\n }\n }\n\n return {\n settings: {\n input: inputs,\n static_renditions:\n config.static_renditions.length > 0\n ? config.static_renditions.map((resolution) => ({resolution}))\n : undefined,\n advanced_playback_policies: setAdvancedPlaybackPolicy(config, secrets),\n max_resolution_tier: config.max_resolution_tier,\n video_quality: config.video_quality,\n normalize_audio: config.normalize_audio,\n },\n watermark: config.watermark?.imageUrl ? {...config.watermark, enabled: true} : undefined,\n }\n}\n\nfunction WatermarkSection({\n config,\n dispatch,\n stagedUpload,\n videoAssetMetadata,\n watermarkPreviewContainerRef,\n watermarkPreviewVideoRef,\n onValidationChange,\n}: {\n config: UploadConfig\n dispatch: (action: UploadConfigurationStateAction) => void\n stagedUpload: StagedUpload\n videoAssetMetadata: VideoAssetMetadata | null\n watermarkPreviewContainerRef: React.RefObject<HTMLDivElement | null>\n watermarkPreviewVideoRef: React.RefObject<HTMLVideoElement | null>\n onValidationChange: (error: string | null) => void\n}) {\n if (videoAssetMetadata?.isAudioOnly !== false) return null\n return (\n <FormField\n path={[]}\n title=\"Watermark\"\n description={\n <>\n Add a watermark overlay to your video using Mux's native watermark support.{' '}\n <a\n href=\"https://www.mux.com/docs/guides/add-watermarks-to-your-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Learn more about Mux watermarks.\n </a>\n </>\n }\n >\n <Stack space={3}>\n <WatermarkControls\n watermark={config.watermark || {enabled: false}}\n onChange={(watermark) => {\n dispatch({action: 'watermark', value: watermark})\n }}\n onValidationChange={onValidationChange}\n previewContainerRef={watermarkPreviewContainerRef}\n previewVideoRef={watermarkPreviewVideoRef}\n />\n {config.watermark?.imageUrl &&\n stagedUpload.type === 'file' &&\n // Canvas preview is only shown in \"Canvas\" mode (no explicit overlay_settings)\n !config.watermark.overlay_settings && (\n <WatermarkPreview\n stagedUpload={stagedUpload}\n watermark={config.watermark}\n videoAspectRatio={videoAssetMetadata.aspectRatio}\n onWatermarkChange={(watermark) => {\n dispatch({action: 'watermark', value: watermark})\n }}\n previewContainerRef={watermarkPreviewContainerRef}\n videoRef={watermarkPreviewVideoRef}\n />\n )}\n </Stack>\n </FormField>\n )\n}\n\n// Memoized preview component to prevent unnecessary re-renders\nconst WatermarkPreview = memo(function WatermarkPreview({\n stagedUpload,\n watermark,\n onWatermarkChange,\n videoAspectRatio,\n previewContainerRef,\n videoRef,\n}: {\n stagedUpload: StagedUpload\n watermark: WatermarkConfig\n onWatermarkChange: (watermark: WatermarkConfig) => void\n videoAspectRatio?: number | null\n previewContainerRef: React.RefObject<HTMLDivElement | null>\n videoRef: React.RefObject<HTMLVideoElement | null>\n}) {\n // Initialize video source only once\n useEffect(() => {\n if (videoRef.current && stagedUpload.type === 'file') {\n const file = stagedUpload.files[0]\n const url = URL.createObjectURL(file!)\n videoRef.current.src = url\n\n return () => {\n URL.revokeObjectURL(url)\n }\n }\n return undefined\n }, [stagedUpload, videoRef])\n\n const isVertical =\n videoAspectRatio !== null && videoAspectRatio !== undefined && videoAspectRatio < 1\n\n return (\n <Card\n tone=\"transparent\"\n border\n style={{\n overflow: 'hidden',\n // For vertical videos, center the preview and limit its width\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n {/* Inner container that exactly matches the video aspect ratio - no padding, no letterbox */}\n <div\n ref={previewContainerRef}\n style={{\n position: 'relative',\n // For vertical videos: limit width so the preview doesn't get too tall\n // For horizontal videos: use full width\n width: isVertical ? 'auto' : '100%',\n aspectRatio: videoAspectRatio ? String(videoAspectRatio) : '16/9',\n ...(isVertical ? {height: '400px', maxHeight: '50vh'} : {minHeight: '200px'}),\n overflow: 'hidden',\n }}\n >\n <video\n ref={videoRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'fill',\n display: 'block',\n }}\n />\n <DraggableWatermark\n watermark={watermark}\n onChange={onWatermarkChange}\n containerRef={previewContainerRef as React.RefObject<HTMLDivElement>}\n videoElementRef={videoRef as React.RefObject<HTMLVideoElement>}\n />\n </div>\n </Card>\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","import {Card, type CardTone} from '@sanity/ui'\nimport {useCallback, useRef} from 'react'\nimport {styled} from 'styled-components'\n\nimport {withFocusRing} from './withFocusRing'\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 function UploadCard({\n children,\n tone,\n onPaste,\n onDrop,\n onDragEnter,\n onDragLeave,\n onDragOver,\n ref,\n}: UploadCardProps & {ref?: React.Ref<HTMLDivElement>}) {\n const inputRef = useRef<HTMLInputElement>(null)\n const handleKeyDown = useCallback<React.KeyboardEventHandler<HTMLDivElement>>((event) => {\n const target = event.target as HTMLElement\n\n // Don't steal focus when pasting into the VTT input\n if (target.closest('#vtt-url')) {\n return\n }\n\n if ((event.ctrlKey || event.metaKey) && event.key === 'v') {\n inputRef.current!.focus()\n }\n }, [])\n\n return (\n <UploadCardWithFocusRing\n tone={tone}\n ref={ref}\n padding={0}\n radius={2}\n shadow={0}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onPaste={onPaste}\n onDrop={onDrop}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={onDragOver}\n >\n <HiddenInput ref={inputRef} />\n {children}\n </UploadCardWithFocusRing>\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 {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 Omit<ButtonProps, 'onSelect'> {\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}\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 {DocumentVideoIcon} from '@sanity/icons/DocumentVideo'\nimport {PlugIcon} from '@sanity/icons/Plug'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Button, Card, Flex, Inline, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {useAccessControl} from '../hooks/useAccessControl'\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {type PluginConfig} from '../util/types'\nimport {FileInputButton, type FileInputButtonProps} from './FileInputButton'\n\nfunction formatAcceptString(accept: string): string {\n return accept\n .split(',')\n .map((type) => type.trim().replace('/*', ''))\n .join(' or ')\n}\n\ninterface UploadPlaceholderProps {\n setDialogState: SetDialogState\n readOnly: boolean\n hovering: boolean\n needsSetup: boolean\n onSelect: FileInputButtonProps['onSelect']\n config: PluginConfig\n accept: string\n}\nexport default function UploadPlaceholder(props: UploadPlaceholderProps) {\n const {setDialogState, readOnly, onSelect, hovering, needsSetup, accept} = props\n const handleBrowse = useCallback(() => setDialogState('select-video'), [setDialogState])\n const handleConfigureApi = useCallback(() => setDialogState('secrets'), [setDialogState])\n const {hasConfigAccess} = useAccessControl(props.config)\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 {formatAcceptString(accept)} file or paste URL here\n </Text>\n </Flex>\n </Flex>\n <Inline space={2}>\n <FileInputButton\n accept={accept}\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 {hasConfigAccess && (\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 )}\n </Inline>\n </Flex>\n </Card>\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Button, type CardTone, Flex, Text, useToast} from '@sanity/ui'\nimport {useCallback, 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 {isServerError, isValidUrl} from '../util/asserters'\nimport {extractDroppedFiles} from '../util/extractFiles'\nimport {hasPlaybackPolicy} from '../util/getPlaybackPolicy'\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: Error; settings: MuxNewAssetSettings}\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: React.MouseEvent<HTMLButtonElement>) => events$.next(event),\n }\n })(),\n ).current\n\n const uploadRef = useRef<Subscription | null>(null)\n const uploadingDocumentId = useRef<string | null>(null)\n const [state, dispatch] = useReducer(\n // oxlint-disable-next-line react/react-compiler\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 uploadingDocumentId.current = null\n return INITIAL_STATE\n case 'error': {\n // Clear upload observable on error\n uploadRef.current?.unsubscribe()\n uploadRef.current = null\n uploadingDocumentId.current = null\n\n let error = action.error\n if (isServerError(action.error) && hasPlaybackPolicy(action.settings, 'drm')) {\n error = new Error(\n 'Unknown Error while uploading DRM protected content. Make sure your DRM configuration ID is valid and set correctly',\n )\n }\n\n return Object.assign({}, INITIAL_STATE, {error: error})\n }\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 // and cleanup orphaned documents if upload was in progress\n useEffect(() => {\n const cleanup = () => {\n // Cancel subscription\n if (uploadRef.current && !uploadRef.current.closed) {\n uploadRef.current.unsubscribe()\n }\n\n // Delete orphaned document if upload was in progress and document is different from the saved asset\n if (uploadingDocumentId.current && props.asset?._id !== uploadingDocumentId.current) {\n const docId = uploadingDocumentId.current\n uploadingDocumentId.current = null\n\n props.client.delete(docId).catch((err) => {\n console.warn('Failed to cleanup orphaned upload document:', err)\n })\n }\n }\n\n const handleBeforeUnload = () => {\n cleanup()\n }\n\n window.addEventListener('beforeunload', handleBeforeUnload)\n window.addEventListener('pagehide', handleBeforeUnload)\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload)\n window.removeEventListener('pagehide', handleBeforeUnload)\n cleanup()\n }\n }, [props.client, props.asset?._id])\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 * @param watermark Optional watermark configuration\n * @returns\n */\n const startUpload = (\n settings: MuxNewAssetSettings,\n watermark?: import('../util/types').WatermarkConfig,\n ) => {\n const {stagedUpload} = state\n if (!stagedUpload || uploadRef.current) return\n dispatch({action: 'commitUpload'})\n let uploadObservable: Observable<UploadFileEvent | UploadUrlEvent>\n switch (stagedUpload.type) {\n case 'url':\n uploadObservable = uploadUrl({\n client: props.client,\n url: stagedUpload.url,\n settings,\n watermark,\n })\n break\n case 'file':\n uploadObservable = uploadFile({\n client: props.client,\n file: stagedUpload.files[0]!,\n settings,\n watermark,\n }).pipe(\n takeUntil(\n cancelUploadButton.observable.pipe(\n tap(() => {\n if (uploadingDocumentId.current) {\n void props.client.delete(uploadingDocumentId.current)\n uploadingDocumentId.current = null\n }\n }),\n ),\n ),\n )\n break\n }\n uploadRef.current = uploadObservable.subscribe({\n next: (event) => {\n switch (event.type) {\n case 'uuid':\n // Track the document ID for cleanup on unmount\n uploadingDocumentId.current = event.uuid\n dispatch({action: 'progressInfo', ...event})\n break\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 uploadingDocumentId.current = null\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, settings}),\n })\n }\n\n const invalidFileToast = useCallback(() => {\n toast.push({\n status: 'error',\n title: `Invalid file type. Accepted types: ${props.config.acceptedMimeTypes?.join(', ')}`,\n })\n }, [props.config.acceptedMimeTypes, toast])\n\n /**\n * Validates if any file in the provided FileList or File array has an unsupported MIME type\n * @param files - FileList or File array to validate\n * @returns true if any file has an invalid MIME type, false if all files are valid\n */\n const isInvalidFile = (files: FileList | File[]) => {\n const isInvalid = Array.from(files).some((file) => {\n return !props.config.acceptedMimeTypes?.some((acceptedType) => {\n // Convert mime type pattern to regex (e.g., 'audio/*' -> /^audio\\/.*$/)\n const pattern = `^${acceptedType.replace('*', '.*')}$`\n return new RegExp(pattern).test(file.type)\n })\n })\n\n return isInvalid\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 if (isInvalidFile(files)) return\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 const target = event.target as HTMLElement\n\n // Ignore paste coming from the VTT URL input\n if (target.closest('#vtt-url')) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n const clipboardData =\n event.clipboardData || (window as Window & {clipboardData?: DataTransfer}).clipboardData\n const url = clipboardData?.getData('text')?.trim()\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 event.preventDefault()\n event.stopPropagation()\n if (dragState === 'invalid') {\n invalidFileToast()\n setDragState(null)\n return\n }\n setDragState(null)\n void 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 const mimeTypes = props.config.acceptedMimeTypes\n\n // Check if the dragged file type matches any of the accepted mime types\n const isValidType = mimeTypes?.some((acceptedType) => {\n // Convert mime type pattern to regex (e.g., 'video/*' -> /^video\\/.*$/)\n const pattern = `^${acceptedType.replace('*', '.*')}$`\n return new RegExp(pattern).test(type!)\n })\n\n setDragState(isValidType ? '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.error\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 weight=\"semibold\" style={{textAlign: 'center'}}>\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 // oxlint-disable-next-line react/react-compiler\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 const acceptMimeString = props.config?.acceptedMimeTypes?.length\n ? props.config.acceptedMimeTypes.join(',')\n : 'video/*, audio/*'\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 config={props.config}\n buttons={\n <PlayerActionsMenu\n accept={acceptMimeString}\n asset={props.asset}\n dialogState={props.dialogState}\n setDialogState={props.setDialogState}\n onChange={props.onChange}\n onSelect={handleUpload}\n readOnly={props.readOnly}\n config={props.config}\n />\n }\n />\n </DialogStateProvider>\n ) : (\n <UploadPlaceholder\n accept={acceptMimeString}\n hovering={dragState !== null}\n onSelect={handleUpload}\n readOnly={!!props.readOnly}\n setDialogState={props.setDialogState}\n needsSetup={props.needsSetup}\n config={props.config}\n />\n )}\n </UploadCard>\n {props.dialogState === 'select-video' && (\n <InputBrowser\n config={props.config}\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 {useAccessControl} from '../hooks/useAccessControl'\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 {ConfigureApiDialog} 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 const {hasConfigAccess} = useAccessControl(props.config)\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} config={props.config} />\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' && hasConfigAccess && (\n <ConfigureApiDialog\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 {type: 'string', name: 'language_code'},\n {type: 'string', name: 'name'},\n {type: 'string', name: 'status'},\n {type: 'string', name: 'text_source'},\n {type: 'string', name: 'text_type'},\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: 'name'},\n {type: 'string', name: 'ext'},\n {type: 'number', name: 'height'},\n {type: 'number', name: 'width'},\n {type: 'number', name: 'bitrate'},\n {type: 'string', name: 'filesize'},\n {type: 'string', name: 'type'},\n {type: 'string', name: 'status'},\n {type: 'string', name: 'resolution_tier'},\n {type: 'string', name: 'resolution'},\n {type: 'string', name: 'id'},\n {type: 'string', name: 'passthrough'},\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 muxMasterFile = {\n name: 'mux.masterFile',\n type: 'object',\n fields: [\n {type: 'string', name: 'status'},\n {type: 'string', name: 'url'},\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: 'video_quality',\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 name: 'master',\n type: 'mux.masterFile',\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 muxMasterFile,\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, StaticRenditionResolution} from '../util/types'\nexport type {VideoAssetDocument} from '../util/types'\n\nexport const defaultConfig: PluginConfig = {\n static_renditions: [],\n mp4_support: 'none',\n video_quality: 'plus',\n max_resolution_tier: '1080p',\n normalize_audio: false,\n defaultPublic: true,\n defaultSigned: false,\n defaultDrm: false,\n tool: DEFAULT_TOOL_CONFIG,\n allowedRolesForConfiguration: [],\n acceptedMimeTypes: ['video/*', 'audio/*'],\n}\n\n/**\n * Converts legacy mp4_support configuration to static_renditions format\n */\nfunction convertLegacyConfig(config: Partial<PluginConfig>): {\n static_renditions: StaticRenditionResolution[]\n} {\n // If static_renditions is already provided, use it\n if (config.static_renditions && config.static_renditions.length > 0) {\n return {static_renditions: config.static_renditions}\n }\n\n // Convert legacy mp4_support to static_renditions\n if (config.mp4_support === 'standard') {\n return {static_renditions: ['highest']}\n }\n\n return {static_renditions: []}\n}\n\nexport const muxInput = definePlugin<Partial<PluginConfig> | void>((userConfig) => {\n // TODO: Remove this on next major version when we end support for encoding_tier\n if (typeof userConfig === 'object' && 'encoding_tier' in userConfig) {\n const deprecated_encoding_tier = userConfig.encoding_tier\n if (!userConfig.video_quality) {\n if (deprecated_encoding_tier === 'baseline') {\n userConfig.video_quality = 'basic'\n }\n if (deprecated_encoding_tier === 'smart') {\n userConfig.video_quality = 'plus'\n }\n }\n }\n const config: PluginConfig = {\n ...defaultConfig,\n ...userConfig,\n ...convertLegacyConfig(userConfig || {}),\n }\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"],"mappings":"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GAC3B;IAAC,MAAM;IAAU,MAAM;GAAa;EACtC;CAkJA;CACA;EA/IA,MAAM;EACN,MAAM;EACN,QAAQ,CACN;GAAC,MAAM;GAAU,MAAM;EAAQ,GAC/B;GACE,MAAM;GACN,MAAM;GACN,IAAI,CAAC,EAAC,MAAM,0BAAyB,CAAC;EACxC,CACF;CAsIA;CACA;EAnIA,MAAM;EACN,MAAM;EACN,QAAQ,CACN;GAAC,MAAM;GAAU,MAAM;EAAQ,GAC/B;GAAC,MAAM;GAAU,MAAM;EAAK,CAC9B;CA8HA;CACA;EA3HA,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;IACN,IAAI,CAAC,EAAC,MAAM,YAAW,CAAC;GAC1B;GACA;IACE,MAAM;IACN,MAAM;IACN,IAAI,CAAC,EAAC,MAAM,iBAAgB,CAAC;GAC/B;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;EACF;CAyCA;CACA;EAtCA,MAAM;EACN,MAAM;EACN,OAAO;EACP,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;GACA;IACE,MAAM;IACN,MAAM;GACR;EACF;CAUA;AACF,GCzMac,gBAA8B;CACzCC,mBAAmB,CAAA;CACnBC,aAAa;CACbC,eAAe;CACfC,qBAAqB;CACrBC,iBAAiB;CACjBC,eAAe;CACfC,eAAe;CACfC,YAAY;CACZC,MAAMhB;CACNiB,8BAA8B,CAAA;CAC9BC,mBAAmB,CAAC,WAAW,SAAS;AAC1C;;;;AAKA,SAASC,oBAAoBC,QAE3B;CAWA,OATIA,OAAOZ,qBAAqBY,OAAOZ,kBAAkBc,SAAS,IACzD,EAACd,mBAAmBY,OAAOZ,kBAAiB,IAIjDY,OAAOX,gBAAgB,aAClB,EAACD,mBAAmB,CAAC,SAAS,EAAC,IAGjC,EAACA,mBAAmB,CAAA,EAAE;AAC/B;AAEA,MAAae,WAAWzB,cAA4C0B,eAAe;CAEjF,IAAI,OAAOA,cAAe,YAAY,mBAAmBA,YAAY;EACnE,IAAMC,2BAA2BD,WAAWE;EAC5C,AAAKF,WAAWd,kBACVe,6BAA6B,eAC/BD,WAAWd,gBAAgB,UAEzBe,6BAA6B,YAC/BD,WAAWd,gBAAgB;CAGjC;CACA,IAAMU,SAAuB;EAC3B,GAAGb;EACH,GAAGiB;EACH,GAAGL,oBAAoBK,cAAc,CAAC,CAAC;CACzC;CACA,OAAO;EACLG,MAAM;EACNC,QAAQ,EACNC,OAAO,CACL,GAAG1B,aACH;GACE,GAAGD;GACH,GAAGD,wBAAwBmB,MAAM;EACnC,CAAC,EAEL;EACAU,OAAOV,OAAOJ,SAAS,KAAQe,KAAAA,IAAY,CAAChC,iBAAiBqB,MAAM,CAAC;CACtE;AACF,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["ToolIcon","$","_c","t0","Symbol","for","MuxPlayerElement","ObjectInputProps","PartialDeep","StaticRenditionResolution","MuxInputConfig","static_renditions","mp4_support","max_resolution_tier","encoding_tier","video_quality","normalize_audio","defaultSigned","defaultPublic","defaultDrm","defaultAutogeneratedSubtitleLangs","SupportedMuxLanguage","defaultAutogeneratedSubtitleLang","disableUploadConfig","disableTextTrackConfig","disableDrmPlaybackWarning","acceptedMimeTypes","maxAssetFileSize","maxAssetDuration","hlsConfig","PluginConfig","tool","title","icon","React","ComponentType","allowedRolesForConfiguration","SUPPORTED_MUX_LANGUAGES","label","code","state","const","SUPPORTED_MUX_LANGUAGES_VALUES","map","l","TextTrack","_id","name","AutogeneratedTextTrack","type","language_code","CustomTextTrack","file","contents","size","isCustomTextTrack","track","Partial","UploadTextTrack","isAutogeneratedTrack","WatermarkConfig","enabled","imageUrl","imageAspectRatio","overlay_settings","MuxOverlaySettings","position","x","y","opacity","vertical_align","vertical_margin","horizontal_align","horizontal_margin","width","height","UploadConfig","Pick","text_tracks","signed_policy","public_policy","watermark","drm_policy","MuxNewAssetSettings","resolution","input","url","generated_subtitles","passthrough","start_time","end_time","text_type","closed_captions","playback_policy","PlaybackPolicy","advanced_playback_policies","AdvancedPlaybackPolicy","policy","drm_configuration_id","Secrets","token","secretKey","enableSignedUrls","signingKeyId","signingKeyPrivate","drmConfigId","MuxImageOrigin","MuxThumbnailUrl","MuxAnimatedThumbnailUrl","MuxVideoOrigin","MuxVideoUrl","FitMode","ThumbnailOptions","fit_mode","time","AnimatedThumbnailOptions","start","end","fps","AssetThumbnailOptions","asset","VideoAssetDocument","MuxErrors","messages","MuxPlaybackId","id","MuxVideoTrack","max_width","max_height","max_frame_rate","duration","MuxAudioTrack","max_channels","max_channel_layout","MuxTextTrack","text_source","status","error","MuxTrack","MuxAsset","created_at","max_stored_resolution","max_stored_frame_rate","aspect_ratio","playback_ids","tracks","errors","upload_id","is_live","live_stream_id","master","master_access","source_asset_id","files","ext","bitrate","filesize","resolution_tier","recording_times","started_at","non_standard_input_reasons","video_codec","audio_codec","video_gop_size","video_frame_rate","video_resolution","video_bitrate","pixel_aspect_ratio","video_edit_list","audio_edit_list","unexpected_media_file_parameters","test","meta","_type","_createdAt","_updatedAt","assetId","playbackId","filename","thumbTime","data","Reference","_ref","MuxInputProps","Button","Card","Dialog","Stack","Text","createContext","useCallback","useContext","useMemo","useState","PluginConfig","LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY","DrmPlaybackWarningContextContextProps","hasShownWarning","setHasWarnedAboutDrmPlayback","b","DrmPlaybackWarningContext","DrmPlaybackWarningContextProviderProps","config","children","React","ReactNode","DrmPlaybackWarningContextProvider","t0","$","_c","warningDisabled","disableDrmPlaybackWarning","t1","window","localStorage","getItem","hasWarned","hasWarnedAboutDrmPlayback","t2","Symbol","for","setItem","toString","setHasShownWarning","t3","value","t4","useDrmPlaybackWarningContext","context","DRMWarningDialog","onClose","_onClose","t5","t6","t7","useClient","useSanityClient","SANITY_API_VERSION","$","_c","t0","Symbol","for","apiVersion","compact","toLower","trim","uniq","words","SPECIAL_CHARS","STRIP_EDGE_CHARS","tokenize","string","match","map","token","replace","toGroqParams","terms","Record","params","reduce","acc","term","i","extractTermsFromQuery","query","quotedQueries","unquotedQuery","length","push","quotedTerms","str","remainingTerms","createConstraints","includeAssetId","searchPaths","constraints","_term","joinedPath","filter","constraint","join","createSearchFilter","useMemo","useState","collate","createHookFromObservableFactory","DocumentStore","useDocumentStore","SANITY_API_VERSION","createSearchFilter","VideoAssetDocument","ASSET_SORT_OPTIONS","createdDesc","groq","label","createdAsc","filenameAsc","filenameDesc","SortOption","useAssetDocuments","documentStore","sort","searchQuery","search","filter","Boolean","join","sortFragment","listenQuery","params","apiVersion","useAssets","$","_c","setSort","setSearchQuery","t0","t1","isLoading","t2","undefined","assetDocuments","t3","map","_temp","assets","t4","collated","draft","published","_id","id","useState","DialogState","useDialogState","SetDialogState","ReturnType","global","__PKG_VERSION__","PLUGIN_VERSION","PLUGIN_VERSION","PLUGIN_VERSION_QUERY","sanityVersion","defer","SanityClient","PLUGIN_VERSION_QUERY","SecretsDocument","_id","_type","token","secretKey","enableSignedUrls","signingKeyId","signingKeyPrivate","drmConfigId","saveSecrets","client","Promise","doc","createOrReplace","createSigningKeys","dataset","config","res","request","data","private_key","id","created_at","url","withCredentials","method","query","error","console","message","response","statusCode","Error","cause","testSecrets","status","haveValidSigningKeys","e","testSecretsObservable","observable","useCallback","SanityClient","createSigningKeys","haveValidSigningKeys","saveSecrets","testSecrets","Secrets","useSaveSecrets","client","secrets","token","secretKey","enableSignedUrls","drmConfigId","Pick","Promise","signingKeyId","signingKeyPrivate","valid","status","Error","err","console","error","hasValidSigningKeys","data","id","private_key","log","message","name","const","cacheNs","muxSecretsDocumentId","DIALOGS_Z_INDEX","MEZZANINE_LEARN_MORE_URL","THUMBNAIL_ASPECT_RATIO","MIN_ASPECT_RATIO","AUDIO_ASPECT_RATIO","useMemo","useDocumentValues","muxSecretsDocumentId","Secrets","path","useSecretsDocumentValues","$","_c","error","isLoading","value","exists","Boolean","t0","token","t1","secretKey","t2","enableSignedUrls","t3","signingKeyId","t4","signingKeyPrivate","t5","drmConfigId","t6","secrets","t7","t8","t9","isInitialSetup","needsSetup","cache","t10","useReducer","Secrets","State","Pick","submitting","error","Action","type","payload","name","value","init","token","secretKey","enableSignedUrls","drmConfigId","reducer","state","action","Error","useSecretsFormState","secrets","SanityClient","suspend","cacheNs","Secrets","_id","const","readSecrets","client","projectId","dataset","config","data","fetch","token","secretKey","enableSignedUrls","Boolean","signingKeyId","signingKeyPrivate","drmConfigId","useTheme_v2","CSSProperties","useId","useMemo","Props","height","MuxLogo","t0","$","_c","t1","undefined","id","theme","fillColor","color","_dark","titleId","t2","Symbol","for","fillRule","pathStyle","t3","t4","t5","t6","t7","t8","t9","styled","MuxLogo","Logo","span","Header","$","_c","t0","Symbol","for","Box","Flex","Stack","Text","memo","Props","children","React","ReactNode","title","description","inputId","FormField","props","$","_c","t0","t1","t2","t3","t4","t5","Box","Button","Card","Checkbox","Dialog","Flex","Inline","Stack","Text","TextInput","Code","useCallback","useEffect","useId","useMemo","useRef","clear","preload","useClient","SetDialogState","useDialogState","useSaveSecrets","useSecretsDocumentValues","useSecretsFormState","cacheNs","DIALOGS_Z_INDEX","_id","secretsId","Secrets","Header","FormField","ConfigureApiDialogProps","setDialogState","secrets","fieldNames","const","ConfigureApiDialog","t0","$","_c","client","state","dispatch","hasSecretsInitially","token","secretKey","t1","handleClose","dirty","enableSignedUrls","drmConfigId","id","t2","map","field","tokenId","secretKeyId","enableSignedUrlsId","drmConfigIdId","firstField","handleSaveSecrets","saving","t3","event","preventDefault","current","currentTarget","reportValidity","type","then","savedSecrets","projectId","dataset","config","Promise","resolve","catch","err","payload","message","finally","handleSubmit","t4","event_0","name","value","handleChangeToken","t5","event_1","handleChangeSecretKey","t6","event_2","checked","handleChangeEnableSignedUrls","t7","event_3","handleChangeDrmConfigId","t8","t9","Symbol","for","focus","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","display","t21","t22","t23","t24","signingKeyId","t25","t26","t27","t28","t29","t30","t31","t32","t33","submitting","t34","t35","t36","error","t37","t38","t39","ConfigureApi","dialogOpen","setDialogOpen","secretDocumentValues","openDialog","truncateString","generateAssetPlaceholder","assetId","isEmptyOrPlaceholderTitle","filename","trim","placeholder","MuxAsset","parseMuxDate","date","Date","Number","SanityClient","PLUGIN_VERSION_QUERY","MuxAsset","VideoAssetDocument","deleteAssetOnMux","client","assetId","dataset","config","request","url","withCredentials","method","query","deleteAsset","asset","deleteOnMux","_id","delete","getAsset","data","listAssets","options","limit","cursor","toString","next_cursor","addTextTrackFromUrl","vttUrl","language_code","name","text_type","body","type","headers","generateSubtitles","audioTrackId","generated_subtitles","deleteTextTrack","trackId","updateMasterAccess","masterAccess","master_access","useEffect","useState","defer","of","timer","concatMap","expand","tap","SanityClient","listAssets","MuxAsset","ASSETS_PER_PAGE","MuxAssetsState","cursor","loading","data","error","FetchError","hasSkippedAssetsWithoutPlayback","_tag","PageResult","next_cursor","fetchMuxAssetsPage","client","Promise","response","limit","accumulateIntermediateState","currentState","pageResult","currentData","newAssets","validAssets","skippedInThisPage","reduce","acc","asset","hasPlaybackIds","playback_ids","length","isDuplicate","some","a","id","push","undefined","hasMorePages","useMuxAssets","t0","$","_c","enabled","t1","Symbol","for","state","setState","t2","subscription","pipe","pageResult_0","prevState","subscribe","complete","_temp","unsubscribe","t3","prev","uuid","useMemo","useState","createHookFromObservableFactory","DocumentStore","useClient","useDocumentStore","generateAssetPlaceholder","parseMuxDate","MuxAsset","VideoAssetDocument","SANITY_API_VERSION","useMuxAssets","useSecretsDocumentValues","ImportState","AssetInSanity","uploadId","assetId","useImportMuxAssets","$","_c","documentStore","t0","Symbol","for","apiVersion","client","assetsInSanity","assetsInSanityLoading","useAssetsInSanity","secretDocumentValues","hasSecrets","value","secrets","secretKey","importError","setImportError","importState","setImportState","dialogOpen","t1","t2","enabled","muxAssets","t3","data","filter","a","assetExistsInSanity","undefined","missingAssets","t4","selectedAssets","setSelectedAssets","t5","closeDialog","t6","openDialog","t7","importAssets","documents","flatMap","_temp","tx","transaction","forEach","doc","create","commit","returnDocuments","t8","error","asset","muxAssetToSanityDocument","playbackId","playback_ids","find","p","id","_id","_type","_updatedAt","Date","toISOString","_createdAt","created_at","filename","meta","title","status","listenQuery","existingAssets","some","existing","upload_id","useEffect","useState","IntersectionOptions","root","Element","rootMargin","threshold","onChange","inView","useInView","ref","t0","$","_c","t1","undefined","options","setInView","t2","t3","current","observer","IntersectionObserver","t4","obs","entry","nowInView","isIntersecting","thresholds","some","intersectionRatio","toObserve","observe","unobserve","AdvancedPlaybackPolicy","MuxPlaybackId","PlaybackPolicy","VideoAssetDocument","getPlaybackId","asset","Pick","priority","TypeError","playbackIds","data","playback_ids","length","policy","match","find","entry","id","e","console","error","getPlaybackPolicy","playbackId","getPlaybackPolicyById","hasPlaybackPolicy","Partial","playback_policy","advanced_playback_policies","p","SanityClient","suspend","readSecrets","AnimatedThumbnailOptions","ThumbnailOptions","Audience","Payload","T","generateJwt","client","playbackId","aud","payload","signingKeyId","signingKeyPrivate","TypeError","default","sign","JSON","parse","stringify","_","v","undefined","atob","algorithm","keyid","audience","subject","noTimestamp","expiresIn","SanityClient","getPlaybackId","Audience","generateJwt","getPlaybackPolicyById","AssetThumbnailOptions","createUrlParamsObject","client","asset","params","audience","playbackId","searchParams","URLSearchParams","JSON","parse","stringify","_","v","undefined","playbackPolicy","policy","token","SanityClient","createUrlParamsObject","AnimatedThumbnailOptions","MuxAnimatedThumbnailUrl","AssetThumbnailOptions","AnimatedPosterSrcOptions","asset","client","getAnimatedPosterSrc","height","width","start","thumbTime","Math","max","end","fps","params","playbackId","searchParams","SanityClient","createUrlParamsObject","MuxThumbnailUrl","ThumbnailOptions","AssetThumbnailOptions","PosterSrcOptions","asset","client","getPosterSrc","fit_mode","height","time","thumbTime","undefined","width","params","playbackId","searchParams","tryWithSuspend","block","T","onError","error","Error","E","errorOrPromise","Promise","undefined","ErrorOutlineIcon","Box","Card","CardTone","Spinner","Stack","Text","Suspense","useMemo","useRef","useState","styled","useClient","useInView","THUMBNAIL_ASPECT_RATIO","getAnimatedPosterSrc","getPosterSrc","tryWithSuspend","AssetThumbnailOptions","MuxAnimatedThumbnailUrl","MuxThumbnailUrl","Image","img","ImageStatus","STATUS_TO_TONE","Record","loading","error","loaded","VideoThumbnail","asset","width","staticImage","posterWidth","client","ref","HTMLDivElement","inView","status","setStatus","setError","thumbnailSrc","thumbnail","err","Error","handleError","message","undefined","handleLoad","aspectRatio","position","maxWidth","flex","left","top","transform","justifyItems","fontSize","filename","assetId","opacity","CheckmarkCircleIcon","ErrorOutlineIcon","InfoOutlineIcon","RetrieveIcon","RetryIcon","Box","Button","Card","Checkbox","Dialog","Flex","Heading","Spinner","Stack","Text","Code","truncateString","useFormattedDuration","styled","useImportMuxAssets","DIALOGS_Z_INDEX","MuxAsset","VideoThumbnail","MissingAssetCheckbox","MissingAsset","t0","$","_c","asset","selectAsset","selected","duration","t1","id","t2","undefined","t3","Symbol","for","position","t4","e","currentTarget","checked","t5","t6","t7","playback_ids","find","_temp","t8","assetId","data","filename","playbackId","t9","t10","t11","formatted","t12","t13","created_at","Date","Number","toLocaleDateString","year","day","month","t14","t15","t16","t17","p","ImportVideosDialog","props","importState","canTriggerImport","selectedAssets","length","isImporting","noAssetsToImport","missingAssets","muxAssets","loading","assetsInSanityLoading","closeDialog","importAssets","hasSkippedAssetsWithoutPlayback","error","importError","textAlign","display","selectAll","setSelectedAssets","map","filter","a","some","a_0","ImportVideosFromMux","hasSecrets","dialogOpen","openDialog","ChevronLeftIcon","ChevronRightIcon","Button","Label","Dispatch","SetStateAction","useEffect","PageSelector","props","$","_c","page","setPage","t0","t1","total","clamped","Math","min","max","t2","Symbol","for","cursor","t3","t4","p","t5","t6","t7","t8","t9","t10","p_0","t11","t12","MuxAsset","addKeysToMuxData","data","tracks","map","track","index","_key","id","playback_ids","playbackId","static_renditions","files","file","undefined","useMemo","useState","createHookFromObservableFactory","DocumentStore","useClient","useDocumentStore","addKeysToMuxData","isEmptyOrPlaceholderTitle","VideoAssetDocument","SANITY_API_VERSION","useMuxAssets","useSecretsDocumentValues","ResyncState","useResyncMuxMetadata","$","_c","documentStore","t0","Symbol","for","apiVersion","client","sanityAssets","sanityAssetsLoading","useSanityAssets","secretDocumentValues","hasSecrets","value","secrets","secretKey","resyncError","setResyncError","resyncState","setResyncState","dialogOpen","t1","t2","enabled","muxAssets","t3","data","map","sanityDoc","muxAsset","find","m","id","assetId","muxTitle","meta","title","currentTitle","filename","undefined","matchedAssets","t4","closeDialog","t5","openDialog","t6","syncAllVideos","tx","transaction","forEach","matched","newTitle","patch","_id","set","commit","returnDocuments","t7","error","syncOnlyEmpty","tx_0","matched_0","t8","syncFullData","tx_1","matched_1","dataWithKeys","status","t9","listenQuery","CheckmarkCircleIcon","ErrorOutlineIcon","SyncIcon","Box","Button","Card","Dialog","Flex","Heading","Radio","Spinner","Stack","Text","useState","useResyncMuxMetadata","isEmptyOrPlaceholderTitle","DIALOGS_Z_INDEX","SyncOption","OptionCardProps","id","selected","onSelect","title","count","description","disabled","OptionCard","t0","$","_c","t1","t2","t3","t4","cursor","opacity","t5","t6","t7","t8","t9","t10","t11","ResyncMetadataDialog","props","resyncState","matchedAssets","filter","_temp","length","videosToUpdate","_temp2","videosWithEmptyOrPlaceholder","hasEmptyTitles","defaultOption","selectedOption","setSelectedOption","canTriggerResync","isResyncing","isDone","isLoading","muxAssets","loading","sanityAssetsLoading","bb54","syncOnlyEmpty","syncAllVideos","syncFullData","handleSync","closeDialog","error","resyncError","textAlign","m_0","m","muxAsset","muxTitle","currentTitle","ResyncMetadata","resyncMetadata","hasSecrets","dialogOpen","openDialog","SortIcon","Button","Menu","MenuButton","MenuItem","PopoverProps","useId","ASSET_SORT_OPTIONS","SortOption","CONTEXT_MENU_POPOVER_PROPS","constrainSize","placement","portal","width","SelectSortOptions","props","$","_c","id","t0","Symbol","for","cursor","t1","Object","entries","t2","map","t3","type","t4","label","setSort","sort","Box","Spinner","SpinnerBox","React","FC","$","_c","t0","Symbol","for","display","alignItems","justifyContent","minHeight","Flex","Text","IconInfo","React","FC","text","icon","size","muted","props","$","_c","Icon","t0","t1","t2","t3","t4","t5","SVGProps","ResolutionIcon","props","$","_c","t0","Symbol","for","t1","SVGProps","StopWatchIcon","props","$","_c","t0","t1","t2","Symbol","for","t3","useToast","useCallback","useEffect","useMemo","useState","getAsset","updateMasterAccess","addKeysToMuxData","MuxAsset","VideoAssetDocument","useClient","MezzanineStatus","POLL_INTERVAL_MS","UseMezzanineReturn","status","busy","expired","resolution","enable","Promise","download","getMezzanineStatus","asset","master","data","url","useMezzanine","client","toast","setBusy","setExpired","prevAssetId","setPrevAssetId","assetId","max_resolution_tier","max_stored_resolution","undefined","persist","_id","patch","set","commit","returnDocuments","refresh","cancelled","running","interval","setInterval","clearInterval","error","console","push","title","description","Error","message","triggerMezzanineDownload","masterUrl","window","anchor","document","createElement","href","target","rel","body","appendChild","click","removeChild","Stack","Text","MezzanineExplanation","$","_c","t0","Symbol","for","DownloadIcon","Button","Card","Flex","Label","Spinner","Stack","Text","useMezzanine","MEZZANINE_LEARN_MORE_URL","VideoAssetDocument","MezzanineExplanation","Props","asset","withExplanation","Mezzanine","t0","$","_c","t1","undefined","status","busy","expired","resolution","enable","download","assetReady","data","isReady","isPreparing","showExplanation","t2","Symbol","for","t3","t4","t5","t6","t7","t8","t9","color","t10","t11","t12","t13","useToast","useCallback","useState","getAsset","addKeysToMuxData","MuxAsset","VideoAssetDocument","useClient","ResyncAssetState","UseResyncAssetOptions","showToast","onSuccess","updatedData","onError","error","UseResyncAssetReturn","resyncState","resyncError","resyncAsset","asset","Promise","isResyncing","useResyncAsset","options","client","toast","setResyncState","setResyncError","assetId","push","title","description","status","Error","undefined","_id","response","muxData","data","dataWithKeys","patch","set","meta","filename","commit","returnDocuments","console","SanityClient","getAsset","generateJwt","getPlaybackId","getPlaybackPolicy","MuxTextTrack","VideoAssetDocument","extractErrorMessage","error","defaultMessage","message","err","response","body","match","includes","parts","split","length","replace","trim","PollTrackStatusOptions","client","assetId","trackName","trackLanguageCode","maxAttempts","onTrackFound","track","onTrackErrored","onTrackReady","PollTrackStatusResult","found","status","pollTrackStatus","options","Promise","trimmedName","trimmedLanguageCode","newTrack","attempts","trackFound","findTrack","textTracks","foundTrack","find","name","language_code","resolve","setTimeout","assetData","data","tracks","filter","type","console","undefined","downloadVttFile","asset","id","Error","playbackId","playbackPolicy","policy","downloadUrl","token","fetch","ok","statusText","blob","blobUrl","URL","createObjectURL","link","document","createElement","href","download","filename","appendChild","click","removeChild","revokeObjectURL","TranslateIcon","UploadIcon","Button","Card","Checkbox","Dialog","Flex","Label","Spinner","Stack","Text","TextInput","Autocomplete","useToast","LanguagesList","useId","useRef","useState","addTextTrackFromUrl","generateSubtitles","getAsset","useClient","addKeysToMuxData","extractErrorMessage","pollTrackStatus","MuxTextTrack","SUPPORTED_MUX_LANGUAGES","VideoAssetDocument","LANGUAGE_OPTIONS","getAllCodes","map","code","value","label","getNativeName","MUX_LANGUAGE_OPTIONS","lang","Props","asset","onAdd","track","onClose","AddCaptionDialog","client","toast","dialogId","isAutogenerated","setIsAutogenerated","vttUrl","setVttUrl","languageCode","setLanguageCode","selectedLanguage","setSelectedLanguage","name","setName","isSubmitting","setIsSubmitting","selectedFile","setSelectedFile","File","fileInputRef","HTMLInputElement","uploadVttFile","file","Promise","assetDocument","assets","upload","filename","url","refreshAssetData","_id","assetId","latestAssetData","dataWithKeys","data","patch","set","status","commit","returnDocuments","refreshError","console","error","handleAddTrackFromUrl","Error","trimmedName","trim","trimmedLanguageCode","vttUrlToUse","uploadError","push","title","description","language_code","text_type","result","trackName","trackLanguageCode","onTrackErrored","errorMessage","messages","type","found","handleGenerateSubtitles","assetData","audioTrack","tracks","find","id","mockTrackId","Date","now","Math","random","toString","slice","mockTrack","text_source","handleSubmit","URL","display","e","currentTarget","checked","current","click","target","files","length","textAlign","newValue","options","selected","opt","query","option","toLowerCase","indexOf","l","verticalAlign","marginBottom","width","height","marginRight","DownloadIcon","TranslateIcon","UploadIcon","Button","Card","Dialog","Flex","Label","Spinner","Stack","Text","TextInput","Autocomplete","useToast","LanguagesList","useEffect","useId","useRef","useState","addTextTrackFromUrl","deleteTextTrack","getAsset","useClient","addKeysToMuxData","generateJwt","getPlaybackId","getPlaybackPolicy","downloadVttFile","extractErrorMessage","pollTrackStatus","MuxTextTrack","VideoAssetDocument","LANGUAGE_OPTIONS","getAllCodes","map","code","value","label","getNativeName","Props","asset","track","onUpdate","oldTrackId","onClose","EditCaptionDialog","client","toast","dialogId","isAutogenerated","text_source","vttUrl","setVttUrl","languageCode","setLanguageCode","language_code","selectedLanguage","setSelectedLanguage","baseCode","split","found","find","opt","name","foundByName","setName","isSubmitting","setIsSubmitting","downloading","setDownloading","selectedFile","setSelectedFile","File","fileInputRef","HTMLInputElement","foundByCode","handleDownloadCurrentFile","error","errorMessage","title","Error","message","includes","push","status","description","getCurrentFileName","id","filename","uploadVttFile","file","Promise","assetDocument","assets","upload","url","refreshAssetData","_id","assetId","latestAssetData","dataWithKeys","data","patch","set","commit","returnDocuments","refreshError","console","handleUpdateTrackWithNewUrl","trimmedName","trim","trimmedLanguageCode","deleteError","vttUrlToUse","uploadError","text_type","result","trackName","trackLanguageCode","onTrackErrored","erroredTrack","messages","type","handleSubmit","originalVttUrl","playbackId","policy","token","urlChanged","URL","verticalAlign","display","marginTop","width","height","current","click","e","target","files","length","currentTarget","newValue","selected","query","option","toLowerCase","indexOf","l","marginBottom","marginRight","AddIcon","ChevronDownIcon","ChevronUpIcon","DownloadIcon","EditIcon","ErrorOutlineIcon","TrashIcon","Box","Button","Card","Dialog","Flex","Heading","Spinner","Stack","Text","useToast","useEffect","useId","useMemo","useState","deleteTextTrack","useClient","useResyncAsset","downloadVttFile","MuxTextTrack","VideoAssetDocument","AddCaptionDialog","EditCaptionDialog","TrackCardProps","track","iconOnly","downloadingTrackId","deletingTrackId","trackToEdit","getTrackSourceLabel","handleDownload","setTrackToEdit","setTrackToDelete","TrackCard","t0","$","_c","t1","id","action","isDisabled","t2","status","width","height","verticalAlign","display","marginBottom","marginTop","undefined","renderActionButtons","t3","t4","name","t5","t6","t7","t8","color","t9","t10","language_code","t11","error","messages","type","t12","t13","t14","t15","TextTracksManagerProps","asset","tracks","collapseTracks","TextTracksManager","propTracks","client","toast","dialogId","resyncAsset","setDownloadingTrackId","setDeletingTrackId","addedTracks","setAddedTracks","updatedTracks","setUpdatedTracks","Map","trackActivityOrder","setTrackActivityOrder","autogeneratedTrackIds","setAutogeneratedTrackIds","Set","trackToDelete","showAddDialog","setShowAddDialog","isExpanded","setIsExpanded","MAX_VISIBLE_TRACKS","realTracks","data","filter","activeTracks","allTracks","tracksWithUpdates","map","updated","get","isMockTrackReplaced","mockTrack","realTracksList","startsWith","some","realTrack","nameMatches","languageMatches","isGenerated","text_source","isTrackAlreadyInRealTracks","addedTrack","tracksToKeep","newAutogeneratedIds","forEach","add","find","rt","prev","hasNew","has","preparingTracks","length","assetId","_id","interval","setInterval","muxData","fetchedTracks","fetchedTracksList","findMatchingRealTrack","tracksList","replaced","prevOrder","mockOrder","newMap","set","size","prevIds","console","clearInterval","visibleTracks","sort","a","b","orderA","orderB","aIsPreparing","bIsPreparing","aIsAutogenerated","bIsAutogenerated","push","title","description","Error","message","confirmDelete","t","delete","handleAddTrack","handleUpdateTrack","updatedTrack","oldTrackId","isAddedTrack","displayedTracks","slice","hasMoreTracks","minHeight","alignItems","justifyContent","createContext","useContext","useMemo","DialogState","SetDialogState","DialogStateContextProps","dialogState","setDialogState","DialogStateContext","DialogStateProviderProps","children","React","ReactNode","DialogStateProvider","t0","$","_c","t1","value","t2","useDialogStateContext","context","SanityClient","generateJwt","MuxPlaybackId","MuxVideoUrl","VideoSrcOptions","muxPlaybackId","client","getVideoSrc","searchParams","URLSearchParams","policy","token","id","set","Dialog","Stack","useId","useDialogStateContext","VideoAssetDocument","TextTracksManager","Props","asset","CaptionsDialog","t0","$","_c","setDialogState","dialogId","t1","t2","t3","formatSeconds","seconds","Number","isNaN","hrs","mins","secs","ret","formatSecondsToHHMMSS","Math","floor","toString","padStart","isValidTimeFormat","time","regex","test","getSecondsFromTimeFormat","hh","mm","ss","split","map","Button","Dialog","Flex","Stack","Text","TextInput","useId","useMemo","useState","getDevicePixelRatio","useDialogStateContext","useClient","formatSecondsToHHMMSS","getSecondsFromTimeFormat","isValidTimeFormat","VideoAssetDocument","VideoThumbnail","Props","asset","currentTime","EditThumbnailDialog","t0","$","_c","t1","undefined","client","setDialogState","dialogId","t2","timeFormatted","setTimeFormatted","nextTime","setNextTime","inputError","setInputError","t3","thumbTime","assetWithNewThumbnail","saving","setSaving","saveThumbnailError","setSaveThumbnailError","t4","_id","patch","set","commit","returnDocuments","then","catch","finally","handleSave","t5","Symbol","for","maxDpr","width","t6","event","value","currentTarget","totalSeconds","handleInputChange","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","SVGProps","AudioIcon","props","$","_c","t0","Symbol","for","opacity","t1","Box","Dialog","Stack","useId","useDialogStateContext","getMezzanineStatus","DIALOGS_Z_INDEX","VideoAssetDocument","Mezzanine","MezzanineExplanation","Props","asset","onClose","MezzanineDialog","t0","$","_c","setDialogState","dialogId","t1","closing","t2","status","showExplanation","t3","t4","t5","t6","MuxPlayerProps","MuxPlayerRefAttributes","MuxPlayer","ErrorOutlineIcon","Card","Text","PropsWithChildren","Suspense","useMemo","useRef","useState","PLUGIN_VERSION","useDialogStateContext","useClient","AUDIO_ASPECT_RATIO","MIN_ASPECT_RATIO","generateJwt","getPlaybackId","getPlaybackPolicyById","getPosterSrc","getVideoSrc","tryWithSuspend","VideoAssetDocument","CaptionsDialog","EditThumbnailDialog","AudioIcon","MezzanineDialog","VideoPlayer","asset","thumbnailWidth","children","hlsConfig","props","forceAspectRatio","Partial","Pick","client","dialogState","isAudio","assetIsAudio","muxPlayer","playerContainerRef","HTMLDivElement","error","setError","Error","playbackId","e","TypeError","cause","undefined","muxPlaybackId","src","poster","width","signedToken","url","URL","searchParams","get","drmToken","policy","tokens","playback","thumbnail","storyboard","drm","partialTokens","height","data","aspect_ratio","split","map","Number","targetAspectRatio","isNaN","aspectRatio","Math","max","position","display","alignItems","padding","top","left","zIndex","player_name","player_version","page_type","objectFit","alignSelf","transform","marginRight","message","current","currentTime","max_stored_resolution","WarningOutlineIcon","SanityDocument","GeneralPreviewLayoutKey","SanityDefaultPreview","MissingSchemaTypeProps","layout","value","getUnknownTypeFallback","id","typeName","title","subtitle","media","MissingSchemaType","props","$","_c","t0","_id","_type","t1","useTimeAgo","TimeAgoProps","time","Date","TimeAgo","t0","$","_c","timeAgo","t1","EditIcon","Box","Text","Tooltip","PreviewValue","SanityDocument","TextWithTone","TimeAgo","DraftStatus","props","$","_c","document","updatedAt","_updatedAt","t0","t1","t2","t3","Symbol","for","t4","t5","PublishIcon","Box","Text","Tooltip","PreviewValue","SanityDocument","TextWithTone","TimeAgo","PublishedStatus","props","$","_c","document","updatedAt","_updatedAt","t0","t1","t2","t3","Symbol","for","t4","t5","Inline","isNumber","isString","isValidElement","useMemo","useObservable","SanityDocument","SchemaType","DocumentPresence","DocumentPreviewPresence","DocumentPreviewStore","GeneralPreviewLayoutKey","getPreviewStateObservable","getPreviewValueWithFallback","isRecord","SanityDefaultPreview","DraftStatus","PublishedStatus","PaneItemPreviewProps","documentPreviewStore","icon","React","ComponentType","layout","presence","schemaType","value","PaneItemPreview","props","$","_c","title","t0","_id","observable","t1","Symbol","for","isLoading","snapshot","original","t2","length","status","t3","fallback","t4","t5","DocumentIcon","useMemo","CollatedHit","SanityDocument","SchemaType","PreviewCard","useDocumentPresence","useDocumentPreviewStore","useSchema","IntentLink","MissingSchemaType","PaneItemPreview","DocumentPreviewProps","schemaType","documentPair","getIconWithFallback","icon","React","ComponentType","defaultIcon","DocumentPreview","props","$","_c","doc","draft","published","id","documentPreviewStore","schema","documentPresence","hasSchemaType","Boolean","name","get","t0","bb0","t1","undefined","t2","children","SanityDocument","Box","Card","Text","collate","useSchema","styled","DocumentPreview","SpinnerBox","Container","props","theme","sanity","color","base","fg","fonts","text","sizes","VideoReferences","React","FC","references","isLoaded","$","_c","schema","t0","Symbol","for","length","T0","documentPairs","map","documentPair","schemaType","get","type","id","overflow","t1","TrashIcon","Box","Button","Card","Checkbox","Dialog","Flex","Heading","Stack","Text","useToast","useEffect","useState","SanityDocument","deleteAsset","useClient","DIALOGS_Z_INDEX","VideoAssetDocument","SpinnerBox","VideoReferences","DeleteDialog","t0","$","_c","asset","references","referencesLoading","cancelDelete","succeededDeleting","client","state","setState","deleteOnMux","setDeleteOnMux","toast","t1","length","t2","t3","confirmDelete","worked","push","title","status","description","t4","Symbol","for","minHeight","display","alignItems","justifyContent","t5","t6","marginBottom","t7","_temp","margin","some","s","t8","t9","t10","t11","prev","createHookFromObservableFactory","DocumentStore","SanityDocument","SANITY_API_VERSION","useDocReferences","documentStore","id","listenQuery","apiVersion","formatSeconds","MuxTextTrack","VideoAssetDocument","getVideoMetadata","doc","id","assetId","_id","date","data","created_at","Date","Number","_createdAt","_updatedAt","now","title","filename","slice","playbackId","createdAt","duration","undefined","playback_ids","aspect_ratio","max_stored_resolution","max_stored_frame_rate","text_tracks","tracks","filter","track","type","useToast","useMemo","useState","useDocumentStore","useClient","useDocReferences","useResyncAsset","getVideoMetadata","VideoAssetDocument","VideoDetailsState","VideoDetailsProps","closeDialog","asset","autoPlay","useVideoDetails","props","$","_c","documentStore","toast","client","t0","_id","id","references","referencesLoading","t1","originalAsset","setOriginalAsset","filename","setFilename","modified","t2","displayInfo","state","setState","t3","Symbol","for","showToast","resyncAsset","isResyncing","t4","handleResync","t5","handleClose","t6","confirmClose","shouldClose","t7","saveChanges","patch","set","commit","prev","push","title","description","status","t8","error","CalendarIcon","CheckmarkIcon","ClockIcon","CropIcon","EditIcon","ErrorOutlineIcon","RevertIcon","SearchIcon","SyncIcon","TagIcon","TrashIcon","Button","Card","Dialog","Flex","Heading","Spinner","Stack","Tab","TabList","TabPanel","Text","TextInput","useEffect","useRef","useState","DIALOGS_Z_INDEX","MuxPlaybackId","MuxTextTrack","PlaybackPolicy","FormField","IconInfo","ResolutionIcon","StopWatchIcon","Mezzanine","TextTracksManager","VideoPlayer","DeleteDialog","useVideoDetails","VideoDetailsProps","VideoReferences","AssetInput","React","FC","label","description","placeholder","value","onInput","e","FormEvent","HTMLInputElement","disabled","props","$","_c","t0","t1","VideoDetails","tab","setTab","displayInfo","filename","modified","references","referencesLoading","setFilename","state","setState","handleClose","confirmClose","saveChanges","handleResync","isResyncing","isSaving","containerHeight","setContainerHeight","contentsRef","Symbol","for","current","getBoundingClientRect","height","t2","title","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","asset","closeDialog","t13","textAlign","t14","containerType","t15","t16","minHeight","undefined","t17","autoPlay","t18","t19","text_tracks","data","tracks","filter","_temp","t20","t21","t22","t23","t24","length","t25","t26","t27","t28","t29","t30","wordBreak","t31","t32","currentTarget","t33","t34","t35","duration","t36","max_stored_resolution","t37","max_stored_frame_rate","t38","aspect_ratio","t39","createdAt","toLocaleDateString","year","month","day","hour","minute","hour12","t40","t41","t42","id","t43","t44","playback_ids","t45","t46","t47","t48","t49","t50","t51","t52","t53","t54","PlaybackIds","map","_temp2","policyToText","policy","track","type","entry","CalendarIcon","ClockIcon","TagIcon","Inline","Stack","Text","getVideoMetadata","VideoAssetDocument","IconInfo","VideoMetadata","props","$","_c","asset","T0","T1","t0","t1","t2","t3","t4","t5","displayInfo","title","wordWrap","duration","createdAt","toISOString","split","id","slice","t6","t7","CheckmarkIcon","EditIcon","LockIcon","PlayIcon","Button","Card","Stack","Text","Tooltip","useCallback","useState","styled","DRMWarningDialog","useDrmPlaybackWarningContext","THUMBNAIL_ASPECT_RATIO","getPlaybackPolicy","VideoAssetDocument","IconInfo","AudioIcon","VideoMetadata","VideoPlayer","assetIsAudio","VideoThumbnail","PlayButton","button","RenderState","VideoInBrowser","t0","$","_c","onSelect","onEdit","asset","renderVideo","setRenderVideo","t1","select","t2","edit","hasShownWarning","t3","playbackPolicy","t4","policy","onClickPlay","t5","Symbol","for","position","t6","borderRadius","left","top","zIndex","t7","color","t8","gridTemplateRows","t9","t10","aspectRatio","display","alignItems","justifyContent","t11","t12","width","gap","t13","flex","t14","t15","t16","t17","t18","SearchIcon","Card","Flex","Grid","Inline","Label","Stack","Text","TextInput","useMemo","useState","DrmPlaybackWarningContextProvider","useAssets","PluginConfig","VideoAssetDocument","ConfigureApi","ImportVideosFromMux","PageSelector","ResyncMetadata","SelectSortOptions","SpinnerBox","VideoDetailsProps","VideoDetails","VideoInBrowser","VideosBrowserProps","config","onSelect","asset","VideosBrowser","t0","$","_c","assets","isLoading","searchQuery","setSearchQuery","setSort","sort","page","setPage","pageTotal","Math","floor","length","editedAsset","setEditedAsset","t1","find","a","_id","freshEditedAsset","pageStart","pageEnd","placement","t2","Symbol","for","minHeight","t3","e","currentTarget","value","t4","t5","t6","t7","t8","t9","t10","t11","gridTemplateColumns","t12","t13","slice","map","t14","t15","t16","t17","t18","t19","Tool","PluginConfig","ToolIcon","VideosBrowser","StudioTool","React","FC","config","$","_c","t0","DEFAULT_TOOL_CONFIG","icon","title","createStudioTool","toolConfig","tool","name","component","props","useCurrentUser","PluginConfig","useAccessControl","config","$","_c","user","t0","roles","allowedRolesForConfiguration","length","some","role","includes","name","hasConfigAccess","t1","isReference","useDocumentValues","Reference","VideoAssetDocument","path","useAssetDocumentValues","asset","_ref","useMemo","useRef","useDataset","useProjectId","useSWR","useClient","addKeysToMuxData","PLUGIN_VERSION_QUERY","MuxAsset","VideoAssetDocument","useMuxPolling","asset","client","projectId","dataset","isPreparingStaticRenditions","data","static_renditions","status","files","length","some","file","shouldFetch","assetId","errorLoggedRef","request","url","withCredentials","method","query","_id","patch","set","commit","returnDocuments","current","error","console","documentId","refreshInterval","refreshWhenHidden","dedupingInterval","Button","Card","Flex","Grid","Heading","Inline","Text","useToast","memo","useCallback","useRef","scrollIntoView","clear","useErrorBoundary","name","MuxInputProps","Props","Pick","children","React","ReactNode","ErrorBoundaryCard","props","$","_c","schemaType","push","pushToast","errorRef","t0","onDidCatch","err","errorInfo","console","group","toString","groupCollapsed","error","groupEnd","stack","log","componentStack","status","title","description","transform","current","behavior","scrollMode","block","ErrorBoundary","didCatch","reset","t1","handleRetry","t2","Symbol","for","t3","t4","t5","message","t6","t7","Box","Card","Flex","Spinner","Text","InputFallback","$","_c","t0","Symbol","for","padding","t1","aspectRatio","width","borderRadius","t2","t3","PlugIcon","Button","Card","Flex","Grid","Heading","Inline","Text","useCallback","useAccessControl","SetDialogState","PluginConfig","MuxLogo","OnboardProps","setDialogState","config","Onboard","props","$","_c","t0","handleOpen","hasConfigAccess","t1","Symbol","for","padding","t2","t3","aspectRatio","width","boxShadow","t4","t5","height","t6","t7","UpChunk","Observable","createUpChunkObservable","uuid","uploadUrl","source","File","type","id","percent","subscriber","upchunk","createUpload","endpoint","file","dynamicChunkSize","successHandler","next","complete","errorHandler","data","CustomEvent","error","Error","detail","message","progressHandler","offlineHandler","pause","onlineHandler","resume","on","abort","formatDriveShareLink","url","formatExportLink","id","trimmed","trim","parsed","URL","hostname","Error","searchParams","get","length","path","pathname","split","includes","index","findIndex","value","fileId","at","folderId","roundPxString","value","undefined","trimmed","trim","endsWith","n","Number","slice","isFinite","rounded","Math","round","uuid","generateUuid","concat","defer","from","Observable","of","throwError","catchError","mergeMap","mergeMapTo","switchMap","SanityClient","createUpChunkObservable","formatDriveShareLink","PLUGIN_VERSION_QUERY","roundPxString","MuxAsset","MuxNewAssetSettings","WatermarkConfig","getAsset","testSecretsObservable","sanitizeOverlaySettingsInPlace","settings","inputs","input","overlay","overlay_settings","Record","hm","vm","w","sanitizePxStringsInJson","json","replace","_match","num","n","Number","isFinite","rounded","Math","round","cancelUpload","client","observable","request","url","config","dataset","withCredentials","method","query","uploadUrl","watermark","testUrl","pipe","validUrl","type","const","status","Error","muxBody","JSON","stringify","filename","split","slice","headers","result","asset","results","document","id","uploadFile","file","File","testFile","fileOptions","body","sanityAssetId","upload","cors_origin","new_asset_settings","timeout","event","updateAssetDocumentFromUpload","doc","err","UploadResponse","data","asset_id","static_renditions","resolution","passthrough","playback_policies","getUpload","assetId","pollUpload","Promise","maxTries","pollInterval","tries","resolve","reject","setInterval","window","clearInterval","_watermark","_id","_type","playbackId","playback_ids","uploadId","createOrReplace","then","optionsFromFile","error","formattedUrl","trim","parsed","URL","protocol","match","opts","preserveFilename","undefined","name","ServerError","isValidUrl","url","parsed","URL","protocol","match","isServerError","error","Error","statusCode","extractDroppedFiles","dataTransfer","DataTransfer","files","Array","from","items","length","Promise","resolve","normalizeItems","then","arr","flat","DataTransferItem","all","map","item","kind","webkitGetAsEntry","entry","FileSystemEntry","File","getAsFile","isDirectory","walk","file","getAsString","str","type","isFile","FileSystemFileEntry","FileSystemDirectoryEntry","dir","createReader","readEntries","entries","filter","entr","name","startsWith","useCallback","PatchEvent","set","setIfMissing","unset","SetDialogState","MuxInputProps","PluginConfig","VideoAssetDocument","VideosBrowser","VideosBrowserProps","Props","Pick","asset","setDialogState","config","SelectAssets","t0","$","_c","selectedAsset","onChange","t1","_id","chosenAsset","from","_type","_weak","_ref","handleSelect","t2","Dialog","useCallback","useId","styled","SetDialogState","SelectAsset","Props","SelectAssetProps","StyledDialog","InputBrowser","t0","$","_c","setDialogState","asset","onChange","config","id","t1","handleClose","t2","t3","useCallback","PatchEvent","unset","deleteAssetOnMux","useClient","MuxInputProps","VideoAssetDocument","useCancelUpload","asset","onChange","$","_c","client","t0","from","assetId","_id","delete","styled","TopControls","div","Button","Card","Flex","Inline","Stack","Text","Code","LinearProgress","styled","CardWrapper","FlexWrapper","LeftSection","CodeWrapper","UploadProgress","t0","$","_c","progress","t1","onCancel","filename","text","t2","undefined","isCancelDisabled","t3","t4","Symbol","for","t5","t6","t7","t8","t9","t10","t11","Card","Text","useEffect","useMemo","useRef","useCancelUpload","MuxInputProps","PluginConfig","VideoAssetDocument","TopControls","UploadProgress","VideoPlayer","Props","Pick","buttons","React","ReactNode","asset","config","Player","readOnly","onChange","isLoading","status","isPreparingStaticRenditions","data","static_renditions","files","length","some","file","playRef","HTMLDivElement","muteRef","handleCancelUpload","style","document","createElement","innerHTML","current","shadowRoot","appendChild","cloneNode","Error","errors","messages","join","filename","undefined","hlsConfig","background","position","top","left","color","focusRingBorderStyle","border","color","width","focusRingStyle","opts","base","bg","focusRing","offset","focusRingOutsetWidth","focusRingInsetWidth","bgColor","filter","Boolean","join","MenuItem","css","styled","focusRingStyle","FileButton","theme","focusRing","sanity","base","color","border","width","Box","ButtonProps","Flex","Text","isValidElement","useId","useCallback","isValidElementType","FileButton","FileInputMenuItemProps","Omit","accept","capture","multiple","onSelect","files","File","disabled","FileInputMenuItem","props","$","_c","Icon","fontSize","idProp","ref","rest","t0","text","textAlign","icon","id","space","undefined","idHook","t1","event","target","Array","from","handleChange","t2","t3","t4","content","t5","t6","DownloadIcon","EllipsisHorizontalIcon","ImageIcon","LockIcon","PlugIcon","ResetIcon","SearchIcon","SyncIcon","TranslateIcon","UploadIcon","Box","Button","Card","Inline","Label","Text","useClickOutsideEvent","Menu","MenuDivider","MenuItem","Popover","Tooltip","memo","useCallback","useEffect","useMemo","useState","PatchEvent","unset","styled","useAccessControl","DialogState","SetDialogState","useResyncAsset","getPlaybackPolicy","MuxInputProps","PluginConfig","VideoAssetDocument","FileInputMenuItem","LockCard","LockButton","isVideoAsset","asset","_type","PlayerActionsMenu","props","$","_c","readOnly","dialogState","setDialogState","onChange","onSelect","accept","open","setOpen","menuElement","setMenuRef","isSigned","policy","hasConfigAccess","config","t0","Symbol","for","showToast","resyncAsset","isResyncing","t1","from","onReset","t2","handleResync","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","useEffect","useState","StagedUpload","useFetchFileSize","stagedUpload","maxFileSize","fileSize","setFileSize","isLoadingFileSize","setIsLoadingFileSize","canSkipFileSizeValidation","setCanSkipFileSizeValidation","type","url","fetchFileSize","response","fetch","method","contentLength","headers","get","newFileSize","parseInt","undefined","console","warn","files","size","useEffect","useState","StagedUpload","VideoAssetMetadata","width","height","isAudioOnly","duration","size","aspectRatio","useMediaMetadata","stagedUpload","$","_c","videoAssetMetadata","setVideoAssetMetadata","isLoadingMetadata","setIsLoadingMetadata","t0","files","type","url","videoSrc","file","URL","createObjectURL","_temp","_temp2","videoElement","document","createElement","preload","metadataListeners","videoWidth","videoHeight","old_0","old","cleanupVideo","videoEl","currentVideoSrc","src","forEach","listener","removeEventListener","onerror","load","startsWith","revokeObjectURL","push","setTimeout","console","warn","listener_0","addEventListener","t1","t2","undefined","roundPxString","MuxOverlaySettings","WatermarkConfig","convertWatermarkToMuxOverlay","watermark","options","videoAspectRatio","units","enabled","imageUrl","size","opacity","toPxString","valuePercent","axis","isVertical","baseW","baseH","base","px","rounded","Math","round","normalizeToPixels","value","trimmed","trim","endsWith","n","Number","slice","isFinite","overlay_settings","widthValue","width","widthNormalized","horizontal_margin","vertical_margin","position","x","y","clampPercent","max","min","toPercentString","epsilon","isZeroish","Object","is","abs","watermarkWidthPercentOfVideoWidth","imageAspectRatio","watermarkHeightPercentOfVideoHeight","halfWidth","halfHeight","leftMargin","topMargin","marginX","marginY","overlaySettings","vertical_align","horizontal_align","formatBytes","bytes","si","dp","thresh","Math","abs","units","u","r","round","length","toFixed","CheckmarkCircleIcon","ErrorOutlineIcon","Box","Button","Card","Flex","Grid","Stack","Text","TextInput","useCallback","useEffect","useRef","useState","styled","convertWatermarkToMuxOverlay","MuxOverlaySettings","WatermarkConfig","RangeInput","input","WatermarkOverlay","div","$opacity","props","DraggableWatermarkProps","watermark","onChange","containerRef","React","RefObject","HTMLDivElement","videoElementRef","HTMLVideoElement","DraggableWatermark","isDragging","setIsDragging","dragStart","setDragStart","x","y","startPosition","setStartPosition","watermarkRef","debounceTimeoutRef","NodeJS","Timeout","localPosition","setLocalPosition","position","size","opacity","parseOpacityPercent","value","trimmed","trim","endsWith","num","Number","slice","isFinite","Math","max","min","getVideoContentBox","container","current","width","height","rect","getBoundingClientRect","containerW","containerH","videoEl","videoW","videoWidth","videoH","videoHeight","scale","contentW","contentH","offsetX","offsetY","parseOverlayValue","n","unit","px","pct","replace","computeManualStyle","overlay","w","h","isVertical","baseW","baseH","hm","horizontal_margin","vm","vertical_margin","ww","manualOpacity","toCss","v","axis","undefined","computeHorizontalStyle","horizontal_align","left","right","transform","computeVerticalStyle","vertical_align","top","bottom","hStyle","vStyle","const","cursor","debouncedOnChange","newWatermark","clearTimeout","setTimeout","handleMouseDown","e","MouseEvent","preventDefault","clientX","clientY","handleMouseMove","content","dx","dy","deltaXPercent","deltaYPercent","newX","newY","handleMouseUp","document","addEventListener","removeEventListener","imageUrl","hasManualOverlay","Boolean","overlay_settings","opacityForRender","contentBox","hasContentBox","computeWatermarkStyle","WatermarkControlsProps","onValidationChange","error","previewContainerRef","previewVideoRef","WatermarkControls","urlInput","setUrlInput","urlError","setUrlError","isValidating","setIsValidating","isValid","setIsValid","validationTimeoutRef","mode","setMode","isUpdatingRef","isValidExtension","extension","validateUrl","url","enabled","urlObj","URL","pathname","toLowerCase","img","Image","onload","imageAspectRatio","naturalWidth","naturalHeight","onerror","src","errorMsg","handleUrlChange","ChangeEvent","HTMLInputElement","target","normalizeZeroPercent","epsilon","Object","is","abs","updateOverlaySettings","next","Partial","prev","base","round","merged","padding","paddingRight","border","borderRadius","maxWidth","boxSizing","fontSize","display","alignItems","gap","color","flexShrink","flexWrap","minWidth","flex","currentTarget","sizePct","raw","nextPct","clampedPct","TranslateIcon","Box","Card","Checkbox","Flex","Stack","Text","Autocomplete","uuid","LanguagesList","Dispatch","FormField","PluginConfig","SUPPORTED_MUX_LANGUAGES","UploadTextTrack","ALL_LANGUAGE_CODES","getAllCodes","map","code","value","label","getNativeName","SUBTITLE_LANGUAGES","Record","Extract","language_code","autogenerated","lang","subtitles","captions","TrackSubAction","subAction","Partial","TrackAction","action","id","TextTracksEditor","t0","$","_c","tracks","dispatch","defaultLang","track","t1","Symbol","for","t2","display","t3","t4","_id","type","name","undefined","t5","t6","t7","t8","newValue","_temp","find","l","_temp2","t9","option_0","option","query","toLowerCase","indexOf","Checkbox","Flex","Grid","Text","ActionDispatch","CSSProperties","ReactNode","useState","UploadConfigurationStateAction","PlaybackPolicyOption","t0","$","_c","id","checked","optionName","description","dispatch","action","disabled","scale","setScale","t1","t2","t3","outline","transform","transition","cursor","borderRadius","boxStyle","t4","Symbol","for","setTimeout","triggerAnimation","t5","value","handleBoxClick","t6","descriptionJsx","t7","t8","t9","t10","WarningFilledIcon","Box","Flex","Text","CSSProperties","PlaybackPolicyWarning","$","_c","t0","Symbol","for","color","fontWeight","textStyle","t1","outline","backgroundColor","borderRadius","width","boxStyle","t2","Grid","Text","Code","ActionDispatch","Secrets","UploadConfig","UploadConfigurationStateAction","PlaybackPolicyOption","PlaybackPolicyWarning","PlaybackPolicy","t0","$","_c","id","config","secrets","dispatch","noPolicySelected","public_policy","signed_policy","drm_policy","drmPolicyDisabled","drmConfigId","t1","Symbol","for","t2","t3","t4","t5","enableSignedUrls","t6","t7","t8","Flex","Radio","Text","ActionDispatch","FormField","UploadConfig","UploadConfigurationStateAction","RESOLUTION_TIERS","value","label","const","ResolutionTierSelector","t0","$","_c","id","config","dispatch","maxSupportedResolution","t1","Symbol","for","t2","t3","map","t4","index","inputId","max_resolution_tier","e","action","currentTarget","Checkbox","Flex","Label","Radio","Stack","Text","ActionDispatch","useMemo","useState","FormField","StaticRenditionResolution","UploadConfig","UploadConfigurationStateAction","ADVANCED_RESOLUTIONS","value","label","StaticRenditionSelector","t0","$","_c","id","config","dispatch","specificResolutions","static_renditions","filter","_temp","isAdvancedMode","length","renditionMode","setRenditionMode","t1","rendition","current","hasRendition","includes","action","r_0","r","toggleRendition","t2","mode","_temp2","_temp3","handleModeChange","t3","Symbol","for","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","display","t20","map","t21","inputId","r_1","r_2","DocumentVideoIcon","ErrorOutlineIcon","UploadIcon","Box","Button","Card","Dialog","Flex","Label","Radio","Stack","Text","uuid","LanguagesList","memo","useEffect","useId","useReducer","useRef","useState","FormField","useFetchFileSize","useMediaMetadata","VideoAssetMetadata","convertWatermarkToMuxOverlay","formatBytes","formatSeconds","AutogeneratedTextTrack","CustomTextTrack","isAutogeneratedTrack","isCustomTextTrack","MuxNewAssetSettings","PluginConfig","Secrets","StaticRenditionResolution","SupportedMuxLanguage","UploadConfig","UploadTextTrack","WatermarkConfig","DraggableWatermark","WatermarkControls","TextTracksEditor","TrackAction","PlaybackPolicy","RESOLUTION_TIERS","ResolutionTierSelector","StaticRenditionSelector","StagedUpload","UploadConfigurationStateAction","action","value","VIDEO_QUALITY_LEVELS","label","const","sanitizeStaticRenditions","renditions","hasHighest","includes","hasSpecificResolutions","some","r","filter","UploadConfiguration","stagedUpload","secrets","pluginConfig","startUpload","onClose","settings","watermark","id","watermarkValidationError","setWatermarkValidationError","watermarkPreviewContainerRef","HTMLDivElement","watermarkPreviewVideoRef","HTMLVideoElement","autoTextTracks","NonNullable","video_quality","defaultAutogeneratedSubtitleLang","_id","type","language_code","name","getNativeName","current","config","dispatch","prev","Object","assign","static_renditions","max_resolution_tier","text_tracks","public_policy","signed_policy","drm_policy","target_track_i","findIndex","subAction","push","splice","enableSignedUrls","defaultSigned","defaultPublic","defaultDrm","drmConfigId","normalize_audio","validationError","setValidationError","MAX_FILE_SIZE","maxAssetFileSize","MAX_DURATION_SECONDS","maxAssetDuration","fileSize","isLoadingFileSize","canSkipFileSizeValidation","videoAssetMetadata","setVideoAssetMetadata","isLoadingMetadata","old","size","validateDuration","duration","validateFileSize","undefined","validateDrmAvailability","isAudioOnly","valid","height","width","disableTextTrackConfig","disableUploadConfig","skipConfig","formatUploadConfig","videoAspectRatio","aspectRatio","basicConfig","playbackPolicySelected","maxSupportedResolution","rt","borderRadius","files","url","map","inputId","e","currentTarget","setAdvancedPlaybackPolicy","advanced_playback_policies","policy","drm_configuration_id","console","error","options","generated_subtitles","track","inputs","length","reduce","acc","file","contents","text_type","closed_captions","imageUrl","watermarkForMux","enabled","overlaySettings","units","overlay_settings","input","resolution","WatermarkSection","t0","$","_c","onValidationChange","t1","Symbol","for","t2","t3","t4","t5","t6","watermark_0","t7","WatermarkPreview","onWatermarkChange","previewContainerRef","videoRef","URL","createObjectURL","src","revokeObjectURL","isVertical","overflow","display","justifyContent","String","maxHeight","minHeight","position","t8","top","left","objectFit","t9","t10","React","RefObject","t11","t12","t13","rem","ComponentType","css","styled","focusRingBorderStyle","focusRingStyle","withFocusRing","component","Props","$border","props","border","width","color","theme","sanity","radius","base","focusRing","Card","CardTone","useCallback","useRef","styled","withFocusRing","UploadCardWithFocusRing","UploadCardProps","tone","children","React","ReactNode","onPaste","ClipboardEventHandler","HTMLInputElement","onDrop","DragEventHandler","HTMLDivElement","onDragOver","onDragLeave","onDragEnter","UploadCard","t0","$","_c","ref","inputRef","t1","Symbol","for","event","target","HTMLElement","closest","ctrlKey","metaKey","key","current","focus","handleKeyDown","t2","t3","HiddenInput","input","attrs","type","Button","ButtonProps","useCallback","useId","useRef","styled","HiddenInput","input","Label","label","FileInputButtonProps","Omit","onSelect","files","FileList","accept","FileInputButton","t0","$","_c","props","inputId","inputRef","t1","event","target","handleSelect","t2","Symbol","for","current","click","handleButtonClick","t3","t4","width","t5","t6","DocumentVideoIcon","PlugIcon","SearchIcon","UploadIcon","Button","Card","Flex","Inline","Text","useCallback","useAccessControl","SetDialogState","PluginConfig","FileInputButton","FileInputButtonProps","formatAcceptString","accept","split","map","type","trim","replace","join","UploadPlaceholderProps","setDialogState","readOnly","hovering","needsSetup","onSelect","config","UploadPlaceholder","props","$","_c","t0","handleBrowse","t1","handleConfigureApi","hasConfigAccess","t2","t3","borderColor","undefined","t4","Symbol","for","t5","t6","t7","t8","t9","t10","t11","t12","t13","ErrorOutlineIcon","Button","CardTone","Flex","Text","useToast","useCallback","useEffect","useReducer","useRef","useState","Observable","Subject","Subscription","takeUntil","tap","SanityClient","PatchEvent","set","setIfMissing","uploadFile","uploadUrl","DialogStateProvider","DialogState","SetDialogState","isServerError","isValidUrl","extractDroppedFiles","hasPlaybackPolicy","MuxInputProps","MuxNewAssetSettings","PluginConfig","Secrets","VideoAssetDocument","InputBrowser","Player","PlayerActionsMenu","UploadConfiguration","UploadCard","UploadPlaceholder","UploadProgress","Props","Pick","config","client","secrets","asset","dialogState","setDialogState","needsSetup","StagedUpload","type","files","FileList","File","url","UploadStatus","progress","file","name","uuid","State","stagedUpload","uploadStatus","error","Error","INITIAL_STATE","UploadFileEvent","ReturnType","T","UploadUrlEvent","UploaderStateAction","action","input","NonNullable","Extract","percent","settings","Uploader","props","toast","containerRef","HTMLDivElement","dragEnteredEls","EventTarget","dragState","setDragState","cancelUploadButton","events$","observable","asObservable","handleClick","event","React","MouseEvent","HTMLButtonElement","next","current","uploadRef","uploadingDocumentId","state","dispatch","prev","Object","assign","_","payload","unsubscribe","cleanup","closed","_id","docId","delete","catch","err","console","warn","handleBeforeUnload","window","addEventListener","removeEventListener","startUpload","watermark","WatermarkConfig","uploadObservable","pipe","subscribe","onChange","from","_type","_weak","_ref","complete","invalidFileToast","push","status","title","acceptedMimeTypes","join","isInvalidFile","isInvalid","Array","some","acceptedType","pattern","replace","RegExp","test","handleUpload","handlePaste","ClipboardEventHandler","HTMLInputElement","target","HTMLElement","closest","preventDefault","stopPropagation","clipboardData","Window","DataTransfer","getData","trim","handleDrop","DragEventHandler","nativeEvent","dataTransfer","then","handleDragOver","handleDragEnter","items","mimeTypes","isValidType","handleDragLeave","idx","indexOf","splice","length","message","textAlign","tone","acceptMimeString","readOnly","Card","memo","Suspense","useAccessControl","useAssetDocumentValues","useClient","useDialogState","useMuxPolling","useSecretsDocumentValues","MuxInputProps","PluginConfig","ConfigureApiDialog","ErrorBoundaryCard","InputFallback","Onboard","Uploader","InputProps","config","Input","props","$","_c","client","secretDocumentValues","assetDocumentValues","value","asset","poll","readOnly","undefined","dialogState","setDialogState","hasConfigAccess","error","isLoading","t0","Symbol","for","t1","needsSetup","onChange","secrets","t2","schemaType","Input","VideoThumbnail","MuxInputProps","PluginConfig","VideoAssetDocument","muxVideoCustomRendering","config","components","input","props","schemaType","options","preview","select","filename","playbackId","status","assetId","thumbTime","data","prepare","asset","Partial","title","subtitle","media","muxVideoSchema","name","type","title","fields","weak","to","muxTrack","muxPlaybackId","muxStaticRenditionFile","muxStaticRenditions","of","muxMasterFile","muxAssetData","muxVideoAsset","schemaTypes","definePlugin","createStudioTool","DEFAULT_TOOL_CONFIG","muxVideoCustomRendering","muxVideoSchema","schemaTypes","PluginConfig","StaticRenditionResolution","VideoAssetDocument","defaultConfig","static_renditions","mp4_support","video_quality","max_resolution_tier","normalize_audio","defaultPublic","defaultSigned","defaultDrm","tool","allowedRolesForConfiguration","acceptedMimeTypes","convertLegacyConfig","config","Partial","length","muxInput","userConfig","deprecated_encoding_tier","encoding_tier","name","schema","types","tools","undefined"],"sources":["../src/components/icons/ToolIcon.tsx","../src/util/types.ts","../src/context/DrmPlaybackWarningContext.tsx","../src/hooks/useClient.ts","../src/util/createSearchFilter.ts","../src/hooks/useAssets.ts","../src/hooks/useDialogState.ts","../src/constants.ts","../src/util/pluginVersion.ts","../src/actions/secrets.ts","../src/hooks/useSaveSecrets.ts","../src/util/constants.ts","../src/hooks/useSecretsDocumentValues.ts","../src/hooks/useSecretsFormState.ts","../src/util/readSecrets.ts","../src/components/MuxLogo.tsx","../src/components/ConfigureApi.styled.tsx","../src/components/FormField.tsx","../src/components/ConfigureApi.tsx","../src/util/assetTitlePlaceholder.ts","../src/util/parsers.ts","../src/actions/assets.ts","../src/hooks/useMuxAssets.ts","../src/hooks/useImportMuxAssets.ts","../src/hooks/useInView.ts","../src/util/getPlaybackPolicy.ts","../src/util/generateJwt.ts","../src/util/createUrlParamsObject.ts","../src/util/getAnimatedPosterSrc.ts","../src/util/getPosterSrc.ts","../src/util/tryWithSuspend.ts","../src/components/VideoThumbnail.tsx","../src/components/ImportVideosFromMux.tsx","../src/components/PageSelector.tsx","../src/util/addKeysToMuxData.ts","../src/hooks/useResyncMuxMetadata.ts","../src/components/ResyncMetadata.tsx","../src/components/SelectSortOptions.tsx","../src/components/SpinnerBox.tsx","../src/components/IconInfo.tsx","../src/components/icons/Resolution.tsx","../src/components/icons/StopWatch.tsx","../src/hooks/useMezzanine.ts","../src/components/MezzanineExplanation.tsx","../src/components/Mezzanine.tsx","../src/hooks/useResyncAsset.ts","../src/util/textTracks.ts","../src/components/AddCaptionDialog.tsx","../src/components/EditCaptionDialog.tsx","../src/components/TextTracksManager.tsx","../src/context/DialogStateContext.tsx","../src/util/getVideoSrc.ts","../src/components/CaptionsDialog.tsx","../src/util/formatSeconds.ts","../src/components/EditThumbnailDialog.tsx","../src/components/icons/Audio.tsx","../src/components/MezzanineDialog.tsx","../src/components/VideoPlayer.tsx","../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/useAccessControl.ts","../src/hooks/useAssetDocumentValues.ts","../src/hooks/useMuxPolling.ts","../src/components/ErrorBoundaryCard.tsx","../src/components/Input.styled.tsx","../src/components/Onboard.tsx","../src/clients/upChunkObservable.ts","../src/util/formatDriveShareLink.ts","../src/util/roundPxString.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/hooks/useFetchFileSize.ts","../src/hooks/useMediaMetadata.ts","../src/util/convertWatermarkToMux.ts","../src/util/formatBytes.ts","../src/components/DraggableWatermark.tsx","../src/components/TextTracksEditor.tsx","../src/components/uploadConfiguration/PlaybackPolicyOption.tsx","../src/components/uploadConfiguration/PlaybackPolicyWarning.tsx","../src/components/uploadConfiguration/PlaybackPolicy.tsx","../src/components/uploadConfiguration/ResolutionTierSelector.tsx","../src/components/uploadConfiguration/StaticRenditionSelector.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","import type MuxPlayerElement from '@mux/mux-player'\nimport type {ObjectInputProps} from 'sanity'\nimport type {PartialDeep} from 'type-fest'\n\n/**\n * All static rendition resolution options supported by Mux\n */\nexport type StaticRenditionResolution =\n | 'highest'\n | 'audio-only'\n | '270p'\n | '360p'\n | '480p'\n | '540p'\n | '720p'\n | '1080p'\n | '1440p'\n | '2160p'\n\nexport interface MuxInputConfig {\n /**\n * Enable static renditions by default. Can be overwritten on a per-asset basis.\n * Supports:\n * - Standard mode: 'highest' (up to 4K MP4) and/or 'audio-only' (M4A)\n * - Advanced mode: Specific resolutions ('270p', '360p', '480p', '540p', '720p', '1080p', '1440p', '2160p') and/or 'audio-only'\n *\n * **Important**: 'highest' cannot be mixed with specific resolutions. If both are provided, only 'highest' will be used.\n *\n * @see {@link https://docs.mux.com/guides/video/enable-static-mp4-renditions}\n * @defaultValue []\n */\n static_renditions: StaticRenditionResolution[]\n\n /**\n * @deprecated Use `static_renditions` instead. This field is kept for backward compatibility.\n * Enable static renditions by setting this to 'standard'. Can be overwritten on a per-asset basis.\n * Requires `\"video_quality\": \"plus\"`\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 `\"video_quality\": \"plus\"`\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 * @deprecated Use {@link video_quality}\n * <br>\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 * The video quality level informs the cost, quality, and available platform features for the asset.\n * @see {@link https://www.mux.com/docs/guides/use-video-quality-levels}\n * @defaultValue 'plus'\n */\n video_quality: 'basic' | 'plus' | 'premium'\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 * Enables public URLs by default.\n * @defaultValue true\n */\n defaultPublic?: boolean\n\n /**\n * Enables DRM Protection by default, if you configured your DRM Configuration Id.\n * @see {@link https://www.mux.com/docs/guides/protect-videos-with-drm}\n * @defaultValue true\n */\n defaultDrm?: boolean\n\n /**\n * Auto-generate captions for these languages by default.\n * Requires `\"video_quality\": \"plus\"`\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 `\"video_quality\": \"plus\"`\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 /**\n * Whether or not to show the playback warning when trying to watch DRM content for the first time.\n *\n * @defaultValue false\n */\n disableDrmPlaybackWarning?: boolean\n\n /**\n * The mime types that are accepted by the input.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept}\n * @defaultValue ['video/*','audio/*']\n\n */\n acceptedMimeTypes?: ('audio/*' | 'video/*')[]\n\n /**\n * Maximum file size allowed for video uploads in bytes.\n * If not specified, no file size validation will be performed.\n *\n * @example 1024 * 1024 * 1024 // 1 GB\n * @defaultValue undefined\n */\n maxAssetFileSize?: number\n\n /**\n * Maximum video duration allowed in seconds.\n * If not specified, no duration validation will be performed.\n *\n * @example 2 * 60 * 60 // 2 hours\n * @defaultValue undefined\n */\n maxAssetDuration?: number\n\n /**\n * HLS.js configuration options to be passed to the Mux Player.\n * These options allow you to customize the underlying HLS.js playback engine behavior.\n *\n * @see {@link https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning}\n * @defaultValue undefined\n * @example\n * ```ts\n * {\n * maxBufferLength: 30,\n * lowLatencyMode: true,\n * capLevelToPlayerSize: true\n * }\n * ```\n */\n hlsConfig?: MuxPlayerElement['_hlsConfig']\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 /**\n * The roles that are allowed to configure the plugin.\n *\n * If not set, all roles will be allowed to configure the plugin.\n * @defaultValue []\n */\n allowedRolesForConfiguration: string[]\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 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\n/**\n * Watermark configuration for UI (draggable position)\n */\nexport interface WatermarkConfig {\n enabled: boolean\n imageUrl?: string\n /**\n * Aspect ratio (width / height) of the watermark image.\n * Used to convert between our center-based UI coords and Mux overlay margins.\n */\n imageAspectRatio?: number\n /**\n * Optional explicit Mux `overlay_settings`.\n * When set, these values should be used as-is for the upload request and preview.\n * @see {@link https://www.mux.com/docs/guides/add-watermarks-to-your-videos}\n */\n overlay_settings?: MuxOverlaySettings\n position?: {\n x: number // percentage (0-100)\n y: number // percentage (0-100)\n }\n size?: number // percentage of video width (0-100)\n opacity?: number // 0-1 (converted to percentage string for Mux API)\n}\n\n/**\n * Mux overlay_settings format for watermark API\n * @see {@link https://www.mux.com/docs/guides/add-watermarks-to-your-videos}\n */\nexport interface MuxOverlaySettings {\n vertical_align: 'top' | 'middle' | 'bottom'\n vertical_margin: string // percentage (e.g., \"10%\") or pixels (e.g., \"40px\")\n horizontal_align: 'left' | 'center' | 'right'\n horizontal_margin: string // percentage (e.g., \"10%\") or pixels (e.g., \"40px\")\n width?: string // percentage (e.g., \"25%\") or pixels (e.g., \"80px\")\n height?: string // percentage or pixels\n opacity?: string // percentage string (e.g., \"90%\")\n}\n\nexport interface UploadConfig extends Pick<\n MuxInputConfig,\n 'max_resolution_tier' | 'normalize_audio' | 'video_quality'\n> {\n static_renditions: StaticRenditionResolution[]\n text_tracks: UploadTextTrack[]\n signed_policy: boolean\n public_policy: boolean\n watermark?: WatermarkConfig\n drm_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 extends Pick<\n MuxInputConfig,\n 'max_resolution_tier' | 'normalize_audio' | 'video_quality'\n> {\n /** Static renditions configuration for downloadable files */\n static_renditions?: {resolution: StaticRenditionResolution}[]\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 /** This optional parameter should be used tracks with type of text and text_type set to subtitles. */\n passthrough?: string\n /** Overlay settings for watermarks. Used when adding a watermark image as a second input. */\n overlay_settings?: MuxOverlaySettings\n }[]\n\n /** An array of playback policy names that you want applied to this asset and available through playback_ids. */\n playback_policy?: PlaybackPolicy[]\n\n /** An array of playback policy objects that you want applied to this asset and available through playback_ids. advanced_playback_policies must be used instead of playback_policies when creating a DRM playback ID. */\n advanced_playback_policies: AdvancedPlaybackPolicy[]\n\n /** Arbitrary user-supplied metadata that will be included in the asset details and related webhooks. */\n passthrough?: string\n}\n\n/** Used by advanced_playback_policies, allows to define DRM config. */\nexport type AdvancedPlaybackPolicy = {\n policy: PlaybackPolicy\n drm_configuration_id?: 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 drmConfigId: string | null\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 MuxVideoOrigin = `https://stream.mux.com`\nexport type MuxVideoUrl = `${MuxVideoOrigin}/${string}.m3u8?${string}`\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' | 'drm'\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?:\n | 'uploaded'\n | 'embedded'\n | 'generated_live'\n | 'generated_live_final'\n | 'generated_vod'\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 error?: {\n type: string\n messages?: string[]\n }\n}\nexport type MuxTrack = MuxVideoTrack | MuxAudioTrack | MuxTextTrack\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 max_resolution_tier?: '2160p' | '1440p' | '1080p'\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 // Only present once `status` is 'ready'.\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: string\n ext: 'mp4' | 'm4a'\n height: number\n width: number\n bitrate: number\n filesize: string\n type: 'standard' | 'advanced'\n status: 'ready' | 'preparing' | 'skipped' | 'errored'\n resolution_tier?: string\n resolution?: string\n id: string\n passthrough?: string\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 meta?: {\n title?: string\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","import {Button, Card, Dialog, Stack, Text} from '@sanity/ui'\nimport {createContext, useCallback, useContext, useMemo, useState} from 'react'\n\nimport {type PluginConfig} from '../util/types'\n\nconst LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY = 'mux-plugin-has-shown-drm-playback-warning'\n\ntype DrmPlaybackWarningContextContextProps = {\n hasShownWarning: boolean\n setHasWarnedAboutDrmPlayback: (b: boolean) => void\n}\n\nconst DrmPlaybackWarningContext = createContext<DrmPlaybackWarningContextContextProps>({\n hasShownWarning: false,\n setHasWarnedAboutDrmPlayback: () => {\n return null\n },\n})\n\ninterface DrmPlaybackWarningContextProviderProps {\n config?: PluginConfig\n children: React.ReactNode\n}\n\nexport const DrmPlaybackWarningContextProvider = ({\n config,\n children,\n}: DrmPlaybackWarningContextProviderProps) => {\n const warningDisabled = config?.disableDrmPlaybackWarning ?? false\n const hasWarned: boolean =\n warningDisabled || window.localStorage.getItem(LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY) === 'true'\n const [hasWarnedAboutDrmPlayback, setHasWarnedAboutDrmPlayback] = useState(hasWarned)\n\n const setHasShownWarning = useCallback((b: boolean) => {\n window.localStorage.setItem(LOCAL_STORAGE_HAS_SHOWN_WARNING_KEY, b.toString())\n setHasWarnedAboutDrmPlayback(b)\n }, [])\n\n const value = useMemo(\n () => ({\n hasShownWarning: hasWarnedAboutDrmPlayback,\n setHasWarnedAboutDrmPlayback: setHasShownWarning,\n }),\n [hasWarnedAboutDrmPlayback, setHasShownWarning],\n )\n\n return (\n <DrmPlaybackWarningContext.Provider value={value}>\n {children}\n </DrmPlaybackWarningContext.Provider>\n )\n}\n\nexport const useDrmPlaybackWarningContext = () => {\n const context = useContext(DrmPlaybackWarningContext)\n return context\n}\n\nexport const DRMWarningDialog = ({onClose}: {onClose: () => void}) => {\n const {setHasWarnedAboutDrmPlayback} = useDrmPlaybackWarningContext()\n const _onClose = () => {\n setHasWarnedAboutDrmPlayback(true)\n onClose()\n }\n return (\n <Dialog\n open\n id=\"drm-playback-warn\"\n onClose={_onClose}\n header=\"DRM Playback Warning\"\n footer={\n <Stack padding={3}>\n <Button mode=\"ghost\" tone=\"primary\" onClick={_onClose} text=\"Ok\" />\n </Stack>\n }\n >\n <Stack gap={3} padding={3}>\n <Card padding={[3, 3, 3]} radius={2}>\n <Stack gap={3}>\n <Text size={1} weight=\"semibold\">\n DRM-protected playback will generate a license with a small associated cost. The\n plugin will attempt to play signed or public playback IDs instead whenever possible.\n </Text>\n </Stack>\n </Card>\n <Card padding={[3, 3, 3]} radius={2} tone=\"suggest\">\n <Stack gap={3}>\n <Text size={1} weight=\"semibold\">\n This is a one time warning. If it persists, you can disable it from your plugin\n configuration.\n </Text>\n </Stack>\n </Card>\n </Stack>\n </Dialog>\n )\n}\n","// As it's required to specify the API Version this custom hook ensures it's all using the same version\nimport {useClient as useSanityClient} from 'sanity'\n\nexport 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 {\n collate,\n createHookFromObservableFactory,\n type DocumentStore,\n useDocumentStore,\n} 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","// Handy little state machine to simplify managing which root level dialog to open\n\nimport {useState} from 'react'\n\nexport type DialogState =\n | 'secrets'\n | 'mezzanine'\n | 'select-video'\n | 'edit-thumbnail'\n | 'edit-captions'\n | false\n\nexport function useDialogState() {\n return useState<DialogState>(false)\n}\n\nexport type SetDialogState = ReturnType<typeof useDialogState>[1]\n","declare global {\n var __PKG_VERSION__: string | undefined\n}\nexport const PLUGIN_VERSION = typeof __PKG_VERSION__ === 'string' ? __PKG_VERSION__ : '0.0.0-dev'\n","import {PLUGIN_VERSION} from '../constants'\n\nexport const PLUGIN_VERSION_QUERY = {\n sanityVersion: PLUGIN_VERSION,\n}\n","import {defer} from 'rxjs'\nimport type {SanityClient} from 'sanity'\n\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\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 drmConfigId: string\n}\nexport function saveSecrets(\n client: SanityClient,\n token: string,\n secretKey: string,\n enableSignedUrls: boolean,\n signingKeyId: string,\n signingKeyPrivate: string,\n drmConfigId: 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 drmConfigId,\n }\n doc.signingKeyId = enableSignedUrls ? signingKeyId : ''\n doc.signingKeyPrivate = enableSignedUrls ? signingKeyPrivate : ''\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 query: PLUGIN_VERSION_QUERY,\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, {cause: error})\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 query: PLUGIN_VERSION_QUERY,\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 query: PLUGIN_VERSION_QUERY,\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', e)\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 query: PLUGIN_VERSION_QUERY,\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 drmConfigId,\n }: Pick<\n Secrets,\n 'token' | 'secretKey' | 'enableSignedUrls' | 'drmConfigId'\n >): 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 drmConfigId!,\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 drmConfigId ?? '',\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 drmConfigId,\n }\n },\n [client, secrets],\n )\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\n/** Mux guide explaining the mezzanine (\"master access\") file and how it differs from MP4 renditions. */\nexport const MEZZANINE_LEARN_MORE_URL =\n 'https://www.mux.com/docs/guides/download-for-offline-editing#enable-master-access'\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 = [\n 'token',\n 'secretKey',\n 'enableSignedUrls',\n 'signingKeyId',\n 'signingKeyPrivate',\n 'drmConfigId',\n]\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 drmConfigId: value?.drmConfigId || 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 {useReducer} from 'react'\n\nimport type {Secrets} from '../util/types'\n\nexport interface State extends Pick<\n Secrets,\n 'token' | 'secretKey' | 'enableSignedUrls' | 'drmConfigId'\n> {\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}}\n | {type: 'change'; payload: {name: 'drmConfigId'; value: string}}\nfunction init({token, secretKey, enableSignedUrls, drmConfigId}: 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 drmConfigId: drmConfigId ?? '',\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 unknown as Action)?.type}`)\n }\n}\n\nexport const useSecretsFormState = (secrets: Secrets) => useReducer(reducer, secrets, init)\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 drmConfigId\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 drmConfigId: data?.drmConfigId || null,\n }\n }, [cacheNs, _id, projectId, dataset])\n}\n","import {useTheme_v2} from '@sanity/ui'\nimport {type 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 {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {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 gap={1}>\n <Flex align=\"flex-end\">\n <Box flex={1} paddingY={2}>\n <Stack gap={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 {Box, Button, Card, Checkbox, Dialog, Flex, Inline, Stack, Text, TextInput} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {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 {useDialogState} from '../hooks/useDialogState'\nimport {useSaveSecrets} from '../hooks/useSaveSecrets'\nimport {useSecretsDocumentValues} from '../hooks/useSecretsDocumentValues'\nimport {useSecretsFormState} from '../hooks/useSecretsFormState'\nimport {cacheNs, DIALOGS_Z_INDEX} 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\n// Props for the dialog component when used with external state management\nexport interface ConfigureApiDialogProps {\n setDialogState: SetDialogState\n secrets: Secrets\n}\n\nconst fieldNames = ['token', 'secretKey', 'enableSignedUrls', 'drmConfigId'] as const\n\n// Internal dialog component that can be used with external state\nexport function ConfigureApiDialog({secrets, setDialogState}: ConfigureApiDialogProps) {\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.drmConfigId !== state.drmConfigId,\n [secrets, state],\n )\n const id = `ConfigureApi${useId()}`\n const [tokenId, secretKeyId, enableSignedUrlsId, drmConfigIdId] = 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, drmConfigId} = state\n handleSaveSecrets({token, secretKey, enableSignedUrls, drmConfigId})\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 const handleChangeDrmConfigId = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n dispatch({\n type: 'change',\n payload: {name: 'drmConfigId', value: event.currentTarget.value},\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 onClickOutside={handleClose}\n header={<Header />}\n zOffset={DIALOGS_Z_INDEX}\n position=\"fixed\"\n width={1}\n >\n <Box padding={3}>\n <form onSubmit={handleSubmit} noValidate>\n <Stack gap={4}>\n {!hasSecretsInitially && (\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"primary\">\n <Stack gap={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 gap={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 gap={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 <FormField title=\"DRM Configuration ID\" inputId={drmConfigIdId}>\n <TextInput\n id={drmConfigIdId}\n onChange={handleChangeDrmConfigId}\n type=\"text\"\n value={state.drmConfigId ?? ''}\n required={false}\n />\n </FormField>\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"neutral\">\n <Stack gap={3}>\n <Text size={1}>\n DRM (Digital Rights Management) provides an extra layer of content security for\n video content streamed from Mux. For additional information check out our{' '}\n <a\n href=\"https://www.mux.com/docs/guides/protect-videos-with-drm#play-drm-protected-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n DRM Guide\n </a>\n .\n </Text>\n <Text size={1}>\n <a\n href=\"https://www.mux.com/support/human\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Contact us\n </a>{' '}\n to get started using DRM.\n </Text>\n </Stack>\n </Card>\n\n <Inline gap={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\n// Wrapper component that manages its own dialog state (used in VideosBrowser)\nexport default function ConfigureApi() {\n const [dialogOpen, setDialogOpen] = useDialogState()\n const secretDocumentValues = useSecretsDocumentValues()\n\n const openDialog = useCallback(() => setDialogOpen('secrets'), [setDialogOpen])\n\n if (dialogOpen === 'secrets') {\n return (\n <ConfigureApiDialog\n secrets={secretDocumentValues.value.secrets}\n setDialogState={setDialogOpen}\n />\n )\n }\n\n return <Button mode=\"bleed\" text=\"Configure plugin\" onClick={openDialog} />\n}\n","import {truncateString} from 'sanity'\n\n/**\n * Generates a placeholder title for a Mux asset when no title is available.\n * This format is used when importing assets that don't have a title in Mux.\n *\n * @param assetId - The Mux asset ID\n * @returns A placeholder title in the format \"Asset #[truncated-id]\"\n */\nexport function generateAssetPlaceholder(assetId: string): string {\n return `Asset #${truncateString(assetId, 15)}`\n}\n\n/**\n * Checks if a filename is empty or has the placeholder format.\n * This is used to determine if a video title should be updated during metadata sync.\n *\n * @param filename - The current filename/title of the video\n * @param assetId - The Mux asset ID to check against\n * @returns true if the filename is empty or matches the placeholder format\n */\nexport function isEmptyOrPlaceholderTitle(filename: string | undefined, assetId: string): boolean {\n // Check if filename is empty/undefined\n if (!filename || filename.trim() === '') {\n return true\n }\n\n // Check if filename matches the placeholder format for this asset\n const placeholder = generateAssetPlaceholder(assetId)\n return filename === placeholder\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 type {SanityClient} from 'sanity'\n\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\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 query: PLUGIN_VERSION_QUERY,\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 {\n return 'failed-sanity'\n }\n\n if (deleteOnMux && asset?.assetId) {\n try {\n await deleteAssetOnMux(client, asset.assetId)\n } catch {\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 query: PLUGIN_VERSION_QUERY,\n })\n}\n\nexport function listAssets(\n client: SanityClient,\n options: {limit?: number; cursor?: string | null},\n) {\n const {dataset} = client.config()\n const query: {limit?: string; cursor?: string} = {}\n\n if (options.limit) {\n query.limit = options.limit.toString()\n }\n if (options.cursor) {\n query.cursor = options.cursor\n }\n\n return client.request<{data: MuxAsset[]; next_cursor?: string | null}>({\n url: `/addons/mux/assets/${dataset}/data/list`,\n withCredentials: true,\n method: 'GET',\n query: {...query, ...PLUGIN_VERSION_QUERY},\n })\n}\n\n/**\n * Adds a new text track to an existing asset using a VTT file URL\n */\nexport function addTextTrackFromUrl(\n client: SanityClient,\n assetId: string,\n vttUrl: string,\n options: {\n language_code: string\n name: string\n text_type?: 'subtitles'\n },\n) {\n const {dataset} = client.config()\n\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/tracks`,\n withCredentials: true,\n method: 'POST',\n body: {\n url: vttUrl,\n type: 'text',\n language_code: options.language_code,\n name: options.name,\n text_type: options.text_type || 'subtitles',\n },\n headers: {\n 'Content-Type': 'application/json',\n },\n query: PLUGIN_VERSION_QUERY,\n })\n}\n\n/**\n * Generates subtitles automatically for an audio track\n */\nexport function generateSubtitles(\n client: SanityClient,\n assetId: string,\n audioTrackId: string,\n options: {\n language_code: string\n name: string\n },\n) {\n const {dataset} = client.config()\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/tracks/${audioTrackId}/generate-subtitles`,\n withCredentials: true,\n method: 'POST',\n body: {\n generated_subtitles: [\n {\n language_code: options.language_code,\n name: options.name,\n },\n ],\n },\n headers: {\n 'Content-Type': 'application/json',\n },\n query: PLUGIN_VERSION_QUERY,\n })\n}\n\n/**\n * Deletes a text track from an asset\n */\nexport function deleteTextTrack(client: SanityClient, assetId: string, trackId: string) {\n const {dataset} = client.config()\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/tracks/${trackId}`,\n withCredentials: true,\n method: 'DELETE',\n query: PLUGIN_VERSION_QUERY,\n })\n}\n\n/**\n * Updates master access (the \"mezzanine\" file in Mux's docs) on a Mux asset, via the addon proxy.\n * @see {@link https://docs.mux.com/api-reference/video/assets/update-asset-master-access}\n */\nexport function updateMasterAccess(\n client: SanityClient,\n assetId: string,\n masterAccess: 'temporary' | 'none',\n) {\n const {dataset} = client.config()\n return client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/${assetId}/master-access`,\n withCredentials: true,\n method: 'PUT',\n body: {master_access: masterAccess},\n headers: {\n 'Content-Type': 'application/json',\n },\n query: PLUGIN_VERSION_QUERY,\n })\n}\n","import {useEffect, useState} from 'react'\nimport {defer, of, timer} from 'rxjs'\nimport {concatMap, expand, tap} from 'rxjs/operators'\nimport type {SanityClient} from 'sanity'\n\nimport {listAssets} from '../actions/assets'\nimport type {MuxAsset} from '../util/types'\n\nconst ASSETS_PER_PAGE = 100\n\ntype MuxAssetsState = {\n cursor: string | null\n loading: boolean\n data?: MuxAsset[]\n error?: FetchError\n hasSkippedAssetsWithoutPlayback?: boolean\n}\n\ntype FetchError =\n | {\n _tag: 'FetchError'\n }\n | {_tag: 'MuxError'; error: unknown}\n\ntype PageResult = (\n | {\n data: MuxAsset[]\n next_cursor: string | null\n }\n | {\n error: FetchError\n }\n) & {\n cursor: string | null\n}\n\n/**\n * @docs {@link https://docs.mux.com/api-reference#video/operation/list-assets}\n */\nasync function fetchMuxAssetsPage(\n client: SanityClient,\n cursor: string | null,\n): Promise<PageResult> {\n try {\n const response = await listAssets(client, {\n limit: ASSETS_PER_PAGE,\n cursor,\n })\n\n return {\n cursor,\n data: response.data,\n next_cursor: response.next_cursor || null,\n }\n } catch {\n return {\n cursor,\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 const newAssets = ('data' in pageResult && pageResult.data) || []\n\n // Filter assets and check for skipped items\n const {validAssets, skippedInThisPage} = newAssets.reduce<{\n validAssets: MuxAsset[]\n skippedInThisPage: boolean\n }>(\n (acc, asset) => {\n const hasPlaybackIds = asset.playback_ids && asset.playback_ids.length > 0\n const isDuplicate = currentData.some((a) => a.id === asset.id)\n\n if (!hasPlaybackIds) {\n acc.skippedInThisPage = true\n }\n\n if (hasPlaybackIds && !isDuplicate) {\n acc.validAssets.push(asset)\n }\n\n return acc\n },\n {validAssets: [], skippedInThisPage: false},\n )\n\n return {\n ...currentState,\n data: [...currentData, ...validAssets],\n error:\n 'error' in pageResult\n ? pageResult.error\n : // Reset error if current page is successful\n undefined,\n cursor: 'next_cursor' in pageResult ? pageResult.next_cursor : pageResult.cursor,\n loading: true,\n hasSkippedAssetsWithoutPlayback:\n currentState.hasSkippedAssetsWithoutPlayback || skippedInThisPage,\n }\n}\n\nfunction hasMorePages(pageResult: PageResult) {\n return (\n typeof pageResult === 'object' && 'next_cursor' in pageResult && pageResult.next_cursor !== null\n )\n}\n\n/**\n * Fetches all assets from a Mux environment. Rules:\n * - One page at a time\n * - Uses cursor-based pagination\n * - We've finished fetching when `next_cursor` is null\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({client, enabled}: {client: SanityClient; enabled: boolean}) {\n const [state, setState] = useState<MuxAssetsState>({loading: true, cursor: null})\n\n useEffect(() => {\n if (!enabled) return\n\n const subscription = defer(() =>\n fetchMuxAssetsPage(\n client,\n // When we've already successfully loaded before (fully or partially), we start from the next cursor to avoid re-fetching\n 'data' in state && state.data && state.data.length > 0 && !state.error\n ? state.cursor\n : null,\n ),\n )\n .pipe(\n // Here we use \"expand\" to recursively fetch next pages\n expand((pageResult) => {\n // if fetched page has next_cursor, we continue emitting, requesting the next page\n // after 2s to avoid rate limiting\n if (hasMorePages(pageResult)) {\n return timer(2000).pipe(\n concatMap(() =>\n defer(() =>\n fetchMuxAssetsPage(\n client,\n 'next_cursor' in pageResult ? pageResult.next_cursor : null,\n ),\n ),\n ),\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 return () => subscription.unsubscribe()\n // oxlint-disable-next-line react/exhaustive-deps -- secrets/pluginConfig are stable for the asset fetch lifecycle once enabled\n }, [enabled])\n\n return state\n}\n","import {uuid} from '@sanity/uuid'\nimport {useMemo, useState} from 'react'\nimport {\n createHookFromObservableFactory,\n type DocumentStore,\n useClient,\n useDocumentStore,\n} from 'sanity'\n\nimport {generateAssetPlaceholder} from '../util/assetTitlePlaceholder'\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 client,\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.meta?.title ?? generateAssetPlaceholder(asset.id),\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 return () => {\n if (toObserve) observer.unobserve(toObserve)\n }\n }, [options, ref])\n\n return inView\n}\n","import type {\n AdvancedPlaybackPolicy,\n MuxPlaybackId,\n PlaybackPolicy,\n VideoAssetDocument,\n} from './types'\n\n/* - Returns the playback id of the asset based on the specified priority.\n By default chooses the \"strongest\" policy\n - Otherwise, returns the first playback id in the array.\n */\nexport function getPlaybackId(\n asset: Pick<VideoAssetDocument, 'data'>,\n priority: string[] = ['drm', 'signed', 'public'],\n): string {\n try {\n if (!asset) {\n throw new TypeError('Tried to get playback Id with no asset')\n }\n\n const playbackIds = asset.data?.playback_ids\n if (playbackIds && playbackIds.length > 0) {\n for (const policy of priority) {\n const match = playbackIds.find((entry) => entry.policy === policy)\n if (match) {\n return match.id\n }\n }\n\n return playbackIds[0]!.id\n }\n\n throw new TypeError('Missing playbackId')\n } catch (e) {\n console.error('Asset is missing a playbackId', {asset}, e)\n throw e\n }\n}\n\nexport function getPlaybackPolicy(\n asset: Pick<VideoAssetDocument, 'data' | 'playbackId'>,\n): MuxPlaybackId | undefined {\n return (\n asset.data?.playback_ids?.find(\n (playbackId) => getPlaybackId(asset, ['drm', 'signed', 'public']) === playbackId.id,\n ) ?? {id: '', policy: 'public'}\n )\n}\n\nexport function getPlaybackPolicyById(\n asset: Pick<VideoAssetDocument, 'data'>,\n playbackId: string,\n): MuxPlaybackId | undefined {\n return asset.data?.playback_ids?.find((entry) => playbackId === entry.id)\n}\n\nexport function hasPlaybackPolicy(\n data: Partial<{\n playback_policy?: PlaybackPolicy[]\n advanced_playback_policies: AdvancedPlaybackPolicy[]\n }>,\n policy: PlaybackPolicy,\n) {\n return (\n (data.advanced_playback_policies &&\n data.advanced_playback_policies.find((p) => p.policy === policy)) ||\n data.playback_policy?.find((p) => p === policy)\n )\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' | 'd'\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 : T extends 'd'\n ? never\n : never\n\n/**\n * Uses suspend. Call this with {@link tryWithSuspend} or rethrow the Promise\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 /* Using suspend means we need to use Suspense on parent components.\n Also, this will throw a Promise under the hood (apparently common in React), \n so if we want to catch errors we have to take this into account in catch blocks\n and rethrow promises. */\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 {SanityClient} from 'sanity'\n\nimport {getPlaybackId} from '../util/getPlaybackPolicy'\nimport {type Audience, generateJwt} from './generateJwt'\nimport {getPlaybackPolicyById} from './getPlaybackPolicy'\nimport type {AssetThumbnailOptions} from './types'\n\n/**\n * May throw a Promise. Call this with {@link tryWithSuspend} or rethrow the Promise\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 const playbackPolicy = getPlaybackPolicyById(asset, playbackId)?.policy\n if (playbackPolicy === 'signed' || playbackPolicy === 'drm') {\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 {type 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 {type 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 !== undefined) {\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","/**\n * When running `suspend()` from react-suspend a function may throw a Promise\n * causing unexpected behavior when catching.\n * @param block Your block of code that uses suspend\n * @param onError (optional) How to handle a regular Error\n * @returns Whatever is returned by the block if it succeeds, otherwise whatever is resolved by onError if defined\n * @throws rethrows the caught Promise to comply with Suspense logic\n */\nexport function tryWithSuspend<T, E>(\n block: () => T,\n onError?: (error: Error) => E,\n): T | E | undefined {\n try {\n return block()\n } catch (errorOrPromise) {\n if (errorOrPromise instanceof Promise) {\n // react-suspend will throw a Promise\n throw errorOrPromise\n }\n return onError ? onError(errorOrPromise as Error) : undefined\n }\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Card, type CardTone, Spinner, Stack, Text} from '@sanity/ui'\nimport {Suspense, 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 {tryWithSuspend} from '../util/tryWithSuspend'\nimport type {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 posterWidth = width || 250\n const client = useClient()\n const ref = useRef<HTMLDivElement | null>(null)\n const inView = useInView(ref)\n\n const [status, setStatus] = useState<ImageStatus>('loading')\n const [error, setError] = useState<string | null>(null)\n\n const thumbnailSrc = useMemo(() => {\n return tryWithSuspend(\n () => {\n let thumbnail: MuxAnimatedThumbnailUrl | MuxThumbnailUrl | undefined\n\n if (staticImage) thumbnail = getPosterSrc({asset, client, width: posterWidth})\n else thumbnail = getAnimatedPosterSrc({asset, client, width: posterWidth})\n return thumbnail\n },\n (err: Error) => {\n handleError(err.message)\n return undefined\n },\n )\n }, [asset, client, posterWidth, staticImage])\n\n function handleLoad() {\n setStatus('loaded')\n }\n\n function handleError(err?: string) {\n setStatus('error')\n if (err) {\n setError(err)\n } else {\n setError('Failed loading thumbnail')\n }\n }\n\n return (\n <Suspense fallback={<span>Preparing thumbnail</span>}>\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 gap={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 {error}\n </Text>\n </Stack>\n )}\n <Image\n src={thumbnailSrc ?? undefined}\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 </Suspense>\n )\n}\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {InfoOutlineIcon} from '@sanity/icons/InfoOutline'\nimport {RetrieveIcon} from '@sanity/icons/Retrieve'\nimport {RetryIcon} from '@sanity/icons/Retry'\nimport {Box, Button, Card, Checkbox, Dialog, Flex, Heading, Spinner, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\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 gap={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\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=\"ghost\"\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 {/* WARNING: SKIPPED ASSETS WITHOUT PLAYBACK */}\n {props.muxAssets.hasSkippedAssetsWithoutPlayback && (\n <Card tone=\"caution\" marginBottom={5} padding={3} border>\n <Flex align=\"center\" gap={2}>\n <InfoOutlineIcon fontSize={36} />\n <Stack gap={2}>\n <Text size={2} weight=\"semibold\">\n Some videos were skipped\n </Text>\n <Text size={1}>\n Videos without playback IDs cannot be imported and have been excluded from the\n list.\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\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 gap={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 gap={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 gap={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 gap={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} gap={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 gap={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 return <ImportVideosDialog {...importAssets} />\n }\n\n return <Button mode=\"bleed\" text=\"Import from Mux\" onClick={importAssets.openDialog} />\n}\n","import {ChevronLeftIcon} from '@sanity/icons/ChevronLeft'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {Button, Label} from '@sanity/ui'\nimport {type Dispatch, type SetStateAction, useEffect} from 'react'\n\nconst PageSelector = (props: {\n page: number\n setPage: Dispatch<SetStateAction<number>>\n total: number\n}) => {\n const page = props.page\n const setPage = props.setPage\n\n useEffect(() => {\n // Constraint in bounds.\n const clamped = Math.min(props.total - 1, Math.max(0, page))\n if (page !== clamped) {\n setPage(clamped)\n }\n }, [page, props.total, setPage])\n\n return (\n <>\n <Button\n icon={ChevronLeftIcon}\n mode=\"bleed\"\n padding={3}\n style={{cursor: 'pointer'}}\n disabled={page <= 0}\n onClick={() => {\n setPage((p) => {\n return Math.min(props.total - 1, Math.max(0, p - 1))\n })\n }}\n />\n <Label muted>\n Page {page + 1}/{props.total}\n </Label>\n <Button\n icon={ChevronRightIcon}\n mode=\"bleed\"\n padding={3}\n style={{cursor: 'pointer'}}\n disabled={page >= props.total - 1}\n onClick={() => {\n setPage((p) => {\n return Math.min(props.total - 1, Math.max(0, p + 1))\n })\n }}\n />\n </>\n )\n}\n\nexport default PageSelector\n","import type {MuxAsset} from './types'\n\n/**\n * Adds a `_key` to array items in MuxAsset data (Sanity requires `_key` on array\n * items). Keys are derived from each item's stable Mux `id`, so repeated calls\n * are idempotent and don't churn the document — important because the asset is\n * persisted on every poll while it prepares.\n */\nexport function addKeysToMuxData(data: MuxAsset): MuxAsset {\n return {\n ...data,\n tracks: data.tracks?.map((track, index) => ({\n ...track,\n _key: track.id || `track-${index}`,\n })),\n playback_ids: data.playback_ids?.map((playbackId, index) => ({\n ...playbackId,\n _key: playbackId.id || `playback-${index}`,\n })),\n static_renditions: data.static_renditions\n ? {\n ...data.static_renditions,\n files: data.static_renditions.files?.map((file, index) => ({\n ...file,\n _key: file.id || `rendition-${index}`,\n })),\n }\n : undefined,\n }\n}\n","import {useMemo, useState} from 'react'\nimport {\n createHookFromObservableFactory,\n type DocumentStore,\n useClient,\n useDocumentStore,\n} from 'sanity'\n\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {isEmptyOrPlaceholderTitle} from '../util/assetTitlePlaceholder'\nimport type {VideoAssetDocument} from '../util/types'\nimport {SANITY_API_VERSION} from './useClient'\nimport useMuxAssets from './useMuxAssets'\nimport {useSecretsDocumentValues} from './useSecretsDocumentValues'\n\ntype ResyncState = 'closed' | 'idle' | 'syncing' | 'done' | 'error'\n\nexport default function useResyncMuxMetadata() {\n const documentStore = useDocumentStore()\n const client = useClient({\n apiVersion: SANITY_API_VERSION,\n })\n\n const [sanityAssets, sanityAssetsLoading] = useSanityAssets(documentStore)\n\n const secretDocumentValues = useSecretsDocumentValues()\n const hasSecrets = !!secretDocumentValues.value.secrets?.secretKey\n\n const [resyncError, setResyncError] = useState<unknown>()\n const [resyncState, setResyncState] = useState<ResyncState>('closed')\n const dialogOpen = resyncState !== 'closed'\n\n const muxAssets = useMuxAssets({\n client,\n enabled: hasSecrets && dialogOpen,\n })\n\n const matchedAssets = useMemo(() => {\n return sanityAssets && muxAssets.data\n ? sanityAssets.map((sanityDoc) => {\n const muxAsset = muxAssets.data?.find(\n (m) => m.id === sanityDoc.assetId || m.id === sanityDoc.data?.id,\n )\n return {\n sanityDoc,\n muxAsset,\n muxTitle: muxAsset?.meta?.title,\n currentTitle: sanityDoc.filename,\n }\n })\n : undefined\n }, [sanityAssets, muxAssets.data])\n\n const closeDialog = () => {\n if (resyncState !== 'syncing') setResyncState('closed')\n }\n\n const openDialog = () => {\n if (resyncState === 'closed') setResyncState('idle')\n }\n\n async function syncAllVideos() {\n if (!matchedAssets) return\n\n setResyncState('syncing')\n\n try {\n const tx = client.transaction()\n\n matchedAssets.forEach((matched) => {\n // Update all videos with the Mux title, even if it's undefined/empty\n const newTitle = matched.muxTitle || ''\n tx.patch(matched.sanityDoc._id, {set: {filename: newTitle}})\n })\n\n await tx.commit({returnDocuments: false})\n setResyncState('done')\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n }\n }\n\n async function syncOnlyEmpty() {\n if (!matchedAssets) return\n\n setResyncState('syncing')\n\n try {\n const tx = client.transaction()\n\n matchedAssets.forEach((matched) => {\n // Only update if the current title is empty or has the placeholder format\n // AND there's a new title available from Mux\n if (\n matched.muxAsset &&\n matched.muxTitle &&\n isEmptyOrPlaceholderTitle(matched.currentTitle, matched.muxAsset.id)\n ) {\n tx.patch(matched.sanityDoc._id, {set: {filename: matched.muxTitle}})\n }\n })\n\n await tx.commit({returnDocuments: false})\n setResyncState('done')\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n }\n }\n\n async function syncFullData() {\n if (!matchedAssets) return\n\n setResyncState('syncing')\n\n try {\n const tx = client.transaction()\n\n matchedAssets.forEach((matched) => {\n if (!matched.muxAsset) return\n\n const dataWithKeys = addKeysToMuxData(matched.muxAsset)\n\n // Update all fields: filename, status, and full data from Mux\n tx.patch(matched.sanityDoc._id, {\n set: {\n filename: matched.muxTitle || matched.currentTitle || '',\n status: matched.muxAsset.status,\n data: dataWithKeys,\n },\n })\n })\n\n await tx.commit({returnDocuments: false})\n setResyncState('done')\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n }\n }\n\n return {\n sanityAssetsLoading,\n closeDialog,\n dialogOpen,\n resyncState,\n resyncError,\n hasSecrets,\n syncAllVideos,\n syncOnlyEmpty,\n syncFullData,\n matchedAssets,\n muxAssets,\n openDialog,\n }\n}\n\nconst useSanityAssets = createHookFromObservableFactory<VideoAssetDocument[], DocumentStore>(\n (documentStore) => {\n return documentStore.listenQuery(\n /* groq */ `*[_type == \"mux.videoAsset\"]`,\n {},\n {\n apiVersion: SANITY_API_VERSION,\n },\n )\n },\n)\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {Box, Button, Card, Dialog, Flex, Heading, Radio, Spinner, Stack, Text} from '@sanity/ui'\nimport {useState} from 'react'\n\nimport useResyncMuxMetadata from '../hooks/useResyncMuxMetadata'\nimport {isEmptyOrPlaceholderTitle} from '../util/assetTitlePlaceholder'\nimport {DIALOGS_Z_INDEX} from '../util/constants'\n\ntype SyncOption = 'fillEmpty' | 'syncTitles' | 'fullResync'\n\ninterface OptionCardProps {\n id: SyncOption\n selected: boolean\n onSelect: (id: SyncOption) => void\n title: string\n count: number\n description: string\n disabled?: boolean\n}\n\nfunction OptionCard({\n id,\n selected,\n onSelect,\n title,\n count,\n description,\n disabled,\n}: OptionCardProps) {\n return (\n <Card\n as=\"label\"\n padding={3}\n radius={2}\n border\n tone={selected ? 'primary' : 'default'}\n style={{\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n }}\n >\n <Flex gap={3} align=\"flex-start\">\n <Box paddingTop={1}>\n <Radio\n checked={selected}\n onChange={() => onSelect(id)}\n disabled={disabled}\n name=\"sync-option\"\n />\n </Box>\n <Stack gap={2} flex={1}>\n <Flex align=\"center\" gap={2}>\n <Text size={2} weight=\"semibold\">\n {title} ({count})\n </Text>\n </Flex>\n <Text size={1} muted>\n {description}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )\n}\n\nfunction ResyncMetadataDialog(props: ReturnType<typeof useResyncMuxMetadata>) {\n const {resyncState} = props\n\n const videosToUpdate = props.matchedAssets?.filter((m) => m.muxAsset).length || 0\n const videosWithEmptyOrPlaceholder =\n props.matchedAssets?.filter(\n (m) => m.muxAsset && m.muxTitle && isEmptyOrPlaceholderTitle(m.currentTitle, m.muxAsset.id),\n ).length || 0\n\n const hasEmptyTitles = videosWithEmptyOrPlaceholder > 0\n const defaultOption: SyncOption = hasEmptyTitles ? 'fillEmpty' : 'syncTitles'\n const [selectedOption, setSelectedOption] = useState<SyncOption>(defaultOption)\n\n const canTriggerResync = resyncState === 'idle' || resyncState === 'error'\n const isResyncing = resyncState === 'syncing'\n const isDone = resyncState === 'done'\n const isLoading = props.muxAssets.loading || props.sanityAssetsLoading\n\n const handleSync = () => {\n switch (selectedOption) {\n case 'fillEmpty':\n void props.syncOnlyEmpty()\n break\n case 'syncTitles':\n void props.syncAllVideos()\n break\n case 'fullResync':\n void props.syncFullData()\n break\n default:\n break\n }\n }\n\n return (\n <Dialog\n animate\n header=\"Sync with Mux\"\n zOffset={DIALOGS_Z_INDEX}\n id=\"resync-metadata-dialog\"\n onClose={props.closeDialog}\n onClickOutside={props.closeDialog}\n width={1}\n position=\"fixed\"\n footer={\n !isDone && (\n <Card padding={3}>\n <Flex justify=\"flex-end\" gap={2}>\n <Button\n fontSize={2}\n padding={3}\n mode=\"ghost\"\n text=\"Cancel\"\n onClick={props.closeDialog}\n disabled={isResyncing}\n />\n <Button\n icon={SyncIcon}\n fontSize={2}\n padding={3}\n text=\"Run sync\"\n tone=\"primary\"\n onClick={handleSync}\n iconRight={isResyncing && Spinner}\n disabled={!canTriggerResync || isLoading}\n />\n </Flex>\n </Card>\n )\n }\n >\n <Box padding={4}>\n {/* LOADING ASSETS STATE */}\n {isLoading && (\n <Card tone=\"primary\" marginBottom={4} padding={3} border radius={2}>\n <Flex align=\"center\" gap={4}>\n <Spinner muted size={4} />\n <Stack gap={2}>\n <Text size={2} weight=\"semibold\">\n Loading assets from Mux\n </Text>\n <Text size={1} muted>\n This may take a while.\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR LOADING MUX */}\n {props.muxAssets.error && (\n <Card tone=\"critical\" marginBottom={4} padding={3} border radius={2}>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon fontSize={36} />\n <Stack gap={2}>\n <Text size={2} weight=\"semibold\">\n There was an error getting data from Mux\n </Text>\n <Text size={1}>Please try again or contact a developer for help.</Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* SYNCING STATE */}\n {resyncState === 'syncing' && (\n <Card tone=\"primary\" marginBottom={4} padding={3} border radius={2}>\n <Flex align=\"center\" gap={4}>\n <Spinner muted size={4} />\n <Stack gap={2}>\n <Text size={2} weight=\"semibold\">\n Syncing metadata\n </Text>\n <Text size={1} muted>\n Updating videos from Mux...\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* ERROR SYNCING */}\n {resyncState === 'error' && (\n <Card tone=\"critical\" marginBottom={4} padding={3} border radius={2}>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon fontSize={36} />\n <Stack gap={2}>\n <Text size={2} weight=\"semibold\">\n There was an error syncing metadata\n </Text>\n <Text size={1}>\n {props.resyncError\n ? `Error: ${props.resyncError}`\n : 'Please try again or contact a developer for help.'}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )}\n\n {/* SUCCESS STATE */}\n {resyncState === 'done' && (\n <Stack paddingY={5} gap={3} style={{textAlign: 'center'}}>\n <Box>\n <CheckmarkCircleIcon fontSize={48} />\n </Box>\n <Heading size={2}>Sync completed</Heading>\n <Text size={2} muted>\n Videos have been updated from Mux.\n </Text>\n </Stack>\n )}\n\n {/* OPTIONS */}\n {!isDone && !isLoading && !props.muxAssets.error && (\n <Stack gap={4}>\n <Text size={1} muted>\n Found {videosToUpdate} video{videosToUpdate === 1 ? '' : 's'} linked to Mux.\n </Text>\n\n <Stack gap={3}>\n {hasEmptyTitles && (\n <OptionCard\n id=\"fillEmpty\"\n selected={selectedOption === 'fillEmpty'}\n onSelect={setSelectedOption}\n title=\"Fill missing titles only\"\n count={videosWithEmptyOrPlaceholder}\n description=\"Updates only videos without a title or with placeholder titles (e.g., 'Asset #123') using the title from Mux.\"\n disabled={isResyncing}\n />\n )}\n\n <OptionCard\n id=\"syncTitles\"\n selected={selectedOption === 'syncTitles'}\n onSelect={setSelectedOption}\n title=\"Sync all titles\"\n count={videosToUpdate}\n description=\"Replaces the title in Sanity with the title from Mux for all videos.\"\n disabled={isResyncing}\n />\n\n <OptionCard\n id=\"fullResync\"\n selected={selectedOption === 'fullResync'}\n onSelect={setSelectedOption}\n title=\"Full resync\"\n count={videosToUpdate}\n description=\"Updates all fields from Mux including status, duration, tracks, captions, and renditions.\"\n disabled={isResyncing}\n />\n </Stack>\n </Stack>\n )}\n </Box>\n </Dialog>\n )\n}\n\nexport default function ResyncMetadata() {\n const resyncMetadata = useResyncMuxMetadata()\n\n if (!resyncMetadata.hasSecrets) {\n return\n }\n\n if (resyncMetadata.dialogOpen) {\n return <ResyncMetadataDialog {...resyncMetadata} />\n }\n\n return <Button mode=\"bleed\" text=\"Sync with Mux\" onClick={resyncMetadata.openDialog} />\n}\n","import {SortIcon} from '@sanity/icons/Sort'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuItem} from '@sanity/ui/menu'\nimport {type PopoverProps} from '@sanity/ui/popover'\nimport {useId} from 'react'\n\nimport {ASSET_SORT_OPTIONS, type SortOption} from '../hooks/useAssets'\n\nconst 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 {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 {useToast} from '@sanity/ui/toast'\nimport {useCallback, useEffect, useMemo, useState} from 'react'\n\nimport {getAsset, updateMasterAccess} from '../actions/assets'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\nimport {useClient} from './useClient'\n\n/**\n * UI status for the mezzanine (\"master access\") file of a Mux asset, derived\n * solely from the stored `master` object.\n * - `disabled`: master access is not enabled (or reverted to `none`).\n * - `preparing`: Mux is preparing the file (we poll until it's ready).\n * - `ready`: the file is ready to download.\n * - `errored`: Mux failed to prepare the file.\n */\nexport type MezzanineStatus = 'disabled' | 'preparing' | 'ready' | 'errored'\n\n// Poll cadence while the mezzanine is preparing.\nconst POLL_INTERVAL_MS = 3000\n\nexport interface UseMezzanineReturn {\n status: MezzanineStatus\n /** `true` while an enable or pre-download check request is in flight. */\n busy: boolean\n /**\n * `true` when the last download attempt found the file gone (the 24h window\n * elapsed). Used to show a \"enable it again\" hint; the button state still\n * comes from `status`.\n */\n expired: boolean\n /** Mezzanine resolution label (e.g. `1080p`), when known. */\n resolution?: string\n /** Enables master access and starts polling until the file is ready. */\n enable: () => Promise<void>\n /** Re-fetches the asset and, if the file is still alive, triggers the download. */\n download: () => Promise<void>\n}\n\n/** Derives the mezzanine status from the persisted asset data alone (no polling or local state). */\nexport function getMezzanineStatus(\n asset: VideoAssetDocument,\n): 'disabled' | 'preparing' | 'ready' | 'errored' {\n const master = asset.data?.master\n if (master?.status === 'preparing') return 'preparing'\n if (master?.status === 'ready' && master.url) return 'ready'\n if (master?.status === 'errored') return 'errored'\n return 'disabled'\n}\n\n/**\n * Encapsulates the mezzanine (Mux \"master access\") lifecycle for an asset:\n * enabling it through the Mux addon proxy, persisting the result on the Sanity\n * document, polling until it's ready, and downloading by redirecting to the\n * fresh, short-lived Mux URL.\n *\n * The full Mux asset `data` (including the `master` object) is stored on the\n * Sanity document via `client.patch`, so the status survives reloads and is\n * already present for assets imported from Mux.\n */\nexport function useMezzanine(asset: VideoAssetDocument): UseMezzanineReturn {\n const client = useClient()\n const toast = useToast()\n\n const master = asset.data?.master\n const [busy, setBusy] = useState(false)\n const [expired, setExpired] = useState(false)\n // Track the previous assetId so we can reset transient flags during render\n // when the asset changes, without triggering a cascading setState-in-effect.\n const [prevAssetId, setPrevAssetId] = useState(asset.assetId)\n if (prevAssetId !== asset.assetId) {\n setPrevAssetId(asset.assetId)\n setExpired(false)\n }\n\n const resolution = useMemo(\n () => asset.data?.max_resolution_tier || asset.data?.max_stored_resolution || undefined,\n [asset.data?.max_resolution_tier, asset.data?.max_stored_resolution],\n )\n\n const status: MezzanineStatus = getMezzanineStatus(asset)\n\n // Persist a Mux asset payload on the Sanity document.\n const persist = useCallback(\n async (data: MuxAsset) => {\n if (!asset._id) return\n await client\n .patch(asset._id)\n .set({status: data.status, data: addKeysToMuxData(data)})\n .commit({returnDocuments: false})\n },\n [asset._id, client],\n )\n\n // Fetch the latest asset from Mux (through the proxy) and persist it on the Sanity document.\n const refresh = useCallback(async (): Promise<MuxAsset | undefined> => {\n if (!asset.assetId || !asset._id) return undefined\n const {data} = await getAsset(client, asset.assetId)\n await persist(data)\n return data\n }, [asset.assetId, asset._id, client, persist])\n\n // Poll while the mezzanine is preparing; stop once it's ready or no longer preparing.\n useEffect(() => {\n if (master?.status !== 'preparing' || !asset.assetId || !asset._id) return undefined\n\n let cancelled = false\n let running = false\n const interval = setInterval(async () => {\n // Skip this tick if the previous refresh hasn't finished, so a slow\n // request can't pile up overlapping reads/writes.\n if (running) return\n running = true\n try {\n const data = await refresh()\n if (cancelled) return\n if (!data || data.master?.status !== 'preparing') {\n clearInterval(interval)\n }\n } catch (error) {\n console.error('Failed to poll mezzanine status:', error)\n } finally {\n running = false\n }\n }, POLL_INTERVAL_MS)\n\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }, [master?.status, asset.assetId, asset._id, refresh])\n\n const enable = useCallback(async () => {\n if (!asset.assetId || !asset._id) return\n\n setBusy(true)\n setExpired(false)\n try {\n const {data} = await updateMasterAccess(client, asset.assetId, 'temporary')\n // Persist the PUT response directly — it already reports master.status\n // 'preparing', so polling starts without relying on a follow-up GET that\n // could read stale data and miss it.\n await persist(data)\n } catch (error) {\n toast.push({\n status: 'error',\n title: 'Could not enable the mezzanine file',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setBusy(false)\n }\n }, [asset.assetId, asset._id, client, persist, toast])\n\n const download = useCallback(async () => {\n if (!asset.assetId) return\n\n setBusy(true)\n try {\n // The Mux URL is short-lived (24h), so re-fetch the asset right before\n // downloading and only redirect if the file is still alive.\n const data = await refresh()\n const url = data?.master?.status === 'ready' ? data.master.url : undefined\n\n if (url) {\n setExpired(false)\n triggerMezzanineDownload(url)\n } else {\n // The window elapsed and master_access reverted: prompt to re-enable.\n setExpired(true)\n }\n } catch (error) {\n toast.push({\n status: 'error',\n title: 'Could not download the mezzanine file',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setBusy(false)\n }\n }, [asset.assetId, refresh, toast])\n\n return {status, busy, expired, resolution, enable, download}\n}\n\n/**\n * Redirects the browser to the Mux mezzanine URL to start the download. The URL\n * already serves the file with its default name (`mezzanine.mp4`).\n * @see {@link https://www.mux.com/docs/guides/download-for-offline-editing}\n */\nfunction triggerMezzanineDownload(masterUrl: string): void {\n if (typeof window === 'undefined') return\n\n const anchor = document.createElement('a')\n anchor.href = masterUrl\n anchor.target = '_blank'\n anchor.rel = 'noopener noreferrer'\n document.body.appendChild(anchor)\n anchor.click()\n document.body.removeChild(anchor)\n}\n","import {Stack, Text} from '@sanity/ui'\n\n/** Explains what the mezzanine file is and how it differs from the streamable MP4 renditions. */\nexport default function MezzanineExplanation() {\n return (\n <Stack gap={3}>\n <Text size={1} muted>\n When you enable the mezzanine file, Mux creates a copy equivalent in quality to your\n original video — ideal for offline editing or archiving. Unlike the streamable MP4 (static)\n renditions, it is not meant for streaming.\n </Text>\n <Text size={1} muted>\n The file is prepared in the background and may take a few minutes depending on the\n asset's duration and resolution. Enabling is free and the download stays available for\n 24 hours.\n </Text>\n </Stack>\n )\n}\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {Button, Card, Flex, Label, Spinner, Stack, Text} from '@sanity/ui'\n\nimport {useMezzanine} from '../hooks/useMezzanine'\nimport {MEZZANINE_LEARN_MORE_URL} from '../util/constants'\nimport type {VideoAssetDocument} from '../util/types'\nimport MezzanineExplanation from './MezzanineExplanation'\n\nexport interface Props {\n asset: VideoAssetDocument\n /**\n * Render the mezzanine explanation copy inside the card.\n * @defaultValue true\n */\n withExplanation?: boolean\n}\n\n/**\n * \"Mezzanine\" panel, modeled after Mux's dashboard card: enable the\n * master-access copy, watch it prepare, then download it.\n */\nexport default function Mezzanine({asset, withExplanation = true}: Props) {\n const {status, busy, expired, resolution, enable, download} = useMezzanine(asset)\n\n const assetReady = asset.status === 'ready' || asset.data?.status === 'ready'\n // Once a download finds the file gone, treat it as not-ready even if the\n // (stale) asset prop still reports `ready`, so we show the re-enable path\n // instead of a dead Download button.\n const isReady = status === 'ready' && !expired\n const isPreparing = status === 'preparing'\n const showExplanation = !isReady && !isPreparing\n\n return (\n <Card padding={3} radius={2} tone=\"transparent\" border>\n <Stack gap={4}>\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Label muted size={1}>\n Mezzanine\n </Label>\n <Text size={1}>\n <a href={MEZZANINE_LEARN_MORE_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Learn more\n </a>\n </Text>\n </Flex>\n\n <Stack gap={2}>\n <Text size={1} muted={!isReady}>\n mezzanine.mp4\n </Text>\n {resolution && (\n <Text size={1} muted>\n {resolution}\n </Text>\n )}\n </Stack>\n\n {withExplanation && showExplanation && <MezzanineExplanation />}\n\n {showExplanation && (expired || status === 'errored') && (\n <Stack gap={2}>\n {expired && (\n <Text size={1} muted>\n The previous mezzanine file expired. Enable it again to download.\n </Text>\n )}\n {status === 'errored' && (\n <Text size={1} style={{color: 'var(--card-critical-color)'}}>\n Mux could not prepare the mezzanine file. Please try again.\n </Text>\n )}\n </Stack>\n )}\n\n {isPreparing && (\n <Text size={1} muted>\n Preparing the mezzanine file… this can take a few minutes. You can close this and come\n back later.\n </Text>\n )}\n\n {isReady && (\n <Text size={1} muted>\n Ready to download. The link stays available for about 24 hours.\n </Text>\n )}\n\n <Flex justify=\"flex-end\" gap={2}>\n {isPreparing ? (\n <Flex align=\"center\" gap={2}>\n <Spinner muted size={1} />\n <Text size={1} muted>\n Preparing…\n </Text>\n </Flex>\n ) : isReady ? (\n <Button\n icon={DownloadIcon}\n text=\"Download\"\n tone=\"positive\"\n fontSize={1}\n padding={3}\n loading={busy}\n disabled={busy}\n onClick={() => void download()}\n />\n ) : (\n <Button\n text={status === 'errored' ? 'Try again' : 'Enable'}\n tone=\"primary\"\n fontSize={1}\n padding={3}\n loading={busy}\n disabled={busy || !assetReady}\n onClick={() => void enable()}\n />\n )}\n </Flex>\n </Stack>\n </Card>\n )\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useCallback, useState} from 'react'\n\nimport {getAsset} from '../actions/assets'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport type {MuxAsset, VideoAssetDocument} from '../util/types'\nimport {useClient} from './useClient'\n\ntype ResyncAssetState = 'idle' | 'syncing' | 'success' | 'error'\n\ninterface UseResyncAssetOptions {\n showToast?: boolean\n onSuccess?: (updatedData: MuxAsset) => void\n onError?: (error: unknown) => void\n}\n\ninterface UseResyncAssetReturn {\n resyncState: ResyncAssetState\n resyncError: unknown\n resyncAsset: (asset: VideoAssetDocument) => Promise<MuxAsset | undefined>\n isResyncing: boolean\n}\n\nexport function useResyncAsset(options?: UseResyncAssetOptions): UseResyncAssetReturn {\n const client = useClient()\n const toast = useToast()\n const [resyncState, setResyncState] = useState<ResyncAssetState>('idle')\n const [resyncError, setResyncError] = useState<unknown>(null)\n\n const showToast = options?.showToast ?? false\n\n const resyncAsset = useCallback(\n async (asset: VideoAssetDocument) => {\n if (!asset.assetId) {\n if (showToast) {\n toast.push({\n title: 'Cannot resync',\n description: 'Asset has no Mux ID',\n status: 'error',\n })\n }\n options?.onError?.(new Error('Asset has no Mux ID'))\n return undefined\n }\n\n if (!asset._id) {\n if (showToast) {\n toast.push({\n title: 'Cannot resync',\n description: 'Asset has no document ID',\n status: 'error',\n })\n }\n options?.onError?.(new Error('Asset has no document ID'))\n return undefined\n }\n\n setResyncState('syncing')\n setResyncError(null)\n\n try {\n const response = await getAsset(client, asset.assetId)\n const muxData = response.data\n const dataWithKeys = addKeysToMuxData(muxData)\n\n await client\n .patch(asset._id)\n .set({\n status: muxData.status,\n data: dataWithKeys,\n ...(muxData.meta?.title && {filename: muxData.meta.title}),\n })\n .commit({returnDocuments: false})\n\n setResyncState('success')\n if (showToast) {\n toast.push({\n title: 'Asset synced',\n description: 'Data has been updated from Mux',\n status: 'success',\n })\n }\n\n options?.onSuccess?.(muxData)\n return muxData\n } catch (error) {\n setResyncState('error')\n setResyncError(error)\n console.error('Failed to refresh asset data:', error)\n if (showToast) {\n toast.push({\n title: 'Sync failed',\n description: 'Could not sync asset from Mux',\n status: 'error',\n })\n }\n options?.onError?.(error)\n return undefined\n }\n },\n [client, toast, options, showToast],\n )\n\n return {\n resyncState,\n resyncError,\n resyncAsset,\n isResyncing: resyncState === 'syncing',\n }\n}\n","import type {SanityClient} from '@sanity/client'\n\nimport {getAsset} from '../actions/assets'\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackPolicy'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxTextTrack, VideoAssetDocument} from './types'\n\nexport function extractErrorMessage(\n error: unknown,\n defaultMessage = 'Failed to process request',\n): string {\n let message = ''\n\n if (error && typeof error === 'object') {\n const err = error as {response?: {body?: {message?: string}}; message?: string}\n message = err.response?.body?.message || err.message || ''\n } else if (typeof error === 'string') {\n message = error\n }\n\n if (!message) {\n return defaultMessage\n }\n\n const match = message.match(/\\(([^)]+)\\)/)\n if (match && match[1]) {\n return match[1]\n }\n\n if (message.includes('responded with')) {\n const parts = message.split('(')\n if (parts.length > 1) {\n return parts[parts.length - 1]!.replace(')', '').trim()\n }\n }\n\n return message\n}\n\nexport interface PollTrackStatusOptions {\n client: SanityClient\n assetId: string\n trackName: string\n trackLanguageCode: string\n maxAttempts?: number\n onTrackFound?: (track: MuxTextTrack) => void\n onTrackErrored?: (track: MuxTextTrack) => void\n onTrackReady?: (track: MuxTextTrack) => void\n}\n\nexport interface PollTrackStatusResult {\n track: MuxTextTrack | undefined\n found: boolean\n status: 'ready' | 'preparing' | 'errored' | 'not-found'\n}\n\n/**\n * Polls Mux API to find and track the status of a newly added text track.\n * The track may be in \"preparing\" state initially, then become \"ready\" or \"errored\".\n *\n * @param options - Configuration options for polling\n * @returns Promise resolving to the poll result\n */\nexport async function pollTrackStatus(\n options: PollTrackStatusOptions,\n): Promise<PollTrackStatusResult> {\n const {\n client,\n assetId,\n trackName,\n trackLanguageCode,\n maxAttempts = 10,\n onTrackFound,\n onTrackErrored,\n onTrackReady,\n } = options\n\n const trimmedName = trackName.trim()\n const trimmedLanguageCode = trackLanguageCode.trim()\n let newTrack: MuxTextTrack | undefined\n let attempts = 0\n let trackFound = false\n\n const findTrack = (textTracks: MuxTextTrack[]): MuxTextTrack | undefined => {\n let foundTrack = textTracks.find(\n (track) => track.name === trimmedName && track.language_code === trimmedLanguageCode,\n )\n\n if (!foundTrack) {\n foundTrack = textTracks.find((track) => track.language_code === trimmedLanguageCode)\n }\n\n if (!foundTrack && textTracks.length > 0) {\n foundTrack = textTracks[textTracks.length - 1]\n }\n\n return foundTrack\n }\n\n while (attempts < maxAttempts) {\n try {\n if (attempts > 0) {\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n\n const assetData = await getAsset(client, assetId)\n const textTracks =\n assetData.data.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || []\n\n const foundTrack = findTrack(textTracks)\n\n if (!foundTrack) {\n attempts++\n continue\n }\n\n trackFound = true\n newTrack = foundTrack\n\n if (onTrackFound) {\n onTrackFound(foundTrack)\n }\n\n if (foundTrack.status === 'ready') {\n if (onTrackReady) {\n onTrackReady(foundTrack)\n }\n break\n }\n\n if (foundTrack.status === 'errored') {\n if (onTrackErrored) {\n onTrackErrored(foundTrack)\n }\n return {\n track: foundTrack,\n found: true,\n status: 'errored',\n }\n }\n } catch (error) {\n console.error('Failed to fetch updated asset:', error)\n }\n\n attempts++\n }\n\n if (!newTrack || !trackFound) {\n return {\n track: undefined,\n found: false,\n status: 'not-found',\n }\n }\n\n if (newTrack.status === 'preparing') {\n return {\n track: newTrack,\n found: true,\n status: 'preparing',\n }\n }\n\n return {\n track: newTrack,\n found: true,\n status: 'ready',\n }\n}\n\n/**\n * May throw a Promise. Call this with {@link tryWithSuspend} or rethrow the Promise\n */\nexport async function downloadVttFile(\n client: SanityClient,\n asset: VideoAssetDocument,\n track: MuxTextTrack,\n): Promise<void> {\n if (!track.id) {\n throw new Error('Track ID is missing')\n }\n\n if (track.status !== 'ready') {\n throw new Error(`Track is not ready yet. Status: ${track.status}`)\n }\n\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const playbackId = getPlaybackId(asset)\n if (!playbackId) {\n throw new Error('Playback ID is required')\n }\n\n const playbackPolicy = getPlaybackPolicy(asset)?.policy\n\n let downloadUrl = `https://stream.mux.com/${playbackId}/text/${track.id}.vtt`\n\n if (playbackPolicy === 'signed' || playbackPolicy === 'drm') {\n const token = generateJwt(client, playbackId, 'v')\n downloadUrl += `?token=${token}`\n }\n\n const response = await fetch(downloadUrl)\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`)\n }\n\n const blob = await response.blob()\n const blobUrl = URL.createObjectURL(blob)\n\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = `${asset.filename || 'captions'}-${track.language_code || 'en'}.vtt`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(blobUrl)\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {\n Button,\n Card,\n Checkbox,\n Dialog,\n Flex,\n Label,\n Spinner,\n Stack,\n Text,\n TextInput,\n} from '@sanity/ui'\nimport {Autocomplete} from '@sanity/ui/autocomplete'\nimport {useToast} from '@sanity/ui/toast'\nimport LanguagesList from 'iso-639-1'\nimport {useId, useRef, useState} from 'react'\n\nimport {addTextTrackFromUrl, generateSubtitles, getAsset} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {extractErrorMessage, pollTrackStatus} from '../util/textTracks'\nimport {type MuxTextTrack, SUPPORTED_MUX_LANGUAGES, type VideoAssetDocument} from '../util/types'\n\nconst LANGUAGE_OPTIONS = LanguagesList.getAllCodes().map((code) => ({\n value: code,\n label: LanguagesList.getNativeName(code),\n}))\n\nconst MUX_LANGUAGE_OPTIONS = SUPPORTED_MUX_LANGUAGES.map((lang) => ({\n value: lang.code,\n label: lang.label,\n}))\n\nexport interface Props {\n asset: VideoAssetDocument\n onAdd: (track: MuxTextTrack) => void\n onClose: () => void\n}\n\nexport default function AddCaptionDialog({asset, onAdd, onClose}: Props) {\n const client = useClient()\n const toast = useToast()\n const dialogId = `AddCaptionDialog${useId()}`\n\n const [isAutogenerated, setIsAutogenerated] = useState(false)\n const [vttUrl, setVttUrl] = useState('')\n const [languageCode, setLanguageCode] = useState('')\n const [selectedLanguage, setSelectedLanguage] = useState<{value: string; label: string} | null>(\n null,\n )\n const [name, setName] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadVttFile = async (file: File): Promise<string> => {\n const assetDocument = await client.assets.upload('file', file, {\n filename: file.name,\n })\n return assetDocument.url\n }\n\n const refreshAssetData = async () => {\n if (!asset._id || !asset.assetId) return\n try {\n const latestAssetData = await getAsset(client, asset.assetId)\n const dataWithKeys = addKeysToMuxData(latestAssetData.data)\n await client\n .patch(asset._id)\n .set({data: dataWithKeys, status: latestAssetData.data.status})\n .commit({returnDocuments: false})\n } catch (refreshError) {\n console.error('Failed to refresh asset data:', refreshError)\n }\n }\n\n const handleAddTrackFromUrl = async () => {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const trimmedName = name.trim()\n const trimmedLanguageCode = languageCode.trim()\n\n let vttUrlToUse = vttUrl.trim()\n\n if (selectedFile) {\n try {\n vttUrlToUse = await uploadVttFile(selectedFile)\n } catch (uploadError) {\n toast.push({\n title: 'Failed to upload caption file',\n status: 'error',\n description: 'Could not upload the caption file to Sanity. Please try again.',\n })\n setIsSubmitting(false)\n throw uploadError\n }\n }\n\n await addTextTrackFromUrl(client, asset.assetId, vttUrlToUse, {\n language_code: trimmedLanguageCode,\n name: trimmedName,\n text_type: 'subtitles',\n })\n\n const result = await pollTrackStatus({\n client,\n assetId: asset.assetId,\n trackName: trimmedName,\n trackLanguageCode: trimmedLanguageCode,\n onTrackErrored: async (track) => {\n const errorMessage =\n track.error?.messages?.[0] ||\n track.error?.type ||\n 'The track failed to download from the provided URL'\n toast.push({\n title: 'Caption track failed',\n status: 'error',\n description: errorMessage,\n })\n await refreshAssetData()\n onAdd(track)\n onClose()\n },\n })\n\n if (!result.found || !result.track) {\n toast.push({\n title: 'Caption track may have been added',\n status: 'warning',\n description:\n 'The track was created but its status could not be determined. It may still be processing. Please refresh the page to see if it appears.',\n })\n onClose()\n return\n }\n\n if (result.status === 'errored') {\n return\n }\n\n if (result.status === 'preparing') {\n toast.push({\n title: 'Caption track is processing',\n status: 'info',\n description:\n 'The track was created and is being processed. It will appear in the list shortly.',\n })\n await refreshAssetData()\n onAdd(result.track)\n onClose()\n return\n }\n\n await refreshAssetData()\n toast.push({\n title: 'Caption track added',\n status: 'success',\n description: 'Caption track added successfully',\n })\n\n onAdd(result.track)\n onClose()\n }\n\n const handleGenerateSubtitles = async () => {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const assetData = await getAsset(client, asset.assetId)\n const audioTrack = assetData.data.tracks?.find((track) => track.type === 'audio')\n\n if (!audioTrack || !audioTrack.id) {\n toast.push({\n title: 'No audio track found',\n status: 'error',\n description:\n 'The asset does not have an audio track. Auto-generated subtitles require an audio track.',\n })\n throw new Error('No audio track found')\n }\n\n await generateSubtitles(client, asset.assetId, audioTrack.id, {\n language_code: languageCode.trim(),\n name: name.trim(),\n })\n\n const mockTrackId = `generating-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n const mockTrack: MuxTextTrack = {\n type: 'text',\n id: mockTrackId,\n text_type: 'subtitles',\n text_source: 'generated_live',\n language_code: languageCode.trim(),\n name: name.trim(),\n status: 'preparing',\n }\n\n toast.push({\n title: 'Generating subtitles',\n status: 'success',\n description: 'This may take a few minutes',\n })\n\n onAdd(mockTrack)\n onClose()\n }\n\n const handleSubmit = async () => {\n if (!isAutogenerated) {\n if (!selectedFile && !vttUrl.trim()) {\n toast.push({\n title: 'Caption file or URL required',\n status: 'error',\n description: 'Please select a VTT or SRT file or enter a caption file URL',\n })\n return\n }\n\n if (vttUrl.trim() && !selectedFile) {\n try {\n void new URL(vttUrl.trim())\n } catch {\n toast.push({\n title: 'Invalid URL',\n status: 'error',\n description:\n 'Please enter a valid URL (e.g., https://example.com/subtitles.vtt or subtitles.srt)',\n })\n return\n }\n }\n }\n\n if (!name.trim()) {\n toast.push({\n title: 'Audio name required',\n status: 'error',\n description: 'Please enter an audio name for this caption track',\n })\n return\n }\n\n if (!languageCode.trim()) {\n toast.push({\n title: 'Language code required',\n status: 'error',\n description: 'Please enter a language code (e.g., en, es, fr)',\n })\n return\n }\n\n setIsSubmitting(true)\n\n try {\n if (isAutogenerated) {\n await handleGenerateSubtitles()\n } else {\n await handleAddTrackFromUrl()\n }\n } catch (error) {\n toast.push({\n title: 'Failed to add caption track',\n status: 'error',\n description: extractErrorMessage(error, 'Failed to add caption track'),\n })\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return (\n <Dialog\n id={dialogId}\n header=\"Add Caption Track\"\n onClose={onClose}\n width={1}\n onClickOutside={onClose}\n >\n <Stack padding={4} gap={4}>\n <Stack gap={2}>\n <Flex align=\"center\" marginBottom={3}>\n <Checkbox\n id=\"autogenerated-checkbox\"\n style={{display: 'block'}}\n checked={isAutogenerated}\n onChange={(e) => {\n setIsAutogenerated(e.currentTarget.checked)\n if (e.currentTarget.checked) {\n setVttUrl('')\n }\n }}\n disabled={isSubmitting}\n />\n <Flex flex={1} paddingLeft={2}>\n <Text>\n <label htmlFor=\"autogenerated-checkbox\">Generate captions</label>\n </Text>\n </Flex>\n </Flex>\n {!isAutogenerated && (\n <Stack gap={2}>\n <Card padding={3} marginBottom={2} tone=\"transparent\" border radius={2}>\n <Flex align=\"center\" justify=\"space-between\">\n <Text size={1} muted>\n {selectedFile ? `Selected: ${selectedFile.name}` : 'No file selected'}\n </Text>\n <Button\n icon={UploadIcon}\n text=\"Select File\"\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={() => fileInputRef.current?.click()}\n disabled={isSubmitting}\n />\n </Flex>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".vtt,text/vtt,.srt,application/x-subrip\"\n style={{display: 'none'}}\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0 && !isSubmitting) {\n setSelectedFile(e.target.files[0]!)\n setVttUrl('')\n }\n }}\n />\n </Card>\n <Text size={1} muted style={{textAlign: 'center'}}>\n Or enter the caption file URL\n </Text>\n <Stack gap={2}>\n <Label as=\"label\" htmlFor=\"vtt-url\">\n Caption File URL (.vtt or .srt)\n </Label>\n <TextInput\n id=\"vtt-url\"\n placeholder=\"https://example.com/subtitles.vtt\"\n value={vttUrl}\n onChange={(e) => {\n setVttUrl(e.currentTarget.value)\n setSelectedFile(null)\n }}\n disabled={isSubmitting}\n />\n </Stack>\n </Stack>\n )}\n </Stack>\n\n <Stack gap={2}>\n <Label as=\"label\" htmlFor=\"caption-name\">\n Audio name\n </Label>\n <Autocomplete\n id=\"caption-name\"\n value={selectedLanguage?.value || ''}\n onChange={(newValue) => {\n const options = isAutogenerated ? MUX_LANGUAGE_OPTIONS : LANGUAGE_OPTIONS\n const selected = options.find((opt) => opt.value === newValue)\n if (selected) {\n setSelectedLanguage(selected)\n setLanguageCode(selected.value)\n setName(selected.label)\n }\n }}\n options={isAutogenerated ? MUX_LANGUAGE_OPTIONS : LANGUAGE_OPTIONS}\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 (isAutogenerated ? MUX_LANGUAGE_OPTIONS : LANGUAGE_OPTIONS).find(\n (l) => l.value === value,\n )?.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 disabled={isSubmitting}\n />\n </Stack>\n\n <Stack gap={2}>\n <Label as=\"label\" htmlFor=\"caption-language\">\n Language Code\n </Label>\n <TextInput\n id=\"caption-language\"\n placeholder=\"en-US\"\n value={languageCode}\n onChange={(e) => {\n setLanguageCode(e.currentTarget.value)\n if (selectedLanguage && selectedLanguage.value !== e.currentTarget.value) {\n setSelectedLanguage(null)\n if (!name || name === selectedLanguage.label) {\n setName('')\n }\n }\n }}\n disabled={isSubmitting}\n />\n </Stack>\n\n <Flex gap={2} justify=\"flex-end\" marginTop={2}>\n <Button text=\"Cancel\" mode=\"ghost\" onClick={onClose} disabled={isSubmitting} />\n <Button\n text=\"Add Caption Track\"\n tone=\"primary\"\n icon={\n isSubmitting ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginBottom: '-3px',\n width: '1em',\n height: '1em',\n marginRight: '-6px',\n }}\n />\n ) : (\n <UploadIcon />\n )\n }\n onClick={handleSubmit}\n disabled={isSubmitting}\n />\n </Flex>\n </Stack>\n </Dialog>\n )\n}\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {TranslateIcon} from '@sanity/icons/Translate'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Button, Card, Dialog, Flex, Label, Spinner, Stack, Text, TextInput} from '@sanity/ui'\nimport {Autocomplete} from '@sanity/ui/autocomplete'\nimport {useToast} from '@sanity/ui/toast'\nimport LanguagesList from 'iso-639-1'\nimport {useEffect, useId, useRef, useState} from 'react'\n\nimport {addTextTrackFromUrl, deleteTextTrack, getAsset} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {generateJwt} from '../util/generateJwt'\nimport {getPlaybackId} from '../util/getPlaybackPolicy'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {downloadVttFile, extractErrorMessage, pollTrackStatus} from '../util/textTracks'\nimport type {MuxTextTrack, VideoAssetDocument} from '../util/types'\n\nconst LANGUAGE_OPTIONS = LanguagesList.getAllCodes().map((code) => ({\n value: code,\n label: LanguagesList.getNativeName(code),\n}))\n\nexport interface Props {\n asset: VideoAssetDocument\n track: MuxTextTrack\n onUpdate: (track: MuxTextTrack, oldTrackId?: string) => void\n onClose: () => void\n}\n\nexport default function EditCaptionDialog({asset, track, onUpdate, onClose}: Props) {\n const client = useClient()\n const toast = useToast()\n const dialogId = `EditCaptionDialog${useId()}`\n\n const isAutogenerated =\n track.text_source === 'generated_live' ||\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_vod'\n\n const [vttUrl, setVttUrl] = useState('')\n const [languageCode, setLanguageCode] = useState(track.language_code || '')\n const [selectedLanguage, setSelectedLanguage] = useState<{value: string; label: string} | null>(\n () => {\n const baseCode = track.language_code?.split('-')[0]\n const found = LANGUAGE_OPTIONS.find(\n (opt) => opt.value === track.language_code || opt.value === baseCode,\n )\n if (found) return found\n if (track.name) {\n const foundByName = LANGUAGE_OPTIONS.find((opt) => opt.label === track.name)\n if (foundByName) return foundByName\n }\n return null\n },\n )\n const [name, setName] = useState(track.name || '')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [downloading, setDownloading] = useState(false)\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n // oxlint-disable-next-line react/react-compiler\n setLanguageCode(track.language_code || '')\n setName(track.name || '')\n setVttUrl('')\n const baseCode = track.language_code?.split('-')[0]\n const foundByCode = LANGUAGE_OPTIONS.find(\n (opt) => opt.value === track.language_code || opt.value === baseCode,\n )\n const foundByName = track.name ? LANGUAGE_OPTIONS.find((opt) => opt.label === track.name) : null\n setSelectedLanguage(foundByCode || foundByName || null)\n }, [track, asset, client])\n\n const handleDownloadCurrentFile = async () => {\n setDownloading(true)\n try {\n await downloadVttFile(client, asset, track)\n } catch (error) {\n let errorMessage = 'Please try again'\n let title = 'Failed to download VTT file'\n\n if (error instanceof Error) {\n errorMessage = error.message\n if (error.message.includes('Track')) {\n title = 'Cannot download'\n }\n } else if (error === 'Track ID is missing' || error === 'Track is not ready yet') {\n errorMessage = error\n title = 'Cannot download'\n }\n\n toast.push({\n title,\n status: 'error',\n description: errorMessage,\n })\n } finally {\n setDownloading(false)\n }\n }\n\n const getCurrentFileName = () => {\n if (track.id && asset.filename) {\n return `${asset.filename}-${track.language_code || 'en'}.vtt`\n }\n return `captions-${track.language_code || 'en'}.vtt`\n }\n\n const uploadVttFile = async (file: File): Promise<string> => {\n const assetDocument = await client.assets.upload('file', file, {\n filename: file.name,\n })\n return assetDocument.url\n }\n\n const refreshAssetData = async () => {\n if (!asset._id || !asset.assetId) return\n try {\n const latestAssetData = await getAsset(client, asset.assetId)\n const dataWithKeys = addKeysToMuxData(latestAssetData.data)\n await client\n .patch(asset._id)\n .set({data: dataWithKeys, status: latestAssetData.data.status})\n .commit({returnDocuments: false})\n } catch (refreshError) {\n console.error('Failed to refresh asset data:', refreshError)\n }\n }\n\n const handleUpdateTrackWithNewUrl = async () => {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const trimmedName = name.trim()\n const trimmedLanguageCode = languageCode.trim()\n\n const oldTrackId = track.id\n\n try {\n await deleteTextTrack(client, asset.assetId, oldTrackId)\n } catch (deleteError) {\n toast.push({\n title: 'Failed to delete old track',\n status: 'error',\n description: 'Could not delete the old track. Please try again or delete it manually.',\n })\n setIsSubmitting(false)\n throw deleteError\n }\n\n let vttUrlToUse = vttUrl.trim()\n\n if (selectedFile) {\n try {\n vttUrlToUse = await uploadVttFile(selectedFile)\n } catch (uploadError) {\n toast.push({\n title: 'Failed to upload VTT file',\n status: 'error',\n description: 'Could not upload the VTT file to Sanity. Please try again.',\n })\n setIsSubmitting(false)\n throw uploadError\n }\n }\n\n try {\n await addTextTrackFromUrl(client, asset.assetId, vttUrlToUse, {\n language_code: trimmedLanguageCode,\n name: trimmedName,\n text_type: 'subtitles',\n })\n } catch (error: unknown) {\n toast.push({\n title: 'Failed to update caption track',\n status: 'error',\n description: extractErrorMessage(error, 'Failed to update caption track'),\n })\n setIsSubmitting(false)\n throw error\n }\n\n const result = await pollTrackStatus({\n client,\n assetId: asset.assetId,\n trackName: trimmedName,\n trackLanguageCode: trimmedLanguageCode,\n onTrackErrored: async (erroredTrack) => {\n const errorMessage =\n erroredTrack.error?.messages?.[0] ||\n erroredTrack.error?.type ||\n 'The track failed to download from the provided URL'\n toast.push({\n title: 'Caption track failed',\n status: 'error',\n description: errorMessage,\n })\n await refreshAssetData()\n onUpdate(erroredTrack, oldTrackId)\n setIsSubmitting(false)\n },\n })\n\n if (!result.found || !result.track) {\n toast.push({\n title: 'Caption track may have been updated',\n status: 'warning',\n description:\n 'The track was updated but its status could not be determined. It may still be processing. Please refresh the page to see if it appears.',\n })\n setIsSubmitting(false)\n return\n }\n\n if (result.status === 'errored') {\n return\n }\n\n await refreshAssetData()\n\n if (result.status === 'preparing') {\n toast.push({\n title: 'Caption track is processing',\n status: 'info',\n description:\n 'The track was updated and is being processed. It will appear in the list shortly.',\n })\n } else {\n toast.push({\n title: 'Caption track updated',\n status: 'success',\n description: 'Caption track updated successfully',\n })\n }\n\n onUpdate(result.track, oldTrackId)\n setIsSubmitting(false)\n }\n\n const handleSubmit = async () => {\n if (!name.trim()) {\n toast.push({\n title: 'Audio name required',\n status: 'error',\n description: 'Please enter an audio name for this caption track',\n })\n return\n }\n\n if (!languageCode.trim()) {\n toast.push({\n title: 'Language code required',\n status: 'error',\n description: 'Please enter a language code (e.g., en, es, fr)',\n })\n return\n }\n\n setIsSubmitting(true)\n\n try {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n\n const originalVttUrl = (() => {\n if (isAutogenerated || !track.id) return ''\n const playbackId = getPlaybackId(asset)\n if (!playbackId) return ''\n let url = `https://stream.mux.com/${playbackId}/text/${track.id}.vtt`\n if (getPlaybackPolicy(asset)?.policy === 'signed') {\n const token = generateJwt(client, playbackId, 'v')\n url += `?token=${token}`\n }\n return url\n })()\n\n const urlChanged =\n selectedFile !== null || (vttUrl.trim() && vttUrl.trim() !== originalVttUrl)\n\n if (!urlChanged) {\n toast.push({\n title: 'No changes',\n status: 'info',\n description:\n 'Please provide a new VTT file or URL using the \"Replace\" button or URL field to update the track.',\n })\n setIsSubmitting(false)\n return\n }\n\n if (urlChanged) {\n if (!selectedFile && vttUrl.trim()) {\n try {\n void new URL(vttUrl.trim())\n } catch {\n toast.push({\n title: 'Invalid URL',\n status: 'error',\n description: 'Please enter a valid URL (e.g., https://example.com/subtitles.vtt)',\n })\n setIsSubmitting(false)\n return\n }\n }\n\n if (!selectedFile && !vttUrl.trim()) {\n toast.push({\n title: 'VTT file or URL required',\n status: 'error',\n description: 'Please select a VTT file or enter a VTT file URL',\n })\n setIsSubmitting(false)\n return\n }\n\n await handleUpdateTrackWithNewUrl()\n }\n\n onClose()\n } catch (error) {\n toast.push({\n title: 'Failed to update caption track',\n status: 'error',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return (\n <Dialog\n id={dialogId}\n header=\"Edit Caption Track\"\n onClose={onClose}\n width={1}\n onClickOutside={onClose}\n >\n <Stack padding={4} gap={4}>\n <Stack gap={2}>\n <Card padding={3} marginBottom={2} tone=\"transparent\" border radius={2}>\n <Flex align=\"center\" justify=\"space-between\">\n <Text>{getCurrentFileName()}</Text>\n <Flex gap={2}>\n {track.status !== 'errored' && (\n <Button\n icon={\n downloading ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <DownloadIcon />\n )\n }\n text=\"Download\"\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={handleDownloadCurrentFile}\n disabled={downloading || isSubmitting}\n />\n )}\n <Button\n icon={UploadIcon}\n text=\"Replace\"\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={() => fileInputRef.current?.click()}\n disabled={isSubmitting}\n />\n </Flex>\n </Flex>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".vtt,text/vtt\"\n style={{display: 'none'}}\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0 && !isSubmitting) {\n setSelectedFile(e.target.files[0]!)\n setVttUrl('')\n }\n }}\n />\n {selectedFile && (\n <Text size={1} muted style={{marginTop: 8}}>\n Selected: {selectedFile.name}\n </Text>\n )}\n </Card>\n <Stack gap={2}>\n <Label as=\"label\" htmlFor=\"vtt-url\">\n VTT File URL\n </Label>\n <TextInput\n id=\"vtt-url\"\n placeholder=\"https://example.com/subtitles.vtt\"\n value={vttUrl}\n onChange={(e) => {\n setVttUrl(e.currentTarget.value)\n setSelectedFile(null)\n }}\n disabled={isSubmitting}\n />\n <Text size={1} muted>\n Add a URL to replace the existing VTT file with a new one\n </Text>\n </Stack>\n </Stack>\n\n <Stack gap={2}>\n <Label as=\"label\" htmlFor=\"caption-name\">\n Audio name\n </Label>\n <Autocomplete\n id=\"caption-name\"\n value={selectedLanguage?.value || ''}\n onChange={(newValue) => {\n const selected = LANGUAGE_OPTIONS.find((opt) => opt.value === newValue)\n if (selected) {\n setSelectedLanguage(selected)\n setLanguageCode(selected.value)\n setName(selected.label)\n }\n }}\n options={LANGUAGE_OPTIONS}\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) => LANGUAGE_OPTIONS.find((l) => l.value === value)?.label || value}\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 disabled={isSubmitting}\n />\n </Stack>\n\n <Stack gap={2}>\n <Label as=\"label\" htmlFor=\"caption-language\">\n Language Code\n </Label>\n <TextInput\n id=\"caption-language\"\n placeholder=\"en-US\"\n value={languageCode}\n onChange={(e) => {\n setLanguageCode(e.currentTarget.value)\n if (selectedLanguage && selectedLanguage.value !== e.currentTarget.value) {\n setSelectedLanguage(null)\n if (!name || name === selectedLanguage.label) {\n setName('')\n }\n }\n }}\n disabled={isSubmitting}\n />\n </Stack>\n\n <Flex gap={2} justify=\"flex-end\" marginTop={2}>\n <Button text=\"Cancel\" mode=\"ghost\" onClick={onClose} disabled={isSubmitting} />\n <Button\n text=\"Update Caption Track\"\n tone=\"primary\"\n icon={\n isSubmitting ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginBottom: '-3px',\n width: '1em',\n height: '1em',\n marginRight: '-6px',\n }}\n />\n ) : (\n UploadIcon\n )\n }\n onClick={handleSubmit}\n disabled={isSubmitting}\n />\n </Flex>\n </Stack>\n </Dialog>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {DownloadIcon} from '@sanity/icons/Download'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Card, Dialog, Flex, Heading, Spinner, Stack, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useEffect, useId, useMemo, useState} from 'react'\n\nimport {deleteTextTrack} from '../actions/assets'\nimport {useClient} from '../hooks/useClient'\nimport {useResyncAsset} from '../hooks/useResyncAsset'\nimport {downloadVttFile} from '../util/textTracks'\nimport type {MuxTextTrack, VideoAssetDocument} from '../util/types'\nimport AddCaptionDialog from './AddCaptionDialog'\nimport EditCaptionDialog from './EditCaptionDialog'\n\ninterface TrackCardProps {\n track: MuxTextTrack\n iconOnly: boolean\n downloadingTrackId: string | null\n deletingTrackId: string | null\n trackToEdit: MuxTextTrack | null\n getTrackSourceLabel: (track: MuxTextTrack) => string\n handleDownload: (track: MuxTextTrack) => void\n setTrackToEdit: (track: MuxTextTrack) => void\n setTrackToDelete: (track: MuxTextTrack) => void\n}\n\nfunction TrackCard({\n track,\n iconOnly,\n downloadingTrackId,\n deletingTrackId,\n trackToEdit,\n getTrackSourceLabel,\n handleDownload,\n setTrackToEdit,\n setTrackToDelete,\n}: TrackCardProps) {\n const isDisabled = (action: 'download' | 'edit' | 'delete') => {\n if (action === 'download') {\n return (\n downloadingTrackId !== null || deletingTrackId === track.id || trackToEdit?.id === track.id\n )\n }\n if (action === 'edit') {\n return (\n downloadingTrackId === track.id ||\n deletingTrackId === track.id ||\n trackToEdit?.id === track.id\n )\n }\n return (\n downloadingTrackId === track.id || deletingTrackId !== null || trackToEdit?.id === track.id\n )\n }\n\n const renderActionButtons = () => {\n if (track.status === 'preparing') {\n return (\n <Flex align=\"center\" gap={2}>\n <Spinner\n muted\n style={{\n width: '0.75em',\n height: '0.75em',\n verticalAlign: 'middle',\n display: 'inline-block',\n marginBottom: '-2px',\n }}\n />\n <Text size={1} muted>\n Processing...\n </Text>\n </Flex>\n )\n }\n\n return (\n <Flex gap={2}>\n {track.status !== 'errored' && (\n <Button\n icon={\n downloadingTrackId === track.id ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <DownloadIcon />\n )\n }\n text={iconOnly ? undefined : 'Download'}\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n onClick={() => handleDownload(track)}\n disabled={isDisabled('download')}\n title=\"Download\"\n />\n )}\n <Button\n icon={<EditIcon />}\n text={iconOnly ? undefined : 'Edit'}\n mode=\"ghost\"\n tone=\"primary\"\n fontSize={1}\n padding={2}\n disabled={isDisabled('edit')}\n onClick={() => setTrackToEdit(track)}\n title=\"Edit\"\n />\n <Button\n icon={\n deletingTrackId === track.id ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <TrashIcon />\n )\n }\n text={iconOnly ? undefined : 'Delete'}\n mode=\"ghost\"\n tone=\"critical\"\n fontSize={1}\n padding={2}\n disabled={isDisabled('delete')}\n onClick={() => setTrackToDelete(track)}\n title=\"Delete\"\n />\n </Flex>\n )\n }\n\n return (\n <Card\n padding={3}\n radius={2}\n tone={track.status === 'errored' ? 'caution' : 'transparent'}\n border\n >\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Stack gap={2} flex={1}>\n <Flex align=\"center\" gap={2}>\n <Text weight=\"semibold\">{track.name || 'Untitled'}</Text>\n <Text size={1} muted>\n ({getTrackSourceLabel(track)})\n </Text>\n {track.status === 'errored' && (\n <ErrorOutlineIcon\n style={{color: 'var(--card-critical-color)'}}\n aria-label=\"Error\"\n fontSize={20}\n />\n )}\n </Flex>\n {track.language_code && (\n <Text size={1} muted>\n Language: {track.language_code}\n </Text>\n )}\n {track.status === 'errored' && track.error && (\n <Text size={1} style={{color: 'var(--card-critical-color)'}}>\n {track.error.messages?.[0] || track.error.type || 'Failed to process track'}\n </Text>\n )}\n </Stack>\n {renderActionButtons()}\n </Flex>\n </Card>\n )\n}\n\ninterface TextTracksManagerProps {\n asset: VideoAssetDocument\n iconOnly?: boolean\n tracks?: MuxTextTrack[]\n collapseTracks?: boolean\n}\n\nexport default function TextTracksManager({\n asset,\n iconOnly = false,\n tracks: propTracks,\n collapseTracks = false,\n}: TextTracksManagerProps) {\n const client = useClient()\n const toast = useToast()\n const dialogId = `DeleteCaptionDialog${useId()}`\n const {resyncAsset} = useResyncAsset()\n const [downloadingTrackId, setDownloadingTrackId] = useState<string | null>(null)\n const [deletingTrackId, setDeletingTrackId] = useState<string | null>(null)\n const [addedTracks, setAddedTracks] = useState<MuxTextTrack[]>([])\n const [updatedTracks, setUpdatedTracks] = useState<Map<string, MuxTextTrack>>(new Map())\n const [trackActivityOrder, setTrackActivityOrder] = useState<Map<string, number>>(new Map())\n const [autogeneratedTrackIds, setAutogeneratedTrackIds] = useState<Set<string>>(new Set())\n const [trackToDelete, setTrackToDelete] = useState<MuxTextTrack | null>(null)\n const [trackToEdit, setTrackToEdit] = useState<MuxTextTrack | null>(null)\n const [showAddDialog, setShowAddDialog] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n\n const MAX_VISIBLE_TRACKS = 4\n\n const realTracks: MuxTextTrack[] = propTracks\n ? propTracks\n : asset.data?.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || []\n\n const activeTracks = realTracks.filter(\n (track) =>\n track.id &&\n (track.status === 'ready' || track.status === 'preparing' || track.status === 'errored'),\n )\n\n const allTracks = useMemo(() => {\n const tracksWithUpdates = activeTracks.map((track) => {\n const updated = updatedTracks.get(track.id)\n return updated || track\n })\n\n const isMockTrackReplaced = (mockTrack: MuxTextTrack, realTracksList: MuxTextTrack[]) => {\n if (!mockTrack.id || !mockTrack.id.startsWith('generating-')) {\n return false\n }\n return realTracksList.some((realTrack) => {\n const nameMatches = realTrack.name === mockTrack.name\n const languageMatches = realTrack.language_code === mockTrack.language_code\n if (!nameMatches || !languageMatches) {\n return false\n }\n if (realTrack.status === 'ready') {\n const isGenerated =\n realTrack.text_source === 'generated_live' ||\n realTrack.text_source === 'generated_live_final' ||\n realTrack.text_source === 'generated_vod'\n return isGenerated\n }\n if (realTrack.status === 'preparing') {\n return true\n }\n return false\n })\n }\n\n const isTrackAlreadyInRealTracks = (\n addedTrack: MuxTextTrack,\n realTracksList: MuxTextTrack[],\n ) => {\n if (!addedTrack.id) return false\n if (addedTrack.id.startsWith('generating-')) {\n return isMockTrackReplaced(addedTrack, realTracksList)\n }\n return realTracksList.some((realTrack) => realTrack.id === addedTrack.id)\n }\n\n const tracksToKeep = addedTracks.filter((addedTrack) => {\n if (addedTrack.id && addedTrack.id.startsWith('generating-')) {\n return !isMockTrackReplaced(addedTrack, tracksWithUpdates)\n }\n return !isTrackAlreadyInRealTracks(addedTrack, tracksWithUpdates)\n })\n\n return [...tracksWithUpdates, ...tracksToKeep]\n }, [activeTracks, addedTracks, updatedTracks])\n\n useEffect(() => {\n const newAutogeneratedIds = new Set<string>()\n\n activeTracks.forEach((track) => {\n if (\n track.id &&\n (track.text_source === 'generated_live' ||\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_vod')\n ) {\n newAutogeneratedIds.add(track.id)\n }\n })\n\n addedTracks.forEach((mockTrack) => {\n if (mockTrack.id && mockTrack.id.startsWith('generating-')) {\n const realTrack = activeTracks.find((rt) => {\n const nameMatches = rt.name === mockTrack.name\n const languageMatches = rt.language_code === mockTrack.language_code\n return nameMatches && languageMatches\n })\n if (realTrack?.id) {\n newAutogeneratedIds.add(realTrack.id)\n }\n }\n })\n\n // oxlint-disable-next-line react/react-compiler\n setAutogeneratedTrackIds((prev) => {\n let hasNew = false\n const updated = new Set(prev)\n newAutogeneratedIds.forEach((id) => {\n if (!prev.has(id)) {\n updated.add(id)\n hasNew = true\n }\n })\n return hasNew ? updated : prev\n })\n }, [activeTracks, addedTracks])\n\n useEffect(() => {\n const preparingTracks = allTracks.filter((track) => track.status === 'preparing')\n if (preparingTracks.length === 0 || !asset.assetId || !asset._id) {\n return undefined\n }\n\n const interval = setInterval(async () => {\n try {\n const muxData = await resyncAsset(asset)\n if (!muxData) return\n\n const fetchedTracks =\n muxData.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || []\n\n const isMockTrackReplaced = (\n mockTrack: MuxTextTrack,\n fetchedTracksList: MuxTextTrack[],\n ) => {\n if (!mockTrack.id || !mockTrack.id.startsWith('generating-')) {\n return false\n }\n return fetchedTracksList.some((realTrack) => {\n const nameMatches = realTrack.name === mockTrack.name\n const languageMatches = realTrack.language_code === mockTrack.language_code\n if (!nameMatches || !languageMatches) {\n return false\n }\n if (realTrack.status === 'ready') {\n const isGenerated =\n realTrack.text_source === 'generated_live' ||\n realTrack.text_source === 'generated_live_final' ||\n realTrack.text_source === 'generated_vod'\n return isGenerated\n }\n if (realTrack.status === 'preparing') {\n return true\n }\n return false\n })\n }\n\n const newAutogeneratedIds = new Set<string>()\n fetchedTracks.forEach((track) => {\n if (\n track.id &&\n (track.text_source === 'generated_live' ||\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_vod')\n ) {\n newAutogeneratedIds.add(track.id)\n }\n })\n\n const findMatchingRealTrack = (mockTrack: MuxTextTrack, tracksList: MuxTextTrack[]) => {\n return tracksList.find((rt) => {\n const nameMatches = rt.name === mockTrack.name\n const languageMatches = rt.language_code === mockTrack.language_code\n return nameMatches && languageMatches\n })\n }\n\n setAddedTracks((prev) => {\n return prev.filter((mockTrack) => {\n if (mockTrack.id && mockTrack.id.startsWith('generating-')) {\n const replaced = isMockTrackReplaced(mockTrack, fetchedTracks)\n if (replaced) {\n const realTrack = findMatchingRealTrack(mockTrack, fetchedTracks)\n if (realTrack?.id) {\n newAutogeneratedIds.add(realTrack.id)\n setTrackActivityOrder((prevOrder) => {\n const mockOrder = prevOrder.get(mockTrack.id)\n if (mockOrder) {\n const newMap = new Map(prevOrder)\n newMap.set(realTrack.id, mockOrder)\n return newMap\n }\n return prevOrder\n })\n }\n }\n return !replaced\n }\n return true\n })\n })\n\n if (newAutogeneratedIds.size > 0) {\n setAutogeneratedTrackIds((prevIds) => {\n const updated = new Set(prevIds)\n newAutogeneratedIds.forEach((id) => updated.add(id))\n return updated\n })\n }\n } catch (error) {\n console.error('Failed to refresh asset data:', error)\n }\n }, 3000) // Poll every 3 seconds\n\n return () => clearInterval(interval)\n }, [allTracks, asset, resyncAsset])\n\n const visibleTracks = allTracks\n .filter(\n (track) =>\n track.status === 'ready' || track.status === 'preparing' || track.status === 'errored',\n )\n .sort((a, b) => {\n const orderA = trackActivityOrder.get(a.id) || 0\n const orderB = trackActivityOrder.get(b.id) || 0\n\n if (orderA > 0 && orderB > 0) {\n return orderB - orderA\n }\n\n if (orderA > 0) return -1\n if (orderB > 0) return 1\n\n const aIsPreparing = a.status === 'preparing'\n const bIsPreparing = b.status === 'preparing'\n if (aIsPreparing && !bIsPreparing) return -1\n if (!aIsPreparing && bIsPreparing) return 1\n\n const aIsAutogenerated =\n (a.id && a.id.startsWith('generating-')) || (a.id && autogeneratedTrackIds.has(a.id))\n const bIsAutogenerated =\n (b.id && b.id.startsWith('generating-')) || (b.id && autogeneratedTrackIds.has(b.id))\n if (aIsAutogenerated && !bIsAutogenerated) return -1\n if (!aIsAutogenerated && bIsAutogenerated) return 1\n\n return 0\n })\n\n const handleDownload = async (track: MuxTextTrack) => {\n if (!track.id) return\n\n setDownloadingTrackId(track.id)\n try {\n await downloadVttFile(client, asset, track)\n } catch (error) {\n toast.push({\n title: 'Failed to download VTT file',\n status: 'error',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setDownloadingTrackId(null)\n }\n }\n\n const confirmDelete = async () => {\n if (!trackToDelete || !trackToDelete.id) return\n\n const track = trackToDelete\n setTrackToDelete(null)\n setDeletingTrackId(track.id)\n try {\n if (!asset.assetId) {\n throw new Error('Asset ID is required')\n }\n await deleteTextTrack(client, asset.assetId, track.id)\n\n // Refresh asset data after deletion\n await resyncAsset(asset)\n\n toast.push({\n title: 'Successfully deleted caption track',\n status: 'success',\n })\n\n setAddedTracks((prev) => prev.filter((t) => t.id !== track.id))\n setUpdatedTracks((prev) => {\n const newMap = new Map(prev)\n newMap.delete(track.id)\n return newMap\n })\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.delete(track.id)\n return newMap\n })\n setAutogeneratedTrackIds((prev) => {\n const updated = new Set(prev)\n updated.delete(track.id)\n return updated\n })\n } catch (error) {\n toast.push({\n title: 'Failed to delete caption track',\n status: 'error',\n description: error instanceof Error ? error.message : 'Please try again',\n })\n } finally {\n setDeletingTrackId(null)\n }\n }\n\n const handleAddTrack = (track: MuxTextTrack) => {\n setAddedTracks((prev) => [...prev, track])\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.set(track.id, prev.size + 1)\n return newMap\n })\n setShowAddDialog(false)\n }\n\n const handleUpdateTrack = async (updatedTrack: MuxTextTrack, oldTrackId?: string) => {\n if (oldTrackId) {\n setAddedTracks((prev) => prev.filter((t) => t.id !== oldTrackId))\n setUpdatedTracks((prev) => {\n const newMap = new Map(prev)\n newMap.delete(oldTrackId)\n return newMap\n })\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.delete(oldTrackId)\n return newMap\n })\n setAutogeneratedTrackIds((prev) => {\n const updated = new Set(prev)\n updated.delete(oldTrackId)\n return updated\n })\n }\n\n const isAddedTrack = addedTracks.some((t) => t.id === updatedTrack.id)\n\n if (isAddedTrack) {\n setAddedTracks((prev) => prev.map((t) => (t.id === updatedTrack.id ? updatedTrack : t)))\n } else {\n setUpdatedTracks((prev) => {\n const newMap = new Map(prev)\n newMap.set(updatedTrack.id, updatedTrack)\n return newMap\n })\n }\n\n setTrackActivityOrder((prev) => {\n const newMap = new Map(prev)\n newMap.set(updatedTrack.id, prev.size + 1)\n return newMap\n })\n\n setTrackToEdit(null)\n\n // Refresh asset data after update\n await resyncAsset(asset)\n }\n\n const getTrackSourceLabel = (track: MuxTextTrack) => {\n if (track.id && track.id.startsWith('generating-')) {\n return 'Auto-generated'\n }\n if (track.id && autogeneratedTrackIds.has(track.id)) {\n return 'Auto-generated'\n }\n if (\n track.text_source === 'generated_live_final' ||\n track.text_source === 'generated_live' ||\n track.text_source === 'generated_vod'\n ) {\n return 'Auto-generated'\n }\n if (track.text_source === 'uploaded') {\n return 'Uploaded'\n }\n return 'Custom'\n }\n\n if (visibleTracks.length === 0 && !showAddDialog) {\n return (\n <Stack gap={3}>\n <Flex justify=\"flex-end\">\n <Button\n icon={AddIcon}\n text=\"Add Caption\"\n tone=\"primary\"\n onClick={() => setShowAddDialog(true)}\n />\n </Flex>\n <Card padding={4} radius={2} tone=\"transparent\" border>\n <Text size={1} muted>\n No captions available. Add captions when uploading a video or add them manually.\n </Text>\n </Card>\n {showAddDialog && (\n <AddCaptionDialog\n asset={asset}\n onAdd={handleAddTrack}\n onClose={() => setShowAddDialog(false)}\n />\n )}\n </Stack>\n )\n }\n\n const displayedTracks =\n collapseTracks && !isExpanded ? visibleTracks.slice(0, MAX_VISIBLE_TRACKS) : visibleTracks\n const hasMoreTracks = collapseTracks && visibleTracks.length > MAX_VISIBLE_TRACKS\n\n return (\n <Stack gap={3}>\n <Flex justify=\"flex-end\">\n <Button\n icon={AddIcon}\n text=\"Add Caption\"\n tone=\"primary\"\n onClick={() => setShowAddDialog(true)}\n />\n </Flex>\n\n {displayedTracks.map((track) => (\n <TrackCard\n key={track.id}\n track={track}\n iconOnly={iconOnly}\n downloadingTrackId={downloadingTrackId}\n deletingTrackId={deletingTrackId}\n trackToEdit={trackToEdit}\n getTrackSourceLabel={getTrackSourceLabel}\n handleDownload={handleDownload}\n setTrackToEdit={setTrackToEdit}\n setTrackToDelete={setTrackToDelete}\n />\n ))}\n\n {hasMoreTracks && (\n <Flex justify=\"center\">\n <Button\n icon={isExpanded ? ChevronUpIcon : ChevronDownIcon}\n text={\n isExpanded ? 'Show less' : `Show ${visibleTracks.length - MAX_VISIBLE_TRACKS} more`\n }\n mode=\"ghost\"\n tone=\"primary\"\n onClick={() => setIsExpanded(!isExpanded)}\n />\n </Flex>\n )}\n\n {trackToDelete && (\n <Dialog\n animate\n id={dialogId}\n header=\"Delete track\"\n onClose={() => setTrackToDelete(null)}\n onClickOutside={() => setTrackToDelete(null)}\n width={1}\n >\n <Card\n padding={3}\n style={{\n minHeight: '150px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Stack gap={3}>\n <Heading size={2}>\n Are you sure you want to delete "\n {trackToDelete.name || trackToDelete.language_code || 'Untitled'}"?\n </Heading>\n <Text size={2}>This action is irreversible</Text>\n <Stack gap={4} marginY={4}>\n <Box>\n <Button\n icon={\n deletingTrackId === trackToDelete.id ? (\n <Spinner\n style={{\n verticalAlign: 'middle',\n display: 'inline-block',\n marginTop: '-2px',\n width: '0.5em',\n height: '0.5em',\n }}\n />\n ) : (\n <TrashIcon />\n )\n }\n fontSize={2}\n padding={3}\n text=\"Delete track\"\n tone=\"critical\"\n onClick={confirmDelete}\n disabled={deletingTrackId !== null}\n />\n </Box>\n </Stack>\n </Stack>\n </Card>\n </Dialog>\n )}\n\n {showAddDialog && (\n <AddCaptionDialog\n asset={asset}\n onAdd={handleAddTrack}\n onClose={() => setShowAddDialog(false)}\n />\n )}\n\n {trackToEdit && (\n <EditCaptionDialog\n asset={asset}\n track={trackToEdit}\n onUpdate={handleUpdateTrack}\n onClose={() => setTrackToEdit(null)}\n />\n )}\n </Stack>\n )\n}\n","import {createContext, useContext, useMemo} 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 const value = useMemo(() => ({dialogState, setDialogState}), [dialogState, setDialogState])\n return <DialogStateContext.Provider value={value}>{children}</DialogStateContext.Provider>\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 type {MuxPlaybackId, MuxVideoUrl} from './types'\n\ninterface VideoSrcOptions {\n muxPlaybackId: MuxPlaybackId\n client: SanityClient\n}\n\n/**\n * May throw a Promise. Call this with {@link tryWithSuspend} or rethrow the Promise\n */\nexport function getVideoSrc({client, muxPlaybackId}: VideoSrcOptions): MuxVideoUrl {\n const searchParams = new URLSearchParams()\n\n if (muxPlaybackId.policy === 'signed' || muxPlaybackId.policy === 'drm') {\n const token = generateJwt(client, muxPlaybackId.id, 'v')\n searchParams.set('token', token)\n }\n\n return `https://stream.mux.com/${muxPlaybackId.id}.m3u8?${searchParams}`\n}\n","import {Dialog, Stack} from '@sanity/ui'\nimport {useId} from 'react'\n\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport type {VideoAssetDocument} from '../util/types'\nimport TextTracksManager from './TextTracksManager'\n\nexport interface Props {\n asset: VideoAssetDocument\n}\n\nexport default function CaptionsDialog({asset}: Props) {\n const {setDialogState} = useDialogStateContext()\n const dialogId = `CaptionsDialog${useId()}`\n\n return (\n <Dialog id={dialogId} header=\"Edit Captions\" onClose={() => setDialogState(false)} width={1}>\n <Stack padding={4}>\n <TextTracksManager asset={asset} />\n </Stack>\n </Dialog>\n )\n}\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 {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(() => setDialogState(false))\n .catch(setSaveThumbnailError)\n .finally(() => setSaving(false))\n }\n const width = 300 * getDevicePixelRatio({maxDpr: 2})\n\n if (saveThumbnailError) {\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 gap={3} padding={3}>\n <Stack gap={2}>\n <Text size={1} weight=\"semibold\">\n Current:\n </Text>\n <VideoThumbnail asset={asset} width={width} staticImage />\n </Stack>\n <Stack gap={2}>\n <Text size={1} weight=\"semibold\">\n New:\n </Text>\n <VideoThumbnail asset={assetWithNewThumbnail} width={width} staticImage />\n </Stack>\n\n <Stack gap={2}>\n <Flex align={'center'} justify={'center'}>\n <Text size={5} weight=\"semibold\">\n Or\n </Text>\n </Flex>\n </Stack>\n\n <Stack gap={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 type {SVGProps} from 'react'\n\nexport function AudioIcon(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 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 )\n}\n","import {Box, Dialog, Stack} from '@sanity/ui'\nimport {useId} from 'react'\n\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport {getMezzanineStatus} from '../hooks/useMezzanine'\nimport {DIALOGS_Z_INDEX} from '../util/constants'\nimport type {VideoAssetDocument} from '../util/types'\nimport Mezzanine from './Mezzanine'\nimport MezzanineExplanation from './MezzanineExplanation'\n\nexport interface Props {\n asset: VideoAssetDocument\n onClose?: () => void\n}\n\n/**\n * Player actions menu entry point: the explanation in the dialog body (until the\n * file is enabled) with the {@link Mezzanine} card below for the action/status.\n */\nexport default function MezzanineDialog({asset, onClose}: Props) {\n const {setDialogState} = useDialogStateContext()\n const dialogId = `MezzanineDialog${useId()}`\n\n const closing = () => {\n onClose?.()\n setDialogState(false)\n }\n\n const status = getMezzanineStatus(asset)\n const showExplanation = status !== 'preparing' && status !== 'ready'\n\n return (\n <Dialog\n id={dialogId}\n header=\"Mezzanine file\"\n onClose={closing}\n zOffset={DIALOGS_Z_INDEX}\n width={1}\n >\n <Box padding={4}>\n <Stack gap={4}>\n {showExplanation && <MezzanineExplanation />}\n <Mezzanine asset={asset} withExplanation={false} />\n </Stack>\n </Box>\n </Dialog>\n )\n}\n","import {type MuxPlayerProps, type MuxPlayerRefAttributes} from '@mux/mux-player-react'\nimport MuxPlayer from '@mux/mux-player-react/lazy'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Card, Text} from '@sanity/ui'\nimport {type PropsWithChildren, Suspense, useMemo, useRef, useState} from 'react'\n\nimport {PLUGIN_VERSION} from '../constants'\nimport {useDialogStateContext} from '../context/DialogStateContext'\nimport {useClient} from '../hooks/useClient'\nimport {AUDIO_ASPECT_RATIO, MIN_ASPECT_RATIO} from '../util/constants'\nimport {generateJwt} from '../util/generateJwt'\nimport {getPlaybackId} from '../util/getPlaybackPolicy'\nimport {getPlaybackPolicyById} from '../util/getPlaybackPolicy'\nimport {getPosterSrc} from '../util/getPosterSrc'\nimport {getVideoSrc} from '../util/getVideoSrc'\nimport {tryWithSuspend} from '../util/tryWithSuspend'\nimport type {VideoAssetDocument} from '../util/types'\nimport CaptionsDialog from './CaptionsDialog'\nimport EditThumbnailDialog from './EditThumbnailDialog'\nimport {AudioIcon} from './icons/Audio'\nimport MezzanineDialog from './MezzanineDialog'\n\nexport default function VideoPlayer({\n asset,\n thumbnailWidth = 250,\n children,\n hlsConfig,\n ...props\n}: PropsWithChildren<\n {\n asset: VideoAssetDocument\n thumbnailWidth?: number\n forceAspectRatio?: number\n hlsConfig?: MuxPlayerProps['_hlsConfig']\n } & Partial<Pick<MuxPlayerProps, 'autoPlay'>>\n>) {\n const client = useClient()\n const {dialogState} = useDialogStateContext()\n\n const isAudio = assetIsAudio(asset)\n const muxPlayer = useRef<MuxPlayerRefAttributes>(null)\n const playerContainerRef = useRef<HTMLDivElement>(null)\n const [error, setError] = useState<Error>()\n\n /* Playback ID that will be used to play the video */\n const playbackId = useMemo(() => {\n try {\n return getPlaybackId(asset, ['public', 'signed', 'drm'])\n } catch (e) {\n // oxlint-disable-next-line react/react-compiler\n setError(new TypeError('Asset has no playback ID', {cause: e}))\n return undefined\n }\n }, [asset])\n\n const muxPlaybackId = useMemo(() => {\n if (!playbackId) return undefined\n return getPlaybackPolicyById(asset, playbackId)\n }, [asset, playbackId])\n\n const src = useMemo(() => {\n if (!playbackId) return undefined\n if (!muxPlaybackId) return undefined\n return tryWithSuspend(\n () => getVideoSrc({muxPlaybackId, client}),\n (e: Error) => {\n setError(e)\n return undefined\n },\n )\n }, [muxPlaybackId, playbackId, client])\n\n const poster = useMemo(() => {\n return tryWithSuspend(\n () => getPosterSrc({asset, client, width: thumbnailWidth}),\n (e: Error) => {\n setError(e)\n return undefined\n },\n )\n }, [asset, client, thumbnailWidth])\n\n const signedToken = useMemo(() => {\n try {\n const url = new URL(src!)\n return url.searchParams.get('token')\n } catch {\n return undefined\n }\n }, [src])\n const drmToken = useMemo(() => {\n if (!playbackId) return undefined\n if (muxPlaybackId?.policy !== 'drm') return undefined\n\n return tryWithSuspend(\n () => generateJwt(client, playbackId, 'd'),\n (e: Error) => {\n setError(e)\n return undefined\n },\n )\n }, [client, muxPlaybackId?.policy, playbackId])\n const tokens:\n | Partial<{\n playback?: string\n thumbnail?: string\n storyboard?: string\n drm?: string\n }>\n | undefined = useMemo(() => {\n try {\n const partialTokens: {\n playback?: string\n thumbnail?: string\n storyboard?: string\n drm?: string\n } = {\n playback: undefined,\n thumbnail: undefined,\n storyboard: undefined,\n drm: undefined,\n }\n\n if (signedToken) {\n partialTokens.playback = signedToken\n partialTokens.thumbnail = signedToken\n partialTokens.storyboard = signedToken\n }\n\n if (drmToken) {\n partialTokens.drm = drmToken\n }\n\n return {...partialTokens}\n } catch {\n return undefined\n }\n }, [signedToken, drmToken])\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 /* We use Suspense here because `generateJwt` and related functions use suspend()\n under the hood */\n return (\n <>\n <Card\n ref={playerContainerRef}\n tone=\"transparent\"\n style={{\n aspectRatio: aspectRatio,\n position: 'relative',\n ...(isAudio && {display: 'flex', alignItems: 'flex-end'}),\n }}\n >\n {src && poster && (\n <>\n {isAudio && (\n <AudioIcon\n style={{\n padding: '0.5em',\n width: '2.2em',\n height: '2.2em',\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 1,\n }}\n />\n )}\n <Suspense fallback={null}>\n <MuxPlayer\n poster={isAudio ? undefined : poster}\n ref={muxPlayer}\n {...props}\n playsInline\n playbackId={playbackId}\n tokens={tokens}\n preload=\"metadata\"\n crossOrigin=\"anonymous\"\n metadata={{\n player_name: 'Sanity Admin Dashboard',\n player_version: PLUGIN_VERSION,\n page_type: 'Preview Player',\n }}\n audio={isAudio}\n _hlsConfig={hlsConfig}\n style={{\n ...(!isAudio && {height: '100%'}),\n width: '100%',\n display: 'block',\n objectFit: 'contain',\n ...(isAudio && {alignSelf: 'end'}),\n }}\n />\n {children}\n </Suspense>\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\n asset={asset}\n // oxlint-disable-next-line react/react-compiler\n currentTime={muxPlayer?.current?.currentTime}\n />\n )}\n {dialogState === 'edit-captions' && <CaptionsDialog asset={asset} />}\n {dialogState === 'mezzanine' && <MezzanineDialog asset={asset} />}\n </>\n )\n}\n\nexport function assetIsAudio(asset: VideoAssetDocument) {\n return asset.data?.max_stored_resolution === 'Audio only'\n}\n","// Adapted from https://github.com/sanity-io/sanity/blob/next/packages/sanity/src/desk/components/MissingSchemaType.tsx\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\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/Edit'\nimport {Box, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\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/Publish'\nimport {Box, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\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 {\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 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),\n [props.documentPreviewStore, schemaType, value._id],\n )\n const {snapshot, original, isLoading} = useObservable(observable, {\n isLoading: true,\n snapshot: null,\n original: null,\n })\n\n const status = isLoading ? null : (\n <Inline gap={4}>\n {presence && presence.length > 0 && <DocumentPreviewPresence presence={presence} />}\n <PublishedStatus document={original} />\n <DraftStatus document={snapshot} />\n </Inline>\n )\n\n return (\n <SanityDefaultPreview\n {...(getPreviewValueWithFallback({snapshot, original, fallback: {title}}) 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/Document'\nimport {useMemo} from 'react'\nimport type {CollatedHit, SanityDocument, SchemaType} from 'sanity'\nimport {PreviewCard, useDocumentPresence, useDocumentPreviewStore, useSchema} from 'sanity'\nimport {IntentLink} from 'sanity/router'\n\nimport {MissingSchemaType} from './MissingSchemaType'\nimport {PaneItemPreview} from './PaneItemPreview'\n\ninterface DocumentPreviewProps {\n schemaType?: SchemaType\n documentPair: CollatedHit<SanityDocument>\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 */\nfunction 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\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 children = useMemo(() => {\n if (!doc) return null\n\n if (!schemaType || !hasSchemaType) {\n return <MissingSchemaType value={doc} />\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={IntentLink}\n intent=\"edit\"\n params={{id: props.documentPair.id}}\n data-as=\"a\"\n data-ui=\"PaneItem\"\n padding={2}\n radius={2}\n tone=\"inherit\"\n >\n {children}\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 {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}> = (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 documentPair={documentPair} schemaType={schemaType} />\n </Box>\n </Card>\n )\n })}\n </Container>\n )\n}\n\nexport default VideoReferences\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Card, Checkbox, Dialog, Flex, Heading, Stack, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\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 {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 succeededDeleting,\n}: {\n asset: VideoAssetDocument\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 // oxlint-disable-next-line react/react-compiler\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 gap={3}>\n {state === 'checkingReferences' && (\n <>\n <Heading size={2}>Checking if video can be deleted</Heading>\n <SpinnerBox />\n </>\n )}\n {state === 'cantDelete' && (\n <>\n <Heading size={2}>Video can't be deleted</Heading>\n <Text size={2} style={{marginBottom: '2rem'}}>\n There are {references?.length} document{references && references.length > 0 && 's'}{' '}\n pointing to this video. Remove their references to this file or delete them before\n proceeding.\n </Text>\n <VideoReferences references={references} isLoaded={!referencesLoading} />\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 gap={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, type DocumentStore, type 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 type {MuxTextTrack, 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 playback_ids: doc.data?.playback_ids,\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 text_tracks:\n doc.data?.tracks?.filter((track): track is MuxTextTrack => track.type === 'text') || [],\n }\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useMemo, useState} from 'react'\nimport {useDocumentStore} from 'sanity'\n\nimport {useClient} from '../../hooks/useClient'\nimport useDocReferences from '../../hooks/useDocReferences'\nimport {useResyncAsset} from '../../hooks/useResyncAsset'\nimport getVideoMetadata from '../../util/getVideoMetadata'\nimport {type VideoAssetDocument} from '../../util/types'\n\ntype VideoDetailsState = 'idle' | 'saving' | 'deleting' | 'closing' | 'resyncing'\n\nexport interface VideoDetailsProps {\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<VideoDetailsState>('idle')\n\n const {resyncAsset, isResyncing} = useResyncAsset({showToast: true})\n\n async function handleResync() {\n if (state !== 'idle') return\n setState('resyncing')\n await resyncAsset(props.asset)\n setState('idle')\n }\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 handleResync,\n isResyncing,\n }\n}\n","import {CalendarIcon} from '@sanity/icons/Calendar'\nimport {CheckmarkIcon} from '@sanity/icons/Checkmark'\nimport {ClockIcon} from '@sanity/icons/Clock'\nimport {CropIcon} from '@sanity/icons/Crop'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {RevertIcon} from '@sanity/icons/Revert'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {TagIcon} from '@sanity/icons/Tag'\nimport {TrashIcon} from '@sanity/icons/Trash'\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 {useEffect, useRef, useState} from 'react'\n\nimport {DIALOGS_Z_INDEX} from '../../util/constants'\nimport type {MuxPlaybackId, MuxTextTrack, PlaybackPolicy} from '../../util/types'\nimport FormField from '../FormField'\nimport IconInfo from '../IconInfo'\nimport {ResolutionIcon} from '../icons/Resolution'\nimport {StopWatchIcon} from '../icons/StopWatch'\nimport Mezzanine from '../Mezzanine'\nimport TextTracksManager from '../TextTracksManager'\nimport VideoPlayer from '../VideoPlayer'\nimport DeleteDialog from './DeleteDialog'\nimport useVideoDetails, {type 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 handleResync,\n isResyncing,\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 = 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 <Flex gap={2}>\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 || isResyncing}\n />\n <Button\n icon={SyncIcon}\n fontSize={2}\n padding={3}\n mode=\"bleed\"\n text=\"Resync\"\n tone=\"primary\"\n onClick={handleResync}\n disabled={isSaving || isResyncing}\n iconRight={isResyncing && Spinner}\n />\n </Flex>\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 || isResyncing}\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 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'}} gap={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 gap={4} flex={1} sizing=\"border\">\n <VideoPlayer asset={props.asset} autoPlay={props.asset.autoPlay || false} />\n {tab === 'details' && (\n <>\n <TextTracksManager\n asset={props.asset}\n iconOnly\n collapseTracks\n tracks={\n displayInfo?.text_tracks ||\n props.asset.data?.tracks?.filter(\n (track): track is MuxTextTrack => track.type === 'text',\n ) ||\n []\n }\n />\n <Mezzanine asset={props.asset} />\n </>\n )}\n </Stack>\n <Stack gap={4} flex={1} sizing=\"border\">\n <TabList gap={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 gap={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 gap={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 <PlaybackIds playback_ids={displayInfo.playback_ids} />\n </Stack>\n </Stack>\n </TabPanel>\n <TabPanel\n aria-labelledby=\"references-tab\"\n id=\"references-panel\"\n hidden={tab !== 'references'}\n >\n <VideoReferences references={references} isLoaded={!referencesLoading} />\n </TabPanel>\n </Stack>\n </Flex>\n </Card>\n </Dialog>\n )\n}\n\nconst PlaybackIds = ({playback_ids}: {playback_ids?: MuxPlaybackId[]}) => {\n if (playback_ids) {\n return playback_ids.map((entry) => (\n <IconInfo\n key={entry.id}\n text={`Playback ID [${policyToText(entry.policy)}]: ${entry.id}`}\n icon={TagIcon}\n size={2}\n />\n ))\n }\n return <IconInfo text={'No Playback ID'} icon={TagIcon} size={2} />\n}\n\nconst policyToText = (policy: PlaybackPolicy) => {\n switch (policy) {\n case 'drm':\n return 'DRM'\n case 'signed':\n return 'Signed'\n case 'public':\n return 'Public'\n default:\n return policy\n }\n}\nexport default VideoDetails\n","import {CalendarIcon} from '@sanity/icons/Calendar'\nimport {ClockIcon} from '@sanity/icons/Clock'\nimport {TagIcon} from '@sanity/icons/Tag'\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 gap={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 gap={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} from '@sanity/icons/Checkmark'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {LockIcon} from '@sanity/icons/Lock'\nimport {PlayIcon} from '@sanity/icons/Play'\nimport {Button, Card, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useCallback, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {DRMWarningDialog, useDrmPlaybackWarningContext} from '../context/DrmPlaybackWarningContext'\nimport {THUMBNAIL_ASPECT_RATIO} from '../util/constants'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {type VideoAssetDocument} from '../util/types'\nimport IconInfo from './IconInfo'\nimport {AudioIcon} from './icons/Audio'\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\ntype RenderState = 'render-video' | 'pre-render-warn' | false\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<RenderState>(false)\n const select = useCallback(() => onSelect?.(asset), [onSelect, asset])\n const edit = useCallback(() => onEdit?.(asset), [onEdit, asset])\n const {hasShownWarning} = useDrmPlaybackWarningContext()\n\n if (!asset) {\n return null\n }\n\n const playbackPolicy = getPlaybackPolicy(asset)\n const onClickPlay = () => {\n if (playbackPolicy?.policy === 'drm' && !hasShownWarning) {\n setRenderVideo('pre-render-warn')\n } else {\n setRenderVideo('render-video')\n }\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?.policy === '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: 11,\n }}\n padding={2}\n border\n >\n <Text muted size={1}>\n <LockIcon />\n </Text>\n </Card>\n </Tooltip>\n )}\n {playbackPolicy?.policy === 'drm' && (\n <Tooltip\n animate\n content={\n <Card padding={2} radius={2}>\n <IconInfo icon={LockIcon} text=\"DRM 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: '0.25rem',\n position: 'absolute',\n left: '1em',\n top: '1em',\n zIndex: 11,\n }}\n padding={2}\n border\n >\n <Text muted size={1} weight=\"semibold\" style={{color: 'var(--card-icon-color)'}}>\n DRM\n </Text>\n </Card>\n </Tooltip>\n )}\n <Stack\n gap={3}\n height=\"fill\"\n style={{\n gridTemplateRows: 'min-content min-content 1fr',\n }}\n >\n {renderVideo === 'pre-render-warn' && (\n <DRMWarningDialog\n onClose={() => {\n setRenderVideo('render-video')\n }}\n />\n )}\n {renderVideo === 'render-video' ? (\n <VideoPlayer asset={asset} autoPlay forceAspectRatio={THUMBNAIL_ASPECT_RATIO} />\n ) : (\n <PlayButton onClick={onClickPlay}>\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 <AudioIcon width=\"3em\" height=\"3em\" />\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/Search'\nimport {Card, Flex, Grid, Inline, Label, Stack, Text, TextInput} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\n\nimport {DrmPlaybackWarningContextProvider} from '../context/DrmPlaybackWarningContext'\nimport useAssets from '../hooks/useAssets'\nimport type {PluginConfig, VideoAssetDocument} from '../util/types'\nimport ConfigureApi from './ConfigureApi'\nimport ImportVideosFromMux from './ImportVideosFromMux'\nimport PageSelector from './PageSelector'\nimport ResyncMetadata from './ResyncMetadata'\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 config: PluginConfig\n onSelect?: (asset: VideoAssetDocument) => void\n}\n\nexport default function VideosBrowser({onSelect, config}: VideosBrowserProps) {\n const {assets, isLoading, searchQuery, setSearchQuery, setSort, sort} = useAssets()\n const [page, setPage] = useState<number>(0)\n const pageLimit = 20\n const pageTotal = Math.floor(assets.length / pageLimit) + 1\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 pageStart = page * pageLimit\n const pageEnd = pageStart + pageLimit\n\n const placement = onSelect ? 'input' : 'tool'\n return (\n <DrmPlaybackWarningContextProvider config={config}>\n <Stack padding={4} gap={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 <PageSelector page={page} setPage={setPage} total={pageTotal} />\n </Flex>\n {placement === 'tool' && (\n <Inline gap={2}>\n <ImportVideosFromMux />\n <ResyncMetadata />\n <ConfigureApi />\n </Inline>\n )}\n </Flex>\n <Stack gap={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.slice(pageStart, pageEnd).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 closeDialog={() => setEditedAsset(null)} asset={freshEditedAsset} />\n )}\n </DrmPlaybackWarningContextProvider>\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> = (config) => {\n return <VideosBrowser config={config} />\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 {useCurrentUser} from 'sanity'\n\nimport {type PluginConfig} from '../util/types'\n\nexport const useAccessControl = (config: PluginConfig) => {\n const user = useCurrentUser()\n\n const hasConfigAccess =\n !config?.allowedRolesForConfiguration?.length ||\n user?.roles?.some((role) => config.allowedRolesForConfiguration.includes(role.name))\n\n return {hasConfigAccess}\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","import {useMemo, useRef} from 'react'\nimport {useDataset, useProjectId} from 'sanity'\nimport useSWR from 'swr'\n\nimport {useClient} from '../hooks/useClient'\nimport {addKeysToMuxData} from '../util/addKeysToMuxData'\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\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 isPreparingStaticRenditions = useMemo(() => {\n // Legacy: If static_renditions has a status field, it was created with mp4_support (deprecated)\n // We don't process this old format, just return false\n // Note: 'disabled' status is valid in the new format when no renditions were requested\n if (\n asset?.data?.static_renditions?.status &&\n asset?.data?.static_renditions?.status !== 'disabled'\n ) {\n return false\n }\n\n const files = asset?.data?.static_renditions?.files\n if (!files || files.length === 0) {\n return false\n }\n return files.some((file) => file.status === 'preparing')\n }, [asset?.data?.static_renditions?.status, asset?.data?.static_renditions?.files])\n\n const shouldFetch = useMemo(\n () => !!asset?.assetId && (asset?.status === 'preparing' || isPreparingStaticRenditions),\n [asset?.assetId, asset?.status, isPreparingStaticRenditions],\n )\n // Only log the first failure of a streak so a persistent error doesn't flood\n // the console on every interval.\n const errorLoggedRef = useRef(false)\n return useSWR(\n shouldFetch ? `/${projectId}/addons/mux/assets/${dataset}/data/${asset?.assetId}` : null,\n async () => {\n try {\n const {data} = await client.request<{data: MuxAsset}>({\n url: `/addons/mux/assets/${dataset}/data/${asset!.assetId}`,\n withCredentials: true,\n method: 'GET',\n query: PLUGIN_VERSION_QUERY,\n })\n if (!asset?._id || !data) return\n await client\n .patch(asset._id)\n .set({status: data.status, data: addKeysToMuxData(data)})\n .commit({returnDocuments: false})\n errorLoggedRef.current = false\n } catch (error) {\n // Input re-throws `poll.error`, so a background polling failure would\n // crash the whole field. Swallow it instead.\n if (!errorLoggedRef.current) {\n errorLoggedRef.current = true\n console.error('[sanity-plugin-mux-input] Mux polling failed', {\n assetId: asset?.assetId,\n documentId: asset?._id,\n error,\n })\n }\n }\n },\n {refreshInterval: 2000, refreshWhenHidden: true, dedupingInterval: 1000},\n )\n}\n","/* eslint-disable no-console */\nimport {Button, Card, Flex, Grid, Heading, Inline, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {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 // oxlint-disable-next-line no-unstable-nested-components\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 gap={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 gridTemplateColumns={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/Plug'\nimport {Button, Card, Flex, Grid, Heading, Inline, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {useAccessControl} from '../hooks/useAccessControl'\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {type PluginConfig} from '../util/types'\nimport MuxLogo from './MuxLogo'\n\ninterface OnboardProps {\n setDialogState: SetDialogState\n config: PluginConfig\n}\n\nexport default function Onboard(props: OnboardProps) {\n const {setDialogState} = props\n const handleOpen = useCallback(() => setDialogState('secrets'), [setDialogState])\n const {hasConfigAccess} = useAccessControl(props.config)\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 gridTemplateColumns={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 {hasConfigAccess ? (\n <Button mode=\"ghost\" icon={PlugIcon} text=\"Configure API\" onClick={handleOpen} />\n ) : (\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"critical\">\n <Text>\n You do not have access to configure the Mux API. Please contact your\n administrator.\n </Text>\n </Card>\n )}\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","/**\n * Format Google Drive share links as Google Drive export links.\n * Supported formats:\n * - https://drive.google.com/uc?id=<ID>...\n * - https://drive.google.com/open?id=<ID>...\n * - https://drive.google.com/file/d/<ID>...\n * - https://drive.google.com/folder/<ID>...\n *\n * @param url Google Drive share link to format.\n * @returns Google Drive export link (URL passthrough if not share link).\n */\nexport function formatDriveShareLink(url: string): string {\n // Export link formatter.\n const formatExportLink = (id: string) => {\n return `https://drive.google.com/uc?export=download&id=${id}`\n }\n\n // URL formatting.\n try {\n // Parse URL.\n const trimmed = url.trim()\n const parsed = new URL(trimmed)\n\n // Enforce strict host name.\n if (parsed.hostname !== 'drive.google.com') {\n throw new Error('URL is not from Google Drive.')\n }\n\n // Look for ID in search parameters.\n const id = parsed.searchParams.get('id') || ''\n if (id.length) {\n return formatExportLink(id)\n }\n\n // Look for ID in path name.\n const path = parsed.pathname.split('/') || []\n\n // Path is /file/d/<ID>...\n if (path.includes('file') && path.includes('d')) {\n const index =\n path.findIndex((value: string) => {\n return value === 'd'\n }) + 1\n const fileId = path.at(index) || ''\n return formatExportLink(fileId)\n }\n\n // Path is /folder/<ID>...\n if (path.includes('folders')) {\n const index =\n path.findIndex((value: string) => {\n return value === 'folders'\n }) + 1\n const folderId = path.at(index) || ''\n return formatExportLink(folderId)\n }\n\n // URL not recognized.\n throw new Error('URL was not recognized.')\n } catch {\n // URL passthrough by default.\n return url\n }\n}\n","/**\n * Rounds the numeric part of a px string to the nearest integer.\n * Returns undefined if the value is not a valid px string or not a finite number.\n * Avoids sending 0px (and JS -0); snaps to ±1 instead.\n */\nexport function roundPxString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n if (!trimmed.endsWith('px')) return undefined\n const n = Number(trimmed.slice(0, -2))\n if (!Number.isFinite(n)) return undefined\n let rounded = Math.round(n)\n // Avoid sending 0px (and JS -0); keep sign when negative.\n if (rounded === 0) rounded = n < 0 ? -1 : 1\n return `${rounded}px`\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 {formatDriveShareLink} from '../util/formatDriveShareLink'\nimport {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'\nimport {roundPxString} from '../util/roundPxString'\nimport type {MuxAsset, MuxNewAssetSettings, WatermarkConfig} from '../util/types'\nimport {getAsset} from './assets'\nimport {testSecretsObservable} from './secrets'\n\nfunction sanitizeOverlaySettingsInPlace(settings: MuxNewAssetSettings) {\n const inputs = settings.input\n if (!inputs) return\n for (const input of inputs) {\n const overlay = (input as {overlay_settings?: Record<string, unknown>}).overlay_settings\n if (!overlay) continue\n\n const hm = roundPxString(overlay['horizontal_margin'])\n const vm = roundPxString(overlay['vertical_margin'])\n const w = roundPxString(overlay['width'])\n\n if (hm) overlay['horizontal_margin'] = hm\n if (vm) overlay['vertical_margin'] = vm\n if (w) overlay['width'] = w\n }\n}\n\nfunction sanitizePxStringsInJson(json: string): string {\n return json.replace(/\"(-?\\d+(?:\\.\\d+)?)px\"/g, (_match, num) => {\n const n = Number(num)\n if (!Number.isFinite(n)) return _match\n let rounded = Math.round(n)\n if (rounded === 0) rounded = n < 0 ? -1 : 1\n return `\"${rounded}px\"`\n })\n}\n\nfunction 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 query: PLUGIN_VERSION_QUERY,\n })\n}\n\nexport function uploadUrl({\n url,\n settings,\n client,\n}: {\n url: string\n settings: MuxNewAssetSettings\n client: SanityClient\n watermark?: WatermarkConfig\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 sanitizeOverlaySettingsInPlace(muxBody)\n\n const query: Record<string, string> = {\n muxBody: sanitizePxStringsInJson(JSON.stringify(muxBody)),\n }\n const filename = validUrl.split('/').slice(-1)[0]\n if (filename) {\n query['filename'] = filename\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: {...query, ...PLUGIN_VERSION_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 watermark,\n}: {\n settings: MuxNewAssetSettings\n client: SanityClient\n file: File\n watermark?: WatermarkConfig\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 sanitizeOverlaySettingsInPlace(body)\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 query: PLUGIN_VERSION_QUERY,\n }),\n ).pipe(\n mergeMap((result) => {\n return createUpChunkObservable(uuid, result.upload.url, file).pipe(\n // @TODO type the observable events\n mergeMap((event) => {\n if (event.type !== 'success') {\n return of(event)\n }\n return from(updateAssetDocumentFromUpload(client, uuid, watermark)).pipe(\n mergeMap((doc) => of({...event, asset: doc})),\n )\n }),\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 static_renditions?: {resolution: string}[]\n passthrough: string\n playback_policies: ['public' | 'signed' | 'drm']\n }\n status: string\n timeout: number\n }\n}\nfunction 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 query: PLUGIN_VERSION_QUERY,\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(\n client: SanityClient,\n uuid: string,\n _watermark?: WatermarkConfig,\n) {\n let upload: UploadResponse\n let asset: {data: MuxAsset}\n try {\n upload = await pollUpload(client, uuid)\n } catch (err) {\n return Promise.reject(err)\n }\n try {\n asset = await getAsset(client, upload.data.asset_id)\n } catch (err) {\n return Promise.reject(err)\n }\n\n const doc = {\n _id: uuid,\n _type: 'mux.videoAsset',\n status: asset.data.status,\n data: asset.data,\n assetId: asset.data.id,\n playbackId: asset.data.playback_ids[0]?.id,\n uploadId: upload.data.id,\n }\n return client.createOrReplace(doc).then(() => {\n return doc\n })\n}\n\nfunction testFile(file: File) {\n if (typeof window !== 'undefined' && file instanceof window.File) {\n const fileOptions = optionsFromFile({}, file)\n return of(fileOptions)\n }\n return throwError(new Error('Invalid file'))\n}\n\nfunction testUrl(url: string): Observable<string> {\n const error = new Error('Invalid URL')\n if (typeof url !== 'string') {\n return throwError(error)\n }\n let formattedUrl = url.trim()\n formattedUrl = formatDriveShareLink(formattedUrl)\n let parsed\n try {\n parsed = new URL(formattedUrl)\n } catch {\n return throwError(error)\n }\n if (parsed && !parsed.protocol.match(/http:|https:/)) {\n return throwError(error)\n }\n return of(formattedUrl)\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 {ServerError} from '@sanity/client'\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/**\n * We consider a server error one with status code 5XX.\n * Used mainly to handle unknown Proxy issues.\n */\nexport function isServerError(error: Error): error is ServerError {\n return (\n 'statusCode' in error &&\n typeof error.statusCode === 'number' &&\n 500 <= error.statusCode &&\n error.statusCode <= 600\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 {\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, PluginConfig, 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 config: PluginConfig\n}\n\nexport default function SelectAssets({\n asset: selectedAsset,\n onChange,\n setDialogState,\n config,\n}: 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} config={config} />\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 config,\n}: Pick<SelectAssetProps, 'onChange' | 'asset' | 'config'> & {\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\n config={config}\n asset={asset}\n onChange={onChange}\n setDialogState={setDialogState}\n />\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 void deleteAssetOnMux(client, asset.assetId)\n }\n if (asset._id) {\n void client.delete(asset._id)\n }\n }, [asset, client, onChange])\n}\n","import {styled} from 'styled-components'\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","// Lifted from sanity/form/inputs/files/common/UploadProgress\n\nimport {Button, Card, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {LinearProgress} from 'sanity'\nimport {styled} from 'styled-components'\n\nconst CardWrapper = styled(Card)`\n min-height: 82px;\n box-sizing: border-box;\n`\n\nconst FlexWrapper = styled(Flex)`\n text-overflow: ellipsis;\n overflow: hidden;\n`\n\nconst LeftSection = styled(Stack)`\n position: relative;\n width: 60%;\n`\n\nconst 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 // Disable cancel button when upload is 90% or more complete\n // to prevent inconsistency between Mux and Sanity\n const isCancelDisabled = progress >= 90\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 gap={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 disabled={isCancelDisabled}\n />\n ) : null}\n </FlexWrapper>\n </CardWrapper>\n )\n}\n","import {Card, Text} from '@sanity/ui'\nimport {useEffect, useMemo, useRef} from 'react'\n\nimport {useCancelUpload} from '../hooks/useCancelUpload'\nimport type {MuxInputProps, PluginConfig, 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 config?: PluginConfig\n}\n\nconst Player = ({asset, buttons, readOnly, onChange, config}: 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 // oxlint-disable-next-line react/react-compiler\n const isPreparingStaticRenditions = useMemo<boolean>(() => {\n // Legacy: If static_renditions has a status field, it was created with mp4_support (deprecated)\n // We don't process this old format, just return false\n // Note: 'disabled' status is valid in the new format when no renditions were requested\n if (\n asset?.data?.static_renditions?.status &&\n asset?.data?.static_renditions?.status !== 'disabled'\n ) {\n return false\n }\n\n // Check if any file in static_renditions is still preparing\n const files = asset?.data?.static_renditions?.files\n if (!files || files.length === 0) {\n return false\n }\n return files.some((file) => file.status === 'preparing')\n }, [asset?.data?.static_renditions?.status, asset?.data?.static_renditions?.files])\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 // @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} hlsConfig={config?.hlsConfig}>\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/menu'\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, type ButtonProps, Flex, Text} from '@sanity/ui'\nimport {isValidElement, useId, useCallback} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport {FileButton} from './FileInputMenuItem.styled'\n\nexport interface FileInputMenuItemProps extends Omit<ButtonProps, 'onSelect'> {\n accept?: string\n capture?: 'user' | 'environment'\n multiple?: boolean\n onSelect?: (files: File[]) => void\n disabled?: boolean\n}\n\nexport function FileInputMenuItem(\n props: FileInputMenuItemProps &\n Omit<React.HTMLProps<HTMLButtonElement>, 'as' | 'ref' | 'type' | 'value' | 'onSelect'> & {\n ref?: React.Ref<HTMLInputElement>\n },\n) {\n const {\n icon: Icon,\n id: idProp,\n accept,\n capture,\n fontSize,\n multiple,\n onSelect,\n space = 3,\n textAlign,\n text,\n disabled,\n ref,\n ...rest\n } = props\n const idHook = useId()\n const id = idProp || idHook\n\n const handleChange = 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) && <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={ref}>\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 {DownloadIcon} from '@sanity/icons/Download'\nimport {EllipsisHorizontalIcon} from '@sanity/icons/EllipsisHorizontal'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {LockIcon} from '@sanity/icons/Lock'\nimport {PlugIcon} from '@sanity/icons/Plug'\nimport {ResetIcon} from '@sanity/icons/Reset'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {TranslateIcon} from '@sanity/icons/Translate'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button, Card, Inline, Label, Text, useClickOutsideEvent} from '@sanity/ui'\nimport {Menu, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {Popover} from '@sanity/ui/popover'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {memo, useCallback, useEffect, useMemo, useState} from 'react'\nimport {PatchEvent, unset} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {useAccessControl} from '../hooks/useAccessControl'\nimport {type DialogState, type SetDialogState} from '../hooks/useDialogState'\nimport {useResyncAsset} from '../hooks/useResyncAsset'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport type {MuxInputProps, PluginConfig, 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 config: PluginConfig\n accept: string\n },\n) {\n const {asset, readOnly, dialogState, setDialogState, onChange, onSelect, accept} = props\n const [open, setOpen] = useState(false)\n const [menuElement, setMenuRef] = useState<HTMLDivElement | null>(null)\n const isSigned = useMemo(() => getPlaybackPolicy(asset)?.policy === 'signed', [asset])\n const {hasConfigAccess} = useAccessControl(props.config)\n const {resyncAsset, isResyncing} = useResyncAsset({showToast: true})\n\n const onReset = useCallback(() => onChange(PatchEvent.from(unset([]))), [onChange])\n\n const handleResync = useCallback(async () => {\n setOpen(false)\n await resyncAsset(asset)\n }, [resyncAsset, asset])\n\n useEffect(() => {\n if (open && dialogState) {\n // oxlint-disable-next-line react/react-compiler\n setOpen(false)\n }\n }, [dialogState, open])\n\n useClickOutsideEvent(\n () => setOpen(false),\n () => [menuElement],\n )\n\n return (\n <Inline gap={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={accept}\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 <>\n <MenuItem\n icon={ImageIcon}\n text=\"Thumbnail\"\n onClick={() => setDialogState('edit-thumbnail')}\n />\n <MenuItem\n icon={TranslateIcon}\n text=\"Captions\"\n onClick={() => setDialogState('edit-captions')}\n />\n <MenuItem\n icon={SyncIcon}\n text=\"Resync from Mux\"\n onClick={handleResync}\n disabled={readOnly || isResyncing}\n />\n </>\n )}\n <MenuDivider />\n <MenuItem\n icon={DownloadIcon}\n text=\"Mezzanine\"\n onClick={() => setDialogState('mezzanine')}\n />\n <MenuDivider />\n {hasConfigAccess && (\n <>\n <MenuItem\n icon={PlugIcon}\n text=\"Configure API\"\n onClick={() => setDialogState('secrets')}\n />\n <MenuDivider />\n </>\n )}\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","import {useEffect, useState} from 'react'\n\nimport {type StagedUpload} from '../components/Uploader'\n\nexport function useFetchFileSize(stagedUpload: StagedUpload, maxFileSize?: number) {\n const [fileSize, setFileSize] = useState<number | null>(null)\n const [isLoadingFileSize, setIsLoadingFileSize] = useState(false)\n const [canSkipFileSizeValidation, setCanSkipFileSizeValidation] = useState(false)\n\n useEffect(() => {\n // Fetch URL Upload file size\n if (stagedUpload.type === 'url') {\n // oxlint-disable-next-line react/react-compiler\n setIsLoadingFileSize(false)\n setCanSkipFileSizeValidation(false)\n setFileSize(null)\n const url = stagedUpload.url\n\n // Get file size from URL\n const fetchFileSize = async () => {\n setIsLoadingFileSize(true)\n try {\n const response = await fetch(url, {method: 'HEAD'})\n const contentLength = response.headers.get('content-length')\n const newFileSize = contentLength ? parseInt(contentLength, 10) : null\n\n setIsLoadingFileSize(false)\n if (newFileSize) {\n setFileSize(newFileSize)\n }\n if (newFileSize === null && maxFileSize !== undefined) {\n // Size unknown but size limit is configured - skip file size validation\n setCanSkipFileSizeValidation(true)\n }\n } catch {\n console.warn('Could not validate file size from URL')\n // Skip validation of file size, but still validate duration\n setCanSkipFileSizeValidation(true)\n setIsLoadingFileSize(false)\n }\n }\n\n void fetchFileSize()\n }\n if (stagedUpload.type === 'file') {\n setFileSize(stagedUpload.files[0]!.size)\n }\n }, [maxFileSize, stagedUpload, stagedUpload.type])\n\n return {\n fileSize,\n isLoadingFileSize,\n canSkipFileSizeValidation,\n }\n}\n","import {useEffect, useState} from 'react'\n\nimport {type StagedUpload} from '../components/Uploader'\n\nexport interface VideoAssetMetadata {\n width?: number\n height?: number\n isAudioOnly?: boolean\n duration?: number\n size?: number\n aspectRatio?: number\n}\n\nexport function useMediaMetadata(stagedUpload: StagedUpload) {\n const [videoAssetMetadata, setVideoAssetMetadata] = useState<VideoAssetMetadata | null>(null)\n const [isLoadingMetadata, setIsLoadingMetadata] = useState(false)\n useEffect(() => {\n let videoSrc = null\n // Validate file uploads\n if (stagedUpload.type === 'file') {\n const file = stagedUpload.files[0]\n videoSrc = URL.createObjectURL(file!)\n }\n\n // Validate URL uploads\n if (stagedUpload.type === 'url') {\n videoSrc = stagedUpload.url\n }\n\n // oxlint-disable-next-line react/react-compiler\n setVideoAssetMetadata((old) => ({\n ...old,\n duration: undefined,\n width: undefined,\n height: undefined,\n }))\n\n if (!videoSrc) return () => null\n\n setIsLoadingMetadata(true)\n const videoElement = document.createElement('video')\n videoElement.preload = 'metadata'\n\n const metadataListeners = [\n () => {\n setIsLoadingMetadata(false)\n },\n () => {\n const duration = videoElement.duration\n const width = videoElement.videoWidth\n const height = videoElement.videoHeight\n const isAudioOnly = width <= 0 && height <= 0\n const aspectRatio = width / height\n setVideoAssetMetadata((old) => {\n return {\n ...old,\n duration: duration,\n width: width,\n height: height,\n isAudioOnly: isAudioOnly,\n aspectRatio: aspectRatio,\n }\n })\n },\n ]\n\n const cleanupVideo = (videoEl: HTMLVideoElement) => {\n const currentVideoSrc = videoEl?.src\n if (videoEl) {\n metadataListeners.forEach((listener) =>\n videoEl.removeEventListener('loadedmetadata', listener),\n )\n videoEl.onerror = null\n videoEl.src = ''\n videoEl.load()\n }\n if (currentVideoSrc?.startsWith('blob:')) {\n URL.revokeObjectURL(currentVideoSrc)\n }\n }\n metadataListeners.push(() => setTimeout(() => cleanupVideo(videoElement), 0))\n\n videoElement.onerror = () => {\n setIsLoadingMetadata(false)\n console.warn('Could not read video metadata for validation')\n cleanupVideo(videoElement)\n }\n\n metadataListeners.forEach((listener) =>\n videoElement.addEventListener('loadedmetadata', listener),\n )\n videoElement.src = videoSrc\n\n return () => {\n cleanupVideo(videoElement)\n }\n }, [stagedUpload.type, stagedUpload])\n\n return {\n videoAssetMetadata,\n setVideoAssetMetadata,\n isLoadingMetadata,\n }\n}\n","import {roundPxString} from './roundPxString'\nimport type {MuxOverlaySettings, WatermarkConfig} from './types'\n\n/**\n * Converts a draggable watermark position (x, y percentages) to Mux's overlay_settings format.\n *\n * @param watermark - The watermark configuration with position, size, and opacity\n * @returns Mux overlay_settings object\n * @see {@link https://www.mux.com/docs/guides/add-watermarks-to-your-videos}\n */\nexport function convertWatermarkToMuxOverlay(\n watermark: WatermarkConfig,\n options?: {\n /**\n * Video aspect ratio (width / height). Needed for correct vertical positioning,\n * especially on vertical videos.\n */\n videoAspectRatio?: number\n /**\n * Unit to emit for margins/width when generating overlay_settings from Canvas mode.\n * - 'px' will generate pixel strings according to Mux's scaling rules:\n * values are applied as if the video were scaled to 1920x1080 (horizontal)\n * or 1080x1920 (vertical).\n * - '%' preserves existing behavior.\n */\n units?: '%' | 'px'\n },\n): MuxOverlaySettings | null {\n if (!watermark.enabled || !watermark.imageUrl) {\n return null\n }\n\n const size = watermark.size || 20\n const opacity = watermark.opacity ?? 0.7\n\n /**\n * Convert a percentage to whole-pixel string, using Mux's base dimensions:\n * - Horizontal video: 1920x1080\n * - Vertical video: 1080x1920\n */\n const toPxString = (valuePercent: number, axis: 'x' | 'y') => {\n const videoAspectRatio = options?.videoAspectRatio ?? 16 / 9\n const isVertical = videoAspectRatio > 0 && videoAspectRatio < 1\n const baseW = isVertical ? 1080 : 1920\n const baseH = isVertical ? 1920 : 1080\n const base = axis === 'x' ? baseW : baseH\n const px = (valuePercent / 100) * base\n let rounded = Math.round(px)\n // Avoid sending 0px (and JS -0); keep sign for negative margins.\n if (rounded === 0) rounded = px < 0 ? -1 : 1\n return `${rounded}px`\n }\n\n const normalizeToPixels = (value: string | undefined, axis: 'x' | 'y'): string | undefined => {\n if (!value) return value\n const trimmed = value.trim()\n if (trimmed.endsWith('px')) {\n return roundPxString(trimmed)\n }\n if (trimmed.endsWith('%')) {\n const n = Number(trimmed.slice(0, -1))\n if (!Number.isFinite(n)) return value\n return toPxString(n, axis)\n }\n return value\n }\n\n // If user provided explicit overlay settings, use them (Mux-documented format).\n // When `options.units === 'px'`, we normalize both % and px to whole-pixel strings,\n // honoring vertical vs horizontal video bases.\n if (watermark.overlay_settings) {\n const widthValue = watermark.overlay_settings.width\n const widthNormalized =\n options?.units === 'px' ? normalizeToPixels(widthValue, 'x') : widthValue\n return {\n ...watermark.overlay_settings,\n horizontal_margin:\n options?.units === 'px'\n ? (normalizeToPixels(watermark.overlay_settings.horizontal_margin, 'x') ??\n watermark.overlay_settings.horizontal_margin)\n : watermark.overlay_settings.horizontal_margin,\n vertical_margin:\n options?.units === 'px'\n ? (normalizeToPixels(watermark.overlay_settings.vertical_margin, 'y') ??\n watermark.overlay_settings.vertical_margin)\n : watermark.overlay_settings.vertical_margin,\n width: widthNormalized ?? `${size}%`,\n opacity: watermark.overlay_settings.opacity ?? `${Math.round(opacity * 100)}%`,\n }\n }\n\n const position = watermark.position || {x: 50, y: 50}\n\n /**\n * Our UI stores watermark position as the *center point* in percentages.\n * Mux margins are interpreted relative to an *edge* (based on align).\n *\n * To make \"corner\" placements match what the user dragged, we convert from\n * center-position to top-left margins by subtracting half the watermark size.\n *\n * Note: `size` is a percentage of video width. Mux `width` is also expressed\n * as a percentage of the video width, so we can reuse it for horizontal math.\n * For vertical math, we approximate using the same percentage to keep behavior\n * consistent with the current draggable UI (which also uses `size` in both axes\n * for bounds).\n */\n // Allow negative margins to compensate for rounding / letterboxing edge-cases.\n // We still clamp to a sane range so values don't explode.\n const clampPercent = (value: number) => Math.max(-100, Math.min(100, value))\n\n // Mux accepts percentage strings; avoid sending an exact \"0%\" by nudging to 0.01%.\n // This also handles the JS -0 edge case and tiny floating point remnants.\n const toPercentString = (value: number) => {\n const epsilon = 1e-9\n const isZeroish = value === 0 || Object.is(value, -0) || Math.abs(value) < epsilon\n return `${isZeroish ? 0.01 : value}%`\n }\n\n const watermarkWidthPercentOfVideoWidth = size\n\n /**\n * Convert watermark height into % of video height.\n * height% = (watermarkWidthPx / imageAspectRatio) / videoHeightPx\n * = (size% * videoWidthPx / imageAspectRatio) / videoHeightPx\n * = size% * (videoWidthPx/videoHeightPx) / imageAspectRatio\n * = size% * videoAspectRatio / imageAspectRatio\n */\n const videoAspectRatio = options?.videoAspectRatio ?? 16 / 9\n const imageAspectRatio = watermark.imageAspectRatio ?? 1\n const watermarkHeightPercentOfVideoHeight = Math.max(\n 0,\n Math.min(100, (size * videoAspectRatio) / imageAspectRatio),\n )\n\n const halfWidth = watermarkWidthPercentOfVideoWidth / 2\n const halfHeight = watermarkHeightPercentOfVideoHeight / 2\n\n const leftMargin = clampPercent(\n Math.min(position.x - halfWidth, 100 - watermarkWidthPercentOfVideoWidth),\n )\n const topMargin = clampPercent(\n Math.min(position.y - halfHeight, 100 - watermarkHeightPercentOfVideoHeight),\n )\n\n const units = options?.units ?? '%'\n const marginX = units === 'px' ? toPxString(leftMargin, 'x') : toPercentString(leftMargin)\n const marginY = units === 'px' ? toPxString(topMargin, 'y') : toPercentString(topMargin)\n const width = units === 'px' ? toPxString(size, 'x') : `${size}%`\n\n const overlaySettings: MuxOverlaySettings = {\n vertical_align: 'top',\n vertical_margin: marginY,\n horizontal_align: 'left',\n horizontal_margin: marginX,\n width,\n opacity: `${Math.round(opacity * 100)}%`,\n }\n\n return overlaySettings\n}\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 {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Button, Card, Flex, Grid, Stack, Text, TextInput} from '@sanity/ui'\nimport {useCallback, useEffect, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {convertWatermarkToMuxOverlay} from '../util/convertWatermarkToMux'\nimport type {MuxOverlaySettings, WatermarkConfig} from '../util/types'\n\nconst RangeInput = styled.input`\n width: 100%;\n height: 4px;\n border-radius: 2px;\n background: var(--card-border-color);\n outline: none;\n -webkit-appearance: none;\n appearance: none;\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--card-focus-ring-color, #2276fc);\n cursor: pointer;\n border: 2px solid white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n &::-moz-range-thumb {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--card-focus-ring-color, #2276fc);\n cursor: pointer;\n border: 2px solid white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n &:hover::-webkit-slider-thumb {\n background: var(--card-focus-ring-color, #1a5fc7);\n }\n\n &:hover::-moz-range-thumb {\n background: var(--card-focus-ring-color, #1a5fc7);\n }\n`\n\nconst WatermarkOverlay = styled.div<{$opacity: number}>`\n position: absolute;\n max-width: 200px;\n opacity: ${(props) => props.$opacity};\n cursor: move;\n user-select: none;\n z-index: 10;\n pointer-events: auto;\n\n img {\n width: 100%;\n height: auto;\n display: block;\n pointer-events: none;\n }\n\n &:hover {\n outline: 2px dashed rgba(255, 255, 255, 0.8);\n outline-offset: 4px;\n }\n`\n\ninterface DraggableWatermarkProps {\n watermark: WatermarkConfig\n onChange: (watermark: WatermarkConfig) => void\n containerRef?: React.RefObject<HTMLDivElement>\n videoElementRef?: React.RefObject<HTMLVideoElement>\n}\n\nexport default function DraggableWatermark({\n watermark,\n onChange,\n containerRef,\n videoElementRef,\n}: DraggableWatermarkProps) {\n const [isDragging, setIsDragging] = useState(false)\n const [dragStart, setDragStart] = useState({x: 0, y: 0})\n const [startPosition, setStartPosition] = useState({x: 0, y: 0})\n const watermarkRef = useRef<HTMLDivElement>(null)\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const [localPosition, setLocalPosition] = useState(watermark.position || {x: 50, y: 50})\n\n const position = localPosition\n const size = watermark.size || 20\n const opacity = watermark.opacity ?? 0.7\n\n const parseOpacityPercent = (value: string | undefined): number | null => {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed.endsWith('%')) return null\n const num = Number(trimmed.slice(0, -1))\n if (!Number.isFinite(num)) return null\n return Math.max(0, Math.min(1, num / 100))\n }\n\n const getVideoContentBox = useCallback(() => {\n const container = containerRef?.current\n if (!container) return {x: 0, y: 0, width: 0, height: 0}\n\n const rect = container.getBoundingClientRect()\n const containerW = rect.width\n const containerH = rect.height\n\n const videoEl = videoElementRef?.current\n const videoW = videoEl?.videoWidth || 0\n const videoH = videoEl?.videoHeight || 0\n\n if (!videoW || !videoH || !containerW || !containerH) {\n return {x: 0, y: 0, width: containerW, height: containerH}\n }\n\n // object-fit: contain sizing\n const scale = Math.min(containerW / videoW, containerH / videoH)\n const contentW = videoW * scale\n const contentH = videoH * scale\n const offsetX = (containerW - contentW) / 2\n const offsetY = (containerH - contentH) / 2\n\n return {x: offsetX, y: offsetY, width: contentW, height: contentH}\n }, [containerRef, videoElementRef])\n\n const parseOverlayValue = (value: string | undefined): {n: number; unit: '%' | 'px'} | null => {\n if (!value) return null\n const trimmed = value.trim()\n const px = trimmed.endsWith('px')\n const pct = trimmed.endsWith('%')\n const num = Number(trimmed.replace(/px|%/g, ''))\n if (!Number.isFinite(num)) return null\n if (px) return {n: num, unit: 'px'}\n if (pct) return {n: num, unit: '%'}\n return null\n }\n\n const computeManualStyle = (overlay: MuxOverlaySettings) => {\n const rect = containerRef?.current?.getBoundingClientRect()\n const w = rect?.width ?? 0\n const h = rect?.height ?? 0\n const isVertical = h > w\n const baseW = isVertical ? 1080 : 1920\n const baseH = isVertical ? 1920 : 1080\n\n const hm = parseOverlayValue(overlay.horizontal_margin)\n const vm = parseOverlayValue(overlay.vertical_margin)\n const ww = parseOverlayValue(overlay.width)\n const manualOpacity = parseOpacityPercent(overlay.opacity)\n\n const toCss = (v: {n: number; unit: '%' | 'px'} | null, axis: 'x' | 'y') => {\n if (!v) return undefined\n if (v.unit === '%') return `${v.n}%`\n if (axis === 'x') return `${(v.n * w) / baseW}px`\n return `${(v.n * h) / baseH}px`\n }\n\n const computeHorizontalStyle = () => {\n if (overlay.horizontal_align === 'left') {\n return {left: toCss(hm, 'x'), right: undefined, transform: 'translate(0, 0)'}\n }\n if (overlay.horizontal_align === 'right') {\n return {right: toCss(hm, 'x'), left: undefined, transform: 'translate(0, 0)'}\n }\n return {left: '50%', right: undefined, transform: 'translate(-50%, 0)'}\n }\n\n const computeVerticalStyle = () => {\n if (overlay.vertical_align === 'top') {\n return {top: toCss(vm, 'y'), bottom: undefined}\n }\n if (overlay.vertical_align === 'bottom') {\n return {bottom: toCss(vm, 'y'), top: undefined}\n }\n return {top: '50%', bottom: undefined}\n }\n\n const hStyle = computeHorizontalStyle()\n const vStyle = computeVerticalStyle()\n\n let transform = hStyle.transform\n if (overlay.vertical_align === 'middle') {\n transform =\n overlay.horizontal_align === 'center' ? 'translate(-50%, -50%)' : 'translate(0, -50%)'\n }\n\n return {\n position: 'absolute' as const,\n ...hStyle,\n ...vStyle,\n transform,\n width: ww ? toCss(ww, 'x') : `${size}%`,\n opacity: manualOpacity ?? opacity,\n cursor: 'default',\n }\n }\n\n const debouncedOnChange = useCallback(\n (newWatermark: WatermarkConfig) => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n debounceTimeoutRef.current = setTimeout(() => {\n onChange(newWatermark)\n }, 300)\n },\n [onChange],\n )\n\n useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n }\n }, [])\n\n useEffect(() => {\n if (!isDragging && watermark.position) {\n // oxlint-disable-next-line react/react-compiler\n setLocalPosition(watermark.position)\n }\n }, [watermark.position, isDragging])\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault()\n setIsDragging(true)\n setDragStart({x: e.clientX, y: e.clientY})\n setStartPosition({x: position.x, y: position.y})\n },\n [position],\n )\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !containerRef?.current) return\n\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const content = getVideoContentBox()\n const contentW = content.width || rect.width\n const contentH = content.height || rect.height\n const dx = e.clientX - dragStart.x\n const dy = e.clientY - dragStart.y\n\n const deltaXPercent = (dx / contentW) * 100\n const deltaYPercent = (dy / contentH) * 100\n\n let newX = startPosition.x + deltaXPercent\n let newY = startPosition.y + deltaYPercent\n\n newX = Math.max(0, Math.min(100, newX))\n newY = Math.max(0, Math.min(100, newY))\n\n setLocalPosition({x: newX, y: newY})\n\n debouncedOnChange({\n ...watermark,\n position: {x: newX, y: newY},\n })\n },\n [\n isDragging,\n dragStart,\n startPosition,\n containerRef,\n watermark,\n debouncedOnChange,\n getVideoContentBox,\n ],\n )\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false)\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n debounceTimeoutRef.current = null\n }\n onChange({\n ...watermark,\n position: localPosition,\n })\n }, [watermark, localPosition, onChange])\n\n useEffect(() => {\n if (isDragging) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n }\n return undefined\n }, [isDragging, handleMouseMove, handleMouseUp])\n\n if (!watermark.imageUrl) {\n return null\n }\n\n const hasManualOverlay = Boolean(watermark.overlay_settings)\n const opacityForRender = hasManualOverlay\n ? (parseOpacityPercent(watermark.overlay_settings?.opacity) ?? opacity)\n : opacity\n // oxlint-disable-next-line react/react-compiler\n const contentBox = getVideoContentBox()\n const hasContentBox = contentBox.width > 0 && contentBox.height > 0\n\n const computeWatermarkStyle = () => {\n if (hasManualOverlay) {\n return computeManualStyle(watermark.overlay_settings!)\n }\n if (hasContentBox) {\n return {\n left: `${contentBox.x + (position.x / 100) * contentBox.width}px`,\n top: `${contentBox.y + (position.y / 100) * contentBox.height}px`,\n transform: 'translate(-50%, -50%)',\n width: `${Math.max(1, (size / 100) * contentBox.width)}px`,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n }\n return {\n left: `${position.x}%`,\n top: `${position.y}%`,\n transform: 'translate(-50%, -50%)',\n width: `${size}%`,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n }\n\n return (\n <WatermarkOverlay\n ref={watermarkRef}\n $opacity={opacityForRender}\n onMouseDown={hasManualOverlay ? undefined : handleMouseDown}\n // oxlint-disable-next-line react/react-compiler\n style={computeWatermarkStyle()}\n >\n <img src={watermark.imageUrl} alt=\"Watermark\" draggable={false} />\n </WatermarkOverlay>\n )\n}\n\ninterface WatermarkControlsProps {\n watermark: WatermarkConfig\n onChange: (watermark: WatermarkConfig) => void\n onValidationChange?: (error: string | null) => void\n previewContainerRef?: React.RefObject<HTMLDivElement | null>\n previewVideoRef?: React.RefObject<HTMLVideoElement | null>\n}\n\nexport function WatermarkControls({\n watermark,\n onChange,\n onValidationChange,\n previewContainerRef,\n previewVideoRef,\n}: WatermarkControlsProps) {\n const [urlInput, setUrlInput] = useState(watermark.imageUrl || '')\n const [urlError, setUrlError] = useState<string | null>(null)\n const [isValidating, setIsValidating] = useState(false)\n const [isValid, setIsValid] = useState<boolean | null>(null)\n const validationTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const [mode, setMode] = useState<'canvas' | 'manual'>(\n watermark.overlay_settings ? 'manual' : 'canvas',\n )\n\n const isUpdatingRef = useRef(false)\n\n const isValidExtension = useCallback((extension: string) => {\n return extension.endsWith('.png') || extension.endsWith('.jpg') || extension.endsWith('.jpeg')\n }, [])\n\n const validateUrl = useCallback(\n (url: string) => {\n if (validationTimeoutRef.current) {\n clearTimeout(validationTimeoutRef.current)\n }\n\n if (!url) {\n setUrlError(null)\n setIsValid(null)\n setIsValidating(false)\n onValidationChange?.(null)\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n overlay_settings: undefined,\n })\n return\n }\n\n setIsValidating(true)\n setIsValid(null)\n setUrlError(null)\n\n validationTimeoutRef.current = setTimeout(() => {\n try {\n const urlObj = new URL(url)\n const pathname = urlObj.pathname.toLowerCase()\n if (isValidExtension(pathname)) {\n setIsValid(true)\n setUrlError(null)\n onValidationChange?.(null)\n const img = new Image()\n img.onload = () => {\n const imageAspectRatio =\n img.naturalWidth && img.naturalHeight ? img.naturalWidth / img.naturalHeight : 1\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: true,\n imageUrl: url,\n imageAspectRatio,\n })\n }\n img.onerror = () => {\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: true,\n imageUrl: url,\n imageAspectRatio: watermark.imageAspectRatio,\n })\n }\n img.src = url\n } else {\n const errorMsg =\n 'Mux only supports PNG and JPG watermark images. Please use a .png or .jpg file.'\n setIsValid(false)\n setUrlError(errorMsg)\n onValidationChange?.(errorMsg)\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n imageAspectRatio: undefined,\n overlay_settings: undefined,\n })\n }\n } catch {\n setIsValid(false)\n const errorMsg = 'Please enter a valid URL (e.g., https://example.com/watermark.png)'\n setUrlError(errorMsg)\n onValidationChange?.(errorMsg)\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n imageAspectRatio: undefined,\n overlay_settings: undefined,\n })\n } finally {\n setIsValidating(false)\n }\n }, 500)\n },\n [watermark, onChange, onValidationChange, isValidExtension],\n )\n\n useEffect(() => {\n return () => {\n if (validationTimeoutRef.current) {\n clearTimeout(validationTimeoutRef.current)\n }\n }\n }, [])\n\n useEffect(() => {\n // oxlint-disable-next-line react/react-compiler\n setMode(watermark.overlay_settings ? 'manual' : 'canvas')\n }, [watermark.overlay_settings])\n\n const handleUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const url = e.target.value\n setUrlInput(url)\n\n if (watermark.imageUrl && url !== watermark.imageUrl) {\n isUpdatingRef.current = true\n onChange({\n ...watermark,\n enabled: false,\n imageUrl: undefined,\n imageAspectRatio: undefined,\n overlay_settings: undefined,\n })\n }\n\n validateUrl(url)\n }\n\n const normalizeZeroPercent = (value: string | undefined) => {\n if (!value) return value\n const trimmed = value.trim()\n if (!trimmed.endsWith('%')) return value\n const n = Number(trimmed.slice(0, -1))\n if (!Number.isFinite(n)) return value\n const epsilon = 1e-9\n if (n === 0 || Object.is(n, -0) || Math.abs(n) < epsilon) return '0.01%'\n return `${n}%`\n }\n\n const updateOverlaySettings = (next: Partial<MuxOverlaySettings>) => {\n const prev = watermark.overlay_settings\n const base: MuxOverlaySettings = prev ?? {\n vertical_align: 'bottom',\n vertical_margin: '2%',\n horizontal_align: 'right',\n horizontal_margin: '2%',\n width: `${watermark.size ?? 20}%`,\n opacity: `${Math.round((watermark.opacity ?? 0.7) * 100)}%`,\n }\n\n const merged: MuxOverlaySettings = {\n ...base,\n ...next,\n }\n\n onChange({\n ...watermark,\n enabled: true,\n overlay_settings: {\n ...merged,\n horizontal_margin:\n normalizeZeroPercent(merged.horizontal_margin) || merged.horizontal_margin,\n vertical_margin: normalizeZeroPercent(merged.vertical_margin) || merged.vertical_margin,\n },\n })\n }\n\n const getVideoContentBox = () => {\n const container = previewContainerRef?.current\n if (!container) return {x: 0, y: 0, width: 0, height: 0}\n\n const rect = container.getBoundingClientRect()\n const containerW = rect.width\n const containerH = rect.height\n\n const videoEl = previewVideoRef?.current\n const videoW = videoEl?.videoWidth || 0\n const videoH = videoEl?.videoHeight || 0\n\n if (!videoW || !videoH || !containerW || !containerH) {\n return {x: 0, y: 0, width: containerW, height: containerH}\n }\n\n const scale = Math.min(containerW / videoW, containerH / videoH)\n const contentW = videoW * scale\n const contentH = videoH * scale\n const offsetX = (containerW - contentW) / 2\n const offsetY = (containerH - contentH) / 2\n\n return {x: offsetX, y: offsetY, width: contentW, height: contentH}\n }\n\n return (\n <Stack gap={3}>\n <Stack gap={2}>\n <Text size={1} weight=\"medium\">\n Watermark Image URL\n </Text>\n <Text size={0} muted>\n Enter a URL to a PNG or JPG image. Mux will download this image and overlay it on your\n video.\n </Text>\n <Box style={{position: 'relative', width: '100%'}}>\n <input\n type=\"url\"\n value={urlInput}\n onChange={handleUrlChange}\n placeholder=\"https://example.com/watermark.png\"\n style={{\n padding: '8px 12px',\n paddingRight: (() => {\n if (urlInput) return '96px'\n if (isValid !== null) return '36px'\n return '12px'\n })(),\n border: (() => {\n if (urlError || isValid === false) return '1px solid #e74c3c'\n if (isValid === true) return '1px solid #4caf50'\n return '1px solid #ccc'\n })(),\n borderRadius: '4px',\n width: '100%',\n maxWidth: '100%',\n boxSizing: 'border-box',\n fontSize: '14px',\n }}\n />\n {(urlInput || isValidating || isValid !== null) && (\n <Box\n style={{\n position: 'absolute',\n right: '8px',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {urlInput && (\n <Button\n text=\"Clear\"\n mode=\"bleed\"\n tone=\"critical\"\n onClick={() => {\n setUrlInput('')\n validateUrl('')\n }}\n disabled={isValidating}\n style={{fontSize: '11px', height: '24px'}}\n />\n )}\n {isValidating && (\n <Text size={0} muted>\n Validating...\n </Text>\n )}\n {isValid === true && !isValidating && (\n <CheckmarkCircleIcon style={{color: '#4caf50', fontSize: '18px'}} />\n )}\n {isValid === false && !isValidating && (\n <ErrorOutlineIcon style={{color: '#e74c3c', fontSize: '18px'}} />\n )}\n </Box>\n )}\n </Box>\n {urlError && (\n <Card padding={2} tone=\"critical\" radius={2}>\n <Flex align=\"center\" gap={2}>\n <ErrorOutlineIcon style={{color: '#e74c3c', flexShrink: 0}} />\n <Text size={0} style={{color: '#e74c3c'}}>\n {urlError}\n </Text>\n </Flex>\n </Card>\n )}\n </Stack>\n\n {watermark.imageUrl && (\n <Stack gap={2}>\n <Card padding={3} tone=\"transparent\" border radius={2}>\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap={3}\n style={{flexWrap: 'wrap', alignItems: 'flex-start'}}\n >\n <Stack gap={2} style={{minWidth: 240, flex: 1}}>\n <Text size={1} weight=\"medium\">\n Positioning mode\n </Text>\n <Text size={0} muted>\n Choose between dragging on the canvas or manually editing the Mux{' '}\n <code>overlay_settings</code> fields (as in{' '}\n <a\n href=\"https://www.mux.com/docs/guides/add-watermarks-to-your-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n the docs\n </a>\n ).\n </Text>\n </Stack>\n <Flex gap={2} style={{flexWrap: 'wrap'}}>\n <Button\n text=\"Canvas\"\n mode={mode === 'canvas' ? 'default' : 'ghost'}\n onClick={() => {\n setMode('canvas')\n onChange({...watermark, enabled: true, overlay_settings: undefined})\n }}\n />\n <Button\n text=\"Manual\"\n mode={mode === 'manual' ? 'default' : 'ghost'}\n onClick={() => {\n setMode('manual')\n const overlay = convertWatermarkToMuxOverlay({...watermark, enabled: true})\n updateOverlaySettings(overlay ?? {})\n }}\n />\n </Flex>\n </Flex>\n </Card>\n\n {mode === 'manual' && (\n <Card padding={3} tone=\"transparent\" border radius={2}>\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n Mux overlay_settings\n </Text>\n <Grid gridTemplateColumns={[1, 2]} gap={3} style={{width: '100%'}}>\n <Stack gap={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n horizontal_align\n </Text>\n <select\n value={watermark.overlay_settings?.horizontal_align || 'right'}\n onChange={(e) =>\n updateOverlaySettings({\n horizontal_align: (e.target.value ||\n 'right') as MuxOverlaySettings['horizontal_align'],\n })\n }\n style={{\n width: '100%',\n padding: '8px 10px',\n border: '1px solid #ccc',\n borderRadius: 4,\n }}\n >\n <option value=\"left\">left</option>\n <option value=\"center\">center</option>\n <option value=\"right\">right</option>\n </select>\n </Stack>\n <Stack gap={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n horizontal_margin (e.g. 2% or 40px)\n </Text>\n <TextInput\n value={watermark.overlay_settings?.horizontal_margin || '2%'}\n onChange={(e) =>\n updateOverlaySettings({horizontal_margin: e.currentTarget.value})\n }\n />\n </Stack>\n <Stack gap={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n vertical_align\n </Text>\n <select\n value={watermark.overlay_settings?.vertical_align || 'bottom'}\n onChange={(e) =>\n updateOverlaySettings({\n vertical_align: (e.target.value ||\n 'bottom') as MuxOverlaySettings['vertical_align'],\n })\n }\n style={{\n width: '100%',\n padding: '8px 10px',\n border: '1px solid #ccc',\n borderRadius: 4,\n }}\n >\n <option value=\"top\">top</option>\n <option value=\"middle\">middle</option>\n <option value=\"bottom\">bottom</option>\n </select>\n </Stack>\n <Stack gap={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n vertical_margin (e.g. 2% or 40px)\n </Text>\n <TextInput\n value={watermark.overlay_settings?.vertical_margin || '2%'}\n onChange={(e) =>\n updateOverlaySettings({vertical_margin: e.currentTarget.value})\n }\n />\n </Stack>\n <Stack gap={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n width (e.g. 25% or 80px)\n </Text>\n <TextInput\n value={watermark.overlay_settings?.width || `${watermark.size ?? 20}%`}\n onChange={(e) => updateOverlaySettings({width: e.currentTarget.value})}\n />\n </Stack>\n <Stack gap={2} style={{minWidth: 0}}>\n <Text size={0} muted>\n opacity (e.g. 90%)\n </Text>\n <TextInput\n value={\n watermark.overlay_settings?.opacity ||\n `${Math.round((watermark.opacity ?? 0.7) * 100)}%`\n }\n onChange={(e) => updateOverlaySettings({opacity: e.currentTarget.value})}\n />\n </Stack>\n </Grid>\n <Text size={0} muted>\n Margins and width accept either percentages or pixels, per the Mux guide.\n </Text>\n </Stack>\n </Card>\n )}\n\n {mode === 'canvas' && (\n <>\n <Box>\n <Text size={1} weight=\"medium\">\n {/* oxlint-disable-next-line react/react-compiler */}\n {(() => {\n const sizePct = watermark.size || 20\n const contentW = getVideoContentBox().width\n if (!contentW) return `Size: ${sizePct}%`\n const px = Math.max(1, Math.round((sizePct / 100) * contentW))\n return `Size: ${px}px`\n })()}\n </Text>\n <RangeInput\n type=\"range\"\n // oxlint-disable-next-line react/react-compiler\n value={(() => {\n const sizePct = watermark.size || 20\n const contentW = getVideoContentBox().width\n if (!contentW) return sizePct\n return Math.max(1, Math.round((sizePct / 100) * contentW))\n })()}\n // oxlint-disable-next-line react/react-compiler\n min={(() => {\n const contentW = getVideoContentBox().width\n if (!contentW) return 5\n return Math.max(1, Math.round(contentW * 0.05))\n })()}\n // oxlint-disable-next-line react/react-compiler\n max={(() => {\n const contentW = getVideoContentBox().width\n if (!contentW) return 50\n return Math.max(1, Math.round(contentW * 0.5))\n })()}\n step={1}\n onChange={(e) => {\n const raw = Number(e.target.value)\n const contentW = getVideoContentBox().width\n const nextPct = contentW ? (raw / contentW) * 100 : raw\n const clampedPct = Math.max(5, Math.min(50, nextPct))\n onChange({\n ...watermark,\n size: clampedPct,\n })\n }}\n />\n </Box>\n\n <Box>\n <Text size={1} weight=\"medium\">\n Opacity: {Math.round((watermark.opacity ?? 0.7) * 100)}%\n </Text>\n <RangeInput\n type=\"range\"\n value={watermark.opacity ?? 0.7}\n min={0}\n max={1}\n step={0.05}\n onChange={(e) =>\n onChange({\n ...watermark,\n opacity: Number(e.target.value),\n })\n }\n />\n </Box>\n </>\n )}\n\n <Card padding={2} tone=\"transparent\" border radius={2}>\n <Text size={0} muted>\n {mode === 'manual'\n ? 'Manual mode: edit the overlay_settings fields above'\n : '💡 Drag the watermark on the preview to position it'}\n </Text>\n </Card>\n </Stack>\n )}\n </Stack>\n )\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {Box, Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {Autocomplete} from '@sanity/ui/autocomplete'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {type Dispatch} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type PluginConfig, SUPPORTED_MUX_LANGUAGES, type 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\" path={[]}>\n <Stack gap={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 {Checkbox, Flex, Grid, Text} from '@sanity/ui'\nimport {type ActionDispatch, type CSSProperties, type ReactNode, useState} from 'react'\n\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\n\nexport default function PlaybackPolicyOption({\n id,\n checked,\n optionName,\n description,\n dispatch,\n action,\n disabled,\n}: {\n id: string\n checked: boolean\n optionName: string\n description: string | ReactNode\n dispatch: ActionDispatch<[action: UploadConfigurationStateAction]>\n action?: 'public_policy' | 'signed_policy' | 'drm_policy'\n disabled?: boolean\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: disabled ? 'not-allowed' : '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 if (!action) return\n triggerAnimation()\n dispatch({\n action,\n value: !checked,\n })\n }\n\n const descriptionJsx =\n typeof description === 'string' ? (\n <Text size={2} muted>\n {description}\n </Text>\n ) : (\n description\n )\n return (\n <label>\n <Flex gap={3} padding={3} style={boxStyle}>\n <Checkbox\n id={id}\n required\n checked={checked}\n onChange={handleBoxClick}\n disabled={disabled}\n />\n <Grid gap={3}>\n <Text size={3} weight=\"bold\">\n {optionName}\n </Text>\n {descriptionJsx}\n </Grid>\n </Flex>\n </label>\n )\n}\n","import {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {Box, Flex, Text} from '@sanity/ui'\nimport {type 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'\nimport {Code} from '@sanity/ui/code'\nimport {type ActionDispatch} from 'react'\n\nimport {type Secrets, type UploadConfig} from '../../util/types'\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\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: ActionDispatch<[action: UploadConfigurationStateAction]>\n}) {\n const noPolicySelected = !(config.public_policy || config.signed_policy || config.drm_policy)\n const drmPolicyDisabled = !secrets.drmConfigId\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={\n <>\n <Text size={2} muted>\n Playback IDs are accessible by constructing an HLS URL like\n </Text>\n <Code>{'https://stream.mux.com/{PLAYBACK_ID}'}</Code>\n </>\n }\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={\n <>\n <Text size={2} muted>\n Playback IDs should be used with tokens\n </Text>\n <Code>{'https://stream.mux.com/{PLAYBACK_ID}?token={TOKEN}'}</Code>\n <Text size={2} muted>\n See{' '}\n <a\n href=\"https://www.mux.com/docs/guides/secure-video-playback\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Secure video playback\n </a>{' '}\n for details about creating tokens.\n </Text>\n </>\n }\n // See Secure video playback for details about creating tokens.\"\n dispatch={dispatch}\n action=\"signed_policy\"\n />\n )}\n {drmPolicyDisabled ? (\n <PlaybackPolicyOption\n id={`${id}--drm`}\n checked={false}\n optionName=\"DRM - Disabled\"\n description={\n <>\n <Text size={2} muted>\n To enable DRM add your DRM Configuration Id to your plugin configuration in the API\n Credentials view.{' '}\n <a\n href=\"https://www.mux.com/support/human\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Contact us\n </a>{' '}\n to get started using DRM.\n </Text>\n </>\n }\n dispatch={dispatch}\n disabled\n />\n ) : (\n <PlaybackPolicyOption\n id={`${id}--drm`}\n checked={config.drm_policy}\n optionName=\"DRM\"\n description={\n <>\n <Text size={2} muted>\n Playback IDs should be used with tokens as with Signed playback, but require extra\n configuration.\n </Text>\n <Code>{'https://stream.mux.com/{PLAYBACK_ID}?token={TOKEN}'}</Code>\n <Text size={2} muted>\n See{' '}\n <a\n href=\"https://www.mux.com/docs/guides/protect-videos-with-drm#play-drm-protected-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Protect videos with DRM\n </a>{' '}\n for details about configuring your player for DRM playback and{' '}\n <a\n href=\"https://www.mux.com/docs/guides/secure-video-playback\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Secure video playback\n </a>{' '}\n for details about creating tokens.\n </Text>\n </>\n }\n dispatch={dispatch}\n action=\"drm_policy\"\n />\n )}\n {noPolicySelected && <PlaybackPolicyWarning />}\n </Grid>\n )\n}\n","import {Flex, Radio, Text} from '@sanity/ui'\nimport {type ActionDispatch} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type UploadConfig} from '../../util/types'\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\n\nexport const 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\nexport const ResolutionTierSelector = ({\n id,\n config,\n dispatch,\n maxSupportedResolution,\n}: {\n id: string\n config: UploadConfig\n dispatch: ActionDispatch<[action: UploadConfigurationStateAction]>\n maxSupportedResolution: number\n}) => {\n return (\n <FormField\n path={[]}\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","import {Checkbox, Flex, Label, Radio, Stack, Text} from '@sanity/ui'\nimport {type ActionDispatch, useMemo, useState} from 'react'\nimport {FormField} from 'sanity'\n\nimport {type StaticRenditionResolution, type UploadConfig} from '../../util/types'\nimport {type UploadConfigurationStateAction} from '../UploadConfiguration'\n\nconst ADVANCED_RESOLUTIONS: {value: StaticRenditionResolution; label: string}[] = [\n {value: '270p', label: '270p'},\n {value: '360p', label: '360p'},\n {value: '480p', label: '480p'},\n {value: '540p', label: '540p'},\n {value: '720p', label: '720p'},\n {value: '1080p', label: '1080p'},\n {value: '1440p', label: '1440p'},\n {value: '2160p', label: '2160p'},\n]\n\nexport const StaticRenditionSelector = ({\n id,\n config,\n dispatch,\n}: {\n id: string\n config: UploadConfig\n dispatch: ActionDispatch<[action: UploadConfigurationStateAction]>\n}) => {\n // Determine if user is in advanced mode based on selected renditions\n const isAdvancedMode = useMemo(() => {\n const specificResolutions = config.static_renditions.filter(\n (r) => r !== 'highest' && r !== 'audio-only',\n )\n return specificResolutions.length > 0\n }, [config.static_renditions])\n\n const [renditionMode, setRenditionMode] = useState<'standard' | 'advanced'>(\n isAdvancedMode ? 'advanced' : 'standard',\n )\n\n // Helper to toggle a rendition\n const toggleRendition = (rendition: StaticRenditionResolution) => {\n const current = config.static_renditions\n const hasRendition = current.includes(rendition)\n\n if (hasRendition) {\n dispatch({\n action: 'static_renditions',\n value: current.filter((r) => r !== rendition),\n })\n } else {\n dispatch({\n action: 'static_renditions',\n value: [...current, rendition],\n })\n }\n }\n\n // When switching modes, clear renditions that don't apply\n const handleModeChange = (mode: 'standard' | 'advanced') => {\n setRenditionMode(mode)\n if (mode === 'standard') {\n // Remove specific resolutions, keep only highest and audio-only\n dispatch({\n action: 'static_renditions',\n value: config.static_renditions.filter((r) => r === 'highest' || r === 'audio-only'),\n })\n } else {\n // Remove highest, keep specific resolutions and audio-only\n dispatch({\n action: 'static_renditions',\n value: config.static_renditions.filter((r) => r !== 'highest'),\n })\n }\n }\n return (\n <Stack gap={3}>\n <FormField\n path={[]}\n title=\"Static Renditions\"\n description=\"Generate downloadable MP4 or M4A files. Note: Mux will not upscale to produce MP4 renditions - renditions that would cause upscaling are skipped.\"\n >\n <Stack gap={3}>\n {/* Mode Selector */}\n <Flex gap={3}>\n <Flex align=\"center\" gap={2}>\n <Radio\n checked={renditionMode === 'standard'}\n name=\"rendition-mode\"\n onChange={() => handleModeChange('standard')}\n value=\"standard\"\n id={`${id}--mode-standard`}\n />\n <Text as=\"label\" htmlFor={`${id}--mode-standard`}>\n Standard\n </Text>\n </Flex>\n <Flex align=\"center\" gap={2}>\n <Radio\n checked={renditionMode === 'advanced'}\n name=\"rendition-mode\"\n onChange={() => handleModeChange('advanced')}\n value=\"advanced\"\n id={`${id}--mode-advanced`}\n />\n <Text as=\"label\" htmlFor={`${id}--mode-advanced`}>\n Advanced\n </Text>\n </Flex>\n </Flex>\n\n {/* Standard Mode Options */}\n {renditionMode === 'standard' && (\n <Stack gap={2}>\n <Flex align=\"center\" gap={2} padding={[0, 2]}>\n <Checkbox\n id={`${id}--highest`}\n style={{display: 'block'}}\n checked={config.static_renditions.includes('highest')}\n onChange={() => toggleRendition('highest')}\n />\n <Text as=\"label\" htmlFor={`${id}--highest`}>\n Highest Resolution (up to 4K)\n </Text>\n </Flex>\n <Flex align=\"center\" gap={2} padding={[0, 2]}>\n <Checkbox\n id={`${id}--audio-only-standard`}\n style={{display: 'block'}}\n checked={config.static_renditions.includes('audio-only')}\n onChange={() => toggleRendition('audio-only')}\n />\n <Text as=\"label\" htmlFor={`${id}--audio-only-standard`}>\n Audio Only (M4A)\n </Text>\n </Flex>\n </Stack>\n )}\n\n {/* Advanced Mode Options */}\n {renditionMode === 'advanced' && (\n <Stack gap={2}>\n <Label size={1} muted>\n Select specific resolutions:\n </Label>\n <Flex gap={2} wrap=\"wrap\">\n {ADVANCED_RESOLUTIONS.map(({value, label}) => {\n const inputId = `${id}--resolution-${value}`\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Checkbox\n id={inputId}\n style={{display: 'block'}}\n checked={config.static_renditions.includes(value)}\n onChange={() => toggleRendition(value)}\n />\n <Text as=\"label\" htmlFor={inputId} size={1}>\n {label}\n </Text>\n </Flex>\n )\n })}\n </Flex>\n <Flex align=\"center\" gap={2} padding={[2, 2, 0, 2]}>\n <Checkbox\n id={`${id}--audio-only-advanced`}\n style={{display: 'block'}}\n checked={config.static_renditions.includes('audio-only')}\n onChange={() => toggleRendition('audio-only')}\n />\n <Text as=\"label\" htmlFor={`${id}--audio-only-advanced`}>\n Audio Only (M4A)\n </Text>\n </Flex>\n </Stack>\n )}\n </Stack>\n </FormField>\n </Stack>\n )\n}\n","import {DocumentVideoIcon} from '@sanity/icons/DocumentVideo'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button, Card, Dialog, Flex, Label, Radio, Stack, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport LanguagesList from 'iso-639-1'\nimport {memo, useEffect, useId, useReducer, useRef, useState} from 'react'\nimport {FormField} from 'sanity'\n\nimport {useFetchFileSize} from '../hooks/useFetchFileSize'\nimport {useMediaMetadata, type VideoAssetMetadata} from '../hooks/useMediaMetadata'\nimport {convertWatermarkToMuxOverlay} from '../util/convertWatermarkToMux'\nimport formatBytes from '../util/formatBytes'\nimport {formatSeconds} from '../util/formatSeconds'\nimport {\n type AutogeneratedTextTrack,\n type CustomTextTrack,\n isAutogeneratedTrack,\n isCustomTextTrack,\n type MuxNewAssetSettings,\n type PluginConfig,\n type Secrets,\n type StaticRenditionResolution,\n type SupportedMuxLanguage,\n type UploadConfig,\n type UploadTextTrack,\n type WatermarkConfig,\n} from '../util/types'\nimport DraggableWatermark, {WatermarkControls} from './DraggableWatermark'\nimport TextTracksEditor, {type TrackAction} from './TextTracksEditor'\nimport PlaybackPolicy from './uploadConfiguration/PlaybackPolicy'\nimport {\n RESOLUTION_TIERS,\n ResolutionTierSelector,\n} from './uploadConfiguration/ResolutionTierSelector'\nimport {StaticRenditionSelector} from './uploadConfiguration/StaticRenditionSelector'\nimport type {StagedUpload} from './Uploader'\n\nexport type UploadConfigurationStateAction =\n | {action: 'video_quality'; value: UploadConfig['video_quality']}\n | {action: 'max_resolution_tier'; value: UploadConfig['max_resolution_tier']}\n | {action: 'static_renditions'; value: UploadConfig['static_renditions']}\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 | {action: 'drm_policy'; value: UploadConfig['drm_policy']}\n | {action: 'watermark'; value: WatermarkConfig}\n | TrackAction\n\nconst VIDEO_QUALITY_LEVELS = [\n {value: 'basic', label: 'Basic'},\n {value: 'plus', label: 'Plus'},\n {value: 'premium', label: 'Premium'},\n] as const satisfies {value: UploadConfig['video_quality']; label: string}[]\n\n/**\n * Sanitizes static renditions configuration to ensure 'highest' is not mixed with specific resolutions.\n * If both are present, only 'highest' (and 'audio-only' if present) will be kept.\n */\nfunction sanitizeStaticRenditions(\n renditions: StaticRenditionResolution[],\n): StaticRenditionResolution[] {\n const hasHighest = renditions.includes('highest')\n const hasSpecificResolutions = renditions.some((r) => r !== 'highest' && r !== 'audio-only')\n\n if (hasHighest && hasSpecificResolutions) {\n return renditions.filter((r) => r === 'highest' || r === 'audio-only')\n }\n\n return renditions\n}\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, watermark: WatermarkConfig | undefined) => void\n onClose: () => void\n}) {\n const id = useId()\n const [watermarkValidationError, setWatermarkValidationError] = useState<string | null>(null)\n const watermarkPreviewContainerRef = useRef<HTMLDivElement>(null)\n const watermarkPreviewVideoRef = useRef<HTMLVideoElement>(null)\n // oxlint-disable-next-line react/react-compiler -- `.current` is read once to seed immutable default subtitle tracks\n const autoTextTracks = useRef<NonNullable<UploadConfig['text_tracks']>>(\n pluginConfig.video_quality === 'plus' && 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 // oxlint-disable-next-line react/react-compiler -- reducer closes over `autoTextTracks` ref seed\n (prev: UploadConfig, action: UploadConfigurationStateAction) => {\n switch (action.action) {\n case 'video_quality':\n // If video quality level switches to basic, remove plus-only features\n if (action.value === 'basic') {\n return Object.assign({}, prev, {\n video_quality: action.value,\n static_renditions: [],\n max_resolution_tier: '1080p',\n text_tracks: prev.text_tracks?.filter(({type}) => type !== 'autogenerated'),\n public_policy: true,\n signed_policy: false,\n drm_policy: false,\n })\n // If video quality level switches to plus, add back in default plus features\n }\n return Object.assign({}, prev, {\n video_quality: action.value,\n static_renditions: sanitizeStaticRenditions(pluginConfig.static_renditions || []),\n max_resolution_tier: pluginConfig.max_resolution_tier,\n text_tracks: [...autoTextTracks, ...(prev.text_tracks || [])],\n })\n\n case 'static_renditions':\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 case 'drm_policy':\n return Object.assign({}, prev, {[action.action]: action.value})\n case 'watermark':\n return Object.assign({}, prev, {watermark: 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 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 video_quality: pluginConfig.video_quality,\n max_resolution_tier: pluginConfig.max_resolution_tier,\n static_renditions: sanitizeStaticRenditions(pluginConfig.static_renditions || []),\n signed_policy: secrets.enableSignedUrls && pluginConfig.defaultSigned,\n public_policy: pluginConfig.defaultPublic,\n drm_policy: pluginConfig.defaultDrm && !!secrets.drmConfigId,\n normalize_audio: pluginConfig.normalize_audio,\n text_tracks: autoTextTracks,\n } as UploadConfig,\n )\n\n // Video validations\n const [validationError, setValidationError] = useState<string | null>(null)\n const MAX_FILE_SIZE = pluginConfig.maxAssetFileSize\n const MAX_DURATION_SECONDS = pluginConfig.maxAssetDuration\n\n const {fileSize, isLoadingFileSize, canSkipFileSizeValidation} = useFetchFileSize(\n stagedUpload,\n MAX_FILE_SIZE,\n )\n const {videoAssetMetadata, setVideoAssetMetadata, isLoadingMetadata} =\n useMediaMetadata(stagedUpload)\n\n useEffect(() => {\n if (fileSize) {\n setVideoAssetMetadata((old) => ({...old, size: fileSize}))\n }\n }, [fileSize, setVideoAssetMetadata])\n\n useEffect(() => {\n const validateDuration = (duration: number) => {\n if (MAX_DURATION_SECONDS && duration > MAX_DURATION_SECONDS) {\n setValidationError(\n `Video duration (${formatSeconds(duration)}) exceeds maximum allowed duration of ${formatSeconds(MAX_DURATION_SECONDS)}`,\n )\n return false\n }\n return true\n }\n\n const validateFileSize = (size: number): boolean => {\n if (MAX_FILE_SIZE === undefined || size <= MAX_FILE_SIZE) {\n return true\n }\n\n setValidationError(\n `File size (${formatBytes(size)}) exceeds maximum allowed size of ${formatBytes(MAX_FILE_SIZE)}`,\n )\n return false\n }\n\n const validateDrmAvailability = (isAudioOnly: boolean) => {\n if (config.drm_policy && isAudioOnly) {\n setValidationError('Audio-only asset cannot be DRM protected')\n return false\n }\n return true\n }\n\n let valid = true\n if (videoAssetMetadata?.size) {\n valid = valid && (canSkipFileSizeValidation || validateFileSize(videoAssetMetadata.size))\n }\n if (videoAssetMetadata?.duration) {\n valid = valid && validateDuration(videoAssetMetadata.duration)\n }\n if (videoAssetMetadata?.isAudioOnly != undefined) {\n valid = valid && validateDrmAvailability(videoAssetMetadata.isAudioOnly)\n }\n if (valid) {\n // oxlint-disable-next-line react/react-compiler -- sync validationError from derived validity checks\n setValidationError(null)\n }\n }, [\n MAX_FILE_SIZE,\n MAX_DURATION_SECONDS,\n canSkipFileSizeValidation,\n videoAssetMetadata?.duration,\n videoAssetMetadata?.size,\n videoAssetMetadata?.height,\n videoAssetMetadata?.width,\n videoAssetMetadata,\n config.drm_policy,\n validationError,\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) {\n const {settings, watermark} = formatUploadConfig(config, secrets, {\n videoAspectRatio: videoAssetMetadata?.aspectRatio,\n })\n startUpload(settings, watermark)\n }\n // oxlint-disable-next-line react/exhaustive-deps -- intentionally mount-only: start upload once with developer-specified config\n }, [])\n if (skipConfig) return null\n\n const basicConfig = config.video_quality !== 'plus' && config.video_quality !== 'premium'\n const playbackPolicySelected = config.public_policy || config.signed_policy || config.drm_policy\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} gap={2}>\n {(validationError || watermarkValidationError) && (\n <Card padding={3} tone=\"critical\" radius={2} marginBottom={2}>\n <Flex gap={2} align=\"flex-start\">\n <ErrorOutlineIcon width={20} height={20} />\n <Stack gap={2}>\n <Text size={1} weight=\"semibold\">\n Validation Error\n </Text>\n <Text size={1}>{validationError || watermarkValidationError}</Text>\n </Stack>\n </Flex>\n </Card>\n )}\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 gap={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 : (() => {\n if (videoAssetMetadata?.size) {\n return `File From URL (${formatBytes(videoAssetMetadata.size)})`\n }\n if (isLoadingFileSize) {\n return 'File From URL (Loading size...)'\n }\n return 'File From URL (Unknown size)'\n })()}\n </Text>\n {stagedUpload.type === 'file' && (\n <Stack gap={1}>\n {isLoadingMetadata && (\n <Text as=\"p\" size={1} muted>\n Reading video metadata...\n </Text>\n )}\n {videoAssetMetadata?.duration && !validationError && (\n <Text as=\"p\" size={1} muted>\n Duration: {formatSeconds(videoAssetMetadata.duration)}\n </Text>\n )}\n </Stack>\n )}\n </Stack>\n </Flex>\n </Card>\n {!disableUploadConfig && (\n <Stack gap={3} paddingBottom={2}>\n <FormField\n path={[]}\n title=\"Video Quality Level\"\n description={\n <>\n The video quality level informs the cost, quality, and available platform features\n for 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 {VIDEO_QUALITY_LEVELS.map(({value, label}) => {\n const inputId = `${id}--encodingtier-${value}`\n return (\n <Flex key={value} align=\"center\" gap={2}>\n <Radio\n checked={config.video_quality === value}\n name=\"asset-encodingtier\"\n onChange={(e) =>\n dispatch({\n action: 'video_quality' as const,\n value: e.currentTarget.value as UploadConfig['video_quality'],\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 {!basicConfig && (\n <>\n <FormField title=\"Additional Configuration\" path={[]}>\n <Stack gap={3}>\n <PlaybackPolicy id={id} config={config} secrets={secrets} dispatch={dispatch} />\n {maxSupportedResolution > 0 && (\n <ResolutionTierSelector\n id={id}\n config={config}\n dispatch={dispatch}\n maxSupportedResolution={maxSupportedResolution}\n />\n )}\n <StaticRenditionSelector id={id} config={config} dispatch={dispatch} />\n {!disableTextTrackConfig && (\n <TextTracksEditor\n tracks={config.text_tracks}\n dispatch={dispatch}\n defaultLang={pluginConfig.defaultAutogeneratedSubtitleLang}\n />\n )}\n </Stack>\n </FormField>\n <WatermarkSection\n config={config}\n dispatch={dispatch}\n stagedUpload={stagedUpload}\n videoAssetMetadata={videoAssetMetadata}\n watermarkPreviewContainerRef={watermarkPreviewContainerRef}\n watermarkPreviewVideoRef={watermarkPreviewVideoRef}\n onValidationChange={setWatermarkValidationError}\n />\n </>\n )}\n </Stack>\n )}\n\n <Box marginTop={4}>\n <Button\n disabled={\n (!basicConfig && !playbackPolicySelected) ||\n validationError !== null ||\n isLoadingMetadata ||\n (isLoadingFileSize && !canSkipFileSizeValidation)\n }\n icon={UploadIcon}\n text=\"Upload\"\n tone=\"positive\"\n onClick={() => {\n if (!validationError) {\n const {settings, watermark} = formatUploadConfig(config, secrets, {\n videoAspectRatio: videoAssetMetadata?.aspectRatio,\n })\n startUpload(settings, watermark)\n }\n }}\n />\n </Box>\n </Stack>\n </Dialog>\n )\n}\n\nfunction setAdvancedPlaybackPolicy(\n config: UploadConfig,\n secrets: Secrets,\n): MuxNewAssetSettings['advanced_playback_policies'] {\n const advanced_playback_policies: MuxNewAssetSettings['advanced_playback_policies'] = []\n if (config.public_policy) {\n advanced_playback_policies.push({policy: 'public'})\n }\n if (config.signed_policy) {\n advanced_playback_policies.push({policy: 'signed'})\n }\n if (config.drm_policy) {\n if (secrets.drmConfigId)\n advanced_playback_policies.push({\n policy: 'drm',\n drm_configuration_id: secrets.drmConfigId ?? undefined,\n })\n else {\n console.error('Selected DRM Policy but missing DRM Configuration Id')\n }\n }\n return advanced_playback_policies\n}\n\nfunction formatUploadConfig(\n config: UploadConfig,\n secrets: Secrets,\n options?: {videoAspectRatio?: number | null},\n): {\n settings: MuxNewAssetSettings\n watermark?: WatermarkConfig\n} {\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 const inputs: NonNullable<MuxNewAssetSettings['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\n if (config.watermark?.imageUrl) {\n const watermarkForMux: WatermarkConfig = {...config.watermark, enabled: true}\n const overlaySettings = convertWatermarkToMuxOverlay(watermarkForMux, {\n videoAspectRatio: options?.videoAspectRatio ?? undefined,\n units: 'px',\n })\n if (overlaySettings) {\n inputs.push({\n url: config.watermark.imageUrl,\n overlay_settings: overlaySettings,\n })\n }\n }\n\n return {\n settings: {\n input: inputs,\n static_renditions:\n config.static_renditions.length > 0\n ? config.static_renditions.map((resolution) => ({resolution}))\n : undefined,\n advanced_playback_policies: setAdvancedPlaybackPolicy(config, secrets),\n max_resolution_tier: config.max_resolution_tier,\n video_quality: config.video_quality,\n normalize_audio: config.normalize_audio,\n },\n watermark: config.watermark?.imageUrl ? {...config.watermark, enabled: true} : undefined,\n }\n}\n\nfunction WatermarkSection({\n config,\n dispatch,\n stagedUpload,\n videoAssetMetadata,\n watermarkPreviewContainerRef,\n watermarkPreviewVideoRef,\n onValidationChange,\n}: {\n config: UploadConfig\n dispatch: (action: UploadConfigurationStateAction) => void\n stagedUpload: StagedUpload\n videoAssetMetadata: VideoAssetMetadata | null\n watermarkPreviewContainerRef: React.RefObject<HTMLDivElement | null>\n watermarkPreviewVideoRef: React.RefObject<HTMLVideoElement | null>\n onValidationChange: (error: string | null) => void\n}) {\n if (videoAssetMetadata?.isAudioOnly !== false) return null\n return (\n <FormField\n path={[]}\n title=\"Watermark\"\n description={\n <>\n Add a watermark overlay to your video using Mux's native watermark support.{' '}\n <a\n href=\"https://www.mux.com/docs/guides/add-watermarks-to-your-videos\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Learn more about Mux watermarks.\n </a>\n </>\n }\n >\n <Stack gap={3}>\n <WatermarkControls\n watermark={config.watermark || {enabled: false}}\n onChange={(watermark) => {\n dispatch({action: 'watermark', value: watermark})\n }}\n onValidationChange={onValidationChange}\n previewContainerRef={watermarkPreviewContainerRef}\n previewVideoRef={watermarkPreviewVideoRef}\n />\n {config.watermark?.imageUrl &&\n stagedUpload.type === 'file' &&\n // Canvas preview is only shown in \"Canvas\" mode (no explicit overlay_settings)\n !config.watermark.overlay_settings && (\n <WatermarkPreview\n stagedUpload={stagedUpload}\n watermark={config.watermark}\n videoAspectRatio={videoAssetMetadata.aspectRatio}\n onWatermarkChange={(watermark) => {\n dispatch({action: 'watermark', value: watermark})\n }}\n previewContainerRef={watermarkPreviewContainerRef}\n videoRef={watermarkPreviewVideoRef}\n />\n )}\n </Stack>\n </FormField>\n )\n}\n\n// Memoized preview component to prevent unnecessary re-renders\nconst WatermarkPreview = memo(function WatermarkPreview({\n stagedUpload,\n watermark,\n onWatermarkChange,\n videoAspectRatio,\n previewContainerRef,\n videoRef,\n}: {\n stagedUpload: StagedUpload\n watermark: WatermarkConfig\n onWatermarkChange: (watermark: WatermarkConfig) => void\n videoAspectRatio?: number | null\n previewContainerRef: React.RefObject<HTMLDivElement | null>\n videoRef: React.RefObject<HTMLVideoElement | null>\n}) {\n // Initialize video source only once\n useEffect(() => {\n if (videoRef.current && stagedUpload.type === 'file') {\n const file = stagedUpload.files[0]\n const url = URL.createObjectURL(file!)\n videoRef.current.src = url\n\n return () => {\n URL.revokeObjectURL(url)\n }\n }\n return undefined\n }, [stagedUpload, videoRef])\n\n const isVertical =\n videoAspectRatio !== null && videoAspectRatio !== undefined && videoAspectRatio < 1\n\n return (\n <Card\n tone=\"transparent\"\n border\n style={{\n overflow: 'hidden',\n // For vertical videos, center the preview and limit its width\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n {/* Inner container that exactly matches the video aspect ratio - no padding, no letterbox */}\n <div\n ref={previewContainerRef}\n style={{\n position: 'relative',\n // For vertical videos: limit width so the preview doesn't get too tall\n // For horizontal videos: use full width\n width: isVertical ? 'auto' : '100%',\n aspectRatio: videoAspectRatio ? String(videoAspectRatio) : '16/9',\n ...(isVertical ? {height: '400px', maxHeight: '50vh'} : {minHeight: '200px'}),\n overflow: 'hidden',\n }}\n >\n <video\n ref={videoRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'fill',\n display: 'block',\n }}\n />\n <DraggableWatermark\n watermark={watermark}\n onChange={onWatermarkChange}\n containerRef={previewContainerRef as React.RefObject<HTMLDivElement>}\n videoElementRef={videoRef as React.RefObject<HTMLVideoElement>}\n />\n </div>\n </Card>\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","import {Card, type CardTone} from '@sanity/ui'\nimport {useCallback, useRef} from 'react'\nimport {styled} from 'styled-components'\n\nimport {withFocusRing} from './withFocusRing'\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 function UploadCard({\n children,\n tone,\n onPaste,\n onDrop,\n onDragEnter,\n onDragLeave,\n onDragOver,\n ref,\n}: UploadCardProps & {ref?: React.Ref<HTMLDivElement>}) {\n const inputRef = useRef<HTMLInputElement>(null)\n const handleKeyDown = useCallback<React.KeyboardEventHandler<HTMLDivElement>>((event) => {\n const target = event.target as HTMLElement\n\n // Don't steal focus when pasting into the VTT input\n if (target.closest('#vtt-url')) {\n return\n }\n\n if ((event.ctrlKey || event.metaKey) && event.key === 'v') {\n inputRef.current!.focus()\n }\n }, [])\n\n return (\n <UploadCardWithFocusRing\n tone={tone}\n ref={ref}\n padding={0}\n radius={2}\n shadow={0}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onPaste={onPaste}\n onDrop={onDrop}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={onDragOver}\n >\n <HiddenInput ref={inputRef} />\n {children}\n </UploadCardWithFocusRing>\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 {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 Omit<ButtonProps, 'onSelect'> {\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}\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 {DocumentVideoIcon} from '@sanity/icons/DocumentVideo'\nimport {PlugIcon} from '@sanity/icons/Plug'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Button, Card, Flex, Inline, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {useAccessControl} from '../hooks/useAccessControl'\nimport type {SetDialogState} from '../hooks/useDialogState'\nimport {type PluginConfig} from '../util/types'\nimport {FileInputButton, type FileInputButtonProps} from './FileInputButton'\n\nfunction formatAcceptString(accept: string): string {\n return accept\n .split(',')\n .map((type) => type.trim().replace('/*', ''))\n .join(' or ')\n}\n\ninterface UploadPlaceholderProps {\n setDialogState: SetDialogState\n readOnly: boolean\n hovering: boolean\n needsSetup: boolean\n onSelect: FileInputButtonProps['onSelect']\n config: PluginConfig\n accept: string\n}\nexport default function UploadPlaceholder(props: UploadPlaceholderProps) {\n const {setDialogState, readOnly, onSelect, hovering, needsSetup, accept} = props\n const handleBrowse = useCallback(() => setDialogState('select-video'), [setDialogState])\n const handleConfigureApi = useCallback(() => setDialogState('secrets'), [setDialogState])\n const {hasConfigAccess} = useAccessControl(props.config)\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 {formatAcceptString(accept)} file or paste URL here\n </Text>\n </Flex>\n </Flex>\n <Inline gap={2}>\n <FileInputButton\n accept={accept}\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 {hasConfigAccess && (\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 )}\n </Inline>\n </Flex>\n </Card>\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Button, type CardTone, Flex, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, 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 {isServerError, isValidUrl} from '../util/asserters'\nimport {extractDroppedFiles} from '../util/extractFiles'\nimport {hasPlaybackPolicy} from '../util/getPlaybackPolicy'\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: Error; settings: MuxNewAssetSettings}\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: React.MouseEvent<HTMLButtonElement>) => events$.next(event),\n }\n })(),\n ).current\n\n const uploadRef = useRef<Subscription | null>(null)\n const uploadingDocumentId = useRef<string | null>(null)\n const [state, dispatch] = useReducer(\n // oxlint-disable-next-line react/react-compiler\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 uploadingDocumentId.current = null\n return INITIAL_STATE\n case 'error': {\n // Clear upload observable on error\n uploadRef.current?.unsubscribe()\n uploadRef.current = null\n uploadingDocumentId.current = null\n\n let error = action.error\n if (isServerError(action.error) && hasPlaybackPolicy(action.settings, 'drm')) {\n error = new Error(\n 'Unknown Error while uploading DRM protected content. Make sure your DRM configuration ID is valid and set correctly',\n )\n }\n\n return Object.assign({}, INITIAL_STATE, {error: error})\n }\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 // and cleanup orphaned documents if upload was in progress\n useEffect(() => {\n const cleanup = () => {\n // Cancel subscription\n if (uploadRef.current && !uploadRef.current.closed) {\n uploadRef.current.unsubscribe()\n }\n\n // Delete orphaned document if upload was in progress and document is different from the saved asset\n if (uploadingDocumentId.current && props.asset?._id !== uploadingDocumentId.current) {\n const docId = uploadingDocumentId.current\n uploadingDocumentId.current = null\n\n props.client.delete(docId).catch((err) => {\n console.warn('Failed to cleanup orphaned upload document:', err)\n })\n }\n }\n\n const handleBeforeUnload = () => {\n cleanup()\n }\n\n window.addEventListener('beforeunload', handleBeforeUnload)\n window.addEventListener('pagehide', handleBeforeUnload)\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload)\n window.removeEventListener('pagehide', handleBeforeUnload)\n cleanup()\n }\n }, [props.client, props.asset?._id])\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 * @param watermark Optional watermark configuration\n * @returns\n */\n const startUpload = (\n settings: MuxNewAssetSettings,\n watermark?: import('../util/types').WatermarkConfig,\n ) => {\n const {stagedUpload} = state\n if (!stagedUpload || uploadRef.current) return\n dispatch({action: 'commitUpload'})\n let uploadObservable: Observable<UploadFileEvent | UploadUrlEvent>\n switch (stagedUpload.type) {\n case 'url':\n uploadObservable = uploadUrl({\n client: props.client,\n url: stagedUpload.url,\n settings,\n watermark,\n })\n break\n case 'file':\n uploadObservable = uploadFile({\n client: props.client,\n file: stagedUpload.files[0]!,\n settings,\n watermark,\n }).pipe(\n takeUntil(\n cancelUploadButton.observable.pipe(\n tap(() => {\n if (uploadingDocumentId.current) {\n void props.client.delete(uploadingDocumentId.current)\n uploadingDocumentId.current = null\n }\n }),\n ),\n ),\n )\n break\n }\n uploadRef.current = uploadObservable.subscribe({\n next: (event) => {\n switch (event.type) {\n case 'uuid':\n // Track the document ID for cleanup on unmount\n uploadingDocumentId.current = event.uuid\n dispatch({action: 'progressInfo', ...event})\n break\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 uploadingDocumentId.current = null\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, settings}),\n })\n }\n\n const invalidFileToast = useCallback(() => {\n toast.push({\n status: 'error',\n title: `Invalid file type. Accepted types: ${props.config.acceptedMimeTypes?.join(', ')}`,\n })\n }, [props.config.acceptedMimeTypes, toast])\n\n /**\n * Validates if any file in the provided FileList or File array has an unsupported MIME type\n * @param files - FileList or File array to validate\n * @returns true if any file has an invalid MIME type, false if all files are valid\n */\n const isInvalidFile = (files: FileList | File[]) => {\n const isInvalid = Array.from(files).some((file) => {\n return !props.config.acceptedMimeTypes?.some((acceptedType) => {\n // Convert mime type pattern to regex (e.g., 'audio/*' -> /^audio\\/.*$/)\n const pattern = `^${acceptedType.replace('*', '.*')}$`\n return new RegExp(pattern).test(file.type)\n })\n })\n\n return isInvalid\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 if (isInvalidFile(files)) return\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 const target = event.target as HTMLElement\n\n // Ignore paste coming from the VTT URL input\n if (target.closest('#vtt-url')) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n const clipboardData =\n event.clipboardData || (window as Window & {clipboardData?: DataTransfer}).clipboardData\n const url = clipboardData?.getData('text')?.trim()\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 event.preventDefault()\n event.stopPropagation()\n if (dragState === 'invalid') {\n invalidFileToast()\n setDragState(null)\n return\n }\n setDragState(null)\n void 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 const mimeTypes = props.config.acceptedMimeTypes\n\n // Check if the dragged file type matches any of the accepted mime types\n const isValidType = mimeTypes?.some((acceptedType) => {\n // Convert mime type pattern to regex (e.g., 'video/*' -> /^video\\/.*$/)\n const pattern = `^${acceptedType.replace('*', '.*')}$`\n return new RegExp(pattern).test(type!)\n })\n\n setDragState(isValidType ? '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.error\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 weight=\"semibold\" style={{textAlign: 'center'}}>\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 // oxlint-disable-next-line react/react-compiler\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 const acceptMimeString = props.config?.acceptedMimeTypes?.length\n ? props.config.acceptedMimeTypes.join(',')\n : 'video/*, audio/*'\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 config={props.config}\n buttons={\n <PlayerActionsMenu\n accept={acceptMimeString}\n asset={props.asset}\n dialogState={props.dialogState}\n setDialogState={props.setDialogState}\n onChange={props.onChange}\n onSelect={handleUpload}\n readOnly={props.readOnly}\n config={props.config}\n />\n }\n />\n </DialogStateProvider>\n ) : (\n <UploadPlaceholder\n accept={acceptMimeString}\n hovering={dragState !== null}\n onSelect={handleUpload}\n readOnly={!!props.readOnly}\n setDialogState={props.setDialogState}\n needsSetup={props.needsSetup}\n config={props.config}\n />\n )}\n </UploadCard>\n {props.dialogState === 'select-video' && (\n <InputBrowser\n config={props.config}\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 {useAccessControl} from '../hooks/useAccessControl'\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 {ConfigureApiDialog} 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 const {hasConfigAccess} = useAccessControl(props.config)\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} config={props.config} />\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' && hasConfigAccess && (\n <ConfigureApiDialog\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 {type: 'string', name: 'language_code'},\n {type: 'string', name: 'name'},\n {type: 'string', name: 'status'},\n {type: 'string', name: 'text_source'},\n {type: 'string', name: 'text_type'},\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: 'name'},\n {type: 'string', name: 'ext'},\n {type: 'number', name: 'height'},\n {type: 'number', name: 'width'},\n {type: 'number', name: 'bitrate'},\n {type: 'string', name: 'filesize'},\n {type: 'string', name: 'type'},\n {type: 'string', name: 'status'},\n {type: 'string', name: 'resolution_tier'},\n {type: 'string', name: 'resolution'},\n {type: 'string', name: 'id'},\n {type: 'string', name: 'passthrough'},\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 muxMasterFile = {\n name: 'mux.masterFile',\n type: 'object',\n fields: [\n {type: 'string', name: 'status'},\n {type: 'string', name: 'url'},\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: 'video_quality',\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 name: 'master',\n type: 'mux.masterFile',\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 muxMasterFile,\n muxAssetData,\n muxVideoAsset,\n]\n","import '@sanity/ui/styles.css'\nimport {definePlugin} from 'sanity'\n\nimport createStudioTool, {DEFAULT_TOOL_CONFIG} from '../components/StudioTool'\nimport {muxVideoCustomRendering} from '../plugin'\nimport {muxVideoSchema, schemaTypes} from '../schema'\nimport type {PluginConfig, StaticRenditionResolution} from '../util/types'\nexport type {VideoAssetDocument} from '../util/types'\n\nexport const defaultConfig: PluginConfig = {\n static_renditions: [],\n mp4_support: 'none',\n video_quality: 'plus',\n max_resolution_tier: '1080p',\n normalize_audio: false,\n defaultPublic: true,\n defaultSigned: false,\n defaultDrm: false,\n tool: DEFAULT_TOOL_CONFIG,\n allowedRolesForConfiguration: [],\n acceptedMimeTypes: ['video/*', 'audio/*'],\n}\n\n/**\n * Converts legacy mp4_support configuration to static_renditions format\n */\nfunction convertLegacyConfig(config: Partial<PluginConfig>): {\n static_renditions: StaticRenditionResolution[]\n} {\n // If static_renditions is already provided, use it\n if (config.static_renditions && config.static_renditions.length > 0) {\n return {static_renditions: config.static_renditions}\n }\n\n // Convert legacy mp4_support to static_renditions\n if (config.mp4_support === 'standard') {\n return {static_renditions: ['highest']}\n }\n\n return {static_renditions: []}\n}\n\nexport const muxInput = definePlugin<Partial<PluginConfig> | void>((userConfig) => {\n // TODO: Remove this on next major version when we end support for encoding_tier\n if (typeof userConfig === 'object' && 'encoding_tier' in userConfig) {\n const deprecated_encoding_tier = userConfig.encoding_tier\n if (!userConfig.video_quality) {\n if (deprecated_encoding_tier === 'baseline') {\n userConfig.video_quality = 'basic'\n }\n if (deprecated_encoding_tier === 'smart') {\n userConfig.video_quality = 'plus'\n }\n }\n }\n const config: PluginConfig = {\n ...defaultConfig,\n ...userConfig,\n ...convertLegacyConfig(userConfig || {}),\n }\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"],"mappings":"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AACC,MAAM;IAAUD,MAAM;GAAQ;GAC/B;IAACC,MAAM;IAAUD,MAAM;GAAiB;GACxC;IAACC,MAAM;IAAUD,MAAM;GAAY;GACnC;IAACC,MAAM;IAAUD,MAAM;GAAI;GAC3B;IAACC,MAAM;IAAUD,MAAM;GAAa;EAAC;CAmJvCQ;CACAC;EA/IAT,MAAM;EACNC,MAAM;EACNE,QAAQ,CACN;GAACF,MAAM;GAAUD,MAAM;EAAQ,GAC/B;GACEA,MAAM;GACNC,MAAM;GACNS,IAAI,CAAC,EAACT,MAAM,0BAAyB,CAAC;EACxC,CAAC;CAuIHQ;CACAE;EAnIAX,MAAM;EACNC,MAAM;EACNE,QAAQ,CACN;GAACF,MAAM;GAAUD,MAAM;EAAQ,GAC/B;GAACC,MAAM;GAAUD,MAAM;EAAK,CAAC;CA+H/BW;CACAC;EA3HAZ,MAAM;EACNE,OAAO;EACPD,MAAM;EACNE,QAAQ;GACN;IACEF,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEA,MAAM;IACNC,MAAM;IACNS,IAAI,CAAC,EAACT,MAAM,YAAW,CAAC;GAC1B;GACA;IACED,MAAM;IACNC,MAAM;IACNS,IAAI,CAAC,EAACT,MAAM,iBAAgB,CAAC;GAC/B;GACA;IACED,MAAM;IACNC,MAAM;GACR;GACA;IACED,MAAM;IACNC,MAAM;GACR;EAAC;CA0CHW;CACAC;EAtCAb,MAAM;EACNC,MAAM;EACNC,OAAO;EACPC,QAAQ;GACN;IACEF,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;GACA;IACEC,MAAM;IACND,MAAM;GACR;EAAC;CAWHa;AAAa,GCvMFW,gBAA8B;CACzCC,mBAAmB,CAAA;CACnBC,aAAa;CACbC,eAAe;CACfC,qBAAqB;CACrBC,iBAAiB;CACjBC,eAAe;CACfC,eAAe;CACfC,YAAY;CACZC,MAAMhB;CACNiB,8BAA8B,CAAA;CAC9BC,mBAAmB,CAAC,WAAW,SAAS;AAC1C;;;;AAKA,SAASC,oBAAoBC,QAE3B;CAWA,OATIA,OAAOZ,qBAAqBY,OAAOZ,kBAAkBc,SAAS,IACzD,EAACd,mBAAmBY,OAAOZ,kBAAiB,IAIjDY,OAAOX,gBAAgB,aAClB,EAACD,mBAAmB,CAAC,SAAS,EAAC,IAGjC,EAACA,mBAAmB,CAAA,EAAE;AAC/B;AAEA,MAAae,WAAWzB,cAA4C0B,eAAe;CAEjF,IAAI,OAAOA,cAAe,YAAY,mBAAmBA,YAAY;EACnE,IAAMC,2BAA2BD,WAAWE;EAC5C,AAAKF,WAAWd,kBACVe,6BAA6B,eAC/BD,WAAWd,gBAAgB,UAEzBe,6BAA6B,YAC/BD,WAAWd,gBAAgB;CAGjC;CACA,IAAMU,SAAuB;EAC3B,GAAGb;EACH,GAAGiB;EACH,GAAGL,oBAAoBK,cAAc,CAAC,CAAC;CACzC;CACA,OAAO;EACLG,MAAM;EACNC,QAAQ,EACNC,OAAO,CACL,GAAG1B,aACH;GACE,GAAGD;GACH,GAAGD,wBAAwBmB,MAAM;EACnC,CAAC,EAEL;EACAU,OAAOV,OAAOJ,SAAS,KAAQe,KAAAA,IAAY,CAAChC,iBAAiBqB,MAAM,CAAC;CACtE;AACF,CAAC"}
\ No newline at end of file