sanity-plugin-media
6.1.56.1.6
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":["ReactNode","createContext","useContext","useMemo","AssetSourceComponentProps","ContextProps","isMultiSelect","onSelect","Props","children","AssetSourceDispatchContext","undefined","AssetBrowserDispatchProvider","props","$","_c","t0","t1","contextValue","t2","useAssetSourceActions","context","Error","useEffect","useState","useRootPortalElement","$","_c","container","_temp","t0","t1","classList","add","document","body","appendChild","removeChild","createElement","TypedUseSelectorHook","useSelector","RootReducerState","useTypedSelector","SanityClient","useClient","useVersionedClient","$","_c","t0","Symbol","for","apiVersion","OrderDirection","ORDER_DICTIONARY","Record","asc","desc","_createdAt","_updatedAt","mimeType","originalFilename","size","getOrderTitle","field","direction","groq","SearchFacetDivider","SearchFacetInputProps","SearchFacetName","SearchFacetOperators","divider","type","inputs","Record","altText","assetTypes","field","name","operatorType","operatorTypes","title","value","creditLine","description","folder","fileName","height","inCurrentDocument","options","selectOnly","inUse","isOpaque","orientation","size","modifier","modifiers","fieldModifier","fieldName","tag","width","operators","doesNotInclude","fn","undefined","label","doesNotReference","_field","empty","_value","hideInput","equalTo","greaterThan","greaterThanOrEqualTo","includes","is","isNot","lessThan","lessThanOrEqualTo","notEmpty","references","AssetSourceComponentProps","divider","inputs","SearchFacetInputProps","SearchFacetDivider","SearchFacetGroup","OrderDirection","SUPPORTED_ASSET_TYPES","const","ORDER_OPTIONS","direction","field","FACETS","tag","inUse","inCurrentDocument","title","folder","altText","creditLine","description","isOpaque","fileName","size","type","orientation","width","height","GRID_TEMPLATE_COLUMNS","SMALL","LARGE","FOLDERS_PANEL_WIDTH","FOLDER_DOCUMENT_NAME","PANEL_HEIGHT","TAG_DOCUMENT_NAME","TAGS_PANEL_WIDTH","iif","Observable","of","throwError","delay","mergeMap","debugThrottle","throttled","source","T","pipe","v","Math","random","message","statusCode","groq","operators","TAG_DOCUMENT_NAME","AssetType","SearchFacetInputProps","buildExcludeTagsFragment","excludeTagSlugs","serializedExcludeTagSlugs","length","JSON","stringify","undefined","constructFilter","assetTypes","currentFolderId","searchFacets","searchQuery","documentAssetTypes","map","type","baseFilter","excludeTagsFragment","searchFacetFragments","reduce","acc","facet","field","modifier","modifiers","operatorType","value","operator","currentModifier","find","m","name","facetField","fieldModifier","fragment","fn","push","options","currentOptionValue","l","folderFilter","constructedQuery","trim","join","Asset","AssetRef","_ref","_type","ImageNode","asset","findImageAssets","document","Record","newAsset","assetToReplaceId","matchedTopLevelFields","Set","repointNestedImages","map","field","node","topLevelField","candidate","assetRef","hasMatchingAssetRef","_id","add","key","value","Object","entries","SanityClient","groq","from","Observable","of","throwError","mergeMap","TAG_DOCUMENT_NAME","HttpError","checkTagName","client","name","source","T","pipe","fetch","existingTagCount","message","statusCode","TagSelectOption","TagItem","getTagSelectOptions","tags","reduce","acc","val","tag","push","label","name","current","value","_id","createAction","AssetItem","HttpError","Tag","ASSETS_ACTIONS","tagsAddComplete","prepare","assets","tag","payload","tagsAddError","error","tagsAddRequest","tagsRemoveComplete","tagsRemoveError","tagsRemoveRequest","createAction","AssetItem","DIALOG_ACTIONS","showFolderCreate","prepare","parentFolderId","payload","showFolderMove","assets","folderId","showFolderRename","showTagCreate","showTagEdit","tagId","createSelector","createSlice","isAnyOf","PayloadAction","ClientError","Transaction","groq","Selector","ofType","from","Observable","of","bufferTime","catchError","filter","mergeMap","switchMap","withLatestFrom","TAG_DOCUMENT_NAME","checkTagName","debugThrottle","Asset","HttpError","MyEpic","TagSelectOption","Tag","TagItem","getTagSelectOptions","ASSETS_ACTIONS","DIALOG_ACTIONS","RootReducerState","TagsReducerState","allIds","byIds","Record","creating","creatingError","fetchCount","fetching","fetchingError","panelVisible","initialState","undefined","tagsSlice","name","extraReducers","builder","addCase","showTagCreate","state","showTagEdit","action","tagId","payload","error","addMatcher","tagsAddComplete","tagsAddError","tagsRemoveComplete","tagsRemoveError","tag","_id","updating","tagsAddRequest","tagsRemoveRequest","reducers","createComplete","assetId","includes","push","_type","picked","createError","createRequest","_action","deleteComplete","deleteIndex","indexOf","splice","deleteError","deleteRequest","Object","keys","forEach","key","fetchComplete","tags","length","fetchError","fetchRequest","reducer","query","prepare","listenerCreateQueue","_state","listenerCreateQueueComplete","listenerDeleteQueue","listenerDeleteQueueComplete","tagIds","listenerUpdateQueue","listenerUpdateQueueComplete","panelVisibleSet","sort","a","b","tagA","current","tagB","updateComplete","closeDialogId","updateError","updateRequest","formData","tagsCreateEpic","action$","state$","client","pipe","actions","match","debug","badConnection","observable","create","result","message","statusCode","tagsDeleteEpic","fetch","tagName","assets","patches","map","asset","id","patch","ifRevisionID","_rev","unset","transaction","reduce","tx","delete","commit","tagsFetchEpic","items","tagsListenerCreateQueueEpic","tagsListenerDeleteQueueEpic","tagsListenerUpdateQueueEpic","tagsSortEpic","type","tagsUpdateEpic","set","updatedTag","selectTagsByIds","selectTagsAllIds","selectTags","selectTagById","selectTagSelectOptions","opt","media","acc","v","tagItem","_ref","tagsActions","PayloadAction","createSelector","createSlice","uuid","EMPTY","of","filter","mergeMap","withLatestFrom","MyEpic","SearchFacetInputProps","SearchFacetOperatorType","WithId","tagsActions","RootReducerState","SearchState","facets","query","initialState","searchSlice","name","reducers","facetsAdd","state","action","facet","push","payload","id","facetsClear","facetsRemoveByName","facetName","facetsRemoveByTag","tagId","type","operatorType","value","facetsRemoveById","facetId","facetsUpdate","modifier","find","f","facetsUpdateById","forEach","index","querySet","searchQuery","searchFacetTagUpdateEpic","action$","state$","pipe","updateComplete","match","tag","currentSearchFacetTag","search","tagItem","tags","byIds","_id","actions","label","current","selectIsSearchFacetTag","_state","searchFacets","some","searchActions","reducer","createAction","SanityAssetDocument","SanityImageAssetDocument","UPLOADS_ACTIONS","uploadComplete","prepare","asset","payload","createSelector","createSlice","PayloadAction","AttributeSet","ClientError","Patch","SanityDocument","Transaction","groq","nanoid","Selector","ofType","EMPTY","from","of","bufferTime","catchError","concatMap","debounceTime","filter","mergeMap","switchMap","withLatestFrom","getOrderTitle","ORDER_OPTIONS","debugThrottle","Asset","AssetItem","AssetType","BrowserView","HttpError","MyEpic","Order","OrderDirection","Tag","constructFilter","findImageAssets","searchActions","RootReducerState","UPLOADS_ACTIONS","ASSETS_ACTIONS","ItemError","description","id","referencingIDs","type","AssetsReducerState","allIds","assetTypes","byIds","Record","excludeTagSlugs","fetchCount","fetching","fetchingError","lastPicked","order","pageIndex","pageSize","view","defaultOrder","direction","field","initialState","undefined","title","assetsSlice","name","extraReducers","builder","addCase","uploadComplete","state","action","asset","payload","_id","_type","picked","updating","tagsAddComplete","assets","forEach","tagsAddError","tagsAddRequest","tagsRemoveComplete","tagsRemoveError","tagsRemoveRequest","reducers","clear","deleteComplete","assetIds","deleteIndex","indexOf","splice","Math","floor","length","deleteError","error","itemErrors","response","body","items","map","item","deleteRequest","closeDialogId","Object","keys","key","fetchComplete","includes","push","existing","fetchError","folderSetComplete","folderId","assetId","opt","media","folder","_ref","_weak","folderSetError","message","folderSetRequest","fetchRequest","reducer","_action","params","query","prepare","queryFilter","selector","sort","replace","pipe","insertUploads","results","entries","hash","listenerCreateQueue","_state","listenerCreateQueueComplete","listenerDeleteQueue","listenerDeleteQueueComplete","listenerUpdateQueue","listenerUpdateQueueComplete","loadNextPage","loadPageIndex","orderSet","pick","pickAll","pickClear","values","pickRange","endId","startId","startIndex","findIndex","endIndex","indices","a","b","slice","tagA","tagB","updateComplete","updateError","updateImageReferences","updateImageReferencesComplete","updateRequest","formData","viewSet","assetsDeleteEpic","action$","_state$","client","assetsActions","match","observable","delete","JSON","stringify","assetsFetchEpic","state$","debug","badConnection","fetch","result","statusCode","assetsFetchPageIndexEpic","start","end","documentId","selected","document","documentAssetIds","constructedFilter","currentFolderId","folders","searchFacets","search","facets","searchQuery","assetsFetchNextPageEpic","assetsFetchAfterDeleteAllEpic","nextPageIndex","filterAssetWithoutTag","tag","tagIndex","tags","t","patchOperationTagAppend","patch","setIfMissing","append","_key","patchOperationTagUnset","ifRevisionId","_rev","unset","patchOperationFolderSet","nextPatch","set","assetsOrderSetEpic","assetsSearchEpic","facetsAdd","facetsClear","facetsRemoveById","facetsRemoveByName","facetsRemoveByTag","facetsUpdate","facetsUpdateById","querySet","assetsListenerCreateQueueEpic","actions","assetsListenerDeleteQueueEpic","assetsListenerUpdateQueueEpic","assetsSortEpic","assetsTagsAddEpic","pickedAssets","selectAssetsPicked","pickedAssetsFiltered","transaction","reduce","tx","pickedAsset","commit","assetsTagsRemoveEpic","assetsFolderSetEpic","assetsFolderSetRefreshEpic","assetsUnpickEpic","assetsUpdateEpic","updatedAsset","assetsUpdateImageReferencesEpic","documents","patchedCount","clonedDocument","parse","assetsToReplace","patchSet","assign","originalAsset","selectAssetsByIds","selectAssetsAllIds","selectAssetById","selectAssets","selectAssetsLength","selectAssetsPickedLength","assetsPicked","createSelector","createSlice","PayloadAction","ClientError","Patch","groq","nanoid","from","of","catchError","debounceTime","filter","map","mergeMap","switchMap","withLatestFrom","FOLDER_DOCUMENT_NAME","debugThrottle","FolderDoc","FolderTreeItem","FolderTreeNode","HttpError","MyEpic","buildExcludeTagsFragment","assetsActions","RootReducerState","UPLOADS_ACTIONS","FoldersReducerState","byId","Record","childrenByParentId","rootIds","exactCountByFolderId","unfiledCount","currentFolderId","currentFolderUnfiled","panelVisible","fetching","fetchCount","fetchingError","creating","creatingError","deletingId","deleteError","renaming","renameError","initialState","undefined","indexFolders","folders","forEach","folder","_id","parentKey","parentId","push","sortByName","ids","sort","a","b","name","localeCompare","numeric","sensitivity","Object","values","foldersSlice","reducers","createComplete","state","_action","createError","action","error","payload","createRequest","currentFolderClear","currentFolderSet","folderId","currentFolderShowUnfiled","deleteComplete","deletedIds","clearedCurrentFolder","removed","Set","has","deleteRequest","fetchComplete","length","fetchError","fetchRequest","panelVisibleSet","renameComplete","renameRequest","foldersFetchEpic","action$","state$","client","pipe","actions","match","debug","badConnection","assetTypes","assets","type","excludeTagsFragment","excludeTagSlugs","excludeTagsClause","observable","fetch","count","JSON","stringify","result","f","folderIds","Boolean","message","statusCode","foldersRefreshEpic","folderSetComplete","listenerCreateQueueComplete","listenerDeleteQueueComplete","listenerUpdateQueueComplete","updateComplete","uploadComplete","foldersCurrentFolderEpic","clear","pickClear","loadPageIndex","pageIndex","patchOperationAssetFolderUnset","patch","unset","patchOperationFolderParentSet","set","parent","_ref","_type","_weak","foldersCreateEpic","trim","siblingIds","collision","some","id","toLowerCase","newId","doc","create","foldersDeleteEpic","childFolderIds","tx","transaction","asset","childFolderId","delete","commit","foldersRenameEpic","selectById","selectChildrenByParentId","selectRootIds","selectExactCountByFolderId","selectCurrentFolderId","selectCurrentFolderUnfiled","buildFolderPath","segments","cursor","seen","add","unshift","join","selectFolderPathById","_state","selectFolderTree","buildNode","children","exactCount","totalCount","reduce","sum","child","path","selectCurrentFolderSegments","chain","depth","FoldersIndex","selectFoldersIndex","selectCurrentFolderChildren","split","stack","cur","pop","kids","selectCanDeleteFolder","foldersActions","reducer","createSlice","PayloadAction","pluralize","ofType","EMPTY","of","filter","mergeMap","AssetItem","Dialog","MyEpic","Tag","assetsActions","ASSETS_ACTIONS","foldersActions","tagsActions","DIALOG_ACTIONS","DialogReducerState","items","initialState","dialogSlice","name","extraReducers","builder","addCase","showFolderCreate","state","action","parentFolderId","payload","push","id","type","showFolderMove","assets","folderId","showFolderRename","showTagCreate","showTagEdit","tagId","createComplete","item","renameComplete","reducers","clear","inlineTagCreate","assetId","tag","forEach","lastCreatedTag","label","current","value","_id","inlineTagRemove","tagIds","lastRemovedTagIds","remove","showConfirmAssetsTagAdd","assetsPicked","closeDialogId","suffix","length","confirmCallbackAction","tagsAddRequest","confirmText","title","headerTitle","tone","showConfirmAssetsTagRemove","tagsRemoveRequest","showConfirmDeleteAssets","deleteRequest","map","assetItem","asset","description","showConfirmDeleteFolder","folderName","showConfirmDeleteTag","showAllAssetsDialog","some","showAssetEdit","showSearchFacets","showFolders","showTags","dialogClearOnAssetUpdateEpic","action$","pipe","deleteComplete","folderSetComplete","updateComplete","dialogId","actions","dialogTagCreateEpic","match","dialogTagDeleteEpic","listenerDeleteQueueComplete","dialogActions","reducer","createGlobalStyle","css","customScrollbar","GlobalStyle","PropsWithChildren","createContext","useContext","useMemo","DropzoneOptions","MediaToolOptions","Locale","ContextProps","dropzone","Pick","components","createTagsOnUpload","creditLine","directUploads","excludeTagSlugs","locales","ToolOptionsContext","Props","options","ToolOptionsProvider","children","value","creditLineExcludeSources","excludeSources","Array","isArray","maxSize","maximumUploadSize","details","enabled","excludeTags","length","useToolOptions","context","Error","z","localizedStringSchema","locales","id","length","string","trim","optional","shape","Record","ZodTypeAny","locale","object","passthrough","tagOptionSchema","label","min","message","value","getAssetFormSchema","altText","creditLine","description","opt","media","tags","array","nullable","originalFilename","title","assetFormSchema","tagFormSchema","name","folderFormSchema","SanityDocument","getUniqueDocuments","documents","draftIds","reduce","acc","doc","_id","startsWith","concat","slice","filteredDocuments","filter","includes","ImageAsset","imageDprUrl","asset","options","width","height","dpi","window","devicePixelRatio","Math","round","imgH","max","undefined","imgW","urlParams","URLSearchParams","append","toString","url","FormData","Record","sanitizeFormData","formData","Object","keys","reduce","acc","key","val","constructor","Array","length","trim","Asset","FileAsset","ImageAsset","isFileAsset","asset","_type","isImageAsset","zodResolver","FieldValues","Resolver","zodFormResolver","schema","TFieldValues","Parameters","ImageAsset","getAssetResolution","asset","metadata","dimensions","width","height","usePortal","PopoverProps","usePortalPopoverProps","$","_c","portal","t0","element","animate","constrainSize","floatingBoundary","referenceBoundary","ClipboardIcon","Button","Text","Popover","copy","useEffect","useRef","useState","usePortalPopoverProps","Props","disabled","url","ButtonAssetCopy","t0","$","_c","popoverProps","refPopoverTimeout","popoverVisible","setPopoverVisible","t1","current","clearTimeout","setTimeout","handleClick","t2","t3","Symbol","for","t4","t5","t6","DownloadIcon","Box","Button","Flex","Inline","Stack","Text","format","filesize","ReactNode","Asset","AssetItem","getAssetResolution","isImageAsset","ButtonAssetCopy","Props","asset","item","Row","t0","$","_c","label","value","t1","Symbol","for","opacity","width","t2","t3","textAlign","t4","t5","AssetMetadata","props","exif","metadata","originalFilename","url","window","location","href","handleDownload","size","base","round","mimeType","t6","extension","toUpperCase","t7","t8","t9","t10","DateTimeOriginal","FNumber","FocalLength","ExposureTime","ISO","background","height","Date","t11","updating","t12","t13","t14","t15","t16","Dialog","SanityDialog","ComponentProps","props","$","_c","t0","Symbol","for","position","t1","SanityDocument","Box","Button","Card","Stack","Text","Preview","SchemaType","useSchema","useIntentLink","Props","documents","isLoading","DocumentList","t0","$","_c","schema","t1","Symbol","for","length","map","doc","_id","get","_type","t2","ReferringDocument","props","schemaType","intent","params","id","onClick","width","Box","Flex","Theme","MouseEvent","defaultStyles","FileIcon","ReactFileIcon","DefaultExtensionType","styled","css","Props","extension","onClick","e","width","Container","theme","sanity","fonts","text","family","props","$","_c","t0","Symbol","for","height","t1","t2","t3","t4","Flex","Asset","FileIcon","Props","asset","FileAssetPreview","props","$","_c","mimeType","search","t0","Symbol","for","height","t1","width","t2","url","extension","Box","Button","Text","Tooltip","format","ReactNode","Props","disabled","isValid","lastUpdated","onClick","FormSubmitButton","props","$","_c","content","t0","Symbol","for","t1","Date","t2","maxWidth","t3","window","hues","ThemeColorSchemeKey","studioTheme","color","themeColor","SCHEME_COLORS","bg","dark","gray","hex","light","bg2","inputEnabledBorder","default","input","enabled","border","inputHoveredBorder","hovered","mutedHoveredBg","primary","muted","mutedHoveredFg","fg","mutedSelectedBg","selected","spotBlue","spot","blue","SchemeColorKey","getSchemeColor","scheme","colorKey","ThemeColorSchemeKey","MouseEvent","styled","css","getSchemeColor","Props","onClick","e","$showCheckerboard","$scheme","src","style","Image","img","attrs","crossOrigin","const","props","ErrorOutlineIcon","Box","Inline","Text","Tooltip","styled","Props","description","error","label","name","StyledErrorOutlineIcon","theme","color","sanity","spot","red","FormFieldInputLabel","props","$","_c","t0","t1","marginRight","t2","t3","t4","AddIcon","ChevronDownIcon","CloseIcon","Box","Card","Flex","rem","studioTheme","Text","ThemeColorSchemeKey","components","StylesConfig","Virtuoso","getSchemeColor","radius","themeRadius","space","themeSpace","reactSelectStyles","scheme","control","styles","isFocused","boxShadow","indicatorsContainer","isDisabled","opacity","input","color","fontFamily","fonts","text","family","marginLeft","menuList","multiValue","backgroundColor","borderRadius","multiValueLabel","fontSize","padding","multiValueRemove","noOptionsMessage","lineHeight","option","placeholder","valueContainer","margin","DropdownIndicator","props","$","_c","t0","Symbol","for","t1","Menu","children","MenuList","Array","isArray","height","length","index","item","t2","MultiValueLabel","MultiValueRemove","Option","data","__isNew__","marginRight","reactSelectComponents","IndicatorSeparator","Box","Controller","CreatableSelect","useColorSchemeValue","useTypedSelector","reactSelectComponents","reactSelectStyles","TagSelectOption","FormFieldInputLabel","Props","control","description","disabled","error","label","name","onCreateTag","tagName","options","value","placeholder","FormFieldInputTags","props","$","_c","scheme","creating","_temp","tagsFetching","_temp2","t0","Symbol","for","zIndex","t1","t2","t3","field","onBlur","onChange","controllerValue","_temp3","t4","state","tags","state_0","fetching","Box","TextInput","ChangeEventHandler","FocusEventHandler","Ref","FormFieldInputLabel","Props","description","disabled","error","label","name","onBlur","HTMLInputElement","onChange","placeholder","value","ref","FormFieldInputText","props","$","_c","rest","t0","t1","t2","Box","TextArea","ChangeEventHandler","FocusEventHandler","Ref","FormFieldInputLabel","Props","description","disabled","error","label","name","onBlur","HTMLTextAreaElement","onChange","placeholder","rows","value","ref","FormFieldInputTextarea","props","$","_c","rest","t0","t1","t2","FolderIcon","TrashIcon","Box","Button","Card","Flex","Stack","Tab","TabList","TabPanel","Text","useState","Control","FieldErrors","UseFormRegister","Asset","AssetFormData","Locale","TagSelectOption","FormFieldInputLabel","FormFieldInputTags","FormFieldInputText","FormFieldInputTextarea","LocalizedErrors","Record","message","toStringField","value","found","Object","values","find","v","undefined","truncateFolderPath","path","segments","split","filter","Boolean","length","slice","join","DetailsProps","formUpdating","handleCreateTag","title","control","errors","register","allTagOptions","assetTagOptions","currentAsset","folderPath","folderMissing","onChangeFolder","onRemoveFolder","creditLine","enabled","excludeSources","locales","Details","hasLocales","activeLocaleTab","setActiveLocaleTab","folderId","opt","media","folder","_ref","folderLabel","tags","minWidth","overflowX","whiteSpace","overflowY","originalFilename","map","locale","idx","id","const","altText","description","includes","name","MutationEvent","Box","Button","Card","Flex","Stack","Tab","TabList","TabPanel","Text","groq","ReactNode","useCallback","useEffect","useMemo","useRef","useState","SubmitHandler","useForm","useFormState","useDispatch","WithReferringDocuments","useColorSchemeValue","useDocumentStore","useToolOptions","getAssetFormSchema","useTypedSelector","useVersionedClient","assetsActions","selectAssetById","dialogActions","DIALOG_ACTIONS","selectFolderPathById","selectTags","selectTagSelectOptions","tagsActions","Asset","AssetFormData","DialogAssetEditProps","TagSelectOption","getTagSelectOptions","getUniqueDocuments","imageDprUrl","sanitizeFormData","isFileAsset","isImageAsset","zodFormResolver","AssetMetadata","Dialog","DocumentList","FileAssetPreview","FormSubmitButton","Image","Details","DetailsProps","renderDefaultDetails","props","Props","children","dialog","DialogAssetEdit","$","_c","t0","assetId","id","lastCreatedTag","lastRemovedTagIds","client","scheme","documentStore","dispatch","t1","state","String","assetItem","tags","assetUpdatedPrev","undefined","assetSnapshot","setAssetSnapshot","asset","tabSection","setTabSection","currentAsset","t2","allTagOptions","t3","assetTagOptions","currentFolderId","opt","media","folder","_ref","t4","state_0","currentFolderPath","creditLine","components","t5","locales","t6","details","CustomDetails","t7","imageDescription","raw","metadata","image","ImageDescription","length","makeLocaleObj","field","t8","fallback","obj","i","locale","altText","description","originalFilename","title","flattenField","_temp2","generateDefaultValues","t9","t10","t11","defaultValues","mode","resolver","control","getValues","handleSubmit","register","reset","setValue","t12","errors","isDirty","isValid","formUpdating","updating","t13","remove","handleClose","t14","showConfirmDeleteAssets","assets","closeDialogId","_id","handleDelete","t15","Symbol","for","update","result","transition","handleAssetUpdate","t16","tagName","createRequest","name","handleCreateTag","t17","showFolderMove","folderId","handleChangeFolder","t18","folderSetRequest","handleRemoveFolder","t19","bb0","isLocaleObj","_temp3","fields","_type","anyLocalized","some","f","configuredIds","Set","map","_temp4","f_0","Object","keys","k","has","hasOrphanedLocales","t20","cleanField","field_1","Array","isArray","obj_0","Record","sorted","sort","k_0","find","_temp5","configuredIds_0","_temp6","cleaned","key","val","entries","patch","set","commit","handleCleanupLocales","t21","formData","sanitizedFormData","updateRequest","_temp7","onSubmit","t22","subscriptionAsset","listen","subscribe","unsubscribe","t23","t24","t25","t26","existingTags","updatedTags","concat","shouldDirty","t27","t28","existingTags_0","updatedTags_0","filter","tag_0","includes","tag","value","t29","current","_updatedAt","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","footer","t40","t41","folderPath","folderMissing","onChangeFolder","onRemoveFolder","detailsProps","t42","t43","t44","t45","isLoading","referringDocuments","uniqueReferringDocuments","display","t46","aspectRatio","t47","t48","isOpaque","height","width","t49","t50","t51","t52","t53","_temp","v","field_0","fallback_0","values","v_0","l","v_1","l_0","_weak","createSelector","CardAssetData","CardFolderData","CardUploadData","selectCurrentFolderChildren","RootReducerState","selectCombinedItems","state","assets","allIds","uploads","assetIds","uploadIds","folderChildren","assetItems","map","id","type","folderItems","folder","folderId","name","path","totalCount","uploadItems","combinedItems","isHotkey","RefObject","useCallback","useEffect","useRef","useKeyPress","hotkey","onPress","$","_c","keyPressed","t0","e","current","downHandler","t1","Symbol","for","upHandler","t2","t3","window","addEventListener","removeEventListener","CheckmarkCircleIcon","EditIcon","WarningFilledIcon","Box","Checkbox","Container","Flex","Spinner","Text","Theme","ThemeColorSchemeKey","useToast","Tooltip","memo","MouseEvent","RefObject","useDispatch","useColorSchemeValue","styled","css","PANEL_HEIGHT","useAssetSourceActions","useKeyPress","useTypedSelector","assetsActions","selectAssetById","selectAssetsPicked","dialogActions","getSchemeColor","imageDprUrl","isFileAsset","isImageAsset","FileIcon","Image","Props","id","selected","source","CardWrapper","CardContainer","$picked","theme","$updating","sanity","color","spot","orange","ContextActionContainer","$scheme","StyledWarningOutlineIcon","red","CardAsset","props","$","_c","scheme","toast","shiftPressed","dispatch","lastPicked","_temp","assetsPicked","t0","state_0","state","item","t1","state_1","dialog","items","find","_temp2","type","assetId","undefined","dialogReplaceAssetId","asset","error","isOpaque","metadata","picked","updating","assetToReplaceId","length","_id","t2","state_2","assetToReplace","isMultiSelect","onSelect","t3","updateImageReferences","push","status","title","clear","handleReplaceAsset","t4","e","stopPropagation","kind","value","current","pickRange","startId","endId","pick","showAssetEdit","handleAssetClick","t5","e_0","handleContextActionClick","opacityContainer","opacityPreview","t6","t7","cursor","position","t8","t9","height","opacity","t10","extension","t11","width","draggable","transition","t12","t13","left","top","t14","t15","t16","t17","flexShrink","pointerEvents","transform","t18","originalFilename","t19","t20","right","t21","assets","d","Box","Card","Flex","Stack","Text","useDispatch","useColorSchemeValue","css","styled","foldersActions","getSchemeColor","Props","folderId","name","totalCount","CardWrapper","FolderCard","FolderGlyph","theme","sanity","color","spot","yellow","CardFolder","t0","$","_c","dispatch","scheme","t1","currentFolderSet","t2","t3","background","border","t4","Symbol","for","t5","lineHeight","minHeight","wordBreak","t6","t7","t8","t9","t10","t11","Observable","from","of","mergeMap","PREVIEW_WIDTH","createBlob","img","HTMLImageElement","Promise","Blob","resolve","imageAspect","width","height","canvas","HTMLCanvasElement","document","createElement","Math","max","ctx","getContext","drawImage","toBlob","err","console","warn","createImageEl","file","File","blobUrlLarge","window","URL","createObjectURL","Image","onload","revokeObjectURL","src","generatePreviewBlobUrl","imageEl","blob","Error","generatePreviewBlobUrl$","pipe","Subject","Subscription","Observable","from","first","mergeMap","DEFAULT_CONCURRENCY","remove","array","Array","T","item","index","indexOf","splice","createThrottler","concurrency","currentSubscriptions","pendingObservables","ready$","request","observable","observer","length","scheduleAndWait$","pipe","subscribe","subscription","push","unsubscribe","next","shift","asObservable","obs","withMaxConcurrency","func","args","throttler","SanityAssetDocument","SanityClient","SanityImageAssetDocument","Observable","of","throwError","map","mergeMap","HttpError","withMaxConcurrency","fetchExisting$","client","type","hash","observable","fetch","documentType","readFile$","file","File","ArrayBuffer","subscriber","reader","FileReader","onload","next","result","complete","onerror","err","error","readAsArrayBuffer","abort","hexFromBuffer","buffer","Array","prototype","call","Uint8Array","x","toString","slice","join","hashFile$","window","crypto","subtle","message","statusCode","pipe","arrayBuffer","digest","uploadSanityAsset$","assetType","existingAsset","assets","upload","extract","preserveFilename","event","asset","body","document","id","_id","uploadAsset$","createSelector","createSlice","PayloadAction","ClientError","SanityAssetDocument","SanityImageAssetDocument","groq","EMPTY","from","merge","of","catchError","delay","filter","mergeMap","takeUntil","withLatestFrom","HttpError","MyEpic","SanityUploadProgressEvent","UploadItem","constructFilter","generatePreviewBlobUrl$","hashFile$","uploadAsset$","assetsActions","RootReducerState","UPLOADS_ACTIONS","UploadsReducerState","allIds","byIds","Record","initialState","uploadsSlice","name","extraReducers","builder","addCase","uploadComplete","state","action","asset","payload","sha1hash","status","reducers","checkRequest","_state","_action","assets","checkComplete","results","assetHashes","Object","keys","forEach","hash","deleteIndex","indexOf","splice","blobUrl","objectUrl","window","URL","revokeObjectURL","previewReady","uploadCancel","uploadError","error","uploadRequest","file","File","forceAsAssetType","uploadProgress","event","uploadHash","percent","uploadStart","uploadItem","includes","push","uploadsAssetStartEpic","action$","_state$","client","pipe","uploadsActions","match","url","assetType","v","type","folderId","patch","_id","setIfMissing","opt","set","_ref","_type","_weak","commit","stage","message","statusCode","uploadsAssetUploadEpic","state$","exists","uploads","folders","currentFolderId","size","uploadsCompleteQueueEpic","uploadsCheckRequestEpic","documentIds","map","constructedFilter","assetTypes","excludeTagSlugs","searchFacets","search","facets","searchQuery","query","observable","fetch","resultHashes","checkedResults","reduce","acc","insertUploads","selectUploadById","uploadId","actions","reducer","CloseIcon","Box","Button","Flex","Text","filesize","useDispatch","useColorSchemeValue","styled","PANEL_HEIGHT","useTypedSelector","selectUploadById","uploadsActions","getSchemeColor","FileIcon","Image","Props","id","CardWrapper","CardUpload","props","$","_c","scheme","dispatch","t0","state","item","t1","size","base","round","fileSize","percentLoaded","Math","percent","isComplete","status","isUploading","isQueued","t2","hash","uploadCancel","handleCancelUpload","t3","t4","background","border","height","position","t5","t6","bottom","left","width","transform","transformOrigin","transition","t7","Symbol","for","t8","assetType","objectUrl","opacity","t9","t10","top","boxShadow","t11","t12","t13","name","t14","flexShrink","t15","t16","t17","memo","VirtuosoGrid","styled","useTypedSelector","CardAssetData","CardFolderData","CardUploadData","CardAsset","CardFolder","CardUpload","Props","items","onLoadMore","source","CARD_HEIGHT","CARD_WIDTH","VirtualCell","t0","$","_c","item","selected","type","t1","id","folderId","name","totalCount","StyledItemContainer","div","ItemContainer","props","ref","rest","context","StyledListContainer","ListContainer","AssetGridVirtualized","selectedAssets","_temp","map","_temp2","selectedIds","length","index","t2","Symbol","for","Item","List","t3","index_0","item_0","includes","t4","overflowX","overflowY","t5","state","assets","asset","_id","Box","Text","useEffect","useRef","useState","useDispatch","useStore","useTypedSelector","assetsActions","foldersActions","searchActions","selectCombinedItems","RootReducerState","SearchFacetInputProps","WithId","isImageAsset","AssetGridVirtualized","omitFacetId","facet","id","_id","withoutId","ReplaceAssetsOverview","$","_c","dispatch","store","combinedItems","assetsById","_temp","fetchCount","_temp2","fetching","_temp3","fetchingError","_temp4","pageSize","_temp5","searchQuery","_temp6","searchFacets","_temp7","currentFolderId","_temp8","currentFolderUnfiled","_temp9","assetToReplaceId","_temp1","savedBrowserStateRef","t0","length","Boolean","awaitingRefetch","setAwaitingRefetch","t1","t2","dialog","dialog_0","folders","search","getState","query","facets","dialogItem","items","find","_temp10","current","assetId","type","undefined","folderId","folderUnfiled","querySet","facetsClear","currentFolderClear","saved","hadScope","facetsAdd","currentFolderSet","currentFolderShowUnfiled","pick","picked","t3","t4","previousIds","assets","allIds","awaitingSettle","subscribe","isFetching","listCleared","scopeActive","t5","t6","item_1","item","asset","filter","reducedItems","hasFetchedOnce","hasMorePages","isEmpty","t7","loadNextPage","t8","handleLoadMoreItems","t9","state","byIds","state_0","state_1","state_2","state_3","state_4","state_5","state_6","state_7","_temp0","state_8","item_0","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogAllAssetsProps","Dialog","ReplaceAssetsOverview","Props","children","dialog","DialogAllAssets","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","height","t3","WarningOutlineIcon","Box","Button","Flex","Stack","Text","ReactNode","useDispatch","dialogActions","DialogConfirmProps","Dialog","Props","children","dialog","DialogConfirm","props","$","_c","dispatch","t0","id","remove","handleClose","t1","closeDialogId","confirmCallbackAction","handleConfirm","t2","confirmText","tone","Footer","t3","headerTitle","Header","t4","t5","t6","title","t7","description","t8","t9","Box","Flex","Text","ReactNode","useEffect","SubmitHandler","useForm","useDispatch","folderFormSchema","useTypedSelector","dialogActions","foldersActions","selectFolderPathById","DialogFolderCreateProps","FolderFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogFolderCreate","props","$","_c","t0","parentFolderId","id","dispatch","creating","_temp","creatingError","_temp2","t1","state_1","state","parentPath","t2","Symbol","for","name","t3","defaultValues","mode","resolver","formState","t4","handleSubmit","register","setError","errors","isDirty","isValid","t5","clear","handleClose","t6","formData","sanitizedFormData","createRequest","parentId","onSubmit","t7","t8","message","t9","Footer","t10","t11","t12","display","t13","t14","t15","t16","t17","t18","folders","state_0","Box","Button","Flex","Inline","Stack","Text","Tree","TreeItem","pluralize","ReactNode","useMemo","useState","useDispatch","useTypedSelector","assetsActions","dialogActions","selectFolderTree","DialogFolderMoveProps","FolderTreeNode","Dialog","getExpandedIdSet","folderId","byId","Record","parentId","expanded","Set","cursor","node","add","Props","children","dialog","FolderNodeProps","expandedIds","onSelect","selectedId","FolderNode","t0","$","_c","hasChildren","length","selected","id","t1","has","t2","t3","name","totalCount","t4","t5","map","childNode","t6","FolderTreeProps","folderTree","FolderTree","DialogFolderMove","dispatch","_temp","assets","setSelectedId","selectedFolder","remove","handleClose","folderSetRequest","closeDialogId","handleMove","t7","t8","t9","t10","t11","t12","t13","t14","t15","Symbol","for","maxHeight","overflowY","t16","t17","t18","t19","t20","t21","state","folders","Box","Flex","Text","ReactNode","useEffect","SubmitHandler","useForm","useDispatch","folderFormSchema","useTypedSelector","dialogActions","foldersActions","selectFolderPathById","DialogFolderRenameProps","FolderFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogFolderRename","t0","$","_c","folderId","id","dispatch","renaming","_temp","renameError","_temp2","t1","state_1","state","folders","byId","folder","t2","state_2","folderPath","currentName","name","t3","includes","slice","lastIndexOf","parentPath","t4","t5","Symbol","for","t6","defaultValues","mode","resolver","formState","t7","handleSubmit","register","setError","errors","isDirty","isValid","t8","remove","handleClose","t9","formData","sanitizedFormData","renameRequest","onSubmit","t10","t11","message","t12","t13","t14","t15","t16","display","t17","t18","t19","t20","t21","t22","t23","state_0","AddIcon","EditIcon","FolderIcon","TrashIcon","Box","Button","Container","Flex","Inline","Label","Text","Tree","TreeItem","Tooltip","ReactNode","useMemo","useDispatch","PANEL_HEIGHT","useTypedSelector","dialogActions","DIALOG_ACTIONS","foldersActions","selectCanDeleteFolder","selectFolderTree","FolderTreeNode","getExpandedIdSet","folderId","byId","Record","parentId","expanded","Set","cursor","node","add","FolderNodeProps","currentFolderId","expandedIds","onSelect","FolderHeaderActionProps","disabled","icon","onClick","tone","tooltip","FolderHeaderAction","t0","$","_c","t1","t2","undefined","t3","t4","t5","window","FolderItemTextProps","name","totalCount","FolderItemText","Symbol","for","boxSizing","display","maxWidth","minWidth","overflow","paddingRight","position","width","alignItems","paddingLeft","gap","flexShrink","lineHeight","textOverflow","whiteSpace","t6","fontSize","opacity","right","top","transform","t7","t8","FolderNode","hasChildren","children","length","selected","id","has","map","childNode","FolderView","dispatch","_temp","_temp2","canDeleteFolder","fetching","_temp3","folderTree","currentFolder","Array","from","join","treeKey","hasFolders","currentFolderSet","handleFolderSelect","showConfirmDeleteFolder","folderName","handleFolderDelete","borderBottom","height","showFolderRename","t9","t10","showFolderCreate","parentFolderId","t11","t12","t13","t14","currentFolderClear","t15","t16","t17","t18","t19","t20","t21","t22","state","folders","state_0","state_1","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogFoldersProps","Dialog","FolderView","Props","children","dialog","DialogFolders","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","height","minHeight","t3","CloseIcon","Box","Flex","Label","rem","Text","ThemeColorSchemeKey","ReactNode","useDispatch","useColorSchemeValue","styled","css","searchActions","SearchFacetInputProps","WithId","getSchemeColor","Props","children","facet","Container","$scheme","theme","sanity","radius","SearchFacet","props","$","_c","scheme","dispatch","t0","id","facetsRemoveById","facetId","handleClose","t1","Symbol","for","t2","t3","t4","t5","t6","whiteSpace","t7","title","t8","t9","t10","t11","TextInput","ChangeEvent","Props","onValueChange","value","TextInputNumber","props","$","_c","remainingProps","t0","t1","t2","e","val","target","regex","test","parseInt","handleChange","SelectIcon","Box","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","operators","usePortalPopoverProps","searchActions","SearchFacetInputNumberModifier","SearchFacetInputNumberProps","SearchFacetOperatorType","WithId","SearchFacet","TextInputNumber","Props","facet","SearchFacetNumber","t0","$","_c","dispatch","popoverProps","modifiers","t1","modifier","find","name","selectedModifier","t2","id","operatorType","facetsUpdateById","handleOperatorItemClick","t3","modifier_0","handleModifierClick","t4","value","handleValueChange","selectedOperatorType","t5","operatorTypes","label","map","operatorType_0","index","selected","t6","Symbol","for","maxWidth","t7","t8","t9","title","modifier_1","selected_0","t10","SelectIcon","Box","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","operators","usePortalPopoverProps","searchActions","SearchFacetInputSelectListItemProps","SearchFacetInputSelectProps","SearchFacetOperatorType","WithId","SearchFacet","Props","facet","SearchFacetSelect","t0","$","_c","dispatch","popoverProps","options","t1","value","find","v","name","selectedItem","t2","option","facetsUpdate","handleListItemClick","t3","operatorType","handleOperatorItemClick","selectedOperatorType","t4","operatorTypes","label","map","operatorType_0","index","selected","t5","title","t6","t7","item","selected_0","t8","t9","t10","SelectIcon","Box","Button","TextInput","Menu","MenuButton","MenuDivider","MenuItem","ChangeEvent","useDispatch","operators","usePortalPopoverProps","searchActions","SearchFacetInputStringProps","SearchFacetOperatorType","WithId","SearchFacet","Props","facet","SearchFacetString","t0","$","_c","dispatch","popoverProps","t1","id","operatorType","facetsUpdateById","handleOperatorItemClick","t2","e","value","target","handleChange","selectedOperatorType","t3","operatorTypes","label","map","operatorType_0","index","selected","t4","hideInput","maxWidth","t5","CloseIcon","Box","Card","rem","studioTheme","Text","ThemeColorSchemeKey","components","StylesConfig","Virtuoso","getSchemeColor","fonts","radius","themeRadius","space","themeSpace","themeTextSizes","text","sizes","reactSelectStyles","scheme","control","styles","isDisabled","isFocused","boxShadow","fontSize","input","color","fontFamily","family","marginLeft","menuList","padding","noOptionsMessage","lineHeight","option","backgroundColor","placeholder","paddingLeft","singleValue","alignItems","display","height","valueContainer","margin","ClearIndicator","props","$","_c","t0","Symbol","for","transform","t1","t2","Menu","children","MenuList","Array","isArray","length","index","item","NoOptionsMessage","Option","SingleValue","reactSelectComponents","DropdownIndicator","IndicatorSeparator","SelectIcon","Box","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","Select","useColorSchemeValue","operators","useToolOptions","usePortalPopoverProps","useTypedSelector","searchActions","selectTags","reactSelectComponents","reactSelectStyles","TagSelectOption","SearchFacetInputSearchableProps","SearchFacetOperatorType","WithId","getTagSelectOptions","SearchFacet","Props","facet","SearchFacetTags","t0","$","_c","scheme","dispatch","excludeTagSlugs","tagsAll","_temp","t1","length","filter","t","includes","tag","name","current","tags","tagsFetching","_temp2","t2","allTagOptions","popoverProps","t3","id","option","facetsUpdateById","value","handleChange","t4","operatorType","handleOperatorItemClick","selectedOperatorType","t5","operatorTypes","label","map","operatorType_0","index","selected","minWidth","t6","hideInput","width","_temp3","t7","state","state_0","fetching","Box","Flex","Inline","rem","Theme","styled","css","useTypedSelector","SearchFacetNumber","SearchFacetSelect","SearchFacetString","SearchFacetTags","Props","layout","StackContainer","theme","sanity","space","SearchFacets","props","$","_c","t0","undefined","searchFacets","_temp","t1","map","_temp2","Items","length","t2","Error","state","search","facets","facet","key","id","type","AddIcon","Button","Flex","Menu","MenuButton","MenuDivider","MenuGroup","MenuItem","useDispatch","FACETS","useToolOptions","usePortalPopoverProps","useTypedSelector","searchActions","SearchFacetDivider","SearchFacetGroup","SearchFacetInputProps","SearchFacetsControl","$","_c","dispatch","assetTypes","_temp","searchFacets","_temp2","selectedDocument","_temp3","popoverProps","creditLine","isTool","T0","T1","T2","t0","t1","t2","enabled","t3","facet","type","name","selectOnly","matchingAssetTypes","filter","assetType","includes","length","filteredFacets","_temp4","hasSearchFacets","renderMenuFacets","facets_0","t4","level","undefined","facets","map","facet_1","index_0","index","title","disabled","operatorTypes","find","v","facetsAdd","t5","placement","t6","facetsClear","t7","state","assets","state_0","search","state_1","selected","document","facet_0","previousFacet","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogSearchFacetsProps","Dialog","SearchFacets","SearchFacetsControl","Props","children","dialog","DialogSearchFacets","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","t3","Box","Flex","ReactNode","useEffect","SubmitHandler","useForm","useDispatch","tagFormSchema","useTypedSelector","dialogActions","tagsActions","DialogTagCreateProps","TagFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogTagCreate","props","$","_c","t0","id","dispatch","creating","_temp","creatingError","_temp2","t1","Symbol","for","name","t2","defaultValues","mode","resolver","formState","t3","handleSubmit","register","setError","errors","isDirty","isValid","formUpdating","t4","clear","handleClose","t5","formData","sanitizedFormData","createRequest","onSubmit","t6","t7","message","t8","Footer","t9","t10","t11","display","t12","t13","t14","t15","t16","state","tags","state_0","MutationEvent","Box","Button","Card","Flex","Text","groq","ReactNode","useCallback","useEffect","useState","SubmitHandler","useForm","useDispatch","tagFormSchema","useTypedSelector","useVersionedClient","dialogActions","selectTagById","tagsActions","DialogTagEditProps","Tag","TagFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogTagEdit","props","$","_c","t0","id","tagId","client","dispatch","t1","state","String","tagItem","tagSnapshot","setTagSnapshot","tag","currentTag","generateDefaultValues","_temp","t2","t3","t4","Symbol","for","t5","defaultValues","mode","resolver","formState","t6","handleSubmit","register","reset","setError","errors","isDirty","isValid","formUpdating","updating","t7","remove","handleClose","t8","formData","sanitizedFormData","updateRequest","closeDialogId","_id","name","_type","current","onSubmit","t9","showConfirmDeleteTag","handleDelete","t10","update","result","transition","handleTagUpdate","t11","error","message","t12","t13","t14","subscriptionAsset","listen","subscribe","unsubscribe","t15","t16","t17","_updatedAt","Footer","t18","t19","t20","t21","display","t22","t23","t24","t25","t26","ArrowDownIcon","ArrowUpIcon","CloseIcon","EditIcon","SearchIcon","TrashIcon","Box","Button","Container","Flex","Text","Tooltip","ReactNode","useDispatch","styled","inputs","PANEL_HEIGHT","useTypedSelector","selectAssetsPicked","dialogActions","DIALOG_ACTIONS","searchActions","selectIsSearchFacetTag","SearchFacetInputSearchableProps","TagActions","TagItem","Props","actions","tag","TagContainer","ButtonContainer","TagButtonProps","disabled","icon","onClick","tone","tooltip","TagButton","props","$","_c","t0","t1","t2","window","Tag","dispatch","assetsPicked","_id","state","isSearchFacetTag","facetsRemoveByTag","tagId","handleSearchFacetTagRemove","showConfirmAssetsTagAdd","handleShowAddTagToAssetsDialog","t3","showConfirmAssetsTagRemove","handleShowRemoveTagFromAssetsDialog","t4","showConfirmDeleteTag","handleShowTagDeleteDialog","t5","showTagEdit","handleShowTagEditDialog","t6","name","current","searchFacet","value","label","facetsUpdate","operatorType","facetsAdd","facet","handleSearchFacetTagAddOrUpdate","t7","updating","t8","opacity","userSelect","t9","t10","t11","Symbol","for","flexShrink","t12","includes","t13","t14","t15","t16","t17","t18","Flex","Label","memo","useState","Virtuoso","PANEL_HEIGHT","useTypedSelector","selectAssetsPicked","TagActions","TagItem","Tag","VirtualRow","t0","$","_c","isScrolling","item","t1","Symbol","for","height","t2","t3","undefined","actions","tag","_id","TagsVirtualized","tags","assetsPicked","setIsScrolling","items","pickedTagIds","reduce","_temp2","pickedTagIdsUnique","Set","acc_0","tagId","tagIsInEveryAsset","every","assetItem","tagIndex","asset","opt","media","findIndex","tag_0","_ref","acc","appliedToAll","push","appliedToSome","tagIdsSegmented","tagsAppliedToAll","filter","tag_1","includes","map","_temp3","tagsAppliedToSome","tag_2","_temp4","tagsUnused","tag_3","_temp5","length","_temp6","index","index_0","flex","overflowX","t4","_temp","val","assetTagIds","concat","tagItem","tagItem_0","tagItem_1","tagItem_2","ComposeIcon","Box","Button","Flex","Inline","Label","useDispatch","useColorSchemeValue","PANEL_HEIGHT","useTypedSelector","DIALOG_ACTIONS","getSchemeColor","Props","allowCreate","light","title","TagViewHeader","t0","$","_c","scheme","dispatch","tagsCreating","_temp","tagsFetching","_temp2","t1","showTagCreate","handleTagCreate","t2","t3","background","borderBottom","flexShrink","height","t4","t5","opacity","t6","t7","boxShadow","t8","state","tags","creating","state_0","fetching","Box","Flex","Text","useToolOptions","useTypedSelector","selectAssetsPickedLength","selectTags","TagsVirtualized","TagViewHeader","TagView","$","_c","numPickedAssets","excludeTagSlugs","tagsAll","t0","length","filter","t","includes","tag","name","current","tags","fetching","_temp","fetchCount","_temp2","fetchComplete","hasTags","hasPicked","t1","t2","t3","t4","t5","state","state_0","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogTagsProps","Dialog","TagView","Props","children","dialog","DialogTags","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","height","minHeight","t3","useTypedSelector","Dialog","DialogAssetEdit","DialogAllAssets","DialogConfirm","DialogFolderCreate","DialogFolderMove","DialogFolderRename","DialogFolders","DialogSearchFacets","DialogTagCreate","DialogTagEdit","DialogTags","Dialogs","$","_c","currentDialogs","_temp","t0","renderDialogs","dialogs","index","length","dialog","childDialogs","type","state","items","useToast","useEffect","useTypedSelector","Notifications","$","_c","items","_temp","toast","t0","t1","length","lastItem","push","closable","status","title","state","notifications","PayloadAction","createSlice","DebugReducerState","badConnection","enabled","initialState","debugSlice","name","reducers","setBadConnection","state","action","payload","toggleEnabled","debugActions","actions","reducer","PayloadAction","createSlice","UnknownAction","pluralize","ofType","of","bufferTime","filter","mergeMap","HttpError","ImageAsset","MyEpic","assetsActions","ASSETS_ACTIONS","foldersActions","tagsActions","uploadsActions","Notification","asset","status","title","NotificationsReducerState","items","messageFromGenericErrorPayload","payload","error","String","message","initialState","notificationsSlice","name","reducers","add","state","action","push","notificationsAssetsDeleteCompleteEpic","action$","pipe","deleteComplete","match","assetIds","deletedCount","length","actions","notificationsAssetsDeleteErrorEpic","deleteError","count","notificationsAssetsUploadCompleteEpic","checkComplete","results","Object","keys","notificationsAssetsTagsAddCompleteEpic","tagsAddComplete","assets","notificationsAssetsTagsRemoveCompleteEpic","tagsRemoveComplete","notificationsAssetsUpdateCompleteEpic","updateComplete","updatedCount","notificationsGenericErrorEpic","fetchError","type","updateError","createError","renameError","uploadError","notificationsTagCreateCompleteEpic","createComplete","notificationsTagDeleteCompleteEpic","notificationsTagUpdateCompleteEpic","notificationsFolderCreateCompleteEpic","notificationsFolderDeleteCompleteEpic","notificationsFolderRenameCompleteEpic","renameComplete","notificationsActions","reducer","createSlice","SanityAssetDocument","SanityDocument","SanityImageAssetDocument","SelectedReducerState","assets","document","documentAssetIds","initialState","undefined","selectedSlice","name","reducers","reducer","Reducer","StateFromReducersMapObject","combineReducers","combineEpics","assetsReducer","assetsDeleteEpic","assetsFetchAfterDeleteAllEpic","assetsFetchEpic","assetsFolderSetEpic","assetsFolderSetRefreshEpic","assetsFetchNextPageEpic","assetsFetchPageIndexEpic","assetsListenerCreateQueueEpic","assetsListenerDeleteQueueEpic","assetsListenerUpdateQueueEpic","assetsOrderSetEpic","assetsSearchEpic","assetsSortEpic","assetsTagsAddEpic","assetsTagsRemoveEpic","assetsUnpickEpic","assetsUpdateEpic","assetsUpdateImageReferencesEpic","debugReducer","dialogReducer","dialogClearOnAssetUpdateEpic","dialogTagCreateEpic","dialogTagDeleteEpic","foldersReducer","foldersCurrentFolderEpic","foldersCreateEpic","foldersDeleteEpic","foldersFetchEpic","foldersRefreshEpic","foldersRenameEpic","notificationsReducer","notificationsAssetsDeleteErrorEpic","notificationsAssetsDeleteCompleteEpic","notificationsAssetsTagsAddCompleteEpic","notificationsAssetsTagsRemoveCompleteEpic","notificationsAssetsUpdateCompleteEpic","notificationsFolderCreateCompleteEpic","notificationsFolderDeleteCompleteEpic","notificationsFolderRenameCompleteEpic","notificationsGenericErrorEpic","notificationsTagCreateCompleteEpic","notificationsTagDeleteCompleteEpic","notificationsTagUpdateCompleteEpic","searchReducer","searchFacetTagUpdateEpic","selectedReducer","tagsReducer","tagsCreateEpic","tagsDeleteEpic","tagsFetchEpic","tagsListenerCreateQueueEpic","tagsListenerDeleteQueueEpic","tagsListenerUpdateQueueEpic","tagsSortEpic","tagsUpdateEpic","uploadsReducer","uploadsAssetStartEpic","uploadsAssetUploadEpic","uploadsCheckRequestEpic","uploadsCompleteQueueEpic","rootEpic","reducers","assets","debug","dialog","folders","notifications","search","selected","tags","uploads","ReducersMapObject","rootReducer","SanityDocument","isPlainObject","value","Array","isArray","getAssetIds","node","Record","acc","forEach","v","_type","_ref","push","Object","values","val","getDocumentAssetIds","document","assetIds","Set","sort","SUPPORTED_ASSET_TYPES","AssetType","isSupportedAssetType","assetType","supported","includes","configureStore","Store","UnknownAction","SanityClient","ReactNode","useState","Provider","createEpicMiddleware","AssetSourceComponentProps","SanityDocument","rootEpic","rootReducer","initialState","assetsInitialState","RootReducerState","getDocumentAssetIds","isSupportedAssetType","Props","assetType","children","client","document","excludeTagSlugs","selectedAssets","createReduxStore","props","epicMiddleware","dependencies","store","reducer","middleware","getDefaultMiddleware","serializableCheck","thunk","prepend","devTools","preloadedState","assets","assetTypes","length","debug","badConnection","enabled","dialog","items","folders","byId","childrenByParentId","rootIds","exactCountByFolderId","unfiledCount","currentFolderId","currentFolderUnfiled","panelVisible","fetching","fetchCount","creating","renaming","notifications","search","facets","query","selected","documentAssetIds","tags","allIds","byIds","uploads","run","ReduxProvider","t0","$","_c","t1","t2","PortalProvider","useEffect","useRef","useDispatch","AssetSourceComponentProps","SanityDocument","useFormValue","AssetBrowserDispatchProvider","useRootPortalElement","useTypedSelector","useVersionedClient","assetsActions","dialogActions","foldersActions","tagsActions","GlobalStyle","constructFilter","Dialogs","Notifications","ReduxProvider","EditAssetDialog","t0","$","_c","assetId","onClose","dispatch","openDialogCount","_temp","hasOpenedRef","t1","t2","queryFilter","assetTypes","searchFacets","fetchRequest","params","showAssetEdit","t3","t4","current","t5","Symbol","for","EditAssetTool","props","selectedAssets","portalElement","currentDocument","client","_id","undefined","t6","t7","onSelect","t8","assetType","state","dialog","items","length","ThLargeIcon","ThListIcon","Button","Inline","useDispatch","useTypedSelector","assetsActions","ButtonViewGroup","$","_c","dispatch","view","_temp","t0","Symbol","for","whiteSpace","t1","t2","viewSet","t3","borderBottomRightRadius","borderTopRightRadius","t4","t5","t6","t7","borderBottomLeftRadius","borderTopLeftRadius","t8","t9","state","assets","SortIcon","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","getOrderTitle","ORDER_OPTIONS","usePortalPopoverProps","useTypedSelector","assetsActions","OrderSelect","$","_c","dispatch","order","_temp","popoverProps","t0","direction","field","t1","t2","map","item","index","selected","orderSet","minWidth","t3","t4","state","assets","Box","useNProgress","Props","loading","Progress","props","$","_c","t0","animationDuration","isAnimating","isFinished","progress","t1","t2","t3","opacity","transition","t4","t5","t6","height","background","position","left","top","width","t7","TagIcon","$","_c","t0","Symbol","for","CloseIcon","SearchIcon","Box","Flex","TextInput","ChangeEvent","useDispatch","useTypedSelector","searchActions","TextInputSearch","$","_c","searchQuery","_temp","dispatch","t0","e","querySet","currentTarget","value","handleChange","t1","handleClear","t2","Symbol","for","position","t3","t4","length","cursor","height","opacity","right","top","width","zIndex","t5","state","search","query","FolderIcon","Box","Button","Flex","Inline","useMediaIndex","useDispatch","useTypedSelector","dialogActions","foldersActions","tagsActions","ButtonViewGroup","OrderSelect","Progress","SearchFacets","SearchFacetsControl","TagIcon","TextInputSearch","Controls","$","_c","dispatch","fetching","_temp","foldersPanelVisible","_temp2","pageIndex","_temp3","searchFacets","_temp4","tagsPanelVisible","_temp5","mediaIndex","t0","showSearchFacets","handleShowSearchFacetDialog","t1","showFolders","handleShowFoldersDialog","t2","showTags","handleShowTagsDialog","t3","panelVisibleSet","panelVisible","toggleFoldersPanel","t4","toggleTagsPanelToggle","t5","Symbol","for","borderBottom","zIndex","t6","t7","t8","alignItems","flex","height","justifyContent","position","width","t9","minWidth","t10","t11","t12","t13","t14","whiteSpace","t15","length","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","transform","t31","t32","t33","t34","t35","t36","state","assets","state_0","folders","state_1","state_2","search","facets","state_3","tags","PlugIcon","Box","Flex","Switch","Text","Tooltip","ChangeEvent","useDispatch","useKeyPress","useTypedSelector","debugActions","DebugControls","$","_c","dispatch","badConnection","_temp","debugEnabled","_temp2","t0","e","checked","target","setBadConnection","handleChange","t1","toggleEnabled","handleToggleControls","t2","Symbol","for","bottom","left","pointerEvents","position","width","t3","t4","t5","t6","t7","t8","t9","state","debug","state_0","enabled","Box","Button","Inline","Text","useDispatch","useTypedSelector","foldersActions","selectCurrentFolderSegments","FolderBreadcrumbs","$","_c","dispatch","currentFolderId","_temp","segments","t0","Symbol","for","t1","currentFolderClear","t2","t3","segment","id","currentFolderSet","folderId","name","map","state","folders","Box","FOLDERS_PANEL_WIDTH","useTypedSelector","FolderView","FolderPanel","$","_c","foldersPanelVisible","_temp","t0","Symbol","for","position","width","t1","borderRight","height","left","overflowX","overflowY","top","state","folders","panelVisible","ReactNode","createContext","useContext","useMemo","ContextProps","open","Props","children","DropzoneDispatchContext","undefined","DropzoneDispatchProvider","props","$","_c","t0","contextValue","t1","useDropzoneActions","context","Error","ArrowRightIcon","CloseIcon","UploadIcon","Box","Button","Flex","Inline","Text","pluralize","useAssetSourceActions","useDropzoneActions","useToolOptions","useTypedSelector","Props","onClose","Header","props","$","_c","open","onSelect","assetTypes","_temp","selectedDocument","_temp2","directUploads","t0","Symbol","for","whiteSpace","t1","join","t2","t3","margin","textTransform","_type","t4","t5","length","t6","flexShrink","t7","t8","state","assets","state_0","selected","document","ChevronDownIcon","ChevronUpIcon","Box","Label","useDispatch","useTypedSelector","assetsActions","Props","field","title","TableHeaderItem","props","$","_c","dispatch","order","_temp","isActive","t0","direction","orderSet","handleClick","t1","t2","undefined","t3","t4","cursor","display","whiteSpace","t5","Symbol","for","marginRight","t6","t7","t8","t9","t10","state","assets","Checkbox","Flex","Grid","useMediaIndex","ThemeColorSchemeKey","MouseEvent","useDispatch","useColorSchemeValue","styled","css","GRID_TEMPLATE_COLUMNS","PANEL_HEIGHT","useAssetSourceActions","useTypedSelector","assetsActions","selectAssetsLength","selectAssetsPickedLength","getSchemeColor","TableHeaderItem","ContextActionContainer","$scheme","TableHeader","$","_c","scheme","dispatch","fetching","_temp","itemsLength","numPickedAssets","mediaIndex","onSelect","allSelected","t0","e","stopPropagation","pickClear","pickAll","handleContextActionClick","t1","t2","t3","t4","alignItems","background","borderBottom","columnGap","gridTemplateColumns","LARGE","height","letterSpacing","position","textTransform","top","visibility","width","zIndex","t5","pointerEvents","transform","t10","t11","t12","t13","t6","t7","t8","t9","Symbol","for","t14","state","assets","CheckmarkCircleIcon","EditIcon","WarningFilledIcon","Box","Checkbox","Container","Flex","Grid","Spinner","Text","ThemeColorSchemeKey","useMediaIndex","Tooltip","formatRelative","filesize","memo","MouseEvent","RefObject","useCallback","useEffect","useRef","useState","useDispatch","WithReferringDocuments","useColorSchemeValue","styled","css","GRID_TEMPLATE_COLUMNS","useAssetSourceActions","useKeyPress","useTypedSelector","assetsActions","selectAssetById","dialogActions","getAssetResolution","getSchemeColor","getUniqueDocuments","imageDprUrl","isFileAsset","isImageAsset","FileIcon","Image","REFERENCE_COUNT_VISIBILITY_DELAY","Props","id","selected","ContainerGrid","$selected","$scheme","$updating","ContextActionContainer","StyledWarningIcon","theme","color","sanity","spot","red","TableRowAsset","props","$","_c","scheme","shiftPressed","referenceCountVisible","setReferenceCountVisible","refCountVisibleTimeout","dispatch","lastPicked","_temp","t0","state_0","state","item","mediaIndex","asset","error","isOpaque","metadata","picked","updating","isMultiSelect","onSelect","t1","e","stopPropagation","showAssetEdit","assetId","_id","current","pickRange","startId","endId","pick","handleContextActionClick","t2","e_0","kind","value","handleClick","opacityCell","opacityPreview","t3","t4","Symbol","for","setTimeout","clearTimeout","t5","undefined","t6","t7","SMALL","LARGE","t8","t9","columnGap","rowGap","gridTemplateColumns","gridTemplateRows","t10","t11","alignItems","gridColumn","gridRowStart","gridRowEnd","height","justifyContent","opacity","position","t12","flexShrink","pointerEvents","transform","t13","t14","width","t15","t16","t17","extension","t18","t19","t20","left","top","t21","t22","t23","t24","t25","gridRow","t26","lineHeight","t27","originalFilename","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","display","t39","t40","mimeType","t41","t42","t43","t44","t45","size","base","round","t46","t47","t48","t49","t50","t51","t52","t53","_updatedAt","Date","t54","t55","t56","t57","t58","t59","_temp2","t60","t61","t62","t63","t64","t65","t66","assets","isLoading","referringDocuments","uniqueDocuments","Array","isArray","length","Box","Flex","Grid","Stack","Text","useMediaIndex","useDispatch","useColorSchemeValue","css","styled","GRID_TEMPLATE_COLUMNS","foldersActions","getSchemeColor","Props","folderId","name","totalCount","ContainerGrid","theme","sanity","color","card","enabled","bg","FolderBadge","spot","yellow","TableRowFolder","t0","$","_c","dispatch","mediaIndex","scheme","t1","currentFolderSet","t2","t3","t4","SMALL","LARGE","t5","t6","background","gridColumnGap","gridTemplateColumns","gridTemplateRows","t7","Symbol","for","t8","gridColumn","height","width","t9","t10","t11","t12","gridRow","t13","lineHeight","t14","t15","t16","t17","t18","t19","display","t20","t21","t22","t23","t24","t25","t26","t27","t28","CloseIcon","Box","Button","Flex","Grid","Stack","Text","useMediaIndex","filesize","useDispatch","useColorSchemeValue","GRID_TEMPLATE_COLUMNS","useTypedSelector","selectUploadById","uploadsActions","getSchemeColor","FileIcon","Image","Props","id","TableRowUpload","props","$","_c","scheme","dispatch","t0","state","item","mediaIndex","t1","size","base","round","fileSize","percentLoaded","Math","percent","isComplete","status","isUploading","isQueued","t2","hash","uploadCancel","handleCancelUpload","t3","t4","t5","SMALL","LARGE","t6","t7","alignItems","background","columnGap","rowGap","gridTemplateColumns","gridTemplateRows","height","position","t8","t9","bottom","left","width","transform","transformOrigin","transition","t10","t11","t12","gridColumn","gridRowStart","gridRowEnd","t13","Symbol","for","t14","assetType","objectUrl","opacity","t15","t16","top","boxShadow","t17","t18","t19","t20","t21","t22","gridRow","marginLeft","t23","name","t24","t25","t26","t27","Box","memo","GroupedVirtuoso","useTypedSelector","CardAssetData","CardFolderData","CardUploadData","TableHeader","TableRowAsset","TableRowFolder","TableRowUpload","Props","items","onLoadMore","VirtualRow","t0","$","_c","item","selected","type","t1","Symbol","for","height","t2","id","folderId","name","totalCount","AssetTableVirtualized","props","selectedAssets","_temp","map","_temp2","selectedIds","length","index","Array","fill","t3","index_0","item_0","includes","t4","overflowX","t5","_temp3","state","assets","asset","_id","Box","Text","useMediaIndex","useEffect","useDispatch","useTypedSelector","assetsActions","foldersActions","selectCombinedItems","tagsActions","AssetGridVirtualized","AssetTableVirtualized","Items","$","_c","dispatch","fetchCount","_temp","fetching","_temp2","foldersPanelVisible","_temp3","tagsPanelVisible","_temp4","view","_temp5","combinedItems","mediaIndex","hasFetchedOnce","hasItems","length","t0","loadNextPage","handleLoadMoreItems","t1","t2","panelVisibleSet","panelVisible","isEmpty","t3","Symbol","for","width","t4","state","assets","state_0","state_1","folders","state_2","tags","state_3","Box","Button","Flex","Label","pluralize","useDispatch","useColorSchemeValue","PANEL_HEIGHT","useAssetSourceActions","useTypedSelector","assetsActions","selectAssetsPicked","dialogActions","DIALOG_ACTIONS","getSchemeColor","isImageAsset","PickedBar","$","_c","scheme","dispatch","assetsPicked","currentFolderId","_temp","isMultiSelect","onSelect","t0","length","asset","canReplace","t1","pickClear","handlePickClear","t2","showConfirmDeleteAssets","assets","handleDeletePicked","t3","_id","assetId","showAllAssetsDialog","handleReplaceImages","t4","showFolderMove","folderId","handleMovePicked","t5","folderSetRequest","handleRemovePickedFromFolder","t6","pickedAssetIds","map","_temp2","handleInsertPicked","t7","t8","background","borderBottom","height","position","width","t9","Symbol","for","color","t10","t11","t12","t13","boxShadow","t14","t15","t16","t17","t18","t19","t20","state","folders","item","kind","const","value","Box","TAGS_PANEL_WIDTH","useTypedSelector","TagView","TagsPanel","$","_c","tagsPanelVisible","_temp","t0","Symbol","for","position","width","t1","borderLeft","height","overflowX","overflowY","right","top","state","tags","panelVisible","white","Flex","Text","ReactNode","DropEvent","DropzoneOptions","useDropzone","useDispatch","styled","useAssetSourceActions","DropzoneDispatchProvider","useToolOptions","useTypedSelector","notificationsActions","uploadsActions","Props","children","UploadContainer","div","DragActiveContainer","filterFiles","fileList","FileList","files","Array","from","filteredFiles","File","file","slice","arrayBuffer","push","UploadDropzone","props","$","_c","dropzone","t0","directUploads","maxSize","onSelect","dispatch","assetTypes","_temp","isImageAssetType","length","t1","acceptedFiles","forEach","uploadRequest","forceAsAssetType","undefined","handleDrop","t2","rejections","errorCodes","flatMap","_temp3","includes","add","status","title","handleDropRejected","t3","event","type","dataTransfer","target","HTMLInputElement","handleFileGetter","t4","t5","t6","t7","accept","getFilesFromEvent","noClick","noDrag","onDrop","onDropRejected","disabled","getRootProps","getInputProps","isDragActive","open","t8","t9","t10","t11","color","hex","t12","t13","state","assets","_temp2","code","errors","map","MutationEvent","SanityClient","groq","useEffect","useDispatch","useSelector","Dispatch","AssetSourceComponentProps","inputs","FOLDER_DOCUMENT_NAME","TAG_DOCUMENT_NAME","assetsActions","foldersActions","searchActions","tagsActions","RootReducerState","Asset","Tag","getMediaTagNames","schemaType","mediaTags","options","length","unique","Set","map","t","trim","filter","Boolean","Array","from","createAssetHandler","dispatch","update","documentId","result","transition","listenerCreateQueue","asset","listenerDeleteQueue","assetId","listenerUpdateQueue","createTagHandler","tag","tagId","useBrowserInit","client","tagsByIds","state","tags","byIds","tagsFetchCount","fetchCount","tagNames","hasMediaTags","facetsClear","fetchRequest","assetSubscription","listen","subscribe","tagSubscription","folderSubscription","unsubscribe","tagFacetInput","type","resolvedTags","name","Object","values","find","item","current","NonNullable","tagItem","facetsAdd","facet","operatorType","value","label","_id","Card","Flex","PortalProvider","useState","AssetSourceComponentProps","SanityDocument","AssetBrowserDispatchProvider","useToolOptions","useVersionedClient","GlobalStyle","Controls","DebugControls","Dialogs","FolderBreadcrumbs","FolderPanel","Header","Items","Notifications","PickedBar","ReduxProvider","TagsPanel","UploadDropzone","useBrowserInit","Props","assetType","document","isMultiSelect","onClose","onSelect","selectedAssets","schemaType","BrowserContent","t0","$","_c","client","portalElement","setPortalElement","t1","t2","Symbol","for","t3","t4","t5","t6","t7","t8","position","t9","t10","Browser","props","excludeTagSlugs","Box","Portal","PortalProvider","useLayer","SyntheticEvent","AssetSourceComponentProps","SanityDocument","useFormValue","useKeyPress","useRootPortalElement","Browser","FormBuilderTool","props","$","_c","onClose","portalElement","t0","Symbol","for","currentDocument","selectionType","schemaJsonType","schemaType","jsonType","isMultiSelect","handleStopPropagation","_temp","zIndex","t1","bottom","height","left","position","top","width","t2","t3","t4","event","nativeEvent","stopImmediatePropagation","stopPropagation","Flex","Browser","Tool","$","_c","t0","Symbol","for","FolderIcon","FOLDER_DOCUMENT_NAME","title","icon","name","type","fields","to","weak","preview","select","parentName","prepare","selection","media","subtitle","undefined","TagIcon","TAG_DOCUMENT_NAME","title","icon","name","type","fields","preview","select","prepare","selection","media","current","EditIcon","ImageIcon","AssetSource","Tool","SanityTool","definePlugin","EditAssetTool","FormBuilderTool","ToolOptionsProvider","mediaFolder","mediaTag","MediaToolOptions","plugin","icon","name","title","mediaAssetSource","component","editMediaAssetSource","tool","__internalApplicationType","media","options","studio","components","layout","props","renderDefault","form","file","assetSources","prev","image","schema","types","tools","SanityClient","groq","nanoid","TAG_DOCUMENT_NAME","Tag","ApplyMediaTagsOptions","client","assetId","mediaTags","createTagsOnUpload","pendingByAsset","Map","Promise","applyMediaTags","options","chain","get","resolve","then","doApplyMediaTags","cleanup","catch","finally","delete","set","length","resolvedTags","all","map","tagName","existingTag","fetch","newTag","create","_type","name","current","validTags","filter","tag","existing","tagIds","useCdn","existingIds","Set","tagReferences","has","_id","_key","_ref","const","_weak","patch","setIfMissing","opt","append","commit","useToast","useEffect","useRef","InputProps","useToolOptions","useVersionedClient","applyMediaTags","AssetValue","_type","asset","_ref","AutoTagInputProps","mediaTags","AutoTagInput","props","$","_c","renderDefault","schemaType","value","mediaTagsProp","toast","options","client","createTagsOnUpload","prevAssetRef","undefined","isInitialMount","currentAssetRef","t0","t1","current","previousRef","length","assetId","catch","err","console","error","label","push","closable","status","title","join","t2","t3","FieldDefinitionBase","FileDefinition","ImageDefinition","WidenInitialValue","WidenValidation","AutoTagInput","ImageMediaFieldConfig","Omit","name","mediaTags","options","FileMediaFieldConfig","ImageMediaFieldResult","components","input","FileMediaFieldResult","mediaField","config","rest","Record"],"sources":["../src/contexts/AssetSourceDispatchContext.tsx","../src/hooks/useRootPortalElement.ts","../src/hooks/useTypedSelector.ts","../src/hooks/useVersionedClient.ts","../src/config/orders.ts","../src/config/searchFacets.ts","../src/constants.ts","../src/operators/debugThrottle.ts","../src/utils/constructFilter.ts","../src/utils/ReplaceImages.ts","../src/operators/checkTagName.ts","../src/utils/getTagSelectOptions.ts","../src/modules/assets/actions.ts","../src/modules/dialog/actions.ts","../src/modules/tags/index.ts","../src/modules/search/index.ts","../src/modules/uploads/actions.ts","../src/modules/assets/index.ts","../src/modules/folders/index.ts","../src/modules/dialog/index.ts","../src/styled/GlobalStyles/index.tsx","../src/contexts/ToolOptionsContext.tsx","../src/formSchema/index.ts","../src/utils/getUniqueDocuments.ts","../src/utils/imageDprUrl.ts","../src/utils/sanitizeFormData.ts","../src/utils/typeGuards.ts","../src/utils/zodFormResolver.ts","../src/utils/getAssetResolution.ts","../src/hooks/usePortalPopoverProps.ts","../src/components/ButtonAssetCopy/index.tsx","../src/components/AssetMetadata/index.tsx","../src/components/Dialog/index.tsx","../src/components/DocumentList/index.tsx","../src/components/FileIcon/index.tsx","../src/components/FileAssetPreview/index.tsx","../src/components/FormSubmitButton/index.tsx","../src/utils/getSchemeColor.ts","../src/components/Image/index.tsx","../src/components/FormFieldInputLabel/index.tsx","../src/styled/react-select/creatable.tsx","../src/components/FormFieldInputTags/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/components/FormFieldInputTextarea/index.tsx","../src/components/DialogAssetEdit/Details.tsx","../src/components/DialogAssetEdit/index.tsx","../src/modules/selectors.ts","../src/hooks/useKeyPress.ts","../src/components/CardAsset/index.tsx","../src/components/CardFolder/index.tsx","../src/utils/generatePreviewBlobUrl.ts","../src/utils/withMaxConcurrency.ts","../src/utils/uploadSanityAsset.ts","../src/modules/uploads/index.ts","../src/components/CardUpload/index.tsx","../src/components/AssetGridVirtualized/index.tsx","../src/components/ReplaceAssetsOverView/index.tsx","../src/components/DialogAssetsOverView/index.tsx","../src/components/DialogConfirm/index.tsx","../src/components/DialogFolderCreate/index.tsx","../src/components/DialogFolderMove/index.tsx","../src/components/DialogFolderRename/index.tsx","../src/components/FolderView/index.tsx","../src/components/DialogFolders/index.tsx","../src/components/SearchFacet/index.tsx","../src/components/TextInputNumber/index.tsx","../src/components/SearchFacetNumber/index.tsx","../src/components/SearchFacetSelect/index.tsx","../src/components/SearchFacetString/index.tsx","../src/styled/react-select/single.tsx","../src/components/SearchFacetTags/index.tsx","../src/components/SearchFacets/index.tsx","../src/components/SearchFacetsControl/index.tsx","../src/components/DialogSearchFacets/index.tsx","../src/components/DialogTagCreate/index.tsx","../src/components/DialogTagEdit/index.tsx","../src/components/Tag/index.tsx","../src/components/TagsVirtualized/index.tsx","../src/components/TagViewHeader/index.tsx","../src/components/TagView/index.tsx","../src/components/DialogTags/index.tsx","../src/components/Dialogs/index.tsx","../src/components/Notifications/index.tsx","../src/modules/debug/index.ts","../src/modules/notifications/index.ts","../src/modules/selected/index.ts","../src/modules/index.ts","../src/utils/getDocumentAssetIds.ts","../src/utils/isSupportedAssetType.ts","../src/components/ReduxProvider/index.tsx","../src/components/EditAssetTool/index.tsx","../src/components/ButtonViewGroup/index.tsx","../src/components/OrderSelect/index.tsx","../src/components/Progress/index.tsx","../src/components/TagIcon/index.tsx","../src/components/TextInputSearch/index.tsx","../src/components/Controls/index.tsx","../src/components/DebugControls/index.tsx","../src/components/FolderBreadcrumbs/index.tsx","../src/components/FolderPanel/index.tsx","../src/contexts/DropzoneDispatchContext.tsx","../src/components/Header/index.tsx","../src/components/TableHeaderItem/index.tsx","../src/components/TableHeader/index.tsx","../src/components/TableRowAsset/index.tsx","../src/components/TableRowFolder/index.tsx","../src/components/TableRowUpload/index.tsx","../src/components/AssetTableVirtualized/index.tsx","../src/components/Items/index.tsx","../src/components/PickedBar/index.tsx","../src/components/TagsPanel/index.tsx","../src/components/UploadDropzone/index.tsx","../src/components/Browser/useBrowserInit.ts","../src/components/Browser/index.tsx","../src/components/FormBuilderTool/index.tsx","../src/components/Tool/index.tsx","../src/schemas/folder.ts","../src/schemas/tag.ts","../src/plugin.tsx","../src/utils/applyMediaTags.ts","../src/components/AutoTagInputWrapper/index.tsx","../src/utils/mediaField.ts"],"sourcesContent":["import {type ReactNode, createContext, useContext, useMemo} from 'react'\nimport type {AssetSourceComponentProps} from 'sanity'\n\ntype ContextProps = {\n isMultiSelect: boolean\n onSelect?: AssetSourceComponentProps['onSelect']\n}\n\ntype Props = {\n children: ReactNode\n isMultiSelect?: boolean\n onSelect?: AssetSourceComponentProps['onSelect']\n}\n\nconst AssetSourceDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const AssetBrowserDispatchProvider = (props: Props) => {\n const {children, isMultiSelect = false, onSelect} = props\n\n const contextValue: ContextProps = useMemo(\n () => ({\n isMultiSelect,\n onSelect,\n }),\n [isMultiSelect, onSelect],\n )\n\n return (\n <AssetSourceDispatchContext.Provider value={contextValue}>\n {children}\n </AssetSourceDispatchContext.Provider>\n )\n}\n\nexport const useAssetSourceActions = () => {\n const context = useContext(AssetSourceDispatchContext)\n if (context === undefined) {\n throw new Error('useAssetSourceActions must be used within an AssetSourceDispatchProvider')\n }\n return context\n}\n","import {useEffect, useState} from 'react'\n\n/**\n * Creates a detached `.media-portal` element appended to `document.body` for the\n * lifetime of the component, used as a portal target for the plugin's dialogs\n * and overlays. The element is removed on unmount.\n */\nconst useRootPortalElement = (): HTMLDivElement => {\n const [container] = useState(() => document.createElement('div'))\n\n useEffect(() => {\n container.classList.add('media-portal')\n document.body.appendChild(container)\n return () => {\n document.body.removeChild(container)\n }\n }, [container])\n\n return container\n}\n\nexport default useRootPortalElement\n","import {type TypedUseSelectorHook, useSelector} from 'react-redux'\n\nimport type {RootReducerState} from '../modules/types'\n\nconst useTypedSelector: TypedUseSelectorHook<RootReducerState> = useSelector\n\nexport default useTypedSelector\n","import type {SanityClient} from '@sanity/client'\nimport {useClient} from 'sanity'\n\nconst useVersionedClient = (): SanityClient => useClient({apiVersion: '2025-10-02'})\n\nexport default useVersionedClient\n","import type {OrderDirection} from '../types'\n\nconst ORDER_DICTIONARY: Record<string, {asc: string; desc: string}> = {\n _createdAt: {\n asc: 'Last created: Oldest first',\n desc: 'Last created: Newest first',\n },\n _updatedAt: {\n asc: 'Last updated: Oldest first',\n desc: 'Last updated: Newest first',\n },\n mimeType: {\n asc: 'MIME type: A to Z',\n desc: 'MIME type: Z to A',\n },\n originalFilename: {\n asc: 'File name: A to Z',\n desc: 'File name: Z to A',\n },\n size: {\n asc: 'File size: Smallest first',\n desc: 'File size: Largest first',\n },\n}\n\nexport const getOrderTitle = (field: string, direction: OrderDirection): string => {\n return ORDER_DICTIONARY[field]![direction]\n}\n","import groq from 'groq'\n\nimport type {\n SearchFacetDivider,\n SearchFacetInputProps,\n SearchFacetName,\n SearchFacetOperators,\n} from '../types'\n\nexport const divider: SearchFacetDivider = {type: 'divider'}\n\nexport const inputs: Record<SearchFacetName, SearchFacetInputProps> = {\n altText: {\n assetTypes: ['file', 'image'],\n field: 'altText',\n name: 'altText',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Alt text',\n type: 'string',\n value: '',\n },\n creditLine: {\n assetTypes: ['file', 'image'],\n field: 'creditLine',\n name: 'creditLine',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Credit',\n type: 'string',\n value: '',\n },\n description: {\n assetTypes: ['file', 'image'],\n field: 'description',\n name: 'description',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Description',\n type: 'string',\n value: '',\n },\n folder: {\n assetTypes: ['file', 'image'],\n field: 'opt.media.folder._ref',\n name: 'folder',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty'],\n title: 'Folder',\n type: 'string',\n value: '',\n },\n fileName: {\n assetTypes: ['file', 'image'],\n field: 'originalFilename',\n name: 'filename',\n operatorType: 'includes',\n operatorTypes: ['includes', 'doesNotInclude'],\n title: 'File name',\n type: 'string',\n value: '',\n },\n height: {\n assetTypes: ['image'],\n field: 'metadata.dimensions.height',\n name: 'height',\n operatorType: 'greaterThan',\n operatorTypes: [\n 'greaterThan',\n 'greaterThanOrEqualTo',\n 'lessThan',\n 'lessThanOrEqualTo',\n null,\n 'equalTo',\n ],\n title: 'Height',\n type: 'number',\n value: 400,\n },\n inCurrentDocument: {\n assetTypes: ['file', 'image'],\n name: 'inCurrentDocument',\n operatorType: 'is',\n options: [\n {\n name: 'true',\n title: 'True',\n value: groq`_id in $documentAssetIds`,\n },\n {\n name: 'false',\n title: 'False',\n value: groq`!(_id in $documentAssetIds)`,\n },\n ],\n selectOnly: true,\n title: 'In use in current document',\n type: 'select',\n value: 'true',\n },\n inUse: {\n assetTypes: ['file', 'image'],\n name: 'inUse',\n operatorType: 'is',\n options: [\n {\n name: 'true',\n title: 'True',\n value: groq`count(*[references(^._id)]) > 0`,\n },\n {\n name: 'false',\n title: 'False',\n value: groq`count(*[references(^._id)]) == 0`,\n },\n ],\n title: 'In use',\n type: 'select',\n value: 'true',\n },\n isOpaque: {\n assetTypes: ['image'],\n field: 'metadata.isOpaque',\n name: 'isOpaque',\n operatorType: 'equalTo',\n options: [\n {\n name: 'true',\n title: 'True',\n value: `false`,\n },\n {\n name: 'false',\n title: 'False',\n value: `true`,\n },\n ],\n title: 'Has transparency',\n type: 'select',\n value: 'true',\n },\n orientation: {\n assetTypes: ['image'],\n name: 'orientation',\n operatorType: 'is',\n operatorTypes: ['is', 'isNot'],\n options: [\n {\n name: 'portrait',\n title: 'Portrait',\n value: 'metadata.dimensions.aspectRatio < 1',\n },\n {\n name: 'landscape',\n title: 'Landscape',\n value: 'metadata.dimensions.aspectRatio > 1',\n },\n {\n name: 'square',\n title: 'Square',\n value: 'metadata.dimensions.aspectRatio == 1',\n },\n ],\n title: 'Orientation',\n type: 'select',\n value: 'portrait',\n },\n size: {\n assetTypes: ['file', 'image'],\n field: 'size',\n modifier: 'kb',\n modifiers: [\n {\n name: 'kb',\n title: 'KB',\n fieldModifier: (fieldName) => `round(${fieldName} / 1000)`,\n },\n {\n name: 'mb',\n title: 'MB',\n fieldModifier: (fieldName) => `round(${fieldName} / 1000000)`,\n },\n ],\n name: 'size',\n operatorType: 'greaterThan',\n operatorTypes: [\n 'greaterThan',\n 'greaterThanOrEqualTo',\n 'lessThan',\n 'lessThanOrEqualTo',\n null,\n 'equalTo',\n ],\n title: 'File size',\n type: 'number',\n value: 0,\n },\n tag: {\n assetTypes: ['file', 'image'],\n field: 'opt.media.tags',\n name: 'tag',\n operatorType: 'references',\n operatorTypes: ['references', 'doesNotReference', null, 'empty', 'notEmpty'],\n title: 'Tags',\n type: 'searchable',\n },\n title: {\n assetTypes: ['file', 'image'],\n field: 'title',\n name: 'title',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Title',\n type: 'string',\n value: '',\n },\n type: {\n assetTypes: ['file', 'image'],\n name: 'type',\n operatorType: 'is',\n operatorTypes: ['is', 'isNot'],\n options: [\n {\n name: 'image',\n title: 'Image',\n value: 'mimeType match \"image*\"',\n },\n {\n name: 'video',\n title: 'Video',\n value: 'mimeType match \"video*\"',\n },\n {\n name: 'audio',\n title: 'Audio',\n value: 'mimeType match \"audio*\"',\n },\n {\n name: 'pdf',\n title: 'PDF',\n value: 'mimeType == \"application/pdf\"',\n },\n ],\n title: 'File type',\n type: 'select',\n value: 'image',\n },\n width: {\n assetTypes: ['image'],\n field: 'metadata.dimensions.width',\n name: 'width',\n operatorType: 'greaterThan',\n operatorTypes: [\n 'greaterThan',\n 'greaterThanOrEqualTo',\n 'lessThan',\n 'lessThanOrEqualTo',\n null,\n 'equalTo',\n ],\n title: 'Width',\n type: 'number',\n value: 400,\n },\n}\n\nexport const operators: SearchFacetOperators = {\n doesNotInclude: {\n fn: (value, field) => (value ? `!(${field} match '*${value}*')` : undefined),\n label: 'does not include',\n },\n doesNotReference: {\n fn: (value, _field) => (value ? `!references('${value}')` : undefined),\n label: 'does not include',\n },\n empty: {\n fn: (_value, field) => `!defined(${field})`,\n hideInput: true,\n label: 'is empty',\n },\n equalTo: {\n fn: (value, field) => (value ? `${field} == ${value}` : undefined),\n label: 'is equal to',\n },\n greaterThan: {\n fn: (value, field) => (value ? `${field} > ${value}` : undefined),\n label: 'is greater than',\n },\n greaterThanOrEqualTo: {\n fn: (value, field) => (value ? `${field} >= ${value}` : undefined),\n label: 'is greater than or equal to',\n },\n includes: {\n fn: (value, field) => (value ? `${field} match '*${value}*'` : undefined),\n label: 'includes',\n },\n is: {\n fn: (value, _field) => `${value}`,\n label: 'is',\n },\n isNot: {\n fn: (value, _field) => `!(${value})`,\n label: 'is not',\n },\n lessThan: {\n fn: (value, field) => (value ? `${field} < ${value}` : undefined),\n label: 'is less than',\n },\n lessThanOrEqualTo: {\n fn: (value, field) => (value ? `${field} <= ${value}` : undefined),\n label: 'is less than or equal to',\n },\n notEmpty: {\n fn: (_value, field) => `defined(${field})`,\n hideInput: true,\n label: 'is not empty',\n },\n references: {\n fn: (value, _field) => (value ? `references('${value}')` : undefined),\n label: 'includes',\n },\n}\n","import type {AssetSourceComponentProps} from 'sanity'\n\nimport {divider, inputs} from './config/searchFacets'\nimport type {\n SearchFacetInputProps,\n SearchFacetDivider,\n SearchFacetGroup,\n OrderDirection,\n} from './types'\n\nexport const SUPPORTED_ASSET_TYPES = [\n 'file',\n 'image',\n] as const satisfies AssetSourceComponentProps['assetType'][]\n\n// Sort order dropdown options\n// null values are represented as menu dividers\nexport const ORDER_OPTIONS: ({direction: OrderDirection; field: string} | null)[] = [\n {\n direction: 'desc',\n field: '_createdAt',\n },\n {\n direction: 'asc',\n field: '_createdAt',\n },\n // Divider\n null,\n {\n direction: 'desc',\n field: '_updatedAt',\n },\n {\n direction: 'asc' as OrderDirection,\n field: '_updatedAt',\n },\n // Divider\n null,\n {\n direction: 'asc',\n field: 'originalFilename',\n },\n {\n direction: 'desc',\n field: 'originalFilename',\n },\n // Divider\n null,\n {\n direction: 'desc',\n field: 'size',\n },\n {\n direction: 'asc',\n field: 'size',\n },\n]\n\nexport const FACETS: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[] = [\n inputs.tag,\n divider,\n inputs.inUse,\n inputs.inCurrentDocument,\n divider,\n inputs.title,\n inputs.folder,\n inputs.altText,\n inputs.creditLine,\n inputs.description,\n divider,\n inputs.isOpaque,\n divider,\n inputs.fileName,\n inputs.size,\n inputs.type,\n divider,\n inputs.orientation,\n inputs.width,\n inputs.height,\n]\n\nexport const GRID_TEMPLATE_COLUMNS = {\n SMALL: '3rem 100px auto 1.5rem',\n LARGE: '3rem 100px auto 5.5rem 5.5rem 3.5rem 8.5rem 4.75rem 2rem',\n}\nexport const FOLDERS_PANEL_WIDTH = 260 // px\nexport const FOLDER_DOCUMENT_NAME = 'media.folder'\nexport const PANEL_HEIGHT = 32 // px\nexport const TAG_DOCUMENT_NAME = 'media.tag'\nexport const TAGS_PANEL_WIDTH = 250 // px\n","import {iif, type Observable, of, throwError} from 'rxjs'\nimport {delay, mergeMap} from 'rxjs/operators'\n\nconst debugThrottle = (throttled?: boolean) => {\n return function <T>(source: Observable<T>): Observable<T> {\n return iif(\n () => !!throttled,\n source.pipe(\n delay(3000),\n mergeMap((v) => {\n if (Math.random() > 0.5) {\n return throwError(() => ({\n message: 'Test error',\n statusCode: 500,\n }))\n }\n return of(v)\n }),\n ),\n source,\n )\n }\n}\n\nexport default debugThrottle\n","import groq from 'groq'\n\nimport {operators} from '../config/searchFacets'\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {AssetType, SearchFacetInputProps} from '../types'\n\n/** GROQ fragment that excludes assets tagged with any of the given media.tag slugs. */\nexport const buildExcludeTagsFragment = (excludeTagSlugs?: string[]): string | undefined => {\n const serializedExcludeTagSlugs = excludeTagSlugs?.length\n ? JSON.stringify(excludeTagSlugs)\n : undefined\n\n return serializedExcludeTagSlugs\n ? groq`!(defined(opt.media.tags) && count(opt.media.tags[@._ref in *[_type == \"${TAG_DOCUMENT_NAME}\" && name.current in ${serializedExcludeTagSlugs}]._id]) > 0)`\n : undefined\n}\n\nconst constructFilter = ({\n assetTypes,\n currentFolderId,\n excludeTagSlugs,\n searchFacets,\n searchQuery,\n}: {\n assetTypes: AssetType[]\n currentFolderId?: string | null\n excludeTagSlugs?: string[]\n searchFacets: SearchFacetInputProps[]\n searchQuery?: string\n}): string => {\n // Fetch asset types depending on current context.\n // Either limit to a specific type (if being used as a custom asset source) or fetch both files and images (if being used as a tool)\n // Sanity will crash if you try and insert incompatible asset types into fields!\n const documentAssetTypes = assetTypes.map((type) => `sanity.${type}Asset`)\n\n const baseFilter = groq`\n _type in ${JSON.stringify(documentAssetTypes)} && !(_id in path(\"drafts.**\"))\n `\n\n const excludeTagsFragment = buildExcludeTagsFragment(excludeTagSlugs)\n\n const searchFacetFragments = searchFacets.reduce((acc: string[], facet) => {\n if (facet.type === 'number') {\n const {field, modifier, modifiers, operatorType, value} = facet\n const operator = operators[operatorType]\n\n // Get current modifier\n const currentModifier = modifiers?.find((m) => m.name === modifier)\n\n // Apply field modifier function (if present)\n const facetField = currentModifier?.fieldModifier\n ? currentModifier.fieldModifier(field)\n : field\n\n const fragment = operator.fn(value, facetField)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n if (facet.type === 'searchable') {\n const {field, operatorType, value} = facet\n const operator = operators[operatorType]\n\n const fragment = operator.fn(value?.value, field)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n if (facet.type === 'select') {\n const {field, operatorType, options, value} = facet\n const operator = operators[operatorType]\n\n const currentOptionValue = options?.find((l) => l.name === value)?.value\n\n const fragment = operator.fn(currentOptionValue, field)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n if (facet.type === 'string') {\n const {field, operatorType, value} = facet\n const operator = operators[operatorType]\n\n const fragment = operator.fn(value, field)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n return acc\n }, [])\n\n // All assets (no folder selected) should not apply a folder filter. A specific\n // folder shows only assets pointing at it.\n const folderFilter: string | undefined = currentFolderId\n ? `opt.media.folder._ref == ${JSON.stringify(currentFolderId)}`\n : undefined\n\n // Join separate filter fragments\n const constructedQuery = [\n // Base filter\n baseFilter,\n ...(excludeTagsFragment ? [excludeTagsFragment] : []),\n // Search query (if present)\n // NOTE: Currently this only searches direct fields on sanity.fileAsset/sanity.imageAsset and NOT referenced tags\n // It's possible to add this by adding the following line to the searchQuery, but it's quite slow\n // references(*[_type == \"media.tag\" && name.current == \"${searchQuery.trim()}\"]._id)\n ...(searchQuery\n ? [\n groq`[_id, altText, assetId, creditLine, description, originalFilename, title, url] match '*${searchQuery.trim()}*'`,\n ]\n : []),\n ...(folderFilter ? [folderFilter] : []),\n // Search facets\n ...searchFacetFragments,\n ].join(' && ')\n\n return constructedQuery\n}\n\nexport default constructFilter\n","import type {Asset} from '../types'\n\ntype AssetRef = {\n _ref?: unknown\n _type?: unknown\n}\n\ntype ImageNode = {\n _type?: unknown\n asset?: AssetRef\n}\n\n/**\n * Re-points every image asset in `document` that references `assetToReplaceId`\n * at `newAsset`, mutating the document in place, and returns one patch object\n * per affected top-level field in the form `{[field]: <full mutated field value>}`.\n *\n * Each patch carries the entire (mutated) top-level field value rather than just\n * the matched image node, so `client.patch().set()` updates the references\n * without discarding sibling data — including deeply nested image fields.\n *\n * NOTE: ported from sanity-plugin-media#236. Because of GROQ limitations the\n * matching image objects are filtered out of the document manually rather than\n * via a projection.\n */\nexport function findImageAssets(\n document: Record<string, unknown>,\n newAsset: Asset,\n assetToReplaceId: string,\n): Record<string, unknown>[] {\n const matchedTopLevelFields = new Set<string>()\n repointNestedImages(document, newAsset, assetToReplaceId, '', matchedTopLevelFields)\n return [...matchedTopLevelFields].map((field) => ({[field]: document[field]}))\n}\n\nfunction repointNestedImages(\n node: unknown,\n newAsset: Asset,\n assetToReplaceId: string,\n topLevelField: string,\n matchedTopLevelFields: Set<string>,\n): void {\n if (typeof node !== 'object' || node === null) {\n return\n }\n\n const candidate = node as ImageNode\n // Match built-in `image` nodes and custom image schema types (e.g. `mainImage`),\n // which store their type name in `_type` rather than `\"image\"`. Skip file fields.\n const assetRef = candidate.asset\n const hasMatchingAssetRef = assetRef?._type === 'reference' && assetRef._ref === assetToReplaceId\n if (hasMatchingAssetRef && candidate._type !== 'file' && assetRef) {\n assetRef._ref = newAsset._id\n if (topLevelField) {\n matchedTopLevelFields.add(topLevelField)\n }\n }\n\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n if (typeof value === 'object' && value !== null) {\n // Once we descend past the document root, keep attributing matches to the\n // top-level field so the patch replaces that whole field.\n repointNestedImages(\n value,\n newAsset,\n assetToReplaceId,\n topLevelField || key,\n matchedTopLevelFields,\n )\n }\n }\n}\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {from, Observable, of, throwError} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {HttpError} from '../types'\n\nconst checkTagName = (client: SanityClient, name: string) => {\n return function <T>(source: Observable<T>): Observable<boolean> {\n return source.pipe(\n mergeMap(() => {\n return from(\n client.fetch(groq`count(*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $name])`, {\n name,\n }),\n ) as Observable<number>\n }),\n mergeMap((existingTagCount: number) => {\n if (existingTagCount > 0) {\n return throwError(\n () =>\n ({\n message: 'Tag already exists',\n statusCode: 409,\n }) satisfies HttpError,\n )\n }\n\n return of(true)\n }),\n )\n }\n}\n\nexport default checkTagName\n","import type {TagSelectOption, TagItem} from '../types'\n\nconst getTagSelectOptions = (tags: TagItem[]): TagSelectOption[] => {\n return tags.reduce((acc: TagSelectOption[], val) => {\n const tag = val?.tag\n if (tag) {\n acc.push({\n label: tag?.name?.current,\n value: tag?._id,\n })\n }\n return acc\n }, [])\n}\n\nexport default getTagSelectOptions\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem, HttpError, Tag} from '../../types'\n\nexport const ASSETS_ACTIONS = {\n tagsAddComplete: createAction(\n 'actions/tagsAddComplete',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n tagsAddError: createAction(\n 'actions/tagsAddError',\n function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n return {payload: {assets, error, tag}}\n },\n ),\n tagsAddRequest: createAction(\n 'actions/tagsAddRequest',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n tagsRemoveComplete: createAction(\n 'actions/tagsRemoveComplete',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n tagsRemoveError: createAction(\n 'actions/tagsRemoveError',\n function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n return {payload: {assets, error, tag}}\n },\n ),\n tagsRemoveRequest: createAction(\n 'actions/tagsRemoveRequest',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n}\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem} from '../../types'\n\nexport const DIALOG_ACTIONS = {\n showFolderCreate: createAction(\n 'dialog/showFolderCreate',\n function prepare({parentFolderId}: {parentFolderId?: string | null} = {}) {\n return {\n payload: {parentFolderId},\n }\n },\n ),\n showFolderMove: createAction(\n 'dialog/showFolderMove',\n function prepare({assets, folderId}: {assets: AssetItem[]; folderId?: string | null}) {\n return {\n payload: {assets, folderId},\n }\n },\n ),\n showFolderRename: createAction(\n 'dialog/showFolderRename',\n function prepare({folderId}: {folderId: string}) {\n return {\n payload: {folderId},\n }\n },\n ),\n showTagCreate: createAction('dialog/showTagCreate'),\n showTagEdit: createAction('dialog/showTagEdit', function prepare({tagId}: {tagId: string}) {\n return {\n payload: {tagId},\n }\n }),\n}\n","import {createSelector, createSlice, isAnyOf, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {from, Observable, of} from 'rxjs'\nimport {bufferTime, catchError, filter, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../../constants'\nimport checkTagName from '../../operators/checkTagName'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {Asset, HttpError, MyEpic, TagSelectOption, Tag, TagItem} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {DIALOG_ACTIONS} from '../dialog/actions'\nimport type {RootReducerState} from '../types'\n\ntype TagsReducerState = {\n allIds: string[]\n byIds: Record<string, TagItem>\n creating: boolean\n creatingError?: HttpError\n fetchCount: number\n fetching: boolean\n fetchingError?: HttpError\n // totalCount: number\n panelVisible: boolean\n}\n\nconst initialState = {\n allIds: [],\n byIds: {},\n creating: false,\n creatingError: undefined,\n fetchCount: -1,\n fetching: false,\n fetchingError: undefined,\n panelVisible: true,\n} as TagsReducerState\n\nconst tagsSlice = createSlice({\n name: 'tags',\n initialState,\n extraReducers: (builder) => {\n builder\n .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n delete state.creatingError\n })\n .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n const {tagId} = action.payload\n delete state.byIds[tagId]!.error\n })\n .addMatcher(\n isAnyOf(\n ASSETS_ACTIONS.tagsAddComplete,\n ASSETS_ACTIONS.tagsAddError,\n ASSETS_ACTIONS.tagsRemoveComplete,\n ASSETS_ACTIONS.tagsRemoveError,\n ),\n (state, action) => {\n const {tag} = action.payload\n state.byIds[tag._id]!.updating = false\n },\n )\n .addMatcher(\n isAnyOf(ASSETS_ACTIONS.tagsAddRequest, ASSETS_ACTIONS.tagsRemoveRequest),\n (state, action) => {\n const {tag} = action.payload\n state.byIds[tag._id]!.updating = true\n },\n )\n },\n reducers: {\n createComplete(state, action: PayloadAction<{assetId?: string; tag: Tag}>) {\n const {tag} = action.payload\n state.creating = false\n if (!state.allIds.includes(tag._id)) {\n state.allIds.push(tag._id)\n }\n state.byIds[tag._id] = {\n _type: 'tag',\n picked: false,\n tag,\n updating: false,\n }\n },\n createError(state, action: PayloadAction<{error: HttpError; name: string}>) {\n state.creating = false\n state.creatingError = action.payload.error\n },\n createRequest(state, _action: PayloadAction<{assetId?: string; name: string}>) {\n state.creating = true\n delete state.creatingError\n },\n deleteComplete(state, action: PayloadAction<{tagId: string}>) {\n const {tagId} = action.payload\n const deleteIndex = state.allIds.indexOf(tagId)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[tagId]\n },\n deleteError(state, action: PayloadAction<{error: HttpError; tag: Tag}>) {\n const {error, tag} = action.payload\n\n const tagId = tag?._id\n state.byIds[tagId]!.error = error\n state.byIds[tagId]!.updating = false\n },\n deleteRequest(state, action: PayloadAction<{tag: Tag}>) {\n const tagId = action.payload?.tag?._id\n state.byIds[tagId]!.picked = false\n state.byIds[tagId]!.updating = true\n\n Object.keys(state.byIds).forEach((key) => {\n delete state.byIds[key]!.error\n })\n },\n fetchComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n const {tags} = action.payload\n\n tags?.forEach((tag) => {\n state.allIds.push(tag._id)\n state.byIds[tag._id] = {\n _type: 'tag',\n picked: false,\n tag,\n updating: false,\n }\n })\n\n state.fetching = false\n state.fetchCount = tags.length || 0\n delete state.fetchingError\n },\n fetchError(state, action: PayloadAction<{error: HttpError}>) {\n const {error} = action.payload\n state.fetching = false\n state.fetchingError = error\n },\n fetchRequest: {\n reducer: (state, _action: PayloadAction<{query: string}>) => {\n state.fetching = true\n delete state.fetchingError\n },\n prepare: () => {\n // Construct query\n const query = groq`\n {\n \"items\": *[\n _type == \"${TAG_DOCUMENT_NAME}\"\n && !(_id in path(\"drafts.**\"))\n ] {\n _createdAt,\n _updatedAt,\n _id,\n _rev,\n _type,\n name\n } | order(name.current asc),\n }\n `\n return {payload: {query}}\n },\n },\n // Queue batch tag creation\n listenerCreateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n //\n },\n // Apply created tags (via sanity real-time events)\n listenerCreateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n const {tags} = action.payload\n\n tags?.forEach((tag) => {\n state.byIds[tag._id] = {\n _type: 'tag',\n picked: false,\n tag,\n updating: false,\n }\n if (!state.allIds.includes(tag._id)) {\n state.allIds.push(tag._id)\n }\n })\n },\n // Queue batch tag deletion\n listenerDeleteQueue(_state, _action: PayloadAction<{tagId: string}>) {\n //\n },\n // Apply deleted tags (via sanity real-time events)\n listenerDeleteQueueComplete(state, action: PayloadAction<{tagIds: string[]}>) {\n const {tagIds} = action.payload\n\n tagIds?.forEach((tagId) => {\n const deleteIndex = state.allIds.indexOf(tagId)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[tagId]\n })\n },\n // Queue batch tag updates\n listenerUpdateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n //\n },\n // Apply updated tags (via sanity real-time events)\n listenerUpdateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n const {tags} = action.payload\n\n tags?.forEach((tag) => {\n if (state.byIds[tag._id]) {\n state.byIds[tag._id]!.tag = tag\n }\n })\n },\n // Set tag panel visibility\n panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n const {panelVisible} = action.payload\n state.panelVisible = panelVisible\n },\n // Sort all tags by name\n sort(state) {\n state.allIds.sort((a, b) => {\n const tagA = state.byIds[a]!.tag.name.current\n const tagB = state.byIds[b]!.tag.name.current\n\n if (tagA < tagB) {\n return -1\n } else if (tagA > tagB) {\n return 1\n }\n return 0\n })\n },\n updateComplete(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n const {tag} = action.payload\n state.byIds[tag._id]!.tag = tag\n state.byIds[tag._id]!.updating = false\n },\n updateError(state, action: PayloadAction<{tag: Tag; error: HttpError}>) {\n const {error, tag} = action.payload\n const tagId = tag?._id\n state.byIds[tagId]!.error = error\n state.byIds[tagId]!.updating = false\n },\n updateRequest(\n state,\n action: PayloadAction<{\n closeDialogId?: string\n formData: Record<string, any>\n tag: Tag\n }>,\n ) {\n const {tag} = action.payload\n state.byIds[tag?._id]!.updating = true\n },\n },\n})\n\n// Epics\n\n// On tag create request:\n// - async check to see if tag already exists\n// - throw if tag already exists\n// - otherwise, create new tag\nexport const tagsCreateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.createRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assetId, name} = action.payload\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n checkTagName(client, name),\n mergeMap(() =>\n client.observable.create({\n _type: TAG_DOCUMENT_NAME,\n name: {\n _type: 'slug',\n current: name,\n },\n }),\n ),\n mergeMap((result) => of(tagsSlice.actions.createComplete({assetId, tag: result as Tag}))),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.createError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n name,\n }),\n ),\n ),\n )\n }),\n )\n\n// On tag delete request\n// - find referenced assets\n// - remove tag from referenced assets in a sanity transaction\nexport const tagsDeleteEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.deleteRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {tag} = action.payload\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Fetch assets which reference this tag\n mergeMap(() =>\n client.observable.fetch<Asset[]>(\n groq`*[\n _type in [\"sanity.fileAsset\", \"sanity.imageAsset\"]\n && references(*[_type == \"media.tag\" && name.current == $tagName]._id)\n ] {\n _id,\n _rev,\n opt\n }`,\n {tagName: tag.name.current},\n ),\n ),\n // Create transaction which remove tag references from all matched assets and delete tag\n mergeMap((assets) => {\n const patches = assets.map((asset) => ({\n id: asset._id,\n patch: {\n // this will cause the transaction to fail if the document has been modified since it was fetched.\n ifRevisionID: asset._rev,\n unset: [`opt.media.tags[_ref == \"${tag._id}\"]`],\n },\n }))\n\n const transaction: Transaction = patches.reduce(\n (tx, patch) => tx.patch(patch.id, patch.patch),\n client.transaction(),\n )\n\n transaction.delete(tag._id)\n\n return from(transaction.commit())\n }),\n // Dispatch complete action\n mergeMap(() => of(tagsSlice.actions.deleteComplete({tagId: tag._id}))),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.deleteError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n\n// Async fetch tags\nexport const tagsFetchEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action, state]) => {\n const {query} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Fetch tags\n mergeMap(() =>\n client.observable.fetch<{\n items: Tag[]\n }>(query),\n ),\n // Dispatch complete action\n mergeMap((result) => {\n const {items} = result\n return of(tagsSlice.actions.fetchComplete({tags: items}))\n }),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.fetchError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\n// TODO: merge all buffer epics\n// Buffer tag creation via sanity subscriber\nexport const tagsListenerCreateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsSlice.actions.listenerCreateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const tags = actions?.map((action) => action.payload.tag)\n return of(tagsSlice.actions.listenerCreateQueueComplete({tags}))\n }),\n )\n\n// TODO: merge all buffer epics\n// Buffer tag deletion via sanity subscriber\nexport const tagsListenerDeleteQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsSlice.actions.listenerDeleteQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const tagIds = actions?.map((action) => action.payload.tagId)\n return of(tagsSlice.actions.listenerDeleteQueueComplete({tagIds}))\n }),\n )\n\n// TODO: merge all buffer epics\n// Buffer tag update via sanity subscriber\nexport const tagsListenerUpdateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsSlice.actions.listenerUpdateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const tags = actions?.map((action) => action.payload.tag)\n return of(tagsSlice.actions.listenerUpdateQueueComplete({tags}))\n }),\n )\n\n// On successful tag creation or updates:\n// - Re-sort all tags\nexport const tagsSortEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n tagsSlice.actions.listenerCreateQueueComplete.type,\n tagsSlice.actions.listenerUpdateQueueComplete.type,\n ),\n bufferTime(1000),\n filter((actions) => actions.length > 0),\n mergeMap(() => of(tagsSlice.actions.sort())),\n )\n\n// On tag update request\n// - check if tag name already exists\n// - throw if tag already exists\n// - otherwise, patch document\nexport const tagsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.updateRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {closeDialogId, formData, tag} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Check if tag name is available, throw early if not\n checkTagName(client, formData?.['name']?.current),\n // Patch document (Update tag)\n mergeMap(\n () =>\n from(\n client\n .patch(tag._id)\n .set({name: {_type: 'slug', current: formData?.['name'].current}})\n .commit(),\n ) as Observable<Tag>,\n ),\n // Dispatch complete action\n mergeMap((updatedTag: Tag) => {\n return of(\n tagsSlice.actions.updateComplete({\n closeDialogId,\n tag: updatedTag,\n }),\n )\n }),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.updateError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n\n// Selectors\n\nconst selectTagsByIds = (state: RootReducerState) => state.tags.byIds\n\nconst selectTagsAllIds = (state: RootReducerState) => state.tags.allIds\n\nexport const selectTags: Selector<RootReducerState, TagItem[]> = createSelector(\n [selectTagsByIds, selectTagsAllIds],\n (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectTagById = createSelector(\n [selectTagsByIds, (_state: RootReducerState, tagId: string) => tagId],\n (byIds, tagId) => byIds[tagId],\n)\n\n// TODO: use createSelector\n// Map tag references to react-select options, skipping over items with no linked tags\nexport const selectTagSelectOptions =\n (asset?: Asset) =>\n (state: RootReducerState): TagSelectOption[] | null => {\n const tags = asset?.opt?.media?.tags?.reduce((acc: TagItem[], v) => {\n const tagItem = state.tags.byIds[v._ref]\n if (tagItem?.tag) {\n acc.push(tagItem)\n }\n return acc\n }, [])\n\n if (tags && tags?.length > 0) {\n return getTagSelectOptions(tags)\n }\n\n return null\n }\n\nexport const tagsActions = {...tagsSlice.actions}\n\nexport default tagsSlice.reducer\n","import {type PayloadAction, createSelector, createSlice} from '@reduxjs/toolkit'\nimport {uuid} from '@sanity/uuid'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap, withLatestFrom} from 'rxjs/operators'\n\nimport type {MyEpic, SearchFacetInputProps, SearchFacetOperatorType, WithId} from '../../types'\nimport {tagsActions} from '../tags'\nimport type {RootReducerState} from '../types'\n\n// TODO: don't store non-serializable data in the search store\n// (The main offender is `fieldModifier` which is currently a function)\n\ntype SearchState = {\n facets: WithId<SearchFacetInputProps>[]\n query: string\n}\n\nconst initialState = {\n facets: [],\n query: '',\n} as SearchState\n\nconst searchSlice = createSlice({\n name: 'search',\n initialState,\n reducers: {\n // Add search facet\n facetsAdd(state, action: PayloadAction<{facet: SearchFacetInputProps}>) {\n state.facets.push({...action.payload.facet, id: uuid()})\n },\n // Clear all search facets\n facetsClear(state) {\n state.facets = []\n },\n // Remove search facet by name\n facetsRemoveByName(state, action: PayloadAction<{facetName: string}>) {\n state.facets = state.facets.filter((facet) => facet.name !== action.payload.facetName)\n },\n // Remove search facet by name\n facetsRemoveByTag(state, action: PayloadAction<{tagId: string}>) {\n state.facets = state.facets.filter(\n (facet) =>\n !(\n facet.name === 'tag' &&\n facet.type === 'searchable' &&\n (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n facet.value?.value === action.payload.tagId\n ),\n )\n },\n // Remove search facet by name\n facetsRemoveById(state, action: PayloadAction<{facetId: string}>) {\n state.facets = state.facets.filter((facet) => facet.id !== action.payload.facetId)\n },\n // Update an existing search facet\n facetsUpdate(\n state,\n action: PayloadAction<{\n modifier?: string\n name: string\n operatorType?: SearchFacetOperatorType\n value?: any // TODO: type correctly\n }>,\n ) {\n const {modifier, name, operatorType, value} = action.payload\n\n const facet = state.facets.find((f) => f.name === name)\n\n if (!facet) {\n return\n }\n\n if (facet.type === 'number' && modifier) {\n facet.modifier = modifier\n }\n if (operatorType) {\n facet.operatorType = operatorType\n }\n if (typeof value !== 'undefined') {\n facet.value = value\n }\n\n state.facets = state.facets.filter((f) => f.name !== facet.name || f.id === facet.id)\n },\n // Update an existing search facet\n facetsUpdateById(\n state,\n action: PayloadAction<{\n modifier?: string\n id: string\n operatorType?: SearchFacetOperatorType\n value?: any // TODO: type correctly\n }>,\n ) {\n const {modifier, id, operatorType, value} = action.payload\n\n state.facets.forEach((facet, index) => {\n if (facet.id === id) {\n if (facet.type === 'number' && modifier) {\n facet.modifier = modifier\n }\n if (operatorType) {\n facet.operatorType = operatorType\n }\n if (typeof value !== 'undefined') {\n state.facets[index]!.value = value\n }\n }\n })\n },\n // Update existing search query\n querySet(state, action: PayloadAction<{searchQuery: string}>) {\n state.query = action.payload?.searchQuery\n },\n },\n})\n\n// Epics\n\n// On tag update success -> update existing tag search facet (if present)\nexport const searchFacetTagUpdateEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(tagsActions.updateComplete.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {tag} = action.payload\n\n const currentSearchFacetTag = state.search.facets?.find((facet) => facet.name === 'tag')\n const tagItem = state.tags.byIds[tag._id]\n\n if (currentSearchFacetTag?.type === 'searchable') {\n if (currentSearchFacetTag.value?.value === tag._id) {\n return of(\n searchSlice.actions.facetsUpdate({\n name: 'tag',\n value: {\n label: tagItem?.tag?.name?.current,\n value: tagItem?.tag?._id,\n },\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n// Selectors\nexport const selectIsSearchFacetTag = createSelector(\n [\n (state: RootReducerState) => state.search.facets,\n (_state: RootReducerState, tagId: string) => tagId,\n ],\n (searchFacets, tagId) =>\n searchFacets.some(\n (facet) =>\n facet.name === 'tag' &&\n facet.type === 'searchable' &&\n (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n facet.value?.value === tagId,\n ),\n)\n\nexport const searchActions = {...searchSlice.actions}\n\nexport default searchSlice.reducer\n","import {createAction} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\n\nexport const UPLOADS_ACTIONS = {\n uploadComplete: createAction(\n 'uploads/uploadComplete',\n function prepare({asset}: {asset: SanityAssetDocument | SanityImageAssetDocument}) {\n return {\n payload: {asset},\n }\n },\n ),\n}\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {AttributeSet, ClientError, Patch, SanityDocument, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, from, of} from 'rxjs'\nimport {\n bufferTime,\n catchError,\n concatMap,\n debounceTime,\n filter,\n mergeMap,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {\n Asset,\n AssetItem,\n AssetType,\n BrowserView,\n HttpError,\n MyEpic,\n Order,\n OrderDirection,\n Tag,\n} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {findImageAssets} from '../../utils/ReplaceImages'\nimport {searchActions} from '../search'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\nimport {ASSETS_ACTIONS} from './actions'\ntype ItemError = {\n description: string\n id: string\n referencingIDs: string[]\n type: string // 'documentHasExistingReferencesError'\n}\n\nexport type AssetsReducerState = {\n allIds: string[]\n assetTypes: AssetType[]\n byIds: Record<string, AssetItem>\n excludeTagSlugs: string[]\n fetchCount: number\n fetching: boolean\n fetchingError?: HttpError\n lastPicked?: string\n order: Order\n pageIndex: number\n pageSize: number\n view: BrowserView\n // totalCount: number\n}\n\nconst defaultOrder = ORDER_OPTIONS[0] as {\n direction: OrderDirection\n field: string\n}\n\n/**\n * NOTE:\n * `fetchCount` returns the number of items retrieved in the most recent fetch.\n * This is a temporary workaround to be able to determine when there are no more items to retrieve.\n * Typically this would be done by deriving the total number of assets upfront, but currently such\n * queries in GROQ aren't fast enough to use on large datasets (1000s of entries).\n *\n * TODO:\n * When the query engine has been improved and above queries are faster, remove all instances of\n * of `fetchCount` and reinstate `totalCount` across the board.\n */\n\nexport const initialState = {\n allIds: [],\n assetTypes: [],\n byIds: {},\n excludeTagSlugs: [],\n fetchCount: -1,\n fetching: false,\n fetchingError: undefined,\n lastPicked: undefined,\n order: {\n direction: defaultOrder.direction,\n field: defaultOrder.field,\n title: getOrderTitle(defaultOrder.field, defaultOrder.direction),\n },\n pageIndex: 0,\n pageSize: 100,\n // totalCount: -1,\n view: 'grid',\n} as AssetsReducerState\n\nconst assetsSlice = createSlice({\n name: 'assets',\n initialState,\n extraReducers: (builder) => {\n builder //\n .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n const {asset} = action.payload\n\n state.byIds[asset._id] = {\n _type: 'asset',\n asset: asset as Asset,\n picked: false,\n updating: false,\n }\n })\n .addCase(ASSETS_ACTIONS.tagsAddComplete, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsAddError, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsAddRequest, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = true\n })\n })\n .addCase(ASSETS_ACTIONS.tagsRemoveComplete, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsRemoveError, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsRemoveRequest, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = true\n })\n })\n },\n reducers: {\n // Clear asset order\n clear(state) {\n state.allIds = []\n },\n // Remove assets and update page index\n deleteComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n const {assetIds} = action.payload\n\n assetIds?.forEach((id) => {\n const deleteIndex = state.allIds.indexOf(id)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[id]\n })\n\n state.pageIndex = Math.floor(state.allIds.length / state.pageSize) - 1\n },\n deleteError(state, action: PayloadAction<{assetIds: string[]; error: ClientError}>) {\n const {assetIds, error} = action.payload\n const itemErrors: ItemError[] = error?.response?.body?.error?.items?.map(\n (item: any) => item.error,\n )\n\n assetIds?.forEach((id) => {\n state.byIds[id]!.updating = false\n })\n itemErrors?.forEach((item) => {\n state.byIds[item.id]!.error = item.description\n })\n },\n deleteRequest(state, action: PayloadAction<{assets: Asset[]; closeDialogId?: string}>) {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset?._id]!.updating = true\n })\n\n Object.keys(state.byIds).forEach((key) => {\n delete state.byIds[key]!.error\n })\n },\n fetchComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n const assets = action.payload?.assets || []\n\n if (assets) {\n assets.forEach((asset) => {\n if (!state.allIds.includes(asset._id)) {\n state.allIds.push(asset._id)\n }\n const existing = state.byIds[asset._id]\n // Preserve pick/updating across search refreshes (e.g. replace dialog clearing filters)\n state.byIds[asset._id] = {\n _type: 'asset',\n asset: asset,\n picked: existing?.picked ?? false,\n updating: existing?.updating ?? false,\n ...(existing?.error ? {error: existing.error} : {}),\n }\n })\n }\n\n state.fetching = false\n state.fetchCount = assets.length || 0\n delete state.fetchingError\n },\n fetchError(state, action: PayloadAction<HttpError>) {\n const error = action.payload\n state.fetching = false\n state.fetchingError = error\n },\n folderSetComplete(\n state,\n action: PayloadAction<{assetIds: string[]; folderId: string | null; closeDialogId?: string}>,\n ) {\n const {assetIds, folderId} = action.payload\n\n assetIds.forEach((assetId) => {\n if (state.byIds[assetId]?.asset) {\n state.byIds[assetId].asset.opt = state.byIds[assetId].asset.opt || {}\n state.byIds[assetId].asset.opt.media = state.byIds[assetId].asset.opt.media || {}\n state.byIds[assetId].asset.opt.media.folder = folderId\n ? {_ref: folderId, _type: 'reference', _weak: true}\n : undefined\n state.byIds[assetId].updating = false\n }\n })\n },\n folderSetError(state, action: PayloadAction<{assetIds: string[]; error: HttpError}>) {\n const {assetIds, error} = action.payload\n\n assetIds.forEach((assetId) => {\n if (state.byIds[assetId]) {\n state.byIds[assetId].error = error.message\n state.byIds[assetId].updating = false\n }\n })\n },\n folderSetRequest(\n state,\n action: PayloadAction<{\n assets: AssetItem[]\n folderId: string | null\n closeDialogId?: string\n }>,\n ) {\n action.payload.assets.forEach((asset) => {\n const item = state.byIds[asset.asset._id]\n if (item) {\n item.updating = true\n }\n })\n },\n fetchRequest: {\n reducer: (state, _action: PayloadAction<{params: Record<string, any>; query: string}>) => {\n state.fetching = true\n delete state.fetchingError\n },\n prepare: ({\n params = {},\n queryFilter,\n selector = ``,\n sort = groq`order(_updatedAt desc)`,\n }: {\n params?: Record<string, any>\n queryFilter: string\n replace?: boolean\n selector?: string\n sort?: string\n }) => {\n const pipe = sort || selector ? '|' : ''\n\n // Construct query\n const query = groq`\n {\n \"items\": *[${queryFilter}] {\n _id,\n _type,\n _createdAt,\n _updatedAt,\n altText,\n creditLine,\n description,\n extension,\n metadata {\n dimensions,\n exif,\n image,\n isOpaque,\n },\n mimeType,\n opt {\n media\n },\n originalFilename,\n size,\n source {\n name,\n id,\n url,\n },\n title,\n url\n } ${pipe} ${sort} ${selector},\n }\n `\n\n return {payload: {params, query}}\n },\n },\n insertUploads(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n const {results} = action.payload\n\n Object.entries(results).forEach(([hash, assetId]) => {\n if (assetId && !state.allIds.includes(hash)) {\n state.allIds.push(assetId)\n }\n })\n },\n listenerCreateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n //\n },\n listenerCreateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n const {assets} = action.payload\n assets?.forEach((asset) => {\n if (state.byIds[asset?._id]?.asset) {\n state.byIds[asset._id]!.asset = asset\n }\n })\n },\n listenerDeleteQueue(_state, _action: PayloadAction<{assetId: string}>) {\n //\n },\n listenerDeleteQueueComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n const {assetIds} = action.payload\n assetIds?.forEach((assetId) => {\n const deleteIndex = state.allIds.indexOf(assetId)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[assetId]\n })\n },\n listenerUpdateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n //\n },\n listenerUpdateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n const {assets} = action.payload\n assets?.forEach((asset) => {\n if (state.byIds[asset?._id]?.asset) {\n state.byIds[asset._id]!.asset = asset\n }\n })\n },\n loadNextPage() {\n //\n },\n loadPageIndex(state, action: PayloadAction<{pageIndex: number}>) {\n //\n state.pageIndex = action.payload.pageIndex\n },\n orderSet(state, action: PayloadAction<{order: Order}>) {\n state.order = action.payload?.order\n state.pageIndex = 0\n },\n pick(state, action: PayloadAction<{assetId: string; picked: boolean}>) {\n const {assetId, picked} = action.payload\n const item = state.byIds[assetId]\n if (!item) {\n return\n }\n\n item.picked = picked\n state.lastPicked = picked ? assetId : undefined\n },\n pickAll(state) {\n state.allIds.forEach((id) => {\n state.byIds[id]!.picked = true\n })\n },\n pickClear(state) {\n state.lastPicked = undefined\n Object.values(state.byIds).forEach((asset) => {\n state.byIds[asset.asset._id]!.picked = false\n })\n },\n pickRange(state, action: PayloadAction<{endId: string; startId: string}>) {\n const startIndex = state.allIds.findIndex((id) => id === action.payload.startId)\n const endIndex = state.allIds.findIndex((id) => id === action.payload.endId)\n\n // Sort numerically, ascending order\n const indices = [startIndex, endIndex].sort((a, b) => a - b)\n\n state.allIds.slice(indices[0], indices[1]! + 1).forEach((key) => {\n state.byIds[key]!.picked = true\n })\n state.lastPicked = state.allIds[endIndex]\n },\n sort(state) {\n state.allIds.sort((a, b) => {\n const tagA = state.byIds[a]!.asset[state.order.field]\n const tagB = state.byIds[b]!.asset[state.order.field]\n\n if (tagA < tagB) {\n return state.order.direction === 'asc' ? -1 : 1\n } else if (tagA > tagB) {\n return state.order.direction === 'asc' ? 1 : -1\n }\n return 0\n })\n },\n updateComplete(state, action: PayloadAction<{asset: Asset; closeDialogId?: string}>) {\n const {asset} = action.payload\n state.byIds[asset._id]!.updating = false\n state.byIds[asset._id]!.asset = asset\n },\n updateError(state, action: PayloadAction<{asset: Asset; error: HttpError}>) {\n const {asset, error} = action.payload\n\n const assetId = asset?._id\n state.byIds[assetId]!.error = error.message\n state.byIds[assetId]!.updating = false\n },\n updateImageReferences(state, action: PayloadAction<{asset: Asset; id: string}>) {\n const {id: assetId} = action.payload\n const item = state.byIds[assetId]\n if (!item) {\n return\n }\n item.updating = true\n delete item.error\n },\n updateImageReferencesComplete(state, action: PayloadAction<{id: string}>) {\n const {id} = action.payload\n const item = state.byIds[id]\n if (!item) {\n return\n }\n item.updating = false\n delete item.error\n },\n updateRequest(\n state,\n action: PayloadAction<{asset: Asset; closeDialogId?: string; formData: Record<string, any>}>,\n ) {\n const assetId = action.payload?.asset?._id\n state.byIds[assetId]!.updating = true\n },\n viewSet(state, action: PayloadAction<{view: BrowserView}>) {\n state.view = action.payload?.view\n },\n },\n})\n\n// Epics\n\nexport const assetsDeleteEpic: MyEpic = (action$, _state$, {client}) =>\n action$.pipe(\n filter(assetsActions.deleteRequest.match),\n mergeMap((action) => {\n const {assets} = action.payload\n const assetIds = assets.map((asset) => asset._id)\n return of(assets).pipe(\n mergeMap(() =>\n client.observable.delete({\n query: groq`*[_id in ${JSON.stringify(assetIds)}]`,\n }),\n ),\n mergeMap(() => of(assetsActions.deleteComplete({assetIds}))),\n catchError((error: ClientError) => {\n return of(assetsActions.deleteError({assetIds, error}))\n }),\n )\n }),\n )\n\nexport const assetsFetchEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action, state]) => {\n const params = action.payload?.params\n const query = action.payload?.query\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() =>\n client.observable.fetch<{\n items: Asset[]\n }>(query, params),\n ),\n mergeMap((result) => {\n const {\n items,\n // totalCount\n } = result\n return of(assetsActions.fetchComplete({assets: items}))\n }),\n catchError((error: ClientError) =>\n of(\n assetsActions.fetchError({\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n }),\n ),\n ),\n )\n }),\n )\n\nexport const assetsFetchPageIndexEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(assetsActions.loadPageIndex.match),\n withLatestFrom(state$),\n switchMap(([action, state]) => {\n const pageSize = state.assets.pageSize\n const start = action.payload.pageIndex * pageSize\n const end = start + pageSize\n\n // Document ID can be null when operating on pristine / unsaved drafts\n const documentId = state?.selected.document?._id\n const documentAssetIds = state?.selected?.documentAssetIds\n\n const constructedFilter = constructFilter({\n assetTypes: state.assets.assetTypes,\n currentFolderId: state.folders.currentFolderId,\n excludeTagSlugs: state.assets.excludeTagSlugs,\n searchFacets: state.search.facets,\n searchQuery: state.search.query,\n })\n\n const params = {\n ...(documentId ? {documentId} : {}),\n documentAssetIds,\n }\n\n return of(\n assetsActions.fetchRequest({\n params,\n queryFilter: constructedFilter,\n selector: groq`[${start}...${end}]`,\n sort: groq`order(${state.assets?.order?.field} ${state.assets?.order?.direction})`,\n }),\n )\n }),\n )\n\nexport const assetsFetchNextPageEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(assetsActions.loadNextPage.match),\n withLatestFrom(state$),\n switchMap(([_action, state]) =>\n of(assetsActions.loadPageIndex({pageIndex: state.assets.pageIndex + 1})),\n ),\n )\n\nexport const assetsFetchAfterDeleteAllEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(assetsActions.deleteComplete.match),\n withLatestFrom(state$),\n switchMap(([_action, state]) => {\n if (state.assets.allIds.length === 0) {\n const nextPageIndex = Math.floor(state.assets.allIds.length / state.assets.pageSize)\n return of(assetsActions.loadPageIndex({pageIndex: nextPageIndex}))\n }\n\n return EMPTY\n }),\n )\n\nconst filterAssetWithoutTag = (tag: Tag) => (asset: AssetItem) => {\n const tagIndex = asset?.asset?.opt?.media?.tags?.findIndex((t) => t._ref === tag?._id) ?? -1\n return tagIndex < 0\n}\n\nconst patchOperationTagAppend =\n ({tag}: {tag: Tag}) =>\n (patch: Patch) =>\n patch\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .setIfMissing({'opt.media.tags': []})\n .append('opt.media.tags', [{_key: nanoid(), _ref: tag?._id, _type: 'reference', _weak: true}])\n\nconst patchOperationTagUnset =\n ({asset, tag}: {asset: AssetItem; tag: Tag}) =>\n (patch: Patch) =>\n patch.ifRevisionId(asset?.asset?._rev).unset([`opt.media.tags[_ref == \"${tag._id}\"]`])\n\nconst patchOperationFolderSet =\n ({asset, folderId}: {asset: AssetItem; folderId: string | null}) =>\n (patch: Patch) => {\n const nextPatch = patch.ifRevisionId(asset?.asset?._rev).setIfMissing({opt: {}}).setIfMissing({\n 'opt.media': {},\n })\n\n if (folderId) {\n return nextPatch.set({\n 'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n })\n }\n\n return nextPatch.unset(['opt.media.folder'])\n }\n\nexport const assetsOrderSetEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.orderSet.match),\n mergeMap(() => {\n return of(\n assetsActions.clear(), //\n assetsActions.loadPageIndex({pageIndex: 0}),\n )\n }),\n )\n\nexport const assetsSearchEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n searchActions.facetsAdd.type,\n searchActions.facetsClear.type,\n searchActions.facetsRemoveById.type,\n searchActions.facetsRemoveByName.type,\n searchActions.facetsRemoveByTag.type,\n searchActions.facetsUpdate.type,\n searchActions.facetsUpdateById.type,\n searchActions.querySet.type,\n ),\n debounceTime(400),\n mergeMap(() => {\n return of(\n assetsActions.clear(), //\n assetsActions.loadPageIndex({pageIndex: 0}),\n )\n }),\n )\n\nexport const assetsListenerCreateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.listenerCreateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const assets = actions?.map((action) => action.payload.asset)\n return of(assetsActions.listenerCreateQueueComplete({assets}))\n }),\n )\n\nexport const assetsListenerDeleteQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.listenerDeleteQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const assetIds = actions?.map((action) => action.payload.assetId)\n return of(assetsActions.listenerDeleteQueueComplete({assetIds}))\n }),\n )\n\nexport const assetsListenerUpdateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.listenerUpdateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const assets = actions?.map((action) => action.payload.asset)\n return of(assetsActions.listenerUpdateQueueComplete({assets}))\n }),\n )\n\n// Re-sort on all updates (immediate and batched listener events)\nexport const assetsSortEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.insertUploads.type,\n assetsActions.listenerUpdateQueueComplete.type,\n assetsActions.updateComplete.type,\n ),\n mergeMap(() => of(assetsActions.sort())),\n )\n\nexport const assetsTagsAddEpic: MyEpic = (action$, state$, {client}) => {\n return action$.pipe(\n filter(ASSETS_ACTIONS.tagsAddRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets, tag} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Add tag references to all picked assets\n mergeMap(() => {\n const pickedAssets = selectAssetsPicked(state)\n\n // Filter out picked assets which already include tag\n const pickedAssetsFiltered = pickedAssets?.filter(filterAssetWithoutTag(tag))\n\n const transaction: Transaction = pickedAssetsFiltered.reduce(\n (tx, pickedAsset) => tx.patch(pickedAsset?.asset?._id, patchOperationTagAppend({tag})),\n client.transaction(),\n )\n\n return from(transaction.commit())\n }),\n // Dispatch complete action\n mergeMap(() => of(ASSETS_ACTIONS.tagsAddComplete({assets, tag}))),\n catchError((error: ClientError) =>\n of(\n ASSETS_ACTIONS.tagsAddError({\n assets,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n}\n\nexport const assetsTagsRemoveEpic: MyEpic = (action$, state$, {client}) => {\n return action$.pipe(\n filter(ASSETS_ACTIONS.tagsRemoveRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets, tag} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Remove tag references from all picked assets\n mergeMap(() => {\n const pickedAssets = selectAssetsPicked(state)\n\n const transaction: Transaction = pickedAssets.reduce(\n (tx, pickedAsset) =>\n tx.patch(pickedAsset?.asset?._id, patchOperationTagUnset({asset: pickedAsset, tag})),\n client.transaction(),\n )\n\n return from(transaction.commit())\n }),\n // Dispatch complete action\n mergeMap(() => of(ASSETS_ACTIONS.tagsRemoveComplete({assets, tag}))),\n catchError((error: ClientError) =>\n of(\n ASSETS_ACTIONS.tagsRemoveError({\n assets,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n}\n\nexport const assetsFolderSetEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.folderSetRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets, closeDialogId, folderId} = action.payload\n const assetIds = assets.map((asset) => asset.asset._id)\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => {\n const transaction: Transaction = assets.reduce(\n (tx, asset) => tx.patch(asset.asset._id, patchOperationFolderSet({asset, folderId})),\n client.transaction(),\n )\n\n return from(transaction.commit())\n }),\n mergeMap(() =>\n of(\n assetsActions.folderSetComplete({\n assetIds,\n closeDialogId,\n folderId,\n }),\n ),\n ),\n catchError((error: ClientError) =>\n of(\n assetsActions.folderSetError({\n assetIds,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nexport const assetsFolderSetRefreshEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.folderSetComplete.match),\n mergeMap(() =>\n of(\n assetsActions.pickClear(),\n assetsActions.clear(),\n assetsActions.loadPageIndex({pageIndex: 0}),\n ),\n ),\n )\n\nexport const assetsUnpickEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.orderSet.type,\n assetsActions.viewSet.type,\n searchActions.facetsAdd.type,\n searchActions.facetsClear.type,\n searchActions.facetsRemoveById.type,\n searchActions.facetsRemoveByName.type,\n searchActions.facetsRemoveByTag.type,\n searchActions.facetsUpdate.type,\n searchActions.facetsUpdateById.type,\n searchActions.querySet.type,\n ),\n mergeMap(() => {\n return of(assetsActions.pickClear())\n }),\n )\n\nexport const assetsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.updateRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {asset, closeDialogId, formData} = action.payload\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() =>\n from(\n client\n .patch(asset._id)\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .set(formData)\n .commit(),\n ),\n ),\n mergeMap((updatedAsset: any) =>\n of(\n assetsActions.updateComplete({\n asset: updatedAsset,\n closeDialogId,\n }),\n ),\n ),\n catchError((error: ClientError) =>\n of(\n assetsActions.updateError({\n asset,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nexport const assetsUpdateImageReferencesEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.updateImageReferences.match),\n withLatestFrom(state$),\n // Queue replaces so a later action still runs (exhaustMap would drop it after\n // the reducer already set `updating`, leaving a stuck spinner). Same-asset\n // double-clicks are blocked in the UI when the original is already updating.\n concatMap(([action, state]) => {\n const {asset, id} = action.payload\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => client.observable.fetch<SanityDocument[]>(groq`*[references($id)]`, {id})),\n mergeMap((documents) => {\n // Patch every referencing document in one transaction so we never leave\n // references split across old/new assets if a later commit would fail.\n let patchedCount = 0\n const transaction: Transaction = documents.reduce((tx, document) => {\n const clonedDocument = JSON.parse(JSON.stringify(document)) as Record<string, unknown>\n const assetsToReplace = findImageAssets(clonedDocument, asset, id)\n if (assetsToReplace.length === 0) {\n return tx\n }\n patchedCount += 1\n const patchSet = Object.assign({}, ...assetsToReplace) as AttributeSet\n return tx.patch(document._id, (patch) =>\n patch.ifRevisionId(document._rev).set(patchSet),\n )\n }, client.transaction())\n\n if (patchedCount === 0) {\n return of(assetsActions.updateImageReferencesComplete({id}))\n }\n\n return from(transaction.commit()).pipe(\n mergeMap(() => of(assetsActions.updateImageReferencesComplete({id}))),\n )\n }),\n catchError((error: ClientError) => {\n // The asset marked as `updating` is the original (being replaced), keyed\n // by `id` — not the replacement `asset` that was clicked. Attach the error\n // to (and clear the spinner on) the original asset.\n const originalAsset = state.assets.byIds[id]?.asset ?? asset\n return of(\n assetsActions.updateError({\n asset: originalAsset,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n )\n }),\n )\n }),\n )\n\n// Selectors\n\nconst selectAssetsByIds = (state: RootReducerState) => state.assets.byIds\n\nconst selectAssetsAllIds = (state: RootReducerState) => state.assets.allIds\n\nexport const selectAssetById = createSelector(\n [\n (state: RootReducerState) => state.assets.byIds,\n (_state: RootReducerState, assetId: string) => assetId,\n ],\n (byIds, assetId) => {\n const asset = byIds[assetId]\n return asset ? asset : undefined\n },\n)\n\nconst selectAssets: Selector<RootReducerState, AssetItem[]> = createSelector(\n [selectAssetsByIds, selectAssetsAllIds],\n (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectAssetsLength = createSelector([selectAssets], (assets) => assets.length)\n\nexport const selectAssetsPicked = createSelector([selectAssets], (assets) =>\n assets.filter((item) => item?.picked),\n)\n\nexport const selectAssetsPickedLength = createSelector(\n [selectAssetsPicked],\n (assetsPicked) => assetsPicked.length,\n)\n\nexport const assetsActions = {...assetsSlice.actions}\n\nexport default assetsSlice.reducer\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Patch} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport {from, of} from 'rxjs'\nimport {\n catchError,\n debounceTime,\n filter,\n map,\n mergeMap,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators'\n\nimport {FOLDER_DOCUMENT_NAME} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {FolderDoc, FolderTreeItem, FolderTreeNode, HttpError, MyEpic} from '../../types'\nimport {buildExcludeTagsFragment} from '../../utils/constructFilter'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\n\ntype FoldersReducerState = {\n byId: Record<string, FolderDoc>\n childrenByParentId: Record<string, string[]>\n rootIds: string[]\n exactCountByFolderId: Record<string, number>\n unfiledCount: number\n currentFolderId: string | null\n currentFolderUnfiled: boolean\n panelVisible: boolean\n fetching: boolean\n fetchCount: number\n fetchingError?: HttpError\n creating: boolean\n creatingError?: HttpError\n deletingId?: string\n deleteError?: HttpError\n renaming: boolean\n renameError?: HttpError\n}\n\nconst initialState: FoldersReducerState = {\n byId: {},\n childrenByParentId: {},\n rootIds: [],\n exactCountByFolderId: {},\n unfiledCount: 0,\n currentFolderId: null,\n currentFolderUnfiled: false,\n panelVisible: false,\n fetching: false,\n fetchCount: -1,\n fetchingError: undefined,\n creating: false,\n creatingError: undefined,\n deletingId: undefined,\n deleteError: undefined,\n renaming: false,\n renameError: undefined,\n}\n\nconst indexFolders = (folders: FolderDoc[]) => {\n const byId: Record<string, FolderDoc> = {}\n const childrenByParentId: Record<string, string[]> = {}\n const rootIds: string[] = []\n\n folders.forEach((folder) => {\n byId[folder._id] = folder\n })\n\n // Resolve parent ids that reference unknown folders to null (defensive — orphan folders surface at root).\n folders.forEach((folder) => {\n const parentKey = folder.parentId && byId[folder.parentId] ? folder.parentId : null\n if (parentKey === null) {\n rootIds.push(folder._id)\n } else {\n if (!childrenByParentId[parentKey]) {\n childrenByParentId[parentKey] = []\n }\n childrenByParentId[parentKey].push(folder._id)\n }\n })\n\n const sortByName = (ids: string[]) =>\n ids.sort((a, b) =>\n (byId[a]?.name || '').localeCompare(byId[b]?.name || '', undefined, {\n numeric: true,\n sensitivity: 'base',\n }),\n )\n\n sortByName(rootIds)\n Object.values(childrenByParentId).forEach((ids) => sortByName(ids))\n\n return {byId, childrenByParentId, rootIds}\n}\n\nconst foldersSlice = createSlice({\n name: 'folders',\n initialState,\n reducers: {\n createComplete(state, _action: PayloadAction<{folder: FolderDoc}>) {\n state.creating = false\n },\n createError(state, action: PayloadAction<{error: HttpError}>) {\n state.creating = false\n state.creatingError = action.payload.error\n },\n createRequest(state, _action: PayloadAction<{name: string; parentId?: string | null}>) {\n state.creating = true\n delete state.creatingError\n },\n currentFolderClear(state) {\n state.currentFolderId = null\n state.currentFolderUnfiled = false\n },\n currentFolderSet(state, action: PayloadAction<{folderId: string}>) {\n state.currentFolderId = action.payload.folderId\n state.currentFolderUnfiled = false\n },\n currentFolderShowUnfiled(state) {\n state.currentFolderId = null\n state.currentFolderUnfiled = true\n },\n deleteComplete(\n state,\n action: PayloadAction<{\n folderId: string\n deletedIds: string[]\n clearedCurrentFolder?: boolean\n }>,\n ) {\n state.deletingId = undefined\n const removed = new Set(action.payload.deletedIds)\n if (state.currentFolderId && removed.has(state.currentFolderId)) {\n state.currentFolderId = null\n state.currentFolderUnfiled = false\n }\n },\n deleteError(state, action: PayloadAction<{error: HttpError; folderId: string}>) {\n state.deletingId = undefined\n state.deleteError = action.payload.error\n },\n deleteRequest(state, action: PayloadAction<{folderId: string}>) {\n state.deletingId = action.payload.folderId\n delete state.deleteError\n },\n fetchComplete(\n state,\n action: PayloadAction<{\n folders: FolderDoc[]\n exactCountByFolderId: Record<string, number>\n unfiledCount: number\n clearedCurrentFolder?: boolean\n }>,\n ) {\n const {byId, childrenByParentId, rootIds} = indexFolders(action.payload.folders)\n state.byId = byId\n state.childrenByParentId = childrenByParentId\n state.rootIds = rootIds\n state.exactCountByFolderId = action.payload.exactCountByFolderId\n state.unfiledCount = action.payload.unfiledCount\n state.fetching = false\n state.fetchCount = action.payload.folders.length\n delete state.fetchingError\n\n if (state.currentFolderId && !byId[state.currentFolderId]) {\n state.currentFolderId = null\n state.currentFolderUnfiled = false\n }\n },\n fetchError(state, action: PayloadAction<{error: HttpError}>) {\n state.fetching = false\n state.fetchingError = action.payload.error\n },\n fetchRequest(state) {\n state.fetching = true\n delete state.fetchingError\n },\n panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n state.panelVisible = action.payload.panelVisible\n },\n renameComplete(state, _action: PayloadAction<{folderId: string; name: string}>) {\n state.renaming = false\n },\n renameError(state, action: PayloadAction<{error: HttpError}>) {\n state.renaming = false\n state.renameError = action.payload.error\n },\n renameRequest(state, _action: PayloadAction<{folderId: string; name: string}>) {\n state.renaming = true\n delete state.renameError\n },\n },\n})\n\nexport const foldersFetchEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action, state]) =>\n of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => {\n const assetTypes = state.assets.assetTypes.map((type) => `sanity.${type}Asset`)\n const excludeTagsFragment = buildExcludeTagsFragment(state.assets.excludeTagSlugs)\n const excludeTagsClause = excludeTagsFragment ? `&& ${excludeTagsFragment}` : ''\n return client.observable.fetch<{\n folders: {_id: string; name?: string; parentId?: string | null; count: number}[]\n unfiledCount: number\n }>(\n groq`{\n \"folders\": *[\n _type == \"${FOLDER_DOCUMENT_NAME}\"\n && !(_id in path(\"drafts.**\"))\n ] {\n _id,\n name,\n \"parentId\": parent._ref,\n \"count\": count(*[\n _type in ${JSON.stringify(assetTypes)}\n && !(_id in path(\"drafts.**\"))\n && opt.media.folder._ref == ^._id\n ${excludeTagsClause}\n ])\n },\n \"unfiledCount\": count(*[\n _type in ${JSON.stringify(assetTypes)}\n && !(_id in path(\"drafts.**\"))\n && !defined(opt.media.folder._ref)\n ${excludeTagsClause}\n ])\n }`,\n )\n }),\n mergeMap((result) => {\n const folders: FolderDoc[] = result.folders.map((f) => ({\n _id: f._id,\n name: f.name || '',\n parentId: f.parentId || null,\n }))\n const exactCountByFolderId: Record<string, number> = {}\n result.folders.forEach(({_id, count}) => {\n exactCountByFolderId[_id] = count\n })\n const folderIds = new Set(folders.map((folder) => folder._id))\n const clearedCurrentFolder = Boolean(\n state.folders.currentFolderId && !folderIds.has(state.folders.currentFolderId),\n )\n return of(\n foldersSlice.actions.fetchComplete({\n folders,\n exactCountByFolderId,\n unfiledCount: result.unfiledCount,\n clearedCurrentFolder,\n }),\n )\n }),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.fetchError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n ),\n ),\n )\n\nexport const foldersRefreshEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(\n (action) =>\n assetsActions.deleteComplete.match(action) ||\n assetsActions.folderSetComplete.match(action) ||\n foldersSlice.actions.createComplete.match(action) ||\n foldersSlice.actions.deleteComplete.match(action) ||\n foldersSlice.actions.renameComplete.match(action) ||\n assetsActions.listenerCreateQueueComplete.match(action) ||\n assetsActions.listenerDeleteQueueComplete.match(action) ||\n assetsActions.listenerUpdateQueueComplete.match(action) ||\n assetsActions.updateComplete.match(action) ||\n UPLOADS_ACTIONS.uploadComplete.match(action),\n ),\n debounceTime(300),\n mergeMap(() => of(foldersSlice.actions.fetchRequest())),\n )\n\nexport const foldersCurrentFolderEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(\n (action) =>\n foldersSlice.actions.currentFolderClear.match(action) ||\n foldersSlice.actions.currentFolderSet.match(action) ||\n foldersSlice.actions.currentFolderShowUnfiled.match(action) ||\n (foldersSlice.actions.deleteComplete.match(action) &&\n Boolean(action.payload.clearedCurrentFolder)) ||\n (foldersSlice.actions.fetchComplete.match(action) &&\n Boolean(action.payload.clearedCurrentFolder)),\n ),\n mergeMap(() =>\n of(\n assetsActions.clear(),\n assetsActions.pickClear(),\n assetsActions.loadPageIndex({pageIndex: 0}),\n ),\n ),\n )\n\nconst patchOperationAssetFolderUnset = (patch: Patch) => patch.unset(['opt.media.folder'])\n\nconst patchOperationFolderParentSet =\n ({parentId}: {parentId: string | null}) =>\n (patch: Patch) => {\n if (parentId) {\n return patch.set({parent: {_ref: parentId, _type: 'reference', _weak: true}})\n }\n\n return patch.unset(['parent'])\n }\n\nexport const foldersCreateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.createRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const name = action.payload.name.trim()\n const parentId = action.payload.parentId || null\n\n if (!name) {\n return of(\n foldersSlice.actions.createError({\n error: {message: 'Folder name cannot be empty', statusCode: 400},\n }),\n )\n }\n\n const siblingIds = parentId\n ? state.folders.childrenByParentId[parentId] || []\n : state.folders.rootIds\n const collision = siblingIds.some(\n (id) => state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n )\n if (collision) {\n return of(\n foldersSlice.actions.createError({\n error: {message: 'A folder with this name already exists here', statusCode: 409},\n }),\n )\n }\n\n const newId = `${FOLDER_DOCUMENT_NAME}.${nanoid()}`\n const doc: {\n _id: string\n _type: string\n name: string\n parent?: {_ref: string; _type: 'reference'; _weak: true}\n } = {\n _id: newId,\n _type: FOLDER_DOCUMENT_NAME,\n name,\n }\n if (parentId) {\n doc.parent = {_ref: parentId, _type: 'reference', _weak: true}\n }\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => client.observable.create(doc)),\n mergeMap(() =>\n of(\n foldersSlice.actions.createComplete({folder: {_id: newId, name, parentId}}),\n foldersSlice.actions.currentFolderSet({folderId: newId}),\n ),\n ),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.createError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nexport const foldersDeleteEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.deleteRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const folderId = action.payload.folderId\n const childFolderIds = state.folders.childrenByParentId[folderId] || []\n const parentId = state.folders.byId[folderId]?.parentId ?? null\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() =>\n client.observable.fetch<{assets: {_id: string}[]}>(\n groq`{\n \"assets\": *[\n _type in ${JSON.stringify(\n state.assets.assetTypes.map((type) => `sanity.${type}Asset`),\n )}\n && !(_id in path(\"drafts.**\"))\n && opt.media.folder._ref == $folderId\n ] {\n _id\n }\n }`,\n {folderId},\n ),\n ),\n mergeMap((result) => {\n const tx = client.transaction()\n // Deleting a folder only removes the folder document. Assets keep living in the\n // library with their folder assignment cleared, and direct child folders are promoted\n // to the deleted folder's parent (or root).\n result.assets.forEach((asset) => tx.patch(asset._id, patchOperationAssetFolderUnset))\n childFolderIds.forEach((childFolderId) =>\n tx.patch(childFolderId, patchOperationFolderParentSet({parentId})),\n )\n tx.delete(folderId)\n\n return from(tx.commit()).pipe(\n map(() =>\n foldersSlice.actions.deleteComplete({\n folderId,\n deletedIds: [folderId],\n clearedCurrentFolder: state.folders.currentFolderId === folderId,\n }),\n ),\n )\n }),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.deleteError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n folderId,\n }),\n ),\n ),\n )\n }),\n )\n\nexport const foldersRenameEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.renameRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {folderId} = action.payload\n const name = action.payload.name.trim()\n const folder = state.folders.byId[folderId]\n\n if (!folder) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'Folder not found', statusCode: 404},\n }),\n )\n }\n\n if (!name) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'Folder name cannot be empty', statusCode: 400},\n }),\n )\n }\n\n if (name === folder.name) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'Folder name has not changed', statusCode: 400},\n }),\n )\n }\n\n const siblingIds = folder.parentId\n ? state.folders.childrenByParentId[folder.parentId] || []\n : state.folders.rootIds\n const collision = siblingIds.some(\n (id) =>\n id !== folderId && state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n )\n if (collision) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'A folder with this name already exists here', statusCode: 409},\n }),\n )\n }\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => client.observable.patch(folderId).set({name}).commit()),\n mergeMap(() => of(foldersSlice.actions.renameComplete({folderId, name}))),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.renameError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nconst selectById = (state: RootReducerState) => state.folders.byId\nconst selectChildrenByParentId = (state: RootReducerState) => state.folders.childrenByParentId\nconst selectRootIds = (state: RootReducerState) => state.folders.rootIds\nconst selectExactCountByFolderId = (state: RootReducerState) => state.folders.exactCountByFolderId\nconst selectCurrentFolderId = (state: RootReducerState) => state.folders.currentFolderId\nconst selectCurrentFolderUnfiled = (state: RootReducerState) => state.folders.currentFolderUnfiled\n\nconst buildFolderPath = (folderId: string, byId: Record<string, FolderDoc>): string => {\n const segments: string[] = []\n let cursor: string | null = folderId\n const seen = new Set<string>()\n while (cursor && !seen.has(cursor)) {\n const folder: FolderDoc | undefined = byId[cursor]\n if (!folder) break\n seen.add(cursor)\n segments.unshift(folder.name)\n cursor = folder.parentId\n }\n return segments.join('/')\n}\n\nexport const selectFolderPathById = createSelector(\n [selectById, (_state: RootReducerState, folderId: string | null | undefined) => folderId],\n (byId, folderId) => (folderId ? buildFolderPath(folderId, byId) : ''),\n)\n\nexport const selectFolderTree = createSelector(\n [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n (byId, childrenByParentId, rootIds, exactCountByFolderId): FolderTreeNode[] => {\n const buildNode = (folderId: string): FolderTreeNode => {\n const folder = byId[folderId]\n const children = (childrenByParentId[folderId] || []).map(buildNode)\n const exactCount = exactCountByFolderId[folderId] || 0\n const totalCount = children.reduce((sum, child) => sum + child.totalCount, exactCount)\n return {\n children,\n exactCount,\n id: folderId,\n name: folder?.name || '',\n parentId: folder?.parentId ?? null,\n path: buildFolderPath(folderId, byId),\n totalCount,\n }\n }\n\n return rootIds.map(buildNode)\n },\n)\n\nexport const selectCurrentFolderSegments = createSelector(\n [selectById, selectCurrentFolderId],\n (byId, currentFolderId): FolderTreeItem[] => {\n if (!currentFolderId) return []\n const chain: string[] = []\n let cursor: string | null = currentFolderId\n const seen = new Set<string>()\n while (cursor && !seen.has(cursor)) {\n const folder: FolderDoc | undefined = byId[cursor]\n if (!folder) break\n seen.add(cursor)\n chain.unshift(cursor)\n cursor = folder.parentId\n }\n return chain.map((id, depth) => ({\n depth,\n exactCount: 0,\n id,\n name: byId[id]?.name || '',\n parentId: byId[id]?.parentId ?? null,\n path: buildFolderPath(id, byId),\n totalCount: 0,\n }))\n },\n)\n\ntype FoldersIndex = {\n byId: Record<string, FolderDoc>\n childrenByParentId: Record<string, string[]>\n rootIds: string[]\n exactCountByFolderId: Record<string, number>\n}\n\nconst selectFoldersIndex = createSelector(\n [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n (byId, childrenByParentId, rootIds, exactCountByFolderId): FoldersIndex => ({\n byId,\n childrenByParentId,\n rootIds,\n exactCountByFolderId,\n }),\n)\n\nexport const selectCurrentFolderChildren = createSelector(\n [selectFoldersIndex, selectCurrentFolderId, selectCurrentFolderUnfiled],\n (\n {byId, childrenByParentId, rootIds, exactCountByFolderId},\n currentFolderId,\n currentFolderUnfiled,\n ): FolderTreeItem[] => {\n if (currentFolderUnfiled || !currentFolderId) return []\n const ids = currentFolderId ? childrenByParentId[currentFolderId] || [] : rootIds\n const depth = currentFolderId ? buildFolderPath(currentFolderId, byId).split('/').length : 0\n return ids.map((id) => {\n const folder = byId[id]\n // Sum totalCount over the subtree.\n const stack = [id]\n let totalCount = 0\n while (stack.length) {\n const cur = stack.pop()!\n totalCount += exactCountByFolderId[cur] || 0\n const kids = childrenByParentId[cur]\n if (kids) stack.push(...kids)\n }\n return {\n depth,\n exactCount: exactCountByFolderId[id] || 0,\n id,\n name: folder?.name || '',\n parentId: folder?.parentId ?? null,\n path: buildFolderPath(id, byId),\n totalCount,\n }\n })\n },\n)\n\nexport const selectCanDeleteFolder = createSelector(\n [selectCurrentFolderId],\n (currentFolderId) => !!currentFolderId,\n)\n\nexport const foldersActions = {...foldersSlice.actions}\n\nexport default foldersSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\n\nimport type {AssetItem, Dialog, MyEpic, Tag} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {DIALOG_ACTIONS} from './actions'\n\ntype DialogReducerState = {\n items: Dialog[]\n}\n\nconst initialState = {\n items: [],\n} as DialogReducerState\n\nconst dialogSlice = createSlice({\n name: 'dialog',\n initialState,\n extraReducers: (builder) => {\n builder\n .addCase(DIALOG_ACTIONS.showFolderCreate, (state, action) => {\n const {parentFolderId} = action.payload\n state.items.push({\n parentFolderId,\n id: 'folderCreate',\n type: 'folderCreate',\n })\n })\n .addCase(DIALOG_ACTIONS.showFolderMove, (state, action) => {\n const {assets, folderId} = action.payload\n state.items.push({\n assets,\n folderId,\n id: 'folderMove',\n type: 'folderMove',\n })\n })\n .addCase(DIALOG_ACTIONS.showFolderRename, (state, action) => {\n const {folderId} = action.payload\n state.items.push({\n folderId,\n id: 'folderRename',\n type: 'folderRename',\n })\n })\n .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n state.items.push({\n id: 'tagCreate',\n type: 'tagCreate',\n })\n })\n .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n const {tagId} = action.payload\n state.items.push({\n id: tagId,\n tagId,\n type: 'tagEdit',\n })\n })\n .addCase(foldersActions.createComplete, (state) => {\n state.items = state.items.filter((item) => item.id !== 'folderCreate')\n })\n .addCase(foldersActions.renameComplete, (state) => {\n state.items = state.items.filter((item) => item.id !== 'folderRename')\n })\n },\n reducers: {\n // Clear all dialogs\n clear(state) {\n state.items = []\n },\n // Add newly created inline tag to assetEdit dialog\n inlineTagCreate(state, action: PayloadAction<{assetId: string; tag: Tag}>) {\n const {assetId, tag} = action.payload\n\n state.items.forEach((item) => {\n if (item.type === 'assetEdit' && item.assetId === assetId) {\n item.lastCreatedTag = {\n label: tag.name.current,\n value: tag._id,\n }\n }\n })\n },\n // Remove inline tags from assetEdit dialog\n inlineTagRemove(state, action: PayloadAction<{tagIds: string[]}>) {\n const {tagIds} = action.payload\n\n state.items.forEach((item) => {\n if (item.type === 'assetEdit') {\n item.lastRemovedTagIds = tagIds\n }\n })\n },\n // Remove dialog by id\n remove(state, action: PayloadAction<{id: string}>) {\n const id = action.payload?.id\n state.items = state.items.filter((item) => item.id !== id)\n },\n showConfirmAssetsTagAdd(\n state,\n action: PayloadAction<{\n assetsPicked: AssetItem[]\n closeDialogId?: string\n tag: Tag\n }>,\n ) {\n const {assetsPicked, closeDialogId, tag} = action.payload\n\n const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: ASSETS_ACTIONS.tagsAddRequest({\n assets: assetsPicked,\n tag,\n }),\n confirmText: `Yes, add tag to ${suffix}`,\n title: `Add tag ${tag.name.current} to ${suffix}?`,\n id: 'confirm',\n headerTitle: 'Confirm tag addition',\n tone: 'primary',\n type: 'confirm',\n })\n },\n showConfirmAssetsTagRemove(\n state,\n action: PayloadAction<{\n assetsPicked: AssetItem[]\n closeDialogId?: string\n tag: Tag\n }>,\n ) {\n const {assetsPicked, closeDialogId, tag} = action.payload\n\n const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: ASSETS_ACTIONS.tagsRemoveRequest({assets: assetsPicked, tag}),\n confirmText: `Yes, remove tag from ${suffix}`,\n headerTitle: 'Confirm tag removal',\n id: 'confirm',\n title: `Remove tag ${tag.name.current} from ${suffix}?`,\n tone: 'critical',\n type: 'confirm',\n })\n },\n showConfirmDeleteAssets(\n state,\n action: PayloadAction<{assets: AssetItem[]; closeDialogId?: string}>,\n ) {\n const {assets, closeDialogId} = action.payload\n\n const suffix = `${assets.length} ${pluralize('asset', assets.length)}`\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: assetsActions.deleteRequest({\n assets: assets.map((assetItem) => assetItem.asset),\n }),\n confirmText: `Yes, delete ${suffix}`,\n description: 'This operation cannot be reversed. Are you sure you want to continue?',\n title: `Permanently delete ${suffix}?`,\n id: 'confirm',\n headerTitle: 'Confirm deletion',\n tone: 'critical',\n type: 'confirm',\n })\n },\n showConfirmDeleteFolder(\n state,\n action: PayloadAction<{closeDialogId?: string; folderId: string; folderName: string}>,\n ) {\n const {closeDialogId, folderId, folderName} = action.payload\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: foldersActions.deleteRequest({folderId}),\n confirmText: `Yes, delete folder`,\n description:\n 'This deletes only the selected folder. Assets in this folder will stay in the library and have their folder assignment removed. Nested folders will move up one level.',\n title: `Delete ${folderName}?`,\n id: 'confirm',\n headerTitle: 'Confirm folder deletion',\n tone: 'critical',\n type: 'confirm',\n })\n },\n showConfirmDeleteTag(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n const {closeDialogId, tag} = action.payload\n\n const suffix = 'tag'\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: tagsActions.deleteRequest({tag}),\n confirmText: `Yes, delete ${suffix}`,\n description: 'This operation cannot be reversed. Are you sure you want to continue?',\n title: `Permanently delete ${suffix}?`,\n id: 'confirm',\n headerTitle: 'Confirm deletion',\n tone: 'critical',\n type: 'confirm',\n })\n },\n showAllAssetsDialog(state, action: PayloadAction<{assetId: string}>) {\n if (state.items.some((item) => item.type === 'dialogAllAssets')) {\n return\n }\n state.items.push({\n assetId: action.payload.assetId,\n id: 'dialogAllAssets',\n type: 'dialogAllAssets',\n })\n },\n showAssetEdit(state, action: PayloadAction<{assetId: string}>) {\n const {assetId} = action.payload\n state.items.push({\n assetId,\n id: assetId,\n type: 'assetEdit',\n })\n },\n showSearchFacets(state) {\n state.items.push({\n id: 'searchFacets',\n type: 'searchFacets',\n })\n },\n showFolders(state) {\n state.items.push({\n id: 'folders',\n type: 'folders',\n })\n },\n showTags(state) {\n state.items.push({\n id: 'tags',\n type: 'tags',\n })\n },\n },\n})\n\n// Epics\n\nexport const dialogClearOnAssetUpdateEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.deleteComplete.type,\n assetsActions.folderSetComplete.type,\n assetsActions.updateComplete.type,\n tagsActions.deleteComplete.type,\n tagsActions.updateComplete.type,\n ),\n filter(\n (action: {\n payload: {closeDialogId?: string}\n }): action is PayloadAction<{closeDialogId?: string}> => !!action?.payload?.closeDialogId,\n ),\n mergeMap((action) => {\n const dialogId = action?.payload?.closeDialogId\n if (dialogId) {\n return of(dialogSlice.actions.remove({id: dialogId}))\n }\n return EMPTY\n }),\n )\n\nexport const dialogTagCreateEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.createComplete.match),\n mergeMap((action) => {\n const {assetId, tag} = action?.payload || {}\n\n if (assetId) {\n return of(dialogSlice.actions.inlineTagCreate({tag, assetId}))\n }\n\n if (tag._id) {\n return of(dialogSlice.actions.remove({id: 'tagCreate'}))\n }\n\n return EMPTY\n }),\n )\n\nexport const dialogTagDeleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.listenerDeleteQueueComplete.match),\n mergeMap((action) => {\n const {tagIds} = action?.payload || {}\n\n return of(dialogSlice.actions.inlineTagRemove({tagIds}))\n }),\n )\n\nexport const dialogActions = {...dialogSlice.actions}\n\nexport default dialogSlice.reducer\n","import {createGlobalStyle, css} from 'styled-components'\n\nconst customScrollbar = css`\n ::-webkit-scrollbar {\n width: 14px;\n }\n\n ::-webkit-scrollbar-thumb {\n border-radius: 10px;\n border: 4px solid rgba(0, 0, 0, 0);\n background: var(--card-border-color);\n background-clip: padding-box;\n\n &:hover {\n background: var(--card-muted-fg-color);\n background-clip: padding-box;\n }\n }\n`\n\nconst GlobalStyle = createGlobalStyle`\n .media__custom-scrollbar {\n ${customScrollbar}\n }\n\n // @sanity/ui overrides\n\n // Custom scrollbar on Box (used in Dialogs)\n div[data-ui=\"Box\"] {\n ${customScrollbar}\n }\n\n // Dialog background color\n div[data-ui=\"Dialog\"] {\n background-color: rgba(15, 17, 18, 0.9);\n }\n\n`\n\nexport default GlobalStyle\n","import {type PropsWithChildren, createContext, useContext, useMemo} from 'react'\nimport type {DropzoneOptions} from 'react-dropzone'\n\nimport type {MediaToolOptions, Locale} from '../types'\n\ntype ContextProps = {\n dropzone: Pick<DropzoneOptions, 'maxSize'>\n components: MediaToolOptions['components']\n createTagsOnUpload: boolean\n creditLine: MediaToolOptions['creditLine']\n directUploads: MediaToolOptions['directUploads']\n excludeTagSlugs: string[]\n locales?: Locale[]\n}\n\nconst ToolOptionsContext = createContext<ContextProps | null>(null)\n\ntype Props = {\n options?: MediaToolOptions | void\n}\n\nexport const ToolOptionsProvider = ({options, children}: PropsWithChildren<Props>) => {\n const value = useMemo<ContextProps>(() => {\n let creditLineExcludeSources\n\n if (options?.creditLine?.excludeSources) {\n creditLineExcludeSources = Array.isArray(options?.creditLine?.excludeSources)\n ? options.creditLine.excludeSources\n : [options?.creditLine?.excludeSources]\n }\n\n return {\n dropzone: {maxSize: options?.maximumUploadSize},\n components: {\n details: options?.components?.details,\n },\n createTagsOnUpload: options?.createTagsOnUpload ?? true,\n creditLine: {\n enabled: options?.creditLine?.enabled || false,\n excludeSources: creditLineExcludeSources,\n },\n directUploads: options?.directUploads ?? true,\n excludeTagSlugs: options?.excludeTags?.length ? [...options.excludeTags] : [],\n locales: options?.locales,\n }\n // oxlint-disable-next-line react/preserve-manual-memoization\n }, [\n options?.creditLine?.enabled,\n options?.components,\n options?.createTagsOnUpload,\n options?.creditLine?.excludeSources,\n options?.excludeTags,\n options?.maximumUploadSize,\n options?.directUploads,\n options?.locales,\n ])\n\n return <ToolOptionsContext.Provider value={value}>{children}</ToolOptionsContext.Provider>\n}\n\nexport const useToolOptions = () => {\n const context = useContext(ToolOptionsContext)\n\n if (!context) {\n throw new Error('useToolOptions must be used within an ToolOptionsProvider')\n }\n\n return context\n}\n","import * as z from 'zod'\n\n// Helper to generate localized string schema\nfunction localizedStringSchema(locales?: {id: string}[]) {\n if (!locales || locales.length === 0) {\n return z.string().trim().optional()\n }\n const shape: Record<string, z.ZodTypeAny> = {}\n for (const locale of locales) {\n shape[locale.id] = z.string().trim().optional()\n }\n return z.object(shape).passthrough()\n}\n\nexport const tagOptionSchema = z.object({\n label: z.string().trim().min(1, {message: 'Label cannot be empty'}),\n value: z.string().trim().min(1, {message: 'Value cannot be empty'}),\n})\n\nexport function getAssetFormSchema(locales?: {id: string}[]) {\n return z.object({\n altText: localizedStringSchema(locales),\n creditLine: localizedStringSchema(locales),\n description: localizedStringSchema(locales),\n opt: z.object({\n media: z.object({\n tags: z.array(tagOptionSchema).nullable(),\n }),\n }),\n originalFilename: z.string().trim().min(1, {message: 'Filename cannot be empty'}),\n title: localizedStringSchema(locales),\n })\n}\n\nexport const assetFormSchema = getAssetFormSchema()\n\nexport const tagFormSchema = z.object({\n name: z.string().min(1, {message: 'Name cannot be empty'}),\n})\n\nexport const folderFormSchema = z.object({\n name: z.string().trim().min(1, {message: 'Name cannot be empty'}),\n})\n","import type {SanityDocument} from '@sanity/client'\n\nexport function getUniqueDocuments(documents: SanityDocument[]): SanityDocument[] {\n const draftIds = documents.reduce(\n (acc: string[], doc: SanityDocument) =>\n doc._id.startsWith('drafts.') ? acc.concat(doc._id.slice(7)) : acc,\n [],\n )\n\n const filteredDocuments: SanityDocument[] = documents.filter(\n (doc: SanityDocument) => !draftIds.includes(doc._id),\n )\n\n return filteredDocuments\n}\n","import type {ImageAsset} from '../types'\n\nconst imageDprUrl = (\n asset: ImageAsset,\n options: {\n width: number\n height?: number\n },\n): string => {\n const dpi =\n typeof window === 'undefined' || !window.devicePixelRatio\n ? 1\n : Math.round(window.devicePixelRatio)\n const imgH = options?.height ? options?.height * Math.max(1, dpi) : undefined\n const imgW = options.width * Math.max(1, dpi)\n\n const urlParams = new URLSearchParams()\n urlParams.append('fit', 'max')\n urlParams.append('w', imgW.toString())\n if (imgH) {\n urlParams.append('h', imgH.toString())\n }\n\n return `${asset.url}?${urlParams.toString()}`\n}\n\nexport default imageDprUrl\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n return Object.keys(formData).reduce((acc: FormData, key) => {\n const val = formData[key]\n\n // TODO: refactor\n if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n acc[key] = sanitizeFormData(val)\n } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n acc[key] = null\n } else if (typeof val === 'string' && val) {\n acc[key] = formData[key].trim()\n } else {\n acc[key] = formData[key]\n }\n\n return acc\n }, {})\n}\n\nexport default sanitizeFormData\n","import type {Asset, FileAsset, ImageAsset} from '../types'\n\nexport const isFileAsset = (asset: Asset): asset is FileAsset => {\n return (asset as FileAsset)._type === 'sanity.fileAsset'\n}\n\nexport const isImageAsset = (asset: Asset): asset is ImageAsset => {\n return (asset as ImageAsset)._type === 'sanity.imageAsset'\n}\n","import {zodResolver} from '@hookform/resolvers/zod'\nimport type {FieldValues, Resolver} from 'react-hook-form'\n\n/**\n * `@hookform/resolvers/zod` resolves its own `zod` typings through dependency\n * hoisting, which in this monorepo lands on zod v4, while this plugin authors its\n * form schemas with zod v3. The resolver accepts v3 schema instances correctly at\n * runtime, so this thin wrapper only bridges the type-only v3/v4 mismatch. The\n * react-hook-form field types stay fully checked at the call sites.\n */\nexport default function zodFormResolver<TFieldValues extends FieldValues>(\n schema: unknown,\n): Resolver<TFieldValues> {\n return zodResolver(\n schema as Parameters<typeof zodResolver>[0],\n ) as unknown as Resolver<TFieldValues>\n}\n","import type {ImageAsset} from '../types'\n\nconst getAssetResolution = (asset: ImageAsset) => {\n return `${asset.metadata.dimensions.width}x${asset.metadata.dimensions.height}px`\n}\n\nexport default getAssetResolution\n","import {usePortal} from '@sanity/ui'\nimport {type PopoverProps} from '@sanity/ui/popover'\n\nexport function usePortalPopoverProps(): PopoverProps {\n const portal = usePortal()\n\n return {\n animate: true,\n constrainSize: true,\n floatingBoundary: portal.element,\n portal: true,\n referenceBoundary: portal.element,\n }\n}\n","import {ClipboardIcon} from '@sanity/icons/Clipboard'\nimport {Button, Text} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport copy from 'copy-to-clipboard'\nimport {useEffect, useRef, useState} from 'react'\n\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\n\ntype Props = {\n disabled?: boolean\n url: string\n}\n\nconst ButtonAssetCopy = ({disabled, url}: Props) => {\n const popoverProps = usePortalPopoverProps()\n const refPopoverTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n const [popoverVisible, setPopoverVisible] = useState(false)\n\n const handleClick = () => {\n if (refPopoverTimeout.current) {\n clearTimeout(refPopoverTimeout.current)\n }\n\n setPopoverVisible(true)\n copy(url)\n\n refPopoverTimeout.current = setTimeout(() => {\n setPopoverVisible(false)\n }, 1250)\n }\n\n // Effects\n useEffect(() => {\n return () => {\n if (refPopoverTimeout.current) {\n clearTimeout(refPopoverTimeout.current)\n }\n }\n }, [])\n\n return (\n <Popover\n content={\n <Text muted size={1}>\n Copied!\n </Text>\n }\n open={popoverVisible}\n padding={2}\n placement=\"top\"\n radius={1}\n {...popoverProps}\n >\n <Button\n disabled={disabled}\n fontSize={1}\n icon={ClipboardIcon}\n mode=\"ghost\"\n onClick={handleClick}\n text=\"Copy URL\"\n />\n </Popover>\n )\n}\n\nexport default ButtonAssetCopy\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {Box, Button, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport {format} from 'date-fns/format'\nimport filesize from 'filesize'\nimport {type ReactNode} from 'react'\n\nimport type {Asset, AssetItem} from '../../types'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport ButtonAssetCopy from '../ButtonAssetCopy'\n\ntype Props = {\n asset: Asset\n item?: AssetItem\n}\n\nconst Row = ({label, value}: {label: string; value: ReactNode}) => {\n return (\n <Flex justify=\"space-between\">\n <Text\n size={1}\n style={{\n opacity: 0.8,\n width: '40%',\n }}\n textOverflow=\"ellipsis\"\n >\n {label}\n </Text>\n <Text\n size={1}\n style={{\n opacity: 0.4,\n textAlign: 'right',\n width: '60%',\n }}\n textOverflow=\"ellipsis\"\n >\n {value}\n </Text>\n </Flex>\n )\n}\n\nconst AssetMetadata = (props: Props) => {\n const {asset, item} = props\n\n const exif = asset?.metadata?.exif\n\n // Callbacks\n const handleDownload = () => {\n window.location.href = `${asset.url}?dl=${asset.originalFilename}`\n }\n\n return (\n <Box marginTop={3}>\n {/* Base */}\n <Box>\n <Stack gap={3}>\n <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n <Row label=\"MIME type\" value={asset?.mimeType} />\n <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n </Stack>\n </Box>\n {/* EXIF */}\n {exif &&\n (exif.DateTimeOriginal ||\n exif.FNumber ||\n exif.FocalLength ||\n exif.ExposureTime ||\n exif.ISO) && (\n <>\n {/* Divider */}\n <Box\n marginY={4}\n style={{\n background: 'var(--card-border-color)',\n height: '1px',\n width: '100%',\n }}\n />\n <Box>\n <Stack gap={3}>\n {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n {exif.ExposureTime && (\n <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n )}\n {exif.DateTimeOriginal && (\n <Row\n label=\"Original date\"\n value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n />\n )}\n </Stack>\n </Box>\n </>\n )}\n\n {/* Asset actions */}\n <Box marginTop={5}>\n <Inline gap={2}>\n {/* Download */}\n <Button\n disabled={!item || item?.updating}\n fontSize={1}\n icon={DownloadIcon}\n mode=\"ghost\"\n onClick={handleDownload}\n text=\"Download\"\n />\n {/* Copy to clipboard */}\n <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n </Inline>\n </Box>\n </Box>\n )\n}\n\nexport default AssetMetadata\n","import {Dialog as SanityDialog} from '@sanity/ui'\nimport {type ComponentProps} from 'react'\n\nconst Dialog = (props: ComponentProps<typeof SanityDialog>) => {\n // HACK: Temporarily force fixed positioning on all @sanity/ui <Dialog /> components.\n // The studio is currently setting absolute positioning on all root-level dialogs on the mobile breakpoint,\n // causing unwanted scroll behaviour.\n return <SanityDialog {...props} style={{position: 'fixed'}} />\n}\n\nexport default Dialog\n","import type {SanityDocument} from '@sanity/client'\nimport {Box, Button, Card, Stack, Text} from '@sanity/ui'\nimport {Preview, type SchemaType, useSchema} from 'sanity'\nimport {useIntentLink} from 'sanity/router'\n\ntype Props = {\n documents: SanityDocument[]\n isLoading: boolean\n}\n\nconst DocumentList = ({documents, isLoading}: Props) => {\n const schema = useSchema()\n\n if (isLoading) {\n return (\n <Text muted size={1}>\n Loading...\n </Text>\n )\n }\n\n if (documents.length === 0) {\n return (\n <Text muted size={1}>\n No documents are referencing this asset\n </Text>\n )\n }\n\n return (\n <Card flex={1} marginBottom={2} padding={2} radius={2} shadow={1}>\n <Stack gap={2}>\n {documents?.map((doc) => (\n <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n ))}\n </Stack>\n </Card>\n )\n}\n\nconst ReferringDocument = (props: {doc: SanityDocument; schemaType?: SchemaType}) => {\n const {doc, schemaType} = props\n\n const {onClick} = useIntentLink({\n intent: 'edit',\n params: {id: doc._id},\n })\n\n return schemaType ? (\n <Button key={doc._id} mode=\"bleed\" onClick={onClick} padding={2} style={{width: '100%'}}>\n <Preview layout=\"default\" schemaType={schemaType} value={doc} />\n </Button>\n ) : (\n <Box padding={2}>\n <Text size={1}>\n A document of the unknown type <em>{doc._type}</em>\n </Text>\n </Box>\n )\n}\n\nexport default DocumentList\n","import {Box, Flex, type Theme} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {defaultStyles, FileIcon as ReactFileIcon} from 'react-file-icon'\nimport type {DefaultExtensionType} from 'react-file-icon'\nimport {styled, css} from 'styled-components'\n\ntype Props = {\n extension?: string\n onClick?: (e: MouseEvent) => void\n width: string\n}\n\n// Force react-file-icon styles\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled(Box)(({theme}: {theme: Theme}) => {\n return css`\n text {\n font-family: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.fonts.text.family\n } !important;\n font-size: 8px !important;\n font-weight: 500 !important;\n }\n `\n})\n\nconst FileIcon = (props: Props) => {\n const {extension, onClick, width} = props\n\n return (\n <Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n <Container style={{width}}>\n {extension ? (\n <ReactFileIcon\n extension={extension}\n {...defaultStyles[extension as DefaultExtensionType]}\n />\n ) : (\n <ReactFileIcon />\n )}\n </Container>\n </Flex>\n )\n}\n\nexport default FileIcon\n","import {Flex} from '@sanity/ui'\n\nimport type {Asset} from '../../types'\nimport FileIcon from '../FileIcon'\n\ntype Props = {\n asset: Asset\n}\n\nconst FileAssetPreview = (props: Props) => {\n const {asset} = props\n\n if (asset.mimeType.search('audio') === 0) {\n return (\n <Flex align=\"center\" justify=\"center\" style={{height: '100%'}}>\n <audio controls src={asset.url} style={{width: '100%'}} />\n </Flex>\n )\n }\n\n if (asset.mimeType.search('video') === 0) {\n return (\n <video\n controls\n src={asset.url}\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }\n\n return <FileIcon extension={asset.extension} width=\"50%\" />\n}\n\nexport default FileAssetPreview\n","import {Box, Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {format} from 'date-fns/format'\nimport {type ReactNode} from 'react'\n\ntype Props = {\n disabled: boolean\n isValid: boolean\n lastUpdated?: string\n onClick: () => void\n}\n\nconst FormSubmitButton = (props: Props) => {\n const {disabled, isValid, lastUpdated, onClick} = props\n\n let content: ReactNode\n if (isValid) {\n if (lastUpdated) {\n content = (\n <>\n Last updated\n <br /> {format(new Date(lastUpdated), 'PPp')}\n </>\n )\n } else {\n content = 'No unpublished changes'\n }\n } else {\n content =\n 'There are validation errors that need to be fixed before this document can be published'\n }\n\n return (\n <Tooltip\n animate\n content={\n <Box padding={3} style={{maxWidth: '185px'}}>\n <Text muted size={1}>\n {content}\n </Text>\n </Box>\n }\n disabled={'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Box>\n <Button\n disabled={disabled}\n fontSize={1}\n onClick={onClick}\n text=\"Save and close\"\n tone=\"primary\"\n />\n </Box>\n </Tooltip>\n )\n}\n\nexport default FormSubmitButton\n","import {hues} from '@sanity/color'\nimport {type ThemeColorSchemeKey, studioTheme} from '@sanity/ui'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {color: themeColor} = studioTheme\n\nconst SCHEME_COLORS = {\n bg: {\n dark: hues.gray[950].hex,\n light: hues.gray[50].hex,\n },\n bg2: {\n dark: hues.gray[900].hex,\n light: hues.gray[100].hex,\n },\n inputEnabledBorder: {\n dark: themeColor.dark.default.input.default.enabled.border,\n light: themeColor.light.default.input.default.enabled.border,\n },\n inputHoveredBorder: {\n dark: themeColor.dark.default.input.default.hovered.border,\n light: themeColor.light.default.input.default.hovered.border,\n },\n mutedHoveredBg: {\n dark: themeColor.dark.primary.muted.primary.hovered.bg,\n light: themeColor.light.primary.muted.primary.hovered.bg,\n },\n mutedHoveredFg: {\n dark: themeColor.dark.primary.muted.primary.hovered.fg,\n light: themeColor.light.primary.muted.primary.hovered.fg,\n },\n mutedSelectedBg: {\n dark: themeColor.dark.primary.muted.primary.selected.bg,\n light: themeColor.light.primary.muted.primary.selected.bg,\n },\n spotBlue: {\n dark: themeColor.dark.primary.spot.blue,\n light: themeColor.light.primary.spot.blue,\n },\n}\n\ntype SchemeColorKey = keyof typeof SCHEME_COLORS\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport function getSchemeColor(scheme: ThemeColorSchemeKey, colorKey: SchemeColorKey): string {\n return SCHEME_COLORS[colorKey]?.[scheme]\n}\n","import type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport type {MouseEvent} from 'react'\nimport {styled, css} from 'styled-components'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n onClick?: (e: MouseEvent) => void\n $showCheckerboard?: boolean\n $scheme?: ThemeColorSchemeKey\n src: string\n style?: any\n}\n\nconst Image = styled.img.attrs({crossOrigin: 'anonymous' as const})<Props>`\n --checkerboard-color: ${(props) =>\n props.$scheme ? getSchemeColor(props.$scheme, 'bg2') : 'inherit'};\n\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n\n ${(props) =>\n props.$showCheckerboard &&\n css`\n background-image:\n linear-gradient(45deg, var(--checkerboard-color) 25%, transparent 25%),\n linear-gradient(-45deg, var(--checkerboard-color) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, var(--checkerboard-color) 75%),\n linear-gradient(-45deg, transparent 75%, var(--checkerboard-color) 75%);\n background-size: 20px 20px;\n background-position:\n 0 0,\n 0 10px,\n 10px -10px,\n -10px 0;\n `}\n`\n\nexport default Image\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {styled} from 'styled-components'\n\ntype Props = {\n description?: string\n error?: string\n label: string\n name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n return {\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst FormFieldInputLabel = (props: Props) => {\n const {description, error, label, name} = props\n\n return (\n <>\n {/* Label */}\n <Box marginY={3}>\n <Inline gap={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n </Box>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text as=\"label\" htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </>\n )\n}\n\nexport default FormFieldInputLabel\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, Flex, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {radius: themeRadius, space: themeSpace} = studioTheme\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n return {\n control: (styles, {isFocused}) => {\n let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n if (isFocused) {\n boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n 0 0 0 1px var(--card-bg-color),\n 0 0 0 3px var(--card-focus-ring-color) !important`\n }\n\n return {\n ...styles,\n 'backgroundColor': 'var(--card-bg-color)',\n 'color': 'inherit',\n 'border': 'none',\n 'borderRadius': themeRadius[1],\n boxShadow,\n 'margin': 0,\n 'minHeight': '35px',\n 'outline': 'none',\n 'padding': rem(themeSpace[1]!),\n 'transition': 'none',\n '&:hover': {\n boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n },\n }\n },\n indicatorsContainer: (styles, {isDisabled}) => ({\n ...styles,\n opacity: isDisabled ? 0.25 : 1,\n }),\n input: (styles) => ({\n ...styles,\n color: 'var(--card-fg-color)',\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n marginLeft: rem(themeSpace[2]!),\n }),\n menuList: (styles) => ({\n ...styles,\n }),\n multiValue: (styles, {isDisabled}) => ({\n ...styles,\n backgroundColor: getSchemeColor(scheme, 'mutedHoveredBg'),\n borderRadius: themeRadius[2],\n opacity: isDisabled ? 0.5 : 1,\n }),\n multiValueLabel: () => ({\n color: getSchemeColor(scheme, 'mutedHoveredFg'),\n fontSize: 'inherit',\n padding: 0,\n }),\n multiValueRemove: (styles) => ({\n ...styles,\n 'borderTopLeftRadius': 0,\n 'borderBottomLeftRadius': 0,\n 'svg': {color: getSchemeColor(scheme, 'mutedHoveredFg')},\n '&:hover': {\n backgroundColor: getSchemeColor(scheme, 'mutedSelectedBg'),\n },\n }),\n noOptionsMessage: (styles) => ({\n ...styles,\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n lineHeight: '1em',\n }),\n option: (styles, {isFocused}) => ({\n ...styles,\n 'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n 'borderRadius': themeRadius[2],\n 'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n 'padding': `${rem(themeSpace[1]!)} ${rem(themeSpace[2]!)}`,\n '&:hover': {\n backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n color: getSchemeColor(scheme, 'bg'),\n },\n }),\n placeholder: (styles) => ({\n ...styles,\n marginLeft: rem(themeSpace[2]!),\n }),\n valueContainer: (styles) => ({\n ...styles,\n margin: 0,\n padding: 0,\n }),\n }\n}\n\nconst DropdownIndicator = (props: any) => {\n return (\n <components.DropdownIndicator {...props}>\n <Box paddingX={2}>\n <Text size={1}>\n <ChevronDownIcon />\n </Text>\n </Box>\n </components.DropdownIndicator>\n )\n}\n\nconst Menu = (props: any) => {\n return (\n <components.Menu {...props}>\n <Card radius={1} shadow={2}>\n {props.children}\n </Card>\n </components.Menu>\n )\n}\n\nconst MenuList = (props: any) => {\n const {children} = props\n\n const MAX_ROWS = 5\n const OPTION_HEIGHT = 37\n\n if (Array.isArray(children)) {\n const height =\n children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n return (\n <Virtuoso\n className=\"media__custom-scrollbar\"\n itemContent={(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }}\n style={{height}}\n totalCount={children.length}\n />\n )\n }\n return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst MultiValueLabel = (props: any) => {\n return (\n <Box padding={2} paddingRight={1}>\n <Text size={1} weight=\"medium\">\n <components.MultiValueLabel {...props} />\n </Text>\n </Box>\n )\n}\n\nconst MultiValueRemove = (props: any) => {\n return (\n <components.MultiValueRemove {...props}>\n <CloseIcon color=\"#1f2123\" />\n </components.MultiValueRemove>\n )\n}\n\nconst Option = (props: any) => {\n return (\n <Box paddingX={1} paddingY={1}>\n <components.Option {...props}>\n <Flex align=\"center\">\n {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n {props.children}\n </Flex>\n </components.Option>\n </Box>\n )\n}\n\nexport const reactSelectComponents = {\n DropdownIndicator,\n IndicatorSeparator: null,\n Menu,\n MenuList,\n MultiValueLabel,\n MultiValueRemove,\n Option,\n}\n","import {Box} from '@sanity/ui'\nimport {Controller} from 'react-hook-form'\nimport CreatableSelect from 'react-select/creatable'\nimport {useColorSchemeValue} from 'sanity'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/creatable'\nimport type {TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n control: any\n description?: string\n disabled?: boolean\n error?: string\n label: string\n name: string\n onCreateTag: (tagName: string) => void\n options: {\n label: string\n value: string\n }[]\n placeholder?: string\n value?: TagSelectOption[] | null\n}\n\nconst FormFieldInputTags = (props: Props) => {\n const {\n control,\n description,\n disabled,\n error,\n label,\n name,\n onCreateTag,\n options,\n placeholder,\n value,\n } = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const creating = useTypedSelector((state) => state.tags.creating)\n const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n return (\n <Box\n // HACK: force stacking context to ensure react-select dropdown sits above other fields\n style={{zIndex: 2}}\n >\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n {/* Select */}\n <Controller\n control={control}\n defaultValue={value}\n name={name}\n render={({field}) => {\n const {onBlur, onChange, value: controllerValue} = field\n // TODO: investigate overriding `onChange` and updating form state manually.\n // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n //\n // To illustrate this issue:\n // - Edit an asset with no tags\n // - Add a new tag (either an existing one, or create one inline)\n // - Remove the tag you've just created\n //\n // At this point, the form will still be marked as dirty when it shouldnt be\n return (\n <CreatableSelect\n components={reactSelectComponents}\n instanceId=\"tags\"\n isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n isDisabled={creating || disabled || tagsFetching}\n isLoading={creating}\n isMulti\n name={name}\n noOptionsMessage={() => 'No tags'}\n onBlur={onBlur}\n onChange={onChange}\n onCreateOption={onCreateTag}\n options={options}\n placeholder={tagsFetching ? 'Loading...' : placeholder}\n styles={reactSelectStyles(scheme)}\n value={controllerValue}\n />\n )\n }}\n />\n </Box>\n )\n}\n\nexport default FormFieldInputTags\n","import {Box, TextInput} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: string\n label: string\n name: string\n onBlur?: FocusEventHandler<HTMLInputElement>\n onChange?: ChangeEventHandler<HTMLInputElement>\n placeholder?: string\n value?: string\n ref?: Ref<HTMLInputElement>\n}\n\nconst FormFieldInputText = (props: Props) => {\n const {\n description,\n disabled,\n error,\n label,\n name,\n onBlur,\n onChange,\n placeholder,\n value,\n ref,\n ...rest\n } = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n {/* Input */}\n <TextInput\n {...rest}\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n />\n </Box>\n )\n}\n\nexport default FormFieldInputText\n","import {Box, TextArea} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: string\n label: string\n name: string\n onBlur?: FocusEventHandler<HTMLTextAreaElement>\n onChange?: ChangeEventHandler<HTMLTextAreaElement>\n placeholder?: string\n rows?: number\n value?: string\n ref?: Ref<HTMLTextAreaElement>\n}\n\nconst FormFieldInputTextarea = (props: Props) => {\n const {\n description,\n disabled,\n error,\n label,\n name,\n onBlur,\n onChange,\n placeholder,\n rows,\n value,\n ref,\n ...rest\n } = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n {/* Input */}\n <TextArea\n {...rest}\n autoComplete=\"off\"\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n rows={rows}\n />\n </Box>\n )\n}\n\nexport default FormFieldInputTextarea\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type Control, type FieldErrors, type UseFormRegister} from 'react-hook-form'\n\nimport type {Asset, AssetFormData, Locale, TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\nimport FormFieldInputTags from '../FormFieldInputTags'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormFieldInputTextarea from '../FormFieldInputTextarea'\n\ntype LocalizedErrors = Record<string, {message?: string} | undefined>\n\n// When locales are not configured, extract a plain string from a potentially localized field\nfunction toStringField(value: unknown): string | undefined {\n if (typeof value === 'string') return value\n if (typeof value === 'object' && value !== null) {\n const found = Object.values(value as Record<string, string>).find((v) => v)\n return found || undefined\n }\n return undefined\n}\n\nfunction truncateFolderPath(path?: string): string | undefined {\n const segments = path?.split('/').filter(Boolean)\n if (!segments || segments.length <= 3) return path\n return [segments[0], '...', ...segments.slice(-2)].join('/')\n}\n\nexport type DetailsProps = {\n formUpdating: boolean\n handleCreateTag: (title: string) => void\n control: Control<AssetFormData>\n errors: FieldErrors<AssetFormData>\n register: UseFormRegister<AssetFormData>\n allTagOptions: TagSelectOption[]\n assetTagOptions: TagSelectOption[] | null\n currentAsset: Asset\n folderPath?: string\n folderMissing?: boolean\n onChangeFolder: () => void\n onRemoveFolder: () => void\n creditLine?: {\n enabled: boolean\n excludeSources?: string | string[] | undefined\n }\n locales?: Locale[]\n}\n\nexport default function Details({\n formUpdating,\n handleCreateTag,\n control,\n errors,\n register,\n allTagOptions,\n assetTagOptions,\n currentAsset,\n folderPath,\n folderMissing,\n onChangeFolder,\n onRemoveFolder,\n creditLine,\n locales,\n}: DetailsProps) {\n 'use no memo'\n // React Compiler memoizes the register() field JSX using asset-derived deps only.\n // That can leave Save stuck disabled while the DOM still updates (uncontrolled inputs).\n // Tags work because they use Controller; string fields use register and need this opt-out.\n\n const hasLocales = locales && locales.length > 0\n const [activeLocaleTab, setActiveLocaleTab] = useState(0)\n const folderId = currentAsset?.opt?.media?.folder?._ref\n const folderLabel =\n truncateFolderPath(folderPath) || (folderMissing ? 'Folder no longer exists' : 'No folder')\n\n return (\n <Stack gap={3}>\n {/* Tags */}\n <FormFieldInputTags\n control={control}\n disabled={formUpdating}\n error={errors?.opt?.media?.tags?.message}\n label=\"Tags\"\n name=\"opt.media.tags\"\n onCreateTag={handleCreateTag}\n options={allTagOptions}\n placeholder=\"Select or create...\"\n value={assetTagOptions}\n />\n {/* Folder */}\n <Box>\n <FormFieldInputLabel label=\"Folder\" name=\"folder\" />\n <Card border padding={2} radius={2}>\n <Flex align=\"center\" gap={3} justify=\"space-between\">\n <Flex\n align=\"center\"\n gap={2}\n flex={1}\n style={{minWidth: 0, overflowX: 'auto', whiteSpace: 'nowrap', overflowY: 'hidden'}}\n >\n <FolderIcon />\n <Text muted={!folderId} size={1}>\n {folderLabel}\n </Text>\n </Flex>\n {folderId && (\n <Button\n aria-label=\"Remove from folder\"\n disabled={formUpdating}\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={onRemoveFolder}\n padding={2}\n tone=\"critical\"\n type=\"button\"\n />\n )}\n <Button\n padding={2}\n disabled={formUpdating}\n fontSize={1}\n mode=\"ghost\"\n onClick={onChangeFolder}\n text={folderId ? 'Change folder' : 'Add to folder'}\n type=\"button\"\n />\n </Flex>\n </Card>\n </Box>\n {/* Filename */}\n <FormFieldInputText\n {...register('originalFilename')}\n disabled={formUpdating}\n error={errors?.originalFilename?.message}\n label=\"Filename\"\n name=\"originalFilename\"\n value={currentAsset?.originalFilename}\n />\n {/* Localized fields grouped by language */}\n {hasLocales ? (\n <Card marginTop={2} shadow={1} padding={3} radius={1}>\n <Stack gap={2}>\n <TabList gap={2}>\n {locales.map((locale, idx) => (\n <Tab\n key={locale.id}\n id={`locale-tab-${locale.id}`}\n aria-controls={`locale-panel-${locale.id}`}\n selected={activeLocaleTab === idx}\n onClick={() => setActiveLocaleTab(idx)}\n label={locale.title}\n />\n ))}\n </TabList>\n {locales.map((locale, idx) => (\n <TabPanel\n key={locale.id}\n id={`locale-panel-${locale.id}`}\n aria-labelledby={`locale-tab-${locale.id}`}\n hidden={activeLocaleTab !== idx}\n >\n <Stack gap={3}>\n <FormFieldInputText\n {...register(`title.${locale.id}` as const)}\n disabled={formUpdating}\n error={(errors?.title as LocalizedErrors)?.[locale.id]?.message}\n label=\"Title\"\n name={`title.${locale.id}`}\n />\n <FormFieldInputText\n {...register(`altText.${locale.id}` as const)}\n disabled={formUpdating}\n error={(errors?.altText as LocalizedErrors)?.[locale.id]?.message}\n label=\"Alt Text\"\n name={`altText.${locale.id}`}\n />\n <FormFieldInputTextarea\n {...register(`description.${locale.id}` as const)}\n disabled={formUpdating}\n error={(errors?.description as LocalizedErrors)?.[locale.id]?.message}\n label=\"Description\"\n name={`description.${locale.id}`}\n rows={5}\n />\n {creditLine?.enabled && (\n <FormFieldInputText\n {...register(`creditLine.${locale.id}` as const)}\n error={(errors?.creditLine as LocalizedErrors)?.[locale.id]?.message}\n label=\"Credit\"\n name={`creditLine.${locale.id}`}\n disabled={\n formUpdating ||\n creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n }\n />\n )}\n </Stack>\n </TabPanel>\n ))}\n </Stack>\n </Card>\n ) : (\n <>\n <FormFieldInputText\n {...register('title')}\n disabled={formUpdating}\n error={errors?.title?.message}\n label=\"Title\"\n name=\"title\"\n value={toStringField(currentAsset?.title)}\n />\n <FormFieldInputText\n {...register('altText')}\n disabled={formUpdating}\n error={errors?.altText?.message}\n label=\"Alt Text\"\n name=\"altText\"\n value={toStringField(currentAsset?.altText)}\n />\n <FormFieldInputTextarea\n {...register('description')}\n disabled={formUpdating}\n error={errors?.description?.message}\n label=\"Description\"\n name=\"description\"\n rows={5}\n />\n {creditLine?.enabled && (\n <FormFieldInputText\n {...register('creditLine')}\n error={errors?.creditLine?.message}\n label=\"Credit\"\n name=\"creditLine\"\n value={toStringField(currentAsset?.creditLine)}\n disabled={\n formUpdating || creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n }\n />\n )}\n </>\n )}\n </Stack>\n )\n}\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {type SubmitHandler, useForm, useFormState} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue, useDocumentStore} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {getAssetFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {selectFolderPathById} from '../../modules/folders'\nimport {selectTags, selectTagSelectOptions, tagsActions} from '../../modules/tags'\nimport type {Asset, AssetFormData, DialogAssetEditProps, TagSelectOption} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport AssetMetadata from '../AssetMetadata'\nimport Dialog from '../Dialog'\nimport DocumentList from '../DocumentList'\nimport FileAssetPreview from '../FileAssetPreview'\nimport FormSubmitButton from '../FormSubmitButton'\nimport Image from '../Image'\nimport Details, {type DetailsProps} from './Details'\n\nfunction renderDefaultDetails(props: DetailsProps) {\n return <Details {...props} />\n}\n\ntype Props = {\n children: ReactNode\n dialog: DialogAssetEditProps\n}\n\nconst DialogAssetEdit = (props: Props) => {\n const {\n children,\n dialog: {assetId, id, lastCreatedTag, lastRemovedTagIds},\n } = props\n\n const client = useVersionedClient()\n const scheme = useColorSchemeValue()\n\n const documentStore = useDocumentStore()\n\n const dispatch = useDispatch()\n const assetItem = useTypedSelector((state) => selectAssetById(state, String(assetId))) // TODO: check casting\n const tags = useTypedSelector(selectTags)\n\n const assetUpdatedPrev = useRef<string | undefined>(undefined)\n\n // Generate a snapshot of the current asset\n const [assetSnapshot, setAssetSnapshot] = useState(assetItem?.asset)\n const [tabSection, setTabSection] = useState<'details' | 'references'>('details')\n\n const currentAsset = assetItem ? assetItem?.asset : assetSnapshot\n const allTagOptions = getTagSelectOptions(tags)\n\n const assetTagOptions = useTypedSelector(selectTagSelectOptions(currentAsset))\n const currentFolderId = currentAsset?.opt?.media?.folder?._ref ?? null\n const currentFolderPath = useTypedSelector((state) =>\n selectFolderPathById(state, currentFolderId),\n )\n\n // Check if credit line options are configured\n const {creditLine, components: {details: CustomDetails} = {}, locales} = useToolOptions()\n\n const generateDefaultValues = useCallback(\n (asset?: Asset): AssetFormData => {\n let imageDescription: string | undefined\n if (asset && isImageAsset(asset)) {\n const raw = asset.metadata?.image?.['ImageDescription']\n if (typeof raw === 'string') {\n imageDescription = raw\n }\n }\n\n if (locales && locales.length > 0) {\n const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n const obj: Record<string, string> = {}\n for (let i = 0; i < locales.length; i++) {\n const locale = locales[i]!\n // Prefer key presence over truthiness so an intentional empty string\n // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n if (typeof field === 'object' && field && locale.id in field) {\n obj[locale.id] = field[locale.id] ?? ''\n } else if (typeof field === 'string') {\n // Only populate the first locale to avoid spreading a legacy value\n // across all languages; the user should fill in other translations manually\n obj[locale.id] = i === 0 ? field : ''\n } else if (typeof field === 'object' && field) {\n // Localized object present but this locale key is missing: leave empty.\n // Do not apply EXIF fallback to partial translations.\n obj[locale.id] = ''\n } else {\n // No description set at all — EXIF fallback only for the first locale.\n obj[locale.id] = i === 0 ? fallback : ''\n }\n }\n return obj\n }\n return {\n altText: makeLocaleObj(asset?.altText),\n creditLine: makeLocaleObj(asset?.creditLine),\n description: makeLocaleObj(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: makeLocaleObj(asset?.title),\n }\n }\n // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n const flattenField = (field: unknown, fallback = ''): string => {\n if (typeof field === 'string') return field\n if (typeof field === 'object' && field !== null) {\n const values = Object.values(field as Record<string, string>)\n return values.find((v) => v) || fallback\n }\n return fallback\n }\n return {\n altText: flattenField(asset?.altText),\n creditLine: flattenField(asset?.creditLine),\n description: flattenField(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: flattenField(asset?.title),\n }\n },\n [assetTagOptions, locales],\n )\n\n const {control, getValues, handleSubmit, register, reset, setValue} = useForm<AssetFormData>({\n defaultValues: generateDefaultValues(assetItem?.asset),\n mode: 'onChange',\n resolver: zodFormResolver<AssetFormData>(getAssetFormSchema(locales)),\n })\n\n // Subscribe via useFormState so React Compiler cannot skip formState Proxy reads\n // that gate the Save button (isDirty / isValid).\n const {errors, isDirty, isValid} = useFormState({control})\n\n const formUpdating = !assetItem || assetItem?.updating\n\n const handleClose = useCallback(() => {\n dispatch(dialogActions.remove({id}))\n }, [dispatch, id])\n\n const handleDelete = useCallback(() => {\n if (!assetItem?.asset) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteAssets({\n assets: [assetItem],\n closeDialogId: assetItem?.asset._id,\n }),\n )\n }, [assetItem, dispatch])\n\n const handleAssetUpdate = useCallback((update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate asset snapshot\n setAssetSnapshot(result as Asset)\n }\n }, [])\n\n const handleCreateTag = useCallback(\n (tagName: string) => {\n // Dispatch action to create new tag\n dispatch(\n tagsActions.createRequest({\n assetId: currentAsset?._id,\n name: tagName,\n }),\n )\n },\n [currentAsset?._id, dispatch],\n )\n\n const handleChangeFolder = useCallback(() => {\n if (!assetItem) {\n return\n }\n\n dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n }, [assetItem, currentFolderId, dispatch])\n\n const handleRemoveFolder = useCallback(() => {\n if (!assetItem || !currentFolderId) {\n return\n }\n\n dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n }, [assetItem, currentFolderId, dispatch])\n\n // Detect if asset has localized fields (objects) with keys not in the configured locales\n const hasOrphanedLocales = useMemo(() => {\n if (!currentAsset) return false\n const isLocaleObj = (v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)\n const fields = [\n currentAsset.title,\n currentAsset.altText,\n currentAsset.description,\n ...(currentAsset._type === 'sanity.imageAsset' ? [currentAsset.creditLine] : []),\n ]\n const anyLocalized = fields.some((f) => isLocaleObj(f))\n if (!anyLocalized) return false\n if (!locales || locales.length === 0) return true\n const configuredIds = new Set(locales.map((l) => l.id))\n return fields.some((f) => {\n if (!isLocaleObj(f)) return false\n return Object.keys(f as object).some((k) => !configuredIds.has(k))\n })\n }, [currentAsset, locales])\n\n const handleCleanupLocales = useCallback(async () => {\n if (!currentAsset) return\n\n const cleanField = (field: unknown): unknown => {\n if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n const obj = field as Record<string, string>\n if (!locales || locales.length === 0) {\n // Pick the first non-empty value sorted by key for determinism\n const sorted = Object.keys(obj).sort()\n return sorted.map((k) => obj[k]).find((v) => v) || ''\n }\n const configuredIds = new Set(locales.map((l) => l.id))\n const cleaned: Record<string, string> = {}\n for (const [key, val] of Object.entries(obj)) {\n if (configuredIds.has(key)) cleaned[key] = val\n }\n return cleaned\n }\n\n await client\n .patch(currentAsset._id)\n .set({\n title: cleanField(currentAsset.title),\n altText: cleanField(currentAsset.altText),\n description: cleanField(currentAsset.description),\n ...(currentAsset._type === 'sanity.imageAsset' && {\n creditLine: cleanField(currentAsset.creditLine),\n }),\n })\n .commit()\n }, [client, currentAsset, locales])\n\n // Submit react-hook-form\n const onSubmit: SubmitHandler<AssetFormData> = useCallback(\n (formData) => {\n if (!assetItem?.asset) {\n return\n }\n\n const sanitizedFormData = sanitizeFormData(formData)\n\n // Keep an intentionally cleared description as '' (not null) so the EXIF\n // ImageDescription fallback does not refill it the next time the dialog opens.\n if (formData.description === '') {\n sanitizedFormData['description'] = ''\n }\n\n dispatch(\n assetsActions.updateRequest({\n asset: assetItem?.asset,\n closeDialogId: assetItem?.asset._id,\n formData: {\n ...sanitizedFormData,\n // Map tags to sanity references\n opt: {\n media: {\n ...sanitizedFormData['opt'].media,\n tags:\n sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n _ref: tag.value,\n _type: 'reference',\n _weak: true,\n })) || null,\n // Preserve the folder reference — it is managed separately and must\n // not be wiped when patching opt.media via .set().\n ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n },\n },\n },\n }),\n )\n },\n [assetItem?.asset, currentAsset, dispatch],\n )\n\n // Listen for asset mutations and update snapshot\n useEffect(() => {\n if (!assetItem?.asset) {\n return undefined\n }\n\n // Remember that Sanity listeners ignore joins, order clauses and projections\n const subscriptionAsset = client\n .listen(groq`*[_id == $id]`, {id: assetItem?.asset._id})\n .subscribe(handleAssetUpdate)\n\n return () => {\n subscriptionAsset?.unsubscribe()\n }\n }, [assetItem?.asset, client, handleAssetUpdate])\n\n // Update tags form field (react-select) when a new _inline_ tag has been created\n useEffect(() => {\n if (lastCreatedTag) {\n const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n const updatedTags = existingTags.concat([lastCreatedTag])\n setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n }\n }, [getValues, lastCreatedTag, setValue])\n\n // Update tags form field (react-select) when an _inline_ tag has been removed elsewhere\n useEffect(() => {\n if (lastRemovedTagIds) {\n const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n const updatedTags = existingTags.filter((tag) => {\n return !lastRemovedTagIds.includes(tag.value)\n })\n\n setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n }\n }, [getValues, lastRemovedTagIds, setValue])\n\n // Reset react-hook-form local state on mount and every time the asset has been updated elsewhere\n useEffect(() => {\n if (assetUpdatedPrev.current !== assetItem?.asset._updatedAt) {\n reset(generateDefaultValues(assetItem?.asset))\n }\n assetUpdatedPrev.current = assetItem?.asset._updatedAt\n }, [assetItem?.asset, generateDefaultValues, reset])\n\n const footer = (\n <Box padding={3}>\n <Stack gap={3}>\n {hasOrphanedLocales && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Text size={1}>\n This asset has localized fields that are no longer configured. Clean them up to\n avoid validation errors.\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleCleanupLocales}\n text=\"Cleanup localized fields\"\n tone=\"caution\"\n />\n </Flex>\n </Card>\n )}\n <Flex justify=\"space-between\">\n {/* Delete button */}\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n isValid={isValid}\n lastUpdated={currentAsset?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Stack>\n </Box>\n )\n\n if (!currentAsset) {\n return null\n }\n\n const detailsProps = {\n control,\n errors,\n formUpdating,\n register,\n setValue,\n assetTagOptions,\n allTagOptions,\n handleCreateTag,\n currentAsset,\n folderPath: currentFolderPath,\n folderMissing: !!currentFolderId && !currentFolderPath,\n onChangeFolder: handleChangeFolder,\n onRemoveFolder: handleRemoveFolder,\n creditLine,\n locales,\n }\n\n return (\n <Dialog animate footer={footer} header=\"Asset details\" id={id} onClose={handleClose} width={3}>\n {/*\n We reverse direction to ensure the download button doesn't appear (in the DOM) before other tabbable items.\n This ensures that the dialog doesn't scroll down to the download button (which on smaller screens, can sometimes\n be below the fold).\n */}\n <Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n documentStore={documentStore}\n id={currentAsset._id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n return (\n <>\n {/* Tabs */}\n <TabList gap={2}>\n <Tab\n aria-controls=\"details-panel\"\n disabled={formUpdating}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTabSection('details')}\n selected={tabSection === 'details'}\n size={2}\n />\n <Tab\n aria-controls=\"references-panel\"\n disabled={formUpdating}\n id=\"references-tab\"\n label={`References${\n !isLoading && Array.isArray(uniqueReferringDocuments)\n ? ` (${uniqueReferringDocuments.length})`\n : ''\n }`}\n onClick={() => setTabSection('references')}\n selected={tabSection === 'references'}\n size={2}\n />\n </TabList>\n\n {/* Form fields */}\n <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!assetItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Panel: details */}\n <TabPanel\n aria-labelledby=\"details\"\n hidden={tabSection !== 'details'}\n id=\"details-panel\"\n >\n {CustomDetails ? (\n <CustomDetails\n {...detailsProps}\n renderDefaultDetails={renderDefaultDetails}\n />\n ) : (\n <Details {...detailsProps} />\n )}\n </TabPanel>\n\n {/* Panel: References */}\n <TabPanel\n aria-labelledby=\"references\"\n hidden={tabSection !== 'references'}\n id=\"references-panel\"\n >\n <Box marginTop={5}>\n {assetItem?.asset && (\n <DocumentList\n documents={uniqueReferringDocuments}\n isLoading={isLoading}\n />\n )}\n </Box>\n </TabPanel>\n </Box>\n </>\n )\n }}\n </WithReferringDocuments>\n </Box>\n\n <Box flex={1} padding={4}>\n <Box style={{aspectRatio: '1'}}>\n {/* File */}\n {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n {/* Image */}\n {isImageAsset(currentAsset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n />\n )}\n </Box>\n\n {/* Metadata */}\n {currentAsset && (\n <Box marginTop={4}>\n <AssetMetadata asset={currentAsset} item={assetItem} />\n </Box>\n )}\n </Box>\n </Flex>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogAssetEdit\n","import {createSelector} from '@reduxjs/toolkit'\n\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../types'\nimport {selectCurrentFolderChildren} from './folders'\nimport type {RootReducerState} from './types'\n\nexport const selectCombinedItems = createSelector(\n [\n (state: RootReducerState) => state.assets.allIds,\n (state: RootReducerState) => state.uploads.allIds,\n selectCurrentFolderChildren,\n ],\n (assetIds, uploadIds, folderChildren) => {\n const assetItems = assetIds.map((id): CardAssetData => ({id, type: 'asset'}))\n const folderItems = folderChildren.map((folder): CardFolderData => ({\n id: `folder:${folder.id}`,\n folderId: folder.id,\n name: folder.name,\n path: folder.path,\n totalCount: folder.totalCount,\n type: 'folder',\n }))\n const uploadItems = uploadIds.map((id): CardUploadData => ({id, type: 'upload'}))\n const combinedItems: (CardAssetData | CardFolderData | CardUploadData)[] = [\n ...folderItems,\n ...uploadItems,\n ...assetItems,\n ]\n return combinedItems\n },\n)\n","import {isHotkey} from 'is-hotkey-esm'\nimport {type RefObject, useCallback, useEffect, useRef} from 'react'\n\nconst useKeyPress = (hotkey: string, onPress?: () => void): RefObject<boolean> => {\n const keyPressed = useRef(false)\n\n // If pressed key is our target key then set to true\n const downHandler = useCallback(\n (e: KeyboardEvent) => {\n if (isHotkey(hotkey, e)) {\n keyPressed.current = true\n if (onPress) {\n onPress()\n }\n }\n },\n [hotkey, onPress],\n )\n\n // If released key is our target key then set to false\n const upHandler = useCallback(() => {\n keyPressed.current = false\n }, [])\n\n // Add event listeners\n useEffect(() => {\n window.addEventListener('keydown', downHandler)\n window.addEventListener('keyup', upHandler)\n // Remove event listeners on cleanup\n return () => {\n window.removeEventListener('keydown', downHandler)\n window.removeEventListener('keyup', upHandler)\n }\n }, [downHandler, upHandler])\n\n return keyPressed\n}\n\nexport default useKeyPress\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n Box,\n Checkbox,\n Container,\n Flex,\n Spinner,\n Text,\n type Theme,\n type ThemeColorSchemeKey,\n} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {memo, type MouseEvent, type RefObject} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n id: string\n selected: boolean\n source?: string\n}\n\nconst CardWrapper = styled(Flex)`\n box-sizing: border-box;\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n`\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst CardContainer = styled(Flex)<{$picked?: boolean; theme: Theme; $updating?: boolean}>(({\n $picked,\n theme,\n $updating,\n}) => {\n return css`\n border: 1px solid transparent;\n height: 100%;\n pointer-events: ${$updating ? 'none' : 'auto'};\n position: relative;\n transition: all 300ms;\n user-select: none;\n width: 100%;\n\n border: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n $picked ? `1px solid ${theme.sanity.color.spot.orange} !important` : '1px solid inherit'\n };\n\n ${\n !$updating &&\n css`\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n border: 1px solid var(--card-border-color);\n }\n }\n `\n }\n `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n $scheme,\n}) => {\n return css`\n cursor: pointer;\n height: ${PANEL_HEIGHT}px;\n transition: all 300ms;\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `\n})\n\nconst StyledWarningOutlineIcon = styled(WarningFilledIcon)(({theme}) => {\n return {\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst CardAsset = (props: Props) => {\n const {id, selected, source} = props\n\n const scheme = useColorSchemeValue()\n const toast = useToast()\n\n // Refs\n const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n // Redux\n const dispatch = useDispatch()\n const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n const item = useTypedSelector((state) => selectAssetById(state, id))\n // Dialog carries the replace target so search refetch (which clears allIds/picks) is safe.\n const dialogReplaceAssetId = useTypedSelector((state) => {\n if (source !== 'replace-asset') {\n return undefined\n }\n const dialog = state.dialog.items.find((d) => d.type === 'dialogAllAssets')\n return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n })\n\n const asset = item?.asset\n const error = item?.error\n const isOpaque = item?.asset?.metadata?.isOpaque\n const picked = item?.picked\n const updating = item?.updating\n\n // Prefer dialog assetId; fall back to the single currently-picked asset (not lastPicked).\n const assetToReplaceId =\n dialogReplaceAssetId ??\n (source === 'replace-asset' && assetsPicked.length === 1\n ? assetsPicked[0]?.asset._id\n : undefined)\n\n const assetToReplace = useTypedSelector((state) =>\n assetToReplaceId ? selectAssetById(state, assetToReplaceId) : undefined,\n )\n\n const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n // Short circuit if no asset is available\n if (!asset) {\n return null\n }\n\n const handleReplaceAsset = () => {\n if (!assetToReplaceId || !isImageAsset(asset) || assetToReplace?.updating) {\n return\n }\n\n dispatch(assetsActions.updateImageReferences({asset, id: assetToReplaceId}))\n toast.push({\n status: 'info',\n title:\n 'Updating in progress. Depending on the amount of changes, this could take a few minutes.',\n })\n dispatch(dialogActions.clear())\n }\n\n // Callbacks\n const handleAssetClick = (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (source === 'replace-asset') {\n handleReplaceAsset()\n return\n }\n\n if (selected) {\n return\n }\n\n if (onSelect && !isMultiSelect) {\n onSelect([\n {\n kind: 'assetDocumentId',\n value: asset._id,\n },\n ])\n } else if (onSelect && isMultiSelect) {\n if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n } else if (shiftPressed.current) {\n if (picked) {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n } else {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n }\n } else {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n }\n }\n\n const handleContextActionClick = (e: MouseEvent) => {\n e.stopPropagation()\n\n if (source === 'replace-asset') {\n handleReplaceAsset()\n return\n }\n\n if (selected) {\n return\n }\n\n if (onSelect && !isMultiSelect) {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n } else if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n }\n\n const opacityContainer = updating ? 0.5 : 1\n const opacityPreview = selected || updating ? 0.25 : 1\n\n return (\n <CardWrapper padding={1}>\n <CardContainer direction=\"column\" $picked={picked} $updating={item.updating}>\n {/* Image */}\n <Box\n flex={1}\n style={{\n cursor: selected ? 'default' : 'pointer',\n position: 'relative',\n }}\n >\n <div\n data-testid={`media-asset-card-${asset._id}`}\n onClick={handleAssetClick}\n style={{height: '100%', opacity: opacityPreview}}\n >\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 250, width: 250})}\n style={{\n draggable: false,\n transition: 'opacity 1000ms',\n }}\n />\n )}\n </div>\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n opacity: opacityContainer,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n </Box>\n\n {/* Footer */}\n <ContextActionContainer\n align=\"center\"\n onClick={handleContextActionClick}\n paddingX={1}\n $scheme={scheme}\n style={{opacity: opacityContainer}}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n flexShrink: 0,\n pointerEvents: 'none',\n transform: 'scale(0.8)',\n }}\n />\n )}\n\n <Box marginLeft={2}>\n <Text muted size={0} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>\n </ContextActionContainer>\n\n {/* TODO: DRY */}\n {/* Error button */}\n {error && (\n <Box\n padding={3}\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningOutlineIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )}\n </CardContainer>\n </CardWrapper>\n )\n}\n\nexport default memo(CardAsset)\n","import {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n folderId: string\n name: string\n totalCount: number\n}\n\nconst CardWrapper = styled(Flex)`\n box-sizing: border-box;\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n`\n\nconst FolderCard = styled(Card)`\n cursor: pointer;\n height: 100%;\n transition: border-color 200ms ease;\n width: 100%;\n\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n border-color: var(--card-border-color);\n }\n }\n`\n\nconst FolderGlyph = styled(Box)(\n ({theme}) => css`\n align-items: flex-end;\n background: linear-gradient(\n 180deg,\n ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n }\n 0%,\n ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n }\n 100%\n );\n border-radius: 8px;\n display: flex;\n height: 72px;\n position: relative;\n width: 96px;\n\n &::before {\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n };\n border-radius: 8px 8px 0 0;\n content: '';\n height: 18px;\n left: 0;\n position: absolute;\n top: -8px;\n width: 38px;\n }\n `,\n)\n\nconst CardFolder = ({folderId, name, totalCount}: Props) => {\n const dispatch = useDispatch()\n const scheme = useColorSchemeValue()\n\n return (\n <CardWrapper padding={1}>\n <FolderCard\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n padding={3}\n radius={2}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n }}\n >\n <Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n <Flex align=\"center\" flex={1} justify=\"center\">\n <FolderGlyph />\n </Flex>\n\n <Stack gap={2}>\n <Text\n size={1}\n style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n weight=\"semibold\"\n >\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.2em'}}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Stack>\n </Flex>\n </FolderCard>\n </CardWrapper>\n )\n}\n\nexport default CardFolder\n","import {Observable, from, of} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nconst PREVIEW_WIDTH = 180 // px\n\nconst createBlob = (img: HTMLImageElement): Promise<Blob | null> => {\n return new Promise((resolve) => {\n const imageAspect = img.width / img.height\n\n // Create a canvas element which we'll use to generate a low resolution preview.\n // Ensure that the canvas is at least 1 pixel high as blob generation will fail otherwise.\n const canvas: HTMLCanvasElement = document.createElement('canvas')\n canvas.width = PREVIEW_WIDTH\n canvas.height = Math.max(PREVIEW_WIDTH / imageAspect, 1)\n\n // Fail silently if we're unable to generate a preview image.\n // This can often be the case when trying to render SVGs containing `<foreignObject>` elements.\n try {\n const ctx = canvas.getContext('2d')\n ctx?.drawImage(img, 0, 0, PREVIEW_WIDTH, PREVIEW_WIDTH / imageAspect)\n canvas.toBlob(resolve, 'image/jpeg')\n } catch (err) {\n console.warn(`Unable to generate preview image:`, err)\n }\n })\n}\n\nconst createImageEl = (file: File): Promise<HTMLImageElement> => {\n return new Promise((resolve) => {\n const blobUrlLarge = window.URL.createObjectURL(file)\n const img = new Image()\n img.onload = () => {\n window.URL.revokeObjectURL(blobUrlLarge)\n resolve(img)\n }\n img.src = blobUrlLarge\n })\n}\n\nconst generatePreviewBlobUrl = async (file: File): Promise<string> => {\n const imageEl = await createImageEl(file)\n const blob = await createBlob(imageEl)\n\n if (!blob) {\n throw Error('Unable to generate file Blob')\n }\n\n return window.URL.createObjectURL(blob)\n}\n\nexport const generatePreviewBlobUrl$ = (file: File): Observable<string> => {\n return of(null).pipe(mergeMap(() => from(generatePreviewBlobUrl(file))))\n}\n","import {Subject, Subscription, Observable, from} from 'rxjs'\n// Takes a observable-returning function and returns a new function that limits on the number of\n// concurrent observables.\nimport {first, mergeMap} from 'rxjs/operators'\n\nconst DEFAULT_CONCURRENCY = 4\n\nfunction remove<T>(array: Array<T>, item: T): Array<T> {\n const index = array.indexOf(item)\n if (index > -1) {\n array.splice(index, 1)\n }\n return array\n}\n\nexport const createThrottler = (concurrency: number = DEFAULT_CONCURRENCY) => {\n const currentSubscriptions: Array<Subscription> = []\n const pendingObservables: Array<Observable<any>> = []\n const ready$ = new Subject()\n\n function request(observable: Observable<any>): Observable<any> {\n return new Observable((observer) => {\n if (currentSubscriptions.length >= concurrency) {\n return scheduleAndWait$(observable)\n .pipe(mergeMap(request)) //\n .subscribe(observer)\n }\n const subscription = observable.subscribe(observer)\n currentSubscriptions.push(subscription)\n return () => {\n remove(currentSubscriptions, subscription)\n remove(pendingObservables, observable)\n subscription.unsubscribe()\n while (pendingObservables.length > 0 && currentSubscriptions.length < concurrency) {\n ready$.next(pendingObservables.shift())\n }\n }\n })\n }\n\n function scheduleAndWait$(observable: Observable<any>): Observable<any> {\n pendingObservables.push(observable)\n return ready$.asObservable().pipe(first((obs) => obs === observable))\n }\n\n return request\n}\n\nexport const withMaxConcurrency = (\n func: (...args: any[]) => Observable<any>,\n concurrency: number = DEFAULT_CONCURRENCY,\n) => {\n const throttler = createThrottler(concurrency)\n return (...args: Array<any>) => from(throttler(func(...args)))\n}\n","// Sourced from:\n// https://github.com/sanity-io/sanity/blob/ccb777e115a8cdf20d81a9a2bc9d8c228568faff/packages/%40sanity/form-builder/src/sanity/inputs/client-adapters/assets.ts\n\nimport type {SanityAssetDocument, SanityClient, SanityImageAssetDocument} from '@sanity/client'\nimport {Observable, of, throwError} from 'rxjs'\nimport {map, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError} from '../types'\nimport {withMaxConcurrency} from './withMaxConcurrency'\n\nconst fetchExisting$ = (client: SanityClient, type: string, hash: string) => {\n return client.observable.fetch('*[_type == $documentType && sha1hash == $hash][0]', {\n documentType: type,\n hash,\n })\n}\n\nconst readFile$ = (file: File): Observable<ArrayBuffer> => {\n return new Observable((subscriber) => {\n const reader = new FileReader()\n reader.onload = () => {\n subscriber.next(reader.result as ArrayBuffer)\n subscriber.complete()\n }\n reader.onerror = (err) => {\n subscriber.error(err)\n }\n reader.readAsArrayBuffer(file)\n return () => {\n reader.abort()\n }\n })\n}\n\nconst hexFromBuffer = (buffer: ArrayBuffer): string => {\n return Array.prototype.map\n .call(new Uint8Array(buffer), (x) => `00${x.toString(16)}`.slice(-2))\n .join('')\n}\n\nexport const hashFile$ = (file: File): Observable<string> => {\n if (!window.crypto || !window.crypto.subtle || !window.FileReader) {\n return throwError(() => ({\n message: 'Unable to generate hash: uploads are only allowed in secure contexts',\n statusCode: 500,\n }))\n }\n return readFile$(file).pipe(\n mergeMap((arrayBuffer) => window.crypto.subtle.digest('SHA-1', arrayBuffer)),\n map(hexFromBuffer),\n )\n}\n\nconst uploadSanityAsset$ = (\n client: SanityClient,\n assetType: 'file' | 'image',\n file: File,\n hash: string,\n) => {\n return of(null).pipe(\n // NOTE: the sanity api will still dedupe unique files, but this saves us from uploading the asset file entirely\n mergeMap(() => fetchExisting$(client, `sanity.${assetType}Asset`, hash)),\n // Cancel if the asset already exists\n mergeMap((existingAsset: SanityAssetDocument | SanityImageAssetDocument | null) => {\n if (existingAsset) {\n return throwError(\n () =>\n ({\n message: 'Asset already exists',\n statusCode: 409,\n }) satisfies HttpError,\n )\n }\n\n return of(null)\n }),\n mergeMap(() => {\n // Begin upload if no existing asset found\n return client.observable.assets\n .upload(assetType, file, {\n extract: ['blurhash', 'exif', 'image', 'location', 'lqip', 'palette'],\n preserveFilename: true,\n })\n .pipe(\n map((event) =>\n event.type === 'response'\n ? {\n // rewrite to a 'complete' event\n asset: event.body.document,\n id: event.body.document._id,\n type: 'complete',\n }\n : event,\n ),\n )\n }),\n )\n}\n\nexport const uploadAsset$ = withMaxConcurrency(uploadSanityAsset$)\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\nimport groq from 'groq'\nimport {EMPTY, from, merge, of} from 'rxjs'\nimport {catchError, delay, filter, mergeMap, takeUntil, withLatestFrom} from 'rxjs/operators'\n\nimport type {HttpError, MyEpic, SanityUploadProgressEvent, UploadItem} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {generatePreviewBlobUrl$} from '../../utils/generatePreviewBlobUrl'\nimport {hashFile$, uploadAsset$} from '../../utils/uploadSanityAsset'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from './actions'\n\nexport type UploadsReducerState = {\n allIds: string[]\n byIds: Record<string, UploadItem>\n}\n\nconst initialState = {\n allIds: [],\n byIds: {},\n} as UploadsReducerState\n\nconst uploadsSlice = createSlice({\n name: 'uploads',\n initialState,\n extraReducers: (builder) => {\n builder //\n .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n const {asset} = action.payload\n if (state.byIds[asset.sha1hash]) {\n state.byIds[asset.sha1hash]!.status = 'complete'\n }\n })\n },\n reducers: {\n checkRequest(\n _state,\n _action: PayloadAction<{assets: (SanityAssetDocument | SanityImageAssetDocument)[]}>,\n ) {\n //\n },\n checkComplete(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n const {results} = action.payload\n\n const assetHashes = Object.keys(results)\n\n assetHashes.forEach((hash) => {\n const deleteIndex = state.allIds.indexOf(hash)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n\n if (state.byIds[hash]) {\n const blobUrl = state.byIds[hash].objectUrl\n if (blobUrl) {\n window.URL.revokeObjectURL(blobUrl)\n }\n\n delete state.byIds[hash]\n }\n })\n },\n previewReady(state, action: PayloadAction<{hash: string; blobUrl: string}>) {\n const {blobUrl, hash} = action.payload\n if (state.byIds[hash]) {\n state.byIds[hash].objectUrl = blobUrl\n }\n },\n uploadCancel(state, action: PayloadAction<{hash: string}>) {\n const {hash} = action.payload\n const deleteIndex = state.allIds.indexOf(hash)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n if (state.byIds[hash]) {\n delete state.byIds[hash]\n }\n },\n uploadError(state, action: PayloadAction<{error: HttpError; hash: string}>) {\n const {hash} = action.payload\n const deleteIndex = state.allIds.indexOf(hash)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[hash]\n },\n uploadRequest(\n _state,\n _action: PayloadAction<{file: File; forceAsAssetType?: 'file' | 'image'}>,\n ) {\n //\n },\n uploadProgress(\n state,\n action: PayloadAction<{event: SanityUploadProgressEvent; uploadHash: string}>,\n ) {\n const {event, uploadHash} = action.payload\n state.byIds[uploadHash]!.percent = event.percent\n state.byIds[uploadHash]!.status = 'uploading'\n },\n uploadStart(state, action: PayloadAction<{file: File; uploadItem: UploadItem}>) {\n const {uploadItem} = action.payload\n if (!state.allIds.includes(uploadItem.hash)) {\n state.allIds.push(uploadItem.hash)\n }\n state.byIds[uploadItem.hash] = uploadItem\n },\n },\n})\n\n// Epics\n\nexport const uploadsAssetStartEpic: MyEpic = (action$, _state$, {client}) =>\n action$.pipe(\n filter(uploadsActions.uploadStart.match),\n mergeMap((action) => {\n const {file, uploadItem} = action.payload\n\n return merge(\n // Generate low res preview\n of(null).pipe(\n mergeMap(() => generatePreviewBlobUrl$(file)),\n mergeMap((url) => {\n return of(\n uploadsActions.previewReady({\n blobUrl: url,\n hash: uploadItem.hash,\n }),\n )\n }),\n ),\n // Upload asset and receive progress / complete events\n of(null).pipe(\n // delay(500000), // debug uploads\n mergeMap(() => uploadAsset$(client, uploadItem.assetType, file, uploadItem.hash)),\n takeUntil(\n action$.pipe(\n filter(uploadsActions.uploadCancel.match),\n filter((v) => v.payload.hash === uploadItem.hash),\n ),\n ),\n mergeMap((event) => {\n if (event?.type === 'complete') {\n const folderId = uploadItem.folderId || null\n\n if (!folderId) {\n return of(\n UPLOADS_ACTIONS.uploadComplete({\n asset: event.asset,\n }),\n )\n }\n\n return from(\n client\n .patch(event.asset._id)\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .set({\n 'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n })\n .commit(),\n ).pipe(\n mergeMap((asset) =>\n of(\n UPLOADS_ACTIONS.uploadComplete({\n asset: asset as SanityAssetDocument | SanityImageAssetDocument,\n }),\n ),\n ),\n )\n }\n if (event?.type === 'progress' && event?.stage === 'upload') {\n return of(\n uploadsActions.uploadProgress({\n event,\n uploadHash: uploadItem.hash,\n }),\n )\n }\n return EMPTY\n }),\n catchError((error: ClientError) =>\n of(\n uploadsActions.uploadError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n hash: uploadItem.hash,\n }),\n ),\n ),\n ),\n )\n }),\n )\n\nexport const uploadsAssetUploadEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(uploadsActions.uploadRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {file, forceAsAssetType} = action.payload\n\n return of(action).pipe(\n // Generate SHA1 hash from local file\n // This will throw in insecure contexts (non-localhost / https)\n mergeMap(() => hashFile$(file)),\n // Ignore if the file exists and is currently being uploaded\n filter((hash) => {\n const exists = !!state.uploads.byIds[hash]\n return !exists\n }),\n // Dispatch start action and begin upload process\n mergeMap((hash) => {\n const assetType = forceAsAssetType || (file.type.indexOf('image') >= 0 ? 'image' : 'file')\n const uploadItem = {\n _type: 'upload',\n assetType,\n folderId: state.folders.currentFolderId,\n hash,\n name: file.name,\n size: file.size,\n status: 'queued',\n } as UploadItem\n return of(uploadsActions.uploadStart({file, uploadItem}))\n }),\n )\n }),\n )\n\nexport const uploadsCompleteQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(UPLOADS_ACTIONS.uploadComplete.match),\n mergeMap((action) => {\n return of(\n uploadsActions.checkRequest({\n assets: [action.payload.asset],\n }),\n )\n }),\n )\n\nexport const uploadsCheckRequestEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(uploadsActions.checkRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets} = action.payload\n\n const documentIds = assets.map((asset) => asset._id)\n\n const constructedFilter = constructFilter({\n assetTypes: state.assets.assetTypes,\n currentFolderId: state.folders.currentFolderId,\n excludeTagSlugs: state.assets.excludeTagSlugs,\n searchFacets: state.search.facets,\n searchQuery: state.search.query,\n })\n\n const query = groq`\n *[${constructedFilter} && _id in $documentIds].sha1hash\n `\n\n return of(action).pipe(\n delay(1000), // give Sanity some time to register the recently uploaded asset\n mergeMap(() => client.observable.fetch<string[]>(query, {documentIds})),\n mergeMap((resultHashes) => {\n const checkedResults = assets.reduce((acc: Record<string, string | null>, asset) => {\n acc[asset.sha1hash] = resultHashes.includes(asset.sha1hash) ? asset._id : null\n return acc\n }, {})\n\n return of(\n uploadsActions.checkComplete({results: checkedResults}), //\n assetsActions.insertUploads({results: checkedResults}),\n )\n }),\n )\n }),\n )\n\n// Selectors\n\nexport const selectUploadById = createSelector(\n [\n (state: RootReducerState) => state.uploads.byIds,\n (_state: RootReducerState, uploadId: string) => uploadId,\n ],\n (byIds, uploadId) => byIds[uploadId],\n)\n\nexport const uploadsActions = {...uploadsSlice.actions}\n\nexport default uploadsSlice.reducer\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n id: string\n}\n\nconst CardWrapper = styled(Flex)`\n box-sizing: border-box;\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n`\n\nconst CardUpload = (props: Props) => {\n const {id} = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const item = useTypedSelector((state) => selectUploadById(state, id))\n\n if (!item) {\n return null\n }\n\n const fileSize = filesize(item.size, {base: 10, round: 0})\n const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n const isComplete = item.status === 'complete'\n const isUploading = item.status === 'uploading'\n const isQueued = item.status === 'queued'\n\n let status\n if (isComplete) {\n status = 'Verifying'\n }\n if (isUploading) {\n status = `${percentLoaded}%`\n }\n if (isQueued) {\n status = 'Queued'\n }\n\n // Callbacks\n const handleCancelUpload = () => {\n dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n }\n\n return (\n <CardWrapper padding={1}>\n <Flex\n direction=\"column\"\n flex={1}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n height: '100%',\n position: 'relative',\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />\n\n <Box flex={1} style={{position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{\n opacity: 0.4,\n }}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"80px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n direction=\"column\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={4}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>\n\n {/* Footer */}\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={2}\n style={{height: `${PANEL_HEIGHT}px`}}\n >\n <Box flex={1} marginRight={1}>\n <Text size={0} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n </Box>\n <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n {status}\n </Text>\n </Flex>\n </Flex>\n </CardWrapper>\n )\n}\n\nexport default CardUpload\n","import {memo} from 'react'\nimport {VirtuosoGrid} from 'react-virtuoso'\nimport {styled} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport CardAsset from '../CardAsset'\nimport CardFolder from '../CardFolder'\nimport CardUpload from '../CardUpload'\n\ntype Props = {\n items: (CardAssetData | CardFolderData | CardUploadData)[]\n onLoadMore?: () => void\n source?: string\n}\n\nconst CARD_HEIGHT = 220\nconst CARD_WIDTH = 240\n\nconst VirtualCell = memo(\n ({\n item,\n selected,\n source,\n }: {\n item: CardAssetData | CardFolderData | CardUploadData\n selected: boolean\n source?: string\n }) => {\n if (item?.type === 'asset') {\n return <CardAsset id={item.id} selected={selected} source={source} />\n }\n\n if (item?.type === 'folder') {\n return <CardFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n }\n\n if (item?.type === 'upload') {\n return <CardUpload id={item.id} />\n }\n\n return null\n },\n)\n\nconst StyledItemContainer = styled.div`\n height: ${CARD_HEIGHT}px;\n width: ${CARD_WIDTH}px;\n`\n\nconst ItemContainer = (props: any) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n const {context, ref, ...rest} = props\n return <StyledItemContainer ref={ref} {...rest} />\n}\n\nconst StyledListContainer = styled.div`\n display: grid;\n grid-template-columns: repeat(auto-fill, ${CARD_WIDTH}px);\n grid-template-rows: repeat(auto-fill, ${CARD_HEIGHT}px);\n justify-content: center;\n margin: 0 auto;\n`\n\nconst ListContainer = (props: any) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n const {context, ref, ...rest} = props\n return <StyledListContainer ref={ref} {...rest} />\n}\n\nconst AssetGridVirtualized = (props: Props) => {\n const {items, onLoadMore, source} = props\n\n // Redux\n const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n const totalCount = items?.length\n\n if (totalCount === 0) {\n return null\n }\n\n return (\n <VirtuosoGrid\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n return item?.id ?? index\n }}\n components={{\n Item: ItemContainer,\n List: ListContainer,\n }}\n endReached={onLoadMore}\n itemContent={(index) => {\n const item = items[index]!\n const selected = selectedIds.includes(item.id)\n return <VirtualCell item={item} selected={selected} source={source} />\n }}\n overscan={48}\n style={{overflowX: 'hidden', overflowY: 'scroll'}}\n totalCount={totalCount}\n />\n )\n}\n\nexport default AssetGridVirtualized\n","import {Box, Text} from '@sanity/ui'\nimport {useEffect, useRef, useState} from 'react'\nimport {useDispatch, useStore} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport type {RootReducerState} from '../../modules/types'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\n\nfunction omitFacetId(facet: WithId<SearchFacetInputProps>): SearchFacetInputProps {\n // Strip the runtime `id` so facetsAdd can assign a fresh one on restore.\n const {id: _id, ...withoutId} = facet\n void _id\n return withoutId\n}\n\nconst ReplaceAssetsOverview = () => {\n const dispatch = useDispatch()\n const store = useStore<RootReducerState>()\n const combinedItems = useTypedSelector(selectCombinedItems)\n const assetsById = useTypedSelector((state) => state.assets.byIds)\n const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const fetchingError = useTypedSelector((state) => state.assets.fetchingError)\n const pageSize = useTypedSelector((state) => state.assets.pageSize)\n const searchQuery = useTypedSelector((state) => state.search.query)\n const searchFacets = useTypedSelector((state) => state.search.facets)\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const currentFolderUnfiled = useTypedSelector((state) => state.folders.currentFolderUnfiled)\n\n // Prefer the dialog's assetId — search refetch clears `allIds` / can drop picks.\n const assetToReplaceId = useTypedSelector((state) => {\n const dialog = state.dialog.items.find((item) => item.type === 'dialogAllAssets')\n return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n })\n\n const savedBrowserStateRef = useRef<{\n assetId: string | undefined\n query: string\n facets: WithId<SearchFacetInputProps>[]\n folderId: string | null\n folderUnfiled: boolean\n } | null>(null)\n\n // Clearing the search only triggers a refetch after `assetsSearchEpic`'s debounce, so the\n // stale results stay in the store for a moment. Track that gap to avoid rendering the\n // empty state before the unscoped results arrive.\n const [awaitingRefetch, setAwaitingRefetch] = useState(\n () =>\n searchQuery.length > 0 ||\n searchFacets.length > 0 ||\n Boolean(currentFolderId) ||\n currentFolderUnfiled,\n )\n\n // Clear the browser search, facets and folder scope so the picker is not limited to the\n // result set the user used to find the asset. Restore them when the dialog closes.\n useEffect(() => {\n const {dialog, folders, search} = store.getState()\n const {query, facets} = search\n const dialogItem = dialog.items.find((item) => item.type === 'dialogAllAssets')\n\n savedBrowserStateRef.current = {\n assetId: dialogItem?.type === 'dialogAllAssets' ? dialogItem.assetId : undefined,\n query,\n facets,\n folderId: folders.currentFolderId,\n folderUnfiled: folders.currentFolderUnfiled,\n }\n\n if (query.length > 0) {\n dispatch(searchActions.querySet({searchQuery: ''}))\n }\n if (facets.length > 0) {\n dispatch(searchActions.facetsClear())\n }\n if (folders.currentFolderId || folders.currentFolderUnfiled) {\n dispatch(foldersActions.currentFolderClear())\n }\n\n return () => {\n const saved = savedBrowserStateRef.current\n if (!saved) {\n return\n }\n\n const hadScope =\n saved.query.length > 0 ||\n saved.facets.length > 0 ||\n Boolean(saved.folderId) ||\n saved.folderUnfiled\n\n if (saved.query.length > 0) {\n dispatch(searchActions.querySet({searchQuery: saved.query}))\n }\n for (const facet of saved.facets) {\n dispatch(searchActions.facetsAdd({facet: omitFacetId(facet)}))\n }\n if (saved.folderId) {\n dispatch(foldersActions.currentFolderSet({folderId: saved.folderId}))\n } else if (saved.folderUnfiled) {\n dispatch(foldersActions.currentFolderShowUnfiled())\n }\n\n // Changing the search or folder runs epics that clear picks — put the asset being\n // replaced back so closing the dialog keeps the browser selection.\n if (hadScope && saved.assetId) {\n dispatch(assetsActions.pick({assetId: saved.assetId, picked: true}))\n }\n }\n }, [dispatch, store])\n\n // Every rescoped refetch is preceded by `assetsActions.clear()`, so wait for the asset\n // list to be emptied and the following fetch to settle. Watching `fetching` alone is not\n // enough: `assetsFetchEpic` uses `switchMap`, so replacing an in-flight request leaves\n // `fetching` true throughout. Clearing a folder scope and a search at the same time\n // produces two refetches (the folder one immediately, the search one after its debounce),\n // so each list clear re-arms the wait rather than resolving it for good.\n useEffect(() => {\n let previousIds = store.getState().assets.allIds\n let awaitingSettle = false\n\n return store.subscribe(() => {\n const {allIds, fetching: isFetching} = store.getState().assets\n const listCleared = allIds !== previousIds && allIds.length === 0\n previousIds = allIds\n\n if (listCleared) {\n awaitingSettle = true\n setAwaitingRefetch(true)\n return\n }\n if (awaitingSettle && !isFetching) {\n awaitingSettle = false\n setAwaitingRefetch(false)\n }\n })\n }, [store])\n\n const scopeActive =\n searchQuery.length > 0 ||\n searchFacets.length > 0 ||\n Boolean(currentFolderId) ||\n currentFolderUnfiled\n\n // Only image assets can replace image refs; exclude uploads and the asset being replaced.\n const reducedItems = combinedItems.filter((item) => {\n if (item.type !== 'asset' || item.id === assetToReplaceId) {\n return false\n }\n const asset = assetsById[item.id]?.asset\n return asset ? isImageAsset(asset) : false\n })\n\n const hasFetchedOnce = fetchCount >= 0\n const hasMorePages = fetchCount === pageSize\n // Don't treat a scoped / stale / mid-fetch / incomplete page as \"no replacements\".\n const isEmpty =\n reducedItems.length === 0 &&\n hasFetchedOnce &&\n !fetching &&\n !scopeActive &&\n !awaitingRefetch &&\n !hasMorePages\n\n // Keep loading pages until we find image candidates or exhaust results. A failed fetch\n // leaves `fetchCount` untouched, so stop paging on error instead of retrying forever.\n useEffect(() => {\n if (\n scopeActive ||\n fetching ||\n awaitingRefetch ||\n fetchingError ||\n reducedItems.length > 0 ||\n !hasFetchedOnce ||\n !hasMorePages\n ) {\n return\n }\n dispatch(assetsActions.loadNextPage())\n }, [\n dispatch,\n scopeActive,\n fetching,\n awaitingRefetch,\n fetchingError,\n reducedItems.length,\n hasFetchedOnce,\n hasMorePages,\n ])\n\n const handleLoadMoreItems = () => {\n if (!fetching) {\n dispatch(assetsActions.loadNextPage())\n }\n }\n\n return (\n <Box height=\"fill\">\n {isEmpty ? (\n <Box padding={5}>\n <Text size={1} weight=\"semibold\">\n There are no replacement images\n </Text>\n </Box>\n ) : (\n <Box height=\"fill\">\n <AssetGridVirtualized\n items={reducedItems}\n onLoadMore={handleLoadMoreItems}\n source=\"replace-asset\"\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport default ReplaceAssetsOverview\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogAllAssetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport ReplaceAssetsOverview from '../ReplaceAssetsOverView'\n\ntype Props = {\n children: ReactNode\n dialog: DialogAllAssetsProps\n}\n\nconst DialogAllAssets = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog header=\"Choose a replacement image\" id={id} onClose={handleClose} width={3}>\n <Box padding={4} style={{height: '50vh'}}>\n <ReplaceAssetsOverview />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogAllAssets\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Flex, Stack, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogConfirmProps} from '../../types'\nimport Dialog from '../Dialog'\n\ntype Props = {\n children?: ReactNode\n dialog: DialogConfirmProps\n}\n\nconst DialogConfirm = (props: Props) => {\n const {children, dialog} = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = () => {\n dispatch(dialogActions.remove({id: dialog?.id}))\n }\n\n const handleConfirm = () => {\n // Close target dialog, if provided\n if (dialog?.closeDialogId) {\n dispatch(dialogActions.remove({id: dialog?.closeDialogId}))\n }\n\n if (dialog?.confirmCallbackAction) {\n dispatch(dialog.confirmCallbackAction)\n }\n\n // Close self\n handleClose()\n }\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"space-between\">\n <Button fontSize={1} mode=\"bleed\" onClick={handleClose} text=\"Cancel\" />\n <Button\n fontSize={1}\n onClick={handleConfirm}\n text={dialog?.confirmText}\n tone={dialog?.tone}\n />\n </Flex>\n </Box>\n )\n\n const Header = () => (\n <Flex align=\"center\">\n <Box paddingX={1}>\n <WarningOutlineIcon />\n </Box>\n <Box marginLeft={2}>{dialog?.headerTitle}</Box>\n </Flex>\n )\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n // oxlint-disable-next-line react/static-components\n header={<Header />}\n id=\"confirm\"\n onClose={handleClose}\n width={1}\n >\n <Box paddingX={4} paddingY={4}>\n <Stack gap={3}>\n {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n {dialog?.description && (\n <Text muted size={1}>\n <em>{dialog.description}</em>\n </Text>\n )}\n </Stack>\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogConfirm\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderCreateProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogFolderCreateProps\n}\n\nconst DialogFolderCreate = (props: Props) => {\n const {\n children,\n dialog: {parentFolderId, id},\n } = props\n\n const dispatch = useDispatch()\n const creating = useTypedSelector((state) => state.folders.creating)\n const creatingError = useTypedSelector((state) => state.folders.creatingError)\n const parentPath = useTypedSelector((state) => selectFolderPathById(state, parentFolderId))\n\n const {\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n setError,\n } = useForm<FolderFormData>({\n defaultValues: {\n name: '',\n },\n mode: 'onChange',\n resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n })\n\n const handleClose = () => {\n dispatch(dialogActions.clear())\n }\n\n const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n foldersActions.createRequest({\n name: sanitizedFormData['name'],\n parentId: parentFolderId || null,\n }),\n )\n }\n\n useEffect(() => {\n if (creatingError) {\n setError('name', {message: creatingError.message})\n }\n }, [creatingError, setError])\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n <FormSubmitButton\n disabled={creating || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Create Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {parentPath && (\n <Box marginBottom={3}>\n <Text muted size={1}>\n Creating inside {parentPath}\n </Text>\n </Box>\n )}\n\n <FormFieldInputText\n {...register('name')}\n disabled={creating}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolderCreate\n","import {Box, Button, Flex, Inline, Stack, Text, Tree, TreeItem} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {type ReactNode, useMemo, useState} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectFolderTree} from '../../modules/folders'\nimport type {DialogFolderMoveProps, FolderTreeNode} from '../../types'\nimport Dialog from '../Dialog'\n\nconst getExpandedIdSet = (\n folderId: string | null,\n byId: Record<string, {parentId: string | null}>,\n) => {\n const expanded = new Set<string>()\n let cursor: string | null = folderId\n while (cursor) {\n const node = byId[cursor]\n if (!node) break\n expanded.add(cursor)\n cursor = node.parentId\n }\n return expanded\n}\n\ntype Props = {\n children: ReactNode\n dialog: DialogFolderMoveProps\n}\n\ntype FolderNodeProps = {\n expandedIds: Set<string>\n node: FolderTreeNode\n onSelect: (folderId: string) => void\n selectedId: string | null\n}\n\nconst FolderNode = ({expandedIds, node, onSelect, selectedId}: FolderNodeProps) => {\n const hasChildren = node.children.length > 0\n const selected = selectedId === node.id\n\n return (\n <TreeItem\n expanded={expandedIds.has(node.id)}\n id={node.id}\n onClick={() => onSelect(node.id)}\n selected={selected}\n text={`${node.name} (${node.totalCount})`}\n weight={selected ? 'semibold' : 'medium'}\n >\n {hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))}\n </TreeItem>\n )\n}\n\ntype FolderTreeProps = {\n expandedIds: Set<string>\n folderTree: FolderTreeNode[]\n onSelect: (folderId: string) => void\n selectedId: string | null\n}\n\nconst FolderTree = ({expandedIds, folderTree, onSelect, selectedId}: FolderTreeProps) => (\n <Tree gap={1}>\n {folderTree.map((node) => (\n <FolderNode\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))}\n </Tree>\n)\n\nconst DialogFolderMove = ({children, dialog}: Props) => {\n const dispatch = useDispatch()\n const folderTree = useTypedSelector(selectFolderTree)\n const byId = useTypedSelector((state) => state.folders.byId)\n const {assets, folderId, id} = dialog\n const [selectedId, setSelectedId] = useState<string | null>(folderId || null)\n const selectedFolder = selectedId ? byId[selectedId] : null\n const expandedIds = useMemo(() => getExpandedIdSet(folderId || null, byId), [byId, folderId])\n\n const handleClose = () => {\n dispatch(dialogActions.remove({id}))\n }\n\n const handleMove = () => {\n if (!selectedId) {\n return\n }\n\n dispatch(\n assetsActions.folderSetRequest({\n assets,\n closeDialogId: id,\n folderId: selectedId,\n }),\n )\n }\n\n return (\n <Dialog\n animate\n footer={\n <Box padding={3}>\n <Flex justify=\"flex-end\" gap={2}>\n <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n <Button\n disabled={!selectedId}\n mode=\"default\"\n onClick={handleMove}\n text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n tone=\"primary\"\n />\n </Flex>\n </Box>\n }\n header=\"Move to Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Stack gap={4} padding={4}>\n <Text size={1}>\n Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n </Text>\n\n <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n <FolderTree\n expandedIds={expandedIds}\n folderTree={folderTree}\n onSelect={setSelectedId}\n selectedId={selectedId}\n />\n\n {folderTree.length === 0 && (\n <Box marginTop={3}>\n <Text muted size={1}>\n No folders yet.\n </Text>\n </Box>\n )}\n </Box>\n\n {selectedFolder && (\n <Inline gap={2}>\n <Text muted size={1}>\n Destination:\n </Text>\n <Text size={1} weight=\"semibold\">\n {selectedFolder.name}\n </Text>\n </Inline>\n )}\n </Stack>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolderMove\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderRenameProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogFolderRenameProps\n}\n\nconst DialogFolderRename = ({children, dialog}: Props) => {\n const {folderId, id} = dialog\n const dispatch = useDispatch()\n const renaming = useTypedSelector((state) => state.folders.renaming)\n const renameError = useTypedSelector((state) => state.folders.renameError)\n const folder = useTypedSelector((state) => state.folders.byId[folderId])\n const folderPath = useTypedSelector((state) => selectFolderPathById(state, folderId))\n const currentName = folder?.name || ''\n const parentPath = folderPath.includes('/')\n ? folderPath.slice(0, folderPath.lastIndexOf('/'))\n : null\n\n const {\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n setError,\n } = useForm<FolderFormData>({\n defaultValues: {\n name: currentName,\n },\n mode: 'onChange',\n resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n })\n\n const handleClose = () => {\n dispatch(dialogActions.remove({id}))\n }\n\n const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n foldersActions.renameRequest({\n name: sanitizedFormData['name'],\n folderId,\n }),\n )\n }\n\n useEffect(() => {\n if (renameError) {\n setError('name', {message: renameError.message})\n }\n }, [renameError, setError])\n\n return (\n <Dialog\n animate\n footer={\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n <FormSubmitButton\n disabled={renaming || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n }\n header=\"Rename Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n <Box marginBottom={3}>\n <Text muted size={1}>\n {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n </Text>\n </Box>\n\n <FormFieldInputText\n {...register('name')}\n disabled={renaming}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolderRename\n","import {AddIcon} from '@sanity/icons/Add'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Inline, Label, Text, Tree, TreeItem} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode, useMemo} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {foldersActions, selectCanDeleteFolder, selectFolderTree} from '../../modules/folders'\nimport type {FolderTreeNode} from '../../types'\n\nconst getExpandedIdSet = (\n folderId: string | null,\n byId: Record<string, {parentId: string | null}>,\n) => {\n const expanded = new Set<string>()\n let cursor: string | null = folderId\n while (cursor) {\n const node = byId[cursor]\n if (!node) break\n expanded.add(cursor)\n cursor = node.parentId\n }\n return expanded\n}\n\ntype FolderNodeProps = {\n currentFolderId: string | null\n expandedIds: Set<string>\n node: FolderTreeNode\n onSelect: (folderId: string) => void\n}\n\ntype FolderHeaderActionProps = {\n disabled?: boolean\n icon: ReactNode\n onClick: () => void\n tone?: 'critical' | 'default' | 'primary'\n tooltip: string\n}\n\nconst FolderHeaderAction = ({\n disabled = false,\n icon,\n onClick,\n tone = 'default',\n tooltip,\n}: FolderHeaderActionProps) => (\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>\n }\n disabled={typeof window !== 'undefined' && 'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={tooltip}\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />\n </Tooltip>\n)\n\ntype FolderItemTextProps = {\n name: string\n totalCount: number\n}\n\n/**\n * this uses some hacky css to get the desired layout\n * The tree item is a text container, so we need to use a span to wrap the content\n */\nconst FolderItemText = ({name, totalCount}: FolderItemTextProps) => (\n <span\n style={{\n boxSizing: 'border-box',\n display: 'block',\n maxWidth: '100%',\n minWidth: 0,\n overflow: 'hidden',\n paddingRight: '2rem',\n position: 'relative',\n width: '100%',\n }}\n >\n <span\n style={{\n alignItems: 'center',\n display: 'flex',\n paddingLeft: '0.25rem',\n gap: '0.5rem',\n minWidth: 0,\n overflow: 'hidden',\n }}\n >\n <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n <FolderIcon />\n </span>\n <span\n style={{\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {name}\n </span>\n </span>\n <span\n style={{\n fontSize: '0.75rem',\n opacity: 0.78,\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n {totalCount}\n </span>\n </span>\n)\n\nconst FolderNode = ({currentFolderId, expandedIds, node, onSelect}: FolderNodeProps) => {\n const hasChildren = node.children.length > 0\n const selected = currentFolderId === node.id\n\n return (\n <TreeItem\n expanded={expandedIds.has(node.id)}\n id={node.id}\n onClick={() => onSelect(node.id)}\n selected={selected}\n text={<FolderItemText name={node.name} totalCount={node.totalCount} />}\n weight={selected ? 'semibold' : 'medium'}\n >\n {hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n />\n ))}\n </TreeItem>\n )\n}\n\nconst FolderView = () => {\n const dispatch = useDispatch()\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const byId = useTypedSelector((state) => state.folders.byId)\n const canDeleteFolder = useTypedSelector(selectCanDeleteFolder)\n const fetching = useTypedSelector((state) => state.folders.fetching)\n const folderTree = useTypedSelector(selectFolderTree)\n const currentFolder = currentFolderId ? byId[currentFolderId] : null\n const expandedIds = useMemo(\n () => getExpandedIdSet(currentFolderId, byId),\n [byId, currentFolderId],\n )\n const treeKey = useMemo(() => Array.from(expandedIds).join('|') || 'root', [expandedIds])\n\n const hasFolders = folderTree.length > 0\n\n const handleFolderSelect = (folderId: string) => {\n dispatch(foldersActions.currentFolderSet({folderId}))\n }\n\n const handleFolderDelete = () => {\n if (!currentFolderId || !currentFolder) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteFolder({\n folderId: currentFolderId,\n folderName: currentFolder.name,\n }),\n )\n }\n\n return (\n <Flex direction=\"column\" flex={1} height=\"fill\">\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={3}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }}\n >\n <Box flex={1}>\n <Inline gap={2}>\n <Label size={0}>Folders</Label>\n {fetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n </Box>\n\n <Inline gap={1}>\n {currentFolderId && (\n <FolderHeaderAction\n icon={<EditIcon />}\n onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n tone=\"primary\"\n tooltip=\"Rename folder\"\n />\n )}\n\n <FolderHeaderAction\n icon={<AddIcon />}\n onClick={() =>\n dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n }\n tone=\"primary\"\n tooltip=\"Create folder\"\n />\n\n {currentFolderId && canDeleteFolder && (\n <FolderHeaderAction\n icon={<TrashIcon />}\n onClick={handleFolderDelete}\n tone=\"critical\"\n tooltip=\"Delete folder\"\n />\n )}\n </Inline>\n </Flex>\n\n <Box padding={2}>\n <Box>\n <Tree gap={1} key={treeKey}>\n <TreeItem\n id=\"__all-assets\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n selected={currentFolderId === null}\n text=\"All assets\"\n weight={currentFolderId === null ? 'semibold' : 'medium'}\n />\n\n {folderTree.map((node) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={handleFolderSelect}\n />\n ))}\n </Tree>\n\n {!hasFolders && !fetching && (\n <Box marginTop={3} paddingX={1}>\n <Text muted size={1}>\n <em>No folders</em>\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n </Flex>\n )\n}\n\nexport default FolderView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogFoldersProps} from '../../types'\nimport Dialog from '../Dialog'\nimport FolderView from '../FolderView'\n\ntype Props = {\n children: ReactNode\n dialog: DialogFoldersProps\n}\n\nconst DialogFolders = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n const dispatch = useDispatch()\n\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog animate header=\"Folders\" id={id} onClose={handleClose} width={1}>\n <Box\n style={{\n height: '100%',\n minHeight: '420px',\n }}\n >\n <FolderView />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolders\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Flex, Label, rem, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n children: ReactNode\n facet: WithId<SearchFacetInputProps>\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled<typeof Box, {$scheme: ThemeColorSchemeKey}>(Box)(({$scheme, theme}) => {\n return css`\n background: ${getSchemeColor($scheme, 'bg')};\n border-radius: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n rem(theme.sanity.radius[2]!)\n };\n `\n})\n\nconst SearchFacet = (props: Props) => {\n const {children, facet} = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n\n const handleClose = () => {\n dispatch(searchActions.facetsRemoveById({facetId: facet.id}))\n }\n\n return (\n <Container padding={[2, 2, 1]} $scheme={scheme}>\n <Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n {/* Title */}\n <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n <Label\n size={0}\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n {facet.title}\n </Label>\n </Box>\n\n <Flex align=\"center\">\n {children}\n\n {/* Close button */}\n <Box marginLeft={1} paddingX={2}>\n <Text muted size={0}>\n <CloseIcon onClick={handleClose} />\n </Text>\n </Box>\n </Flex>\n </Flex>\n </Container>\n )\n}\n\nexport default SearchFacet\n","import {TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\n\n// TODO: use correct type\ntype Props = any & {\n onValueChange: (value: number) => void\n value?: number\n}\n\nconst TextInputNumber = (props: Props) => {\n const {onValueChange, value, ...remainingProps} = props\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value\n const regex = /^[0-9\\b]+$/\n\n // Test for number and strip leading zeroes\n if (val === '' || regex.test(val)) {\n onValueChange(parseInt(val, 10) || '')\n }\n }\n\n return (\n <TextInput\n {...remainingProps}\n onChange={handleChange} //\n value={value ?? ''}\n />\n )\n}\n\nexport default TextInputNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n SearchFacetInputNumberModifier,\n SearchFacetInputNumberProps,\n SearchFacetOperatorType,\n WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\nimport TextInputNumber from '../TextInputNumber'\n\ntype Props = {\n facet: WithId<SearchFacetInputNumberProps>\n}\n\nconst SearchFacetNumber = ({facet}: Props) => {\n // Redux\n const dispatch = useDispatch()\n\n const popoverProps = usePortalPopoverProps()\n\n const modifiers = facet?.modifiers\n const selectedModifier = facet?.modifier\n ? modifiers?.find((modifier) => modifier.name === facet?.modifier)\n : modifiers?.[0]\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n }\n\n const handleModifierClick = (modifier: SearchFacetInputNumberModifier) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, modifier: modifier.name}))\n }\n\n const handleValueChange = (value: number) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, value}))\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet.operatorType ?? 'greaterThan'\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n <Box marginX={1} style={{maxWidth: '50px'}}>\n <TextInputNumber\n fontSize={1}\n onValueChange={handleValueChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>\n\n {/* Modifiers */}\n {modifiers && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={selectedModifier?.title}\n />\n }\n id=\"modifier\"\n menu={\n <Menu>\n {modifiers.map((modifier) => {\n const selected = modifier.name === facet.modifier\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={modifier.name}\n onClick={() => handleModifierClick(modifier)}\n padding={2}\n text={modifier.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n </SearchFacet>\n )\n}\n\nexport default SearchFacetNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n SearchFacetInputSelectListItemProps,\n SearchFacetInputSelectProps,\n SearchFacetOperatorType,\n WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n facet: WithId<SearchFacetInputSelectProps>\n}\n\nconst SearchFacetSelect = ({facet}: Props) => {\n // Redux\n const dispatch = useDispatch()\n\n const popoverProps = usePortalPopoverProps()\n\n const options = facet?.options\n\n const selectedItem = options?.find((v) => v.name === facet?.value)\n\n const handleListItemClick = (option: SearchFacetInputSelectListItemProps) => {\n dispatch(searchActions.facetsUpdate({name: facet.name, value: option.name}))\n }\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdate({name: facet.name, operatorType}))\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet?.operatorType ?? 'is'\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Box marginRight={1}>\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n </Box>\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* List */}\n <MenuButton\n button={\n <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n }\n id=\"list\"\n menu={\n <Menu>\n {options?.map((item) => {\n const selected = item.name === selectedItem?.name\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={item.name}\n onClick={() => handleListItemClick(item)}\n padding={2}\n text={item.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n </SearchFacet>\n )\n}\n\nexport default SearchFacetSelect\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputStringProps, SearchFacetOperatorType, WithId} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n facet: WithId<SearchFacetInputStringProps>\n}\n\nconst SearchFacetString = ({facet}: Props) => {\n // Redux\n const dispatch = useDispatch()\n\n const popoverProps = usePortalPopoverProps()\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n }\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, value: e.target.value}))\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n {!operators[selectedOperatorType].hideInput && (\n <Box marginLeft={1} style={{maxWidth: '125px'}}>\n <TextInput\n fontSize={1}\n onChange={handleChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>\n )}\n </SearchFacet>\n )\n}\n\nexport default SearchFacetString\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {fonts, radius: themeRadius, space: themeSpace} = studioTheme\nconst themeTextSizes = fonts.text.sizes\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n return {\n control: (styles, {isDisabled, isFocused}) => {\n let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n if (isFocused) {\n boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n 0 0 0 1px ${getSchemeColor(scheme, 'bg2')},\n 0 0 0 3px var(--card-focus-ring-color) !important`\n }\n\n return {\n ...styles,\n 'backgroundColor': 'var(--card-bg-color)',\n 'color': 'inherit',\n 'border': 'none',\n 'borderRadius': themeRadius[2],\n boxShadow,\n 'fontSize': themeTextSizes[1]!.fontSize,\n 'minHeight': '25px',\n 'opacity': isDisabled ? 0.5 : 'inherit',\n 'outline': 'none',\n 'transition': 'none',\n '&:hover': {\n boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n },\n }\n },\n input: (styles) => ({\n ...styles,\n color: 'var(--card-fg-color)',\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n fontSize: themeTextSizes[1]!.fontSize,\n marginLeft: rem(themeSpace[2]!),\n }),\n menuList: (styles) => ({\n ...styles,\n padding: 0,\n }),\n noOptionsMessage: (styles) => ({\n ...styles,\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n fontSize: themeTextSizes[1]!.fontSize,\n lineHeight: '1em',\n }),\n option: (styles, {isFocused}) => ({\n ...styles,\n 'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n 'borderRadius': themeRadius[2],\n 'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n 'fontSize': themeTextSizes[1]!.fontSize,\n 'lineHeight': '1em',\n 'margin': 0,\n 'padding': rem(themeSpace[1]!),\n '&:hover': {\n backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n color: getSchemeColor(scheme, 'bg'),\n },\n }),\n placeholder: (styles) => ({\n ...styles,\n fontSize: themeTextSizes[1]!.fontSize,\n marginLeft: rem(themeSpace[2]!),\n paddingLeft: 0,\n }),\n singleValue: (styles) => ({\n ...styles,\n alignItems: 'center',\n display: 'inline-flex',\n height: '100%',\n marginLeft: rem(themeSpace[2]!),\n }),\n valueContainer: (styles) => ({\n ...styles,\n margin: 0,\n padding: 0,\n }),\n }\n}\n\nconst ClearIndicator = (props: any) => {\n return (\n <components.ClearIndicator {...props}>\n <Box\n paddingRight={1}\n style={{\n transform: 'scale(0.85)',\n }}\n >\n <Text muted size={0}>\n <CloseIcon />\n </Text>\n </Box>\n </components.ClearIndicator>\n )\n}\n\nconst Menu = (props: any) => {\n return (\n <components.Menu {...props}>\n <Card radius={1} shadow={2}>\n {props.children}\n </Card>\n </components.Menu>\n )\n}\n\nconst MenuList = (props: any) => {\n const {children} = props\n\n const MAX_ROWS = 5\n const OPTION_HEIGHT = 33\n\n if (Array.isArray(children)) {\n const height =\n children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n return (\n <Virtuoso\n className=\"media__custom-scrollbar\"\n itemContent={(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }}\n style={{height}}\n totalCount={children.length}\n />\n )\n }\n return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst NoOptionsMessage = (props: any) => {\n return <components.NoOptionsMessage {...props}>{props.children}</components.NoOptionsMessage>\n}\n\nconst Option = (props: any) => {\n return (\n <Box padding={1}>\n <components.Option {...props}>\n <Box paddingY={1}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n {props.children}\n </Text>\n </Box>\n </components.Option>\n </Box>\n )\n}\n\nconst SingleValue = (props: any) => {\n return (\n <components.SingleValue {...props}>\n <Text size={1} textOverflow=\"ellipsis\">\n {props.children}\n </Text>\n </components.SingleValue>\n )\n}\n\nexport const reactSelectComponents = {\n ClearIndicator,\n DropdownIndicator: null,\n IndicatorSeparator: null,\n Menu,\n MenuList,\n NoOptionsMessage,\n Option,\n SingleValue,\n}\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\nimport Select from 'react-select'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {operators} from '../../config/searchFacets'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport {selectTags} from '../../modules/tags'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/single'\nimport type {\n TagSelectOption,\n SearchFacetInputSearchableProps,\n SearchFacetOperatorType,\n WithId,\n} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n facet: WithId<SearchFacetInputSearchableProps>\n}\n\nconst SearchFacetTags = ({facet}: Props) => {\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const {excludeTagSlugs} = useToolOptions()\n const tagsAll = useTypedSelector((state) => selectTags(state))\n const tags =\n excludeTagSlugs.length > 0\n ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n : tagsAll\n const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n const allTagOptions = getTagSelectOptions(tags)\n\n const popoverProps = usePortalPopoverProps()\n\n const handleChange = (option: TagSelectOption) => {\n dispatch(\n searchActions.facetsUpdateById({\n id: facet.id,\n value: option,\n }),\n )\n }\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(\n searchActions.facetsUpdateById({\n id: facet.id,\n operatorType,\n }),\n )\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n gap={4}\n style={{minWidth: '150px'}}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n {!operators[selectedOperatorType].hideInput && (\n <Box marginX={1} style={{width: '160px'}}>\n <Select\n components={reactSelectComponents}\n instanceId=\"facet-searchable\"\n isClearable\n isDisabled={tagsFetching}\n isSearchable\n name=\"tags\"\n noOptionsMessage={() => 'No tags'}\n onChange={(value: any) => handleChange(value as TagSelectOption)}\n options={allTagOptions}\n placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n styles={reactSelectStyles(scheme)}\n value={facet?.value}\n />\n </Box>\n )}\n </SearchFacet>\n )\n}\n\nexport default SearchFacetTags\n","import {Box, Flex, Inline, rem, type Theme} from '@sanity/ui'\nimport {styled, css} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport SearchFacetNumber from '../SearchFacetNumber'\nimport SearchFacetSelect from '../SearchFacetSelect'\nimport SearchFacetString from '../SearchFacetString'\nimport SearchFacetTags from '../SearchFacetTags'\n\ntype Props = {\n layout?: 'inline' | 'stack'\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst StackContainer = styled(Flex)(({theme}: {theme: Theme}) => {\n return css`\n > * {\n margin-bottom: ${rem(\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.space[2]!,\n )};\n }\n `\n})\n\nconst SearchFacets = (props: Props) => {\n const {layout = 'inline'} = props\n\n // Redux\n const searchFacets = useTypedSelector((state) => state.search.facets)\n\n const Items = searchFacets.map((facet) => {\n const key = facet.id\n if (facet.type === 'number') {\n return <SearchFacetNumber facet={facet} key={key} />\n }\n\n if (facet.type === 'searchable') {\n return <SearchFacetTags facet={facet} key={key} />\n }\n\n if (facet.type === 'select') {\n return <SearchFacetSelect facet={facet} key={key} />\n }\n\n if (facet.type === 'string') {\n return <SearchFacetString facet={facet} key={key} />\n }\n\n return null\n })\n\n if (layout === 'inline') {\n if (searchFacets.length === 0) {\n return null\n }\n\n return (\n <Box marginBottom={2}>\n <Inline gap={2}>{Items}</Inline>\n </Box>\n )\n }\n\n if (layout === 'stack') {\n return (\n <StackContainer align=\"flex-start\" direction=\"column\">\n {Items}\n </StackContainer>\n )\n }\n\n throw Error('Invalid layout')\n}\n\nexport default SearchFacets\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Button, Flex} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuGroup, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {FACETS} from '../../constants'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetDivider, SearchFacetGroup, SearchFacetInputProps} from '../../types'\n\nconst SearchFacetsControl = () => {\n // Redux\n const dispatch = useDispatch()\n const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n const searchFacets = useTypedSelector((state) => state.search.facets)\n const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n const popoverProps = usePortalPopoverProps()\n\n const {creditLine} = useToolOptions()\n\n const isTool = !selectedDocument\n\n const filteredFacets = FACETS\n // Filter facets based on current context, whether it's invoked as a tool, or via selection through via custom asset source.\n .filter((facet) => {\n // Remove credit line filter if it's not enabled\n if (!creditLine?.enabled && facet?.type === 'string' && facet?.name === 'creditLine') {\n return false\n }\n\n if (facet.type === 'group' || facet.type === 'divider') {\n return true\n }\n\n if (isTool) {\n return !facet?.selectOnly\n }\n\n const matchingAssetTypes = facet.assetTypes.filter((assetType) =>\n assetTypes.includes(assetType),\n )\n return matchingAssetTypes.length > 0\n })\n // Remove adjacent and leading / trailing dividers\n .filter((facet, index, facets) => {\n const previousFacet = facets[index - 1]\n // Ignore leading + trailing dividers\n if (facet.type === 'divider' && (index === 0 || index === facets.length - 1)) {\n return false\n }\n // Ignore adjacent dividers\n if (facet.type === 'divider' && previousFacet?.type === 'divider') {\n return false\n }\n return true\n })\n\n const hasSearchFacets = filteredFacets.length > 0\n\n const renderMenuFacets = (\n facets: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[],\n level: number = 0,\n ) => {\n return (\n <>\n {facets?.map((facet, index) => {\n if (facet.type === 'divider') {\n return <MenuDivider key={index} />\n }\n\n // Recursively render menu facets\n if (facet.type === 'group') {\n return (\n <MenuGroup key={`group-${level}-${index}`} text={facet.title} title={facet.title}>\n {renderMenuFacets(facet.facets, level + 1)}\n </MenuGroup>\n )\n }\n\n if (facet) {\n const disabled =\n !facet.operatorTypes && !!searchFacets.find((v) => v.name === facet.name)\n\n return (\n <MenuItem\n disabled={disabled}\n fontSize={1}\n key={facet.name}\n onClick={() => dispatch(searchActions.facetsAdd({facet}))}\n padding={2}\n text={facet.title}\n />\n )\n }\n\n return null\n })}\n </>\n )\n }\n\n return (\n <Flex>\n {/* Add filter button */}\n <MenuButton\n button={\n <Button\n disabled={!hasSearchFacets}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n gap={2}\n text=\"Add filter\"\n tone=\"primary\"\n />\n }\n id=\"facets\"\n menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n popover={{\n ...popoverProps,\n placement: 'right-start',\n }}\n />\n\n {/* Clear facets button */}\n {searchFacets.length > 0 && (\n <Button\n fontSize={1}\n mode=\"bleed\"\n onClick={() => dispatch(searchActions.facetsClear())}\n text=\"Clear\"\n />\n )}\n </Flex>\n )\n}\n\nexport default SearchFacetsControl\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogSearchFacetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\n\ntype Props = {\n children: ReactNode\n dialog: DialogSearchFacetsProps\n}\n\nconst DialogSearchFacets = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog animate header=\"Filters\" id={id} onClose={handleClose} width={1}>\n <Box padding={3}>\n <SearchFacets layout=\"stack\" />\n <SearchFacetsControl />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogSearchFacets\n","import {Box, Flex} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {tagsActions} from '../../modules/tags'\nimport type {DialogTagCreateProps, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogTagCreateProps\n}\n\nconst DialogTagCreate = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n const dispatch = useDispatch()\n\n const creating = useTypedSelector((state) => state.tags.creating)\n const creatingError = useTypedSelector((state) => state.tags.creatingError)\n\n const {\n // Read the formState before render to subscribe the form state through Proxy\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n setError,\n } = useForm<TagFormData>({\n defaultValues: {\n name: '',\n },\n mode: 'onChange',\n resolver: zodFormResolver<TagFormData>(tagFormSchema),\n })\n\n const formUpdating = creating\n\n const handleClose = () => {\n dispatch(dialogActions.clear())\n }\n\n // - submit react-hook-form\n const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n\n dispatch(tagsActions.createRequest({name: sanitizedFormData['name']}))\n }\n\n useEffect(() => {\n if (creatingError) {\n setError('name', {\n message: creatingError?.message,\n })\n }\n }, [creatingError, setError])\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Create Tag\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n {/* Form fields */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogTagCreate\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useState} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectTagById, tagsActions} from '../../modules/tags'\nimport type {DialogTagEditProps, Tag, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogTagEditProps\n}\n\nconst DialogTagEdit = (props: Props) => {\n const {\n children,\n dialog: {id, tagId},\n } = props\n\n const client = useVersionedClient()\n\n const dispatch = useDispatch()\n const tagItem = useTypedSelector((state) => selectTagById(state, String(tagId))) // TODO: double check string cast\n\n // - Generate a snapshot of the current tag\n const [tagSnapshot, setTagSnapshot] = useState(tagItem?.tag)\n\n const currentTag = tagItem ? tagItem?.tag : tagSnapshot\n const generateDefaultValues = useCallback(\n (tag?: Tag) => ({\n name: tag?.name?.current || '',\n }),\n [],\n )\n\n const {\n // Read the formState before render to subscribe the form state through Proxy\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n reset,\n setError,\n } = useForm<TagFormData>({\n defaultValues: generateDefaultValues(tagItem?.tag),\n mode: 'onChange',\n resolver: zodFormResolver<TagFormData>(tagFormSchema),\n })\n\n const formUpdating = !tagItem || tagItem?.updating\n\n const handleClose = () => {\n dispatch(dialogActions.remove({id}))\n }\n\n // Submit react-hook-form\n const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n if (!tagItem?.tag) {\n return\n }\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n tagsActions.updateRequest({\n closeDialogId: tagItem?.tag?._id,\n formData: {\n name: {\n _type: 'slug',\n current: sanitizedFormData['name'],\n },\n },\n tag: tagItem?.tag,\n }),\n )\n }\n\n const handleDelete = () => {\n if (!tagItem?.tag) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteTag({\n closeDialogId: tagItem?.tag?._id,\n tag: tagItem?.tag,\n }),\n )\n }\n\n const handleTagUpdate = useCallback(\n (update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate snapshot\n setTagSnapshot(result as Tag)\n // Reset react-hook-form\n reset(generateDefaultValues(result as Tag))\n }\n },\n [reset, generateDefaultValues],\n )\n\n useEffect(() => {\n if (tagItem?.error) {\n setError('name', {\n message: tagItem.error?.message,\n })\n }\n }, [setError, tagItem?.error])\n\n // - Listen for asset mutations and update snapshot\n useEffect(() => {\n if (!tagItem?.tag) {\n return undefined\n }\n\n // Remember that Sanity listeners ignore joins, order clauses and projections\n const subscriptionAsset = client\n .listen(groq`*[_id == $id]`, {id: tagItem?.tag._id})\n .subscribe(handleTagUpdate)\n\n return () => {\n subscriptionAsset?.unsubscribe()\n }\n }, [client, handleTagUpdate, tagItem?.tag])\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"space-between\">\n {/* Delete button */}\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid}\n isValid={isValid}\n lastUpdated={tagItem?.tag?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )\n\n if (!currentTag) {\n return null\n }\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Edit Tag\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n {/* Form fields */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!tagItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogTagEdit\n","import {ArrowDownIcon} from '@sanity/icons/ArrowDown'\nimport {ArrowUpIcon} from '@sanity/icons/ArrowUp'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {inputs} from '../../config/searchFacets'\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {searchActions, selectIsSearchFacetTag} from '../../modules/search'\nimport type {SearchFacetInputSearchableProps, TagActions, TagItem} from '../../types'\n\ntype Props = {\n actions?: TagActions[]\n tag: TagItem\n}\n\nconst TagContainer = styled(Flex)`\n height: ${PANEL_HEIGHT}px;\n`\n\nconst ButtonContainer = styled(Flex)`\n @media (pointer: fine) {\n visibility: hidden;\n }\n\n @media (hover: hover) and (pointer: fine) {\n ${TagContainer}:hover & {\n visibility: visible;\n }\n }\n`\n\ntype TagButtonProps = {\n disabled?: boolean\n icon: ReactNode\n onClick: () => void\n tone?: 'critical' | 'primary'\n tooltip: string\n}\n\nconst TagButton = (props: TagButtonProps) => {\n const {disabled, icon, onClick, tone, tooltip} = props\n\n return (\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>\n }\n disabled={'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Button\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />\n </Tooltip>\n )\n}\n\nconst Tag = (props: Props) => {\n const {actions, tag} = props\n\n // Redux\n const dispatch = useDispatch()\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n const isSearchFacetTag = useTypedSelector((state) => selectIsSearchFacetTag(state, tag?.tag?._id))\n\n // Callbacks\n const handleSearchFacetTagRemove = () => {\n dispatch(searchActions.facetsRemoveByTag({tagId: tag.tag._id}))\n }\n\n const handleShowAddTagToAssetsDialog = () => {\n dispatch(dialogActions.showConfirmAssetsTagAdd({assetsPicked, tag: tag.tag}))\n }\n\n const handleShowRemoveTagFromAssetsDialog = () => {\n dispatch(dialogActions.showConfirmAssetsTagRemove({assetsPicked, tag: tag.tag}))\n }\n\n const handleShowTagDeleteDialog = () => {\n dispatch(dialogActions.showConfirmDeleteTag({tag: tag.tag}))\n }\n\n const handleShowTagEditDialog = () => {\n dispatch(DIALOG_ACTIONS.showTagEdit({tagId: tag?.tag?._id}))\n }\n\n const handleSearchFacetTagAddOrUpdate = () => {\n const searchFacet = {\n ...inputs.tag,\n value: {\n label: tag?.tag?.name?.current,\n value: tag?.tag?._id,\n },\n } as SearchFacetInputSearchableProps\n\n if (isSearchFacetTag) {\n dispatch(\n searchActions.facetsUpdate({\n name: 'tag',\n operatorType: 'references',\n value: searchFacet.value,\n }),\n )\n } else {\n dispatch(searchActions.facetsAdd({facet: searchFacet}))\n }\n }\n\n return (\n <TagContainer align=\"center\" flex={1} justify=\"space-between\" paddingLeft={3}>\n <Box flex={1}>\n <Text\n muted\n size={1}\n style={{\n opacity: tag?.updating ? 0.5 : 1.0,\n userSelect: 'none',\n }}\n textOverflow=\"ellipsis\"\n >\n {tag?.tag?.name?.current}\n </Text>\n </Box>\n\n <ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n {/* Search facet toggle */}\n {actions?.includes('search') && (\n <TagButton\n disabled={tag?.updating}\n icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n onClick={\n isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n }\n tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n />\n )}\n {/* Edit icon */}\n {actions?.includes('edit') && (\n <TagButton\n disabled={tag?.updating}\n icon={<EditIcon />}\n onClick={handleShowTagEditDialog}\n tone=\"primary\"\n tooltip=\"Edit tag\"\n />\n )}\n {/* Apply to all */}\n {actions?.includes('applyAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowUpIcon />}\n onClick={handleShowAddTagToAssetsDialog}\n tone=\"primary\"\n tooltip=\"Add tag to selected assets\"\n />\n )}\n {/* Remove from all */}\n {actions?.includes('removeAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowDownIcon />}\n onClick={handleShowRemoveTagFromAssetsDialog}\n tone=\"critical\"\n tooltip=\"Remove tag from selected assets\"\n />\n )}\n\n {/* Delete icon */}\n {actions?.includes('delete') && (\n <TagButton\n disabled={tag?.updating}\n icon={<TrashIcon />}\n onClick={handleShowTagDeleteDialog}\n tone=\"critical\"\n tooltip=\"Delete tag\"\n />\n )}\n </ButtonContainer>\n </TagContainer>\n )\n}\n\nexport default Tag\n","import {Flex, Label} from '@sanity/ui'\nimport {memo, useState} from 'react'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport type {TagActions, TagItem} from '../../types'\nimport Tag from '../Tag'\n\nconst VirtualRow = memo(\n ({\n isScrolling,\n item,\n }: {\n isScrolling?: boolean\n item:\n | string\n | (TagItem & {\n actions: TagActions[]\n })\n }) => {\n // Render label\n if (typeof item === 'string') {\n return (\n <Flex\n align=\"center\"\n justify=\"space-between\"\n key={item}\n paddingX={3}\n style={{height: `${PANEL_HEIGHT}px`}}\n >\n <Label size={0}>{item}</Label>\n </Flex>\n )\n }\n\n // Render tag - only display actions if we're not in the process of scrolling\n return <Tag actions={isScrolling ? undefined : item.actions} key={item.tag?._id} tag={item} />\n },\n)\n\nconst TagsVirtualized = ({tags}: {tags: TagItem[]}) => {\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n\n // State\n const [isScrolling, setIsScrolling] = useState(false)\n\n // TODO: refactor, there's most certainly a more performant way to do this\n\n // Filter out all tag IDS used (across all) and dedupe\n const pickedTagIds = assetsPicked?.reduce((acc: string[], val) => {\n const assetTagIds = val?.asset?.opt?.media?.tags?.map((tag) => tag._ref) || []\n acc = acc.concat(assetTagIds)\n return acc\n }, [])\n const pickedTagIdsUnique = [...new Set(pickedTagIds)]\n\n // Segment tags into two buckets:\n // 1. those which exist in all picked assets ('applied to all')\n // 2. those which exist in some picked assets ('applied to some')\n const tagIdsSegmented = pickedTagIdsUnique.reduce(\n (acc: {appliedToAll: string[]; appliedToSome: string[]}, tagId) => {\n const tagIsInEveryAsset = assetsPicked.every((assetItem) => {\n const tagIndex =\n assetItem.asset.opt?.media?.tags?.findIndex((tag) => tag._ref === tagId) ?? -1\n return tagIndex >= 0\n })\n\n if (tagIsInEveryAsset) {\n acc.appliedToAll.push(tagId)\n } else {\n acc.appliedToSome.push(tagId)\n }\n\n return acc\n },\n {\n appliedToAll: [],\n appliedToSome: [],\n },\n )\n\n const tagsAppliedToAll = tags\n .filter((tag) => tagIdsSegmented.appliedToAll.includes(tag.tag._id))\n .map((tagItem) => ({\n ...tagItem,\n actions: ['delete', 'edit', 'removeAll', 'search'] as TagActions[],\n }))\n const tagsAppliedToSome = tags\n .filter((tag) => tagIdsSegmented.appliedToSome.includes(tag.tag._id))\n .map((tagItem) => ({\n ...tagItem,\n actions: ['applyAll', 'delete', 'edit', 'removeAll', 'search'] as TagActions[],\n }))\n const tagsUnused = tags\n .filter((tag) => !pickedTagIdsUnique.includes(tag.tag._id))\n .map((tagItem) => ({\n ...tagItem,\n actions: ['applyAll', 'delete', 'edit', 'search'] as TagActions[],\n }))\n\n let items: (\n | string\n | (TagItem & {\n actions: TagActions[]\n })\n )[] = []\n if (assetsPicked.length === 0) {\n items = tags.map((tagItem) => ({\n ...tagItem,\n actions: ['delete', 'edit', 'search'] as TagActions[],\n }))\n } else {\n if (tagsAppliedToAll?.length > 0) {\n items = [\n ...items, //\n assetsPicked.length === 1 ? 'Used' : 'Used by all',\n ...tagsAppliedToAll,\n ]\n }\n if (tagsAppliedToSome?.length > 0) {\n items = [\n ...items, //\n 'Used by some',\n ...tagsAppliedToSome,\n ]\n }\n if (tagsUnused?.length > 0) {\n items = [\n ...items, //\n 'Unused',\n ...tagsUnused,\n ]\n }\n }\n\n return (\n <Virtuoso\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n if (typeof item === 'string') {\n return item\n }\n return item!.tag._id\n }}\n isScrolling={setIsScrolling}\n itemContent={(index) => {\n return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n }}\n style={{flex: 1, overflowX: 'hidden'}}\n totalCount={items.length}\n />\n )\n}\n\nexport default TagsVirtualized\n","import {ComposeIcon} from '@sanity/icons/Compose'\nimport {Box, Button, Flex, Inline, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n allowCreate?: boolean\n light?: boolean\n title: string\n}\n\nconst TagViewHeader = ({allowCreate, light, title}: Props) => {\n const scheme = useColorSchemeValue()\n\n const dispatch = useDispatch()\n const tagsCreating = useTypedSelector((state) => state.tags.creating)\n const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n const handleTagCreate = () => {\n dispatch(DIALOG_ACTIONS.showTagCreate())\n }\n\n return (\n <>\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingLeft={3}\n style={{\n background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }}\n >\n <Inline gap={2}>\n <Label size={0}>{title}</Label>\n {tagsFetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n {/* Create new tag button */}\n {allowCreate && (\n <Box marginRight={1}>\n <Button\n disabled={tagsCreating}\n fontSize={1} //\n icon={ComposeIcon}\n mode=\"bleed\"\n onClick={handleTagCreate}\n style={{\n background: 'transparent',\n boxShadow: 'none',\n }}\n />\n </Box>\n )}\n </Flex>\n </>\n )\n}\n\nexport default TagViewHeader\n","import {Box, Flex, Text} from '@sanity/ui'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPickedLength} from '../../modules/assets'\nimport {selectTags} from '../../modules/tags'\nimport TagsVirtualized from '../TagsVirtualized'\nimport TagViewHeader from '../TagViewHeader'\n\nconst TagView = () => {\n const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n const {excludeTagSlugs} = useToolOptions()\n const tagsAll = useTypedSelector(selectTags)\n const tags =\n excludeTagSlugs.length > 0\n ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n : tagsAll\n const fetching = useTypedSelector((state) => state.tags.fetching)\n const fetchCount = useTypedSelector((state) => state.tags.fetchCount)\n const fetchComplete = fetchCount !== -1\n const hasTags = !fetching && tags?.length > 0\n const hasPicked = !!(numPickedAssets > 0)\n\n return (\n <Flex direction=\"column\" flex={1} height=\"fill\">\n <TagViewHeader\n allowCreate\n light={hasPicked}\n title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n />\n\n {fetchComplete && !hasTags && (\n <Box padding={3}>\n <Text muted size={1}>\n <em>No tags</em>\n </Text>\n </Box>\n )}\n\n {hasTags && <TagsVirtualized tags={tags} />}\n </Flex>\n )\n}\n\nexport default TagView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogTagsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport TagView from '../TagView'\n\ntype Props = {\n children: ReactNode\n dialog: DialogTagsProps\n}\n\nconst DialogTags = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog animate header=\"All Tags\" id={id} onClose={handleClose} width={1}>\n <Box\n style={{\n height: '100%',\n minHeight: '420px', // explicit height required as <TagView> is virtualized\n }}\n >\n <TagView />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogTags\n","import useTypedSelector from '../../hooks/useTypedSelector'\nimport type {Dialog} from '../../types'\nimport DialogAssetEdit from '../DialogAssetEdit'\nimport DialogAllAssets from '../DialogAssetsOverView'\nimport DialogConfirm from '../DialogConfirm'\nimport DialogFolderCreate from '../DialogFolderCreate'\nimport DialogFolderMove from '../DialogFolderMove'\nimport DialogFolderRename from '../DialogFolderRename'\nimport DialogFolders from '../DialogFolders'\nimport DialogSearchFacets from '../DialogSearchFacets'\nimport DialogTagCreate from '../DialogTagCreate'\nimport DialogTagEdit from '../DialogTagEdit'\nimport DialogTags from '../DialogTags'\n\nconst Dialogs = () => {\n // Redux\n const currentDialogs = useTypedSelector((state) => state.dialog.items)\n\n const renderDialogs = (dialogs: Dialog[], index: number) => {\n if (dialogs.length === 0 || index >= dialogs.length) {\n return null\n }\n\n const dialog = dialogs[index]!\n const childDialogs = renderDialogs(dialogs, index + 1)\n\n if (dialog.type === 'assetEdit') {\n return (\n <DialogAssetEdit dialog={dialog} key={index}>\n {childDialogs}\n </DialogAssetEdit>\n )\n }\n\n if (dialog.type === 'confirm') {\n return (\n <DialogConfirm dialog={dialog} key={index}>\n {childDialogs}\n </DialogConfirm>\n )\n }\n\n if (dialog.type === 'folderCreate') {\n return (\n <DialogFolderCreate dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolderCreate>\n )\n }\n\n if (dialog.type === 'folderMove') {\n return (\n <DialogFolderMove dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolderMove>\n )\n }\n\n if (dialog.type === 'folderRename') {\n return (\n <DialogFolderRename dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolderRename>\n )\n }\n\n if (dialog.type === 'folders') {\n return (\n <DialogFolders dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolders>\n )\n }\n\n if (dialog.type === 'searchFacets') {\n return (\n <DialogSearchFacets dialog={dialog} key={index}>\n {childDialogs}\n </DialogSearchFacets>\n )\n }\n\n if (dialog.type === 'tagCreate') {\n return (\n <DialogTagCreate dialog={dialog} key={index}>\n {childDialogs}\n </DialogTagCreate>\n )\n }\n\n if (dialog.type === 'tagEdit') {\n return (\n <DialogTagEdit dialog={dialog} key={index}>\n {childDialogs}\n </DialogTagEdit>\n )\n }\n\n if (dialog.type === 'tags') {\n return (\n <DialogTags dialog={dialog} key={index}>\n {childDialogs}\n </DialogTags>\n )\n }\n\n if (dialog.type === 'dialogAllAssets') {\n return (\n <DialogAllAssets dialog={dialog} key={index}>\n {childDialogs}\n </DialogAllAssets>\n )\n }\n\n return null\n }\n\n return renderDialogs(currentDialogs, 0)\n}\n\nexport default Dialogs\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect} from 'react'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\nconst Notifications = () => {\n const items = useTypedSelector((state) => state.notifications.items)\n const toast = useToast()\n\n useEffect(() => {\n if (items.length > 0) {\n const lastItem = items[items.length - 1]!\n toast.push({\n closable: true,\n status: lastItem.status,\n title: lastItem.title,\n })\n }\n }, [items, toast])\n\n return null\n}\n\nexport default Notifications\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\n\ntype DebugReducerState = {\n badConnection: boolean\n enabled: boolean\n}\n\nconst initialState = {\n badConnection: false,\n enabled: false,\n} as DebugReducerState\n\nconst debugSlice = createSlice({\n name: 'debug',\n initialState,\n reducers: {\n setBadConnection(state, action: PayloadAction<boolean>) {\n state.badConnection = action.payload\n },\n toggleEnabled(state) {\n state.enabled = !state.enabled\n },\n },\n})\n\nexport const debugActions = {...debugSlice.actions}\n\nexport default debugSlice.reducer\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\nimport type {UnknownAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {bufferTime, filter, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError, ImageAsset, MyEpic} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {uploadsActions} from '../uploads'\n\ntype Notification = {\n asset?: ImageAsset\n status?: 'error' | 'warning' | 'success' | 'info'\n title?: string\n}\n\ntype NotificationsReducerState = {\n items: Notification[]\n}\n\nfunction messageFromGenericErrorPayload(payload: unknown): string {\n if (!payload || typeof payload !== 'object') {\n return 'Unknown error'\n }\n if (\n 'error' in payload &&\n payload.error &&\n typeof payload.error === 'object' &&\n payload.error !== null &&\n 'message' in payload.error\n ) {\n return String((payload.error as HttpError).message)\n }\n if ('message' in payload && typeof (payload as HttpError).message === 'string') {\n return String((payload as HttpError).message)\n }\n return 'Unknown error'\n}\n\nconst initialState = {\n items: [],\n} as NotificationsReducerState\n\nconst notificationsSlice = createSlice({\n name: 'notifications',\n initialState,\n reducers: {\n add(state, action: PayloadAction<Notification>) {\n const {asset, status, title} = action.payload\n state.items.push({\n asset,\n status,\n title,\n })\n },\n },\n})\n\n// Epics\n\nexport const notificationsAssetsDeleteCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.deleteComplete.match),\n mergeMap((action) => {\n const {assetIds} = action.payload\n const deletedCount = assetIds.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `${deletedCount} ${pluralize('asset', deletedCount)} deleted`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsDeleteErrorEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.deleteError.match),\n mergeMap((action) => {\n const {assetIds} = action.payload\n const count = assetIds.length\n return of(\n notificationsSlice.actions.add({\n status: 'error',\n title: `Unable to delete ${count} ${pluralize(\n 'asset',\n count,\n )}. Please review any asset errors and try again.`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsUploadCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(uploadsActions.checkComplete.match),\n mergeMap((action) => {\n const {results} = action.payload\n\n const count = Object.keys(results).length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `Uploaded ${count} ${pluralize('asset', count)}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsTagsAddCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(ASSETS_ACTIONS.tagsAddComplete.match),\n mergeMap((action) => {\n const count = action?.payload?.assets?.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `Tag added to ${count} ${pluralize('asset', count)}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsTagsRemoveCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(ASSETS_ACTIONS.tagsRemoveComplete.match),\n mergeMap((action) => {\n const count = action?.payload?.assets?.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `Tag removed from ${count} ${pluralize('asset', count)}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsUpdateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.updateComplete.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const updatedCount = actions.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `${updatedCount} ${pluralize('asset', updatedCount)} updated`,\n }),\n )\n }),\n )\n\nexport const notificationsGenericErrorEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.fetchError.type,\n assetsActions.updateError.type,\n tagsActions.createError.type,\n tagsActions.deleteError.type,\n tagsActions.fetchError.type,\n tagsActions.updateError.type,\n foldersActions.createError.type,\n foldersActions.deleteError.type,\n foldersActions.renameError.type,\n uploadsActions.uploadError.type,\n ),\n mergeMap((action: UnknownAction) => {\n const title = `An error occurred: ${messageFromGenericErrorPayload(action['payload'])}`\n return of(\n notificationsSlice.actions.add({\n status: 'error',\n title,\n }),\n )\n }),\n )\n\nexport const notificationsTagCreateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.createComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag created`}))),\n )\n\nexport const notificationsTagDeleteCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.deleteComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag deleted`}))),\n )\n\nexport const notificationsTagUpdateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.updateComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag updated`}))),\n )\n\nexport const notificationsFolderCreateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(foldersActions.createComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder created`}))),\n )\n\nexport const notificationsFolderDeleteCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(foldersActions.deleteComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder deleted`}))),\n )\n\nexport const notificationsFolderRenameCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(foldersActions.renameComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder renamed`}))),\n )\n\nexport const notificationsActions = {...notificationsSlice.actions}\n\nexport default notificationsSlice.reducer\n","import {createSlice} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityDocument, SanityImageAssetDocument} from '@sanity/client'\n\ntype SelectedReducerState = {\n assets: (SanityAssetDocument | SanityImageAssetDocument)[]\n document?: SanityDocument\n documentAssetIds?: string[]\n}\n\nconst initialState = {\n assets: [],\n document: undefined,\n documentAssetIds: [],\n} as SelectedReducerState\n\nconst selectedSlice = createSlice({\n name: 'selected',\n initialState,\n reducers: {},\n})\n\nexport default selectedSlice.reducer\n","import {type Reducer, type StateFromReducersMapObject, combineReducers} from '@reduxjs/toolkit'\nimport {combineEpics} from 'redux-observable'\n\nimport assetsReducer, {\n assetsDeleteEpic,\n assetsFetchAfterDeleteAllEpic,\n assetsFetchEpic,\n assetsFolderSetEpic,\n assetsFolderSetRefreshEpic,\n assetsFetchNextPageEpic,\n assetsFetchPageIndexEpic,\n assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsTagsAddEpic,\n assetsTagsRemoveEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n assetsUpdateImageReferencesEpic,\n} from './assets'\nimport debugReducer from './debug'\nimport dialogReducer, {\n dialogClearOnAssetUpdateEpic,\n dialogTagCreateEpic,\n dialogTagDeleteEpic,\n} from './dialog'\nimport foldersReducer, {\n foldersCurrentFolderEpic,\n foldersCreateEpic,\n foldersDeleteEpic,\n foldersFetchEpic,\n foldersRefreshEpic,\n foldersRenameEpic,\n} from './folders'\nimport notificationsReducer, {\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsTagsAddCompleteEpic,\n notificationsAssetsTagsRemoveCompleteEpic,\n notificationsAssetsUpdateCompleteEpic,\n notificationsFolderCreateCompleteEpic,\n notificationsFolderDeleteCompleteEpic,\n notificationsFolderRenameCompleteEpic,\n notificationsGenericErrorEpic,\n notificationsTagCreateCompleteEpic,\n notificationsTagDeleteCompleteEpic,\n notificationsTagUpdateCompleteEpic,\n} from './notifications'\nimport searchReducer, {searchFacetTagUpdateEpic} from './search'\nimport selectedReducer from './selected'\nimport tagsReducer, {\n tagsCreateEpic,\n tagsDeleteEpic,\n tagsFetchEpic,\n tagsListenerCreateQueueEpic,\n tagsListenerDeleteQueueEpic,\n tagsListenerUpdateQueueEpic,\n tagsSortEpic,\n tagsUpdateEpic,\n} from './tags'\nimport uploadsReducer, {\n uploadsAssetStartEpic,\n uploadsAssetUploadEpic,\n uploadsCheckRequestEpic,\n uploadsCompleteQueueEpic,\n} from './uploads'\n\nexport const rootEpic = combineEpics(\n assetsDeleteEpic,\n assetsFetchEpic,\n assetsFetchAfterDeleteAllEpic,\n assetsFetchNextPageEpic,\n assetsFetchPageIndexEpic,\n assetsFolderSetEpic,\n assetsFolderSetRefreshEpic,\n assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsTagsAddEpic,\n assetsTagsRemoveEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n assetsUpdateImageReferencesEpic,\n dialogClearOnAssetUpdateEpic,\n dialogTagCreateEpic,\n dialogTagDeleteEpic,\n foldersCurrentFolderEpic,\n foldersCreateEpic,\n foldersDeleteEpic,\n foldersFetchEpic,\n foldersRefreshEpic,\n foldersRenameEpic,\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsTagsAddCompleteEpic,\n notificationsAssetsTagsRemoveCompleteEpic,\n notificationsAssetsUpdateCompleteEpic,\n notificationsFolderCreateCompleteEpic,\n notificationsFolderDeleteCompleteEpic,\n notificationsFolderRenameCompleteEpic,\n notificationsGenericErrorEpic,\n notificationsTagCreateCompleteEpic,\n notificationsTagDeleteCompleteEpic,\n notificationsTagUpdateCompleteEpic,\n searchFacetTagUpdateEpic,\n tagsCreateEpic,\n tagsDeleteEpic,\n tagsFetchEpic,\n tagsListenerCreateQueueEpic,\n tagsListenerDeleteQueueEpic,\n tagsListenerUpdateQueueEpic,\n tagsSortEpic,\n tagsUpdateEpic,\n uploadsAssetStartEpic,\n uploadsAssetUploadEpic,\n uploadsCheckRequestEpic,\n uploadsCompleteQueueEpic,\n)\n\nconst reducers = {\n assets: assetsReducer,\n debug: debugReducer,\n dialog: dialogReducer,\n folders: foldersReducer,\n notifications: notificationsReducer,\n search: searchReducer,\n selected: selectedReducer,\n tags: tagsReducer,\n uploads: uploadsReducer,\n}\n\ntype ReducersMapObject = typeof reducers\n\n// Workaround to avoid `$CombinedState` ts errors\n// source: https://github.com/reduxjs/redux-toolkit/issues/2068#issuecomment-1130796500\n// TODO: remove once we use `redux-toolkit` v2\nexport const rootReducer: Reducer<StateFromReducersMapObject<ReducersMapObject>> =\n combineReducers(reducers)\n","import type {SanityDocument} from '@sanity/client'\n\nconst isPlainObject = (value: any) =>\n value !== null && typeof value === 'object' && !Array.isArray(value)\n\n// Recursively search node for any linked asset ids (`asset._type === 'reference'`)\nconst getAssetIds = (node: Record<string, any>, acc: string[] = []) => {\n if (Array.isArray(node)) {\n node.forEach((v) => {\n getAssetIds(v, acc)\n })\n }\n\n if (isPlainObject(node)) {\n if (node?.['asset']?._type === 'reference' && node?.['asset']?._ref) {\n acc.push(node['asset']._ref)\n }\n\n Object.values(node).forEach((val) => {\n getAssetIds(val, acc)\n })\n }\n\n return acc\n}\n\n// Retrieve all linked asset ids from a Sanity document\nconst getDocumentAssetIds = (document: SanityDocument): string[] => {\n const assetIds = getAssetIds(document)\n\n // Sort and dedupe\n return [...new Set(assetIds.sort())]\n}\n\nexport default getDocumentAssetIds\n","import {SUPPORTED_ASSET_TYPES} from '../constants'\nimport type {AssetType} from '../types'\n\n/**\n * Determines whether or not the provided asset type (eg 'image', 'file', 'arbitrary')\n * is a supported asset type for this plugin.\n *\n * @param assetType - The asset type to check.\n * @returns True if the asset type is supported, false otherwise.\n * @internal\n */\nexport function isSupportedAssetType(assetType?: string): assetType is AssetType {\n const supported: string[] = SUPPORTED_ASSET_TYPES\n return assetType ? supported.includes(assetType) : false\n}\n","import {configureStore, type Store, type UnknownAction} from '@reduxjs/toolkit'\nimport type {SanityClient} from '@sanity/client'\nimport {type ReactNode, useState} from 'react'\nimport {Provider} from 'react-redux'\nimport {createEpicMiddleware} from 'redux-observable'\nimport type {AssetSourceComponentProps, SanityDocument} from 'sanity'\n\nimport {rootEpic, rootReducer} from '../../modules'\nimport {initialState as assetsInitialState} from '../../modules/assets'\n// import {assetsActions} from '../../modules/assets'\n// import {searchActions} from '../../modules/search'\n// import {uploadsActions} from '../../modules/uploads'\nimport type {RootReducerState} from '../../modules/types'\nimport getDocumentAssetIds from '../../utils/getDocumentAssetIds'\nimport {isSupportedAssetType} from '../../utils/isSupportedAssetType'\n\ntype Props = {\n assetType?: AssetSourceComponentProps['assetType']\n children?: ReactNode\n client: SanityClient\n document?: SanityDocument\n excludeTagSlugs?: string[]\n selectedAssets?: AssetSourceComponentProps['selectedAssets']\n}\n\nfunction createReduxStore(props: Props): Store {\n const epicMiddleware = createEpicMiddleware<UnknownAction, UnknownAction, RootReducerState>({\n dependencies: {\n client: props.client,\n },\n })\n\n const store = configureStore({\n reducer: rootReducer,\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n /*\n serializableCheck: {\n ignoredActions: [\n assetsActions.deleteError.type,\n uploadsActions.uploadRequest.type,\n uploadsActions.uploadStart.type,\n ]\n },\n */\n // TODO: remove once we're no longer storing non-serializable data in the store\n serializableCheck: false,\n thunk: false,\n }).prepend(epicMiddleware),\n devTools: true,\n preloadedState: {\n assets: {\n ...assetsInitialState,\n assetTypes: isSupportedAssetType(props?.assetType) ? [props.assetType] : ['file', 'image'],\n excludeTagSlugs: props.excludeTagSlugs?.length ? [...props.excludeTagSlugs] : [],\n },\n debug: {\n badConnection: false,\n enabled: false,\n },\n dialog: {items: []},\n folders: {\n byId: {},\n childrenByParentId: {},\n rootIds: [],\n exactCountByFolderId: {},\n unfiledCount: 0,\n currentFolderId: null,\n currentFolderUnfiled: false,\n panelVisible: false,\n fetching: false,\n fetchCount: -1,\n creating: false,\n renaming: false,\n },\n notifications: {items: []},\n search: {facets: [], query: ''},\n selected: {\n assets: props.selectedAssets || [],\n document: props.document,\n documentAssetIds: props.document ? getDocumentAssetIds(props.document) : [],\n },\n tags: {\n allIds: [],\n byIds: {},\n creating: false,\n fetchCount: -1,\n fetching: false,\n panelVisible: true,\n },\n uploads: {\n allIds: [],\n byIds: {},\n },\n },\n })\n\n epicMiddleware.run(rootEpic)\n\n return store\n}\n\nfunction ReduxProvider({children, ...props}: Props) {\n const [store] = useState(() => createReduxStore(props))\n\n return <Provider store={store}>{children}</Provider>\n}\n\nexport default ReduxProvider\n","import {PortalProvider} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport constructFilter from '../../utils/constructFilter'\nimport Dialogs from '../Dialogs'\nimport Notifications from '../Notifications'\nimport ReduxProvider from '../ReduxProvider'\n\n/**\n * Fetches the already-selected asset into the store and opens the `assetEdit`\n * dialog for it. Once that dialog (and any nested dialogs, e.g. delete confirm)\n * are dismissed, the asset source itself is closed via `onClose`.\n *\n * Tracking the dialog lifecycle through redux is what allows the source to be\n * reopened: closing the inner dialog only removes it from the store, so without\n * this the source would stay mounted (showing nothing) and could not be opened\n * a second time.\n */\nconst EditAssetDialog = ({assetId, onClose}: {assetId: string; onClose: () => void}) => {\n const dispatch = useDispatch()\n const openDialogCount = useTypedSelector((state) => state.dialog.items.length)\n const hasOpenedRef = useRef(false)\n\n useEffect(() => {\n // Only fetch the single asset being edited, then open its edit dialog.\n const queryFilter = `${constructFilter({\n assetTypes: ['file', 'image'],\n searchFacets: [],\n })} && _id == $assetId`\n\n dispatch(assetsActions.fetchRequest({params: {assetId}, queryFilter}))\n\n // Tags and folders must be loaded into the store so the edit dialog can\n // resolve the asset's existing tag references and folder path (mirroring\n // `useBrowserInit`). Without this, `selectTagSelectOptions` resolves no tags\n // and saving would patch `opt.media.tags` to null, wiping existing tags.\n dispatch(tagsActions.fetchRequest())\n dispatch(foldersActions.fetchRequest())\n\n dispatch(dialogActions.showAssetEdit({assetId}))\n }, [assetId, dispatch])\n\n useEffect(() => {\n if (openDialogCount > 0) {\n hasOpenedRef.current = true\n } else if (hasOpenedRef.current) {\n onClose()\n }\n }, [openDialogCount, onClose])\n\n return (\n <>\n <Dialogs />\n <Notifications />\n </>\n )\n}\n\nconst EditAssetTool = (props: AssetSourceComponentProps) => {\n const {onClose, selectedAssets} = props\n\n const portalElement = useRootPortalElement()\n\n // `useFormValue` can return null/undefined (e.g. on a pristine/unsaved draft).\n const currentDocument = useFormValue([]) as SanityDocument | null | undefined\n\n const client = useVersionedClient()\n\n const assetId = selectedAssets[0]?._id\n\n // Nothing to edit (e.g. opened on an empty field) – close the source again.\n useEffect(() => {\n if (!assetId) {\n onClose()\n }\n }, [assetId, onClose])\n\n if (!assetId) {\n return null\n }\n\n return (\n <ReduxProvider\n assetType={props.assetType}\n client={client}\n document={currentDocument ?? undefined}\n selectedAssets={selectedAssets}\n >\n <AssetBrowserDispatchProvider onSelect={props.onSelect}>\n <GlobalStyle />\n <PortalProvider element={portalElement}>\n <EditAssetDialog assetId={assetId} onClose={onClose} />\n </PortalProvider>\n </AssetBrowserDispatchProvider>\n </ReduxProvider>\n )\n}\n\nexport default EditAssetTool\n","import {ThLargeIcon} from '@sanity/icons/ThLarge'\nimport {ThListIcon} from '@sanity/icons/ThList'\nimport {Button, Inline} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst ButtonViewGroup = () => {\n // Redux\n const dispatch = useDispatch()\n const view = useTypedSelector((state) => state.assets.view)\n\n return (\n <Inline gap={0} style={{whiteSpace: 'nowrap'}}>\n <Button\n fontSize={1}\n icon={ThLargeIcon}\n mode={view === 'grid' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n style={{\n borderBottomRightRadius: 0,\n borderTopRightRadius: 0,\n }}\n />\n <Button\n fontSize={1}\n icon={ThListIcon}\n mode={view === 'table' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n style={{\n borderBottomLeftRadius: 0,\n borderTopLeftRadius: 0,\n }}\n />\n </Inline>\n )\n}\n\nexport default ButtonViewGroup\n","import {SortIcon} from '@sanity/icons/Sort'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst OrderSelect = () => {\n // Redux\n const dispatch = useDispatch()\n const order = useTypedSelector((state) => state.assets.order)\n\n const popoverProps = usePortalPopoverProps()\n\n return (\n <MenuButton\n button={\n <Button\n fontSize={1}\n icon={SortIcon}\n mode=\"bleed\"\n padding={3}\n text={getOrderTitle(order.field, order.direction)}\n />\n }\n id=\"order\"\n menu={\n <Menu>\n {ORDER_OPTIONS?.map((item, index) => {\n if (item) {\n const selected = order.field === item.field && order.direction === item.direction\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n iconRight={selected}\n key={index}\n onClick={() =>\n dispatch(\n assetsActions.orderSet({\n order: {direction: item.direction, field: item.field},\n }),\n )\n }\n padding={2}\n selected={selected}\n gap={4}\n style={{minWidth: '200px'}}\n text={getOrderTitle(item.field, item.direction)}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )\n}\n\nexport default OrderSelect\n","import {Box} from '@sanity/ui'\nimport {useNProgress} from '@tanem/react-nprogress'\n\ntype Props = {\n loading?: boolean\n}\n\nconst Progress = (props: Props) => {\n const {loading} = props\n\n const {animationDuration, isFinished, progress} = useNProgress({\n animationDuration: 300,\n isAnimating: loading,\n })\n\n return (\n <Box\n style={{\n opacity: isFinished ? 0 : 1,\n transition: `opacity ${animationDuration}ms linear`,\n }}\n >\n <Box\n style={{\n height: '1px',\n background: 'rgba(255, 255, 255, 0.5)',\n position: 'absolute',\n left: 0,\n top: 0,\n transition: `width ${animationDuration}ms linear`,\n width: `${progress * 100}%`,\n }}\n />\n </Box>\n )\n}\n\nexport default Progress\n","const TagIcon = () => (\n <svg\n data-sanity-icon=\"media__tag\" // For icon usage with @sanity/ui <Button />\n fill=\"currentColor\"\n height=\"1em\"\n stroke=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 512 512\"\n width=\"1em\"\n >\n <path\n d=\"M435.25 48h-122.9a14.46 14.46 0 00-10.2 4.2L56.45 297.9a28.85 28.85 0 000 40.7l117 117a28.85 28.85 0 0040.7 0L459.75 210a14.46 14.46 0 004.2-10.2v-123a28.66 28.66 0 00-28.7-28.8z\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"32\"\n />\n <path d=\"M384 160a32 32 0 1132-32 32 32 0 01-32 32z\" />\n </svg>\n)\n\nexport default TagIcon\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Flex, TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\n\nconst TextInputSearch = () => {\n // Redux\n const searchQuery = useTypedSelector((state) => state.search.query)\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n dispatch(searchActions.querySet({searchQuery: e.currentTarget.value}))\n }\n\n const handleClear = () => {\n dispatch(searchActions.querySet({searchQuery: ''}))\n }\n\n return (\n <Box style={{position: 'relative'}}>\n <TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={handleChange}\n placeholder=\"Search\"\n radius={2}\n value={searchQuery}\n />\n\n {/* Clear form button */}\n {searchQuery.length > 0 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n height: '100%',\n opacity: 0.75,\n position: 'absolute',\n right: 0,\n top: 0,\n width: '2em',\n zIndex: 1, // force stacking context\n }}\n >\n <CloseIcon />\n </Flex>\n )}\n </Box>\n )\n}\n\nexport default TextInputSearch\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {Box, Button, Flex, Inline, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport ButtonViewGroup from '../ButtonViewGroup'\nimport OrderSelect from '../OrderSelect'\nimport Progress from '../Progress'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\nimport TagIcon from '../TagIcon'\nimport TextInputSearch from '../TextInputSearch'\n\nconst Controls = () => {\n // Redux\n const dispatch = useDispatch()\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n const pageIndex = useTypedSelector((state) => state.assets.pageIndex)\n const searchFacets = useTypedSelector((state) => state.search.facets)\n const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n const mediaIndex = useMediaIndex()\n\n // Callbacks\n const handleShowSearchFacetDialog = () => {\n dispatch(dialogActions.showSearchFacets())\n }\n\n const handleShowFoldersDialog = () => {\n dispatch(dialogActions.showFolders())\n }\n\n const handleShowTagsDialog = () => {\n dispatch(dialogActions.showTags())\n }\n\n const toggleFoldersPanel = () => {\n dispatch(foldersActions.panelVisibleSet({panelVisible: !foldersPanelVisible}))\n }\n\n const toggleTagsPanelToggle = () => {\n dispatch(tagsActions.panelVisibleSet({panelVisible: !tagsPanelVisible}))\n }\n\n return (\n <Box\n paddingY={2}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n zIndex: 2,\n }}\n >\n {/* Rows: search / filters / orders */}\n <Box marginBottom={2}>\n <Flex\n align=\"flex-start\"\n direction={['column', 'column', 'column', 'column', 'row']}\n justify=\"space-between\"\n >\n {/* Search + Filters */}\n <Flex\n flex={1}\n style={{\n alignItems: 'flex-start',\n flex: 1,\n height: '100%',\n justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n position: 'relative',\n width: '100%',\n }}\n >\n <Box marginX={2} style={{minWidth: '200px'}}>\n {/* Search */}\n <TextInputSearch />\n </Box>\n\n <Box display={['none', 'none', 'block']}>\n <SearchFacets />\n\n {/* Search Facets Control (add / clear) */}\n <Inline gap={2}>\n <SearchFacetsControl />\n </Inline>\n </Box>\n\n <Box display={['block', 'block', 'none']} marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n {/* Filters button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowSearchFacetDialog}\n text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n tone=\"primary\"\n />\n\n {/* Tags button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowTagsDialog}\n text={`Tags`}\n tone=\"primary\"\n />\n\n {/* Folders button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowFoldersDialog}\n text=\"Folders\"\n tone=\"primary\"\n />\n </Inline>\n </Box>\n </Flex>\n </Flex>\n </Box>\n\n <Box>\n <Flex align=\"center\" justify={['space-between']}>\n {/* Folders + Views */}\n <Box marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n <Box display={['none', 'none', 'block']}>\n <Button\n aria-label=\"Toggle folders panel\"\n fontSize={1}\n icon={FolderIcon}\n mode={foldersPanelVisible ? 'default' : 'ghost'}\n onClick={toggleFoldersPanel}\n />\n </Box>\n <ButtonViewGroup />\n </Inline>\n </Box>\n\n <Flex marginX={2}>\n {/* Orders */}\n <OrderSelect />\n {/* Tags panel toggle */}\n <Box display={['none', 'none', 'block']} marginLeft={2}>\n <Button\n fontSize={1}\n icon={\n <Box style={{transform: 'scale(0.75)'}}>\n <TagIcon />\n </Box>\n }\n onClick={toggleTagsPanelToggle}\n mode={tagsPanelVisible ? 'default' : 'ghost'}\n text={tagsPanelVisible ? 'Tags' : ''}\n />\n </Box>\n </Flex>\n </Flex>\n </Box>\n\n {/* Progress bar */}\n <Progress key={pageIndex} loading={fetching} />\n </Box>\n )\n}\n\nexport default Controls\n","import {PlugIcon} from '@sanity/icons/Plug'\nimport {Box, Flex, Switch, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {debugActions} from '../../modules/debug'\n\nconst DebugControls = () => {\n // Redux\n const dispatch = useDispatch()\n const badConnection = useTypedSelector((state) => state.debug.badConnection)\n const debugEnabled = useTypedSelector((state) => state.debug.enabled)\n\n // Callbacks\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n\n dispatch(debugActions.setBadConnection(checked))\n }\n\n const handleToggleControls = () => {\n dispatch(debugActions.toggleEnabled())\n }\n\n // Close on escape key press\n useKeyPress('alt+ctrl+shift+/', handleToggleControls)\n\n if (!debugEnabled) {\n return null\n }\n\n return (\n <Box\n padding={4}\n style={{\n bottom: 0,\n left: 0,\n pointerEvents: 'none',\n position: 'fixed',\n width: '100%',\n }}\n >\n {/* Bad connection toggle */}\n <Flex align=\"center\">\n <Box marginRight={3}>\n <Text muted size={1}>\n <PlugIcon />\n </Text>\n </Box>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n {badConnection\n ? 'Bad connection: +3000ms & 50% chance to fail'\n : 'No connection throttling'}\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"bottom\"\n portal\n >\n <Switch\n checked={badConnection}\n onChange={handleChange}\n style={{\n pointerEvents: 'auto',\n }}\n />\n </Tooltip>\n </Flex>\n </Box>\n )\n}\n\nexport default DebugControls\n","import {Box, Button, Inline, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {foldersActions, selectCurrentFolderSegments} from '../../modules/folders'\n\nconst FolderBreadcrumbs = () => {\n const dispatch = useDispatch()\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const segments = useTypedSelector(selectCurrentFolderSegments)\n\n if (!currentFolderId) {\n return null\n }\n\n return (\n <Box display={['block', 'block', 'none']} padding={2}>\n <Inline gap={1}>\n <Button\n fontSize={1}\n padding={2}\n mode=\"bleed\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n text=\"All assets\"\n />\n\n {segments.map((segment) => (\n <Inline key={segment.id} gap={1}>\n <Text muted size={1}>\n /\n </Text>\n <Button\n fontSize={1}\n padding={2}\n mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n text={segment.name}\n />\n </Inline>\n ))}\n </Inline>\n </Box>\n )\n}\n\nexport default FolderBreadcrumbs\n","import {Box} from '@sanity/ui'\n\nimport {FOLDERS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport FolderView from '../FolderView'\n\nconst FolderPanel = () => {\n const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n\n if (!foldersPanelVisible) {\n return null\n }\n\n return (\n <Box\n style={{\n position: 'relative',\n width: FOLDERS_PANEL_WIDTH,\n }}\n >\n <Box\n className=\"media__custom-scrollbar\"\n style={{\n borderRight: '1px solid var(--card-border-color)',\n height: '100%',\n left: 0,\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <FolderView />\n </Box>\n </Box>\n )\n}\n\nexport default FolderPanel\n","import {type ReactNode, createContext, useContext, useMemo} from 'react'\n\ntype ContextProps = {\n open: () => void\n}\n\ntype Props = {\n children: ReactNode\n open: () => void\n}\n\nconst DropzoneDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const DropzoneDispatchProvider = (props: Props) => {\n const {children, open} = props\n\n const contextValue: ContextProps = useMemo(() => ({open}), [open])\n\n return (\n <DropzoneDispatchContext.Provider value={contextValue}>\n {children}\n </DropzoneDispatchContext.Provider>\n )\n}\n\nexport const useDropzoneActions = () => {\n const context = useContext(DropzoneDispatchContext)\n if (context === undefined) {\n throw new Error('useDropzoneActions must be used within an DropzoneDispatchProvider')\n }\n return context\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button, Flex, Inline, Text} from '@sanity/ui'\nimport pluralize from 'pluralize'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {useDropzoneActions} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\ntype Props = {\n onClose?: () => void\n}\n\nconst Header = (props: Props) => {\n const {onClose} = props\n\n const {open} = useDropzoneActions()\n const {onSelect} = useAssetSourceActions()\n\n // Redux\n const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n const {directUploads} = useToolOptions()\n\n // Row: Current document / close button\n return (\n <Box paddingY={2}>\n <Flex align=\"center\" justify=\"space-between\">\n {/* Label */}\n <Box flex={1} marginX={3}>\n <Inline style={{whiteSpace: 'nowrap'}}>\n <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n </Text>\n\n {selectedDocument && (\n <Box display={['none', 'none', 'block']}>\n <Text>\n <span style={{margin: '0 0.5em'}}>\n <ArrowRightIcon />\n </span>\n <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n </Text>\n </Box>\n )}\n </Inline>\n </Box>\n\n <Flex marginX={2}>\n {/* Upload */}\n {directUploads && (\n <Button\n fontSize={1}\n icon={UploadIcon}\n mode=\"bleed\"\n onClick={open}\n text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n />\n )}\n\n {/* Close */}\n {onClose && (\n <Box style={{flexShrink: 0}}>\n <Button\n disabled={!onClose}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n radius={2}\n />\n </Box>\n )}\n </Flex>\n </Flex>\n </Box>\n )\n}\n\nexport default Header\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {Box, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\ntype Props = {\n field?: string\n title?: string\n}\n\nconst TableHeaderItem = (props: Props) => {\n const {field, title} = props\n\n // Redux\n const dispatch = useDispatch()\n const order = useTypedSelector((state) => state.assets.order)\n\n const isActive = order.field === field\n\n // Callbacks\n const handleClick = () => {\n if (!field || !title) {\n return\n }\n\n if (isActive) {\n const direction = order.direction === 'asc' ? 'desc' : 'asc'\n dispatch(assetsActions.orderSet({order: {field, direction}}))\n } else {\n dispatch(assetsActions.orderSet({order: {field, direction: 'asc'}}))\n }\n }\n\n return (\n <Label muted={!field} size={0}>\n <Box\n onClick={field ? handleClick : undefined}\n style={{\n cursor: field ? 'pointer' : 'default',\n display: 'inline',\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n marginRight: '0.4em',\n }}\n >\n {title}\n </span>\n\n {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n </Box>\n </Label>\n )\n}\n\nexport default TableHeaderItem\n","import {Checkbox, Flex, Grid, useMediaIndex} from '@sanity/ui'\nimport type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport {type MouseEvent} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS, PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsLength, selectAssetsPickedLength} from '../../modules/assets'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport TableHeaderItem from '../TableHeaderItem'\n\n// TODO: DRY\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n $scheme,\n}) => {\n return css`\n cursor: pointer;\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `\n})\n\nconst TableHeader = () => {\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const itemsLength = useTypedSelector(selectAssetsLength)\n const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n\n const mediaIndex = useMediaIndex()\n const {onSelect} = useAssetSourceActions()\n\n const allSelected = numPickedAssets === itemsLength\n\n // Callbacks\n const handleContextActionClick = (e: MouseEvent) => {\n e.stopPropagation()\n\n if (allSelected) {\n dispatch(assetsActions.pickClear())\n } else {\n dispatch(assetsActions.pickAll())\n }\n }\n\n // Note that even though we hide the table header on smaller breakpoints, we never set it to\n // `display: none`, as doing so causes issues with react-virtuoso.\n // Instead, we give it 0 height and hide it with `visibility: hidden`.\n return (\n <Grid\n style={{\n alignItems: 'center',\n background: 'var(--card-bg-color)',\n borderBottom: '1px solid var(--card-border-color)',\n columnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n letterSpacing: '0.025em',\n position: 'sticky',\n textTransform: 'uppercase',\n top: 0,\n visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n width: '100%',\n zIndex: 1, // force stacking context\n }}\n >\n {onSelect ? (\n <TableHeaderItem />\n ) : (\n <ContextActionContainer\n align=\"center\"\n justify=\"center\"\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n height: '100%',\n position: 'relative',\n }}\n >\n <Checkbox\n checked={!fetching && allSelected}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n </ContextActionContainer>\n )}\n\n <TableHeaderItem />\n <TableHeaderItem field=\"originalFilename\" title=\"Filename\" />\n <TableHeaderItem title=\"Resolution\" />\n <TableHeaderItem field=\"mimeType\" title=\"MIME type\" />\n <TableHeaderItem field=\"size\" title=\"Size\" />\n <TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />\n <TableHeaderItem title=\"References\" />\n <TableHeaderItem />\n </Grid>\n )\n}\n\nexport default TableHeader\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n Box,\n Checkbox,\n Container,\n Flex,\n Grid,\n Spinner,\n Text,\n type ThemeColorSchemeKey,\n useMediaIndex,\n} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {formatRelative} from 'date-fns/formatRelative'\nimport filesize from 'filesize'\nimport {\n memo,\n type MouseEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\n// Duration (ms) to wait before reference counts (and associated listeners) are rendered\nconst REFERENCE_COUNT_VISIBILITY_DELAY = 750\n\ntype Props = {\n id: string\n selected: boolean\n}\n\nconst ContainerGrid = styled<\n typeof Grid,\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n {$selected?: boolean; $scheme: ThemeColorSchemeKey; $updating?: boolean}\n>(Grid)(({$scheme, $selected, $updating}) => {\n return css`\n align-items: center;\n cursor: ${$selected ? 'default' : 'pointer'};\n height: 100%;\n pointer-events: ${$updating ? 'none' : 'auto'};\n user-select: none;\n white-space: nowrap;\n\n ${\n !$updating &&\n css`\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `\n }\n `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n $scheme,\n}) => {\n return css`\n cursor: pointer;\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg2')};\n }\n }\n `\n})\n\nconst StyledWarningIcon = styled(WarningFilledIcon)(({theme}) => {\n return {\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst TableRowAsset = (props: Props) => {\n const {id, selected} = props\n\n const scheme = useColorSchemeValue()\n\n const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n const [referenceCountVisible, setReferenceCountVisible] = useState(false)\n const refCountVisibleTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n\n const dispatch = useDispatch()\n const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n const item = useTypedSelector((state) => selectAssetById(state, id))\n\n const mediaIndex = useMediaIndex()\n\n const asset = item?.asset\n const error = item?.error\n const isOpaque = item?.asset?.metadata?.isOpaque\n const picked = item?.picked\n const updating = item?.updating\n\n const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n const handleContextActionClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n } else if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n },\n [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n )\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n onSelect([{kind: 'assetDocumentId', value: asset._id}])\n } else if (onSelect && isMultiSelect) {\n if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n } else if (shiftPressed.current) {\n if (picked) {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n } else {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n }\n } else {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n }\n },\n [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n )\n\n const opacityCell = updating ? 0.5 : 1\n const opacityPreview = selected || updating ? 0.1 : 1\n\n // Display reference count after an initial delay to prevent over-eager fetching\n useEffect(() => {\n refCountVisibleTimeout.current = setTimeout(\n () => setReferenceCountVisible(true),\n REFERENCE_COUNT_VISIBILITY_DELAY,\n )\n return () => {\n if (refCountVisibleTimeout.current) {\n clearTimeout(refCountVisibleTimeout.current)\n }\n }\n }, [])\n\n // Short circuit if no asset is available\n if (!asset) {\n return null\n }\n\n return (\n <ContainerGrid\n onClick={selected ? undefined : handleClick}\n $scheme={scheme}\n $selected={selected}\n style={{\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }}\n $updating={item.updating}\n >\n {/* Picked checkbox */}\n <ContextActionContainer\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n alignItems: 'center',\n gridColumn: 1,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '100%',\n justifyContent: 'center',\n opacity: opacityCell,\n position: 'relative',\n }}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n )}\n </ContextActionContainer>\n\n {/* Preview image + spinner */}\n <Box\n style={{\n gridColumn: 2,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '90px',\n width: '100px',\n }}\n >\n <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 100, width: 100})}\n />\n )}\n </Box>\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n </Flex>\n </Box>\n\n {/* Filename */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: 3,\n gridRow: mediaIndex < 3 ? 2 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>\n\n {/* Resolution */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 4,\n gridRow: mediaIndex < 3 ? 3 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {isImageAsset(asset) && getAssetResolution(asset)}\n </Text>\n </Box>\n\n {/* MIME type */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 5,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.mimeType}\n </Text>\n </Box>\n\n {/* Size */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 6,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {filesize(asset.size, {base: 10, round: 0})}\n </Text>\n </Box>\n\n {/* Last updated */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 7,\n gridRow: mediaIndex < 3 ? 4 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {formatRelative(new Date(asset._updatedAt), new Date())}\n </Text>\n </Box>\n\n {/* References */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 8,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {referenceCountVisible ? (\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n id={id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueDocuments = getUniqueDocuments(referringDocuments)\n return isLoading ? (\n <>-</>\n ) : (\n <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n )\n }}\n </WithReferringDocuments>\n ) : (\n <>-</>\n )}\n </Text>\n </Box>\n\n {/* Error */}\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n gridColumn: mediaIndex < 3 ? 4 : 9,\n gridRowStart: '1',\n gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n opacity: opacityCell,\n }}\n >\n {/* TODO: DRY */}\n {/* Error button */}\n {error && (\n <Box padding={2}>\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )}\n </Flex>\n </ContainerGrid>\n )\n}\n\nexport default memo(TableRowAsset)\n","import {Box, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n folderId: string\n name: string\n totalCount: number\n}\n\nconst ContainerGrid = styled(Grid)(\n ({theme}) => css`\n align-items: center;\n cursor: pointer;\n height: 100%;\n user-select: none;\n white-space: nowrap;\n\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.card.enabled.bg\n };\n }\n }\n `,\n)\n\nconst FolderBadge = styled(Box)(\n ({theme}) => css`\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n };\n border-radius: 6px;\n height: 42px;\n position: relative;\n width: 52px;\n\n &::before {\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n };\n border-radius: 6px 6px 0 0;\n content: '';\n height: 12px;\n left: 0;\n position: absolute;\n top: -6px;\n width: 18px;\n }\n `,\n)\n\nconst TableRowFolder = ({folderId, name, totalCount}: Props) => {\n const dispatch = useDispatch()\n const mediaIndex = useMediaIndex()\n const scheme = useColorSchemeValue()\n\n return (\n <ContainerGrid\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }}\n >\n <Box />\n <Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n <FolderBadge />\n </Flex>\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n >\n <Stack gap={2}>\n <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.1em'}}>\n Folder\n </Text>\n </Stack>\n </Box>\n <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n <Text muted size={1}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Box>\n <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n <Text muted size={1}>\n Open folder\n </Text>\n </Box>\n <Box />\n </ContainerGrid>\n )\n}\n\nexport default TableRowFolder\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n id: string\n}\n\nconst TableRowUpload = (props: Props) => {\n const {id} = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const item = useTypedSelector((state) => selectUploadById(state, id))\n\n const mediaIndex = useMediaIndex()\n\n if (!item) {\n return null\n }\n\n const fileSize = filesize(item.size, {base: 10, round: 0})\n const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n const isComplete = item.status === 'complete'\n const isUploading = item.status === 'uploading'\n const isQueued = item.status === 'queued'\n\n let status\n if (isComplete) {\n status = 'Verifying'\n }\n if (isUploading) {\n status = `${percentLoaded}%`\n }\n if (isQueued) {\n status = 'Queued'\n }\n\n // Callbacks\n const handleCancelUpload = () => {\n dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n }\n\n return (\n <Grid\n style={{\n alignItems: 'center',\n background: getSchemeColor(scheme, 'bg'),\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n height: '100%',\n position: 'relative',\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />\n\n {/* Image */}\n <Box\n style={{\n gridColumn: 2,\n gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n height: '90px',\n width: '100px',\n }}\n >\n <Box style={{height: '100%', position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{opacity: 0.25}}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"40px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n position: 'absolute',\n height: '100%',\n left: 0,\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={3}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>\n </Box>\n\n {/* Filename */}\n <Box\n style={{\n gridColumn: mediaIndex < 3 ? 3 : '3/8',\n gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n marginLeft: mediaIndex < 3 ? 3 : 0,\n }}\n >\n <Stack gap={3}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n {status}\n </Text>\n </Stack>\n </Box>\n </Grid>\n )\n}\n\nexport default TableRowUpload\n","import {Box} from '@sanity/ui'\nimport {memo} from 'react'\nimport {GroupedVirtuoso} from 'react-virtuoso'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport TableHeader from '../TableHeader'\nimport TableRowAsset from '../TableRowAsset'\nimport TableRowFolder from '../TableRowFolder'\nimport TableRowUpload from '../TableRowUpload'\n\ntype Props = {\n items: (CardAssetData | CardFolderData | CardUploadData)[]\n onLoadMore?: () => void\n}\n\nconst VirtualRow = memo(\n ({\n item,\n selected,\n }: {\n item: CardAssetData | CardFolderData | CardUploadData\n selected: boolean\n }) => {\n if (item?.type === 'asset') {\n return (\n <Box style={{height: '100px'}}>\n <TableRowAsset id={item.id} selected={selected} />\n </Box>\n )\n }\n\n if (item?.type === 'folder') {\n return (\n <Box style={{height: '100px'}}>\n <TableRowFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n </Box>\n )\n }\n\n if (item?.type === 'upload') {\n return (\n <Box style={{height: '100px'}}>\n <TableRowUpload id={item.id} />\n </Box>\n )\n }\n\n return null\n },\n)\n\nconst AssetTableVirtualized = (props: Props) => {\n const {items, onLoadMore} = props\n\n // Redux\n const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n const totalCount = items?.length\n\n if (totalCount === 0) {\n return null\n }\n\n return (\n <GroupedVirtuoso\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n return item?.id || index\n }}\n endReached={onLoadMore}\n groupCounts={Array(1).fill(totalCount)}\n groupContent={() => {\n return <TableHeader />\n }}\n itemContent={(index) => {\n const item = items[index]\n const selected = selectedIds.includes(item?.id || '')\n return <VirtualRow item={item!} selected={selected} />\n }}\n style={{overflowX: 'hidden'}}\n />\n )\n}\n\nexport default AssetTableVirtualized\n","import {Box, Text, useMediaIndex} from '@sanity/ui'\nimport {useEffect} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport {tagsActions} from '../../modules/tags'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\nimport AssetTableVirtualized from '../AssetTableVirtualized'\n\nconst Items = () => {\n // Redux\n const dispatch = useDispatch()\n const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n const view = useTypedSelector((state) => state.assets.view)\n const combinedItems = useTypedSelector(selectCombinedItems)\n\n const mediaIndex = useMediaIndex()\n\n const hasFetchedOnce = fetchCount >= 0\n const hasItems = combinedItems.length > 0\n\n // Only load 1 page of items at a time.\n const handleLoadMoreItems = () => {\n if (!fetching) {\n dispatch(assetsActions.loadNextPage())\n }\n }\n\n // Effects\n\n // - Hide folders/tags panels on smaller breakpoints\n useEffect(() => {\n if (mediaIndex <= 1 && foldersPanelVisible) {\n dispatch(foldersActions.panelVisibleSet({panelVisible: false}))\n }\n\n if (mediaIndex <= 1 && tagsPanelVisible) {\n dispatch(tagsActions.panelVisibleSet({panelVisible: false}))\n }\n }, [dispatch, foldersPanelVisible, mediaIndex, tagsPanelVisible])\n\n const isEmpty = !hasItems && hasFetchedOnce && !fetching\n\n return (\n <Box flex={1} style={{width: '100%'}}>\n {isEmpty ? (\n <Box padding={4}>\n <Text size={1} weight=\"semibold\">\n No results for the current query\n </Text>\n </Box>\n ) : (\n <>\n {view === 'grid' && (\n <AssetGridVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n )}\n\n {view === 'table' && (\n <AssetTableVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n )}\n </>\n )}\n </Box>\n )\n}\n\nexport default Items\n","import {Box, Button, Flex, Label} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {isImageAsset} from '../../utils/typeGuards'\n\nconst PickedBar = () => {\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n // Replace only rewrites image field refs — only offer it for a single image asset.\n const canReplace =\n assetsPicked.length === 1 && !!assetsPicked[0] && isImageAsset(assetsPicked[0].asset)\n\n // Callbacks\n const handlePickClear = () => {\n dispatch(assetsActions.pickClear())\n }\n\n const handleDeletePicked = () => {\n dispatch(dialogActions.showConfirmDeleteAssets({assets: assetsPicked}))\n }\n\n const handleReplaceImages = () => {\n const assetId = assetsPicked[0]?.asset._id\n if (!assetId) {\n return\n }\n dispatch(dialogActions.showAllAssetsDialog({assetId}))\n }\n\n const handleMovePicked = () =>\n dispatch(DIALOG_ACTIONS.showFolderMove({assets: assetsPicked, folderId: currentFolderId}))\n\n const handleRemovePickedFromFolder = () =>\n dispatch(assetsActions.folderSetRequest({assets: assetsPicked, folderId: null}))\n\n const handleInsertPicked = () => {\n if (!onSelect) {\n return\n }\n\n const pickedAssetIds = assetsPicked.map((item) => ({\n kind: 'assetDocumentId' as const,\n value: item.asset._id,\n }))\n\n if (pickedAssetIds.length === 0) {\n return\n }\n\n onSelect(pickedAssetIds)\n }\n\n if (assetsPicked.length === 0) {\n return null\n }\n\n return (\n <Flex\n align=\"center\"\n justify=\"flex-start\"\n style={{\n background: getSchemeColor(scheme, 'bg'),\n borderBottom: '1px solid var(--card-border-color)',\n height: `${PANEL_HEIGHT}px`,\n position: 'relative',\n width: '100%',\n }}\n >\n <Flex align=\"center\" paddingX={3}>\n <Box paddingRight={2}>\n <Label size={0} style={{color: 'inherit'}}>\n {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n </Label>\n </Box>\n\n {/* Deselect button */}\n <Button\n mode=\"bleed\"\n onClick={handlePickClear}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Deselect</Label>\n </Button>\n\n {onSelect && isMultiSelect ? (\n <Button\n mode=\"bleed\"\n onClick={handleInsertPicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Insert selected</Label>\n </Button>\n ) : (\n <Button\n mode=\"bleed\"\n onClick={handleDeletePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Delete</Label>\n </Button>\n )}\n\n {/* Replace button */}\n {canReplace && (\n <Button\n mode=\"bleed\"\n onClick={handleReplaceImages}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Replace</Label>\n </Button>\n )}\n\n {!onSelect && (\n <>\n <Button\n mode=\"bleed\"\n onClick={handleMovePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Move to folder</Label>\n </Button>\n {currentFolderId && (\n <Button\n mode=\"bleed\"\n onClick={handleRemovePickedFromFolder}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Remove from folder</Label>\n </Button>\n )}\n </>\n )}\n </Flex>\n </Flex>\n )\n}\n\nexport default PickedBar\n","import {Box} from '@sanity/ui'\n\nimport {TAGS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport TagView from '../TagView'\n\nconst TagsPanel = () => {\n const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n if (!tagsPanelVisible) {\n return null\n }\n\n return (\n <Box\n style={{\n position: 'relative',\n width: TAGS_PANEL_WIDTH,\n }}\n >\n <Box\n className=\"media__custom-scrollbar\"\n style={{\n borderLeft: '1px solid var(--card-border-color)',\n height: '100%',\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'absolute',\n right: 0,\n top: 0,\n width: '100%',\n }}\n >\n <TagView />\n </Box>\n </Box>\n )\n}\n\nexport default TagsPanel\n","import {white} from '@sanity/color'\nimport {Flex, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {type DropEvent, type DropzoneOptions, useDropzone} from 'react-dropzone'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {DropzoneDispatchProvider} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {notificationsActions} from '../../modules/notifications'\nimport {uploadsActions} from '../../modules/uploads'\n\ntype Props = {\n children: ReactNode\n}\n\nconst UploadContainer = styled.div`\n color: white;\n height: 100%;\n min-height: 100%;\n right: 0;\n top: 0;\n width: 100%;\n\n &:focus {\n outline: none;\n }\n`\n\nconst DragActiveContainer = styled.div`\n align-items: center;\n background: rgba(0, 0, 0, 0.75);\n display: flex;\n height: 100%;\n justify-content: center;\n position: absolute;\n right: 0;\n top: 0;\n width: 100%;\n z-index: 3;\n`\n\n// Iterate through all files and only return non-folders / packages.\n// We check for files by reading the first byte of the file\nasync function filterFiles(fileList: FileList) {\n const files = Array.from(fileList)\n\n const filteredFiles: File[] = []\n\n for (const file of files) {\n try {\n await file.slice(0, 1).arrayBuffer()\n filteredFiles.push(file)\n } catch {\n // do nothing: file is a package or folder\n }\n }\n\n return filteredFiles\n}\n\nconst UploadDropzone = (props: Props) => {\n const {children} = props\n\n const {\n dropzone: {maxSize},\n directUploads,\n } = useToolOptions()\n\n const {onSelect} = useAssetSourceActions()\n\n // Redux\n const dispatch = useDispatch()\n const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n\n const isImageAssetType = assetTypes.length === 1 && assetTypes[0] === 'image'\n\n // Callbacks\n const handleDrop = async (acceptedFiles: File[]) => {\n acceptedFiles.forEach((file) =>\n dispatch(\n uploadsActions.uploadRequest({\n file,\n forceAsAssetType: assetTypes.length === 1 ? assetTypes[0] : undefined,\n }),\n ),\n )\n }\n\n const handleDropRejected: DropzoneOptions['onDropRejected'] = (rejections) => {\n const errorCodes = rejections.flatMap(({errors}) => errors.map(({code}) => code))\n\n if (errorCodes.includes('file-too-large')) {\n dispatch(\n notificationsActions.add({\n status: 'error',\n title: 'One or more files exceed the maximum upload size.',\n }),\n )\n }\n }\n\n // Use custom file selector to obtain files on file drop + change events (excluding folders and packages)\n const handleFileGetter = async (event: DropEvent) => {\n let fileList: FileList | undefined\n if (event.type === 'drop' && 'dataTransfer' in event) {\n fileList = event?.dataTransfer?.files\n }\n if (event.type === 'change') {\n const target = event?.target as HTMLInputElement\n if (target?.files) {\n fileList = target.files\n }\n }\n\n if (!fileList) {\n return []\n }\n\n // Filter out non-folders / packages\n const files: File[] = await filterFiles(fileList)\n\n // Dispatch error if some files have been filtered out\n if (fileList?.length !== files.length) {\n dispatch(\n notificationsActions.add({\n status: 'error',\n title: `Unable to upload some items (folders and packages aren't supported)`,\n }),\n )\n }\n\n return files\n }\n\n // Limit file picking to only images if we're specifically within an image selection context (e.g. picking from image fields)\n const {getRootProps, getInputProps, isDragActive, open} = useDropzone({\n accept: isImageAssetType ? 'image/*' : '',\n getFilesFromEvent: handleFileGetter,\n noClick: true,\n // HACK: Disable drag and drop functionality when in a selecting context\n // (This is currently due to Sanity's native image input taking precedence with drag and drop)\n noDrag: !!onSelect,\n onDrop: handleDrop,\n maxSize,\n onDropRejected: handleDropRejected,\n disabled: !directUploads,\n })\n\n return (\n <DropzoneDispatchProvider open={open}>\n <UploadContainer {...getRootProps()}>\n <input {...getInputProps()} />\n\n {isDragActive && (\n <DragActiveContainer>\n <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n <Text size={3} style={{color: 'inherit'}}>\n Drop files to upload\n </Text>\n </Flex>\n </DragActiveContainer>\n )}\n\n {children}\n </UploadContainer>\n </DropzoneDispatchProvider>\n )\n}\n\nexport default UploadDropzone\n","import type {MutationEvent, SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {useEffect} from 'react'\nimport {useDispatch, useSelector} from 'react-redux'\nimport type {Dispatch} from 'redux'\nimport type {AssetSourceComponentProps} from 'sanity'\n\nimport {inputs} from '../../config/searchFacets'\nimport {FOLDER_DOCUMENT_NAME, TAG_DOCUMENT_NAME} from '../../constants'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {tagsActions} from '../../modules/tags'\nimport type {RootReducerState} from '../../modules/types'\nimport type {Asset, Tag} from '../../types'\n\nfunction getMediaTagNames(schemaType?: AssetSourceComponentProps['schemaType']): string[] {\n const mediaTags = (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n if (!mediaTags?.length) return []\n const unique = new Set(\n mediaTags.map((t) => t?.trim()).filter((t): t is string => Boolean(t?.length)),\n )\n return Array.from(unique)\n}\n\nfunction createAssetHandler(dispatch: Dispatch) {\n return (update: MutationEvent) => {\n const {documentId, result, transition} = update\n\n switch (transition) {\n case 'appear':\n dispatch(assetsActions.listenerCreateQueue({asset: result as Asset}))\n break\n case 'disappear':\n dispatch(assetsActions.listenerDeleteQueue({assetId: documentId}))\n break\n case 'update':\n dispatch(assetsActions.listenerUpdateQueue({asset: result as Asset}))\n break\n default:\n break\n }\n }\n}\n\nfunction createTagHandler(dispatch: Dispatch) {\n return (update: MutationEvent) => {\n const {documentId, result, transition} = update\n\n switch (transition) {\n case 'appear':\n dispatch(tagsActions.listenerCreateQueue({tag: result as Tag}))\n break\n case 'disappear':\n dispatch(tagsActions.listenerDeleteQueue({tagId: documentId}))\n break\n case 'update':\n dispatch(tagsActions.listenerUpdateQueue({tag: result as Tag}))\n break\n default:\n break\n }\n }\n}\n\nexport function useBrowserInit(\n client: SanityClient,\n schemaType?: AssetSourceComponentProps['schemaType'],\n): void {\n const dispatch = useDispatch()\n const tagsByIds = useSelector((state: RootReducerState) => state.tags.byIds)\n const tagsFetchCount = useSelector((state: RootReducerState) => state.tags.fetchCount)\n\n const tagNames = getMediaTagNames(schemaType)\n const hasMediaTags = tagNames.length > 0\n\n useEffect(() => {\n if (!hasMediaTags) {\n dispatch(searchActions.facetsClear())\n }\n\n dispatch(tagsActions.fetchRequest())\n\n // Fetch all folders\n dispatch(foldersActions.fetchRequest())\n\n const assetSubscription = client\n .listen(\n groq`*[_type in [\"sanity.fileAsset\", \"sanity.imageAsset\"] && !(_id in path(\"drafts.**\"))]`,\n )\n .subscribe(createAssetHandler(dispatch))\n\n const tagSubscription = client\n .listen(groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n .subscribe(createTagHandler(dispatch))\n\n const folderSubscription = client\n .listen(groq`*[_type == \"${FOLDER_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n .subscribe(() => dispatch(foldersActions.fetchRequest()))\n\n return () => {\n assetSubscription.unsubscribe()\n tagSubscription.unsubscribe()\n folderSubscription.unsubscribe()\n }\n }, [client, dispatch, hasMediaTags])\n\n // When mediaTags are configured, wait for the tag fetch to complete then apply facets.\n // Dispatching clear + add synchronously keeps all actions within assetsSearchEpic's\n // 400ms debounce window, so the browser performs exactly one asset fetch on open.\n useEffect(() => {\n if (!hasMediaTags || tagsFetchCount < 0) return\n\n const tagFacetInput = inputs.tag\n if (tagFacetInput.type !== 'searchable') return\n\n const resolvedTags = tagNames\n .map((name) => Object.values(tagsByIds).find((item) => item.tag.name.current === name))\n .filter((item): item is NonNullable<typeof item> => Boolean(item))\n\n dispatch(searchActions.facetsClear())\n\n for (const tagItem of resolvedTags) {\n dispatch(\n searchActions.facetsAdd({\n facet: {\n ...tagFacetInput,\n operatorType: 'references',\n value: {label: tagItem.tag.name.current, value: tagItem.tag._id},\n },\n }),\n )\n }\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }, [tagsFetchCount, hasMediaTags]) // eslint-disable-line react-hooks/exhaustive-deps\n}\n","import {Card, Flex, PortalProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport Controls from '../Controls'\nimport DebugControls from '../DebugControls'\nimport Dialogs from '../Dialogs'\nimport FolderBreadcrumbs from '../FolderBreadcrumbs'\nimport FolderPanel from '../FolderPanel'\nimport Header from '../Header'\nimport Items from '../Items'\nimport Notifications from '../Notifications'\nimport PickedBar from '../PickedBar'\nimport ReduxProvider from '../ReduxProvider'\nimport TagsPanel from '../TagsPanel'\nimport UploadDropzone from '../UploadDropzone'\nimport {useBrowserInit} from './useBrowserInit'\n\ntype Props = {\n assetType?: AssetSourceComponentProps['assetType']\n document?: SanityDocument\n isMultiSelect?: boolean\n onClose?: AssetSourceComponentProps['onClose']\n onSelect?: AssetSourceComponentProps['onSelect']\n selectedAssets?: AssetSourceComponentProps['selectedAssets']\n schemaType?: AssetSourceComponentProps['schemaType']\n}\n\nconst BrowserContent = ({\n onClose,\n schemaType,\n}: {\n onClose?: AssetSourceComponentProps['onClose']\n schemaType?: AssetSourceComponentProps['schemaType']\n}) => {\n const client = useVersionedClient()\n const [portalElement, setPortalElement] = useState<HTMLDivElement | null>(null)\n\n useBrowserInit(client, schemaType)\n\n return (\n <PortalProvider element={portalElement}>\n <UploadDropzone>\n <Dialogs />\n <Notifications />\n\n <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n <Flex direction=\"column\" flex={1}>\n {/* Header */}\n <Header onClose={onClose} />\n\n {/* Browser Controls */}\n <Controls />\n\n <FolderBreadcrumbs />\n\n <Flex flex={1}>\n <FolderPanel />\n <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n <PickedBar />\n <Items />\n </Flex>\n <TagsPanel />\n </Flex>\n\n {/* Debug */}\n <DebugControls />\n </Flex>\n </Card>\n </UploadDropzone>\n </PortalProvider>\n )\n}\n\nconst Browser = (props: Props) => {\n const client = useVersionedClient()\n const {excludeTagSlugs} = useToolOptions()\n\n return (\n <ReduxProvider\n assetType={props?.assetType}\n client={client}\n document={props?.document}\n excludeTagSlugs={excludeTagSlugs}\n selectedAssets={props?.selectedAssets}\n >\n <AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n <GlobalStyle />\n <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n </AssetBrowserDispatchProvider>\n </ReduxProvider>\n )\n}\n\nexport default Browser\n","import {Box, Portal, PortalProvider, useLayer} from '@sanity/ui'\nimport {type SyntheticEvent} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport Browser from '../Browser'\n\nconst FormBuilderTool = (props: AssetSourceComponentProps) => {\n const {onClose} = props\n\n const portalElement = useRootPortalElement()\n\n // Get current Sanity document\n const currentDocument = useFormValue([]) as SanityDocument\n const selectionType = (props as unknown as {selectionType?: string})?.selectionType\n const schemaJsonType = (props?.schemaType as {jsonType?: string} | undefined)?.jsonType\n const isMultiSelect = selectionType === 'multiple' || schemaJsonType === 'array'\n\n // Close on escape key press\n useKeyPress('escape', onClose)\n\n // Stop propagation and prevent document mouse events from firing.\n // This is a bit of a hack to make this work with `editModal = 'popover'` and prevent Sanity's <Popover /> component from\n // prematurely closing, as it attaches events on `document` to detect outside clicks.\n const handleStopPropagation = (event: SyntheticEvent) => {\n event.nativeEvent.stopImmediatePropagation()\n event.stopPropagation()\n }\n\n const {zIndex} = useLayer()\n\n return (\n <PortalProvider element={portalElement}>\n <Portal>\n <Box\n onDragEnter={handleStopPropagation}\n onDragLeave={handleStopPropagation}\n onDragOver={handleStopPropagation}\n onDrop={handleStopPropagation}\n onMouseUp={handleStopPropagation}\n style={{\n bottom: 0,\n height: 'auto',\n left: 0,\n position: 'fixed',\n top: 0,\n width: '100%',\n zIndex,\n }}\n >\n <Browser\n document={currentDocument}\n isMultiSelect={isMultiSelect}\n schemaType={props.schemaType}\n {...props}\n />\n </Box>\n </Portal>\n </PortalProvider>\n )\n}\n\nexport default FormBuilderTool\n","import {Flex} from '@sanity/ui'\n\nimport Browser from '../Browser'\n\nconst Tool = () => {\n return (\n <Flex direction=\"column\" height=\"fill\" flex={1}>\n <Browser />\n </Flex>\n )\n}\n\nexport default Tool\n","import {FolderIcon} from '@sanity/icons/Folder'\n\nimport {FOLDER_DOCUMENT_NAME} from '../constants'\n\nexport default {\n title: 'Media Folder',\n icon: FolderIcon,\n name: FOLDER_DOCUMENT_NAME,\n type: 'document',\n fields: [\n {\n title: 'Name',\n name: 'name',\n type: 'string',\n },\n {\n title: 'Parent',\n name: 'parent',\n type: 'reference',\n to: [{type: FOLDER_DOCUMENT_NAME}],\n weak: true,\n },\n ],\n preview: {\n select: {\n name: 'name',\n parentName: 'parent.name',\n },\n prepare(selection: {name?: string; parentName?: string}): {\n media: typeof FolderIcon\n subtitle?: string\n title: string\n } {\n const {name, parentName} = selection\n return {\n media: FolderIcon,\n title: name || 'Folder',\n subtitle: parentName ? `in ${parentName}` : undefined,\n }\n },\n },\n}\n","import TagIcon from '../components/TagIcon'\nimport {TAG_DOCUMENT_NAME} from '../constants'\n\nexport default {\n title: 'Media Tag',\n icon: TagIcon,\n name: TAG_DOCUMENT_NAME,\n type: 'document',\n fields: [\n {\n title: 'Name',\n name: 'name',\n type: 'slug',\n },\n ],\n preview: {\n select: {\n name: 'name',\n },\n prepare(selection: any) {\n const {name} = selection\n return {\n media: TagIcon,\n title: name?.current,\n }\n },\n },\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {type AssetSource, type Tool as SanityTool, definePlugin} from 'sanity'\n\nimport EditAssetTool from './components/EditAssetTool'\nimport FormBuilderTool from './components/FormBuilderTool'\nimport Tool from './components/Tool'\nimport {ToolOptionsProvider} from './contexts/ToolOptionsContext'\nimport mediaFolder from './schemas/folder'\nimport mediaTag from './schemas/tag'\nimport type {MediaToolOptions} from './types'\n\nconst plugin = {\n icon: ImageIcon,\n name: 'media',\n title: 'Media',\n}\n\nexport const mediaAssetSource = {\n ...plugin,\n component: FormBuilderTool,\n} satisfies AssetSource\n\nconst editMediaAssetSource = {\n icon: EditIcon,\n name: 'edit-media',\n // oxlint-disable-next-line no-deprecated -- `i18nKey` requires a locale bundle; a plain title is intentional here\n title: 'Edit Media',\n component: EditAssetTool,\n} satisfies AssetSource\n\nconst tool = {\n ...plugin,\n component: Tool,\n __internalApplicationType: 'sanity/media',\n} satisfies SanityTool\n\nexport const media = definePlugin<MediaToolOptions | void>((options) => ({\n name: 'media',\n studio: {\n components: {\n layout: (props) => (\n <ToolOptionsProvider options={options}>{props.renderDefault(props)}</ToolOptionsProvider>\n ),\n },\n },\n form: {\n file: {\n assetSources: (prev) => {\n return [...prev, mediaAssetSource, editMediaAssetSource]\n },\n },\n image: {\n assetSources: (prev) => {\n return [...prev, mediaAssetSource, editMediaAssetSource]\n },\n },\n },\n schema: {\n types: [mediaTag, mediaFolder],\n },\n tools: (prev) => {\n return [...prev, tool]\n },\n}))\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {Tag} from '../types'\n\ntype ApplyMediaTagsOptions = {\n client: SanityClient\n assetId: string\n mediaTags: string[]\n createTagsOnUpload?: boolean\n}\n\n// Serialize calls per asset so concurrent fields reading the same asset\n// don't race each other — the second call always runs after the first commits.\nconst pendingByAsset = new Map<string, Promise<void>>()\n\nexport function applyMediaTags(options: ApplyMediaTagsOptions): Promise<void> {\n const {assetId} = options\n const chain = (pendingByAsset.get(assetId) ?? Promise.resolve()).then(() =>\n doApplyMediaTags(options),\n )\n const cleanup = chain\n .catch(() => {})\n .finally(() => {\n if (pendingByAsset.get(assetId) === cleanup) pendingByAsset.delete(assetId)\n })\n pendingByAsset.set(assetId, cleanup)\n return chain\n}\n\nasync function doApplyMediaTags({\n client,\n assetId,\n mediaTags,\n createTagsOnUpload = true,\n}: ApplyMediaTagsOptions): Promise<void> {\n if (!mediaTags || mediaTags.length === 0) return\n\n const resolvedTags = await Promise.all(\n mediaTags.map(async (tagName) => {\n const existingTag = await client.fetch<Tag | null>(\n groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $tagName][0]`,\n {tagName},\n )\n if (existingTag) return existingTag\n if (createTagsOnUpload) {\n const newTag = await client.create({\n _type: TAG_DOCUMENT_NAME,\n name: {_type: 'slug', current: tagName},\n })\n return newTag as Tag\n }\n return null\n }),\n )\n\n const validTags = resolvedTags.filter((tag): tag is Tag => tag !== null)\n if (validTags.length === 0) return\n\n const existing = await client.fetch<{tagIds: string[]} | null>(\n groq`*[_id == $assetId][0]{'tagIds': opt.media.tags[]._ref}`,\n {assetId},\n {useCdn: false}, // bypass CDN cache so we see the latest committed tag refs\n )\n const existingIds = new Set(existing?.tagIds ?? [])\n\n const tagReferences = validTags\n .filter((tag) => !existingIds.has(tag._id))\n .map((tag) => ({\n _key: nanoid(),\n _ref: tag._id,\n _type: 'reference' as const,\n _weak: true,\n }))\n\n if (tagReferences.length === 0) return\n\n await client\n .patch(assetId)\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .setIfMissing({'opt.media.tags': []})\n .append('opt.media.tags', tagReferences)\n .commit()\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect, useRef} from 'react'\nimport {type InputProps} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {applyMediaTags} from '../../utils/applyMediaTags'\n\ntype AssetValue = {\n _type: 'image' | 'file'\n asset?: {\n _ref: string\n _type: 'reference'\n }\n}\n\nexport type AutoTagInputProps = InputProps & {\n mediaTags?: string[]\n}\n\n/**\n * Input component that automatically applies media tags when an asset is selected or uploaded.\n *\n * Apply explicitly to image/file fields that should be auto-tagged:\n * ```ts\n * import {AutoTagInput} from 'sanity-plugin-media'\n *\n * defineField({\n * type: 'image',\n * options: { mediaTags: ['product'] }, // also pre-filters the media browser\n * components: { input: AutoTagInput },\n * })\n * ```\n *\n * Pass `mediaTags` as a prop to override or use without `options`:\n * ```ts\n * components: { input: (props) => <AutoTagInput {...props} mediaTags={['product']} /> }\n * ```\n */\nexport function AutoTagInput(props: AutoTagInputProps) {\n const {renderDefault, schemaType, value, mediaTags: mediaTagsProp} = props\n const toast = useToast()\n\n // Prop takes precedence; fall back to schemaType.options.mediaTags (set for browser pre-filtering)\n const mediaTags =\n mediaTagsProp ?? (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n\n const client = useVersionedClient()\n const {createTagsOnUpload} = useToolOptions()\n\n const prevAssetRef = useRef<string | undefined>(undefined)\n const isInitialMount = useRef(true)\n\n const currentAssetRef = (value as AssetValue | undefined)?.asset?._ref\n\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false\n prevAssetRef.current = currentAssetRef\n return\n }\n\n const previousRef = prevAssetRef.current\n prevAssetRef.current = currentAssetRef\n\n if (!mediaTags?.length || !currentAssetRef || currentAssetRef === previousRef) return\n\n applyMediaTags({\n client,\n assetId: currentAssetRef,\n mediaTags,\n createTagsOnUpload,\n }).catch((err) => {\n console.error('[sanity-plugin-media] Failed to apply auto-tags:', err)\n const label = mediaTags.length === 1 ? 'tag' : 'tags'\n toast.push({\n closable: true,\n status: 'error',\n title: `Failed to apply the media ${label} ${mediaTags.join(', ')}`,\n })\n })\n }, [currentAssetRef, mediaTags, client, createTagsOnUpload, toast])\n\n return renderDefault(props as InputProps)\n}\n","import type {\n FieldDefinitionBase,\n FileDefinition,\n ImageDefinition,\n WidenInitialValue,\n WidenValidation,\n} from 'sanity'\n\nimport {AutoTagInput} from '../components/AutoTagInputWrapper'\n\ntype ImageMediaFieldConfig = Omit<ImageDefinition, 'options'> &\n FieldDefinitionBase & {\n name: string\n mediaTags: string[]\n options?: ImageDefinition['options']\n }\n\ntype FileMediaFieldConfig = Omit<FileDefinition, 'options'> &\n FieldDefinitionBase & {\n name: string\n mediaTags: string[]\n options?: FileDefinition['options']\n }\n\ntype ImageMediaFieldResult = Omit<ImageDefinition, 'options'> &\n FieldDefinitionBase & {\n options?: ImageDefinition['options'] & {mediaTags: string[]}\n components: {input: typeof AutoTagInput}\n } & WidenValidation &\n WidenInitialValue\n\ntype FileMediaFieldResult = Omit<FileDefinition, 'options'> &\n FieldDefinitionBase & {\n options?: FileDefinition['options'] & {mediaTags: string[]}\n components: {input: typeof AutoTagInput}\n } & WidenValidation &\n WidenInitialValue\n\n/**\n * Defines an image or file field with automatic media tag application when an asset is selected.\n *\n * Pass `mediaTags` at the top level — they are moved into `options.mediaTags` (for media browser\n * pre-filtering) and wire up {@link AutoTagInput} as the field component automatically:\n * ```ts\n * import {mediaField} from 'sanity-plugin-media'\n *\n * mediaField({\n * name: 'coverImage',\n * type: 'image',\n * mediaTags: ['product-cover'],\n * options: { hotspot: true },\n * })\n * ```\n *\n * For file fields, set `type: 'file'`:\n * ```ts\n * mediaField({ name: 'drawing', type: 'file', mediaTags: ['model-drawing'] })\n * ```\n */\nexport function mediaField(config: ImageMediaFieldConfig): ImageMediaFieldResult\nexport function mediaField(config: FileMediaFieldConfig): FileMediaFieldResult\nexport function mediaField(\n config: ImageMediaFieldConfig | FileMediaFieldConfig,\n): ImageMediaFieldResult | FileMediaFieldResult {\n const {mediaTags, options, components, ...rest} = config as ImageMediaFieldConfig & {\n components?: Record<string, unknown>\n }\n return {\n ...rest,\n options: {...options, mediaTags},\n components: {...components, input: AutoTagInput},\n } as unknown as ImageMediaFieldResult\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["isMultiSelect = false","{\n isMultiSelect,\n onSelect,\n }","useMemo(\n () => ({\n isMultiSelect,\n onSelect,\n }),\n [isMultiSelect, onSelect],\n )","<AssetSourceDispatchContext.Provider value={contextValue}>\n {children}\n </AssetSourceDispatchContext.Provider>","AssetSourceDispatchContext.Provider","() => document.createElement('div')","() => {\n container.classList.add('media-portal')\n document.body.appendChild(container)\n return () => {\n document.body.removeChild(container)\n }\n }","[container]","container.classList","{apiVersion: '2025-10-02'}","{\n animate: true,\n constrainSize: true,\n floatingBoundary: portal.element,\n portal: true,\n referenceBoundary: portal.element,\n }","element","{disabled, url}: Props","() => {\n if (refPopoverTimeout.current) {\n clearTimeout(refPopoverTimeout.current)\n }\n\n setPopoverVisible(true)\n copy(url)\n\n refPopoverTimeout.current = setTimeout(() => {\n setPopoverVisible(false)\n }, 1250)\n }","() => {\n return () => {\n if (refPopoverTimeout.current) {\n clearTimeout(refPopoverTimeout.current)\n }\n }\n }","[]","<Text muted size={1}>\n Copied!\n </Text>","<Button\n disabled={disabled}\n fontSize={1}\n icon={ClipboardIcon}\n mode=\"ghost\"\n onClick={handleClick}\n text=\"Copy URL\"\n />","<Popover\n content={\n <Text muted size={1}>\n Copied!\n </Text>\n }\n open={popoverVisible}\n padding={2}\n placement=\"top\"\n radius={1}\n {...popoverProps}\n >\n <Button\n disabled={disabled}\n fontSize={1}\n icon={ClipboardIcon}\n mode=\"ghost\"\n onClick={handleClick}\n text=\"Copy URL\"\n />\n </Popover>","{label, value}: {label: string; value: ReactNode}","{\n opacity: 0.8,\n width: '40%',\n }","<Text\n size={1}\n style={{\n opacity: 0.8,\n width: '40%',\n }}\n textOverflow=\"ellipsis\"\n >\n {label}\n </Text>","{\n opacity: 0.4,\n textAlign: 'right',\n width: '60%',\n }","<Text\n size={1}\n style={{\n opacity: 0.4,\n textAlign: 'right',\n width: '60%',\n }}\n textOverflow=\"ellipsis\"\n >\n {value}\n </Text>","<Flex justify=\"space-between\">\n <Text\n size={1}\n style={{\n opacity: 0.8,\n width: '40%',\n }}\n textOverflow=\"ellipsis\"\n >\n {label}\n </Text>\n <Text\n size={1}\n style={{\n opacity: 0.4,\n textAlign: 'right',\n width: '60%',\n }}\n textOverflow=\"ellipsis\"\n >\n {value}\n </Text>\n </Flex>","() => {\n window.location.href = `${asset.url}?dl=${asset.originalFilename}`\n }","originalFilename","url","filesize(asset?.size, {base: 10, round: 0})","asset?.size","<Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />","<Row label=\"MIME type\" value={asset?.mimeType} />","asset?.mimeType","asset?.extension?.toUpperCase()","extension","<Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />","isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />","<Box>\n <Stack gap={3}>\n <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n <Row label=\"MIME type\" value={asset?.mimeType} />\n <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n </Stack>\n </Box>","exif &&\n (exif.DateTimeOriginal ||\n exif.FNumber ||\n exif.FocalLength ||\n exif.ExposureTime ||\n exif.ISO) && (\n <>\n {/* Divider */}\n <Box\n marginY={4}\n style={{\n background: 'var(--card-border-color)',\n height: '1px',\n width: '100%',\n }}\n />\n <Box>\n <Stack gap={3}>\n {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n {exif.ExposureTime && (\n <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n )}\n {exif.DateTimeOriginal && (\n <Row\n label=\"Original date\"\n value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n />\n )}\n </Stack>\n </Box>\n </>\n )","<Button\n disabled={!item || item?.updating}\n fontSize={1}\n icon={DownloadIcon}\n mode=\"ghost\"\n onClick={handleDownload}\n text=\"Download\"\n />","!item || item?.updating","<ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />","<Box marginTop={5}>\n <Inline gap={2}>\n {/* Download */}\n <Button\n disabled={!item || item?.updating}\n fontSize={1}\n icon={DownloadIcon}\n mode=\"ghost\"\n onClick={handleDownload}\n text=\"Download\"\n />\n {/* Copy to clipboard */}\n <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n </Inline>\n </Box>","<Box marginTop={3}>\n {/* Base */}\n <Box>\n <Stack gap={3}>\n <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n <Row label=\"MIME type\" value={asset?.mimeType} />\n <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n </Stack>\n </Box>\n {/* EXIF */}\n {exif &&\n (exif.DateTimeOriginal ||\n exif.FNumber ||\n exif.FocalLength ||\n exif.ExposureTime ||\n exif.ISO) && (\n <>\n {/* Divider */}\n <Box\n marginY={4}\n style={{\n background: 'var(--card-border-color)',\n height: '1px',\n width: '100%',\n }}\n />\n <Box>\n <Stack gap={3}>\n {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n {exif.ExposureTime && (\n <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n )}\n {exif.DateTimeOriginal && (\n <Row\n label=\"Original date\"\n value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n />\n )}\n </Stack>\n </Box>\n </>\n )}\n\n {/* Asset actions */}\n <Box marginTop={5}>\n <Inline gap={2}>\n {/* Download */}\n <Button\n disabled={!item || item?.updating}\n fontSize={1}\n icon={DownloadIcon}\n mode=\"ghost\"\n onClick={handleDownload}\n text=\"Download\"\n />\n {/* Copy to clipboard */}\n <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n </Inline>\n </Box>\n </Box>","{position: 'fixed'}","<SanityDialog {...props} style={{position: 'fixed'}} />","{documents, isLoading}: Props","<Text muted size={1}>\n Loading...\n </Text>","<Text muted size={1}>\n No documents are referencing this asset\n </Text>","documents?.map((doc) => (\n <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n ))","documents?.map","<Card flex={1} marginBottom={2} padding={2} radius={2} shadow={1}>\n <Stack gap={2}>\n {documents?.map((doc) => (\n <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n ))}\n </Stack>\n </Card>","{\n intent: 'edit',\n params: {id: doc._id},\n }","_id","schemaType ? (\n <Button key={doc._id} mode=\"bleed\" onClick={onClick} padding={2} style={{width: '100%'}}>\n <Preview layout=\"default\" schemaType={schemaType} value={doc} />\n </Button>\n ) : (\n <Box padding={2}>\n <Text size={1}>\n A document of the unknown type <em>{doc._type}</em>\n </Text>\n </Box>\n )","{height: '100%'}","{width}","extension ? (\n <ReactFileIcon\n extension={extension}\n {...defaultStyles[extension as DefaultExtensionType]}\n />\n ) : (\n <ReactFileIcon />\n )","<Container style={{width}}>\n {extension ? (\n <ReactFileIcon\n extension={extension}\n {...defaultStyles[extension as DefaultExtensionType]}\n />\n ) : (\n <ReactFileIcon />\n )}\n </Container>","<Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n <Container style={{width}}>\n {extension ? (\n <ReactFileIcon\n extension={extension}\n {...defaultStyles[extension as DefaultExtensionType]}\n />\n ) : (\n <ReactFileIcon />\n )}\n </Container>\n </Flex>","{height: '100%'}","{width: '100%'}","<Flex align=\"center\" justify=\"center\" style={{height: '100%'}}>\n <audio controls src={asset.url} style={{width: '100%'}} />\n </Flex>","url","{\n height: '100%',\n width: '100%',\n }","<video\n controls\n src={asset.url}\n style={{\n height: '100%',\n width: '100%',\n }}\n />","<FileIcon extension={asset.extension} width=\"50%\" />","extension","<br />","format(new Date(lastUpdated), 'PPp')","<>\n Last updated\n <br /> {format(new Date(lastUpdated), 'PPp')}\n </>","{maxWidth: '185px'}","<Box padding={3} style={{maxWidth: '185px'}}>\n <Text muted size={1}>\n {content}\n </Text>\n </Box>","<Box>\n <Button\n disabled={disabled}\n fontSize={1}\n onClick={onClick}\n text=\"Save and close\"\n tone=\"primary\"\n />\n </Box>","<Tooltip\n animate\n content={\n <Box padding={3} style={{maxWidth: '185px'}}>\n <Text muted size={1}>\n {content}\n </Text>\n </Box>\n }\n disabled={'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Box>\n <Button\n disabled={disabled}\n fontSize={1}\n onClick={onClick}\n text=\"Save and close\"\n tone=\"primary\"\n />\n </Box>\n </Tooltip>","<Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>","error && (\n <Text size={1}>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )","<Box marginY={3}>\n <Inline gap={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n </Box>","description && (\n <Box marginY={3}>\n <Text as=\"label\" htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )","<>\n {/* Label */}\n <Box marginY={3}>\n <Inline gap={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n </Box>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text as=\"label\" htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </>","<Box paddingX={2}>\n <Text size={1}>\n <ChevronDownIcon />\n </Text>\n </Box>","<components.DropdownIndicator {...props}>\n <Box paddingX={2}>\n <Text size={1}>\n <ChevronDownIcon />\n </Text>\n </Box>\n </components.DropdownIndicator>","components.DropdownIndicator","<Card radius={1} shadow={2}>\n {props.children}\n </Card>","children","<components.Menu {...props}>\n <Card radius={1} shadow={2}>\n {props.children}\n </Card>\n </components.Menu>","components.Menu","(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }","{height}","<Virtuoso\n className=\"media__custom-scrollbar\"\n itemContent={(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }}\n style={{height}}\n totalCount={children.length}\n />","length","<components.MenuList {...props}>{children}</components.MenuList>","components.MenuList","<Box padding={2} paddingRight={1}>\n <Text size={1} weight=\"medium\">\n <components.MultiValueLabel {...props} />\n </Text>\n </Box>","components.MultiValueLabel","<CloseIcon color=\"#1f2123\" />","<components.MultiValueRemove {...props}>\n <CloseIcon color=\"#1f2123\" />\n </components.MultiValueRemove>","components.MultiValueRemove","props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />","__isNew__","<Flex align=\"center\">\n {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n {props.children}\n </Flex>","<Box paddingX={1} paddingY={1}>\n <components.Option {...props}>\n <Flex align=\"center\">\n {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n {props.children}\n </Flex>\n </components.Option>\n </Box>","components.Option","(state) => state.tags.creating","(state) => state.tags.fetching","{zIndex: 2}","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","({field}) => {\n const {onBlur, onChange, value: controllerValue} = field\n // TODO: investigate overriding `onChange` and updating form state manually.\n // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n //\n // To illustrate this issue:\n // - Edit an asset with no tags\n // - Add a new tag (either an existing one, or create one inline)\n // - Remove the tag you've just created\n //\n // At this point, the form will still be marked as dirty when it shouldnt be\n return (\n <CreatableSelect\n components={reactSelectComponents}\n instanceId=\"tags\"\n isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n isDisabled={creating || disabled || tagsFetching}\n isLoading={creating}\n isMulti\n name={name}\n noOptionsMessage={() => 'No tags'}\n onBlur={onBlur}\n onChange={onChange}\n onCreateOption={onCreateTag}\n options={options}\n placeholder={tagsFetching ? 'Loading...' : placeholder}\n styles={reactSelectStyles(scheme)}\n value={controllerValue}\n />\n )\n }","{field}","() => 'No tags'","<Controller\n control={control}\n defaultValue={value}\n name={name}\n render={({field}) => {\n const {onBlur, onChange, value: controllerValue} = field\n // TODO: investigate overriding `onChange` and updating form state manually.\n // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n //\n // To illustrate this issue:\n // - Edit an asset with no tags\n // - Add a new tag (either an existing one, or create one inline)\n // - Remove the tag you've just created\n //\n // At this point, the form will still be marked as dirty when it shouldnt be\n return (\n <CreatableSelect\n components={reactSelectComponents}\n instanceId=\"tags\"\n isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n isDisabled={creating || disabled || tagsFetching}\n isLoading={creating}\n isMulti\n name={name}\n noOptionsMessage={() => 'No tags'}\n onBlur={onBlur}\n onChange={onChange}\n onCreateOption={onCreateTag}\n options={options}\n placeholder={tagsFetching ? 'Loading...' : placeholder}\n styles={reactSelectStyles(scheme)}\n value={controllerValue}\n />\n )\n }}\n />","<Box\n // HACK: force stacking context to ensure react-select dropdown sits above other fields\n style={{zIndex: 2}}\n >\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n {/* Select */}\n <Controller\n control={control}\n defaultValue={value}\n name={name}\n render={({field}) => {\n const {onBlur, onChange, value: controllerValue} = field\n // TODO: investigate overriding `onChange` and updating form state manually.\n // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n //\n // To illustrate this issue:\n // - Edit an asset with no tags\n // - Add a new tag (either an existing one, or create one inline)\n // - Remove the tag you've just created\n //\n // At this point, the form will still be marked as dirty when it shouldnt be\n return (\n <CreatableSelect\n components={reactSelectComponents}\n instanceId=\"tags\"\n isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n isDisabled={creating || disabled || tagsFetching}\n isLoading={creating}\n isMulti\n name={name}\n noOptionsMessage={() => 'No tags'}\n onBlur={onBlur}\n onChange={onChange}\n onCreateOption={onCreateTag}\n options={options}\n placeholder={tagsFetching ? 'Loading...' : placeholder}\n styles={reactSelectStyles(scheme)}\n value={controllerValue}\n />\n )\n }}\n />\n </Box>","state","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","<TextInput\n {...rest}\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n />","<Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n {/* Input */}\n <TextInput\n {...rest}\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n />\n </Box>","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","<TextArea\n {...rest}\n autoComplete=\"off\"\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n rows={rows}\n />","<Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n {/* Input */}\n <TextArea\n {...rest}\n autoComplete=\"off\"\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n rows={rows}\n />\n </Box>","{assetId, id, lastCreatedTag, lastRemovedTagIds}","(state) => selectAssetById(state, String(assetId))","getTagSelectOptions(tags)","selectTagSelectOptions(currentAsset)","(state) =>\n selectFolderPathById(state, currentFolderId)","state","{details: CustomDetails} = {}","(asset?: Asset): AssetFormData => {\n let imageDescription: string | undefined\n if (asset && isImageAsset(asset)) {\n const raw = asset.metadata?.image?.['ImageDescription']\n if (typeof raw === 'string') {\n imageDescription = raw\n }\n }\n\n if (locales && locales.length > 0) {\n const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n const obj: Record<string, string> = {}\n for (let i = 0; i < locales.length; i++) {\n const locale = locales[i]!\n // Prefer key presence over truthiness so an intentional empty string\n // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n if (typeof field === 'object' && field && locale.id in field) {\n obj[locale.id] = field[locale.id] ?? ''\n } else if (typeof field === 'string') {\n // Only populate the first locale to avoid spreading a legacy value\n // across all languages; the user should fill in other translations manually\n obj[locale.id] = i === 0 ? field : ''\n } else if (typeof field === 'object' && field) {\n // Localized object present but this locale key is missing: leave empty.\n // Do not apply EXIF fallback to partial translations.\n obj[locale.id] = ''\n } else {\n // No description set at all — EXIF fallback only for the first locale.\n obj[locale.id] = i === 0 ? fallback : ''\n }\n }\n return obj\n }\n return {\n altText: makeLocaleObj(asset?.altText),\n creditLine: makeLocaleObj(asset?.creditLine),\n description: makeLocaleObj(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: makeLocaleObj(asset?.title),\n }\n }\n // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n const flattenField = (field: unknown, fallback = ''): string => {\n if (typeof field === 'string') return field\n if (typeof field === 'object' && field !== null) {\n const values = Object.values(field as Record<string, string>)\n return values.find((v) => v) || fallback\n }\n return fallback\n }\n return {\n altText: flattenField(asset?.altText),\n creditLine: flattenField(asset?.creditLine),\n description: flattenField(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: flattenField(asset?.title),\n }\n }","'ImageDescription'","fallback = ''","(field: unknown, fallback = ''): string => {\n if (typeof field === 'string') return field\n if (typeof field === 'object' && field !== null) {\n const values = Object.values(field as Record<string, string>)\n return values.find((v) => v) || fallback\n }\n return fallback\n }","useCallback(\n (asset?: Asset): AssetFormData => {\n let imageDescription: string | undefined\n if (asset && isImageAsset(asset)) {\n const raw = asset.metadata?.image?.['ImageDescription']\n if (typeof raw === 'string') {\n imageDescription = raw\n }\n }\n\n if (locales && locales.length > 0) {\n const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n const obj: Record<string, string> = {}\n for (let i = 0; i < locales.length; i++) {\n const locale = locales[i]!\n // Prefer key presence over truthiness so an intentional empty string\n // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n if (typeof field === 'object' && field && locale.id in field) {\n obj[locale.id] = field[locale.id] ?? ''\n } else if (typeof field === 'string') {\n // Only populate the first locale to avoid spreading a legacy value\n // across all languages; the user should fill in other translations manually\n obj[locale.id] = i === 0 ? field : ''\n } else if (typeof field === 'object' && field) {\n // Localized object present but this locale key is missing: leave empty.\n // Do not apply EXIF fallback to partial translations.\n obj[locale.id] = ''\n } else {\n // No description set at all — EXIF fallback only for the first locale.\n obj[locale.id] = i === 0 ? fallback : ''\n }\n }\n return obj\n }\n return {\n altText: makeLocaleObj(asset?.altText),\n creditLine: makeLocaleObj(asset?.creditLine),\n description: makeLocaleObj(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: makeLocaleObj(asset?.title),\n }\n }\n // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n const flattenField = (field: unknown, fallback = ''): string => {\n if (typeof field === 'string') return field\n if (typeof field === 'object' && field !== null) {\n const values = Object.values(field as Record<string, string>)\n return values.find((v) => v) || fallback\n }\n return fallback\n }\n return {\n altText: flattenField(asset?.altText),\n creditLine: flattenField(asset?.creditLine),\n description: flattenField(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: flattenField(asset?.title),\n }\n },\n [assetTagOptions, locales],\n )","generateDefaultValues(assetItem?.asset)","assetItem?.asset","zodFormResolver<AssetFormData>(getAssetFormSchema(locales))","{\n defaultValues: generateDefaultValues(assetItem?.asset),\n mode: 'onChange',\n resolver: zodFormResolver<AssetFormData>(getAssetFormSchema(locales)),\n }","{control}","() => {\n dispatch(dialogActions.remove({id}))\n }","useCallback(() => {\n dispatch(dialogActions.remove({id}))\n }, [dispatch, id])","() => {\n if (!assetItem?.asset) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteAssets({\n assets: [assetItem],\n closeDialogId: assetItem?.asset._id,\n }),\n )\n }","useCallback(() => {\n if (!assetItem?.asset) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteAssets({\n assets: [assetItem],\n closeDialogId: assetItem?.asset._id,\n }),\n )\n }, [assetItem, dispatch])","(update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate asset snapshot\n setAssetSnapshot(result as Asset)\n }\n }","useCallback((update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate asset snapshot\n setAssetSnapshot(result as Asset)\n }\n }, [])","(tagName: string) => {\n // Dispatch action to create new tag\n dispatch(\n tagsActions.createRequest({\n assetId: currentAsset?._id,\n name: tagName,\n }),\n )\n }","_id","useCallback(\n (tagName: string) => {\n // Dispatch action to create new tag\n dispatch(\n tagsActions.createRequest({\n assetId: currentAsset?._id,\n name: tagName,\n }),\n )\n },\n [currentAsset?._id, dispatch],\n )","() => {\n if (!assetItem) {\n return\n }\n\n dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n }","useCallback(() => {\n if (!assetItem) {\n return\n }\n\n dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n }, [assetItem, currentFolderId, dispatch])","() => {\n if (!assetItem || !currentFolderId) {\n return\n }\n\n dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n }","useCallback(() => {\n if (!assetItem || !currentFolderId) {\n return\n }\n\n dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n }, [assetItem, currentFolderId, dispatch])","useMemo(() => {\n if (!currentAsset) return false\n const isLocaleObj = (v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)\n const fields = [\n currentAsset.title,\n currentAsset.altText,\n currentAsset.description,\n ...(currentAsset._type === 'sanity.imageAsset' ? [currentAsset.creditLine] : []),\n ]\n const anyLocalized = fields.some((f) => isLocaleObj(f))\n if (!anyLocalized) return false\n if (!locales || locales.length === 0) return true\n const configuredIds = new Set(locales.map((l) => l.id))\n return fields.some((f) => {\n if (!isLocaleObj(f)) return false\n return Object.keys(f as object).some((k) => !configuredIds.has(k))\n })\n }, [currentAsset, locales])","(v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)","(l) => l.id","f","async () => {\n if (!currentAsset) return\n\n const cleanField = (field: unknown): unknown => {\n if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n const obj = field as Record<string, string>\n if (!locales || locales.length === 0) {\n // Pick the first non-empty value sorted by key for determinism\n const sorted = Object.keys(obj).sort()\n return sorted.map((k) => obj[k]).find((v) => v) || ''\n }\n const configuredIds = new Set(locales.map((l) => l.id))\n const cleaned: Record<string, string> = {}\n for (const [key, val] of Object.entries(obj)) {\n if (configuredIds.has(key)) cleaned[key] = val\n }\n return cleaned\n }\n\n await client\n .patch(currentAsset._id)\n .set({\n title: cleanField(currentAsset.title),\n altText: cleanField(currentAsset.altText),\n description: cleanField(currentAsset.description),\n ...(currentAsset._type === 'sanity.imageAsset' && {\n creditLine: cleanField(currentAsset.creditLine),\n }),\n })\n .commit()\n }","field","obj","k","(v) => v","configuredIds","useCallback(async () => {\n if (!currentAsset) return\n\n const cleanField = (field: unknown): unknown => {\n if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n const obj = field as Record<string, string>\n if (!locales || locales.length === 0) {\n // Pick the first non-empty value sorted by key for determinism\n const sorted = Object.keys(obj).sort()\n return sorted.map((k) => obj[k]).find((v) => v) || ''\n }\n const configuredIds = new Set(locales.map((l) => l.id))\n const cleaned: Record<string, string> = {}\n for (const [key, val] of Object.entries(obj)) {\n if (configuredIds.has(key)) cleaned[key] = val\n }\n return cleaned\n }\n\n await client\n .patch(currentAsset._id)\n .set({\n title: cleanField(currentAsset.title),\n altText: cleanField(currentAsset.altText),\n description: cleanField(currentAsset.description),\n ...(currentAsset._type === 'sanity.imageAsset' && {\n creditLine: cleanField(currentAsset.creditLine),\n }),\n })\n .commit()\n }, [client, currentAsset, locales])","(formData) => {\n if (!assetItem?.asset) {\n return\n }\n\n const sanitizedFormData = sanitizeFormData(formData)\n\n // Keep an intentionally cleared description as '' (not null) so the EXIF\n // ImageDescription fallback does not refill it the next time the dialog opens.\n if (formData.description === '') {\n sanitizedFormData['description'] = ''\n }\n\n dispatch(\n assetsActions.updateRequest({\n asset: assetItem?.asset,\n closeDialogId: assetItem?.asset._id,\n formData: {\n ...sanitizedFormData,\n // Map tags to sanity references\n opt: {\n media: {\n ...sanitizedFormData['opt'].media,\n tags:\n sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n _ref: tag.value,\n _type: 'reference',\n _weak: true,\n })) || null,\n // Preserve the folder reference — it is managed separately and must\n // not be wiped when patching opt.media via .set().\n ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n },\n },\n },\n }),\n )\n }","asset","currentAsset?.opt?.media?.folder","'description'","'opt'","(tag: TagSelectOption) => ({\n _ref: tag.value,\n _type: 'reference',\n _weak: true,\n })","useCallback(\n (formData) => {\n if (!assetItem?.asset) {\n return\n }\n\n const sanitizedFormData = sanitizeFormData(formData)\n\n // Keep an intentionally cleared description as '' (not null) so the EXIF\n // ImageDescription fallback does not refill it the next time the dialog opens.\n if (formData.description === '') {\n sanitizedFormData['description'] = ''\n }\n\n dispatch(\n assetsActions.updateRequest({\n asset: assetItem?.asset,\n closeDialogId: assetItem?.asset._id,\n formData: {\n ...sanitizedFormData,\n // Map tags to sanity references\n opt: {\n media: {\n ...sanitizedFormData['opt'].media,\n tags:\n sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n _ref: tag.value,\n _type: 'reference',\n _weak: true,\n })) || null,\n // Preserve the folder reference — it is managed separately and must\n // not be wiped when patching opt.media via .set().\n ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n },\n },\n },\n }),\n )\n },\n [assetItem?.asset, currentAsset, dispatch],\n )","() => {\n if (!assetItem?.asset) {\n return undefined\n }\n\n // Remember that Sanity listeners ignore joins, order clauses and projections\n const subscriptionAsset = client\n .listen(groq`*[_id == $id]`, {id: assetItem?.asset._id})\n .subscribe(handleAssetUpdate)\n\n return () => {\n subscriptionAsset?.unsubscribe()\n }\n }","[assetItem?.asset, client, handleAssetUpdate]","() => {\n if (lastCreatedTag) {\n const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n const updatedTags = existingTags.concat([lastCreatedTag])\n setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n }\n }","[getValues, lastCreatedTag, setValue]","() => {\n if (lastRemovedTagIds) {\n const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n const updatedTags = existingTags.filter((tag) => {\n return !lastRemovedTagIds.includes(tag.value)\n })\n\n setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n }\n }","[getValues, lastRemovedTagIds, setValue]","existingTags","updatedTags","tag","() => {\n if (assetUpdatedPrev.current !== assetItem?.asset._updatedAt) {\n reset(generateDefaultValues(assetItem?.asset))\n }\n assetUpdatedPrev.current = assetItem?.asset._updatedAt\n }","[assetItem?.asset, generateDefaultValues, reset]","hasOrphanedLocales && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Text size={1}>\n This asset has localized fields that are no longer configured. Clean them up to\n avoid validation errors.\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleCleanupLocales}\n text=\"Cleanup localized fields\"\n tone=\"caution\"\n />\n </Flex>\n </Card>\n )","<Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />","handleSubmit(onSubmit)","<FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n isValid={isValid}\n lastUpdated={currentAsset?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />","formUpdating || !isDirty || !isValid || hasOrphanedLocales","currentAsset?._updatedAt","<Flex justify=\"space-between\">\n {/* Delete button */}\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n isValid={isValid}\n lastUpdated={currentAsset?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>","<Box padding={3}>\n <Stack gap={3}>\n {hasOrphanedLocales && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Text size={1}>\n This asset has localized fields that are no longer configured. Clean them up to\n avoid validation errors.\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleCleanupLocales}\n text=\"Cleanup localized fields\"\n tone=\"caution\"\n />\n </Flex>\n </Card>\n )}\n <Flex justify=\"space-between\">\n {/* Delete button */}\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n isValid={isValid}\n lastUpdated={currentAsset?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Stack>\n </Box>","{\n control,\n errors,\n formUpdating,\n register,\n setValue,\n assetTagOptions,\n allTagOptions,\n handleCreateTag,\n currentAsset,\n folderPath: currentFolderPath,\n folderMissing: !!currentFolderId && !currentFolderPath,\n onChangeFolder: handleChangeFolder,\n onRemoveFolder: handleRemoveFolder,\n creditLine,\n locales,\n }","!!currentFolderId && !currentFolderPath","['column-reverse', 'column-reverse', 'row-reverse']","[5, 5, 0]","({isLoading, referringDocuments}) => {\n const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n return (\n <>\n {/* Tabs */}\n <TabList gap={2}>\n <Tab\n aria-controls=\"details-panel\"\n disabled={formUpdating}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTabSection('details')}\n selected={tabSection === 'details'}\n size={2}\n />\n <Tab\n aria-controls=\"references-panel\"\n disabled={formUpdating}\n id=\"references-tab\"\n label={`References${\n !isLoading && Array.isArray(uniqueReferringDocuments)\n ? ` (${uniqueReferringDocuments.length})`\n : ''\n }`}\n onClick={() => setTabSection('references')}\n selected={tabSection === 'references'}\n size={2}\n />\n </TabList>\n\n {/* Form fields */}\n <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!assetItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Panel: details */}\n <TabPanel\n aria-labelledby=\"details\"\n hidden={tabSection !== 'details'}\n id=\"details-panel\"\n >\n {CustomDetails ? (\n <CustomDetails\n {...detailsProps}\n renderDefaultDetails={renderDefaultDetails}\n />\n ) : (\n <Details {...detailsProps} />\n )}\n </TabPanel>\n\n {/* Panel: References */}\n <TabPanel\n aria-labelledby=\"references\"\n hidden={tabSection !== 'references'}\n id=\"references-panel\"\n >\n <Box marginTop={5}>\n {assetItem?.asset && (\n <DocumentList\n documents={uniqueReferringDocuments}\n isLoading={isLoading}\n />\n )}\n </Box>\n </TabPanel>\n </Box>\n </>\n )\n }","{isLoading, referringDocuments}","<Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n documentStore={documentStore}\n id={currentAsset._id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n return (\n <>\n {/* Tabs */}\n <TabList gap={2}>\n <Tab\n aria-controls=\"details-panel\"\n disabled={formUpdating}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTabSection('details')}\n selected={tabSection === 'details'}\n size={2}\n />\n <Tab\n aria-controls=\"references-panel\"\n disabled={formUpdating}\n id=\"references-tab\"\n label={`References${\n !isLoading && Array.isArray(uniqueReferringDocuments)\n ? ` (${uniqueReferringDocuments.length})`\n : ''\n }`}\n onClick={() => setTabSection('references')}\n selected={tabSection === 'references'}\n size={2}\n />\n </TabList>\n\n {/* Form fields */}\n <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!assetItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Panel: details */}\n <TabPanel\n aria-labelledby=\"details\"\n hidden={tabSection !== 'details'}\n id=\"details-panel\"\n >\n {CustomDetails ? (\n <CustomDetails\n {...detailsProps}\n renderDefaultDetails={renderDefaultDetails}\n />\n ) : (\n <Details {...detailsProps} />\n )}\n </TabPanel>\n\n {/* Panel: References */}\n <TabPanel\n aria-labelledby=\"references\"\n hidden={tabSection !== 'references'}\n id=\"references-panel\"\n >\n <Box marginTop={5}>\n {assetItem?.asset && (\n <DocumentList\n documents={uniqueReferringDocuments}\n isLoading={isLoading}\n />\n )}\n </Box>\n </TabPanel>\n </Box>\n </>\n )\n }}\n </WithReferringDocuments>\n </Box>","{aspectRatio: '1'}","isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />","isImageAsset(currentAsset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n />\n )","<Box style={{aspectRatio: '1'}}>\n {/* File */}\n {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n {/* Image */}\n {isImageAsset(currentAsset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n />\n )}\n </Box>","currentAsset && (\n <Box marginTop={4}>\n <AssetMetadata asset={currentAsset} item={assetItem} />\n </Box>\n )","<Box flex={1} padding={4}>\n <Box style={{aspectRatio: '1'}}>\n {/* File */}\n {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n {/* Image */}\n {isImageAsset(currentAsset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n />\n )}\n </Box>\n\n {/* Metadata */}\n {currentAsset && (\n <Box marginTop={4}>\n <AssetMetadata asset={currentAsset} item={assetItem} />\n </Box>\n )}\n </Box>","<Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n documentStore={documentStore}\n id={currentAsset._id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n return (\n <>\n {/* Tabs */}\n <TabList gap={2}>\n <Tab\n aria-controls=\"details-panel\"\n disabled={formUpdating}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTabSection('details')}\n selected={tabSection === 'details'}\n size={2}\n />\n <Tab\n aria-controls=\"references-panel\"\n disabled={formUpdating}\n id=\"references-tab\"\n label={`References${\n !isLoading && Array.isArray(uniqueReferringDocuments)\n ? ` (${uniqueReferringDocuments.length})`\n : ''\n }`}\n onClick={() => setTabSection('references')}\n selected={tabSection === 'references'}\n size={2}\n />\n </TabList>\n\n {/* Form fields */}\n <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!assetItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Panel: details */}\n <TabPanel\n aria-labelledby=\"details\"\n hidden={tabSection !== 'details'}\n id=\"details-panel\"\n >\n {CustomDetails ? (\n <CustomDetails\n {...detailsProps}\n renderDefaultDetails={renderDefaultDetails}\n />\n ) : (\n <Details {...detailsProps} />\n )}\n </TabPanel>\n\n {/* Panel: References */}\n <TabPanel\n aria-labelledby=\"references\"\n hidden={tabSection !== 'references'}\n id=\"references-panel\"\n >\n <Box marginTop={5}>\n {assetItem?.asset && (\n <DocumentList\n documents={uniqueReferringDocuments}\n isLoading={isLoading}\n />\n )}\n </Box>\n </TabPanel>\n </Box>\n </>\n )\n }}\n </WithReferringDocuments>\n </Box>\n\n <Box flex={1} padding={4}>\n <Box style={{aspectRatio: '1'}}>\n {/* File */}\n {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n {/* Image */}\n {isImageAsset(currentAsset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n />\n )}\n </Box>\n\n {/* Metadata */}\n {currentAsset && (\n <Box marginTop={4}>\n <AssetMetadata asset={currentAsset} item={assetItem} />\n </Box>\n )}\n </Box>\n </Flex>","<Dialog animate footer={footer} header=\"Asset details\" id={id} onClose={handleClose} width={3}>\n {/*\n We reverse direction to ensure the download button doesn't appear (in the DOM) before other tabbable items.\n This ensures that the dialog doesn't scroll down to the download button (which on smaller screens, can sometimes\n be below the fold).\n */}\n <Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n documentStore={documentStore}\n id={currentAsset._id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n return (\n <>\n {/* Tabs */}\n <TabList gap={2}>\n <Tab\n aria-controls=\"details-panel\"\n disabled={formUpdating}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTabSection('details')}\n selected={tabSection === 'details'}\n size={2}\n />\n <Tab\n aria-controls=\"references-panel\"\n disabled={formUpdating}\n id=\"references-tab\"\n label={`References${\n !isLoading && Array.isArray(uniqueReferringDocuments)\n ? ` (${uniqueReferringDocuments.length})`\n : ''\n }`}\n onClick={() => setTabSection('references')}\n selected={tabSection === 'references'}\n size={2}\n />\n </TabList>\n\n {/* Form fields */}\n <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!assetItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Panel: details */}\n <TabPanel\n aria-labelledby=\"details\"\n hidden={tabSection !== 'details'}\n id=\"details-panel\"\n >\n {CustomDetails ? (\n <CustomDetails\n {...detailsProps}\n renderDefaultDetails={renderDefaultDetails}\n />\n ) : (\n <Details {...detailsProps} />\n )}\n </TabPanel>\n\n {/* Panel: References */}\n <TabPanel\n aria-labelledby=\"references\"\n hidden={tabSection !== 'references'}\n id=\"references-panel\"\n >\n <Box marginTop={5}>\n {assetItem?.asset && (\n <DocumentList\n documents={uniqueReferringDocuments}\n isLoading={isLoading}\n />\n )}\n </Box>\n </TabPanel>\n </Box>\n </>\n )\n }}\n </WithReferringDocuments>\n </Box>\n\n <Box flex={1} padding={4}>\n <Box style={{aspectRatio: '1'}}>\n {/* File */}\n {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n {/* Image */}\n {isImageAsset(currentAsset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n />\n )}\n </Box>\n\n {/* Metadata */}\n {currentAsset && (\n <Box marginTop={4}>\n <AssetMetadata asset={currentAsset} item={assetItem} />\n </Box>\n )}\n </Box>\n </Flex>\n\n {children}\n </Dialog>","fallback","v","l","(e: KeyboardEvent) => {\n if (isHotkey(hotkey, e)) {\n keyPressed.current = true\n if (onPress) {\n onPress()\n }\n }\n }","useCallback(\n (e: KeyboardEvent) => {\n if (isHotkey(hotkey, e)) {\n keyPressed.current = true\n if (onPress) {\n onPress()\n }\n }\n },\n [hotkey, onPress],\n )","() => {\n keyPressed.current = false\n }","useCallback(() => {\n keyPressed.current = false\n }, [])","() => {\n window.addEventListener('keydown', downHandler)\n window.addEventListener('keyup', upHandler)\n // Remove event listeners on cleanup\n return () => {\n window.removeEventListener('keydown', downHandler)\n window.removeEventListener('keyup', upHandler)\n }\n }","[downHandler, upHandler]","(state) => state.assets.lastPicked","(state) => selectAssetById(state, id)","state","(state) => {\n if (source !== 'replace-asset') {\n return undefined\n }\n const dialog = state.dialog.items.find((d) => d.type === 'dialogAllAssets')\n return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n }","(d) => d.type === 'dialogAllAssets'","(state) =>\n assetToReplaceId ? selectAssetById(state, assetToReplaceId) : undefined","() => {\n if (!assetToReplaceId || !isImageAsset(asset) || assetToReplace?.updating) {\n return\n }\n\n dispatch(assetsActions.updateImageReferences({asset, id: assetToReplaceId}))\n toast.push({\n status: 'info',\n title:\n 'Updating in progress. Depending on the amount of changes, this could take a few minutes.',\n })\n dispatch(dialogActions.clear())\n }","updating","(e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (source === 'replace-asset') {\n handleReplaceAsset()\n return\n }\n\n if (selected) {\n return\n }\n\n if (onSelect && !isMultiSelect) {\n onSelect([\n {\n kind: 'assetDocumentId',\n value: asset._id,\n },\n ])\n } else if (onSelect && isMultiSelect) {\n if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n } else if (shiftPressed.current) {\n if (picked) {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n } else {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n }\n } else {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n }\n }","_id","shiftPressed.current","(e: MouseEvent) => {\n e.stopPropagation()\n\n if (source === 'replace-asset') {\n handleReplaceAsset()\n return\n }\n\n if (selected) {\n return\n }\n\n if (onSelect && !isMultiSelect) {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n } else if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n }","{\n cursor: selected ? 'default' : 'pointer',\n position: 'relative',\n }","selected ? 'default' : 'pointer'","{height: '100%', opacity: opacityPreview}","isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />","isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 250, width: 250})}\n style={{\n draggable: false,\n transition: 'opacity 1000ms',\n }}\n />\n )","<div\n data-testid={`media-asset-card-${asset._id}`}\n onClick={handleAssetClick}\n style={{height: '100%', opacity: opacityPreview}}\n >\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 250, width: 250})}\n style={{\n draggable: false,\n transition: 'opacity 1000ms',\n }}\n />\n )}\n </div>","`media-asset-card-${asset._id}`","selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n opacity: opacityContainer,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )","updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )","<Box\n flex={1}\n style={{\n cursor: selected ? 'default' : 'pointer',\n position: 'relative',\n }}\n >\n <div\n data-testid={`media-asset-card-${asset._id}`}\n onClick={handleAssetClick}\n style={{height: '100%', opacity: opacityPreview}}\n >\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 250, width: 250})}\n style={{\n draggable: false,\n transition: 'opacity 1000ms',\n }}\n />\n )}\n </div>\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n opacity: opacityContainer,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n </Box>","{opacity: opacityContainer}","onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n flexShrink: 0,\n pointerEvents: 'none',\n transform: 'scale(0.8)',\n }}\n />\n )","<Box marginLeft={2}>\n <Text muted size={0} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>","originalFilename","<ContextActionContainer\n align=\"center\"\n onClick={handleContextActionClick}\n paddingX={1}\n $scheme={scheme}\n style={{opacity: opacityContainer}}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n flexShrink: 0,\n pointerEvents: 'none',\n transform: 'scale(0.8)',\n }}\n />\n )}\n\n <Box marginLeft={2}>\n <Text muted size={0} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>\n </ContextActionContainer>","error && (\n <Box\n padding={3}\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningOutlineIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )","<CardWrapper padding={1}>\n <CardContainer direction=\"column\" $picked={picked} $updating={item.updating}>\n {/* Image */}\n <Box\n flex={1}\n style={{\n cursor: selected ? 'default' : 'pointer',\n position: 'relative',\n }}\n >\n <div\n data-testid={`media-asset-card-${asset._id}`}\n onClick={handleAssetClick}\n style={{height: '100%', opacity: opacityPreview}}\n >\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 250, width: 250})}\n style={{\n draggable: false,\n transition: 'opacity 1000ms',\n }}\n />\n )}\n </div>\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n opacity: opacityContainer,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n </Box>\n\n {/* Footer */}\n <ContextActionContainer\n align=\"center\"\n onClick={handleContextActionClick}\n paddingX={1}\n $scheme={scheme}\n style={{opacity: opacityContainer}}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n flexShrink: 0,\n pointerEvents: 'none',\n transform: 'scale(0.8)',\n }}\n />\n )}\n\n <Box marginLeft={2}>\n <Text muted size={0} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>\n </ContextActionContainer>\n\n {/* TODO: DRY */}\n {/* Error button */}\n {error && (\n <Box\n padding={3}\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningOutlineIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )}\n </CardContainer>\n </CardWrapper>","{folderId, name, totalCount}: Props","() => dispatch(foldersActions.currentFolderSet({folderId}))","getSchemeColor(scheme, 'bg')","{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n }","<Flex align=\"center\" flex={1} justify=\"center\">\n <FolderGlyph />\n </Flex>","{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}","<Text\n size={1}\n style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n weight=\"semibold\"\n >\n {name}\n </Text>","{lineHeight: '1.2em'}","<Text muted size={0} style={{lineHeight: '1.2em'}}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>","totalCount === 1 ? '' : 's'","<Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n <Flex align=\"center\" flex={1} justify=\"center\">\n <FolderGlyph />\n </Flex>\n\n <Stack gap={2}>\n <Text\n size={1}\n style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n weight=\"semibold\"\n >\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.2em'}}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Stack>\n </Flex>","<CardWrapper padding={1}>\n <FolderCard\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n padding={3}\n radius={2}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n }}\n >\n <Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n <Flex align=\"center\" flex={1} justify=\"center\">\n <FolderGlyph />\n </Flex>\n\n <Stack gap={2}>\n <Text\n size={1}\n style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n weight=\"semibold\"\n >\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.2em'}}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Stack>\n </Flex>\n </FolderCard>\n </CardWrapper>","(state) => selectUploadById(state, id)","filesize(item.size, {base: 10, round: 0})","size","() => {\n dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n }","hash","getSchemeColor(scheme, 'bg')","{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n height: '100%',\n position: 'relative',\n }","<div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />","`scaleX(${percentLoaded * 0.01})`","{position: 'relative'}","item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{\n opacity: 0.4,\n }}\n />\n )","assetType","objectUrl","item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"80px\" />\n </div>\n )","!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n direction=\"column\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={4}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )","<Box flex={1} style={{position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{\n opacity: 0.4,\n }}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"80px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n direction=\"column\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={4}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>","{height: `${PANEL_HEIGHT}px`}","<Box flex={1} marginRight={1}>\n <Text size={0} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n </Box>","name","{flexShrink: 0}","<Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n {status}\n </Text>","<Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={2}\n style={{height: `${PANEL_HEIGHT}px`}}\n >\n <Box flex={1} marginRight={1}>\n <Text size={0} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n </Box>\n <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n {status}\n </Text>\n </Flex>","<CardWrapper padding={1}>\n <Flex\n direction=\"column\"\n flex={1}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n height: '100%',\n position: 'relative',\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />\n\n <Box flex={1} style={{position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{\n opacity: 0.4,\n }}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"80px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n direction=\"column\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={4}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>\n\n {/* Footer */}\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={2}\n style={{height: `${PANEL_HEIGHT}px`}}\n >\n <Box flex={1} marginRight={1}>\n <Text size={0} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n </Box>\n <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n {status}\n </Text>\n </Flex>\n </Flex>\n </CardWrapper>","{\n item,\n selected,\n source,\n }: {\n item: CardAssetData | CardFolderData | CardUploadData\n selected: boolean\n source?: string\n }","<CardAsset id={item.id} selected={selected} source={source} />","id","<CardFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />","folderId","name","totalCount","<CardUpload id={item.id} />","...rest","<StyledItemContainer ref={ref} {...rest} />","<StyledListContainer ref={ref} {...rest} />","(state) => state.selected.assets","(selectedAssets && selectedAssets.map((asset) => asset._id)) || []","(asset) => asset._id","(index) => {\n const item = items[index]\n return item?.id ?? index\n }","{\n Item: ItemContainer,\n List: ListContainer,\n }","(index) => {\n const item = items[index]!\n const selected = selectedIds.includes(item.id)\n return <VirtualCell item={item} selected={selected} source={source} />\n }","item","index","{overflowX: 'hidden', overflowY: 'scroll'}","<VirtuosoGrid\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n return item?.id ?? index\n }}\n components={{\n Item: ItemContainer,\n List: ListContainer,\n }}\n endReached={onLoadMore}\n itemContent={(index) => {\n const item = items[index]!\n const selected = selectedIds.includes(item.id)\n return <VirtualCell item={item} selected={selected} source={source} />\n }}\n overscan={48}\n style={{overflowX: 'hidden', overflowY: 'scroll'}}\n totalCount={totalCount}\n />","(state) => state.assets.byIds","(state) => state.assets.fetchCount","(state) => state.assets.fetching","(state) => state.assets.fetchingError","(state) => state.assets.pageSize","(state) => state.search.query","(state) => state.search.facets","(state) => state.folders.currentFolderId","(state) => state.folders.currentFolderUnfiled","(state) => {\n const dialog = state.dialog.items.find((item) => item.type === 'dialogAllAssets')\n return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n }","() =>\n searchQuery.length > 0 ||\n searchFacets.length > 0 ||\n Boolean(currentFolderId) ||\n currentFolderUnfiled","searchFacets.length","length","() => {\n const {dialog, folders, search} = store.getState()\n const {query, facets} = search\n const dialogItem = dialog.items.find((item) => item.type === 'dialogAllAssets')\n\n savedBrowserStateRef.current = {\n assetId: dialogItem?.type === 'dialogAllAssets' ? dialogItem.assetId : undefined,\n query,\n facets,\n folderId: folders.currentFolderId,\n folderUnfiled: folders.currentFolderUnfiled,\n }\n\n if (query.length > 0) {\n dispatch(searchActions.querySet({searchQuery: ''}))\n }\n if (facets.length > 0) {\n dispatch(searchActions.facetsClear())\n }\n if (folders.currentFolderId || folders.currentFolderUnfiled) {\n dispatch(foldersActions.currentFolderClear())\n }\n\n return () => {\n const saved = savedBrowserStateRef.current\n if (!saved) {\n return\n }\n\n const hadScope =\n saved.query.length > 0 ||\n saved.facets.length > 0 ||\n Boolean(saved.folderId) ||\n saved.folderUnfiled\n\n if (saved.query.length > 0) {\n dispatch(searchActions.querySet({searchQuery: saved.query}))\n }\n for (const facet of saved.facets) {\n dispatch(searchActions.facetsAdd({facet: omitFacetId(facet)}))\n }\n if (saved.folderId) {\n dispatch(foldersActions.currentFolderSet({folderId: saved.folderId}))\n } else if (saved.folderUnfiled) {\n dispatch(foldersActions.currentFolderShowUnfiled())\n }\n\n // Changing the search or folder runs epics that clear picks — put the asset being\n // replaced back so closing the dialog keeps the browser selection.\n if (hadScope && saved.assetId) {\n dispatch(assetsActions.pick({assetId: saved.assetId, picked: true}))\n }\n }\n }","[dispatch, store]","dialog","(item) => item.type === 'dialogAllAssets'","() => {\n let previousIds = store.getState().assets.allIds\n let awaitingSettle = false\n\n return store.subscribe(() => {\n const {allIds, fetching: isFetching} = store.getState().assets\n const listCleared = allIds !== previousIds && allIds.length === 0\n previousIds = allIds\n\n if (listCleared) {\n awaitingSettle = true\n setAwaitingRefetch(true)\n return\n }\n if (awaitingSettle && !isFetching) {\n awaitingSettle = false\n setAwaitingRefetch(false)\n }\n })\n }","[store]","combinedItems.filter((item) => {\n if (item.type !== 'asset' || item.id === assetToReplaceId) {\n return false\n }\n const asset = assetsById[item.id]?.asset\n return asset ? isImageAsset(asset) : false\n })","(item) => {\n if (item.type !== 'asset' || item.id === assetToReplaceId) {\n return false\n }\n const asset = assetsById[item.id]?.asset\n return asset ? isImageAsset(asset) : false\n }","item","() => {\n if (\n scopeActive ||\n fetching ||\n awaitingRefetch ||\n fetchingError ||\n reducedItems.length > 0 ||\n !hasFetchedOnce ||\n !hasMorePages\n ) {\n return\n }\n dispatch(assetsActions.loadNextPage())\n }","[\n dispatch,\n scopeActive,\n fetching,\n awaitingRefetch,\n fetchingError,\n reducedItems.length,\n hasFetchedOnce,\n hasMorePages,\n ]","() => {\n if (!fetching) {\n dispatch(assetsActions.loadNextPage())\n }\n }","<Box height=\"fill\">\n {isEmpty ? (\n <Box padding={5}>\n <Text size={1} weight=\"semibold\">\n There are no replacement images\n </Text>\n </Box>\n ) : (\n <Box height=\"fill\">\n <AssetGridVirtualized\n items={reducedItems}\n onLoadMore={handleLoadMoreItems}\n source=\"replace-asset\"\n />\n </Box>\n )}\n </Box>","state","{id}","() => {\n dispatch(dialogActions.clear())\n }","useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])","<Box padding={4} style={{height: '50vh'}}>\n <ReplaceAssetsOverview />\n </Box>","<Dialog header=\"Choose a replacement image\" id={id} onClose={handleClose} width={3}>\n <Box padding={4} style={{height: '50vh'}}>\n <ReplaceAssetsOverview />\n </Box>\n\n {children}\n </Dialog>","() => {\n dispatch(dialogActions.remove({id: dialog?.id}))\n }","id","() => {\n // Close target dialog, if provided\n if (dialog?.closeDialogId) {\n dispatch(dialogActions.remove({id: dialog?.closeDialogId}))\n }\n\n if (dialog?.confirmCallbackAction) {\n dispatch(dialog.confirmCallbackAction)\n }\n\n // Close self\n handleClose()\n }","dialog?.closeDialogId","() => (\n <Box padding={3}>\n <Flex justify=\"space-between\">\n <Button fontSize={1} mode=\"bleed\" onClick={handleClose} text=\"Cancel\" />\n <Button\n fontSize={1}\n onClick={handleConfirm}\n text={dialog?.confirmText}\n tone={dialog?.tone}\n />\n </Flex>\n </Box>\n )","confirmText","tone","() => (\n <Flex align=\"center\">\n <Box paddingX={1}>\n <WarningOutlineIcon />\n </Box>\n <Box marginLeft={2}>{dialog?.headerTitle}</Box>\n </Flex>\n )","headerTitle","<Footer />","<Header />","dialog?.title && <Text size={1}>{dialog.title}</Text>","dialog?.title","dialog?.description && (\n <Text muted size={1}>\n <em>{dialog.description}</em>\n </Text>\n )","dialog?.description","<Box paddingX={4} paddingY={4}>\n <Stack gap={3}>\n {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n {dialog?.description && (\n <Text muted size={1}>\n <em>{dialog.description}</em>\n </Text>\n )}\n </Stack>\n </Box>","<Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n // oxlint-disable-next-line react/static-components\n header={<Header />}\n id=\"confirm\"\n onClose={handleClose}\n width={1}\n >\n <Box paddingX={4} paddingY={4}>\n <Stack gap={3}>\n {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n {dialog?.description && (\n <Text muted size={1}>\n <em>{dialog.description}</em>\n </Text>\n )}\n </Stack>\n </Box>\n\n {children}\n </Dialog>","{parentFolderId, id}","(state) => state.folders.creating","(state) => state.folders.creatingError","(state) => selectFolderPathById(state, parentFolderId)","state","{\n name: '',\n }","{\n defaultValues: {\n name: '',\n },\n mode: 'onChange',\n resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n }","{errors, isDirty, isValid}","() => {\n dispatch(dialogActions.clear())\n }","(formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n foldersActions.createRequest({\n name: sanitizedFormData['name'],\n parentId: parentFolderId || null,\n }),\n )\n }","'name'","() => {\n if (creatingError) {\n setError('name', {message: creatingError.message})\n }\n }","[creatingError, setError]","() => (\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n <FormSubmitButton\n disabled={creating || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )","<Footer />","handleSubmit(onSubmit)","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","parentPath && (\n <Box marginBottom={3}>\n <Text muted size={1}>\n Creating inside {parentPath}\n </Text>\n </Box>\n )","register('name')","<FormFieldInputText\n {...register('name')}\n disabled={creating}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {parentPath && (\n <Box marginBottom={3}>\n <Text muted size={1}>\n Creating inside {parentPath}\n </Text>\n </Box>\n )}\n\n <FormFieldInputText\n {...register('name')}\n disabled={creating}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>","<Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Create Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {parentPath && (\n <Box marginBottom={3}>\n <Text muted size={1}>\n Creating inside {parentPath}\n </Text>\n </Box>\n )}\n\n <FormFieldInputText\n {...register('name')}\n disabled={creating}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>","{expandedIds, node, onSelect, selectedId}: FolderNodeProps","expandedIds.has(node.id)","id","() => onSelect(node.id)","hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))","children","<TreeItem\n expanded={expandedIds.has(node.id)}\n id={node.id}\n onClick={() => onSelect(node.id)}\n selected={selected}\n text={`${node.name} (${node.totalCount})`}\n weight={selected ? 'semibold' : 'medium'}\n >\n {hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))}\n </TreeItem>","`${node.name} (${node.totalCount})`","selected ? 'semibold' : 'medium'","{expandedIds, folderTree, onSelect, selectedId}: FolderTreeProps","folderTree.map((node) => (\n <FolderNode\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))","(node) => (\n <FolderNode\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n )","<Tree gap={1}>\n {folderTree.map((node) => (\n <FolderNode\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))}\n </Tree>","{children, dialog}: Props","(state) => state.folders.byId","getExpandedIdSet(folderId || null, byId)","folderId || null","useMemo(() => getExpandedIdSet(folderId || null, byId), [byId, folderId])","() => {\n dispatch(dialogActions.remove({id}))\n }","() => {\n if (!selectedId) {\n return\n }\n\n dispatch(\n assetsActions.folderSetRequest({\n assets,\n closeDialogId: id,\n folderId: selectedId,\n }),\n )\n }","<Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />","pluralize('asset', assets.length)","length","assets.length","<Button\n disabled={!selectedId}\n mode=\"default\"\n onClick={handleMove}\n text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n tone=\"primary\"\n />","!selectedId","`Move ${assets.length} ${pluralize('asset', assets.length)}`","<Box padding={3}>\n <Flex justify=\"flex-end\" gap={2}>\n <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n <Button\n disabled={!selectedId}\n mode=\"default\"\n onClick={handleMove}\n text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n tone=\"primary\"\n />\n </Flex>\n </Box>","<Text size={1}>\n Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n </Text>","{maxHeight: '22rem', overflowY: 'auto'}","<FolderTree\n expandedIds={expandedIds}\n folderTree={folderTree}\n onSelect={setSelectedId}\n selectedId={selectedId}\n />","folderTree.length === 0 && (\n <Box marginTop={3}>\n <Text muted size={1}>\n No folders yet.\n </Text>\n </Box>\n )","<Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n <FolderTree\n expandedIds={expandedIds}\n folderTree={folderTree}\n onSelect={setSelectedId}\n selectedId={selectedId}\n />\n\n {folderTree.length === 0 && (\n <Box marginTop={3}>\n <Text muted size={1}>\n No folders yet.\n </Text>\n </Box>\n )}\n </Box>","selectedFolder && (\n <Inline gap={2}>\n <Text muted size={1}>\n Destination:\n </Text>\n <Text size={1} weight=\"semibold\">\n {selectedFolder.name}\n </Text>\n </Inline>\n )","<Stack gap={4} padding={4}>\n <Text size={1}>\n Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n </Text>\n\n <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n <FolderTree\n expandedIds={expandedIds}\n folderTree={folderTree}\n onSelect={setSelectedId}\n selectedId={selectedId}\n />\n\n {folderTree.length === 0 && (\n <Box marginTop={3}>\n <Text muted size={1}>\n No folders yet.\n </Text>\n </Box>\n )}\n </Box>\n\n {selectedFolder && (\n <Inline gap={2}>\n <Text muted size={1}>\n Destination:\n </Text>\n <Text size={1} weight=\"semibold\">\n {selectedFolder.name}\n </Text>\n </Inline>\n )}\n </Stack>","<Dialog\n animate\n footer={\n <Box padding={3}>\n <Flex justify=\"flex-end\" gap={2}>\n <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n <Button\n disabled={!selectedId}\n mode=\"default\"\n onClick={handleMove}\n text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n tone=\"primary\"\n />\n </Flex>\n </Box>\n }\n header=\"Move to Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Stack gap={4} padding={4}>\n <Text size={1}>\n Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n </Text>\n\n <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n <FolderTree\n expandedIds={expandedIds}\n folderTree={folderTree}\n onSelect={setSelectedId}\n selectedId={selectedId}\n />\n\n {folderTree.length === 0 && (\n <Box marginTop={3}>\n <Text muted size={1}>\n No folders yet.\n </Text>\n </Box>\n )}\n </Box>\n\n {selectedFolder && (\n <Inline gap={2}>\n <Text muted size={1}>\n Destination:\n </Text>\n <Text size={1} weight=\"semibold\">\n {selectedFolder.name}\n </Text>\n </Inline>\n )}\n </Stack>\n\n {children}\n </Dialog>","{children, dialog}: Props","(state) => state.folders.renaming","(state) => state.folders.renameError","(state) => state.folders.byId[folderId]","state","(state) => selectFolderPathById(state, folderId)","folderPath.includes('/')\n ? folderPath.slice(0, folderPath.lastIndexOf('/'))\n : null","{\n name: currentName,\n }","zodFormResolver<FolderFormData>(folderFormSchema)","{\n defaultValues: {\n name: currentName,\n },\n mode: 'onChange',\n resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n }","{errors, isDirty, isValid}","() => {\n dispatch(dialogActions.remove({id}))\n }","(formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n foldersActions.renameRequest({\n name: sanitizedFormData['name'],\n folderId,\n }),\n )\n }","'name'","() => {\n if (renameError) {\n setError('name', {message: renameError.message})\n }\n }","[renameError, setError]","handleSubmit(onSubmit)","<Box padding={3}>\n <Flex justify=\"flex-end\">\n <FormSubmitButton\n disabled={renaming || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>","renaming || !isDirty || !isValid","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","<Box marginBottom={3}>\n <Text muted size={1}>\n {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n </Text>\n </Box>","parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'","register('name')","<FormFieldInputText\n {...register('name')}\n disabled={renaming}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n <Box marginBottom={3}>\n <Text muted size={1}>\n {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n </Text>\n </Box>\n\n <FormFieldInputText\n {...register('name')}\n disabled={renaming}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>","<Dialog\n animate\n footer={\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n <FormSubmitButton\n disabled={renaming || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n }\n header=\"Rename Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n <Box marginBottom={3}>\n <Text muted size={1}>\n {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n </Text>\n </Box>\n\n <FormFieldInputText\n {...register('name')}\n disabled={renaming}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>","{\n disabled = false,\n icon,\n onClick,\n tone = 'default',\n tooltip,\n}: FolderHeaderActionProps","disabled = false","tone = 'default'","<Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>","<Button\n aria-label={tooltip}\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />","<Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>\n }\n disabled={typeof window !== 'undefined' && 'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={tooltip}\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />\n </Tooltip>","{name, totalCount}: FolderItemTextProps","{\n boxSizing: 'border-box',\n display: 'block',\n maxWidth: '100%',\n minWidth: 0,\n overflow: 'hidden',\n paddingRight: '2rem',\n position: 'relative',\n width: '100%',\n }","{\n alignItems: 'center',\n display: 'flex',\n paddingLeft: '0.25rem',\n gap: '0.5rem',\n minWidth: 0,\n overflow: 'hidden',\n }","<span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n <FolderIcon />\n </span>","{\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }","<span\n style={{\n alignItems: 'center',\n display: 'flex',\n paddingLeft: '0.25rem',\n gap: '0.5rem',\n minWidth: 0,\n overflow: 'hidden',\n }}\n >\n <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n <FolderIcon />\n </span>\n <span\n style={{\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {name}\n </span>\n </span>","{\n fontSize: '0.75rem',\n opacity: 0.78,\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n }","<span\n style={{\n fontSize: '0.75rem',\n opacity: 0.78,\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n {totalCount}\n </span>","<span\n style={{\n boxSizing: 'border-box',\n display: 'block',\n maxWidth: '100%',\n minWidth: 0,\n overflow: 'hidden',\n paddingRight: '2rem',\n position: 'relative',\n width: '100%',\n }}\n >\n <span\n style={{\n alignItems: 'center',\n display: 'flex',\n paddingLeft: '0.25rem',\n gap: '0.5rem',\n minWidth: 0,\n overflow: 'hidden',\n }}\n >\n <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n <FolderIcon />\n </span>\n <span\n style={{\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {name}\n </span>\n </span>\n <span\n style={{\n fontSize: '0.75rem',\n opacity: 0.78,\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n {totalCount}\n </span>\n </span>","{currentFolderId, expandedIds, node, onSelect}: FolderNodeProps","expandedIds.has(node.id)","id","() => onSelect(node.id)","<FolderItemText name={node.name} totalCount={node.totalCount} />","name","totalCount","hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n />\n ))","children","<TreeItem\n expanded={expandedIds.has(node.id)}\n id={node.id}\n onClick={() => onSelect(node.id)}\n selected={selected}\n text={<FolderItemText name={node.name} totalCount={node.totalCount} />}\n weight={selected ? 'semibold' : 'medium'}\n >\n {hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n />\n ))}\n </TreeItem>","selected ? 'semibold' : 'medium'","(state) => state.folders.currentFolderId","(state) => state.folders.byId","(state) => state.folders.fetching","getExpandedIdSet(currentFolderId, byId)","useMemo(\n () => getExpandedIdSet(currentFolderId, byId),\n [byId, currentFolderId],\n )","Array.from(expandedIds).join('|') || 'root'","useMemo(() => Array.from(expandedIds).join('|') || 'root', [expandedIds])","(folderId: string) => {\n dispatch(foldersActions.currentFolderSet({folderId}))\n }","() => {\n if (!currentFolderId || !currentFolder) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteFolder({\n folderId: currentFolderId,\n folderName: currentFolder.name,\n }),\n )\n }","{\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }","<Label size={0}>Folders</Label>","fetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )","<Box flex={1}>\n <Inline gap={2}>\n <Label size={0}>Folders</Label>\n {fetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n </Box>","currentFolderId && (\n <FolderHeaderAction\n icon={<EditIcon />}\n onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n tone=\"primary\"\n tooltip=\"Rename folder\"\n />\n )","<AddIcon />","<FolderHeaderAction\n icon={<AddIcon />}\n onClick={() =>\n dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n }\n tone=\"primary\"\n tooltip=\"Create folder\"\n />","currentFolderId && canDeleteFolder && (\n <FolderHeaderAction\n icon={<TrashIcon />}\n onClick={handleFolderDelete}\n tone=\"critical\"\n tooltip=\"Delete folder\"\n />\n )","<Inline gap={1}>\n {currentFolderId && (\n <FolderHeaderAction\n icon={<EditIcon />}\n onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n tone=\"primary\"\n tooltip=\"Rename folder\"\n />\n )}\n\n <FolderHeaderAction\n icon={<AddIcon />}\n onClick={() =>\n dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n }\n tone=\"primary\"\n tooltip=\"Create folder\"\n />\n\n {currentFolderId && canDeleteFolder && (\n <FolderHeaderAction\n icon={<TrashIcon />}\n onClick={handleFolderDelete}\n tone=\"critical\"\n tooltip=\"Delete folder\"\n />\n )}\n </Inline>","<Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={3}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }}\n >\n <Box flex={1}>\n <Inline gap={2}>\n <Label size={0}>Folders</Label>\n {fetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n </Box>\n\n <Inline gap={1}>\n {currentFolderId && (\n <FolderHeaderAction\n icon={<EditIcon />}\n onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n tone=\"primary\"\n tooltip=\"Rename folder\"\n />\n )}\n\n <FolderHeaderAction\n icon={<AddIcon />}\n onClick={() =>\n dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n }\n tone=\"primary\"\n tooltip=\"Create folder\"\n />\n\n {currentFolderId && canDeleteFolder && (\n <FolderHeaderAction\n icon={<TrashIcon />}\n onClick={handleFolderDelete}\n tone=\"critical\"\n tooltip=\"Delete folder\"\n />\n )}\n </Inline>\n </Flex>","() => dispatch(foldersActions.currentFolderClear())","<TreeItem\n id=\"__all-assets\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n selected={currentFolderId === null}\n text=\"All assets\"\n weight={currentFolderId === null ? 'semibold' : 'medium'}\n />","currentFolderId === null","currentFolderId === null ? 'semibold' : 'medium'","folderTree.map((node) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={handleFolderSelect}\n />\n ))","(node) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={handleFolderSelect}\n />\n )","<Tree gap={1} key={treeKey}>\n <TreeItem\n id=\"__all-assets\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n selected={currentFolderId === null}\n text=\"All assets\"\n weight={currentFolderId === null ? 'semibold' : 'medium'}\n />\n\n {folderTree.map((node) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={handleFolderSelect}\n />\n ))}\n </Tree>","!hasFolders && !fetching && (\n <Box marginTop={3} paddingX={1}>\n <Text muted size={1}>\n <em>No folders</em>\n </Text>\n </Box>\n )","<Box padding={2}>\n <Box>\n <Tree gap={1} key={treeKey}>\n <TreeItem\n id=\"__all-assets\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n selected={currentFolderId === null}\n text=\"All assets\"\n weight={currentFolderId === null ? 'semibold' : 'medium'}\n />\n\n {folderTree.map((node) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={handleFolderSelect}\n />\n ))}\n </Tree>\n\n {!hasFolders && !fetching && (\n <Box marginTop={3} paddingX={1}>\n <Text muted size={1}>\n <em>No folders</em>\n </Text>\n </Box>\n )}\n </Box>\n </Box>","<Flex direction=\"column\" flex={1} height=\"fill\">\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={3}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }}\n >\n <Box flex={1}>\n <Inline gap={2}>\n <Label size={0}>Folders</Label>\n {fetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n </Box>\n\n <Inline gap={1}>\n {currentFolderId && (\n <FolderHeaderAction\n icon={<EditIcon />}\n onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n tone=\"primary\"\n tooltip=\"Rename folder\"\n />\n )}\n\n <FolderHeaderAction\n icon={<AddIcon />}\n onClick={() =>\n dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n }\n tone=\"primary\"\n tooltip=\"Create folder\"\n />\n\n {currentFolderId && canDeleteFolder && (\n <FolderHeaderAction\n icon={<TrashIcon />}\n onClick={handleFolderDelete}\n tone=\"critical\"\n tooltip=\"Delete folder\"\n />\n )}\n </Inline>\n </Flex>\n\n <Box padding={2}>\n <Box>\n <Tree gap={1} key={treeKey}>\n <TreeItem\n id=\"__all-assets\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n selected={currentFolderId === null}\n text=\"All assets\"\n weight={currentFolderId === null ? 'semibold' : 'medium'}\n />\n\n {folderTree.map((node) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={handleFolderSelect}\n />\n ))}\n </Tree>\n\n {!hasFolders && !fetching && (\n <Box marginTop={3} paddingX={1}>\n <Text muted size={1}>\n <em>No folders</em>\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n </Flex>","state","{id}","() => {\n dispatch(dialogActions.clear())\n }","useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])","<Box\n style={{\n height: '100%',\n minHeight: '420px',\n }}\n >\n <FolderView />\n </Box>","<Dialog animate header=\"Folders\" id={id} onClose={handleClose} width={1}>\n <Box\n style={{\n height: '100%',\n minHeight: '420px',\n }}\n >\n <FolderView />\n </Box>\n\n {children}\n </Dialog>","() => {\n dispatch(searchActions.facetsRemoveById({facetId: facet.id}))\n }","id","[2, 2, 1]","['flex-start', 'flex-start', 'center']","['column', 'column', 'row']","[3, 3, 0]","[1, 1, 0]","{\n whiteSpace: 'nowrap',\n }","<Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n <Label\n size={0}\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n {facet.title}\n </Label>\n </Box>","title","<Box marginLeft={1} paddingX={2}>\n <Text muted size={0}>\n <CloseIcon onClick={handleClose} />\n </Text>\n </Box>","<Flex align=\"center\">\n {children}\n\n {/* Close button */}\n <Box marginLeft={1} paddingX={2}>\n <Text muted size={0}>\n <CloseIcon onClick={handleClose} />\n </Text>\n </Box>\n </Flex>","<Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n {/* Title */}\n <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n <Label\n size={0}\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n {facet.title}\n </Label>\n </Box>\n\n <Flex align=\"center\">\n {children}\n\n {/* Close button */}\n <Box marginLeft={1} paddingX={2}>\n <Text muted size={0}>\n <CloseIcon onClick={handleClose} />\n </Text>\n </Box>\n </Flex>\n </Flex>","<Container padding={[2, 2, 1]} $scheme={scheme}>\n <Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n {/* Title */}\n <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n <Label\n size={0}\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n {facet.title}\n </Label>\n </Box>\n\n <Flex align=\"center\">\n {children}\n\n {/* Close button */}\n <Box marginLeft={1} paddingX={2}>\n <Text muted size={0}>\n <CloseIcon onClick={handleClose} />\n </Text>\n </Box>\n </Flex>\n </Flex>\n </Container>","(e: ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value\n const regex = /^[0-9\\b]+$/\n\n // Test for number and strip leading zeroes\n if (val === '' || regex.test(val)) {\n onValueChange(parseInt(val, 10) || '')\n }\n }","...remainingProps","<TextInput\n {...remainingProps}\n onChange={handleChange} //\n value={value ?? ''}\n />","value ?? ''","{facet}: Props","facet?.modifier\n ? modifiers?.find((modifier) => modifier.name === facet?.modifier)\n : modifiers?.[0]","modifier","modifiers?.find","(operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n }","id","(modifier: SearchFacetInputNumberModifier) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, modifier: modifier.name}))\n }","(value: number) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, value}))\n }","facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )","operatorTypes","operatorType","{maxWidth: '50px'}","<Box marginX={1} style={{maxWidth: '50px'}}>\n <TextInputNumber\n fontSize={1}\n onValueChange={handleValueChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>","facet?.value","modifiers && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={selectedModifier?.title}\n />\n }\n id=\"modifier\"\n menu={\n <Menu>\n {modifiers.map((modifier) => {\n const selected = modifier.name === facet.modifier\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={modifier.name}\n onClick={() => handleModifierClick(modifier)}\n padding={2}\n text={modifier.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )","title","selected","<SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n <Box marginX={1} style={{maxWidth: '50px'}}>\n <TextInputNumber\n fontSize={1}\n onValueChange={handleValueChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>\n\n {/* Modifiers */}\n {modifiers && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={selectedModifier?.title}\n />\n }\n id=\"modifier\"\n menu={\n <Menu>\n {modifiers.map((modifier) => {\n const selected = modifier.name === facet.modifier\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={modifier.name}\n onClick={() => handleModifierClick(modifier)}\n padding={2}\n text={modifier.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n </SearchFacet>","{facet}: Props","options?.find((v) => v.name === facet?.value)","value","options?.find","(option: SearchFacetInputSelectListItemProps) => {\n dispatch(searchActions.facetsUpdate({name: facet.name, value: option.name}))\n }","facet.name","(operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdate({name: facet.name, operatorType}))\n }","facet?.operatorTypes && (\n <MenuButton\n button={\n <Box marginRight={1}>\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n </Box>\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )","operatorType","facet?.operatorTypes","<Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />","selectedItem?.title","options?.map((item) => {\n const selected = item.name === selectedItem?.name\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={item.name}\n onClick={() => handleListItemClick(item)}\n padding={2}\n text={item.title}\n />\n )\n })","options?.map","name","selected","<Menu>\n {options?.map((item) => {\n const selected = item.name === selectedItem?.name\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={item.name}\n onClick={() => handleListItemClick(item)}\n padding={2}\n text={item.title}\n />\n )\n })}\n </Menu>","<MenuButton\n button={\n <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n }\n id=\"list\"\n menu={\n <Menu>\n {options?.map((item) => {\n const selected = item.name === selectedItem?.name\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={item.name}\n onClick={() => handleListItemClick(item)}\n padding={2}\n text={item.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />","<SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Box marginRight={1}>\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n </Box>\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* List */}\n <MenuButton\n button={\n <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n }\n id=\"list\"\n menu={\n <Menu>\n {options?.map((item) => {\n const selected = item.name === selectedItem?.name\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={item.name}\n onClick={() => handleListItemClick(item)}\n padding={2}\n text={item.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n </SearchFacet>","{facet}: Props","(operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n }","id","(e: ChangeEvent<HTMLInputElement>) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, value: e.target.value}))\n }","facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )","operatorTypes","operatorType","!operators[selectedOperatorType].hideInput && (\n <Box marginLeft={1} style={{maxWidth: '125px'}}>\n <TextInput\n fontSize={1}\n onChange={handleChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>\n )","value","<SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n {!operators[selectedOperatorType].hideInput && (\n <Box marginLeft={1} style={{maxWidth: '125px'}}>\n <TextInput\n fontSize={1}\n onChange={handleChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>\n )}\n </SearchFacet>","{\n transform: 'scale(0.85)',\n }","<Box\n paddingRight={1}\n style={{\n transform: 'scale(0.85)',\n }}\n >\n <Text muted size={0}>\n <CloseIcon />\n </Text>\n </Box>","<components.ClearIndicator {...props}>\n <Box\n paddingRight={1}\n style={{\n transform: 'scale(0.85)',\n }}\n >\n <Text muted size={0}>\n <CloseIcon />\n </Text>\n </Box>\n </components.ClearIndicator>","components.ClearIndicator","<Card radius={1} shadow={2}>\n {props.children}\n </Card>","children","<components.Menu {...props}>\n <Card radius={1} shadow={2}>\n {props.children}\n </Card>\n </components.Menu>","components.Menu","(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }","{height}","<Virtuoso\n className=\"media__custom-scrollbar\"\n itemContent={(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }}\n style={{height}}\n totalCount={children.length}\n />","length","<components.MenuList {...props}>{children}</components.MenuList>","components.MenuList","<components.NoOptionsMessage {...props}>{props.children}</components.NoOptionsMessage>","components.NoOptionsMessage","{color: 'inherit'}","<Box paddingY={1}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n {props.children}\n </Text>\n </Box>","<Box padding={1}>\n <components.Option {...props}>\n <Box paddingY={1}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n {props.children}\n </Text>\n </Box>\n </components.Option>\n </Box>","components.Option","<Text size={1} textOverflow=\"ellipsis\">\n {props.children}\n </Text>","<components.SingleValue {...props}>\n <Text size={1} textOverflow=\"ellipsis\">\n {props.children}\n </Text>\n </components.SingleValue>","components.SingleValue","{facet}: Props","(state) => selectTags(state)","excludeTagSlugs.length > 0\n ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n : tagsAll","excludeTagSlugs.length","(state) => state.tags.fetching","getTagSelectOptions(tags)","(option: TagSelectOption) => {\n dispatch(\n searchActions.facetsUpdateById({\n id: facet.id,\n value: option,\n }),\n )\n }","id","(operatorType: SearchFacetOperatorType) => {\n dispatch(\n searchActions.facetsUpdateById({\n id: facet.id,\n operatorType,\n }),\n )\n }","facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n gap={4}\n style={{minWidth: '150px'}}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )","operatorTypes","operatorType","!operators[selectedOperatorType].hideInput && (\n <Box marginX={1} style={{width: '160px'}}>\n <Select\n components={reactSelectComponents}\n instanceId=\"facet-searchable\"\n isClearable\n isDisabled={tagsFetching}\n isSearchable\n name=\"tags\"\n noOptionsMessage={() => 'No tags'}\n onChange={(value: any) => handleChange(value as TagSelectOption)}\n options={allTagOptions}\n placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n styles={reactSelectStyles(scheme)}\n value={facet?.value}\n />\n </Box>\n )","value","() => 'No tags'","<SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n gap={4}\n style={{minWidth: '150px'}}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n {!operators[selectedOperatorType].hideInput && (\n <Box marginX={1} style={{width: '160px'}}>\n <Select\n components={reactSelectComponents}\n instanceId=\"facet-searchable\"\n isClearable\n isDisabled={tagsFetching}\n isSearchable\n name=\"tags\"\n noOptionsMessage={() => 'No tags'}\n onChange={(value: any) => handleChange(value as TagSelectOption)}\n options={allTagOptions}\n placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n styles={reactSelectStyles(scheme)}\n value={facet?.value}\n />\n </Box>\n )}\n </SearchFacet>","state","layout = 'inline'","(state) => state.search.facets","searchFacets.map((facet) => {\n const key = facet.id\n if (facet.type === 'number') {\n return <SearchFacetNumber facet={facet} key={key} />\n }\n\n if (facet.type === 'searchable') {\n return <SearchFacetTags facet={facet} key={key} />\n }\n\n if (facet.type === 'select') {\n return <SearchFacetSelect facet={facet} key={key} />\n }\n\n if (facet.type === 'string') {\n return <SearchFacetString facet={facet} key={key} />\n }\n\n return null\n })","(facet) => {\n const key = facet.id\n if (facet.type === 'number') {\n return <SearchFacetNumber facet={facet} key={key} />\n }\n\n if (facet.type === 'searchable') {\n return <SearchFacetTags facet={facet} key={key} />\n }\n\n if (facet.type === 'select') {\n return <SearchFacetSelect facet={facet} key={key} />\n }\n\n if (facet.type === 'string') {\n return <SearchFacetString facet={facet} key={key} />\n }\n\n return null\n }","<Box marginBottom={2}>\n <Inline gap={2}>{Items}</Inline>\n </Box>","<StackContainer align=\"flex-start\" direction=\"column\">\n {Items}\n </StackContainer>","(state) => state.assets.assetTypes","(state) => state.search.facets","(state) => state.selected.document","Menu","MenuButton","Flex","renderMenuFacets(filteredFacets)","<Button\n disabled={!hasSearchFacets}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n gap={2}\n text=\"Add filter\"\n tone=\"primary\"\n />","\"facets\"","enabled","(facet) => {\n // Remove credit line filter if it's not enabled\n if (!creditLine?.enabled && facet?.type === 'string' && facet?.name === 'creditLine') {\n return false\n }\n\n if (facet.type === 'group' || facet.type === 'divider') {\n return true\n }\n\n if (isTool) {\n return !facet?.selectOnly\n }\n\n const matchingAssetTypes = facet.assetTypes.filter((assetType) =>\n assetTypes.includes(assetType),\n )\n return matchingAssetTypes.length > 0\n }","(facet, index, facets) => {\n const previousFacet = facets[index - 1]\n // Ignore leading + trailing dividers\n if (facet.type === 'divider' && (index === 0 || index === facets.length - 1)) {\n return false\n }\n // Ignore adjacent dividers\n if (facet.type === 'divider' && previousFacet?.type === 'divider') {\n return false\n }\n return true\n }","level: number = 0","facets","facet","index","!hasSearchFacets","<Menu>{renderMenuFacets(filteredFacets)}</Menu>","{\n ...popoverProps,\n placement: 'right-start',\n }","<MenuButton\n button={\n <Button\n disabled={!hasSearchFacets}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n gap={2}\n text=\"Add filter\"\n tone=\"primary\"\n />\n }\n id=\"facets\"\n menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n popover={{\n ...popoverProps,\n placement: 'right-start',\n }}\n />","searchFacets.length > 0 && (\n <Button\n fontSize={1}\n mode=\"bleed\"\n onClick={() => dispatch(searchActions.facetsClear())}\n text=\"Clear\"\n />\n )","length","<Flex>\n {/* Add filter button */}\n <MenuButton\n button={\n <Button\n disabled={!hasSearchFacets}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n gap={2}\n text=\"Add filter\"\n tone=\"primary\"\n />\n }\n id=\"facets\"\n menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n popover={{\n ...popoverProps,\n placement: 'right-start',\n }}\n />\n\n {/* Clear facets button */}\n {searchFacets.length > 0 && (\n <Button\n fontSize={1}\n mode=\"bleed\"\n onClick={() => dispatch(searchActions.facetsClear())}\n text=\"Clear\"\n />\n )}\n </Flex>","state","{id}","() => {\n dispatch(dialogActions.clear())\n }","useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])","<Box padding={3}>\n <SearchFacets layout=\"stack\" />\n <SearchFacetsControl />\n </Box>","<Dialog animate header=\"Filters\" id={id} onClose={handleClose} width={1}>\n <Box padding={3}>\n <SearchFacets layout=\"stack\" />\n <SearchFacetsControl />\n </Box>\n\n {children}\n </Dialog>","{id}","(state) => state.tags.creating","(state) => state.tags.creatingError","{\n name: '',\n }","{\n defaultValues: {\n name: '',\n },\n mode: 'onChange',\n resolver: zodFormResolver<TagFormData>(tagFormSchema),\n }","{errors, isDirty, isValid}","() => {\n dispatch(dialogActions.clear())\n }","(formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n\n dispatch(tagsActions.createRequest({name: sanitizedFormData['name']}))\n }","'name'","() => {\n if (creatingError) {\n setError('name', {\n message: creatingError?.message,\n })\n }\n }","[creatingError, setError]","() => (\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )","<Footer />","handleSubmit(onSubmit)","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","register('name')","<FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>","<Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Create Tag\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n {/* Form fields */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>","state","{id, tagId}","(state) => selectTagById(state, String(tagId))","useCallback(\n (tag?: Tag) => ({\n name: tag?.name?.current || '',\n }),\n [],\n )","generateDefaultValues(tagItem?.tag)","tagItem?.tag","zodFormResolver<TagFormData>(tagFormSchema)","{\n defaultValues: generateDefaultValues(tagItem?.tag),\n mode: 'onChange',\n resolver: zodFormResolver<TagFormData>(tagFormSchema),\n }","{errors, isDirty, isValid}","() => {\n dispatch(dialogActions.remove({id}))\n }","(formData) => {\n if (!tagItem?.tag) {\n return\n }\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n tagsActions.updateRequest({\n closeDialogId: tagItem?.tag?._id,\n formData: {\n name: {\n _type: 'slug',\n current: sanitizedFormData['name'],\n },\n },\n tag: tagItem?.tag,\n }),\n )\n }","tag","'name'","() => {\n if (!tagItem?.tag) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteTag({\n closeDialogId: tagItem?.tag?._id,\n tag: tagItem?.tag,\n }),\n )\n }","(update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate snapshot\n setTagSnapshot(result as Tag)\n // Reset react-hook-form\n reset(generateDefaultValues(result as Tag))\n }\n }","useCallback(\n (update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate snapshot\n setTagSnapshot(result as Tag)\n // Reset react-hook-form\n reset(generateDefaultValues(result as Tag))\n }\n },\n [reset, generateDefaultValues],\n )","() => {\n if (tagItem?.error) {\n setError('name', {\n message: tagItem.error?.message,\n })\n }\n }","tagItem?.error","[setError, tagItem?.error]","() => {\n if (!tagItem?.tag) {\n return undefined\n }\n\n // Remember that Sanity listeners ignore joins, order clauses and projections\n const subscriptionAsset = client\n .listen(groq`*[_id == $id]`, {id: tagItem?.tag._id})\n .subscribe(handleTagUpdate)\n\n return () => {\n subscriptionAsset?.unsubscribe()\n }\n }","[client, handleTagUpdate, tagItem?.tag]","() => (\n <Box padding={3}>\n <Flex justify=\"space-between\">\n {/* Delete button */}\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid}\n isValid={isValid}\n lastUpdated={tagItem?.tag?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )","_updatedAt","<Footer />","handleSubmit(onSubmit)","!tagItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n </Card>\n )","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","register('name')","<FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!tagItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>","<Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Edit Tag\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n {/* Form fields */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!tagItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>","<Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>","<Button\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />","<Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>\n }\n disabled={'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Button\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />\n </Tooltip>","(state) => selectIsSearchFacetTag(state, tag?.tag?._id)","_id","() => {\n dispatch(searchActions.facetsRemoveByTag({tagId: tag.tag._id}))\n }","() => {\n dispatch(dialogActions.showConfirmAssetsTagAdd({assetsPicked, tag: tag.tag}))\n }","() => {\n dispatch(dialogActions.showConfirmAssetsTagRemove({assetsPicked, tag: tag.tag}))\n }","() => {\n dispatch(dialogActions.showConfirmDeleteTag({tag: tag.tag}))\n }","() => {\n dispatch(DIALOG_ACTIONS.showTagEdit({tagId: tag?.tag?._id}))\n }","() => {\n const searchFacet = {\n ...inputs.tag,\n value: {\n label: tag?.tag?.name?.current,\n value: tag?.tag?._id,\n },\n } as SearchFacetInputSearchableProps\n\n if (isSearchFacetTag) {\n dispatch(\n searchActions.facetsUpdate({\n name: 'tag',\n operatorType: 'references',\n value: searchFacet.value,\n }),\n )\n } else {\n dispatch(searchActions.facetsAdd({facet: searchFacet}))\n }\n }","current","{\n opacity: tag?.updating ? 0.5 : 1.0,\n userSelect: 'none',\n }","tag?.updating ? 0.5 : 1.0","<Box flex={1}>\n <Text\n muted\n size={1}\n style={{\n opacity: tag?.updating ? 0.5 : 1.0,\n userSelect: 'none',\n }}\n textOverflow=\"ellipsis\"\n >\n {tag?.tag?.name?.current}\n </Text>\n </Box>","tag?.tag?.name?.current","{flexShrink: 0}","actions?.includes('search') && (\n <TagButton\n disabled={tag?.updating}\n icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n onClick={\n isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n }\n tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n />\n )","updating","actions?.includes","actions?.includes('edit') && (\n <TagButton\n disabled={tag?.updating}\n icon={<EditIcon />}\n onClick={handleShowTagEditDialog}\n tone=\"primary\"\n tooltip=\"Edit tag\"\n />\n )","actions?.includes('applyAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowUpIcon />}\n onClick={handleShowAddTagToAssetsDialog}\n tone=\"primary\"\n tooltip=\"Add tag to selected assets\"\n />\n )","actions?.includes('removeAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowDownIcon />}\n onClick={handleShowRemoveTagFromAssetsDialog}\n tone=\"critical\"\n tooltip=\"Remove tag from selected assets\"\n />\n )","actions?.includes('delete') && (\n <TagButton\n disabled={tag?.updating}\n icon={<TrashIcon />}\n onClick={handleShowTagDeleteDialog}\n tone=\"critical\"\n tooltip=\"Delete tag\"\n />\n )","<ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n {/* Search facet toggle */}\n {actions?.includes('search') && (\n <TagButton\n disabled={tag?.updating}\n icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n onClick={\n isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n }\n tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n />\n )}\n {/* Edit icon */}\n {actions?.includes('edit') && (\n <TagButton\n disabled={tag?.updating}\n icon={<EditIcon />}\n onClick={handleShowTagEditDialog}\n tone=\"primary\"\n tooltip=\"Edit tag\"\n />\n )}\n {/* Apply to all */}\n {actions?.includes('applyAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowUpIcon />}\n onClick={handleShowAddTagToAssetsDialog}\n tone=\"primary\"\n tooltip=\"Add tag to selected assets\"\n />\n )}\n {/* Remove from all */}\n {actions?.includes('removeAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowDownIcon />}\n onClick={handleShowRemoveTagFromAssetsDialog}\n tone=\"critical\"\n tooltip=\"Remove tag from selected assets\"\n />\n )}\n\n {/* Delete icon */}\n {actions?.includes('delete') && (\n <TagButton\n disabled={tag?.updating}\n icon={<TrashIcon />}\n onClick={handleShowTagDeleteDialog}\n tone=\"critical\"\n tooltip=\"Delete tag\"\n />\n )}\n </ButtonContainer>","<TagContainer align=\"center\" flex={1} justify=\"space-between\" paddingLeft={3}>\n <Box flex={1}>\n <Text\n muted\n size={1}\n style={{\n opacity: tag?.updating ? 0.5 : 1.0,\n userSelect: 'none',\n }}\n textOverflow=\"ellipsis\"\n >\n {tag?.tag?.name?.current}\n </Text>\n </Box>\n\n <ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n {/* Search facet toggle */}\n {actions?.includes('search') && (\n <TagButton\n disabled={tag?.updating}\n icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n onClick={\n isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n }\n tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n />\n )}\n {/* Edit icon */}\n {actions?.includes('edit') && (\n <TagButton\n disabled={tag?.updating}\n icon={<EditIcon />}\n onClick={handleShowTagEditDialog}\n tone=\"primary\"\n tooltip=\"Edit tag\"\n />\n )}\n {/* Apply to all */}\n {actions?.includes('applyAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowUpIcon />}\n onClick={handleShowAddTagToAssetsDialog}\n tone=\"primary\"\n tooltip=\"Add tag to selected assets\"\n />\n )}\n {/* Remove from all */}\n {actions?.includes('removeAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowDownIcon />}\n onClick={handleShowRemoveTagFromAssetsDialog}\n tone=\"critical\"\n tooltip=\"Remove tag from selected assets\"\n />\n )}\n\n {/* Delete icon */}\n {actions?.includes('delete') && (\n <TagButton\n disabled={tag?.updating}\n icon={<TrashIcon />}\n onClick={handleShowTagDeleteDialog}\n tone=\"critical\"\n tooltip=\"Delete tag\"\n />\n )}\n </ButtonContainer>\n </TagContainer>","{\n isScrolling,\n item,\n }: {\n isScrolling?: boolean\n item:\n | string\n | (TagItem & {\n actions: TagActions[]\n })\n }","{height: `${PANEL_HEIGHT}px`}","<Label size={0}>{item}</Label>","<Flex\n align=\"center\"\n justify=\"space-between\"\n key={item}\n paddingX={3}\n style={{height: `${PANEL_HEIGHT}px`}}\n >\n <Label size={0}>{item}</Label>\n </Flex>","<Tag actions={isScrolling ? undefined : item.actions} key={item.tag?._id} tag={item} />","isScrolling ? undefined : item.actions","item.tag?._id","{tags}: {tags: TagItem[]}","assetsPicked?.reduce","(acc: string[], val) => {\n const assetTagIds = val?.asset?.opt?.media?.tags?.map((tag) => tag._ref) || []\n acc = acc.concat(assetTagIds)\n return acc\n }","(acc: {appliedToAll: string[]; appliedToSome: string[]}, tagId) => {\n const tagIsInEveryAsset = assetsPicked.every((assetItem) => {\n const tagIndex =\n assetItem.asset.opt?.media?.tags?.findIndex((tag) => tag._ref === tagId) ?? -1\n return tagIndex >= 0\n })\n\n if (tagIsInEveryAsset) {\n acc.appliedToAll.push(tagId)\n } else {\n acc.appliedToSome.push(tagId)\n }\n\n return acc\n }","tag","acc","(tagItem) => ({\n ...tagItem,\n actions: ['delete', 'edit', 'removeAll', 'search'] as TagActions[],\n })","(tagItem) => ({\n ...tagItem,\n actions: ['applyAll', 'delete', 'edit', 'removeAll', 'search'] as TagActions[],\n })","(tagItem) => ({\n ...tagItem,\n actions: ['applyAll', 'delete', 'edit', 'search'] as TagActions[],\n })","(tagItem) => ({\n ...tagItem,\n actions: ['delete', 'edit', 'search'] as TagActions[],\n })","(index) => {\n const item = items[index]\n if (typeof item === 'string') {\n return item\n }\n return item!.tag._id\n }","(index) => {\n return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n }","index","{flex: 1, overflowX: 'hidden'}","<Virtuoso\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n if (typeof item === 'string') {\n return item\n }\n return item!.tag._id\n }}\n isScrolling={setIsScrolling}\n itemContent={(index) => {\n return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n }}\n style={{flex: 1, overflowX: 'hidden'}}\n totalCount={items.length}\n />","length","(tag) => tag._ref","tagItem","{allowCreate, light, title}: Props","(state) => state.tags.creating","(state) => state.tags.fetching","() => {\n dispatch(DIALOG_ACTIONS.showTagCreate())\n }","light ? getSchemeColor(scheme, 'bg') : 'inherit'","{\n background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }","<Label size={0}>{title}</Label>","tagsFetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )","<Inline gap={2}>\n <Label size={0}>{title}</Label>\n {tagsFetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>","allowCreate && (\n <Box marginRight={1}>\n <Button\n disabled={tagsCreating}\n fontSize={1} //\n icon={ComposeIcon}\n mode=\"bleed\"\n onClick={handleTagCreate}\n style={{\n background: 'transparent',\n boxShadow: 'none',\n }}\n />\n </Box>\n )","<>\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingLeft={3}\n style={{\n background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }}\n >\n <Inline gap={2}>\n <Label size={0}>{title}</Label>\n {tagsFetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n {/* Create new tag button */}\n {allowCreate && (\n <Box marginRight={1}>\n <Button\n disabled={tagsCreating}\n fontSize={1} //\n icon={ComposeIcon}\n mode=\"bleed\"\n onClick={handleTagCreate}\n style={{\n background: 'transparent',\n boxShadow: 'none',\n }}\n />\n </Box>\n )}\n </Flex>\n </>","state","excludeTagSlugs.length > 0\n ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n : tagsAll","excludeTagSlugs.length","(state) => state.tags.fetching","(state) => state.tags.fetchCount","<TagViewHeader\n allowCreate\n light={hasPicked}\n title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n />","hasPicked ? 'Tags (in selection)' : 'Tags'","fetchComplete && !hasTags && (\n <Box padding={3}>\n <Text muted size={1}>\n <em>No tags</em>\n </Text>\n </Box>\n )","hasTags && <TagsVirtualized tags={tags} />","<Flex direction=\"column\" flex={1} height=\"fill\">\n <TagViewHeader\n allowCreate\n light={hasPicked}\n title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n />\n\n {fetchComplete && !hasTags && (\n <Box padding={3}>\n <Text muted size={1}>\n <em>No tags</em>\n </Text>\n </Box>\n )}\n\n {hasTags && <TagsVirtualized tags={tags} />}\n </Flex>","state","{id}","() => {\n dispatch(dialogActions.clear())\n }","useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])","<Box\n style={{\n height: '100%',\n minHeight: '420px', // explicit height required as <TagView> is virtualized\n }}\n >\n <TagView />\n </Box>","<Dialog animate header=\"All Tags\" id={id} onClose={handleClose} width={1}>\n <Box\n style={{\n height: '100%',\n minHeight: '420px', // explicit height required as <TagView> is virtualized\n }}\n >\n <TagView />\n </Box>\n\n {children}\n </Dialog>","(state) => state.dialog.items","renderDialogs(currentDialogs, 0)","(state) => state.notifications.items","() => {\n if (items.length > 0) {\n const lastItem = items[items.length - 1]!\n toast.push({\n closable: true,\n status: lastItem.status,\n title: lastItem.title,\n })\n }\n }","[items, toast]","items.length","{children, ...props}: Props","() => createReduxStore(props)","<Provider store={store}>{children}</Provider>","{assetId, onClose}: {assetId: string; onClose: () => void}","(state) => state.dialog.items.length","() => {\n // Only fetch the single asset being edited, then open its edit dialog.\n const queryFilter = `${constructFilter({\n assetTypes: ['file', 'image'],\n searchFacets: [],\n })} && _id == $assetId`\n\n dispatch(assetsActions.fetchRequest({params: {assetId}, queryFilter}))\n\n // Tags and folders must be loaded into the store so the edit dialog can\n // resolve the asset's existing tag references and folder path (mirroring\n // `useBrowserInit`). Without this, `selectTagSelectOptions` resolves no tags\n // and saving would patch `opt.media.tags` to null, wiping existing tags.\n dispatch(tagsActions.fetchRequest())\n dispatch(foldersActions.fetchRequest())\n\n dispatch(dialogActions.showAssetEdit({assetId}))\n }","[assetId, dispatch]","() => {\n if (openDialogCount > 0) {\n hasOpenedRef.current = true\n } else if (hasOpenedRef.current) {\n onClose()\n }\n }","[openDialogCount, onClose]","<>\n <Dialogs />\n <Notifications />\n </>","[]","() => {\n if (!assetId) {\n onClose()\n }\n }","[assetId, onClose]","<GlobalStyle />","<EditAssetDialog assetId={assetId} onClose={onClose} />","<PortalProvider element={portalElement}>\n <EditAssetDialog assetId={assetId} onClose={onClose} />\n </PortalProvider>","<AssetBrowserDispatchProvider onSelect={props.onSelect}>\n <GlobalStyle />\n <PortalProvider element={portalElement}>\n <EditAssetDialog assetId={assetId} onClose={onClose} />\n </PortalProvider>\n </AssetBrowserDispatchProvider>","onSelect","<ReduxProvider\n assetType={props.assetType}\n client={client}\n document={currentDocument ?? undefined}\n selectedAssets={selectedAssets}\n >\n <AssetBrowserDispatchProvider onSelect={props.onSelect}>\n <GlobalStyle />\n <PortalProvider element={portalElement}>\n <EditAssetDialog assetId={assetId} onClose={onClose} />\n </PortalProvider>\n </AssetBrowserDispatchProvider>\n </ReduxProvider>","assetType","currentDocument ?? undefined","(state) => state.assets.view","{whiteSpace: 'nowrap'}","() => dispatch(assetsActions.viewSet({view: 'grid'}))","{\n borderBottomRightRadius: 0,\n borderTopRightRadius: 0,\n }","<Button\n fontSize={1}\n icon={ThLargeIcon}\n mode={view === 'grid' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n style={{\n borderBottomRightRadius: 0,\n borderTopRightRadius: 0,\n }}\n />","view === 'grid' ? 'default' : 'ghost'","() => dispatch(assetsActions.viewSet({view: 'table'}))","{\n borderBottomLeftRadius: 0,\n borderTopLeftRadius: 0,\n }","<Button\n fontSize={1}\n icon={ThListIcon}\n mode={view === 'table' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n style={{\n borderBottomLeftRadius: 0,\n borderTopLeftRadius: 0,\n }}\n />","view === 'table' ? 'default' : 'ghost'","<Inline gap={0} style={{whiteSpace: 'nowrap'}}>\n <Button\n fontSize={1}\n icon={ThLargeIcon}\n mode={view === 'grid' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n style={{\n borderBottomRightRadius: 0,\n borderTopRightRadius: 0,\n }}\n />\n <Button\n fontSize={1}\n icon={ThListIcon}\n mode={view === 'table' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n style={{\n borderBottomLeftRadius: 0,\n borderTopLeftRadius: 0,\n }}\n />\n </Inline>","(state) => state.assets.order","getOrderTitle(order.field, order.direction)","direction","field","<Button\n fontSize={1}\n icon={SortIcon}\n mode=\"bleed\"\n padding={3}\n text={getOrderTitle(order.field, order.direction)}\n />","ORDER_OPTIONS?.map((item, index) => {\n if (item) {\n const selected = order.field === item.field && order.direction === item.direction\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n iconRight={selected}\n key={index}\n onClick={() =>\n dispatch(\n assetsActions.orderSet({\n order: {direction: item.direction, field: item.field},\n }),\n )\n }\n padding={2}\n selected={selected}\n gap={4}\n style={{minWidth: '200px'}}\n text={getOrderTitle(item.field, item.direction)}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })","<Menu>\n {ORDER_OPTIONS?.map((item, index) => {\n if (item) {\n const selected = order.field === item.field && order.direction === item.direction\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n iconRight={selected}\n key={index}\n onClick={() =>\n dispatch(\n assetsActions.orderSet({\n order: {direction: item.direction, field: item.field},\n }),\n )\n }\n padding={2}\n selected={selected}\n gap={4}\n style={{minWidth: '200px'}}\n text={getOrderTitle(item.field, item.direction)}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>","<MenuButton\n button={\n <Button\n fontSize={1}\n icon={SortIcon}\n mode=\"bleed\"\n padding={3}\n text={getOrderTitle(order.field, order.direction)}\n />\n }\n id=\"order\"\n menu={\n <Menu>\n {ORDER_OPTIONS?.map((item, index) => {\n if (item) {\n const selected = order.field === item.field && order.direction === item.direction\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n iconRight={selected}\n key={index}\n onClick={() =>\n dispatch(\n assetsActions.orderSet({\n order: {direction: item.direction, field: item.field},\n }),\n )\n }\n padding={2}\n selected={selected}\n gap={4}\n style={{minWidth: '200px'}}\n text={getOrderTitle(item.field, item.direction)}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />","{\n animationDuration: 300,\n isAnimating: loading,\n }","{\n opacity: isFinished ? 0 : 1,\n transition: `opacity ${animationDuration}ms linear`,\n }","isFinished ? 0 : 1","`opacity ${animationDuration}ms linear`","<Box\n style={{\n height: '1px',\n background: 'rgba(255, 255, 255, 0.5)',\n position: 'absolute',\n left: 0,\n top: 0,\n transition: `width ${animationDuration}ms linear`,\n width: `${progress * 100}%`,\n }}\n />","`width ${animationDuration}ms linear`","`${progress * 100}%`","<Box\n style={{\n opacity: isFinished ? 0 : 1,\n transition: `opacity ${animationDuration}ms linear`,\n }}\n >\n <Box\n style={{\n height: '1px',\n background: 'rgba(255, 255, 255, 0.5)',\n position: 'absolute',\n left: 0,\n top: 0,\n transition: `width ${animationDuration}ms linear`,\n width: `${progress * 100}%`,\n }}\n />\n </Box>","<svg\n data-sanity-icon=\"media__tag\" // For icon usage with @sanity/ui <Button />\n fill=\"currentColor\"\n height=\"1em\"\n stroke=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 512 512\"\n width=\"1em\"\n >\n <path\n d=\"M435.25 48h-122.9a14.46 14.46 0 00-10.2 4.2L56.45 297.9a28.85 28.85 0 000 40.7l117 117a28.85 28.85 0 0040.7 0L459.75 210a14.46 14.46 0 004.2-10.2v-123a28.66 28.66 0 00-28.7-28.8z\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"32\"\n />\n <path d=\"M384 160a32 32 0 1132-32 32 32 0 01-32 32z\" />\n </svg>","(state) => state.search.query","(e: ChangeEvent<HTMLInputElement>) => {\n dispatch(searchActions.querySet({searchQuery: e.currentTarget.value}))\n }","() => {\n dispatch(searchActions.querySet({searchQuery: ''}))\n }","{position: 'relative'}","<TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={handleChange}\n placeholder=\"Search\"\n radius={2}\n value={searchQuery}\n />","searchQuery.length > 0 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n height: '100%',\n opacity: 0.75,\n position: 'absolute',\n right: 0,\n top: 0,\n width: '2em',\n zIndex: 1, // force stacking context\n }}\n >\n <CloseIcon />\n </Flex>\n )","length","<Box style={{position: 'relative'}}>\n <TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={handleChange}\n placeholder=\"Search\"\n radius={2}\n value={searchQuery}\n />\n\n {/* Clear form button */}\n {searchQuery.length > 0 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n height: '100%',\n opacity: 0.75,\n position: 'absolute',\n right: 0,\n top: 0,\n width: '2em',\n zIndex: 1, // force stacking context\n }}\n >\n <CloseIcon />\n </Flex>\n )}\n </Box>","(state) => state.assets.fetching","(state) => state.folders.panelVisible","(state) => state.assets.pageIndex","(state) => state.search.facets","(state) => state.tags.panelVisible","() => {\n dispatch(dialogActions.showSearchFacets())\n }","() => {\n dispatch(dialogActions.showFolders())\n }","() => {\n dispatch(dialogActions.showTags())\n }","() => {\n dispatch(foldersActions.panelVisibleSet({panelVisible: !foldersPanelVisible}))\n }","() => {\n dispatch(tagsActions.panelVisibleSet({panelVisible: !tagsPanelVisible}))\n }","{\n borderBottom: '1px solid var(--card-border-color)',\n zIndex: 2,\n }","['column', 'column', 'column', 'column', 'row']","{\n alignItems: 'flex-start',\n flex: 1,\n height: '100%',\n justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n position: 'relative',\n width: '100%',\n }","mediaIndex < 2 ? 'space-between' : 'flex-start'","<Box marginX={2} style={{minWidth: '200px'}}>\n {/* Search */}\n <TextInputSearch />\n </Box>","['none', 'none', 'block']","<SearchFacets />","<Box display={['none', 'none', 'block']}>\n <SearchFacets />\n\n {/* Search Facets Control (add / clear) */}\n <Inline gap={2}>\n <SearchFacetsControl />\n </Inline>\n </Box>","['block', 'block', 'none']","{whiteSpace: 'nowrap'}","<Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowSearchFacetDialog}\n text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n tone=\"primary\"\n />","`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`","<Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowTagsDialog}\n text={`Tags`}\n tone=\"primary\"\n />","<Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowFoldersDialog}\n text=\"Folders\"\n tone=\"primary\"\n />","<Box display={['block', 'block', 'none']} marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n {/* Filters button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowSearchFacetDialog}\n text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n tone=\"primary\"\n />\n\n {/* Tags button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowTagsDialog}\n text={`Tags`}\n tone=\"primary\"\n />\n\n {/* Folders button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowFoldersDialog}\n text=\"Folders\"\n tone=\"primary\"\n />\n </Inline>\n </Box>","<Box marginBottom={2}>\n <Flex\n align=\"flex-start\"\n direction={['column', 'column', 'column', 'column', 'row']}\n justify=\"space-between\"\n >\n {/* Search + Filters */}\n <Flex\n flex={1}\n style={{\n alignItems: 'flex-start',\n flex: 1,\n height: '100%',\n justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n position: 'relative',\n width: '100%',\n }}\n >\n <Box marginX={2} style={{minWidth: '200px'}}>\n {/* Search */}\n <TextInputSearch />\n </Box>\n\n <Box display={['none', 'none', 'block']}>\n <SearchFacets />\n\n {/* Search Facets Control (add / clear) */}\n <Inline gap={2}>\n <SearchFacetsControl />\n </Inline>\n </Box>\n\n <Box display={['block', 'block', 'none']} marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n {/* Filters button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowSearchFacetDialog}\n text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n tone=\"primary\"\n />\n\n {/* Tags button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowTagsDialog}\n text={`Tags`}\n tone=\"primary\"\n />\n\n {/* Folders button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowFoldersDialog}\n text=\"Folders\"\n tone=\"primary\"\n />\n </Inline>\n </Box>\n </Flex>\n </Flex>\n </Box>","['space-between']","<Box display={['none', 'none', 'block']}>\n <Button\n aria-label=\"Toggle folders panel\"\n fontSize={1}\n icon={FolderIcon}\n mode={foldersPanelVisible ? 'default' : 'ghost'}\n onClick={toggleFoldersPanel}\n />\n </Box>","foldersPanelVisible ? 'default' : 'ghost'","<ButtonViewGroup />","<Box marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n <Box display={['none', 'none', 'block']}>\n <Button\n aria-label=\"Toggle folders panel\"\n fontSize={1}\n icon={FolderIcon}\n mode={foldersPanelVisible ? 'default' : 'ghost'}\n onClick={toggleFoldersPanel}\n />\n </Box>\n <ButtonViewGroup />\n </Inline>\n </Box>","<OrderSelect />","<Box style={{transform: 'scale(0.75)'}}>\n <TagIcon />\n </Box>","<Flex marginX={2}>\n {/* Orders */}\n <OrderSelect />\n {/* Tags panel toggle */}\n <Box display={['none', 'none', 'block']} marginLeft={2}>\n <Button\n fontSize={1}\n icon={\n <Box style={{transform: 'scale(0.75)'}}>\n <TagIcon />\n </Box>\n }\n onClick={toggleTagsPanelToggle}\n mode={tagsPanelVisible ? 'default' : 'ghost'}\n text={tagsPanelVisible ? 'Tags' : ''}\n />\n </Box>\n </Flex>","tagsPanelVisible ? 'default' : 'ghost'","tagsPanelVisible ? 'Tags' : ''","<Box>\n <Flex align=\"center\" justify={['space-between']}>\n {/* Folders + Views */}\n <Box marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n <Box display={['none', 'none', 'block']}>\n <Button\n aria-label=\"Toggle folders panel\"\n fontSize={1}\n icon={FolderIcon}\n mode={foldersPanelVisible ? 'default' : 'ghost'}\n onClick={toggleFoldersPanel}\n />\n </Box>\n <ButtonViewGroup />\n </Inline>\n </Box>\n\n <Flex marginX={2}>\n {/* Orders */}\n <OrderSelect />\n {/* Tags panel toggle */}\n <Box display={['none', 'none', 'block']} marginLeft={2}>\n <Button\n fontSize={1}\n icon={\n <Box style={{transform: 'scale(0.75)'}}>\n <TagIcon />\n </Box>\n }\n onClick={toggleTagsPanelToggle}\n mode={tagsPanelVisible ? 'default' : 'ghost'}\n text={tagsPanelVisible ? 'Tags' : ''}\n />\n </Box>\n </Flex>\n </Flex>\n </Box>","<Progress key={pageIndex} loading={fetching} />","<Box\n paddingY={2}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n zIndex: 2,\n }}\n >\n {/* Rows: search / filters / orders */}\n <Box marginBottom={2}>\n <Flex\n align=\"flex-start\"\n direction={['column', 'column', 'column', 'column', 'row']}\n justify=\"space-between\"\n >\n {/* Search + Filters */}\n <Flex\n flex={1}\n style={{\n alignItems: 'flex-start',\n flex: 1,\n height: '100%',\n justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n position: 'relative',\n width: '100%',\n }}\n >\n <Box marginX={2} style={{minWidth: '200px'}}>\n {/* Search */}\n <TextInputSearch />\n </Box>\n\n <Box display={['none', 'none', 'block']}>\n <SearchFacets />\n\n {/* Search Facets Control (add / clear) */}\n <Inline gap={2}>\n <SearchFacetsControl />\n </Inline>\n </Box>\n\n <Box display={['block', 'block', 'none']} marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n {/* Filters button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowSearchFacetDialog}\n text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n tone=\"primary\"\n />\n\n {/* Tags button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowTagsDialog}\n text={`Tags`}\n tone=\"primary\"\n />\n\n {/* Folders button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowFoldersDialog}\n text=\"Folders\"\n tone=\"primary\"\n />\n </Inline>\n </Box>\n </Flex>\n </Flex>\n </Box>\n\n <Box>\n <Flex align=\"center\" justify={['space-between']}>\n {/* Folders + Views */}\n <Box marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n <Box display={['none', 'none', 'block']}>\n <Button\n aria-label=\"Toggle folders panel\"\n fontSize={1}\n icon={FolderIcon}\n mode={foldersPanelVisible ? 'default' : 'ghost'}\n onClick={toggleFoldersPanel}\n />\n </Box>\n <ButtonViewGroup />\n </Inline>\n </Box>\n\n <Flex marginX={2}>\n {/* Orders */}\n <OrderSelect />\n {/* Tags panel toggle */}\n <Box display={['none', 'none', 'block']} marginLeft={2}>\n <Button\n fontSize={1}\n icon={\n <Box style={{transform: 'scale(0.75)'}}>\n <TagIcon />\n </Box>\n }\n onClick={toggleTagsPanelToggle}\n mode={tagsPanelVisible ? 'default' : 'ghost'}\n text={tagsPanelVisible ? 'Tags' : ''}\n />\n </Box>\n </Flex>\n </Flex>\n </Box>\n\n {/* Progress bar */}\n <Progress key={pageIndex} loading={fetching} />\n </Box>","state","(state) => state.debug.badConnection","(state) => state.debug.enabled","(e: ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n\n dispatch(debugActions.setBadConnection(checked))\n }","() => {\n dispatch(debugActions.toggleEnabled())\n }","{\n bottom: 0,\n left: 0,\n pointerEvents: 'none',\n position: 'fixed',\n width: '100%',\n }","<Box marginRight={3}>\n <Text muted size={1}>\n <PlugIcon />\n </Text>\n </Box>","<Box padding={2}>\n <Text muted size={1}>\n {badConnection\n ? 'Bad connection: +3000ms & 50% chance to fail'\n : 'No connection throttling'}\n </Text>\n </Box>","badConnection\n ? 'Bad connection: +3000ms & 50% chance to fail'\n : 'No connection throttling'","['right', 'left']","{\n pointerEvents: 'auto',\n }","<Switch\n checked={badConnection}\n onChange={handleChange}\n style={{\n pointerEvents: 'auto',\n }}\n />","<Box\n padding={4}\n style={{\n bottom: 0,\n left: 0,\n pointerEvents: 'none',\n position: 'fixed',\n width: '100%',\n }}\n >\n {/* Bad connection toggle */}\n <Flex align=\"center\">\n <Box marginRight={3}>\n <Text muted size={1}>\n <PlugIcon />\n </Text>\n </Box>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n {badConnection\n ? 'Bad connection: +3000ms & 50% chance to fail'\n : 'No connection throttling'}\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"bottom\"\n portal\n >\n <Switch\n checked={badConnection}\n onChange={handleChange}\n style={{\n pointerEvents: 'auto',\n }}\n />\n </Tooltip>\n </Flex>\n </Box>","state","(state) => state.folders.currentFolderId","['block', 'block', 'none']","<Button\n fontSize={1}\n padding={2}\n mode=\"bleed\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n text=\"All assets\"\n />","segments.map((segment) => (\n <Inline key={segment.id} gap={1}>\n <Text muted size={1}>\n /\n </Text>\n <Button\n fontSize={1}\n padding={2}\n mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n text={segment.name}\n />\n </Inline>\n ))","(segment) => (\n <Inline key={segment.id} gap={1}>\n <Text muted size={1}>\n /\n </Text>\n <Button\n fontSize={1}\n padding={2}\n mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n text={segment.name}\n />\n </Inline>\n )","<Box display={['block', 'block', 'none']} padding={2}>\n <Inline gap={1}>\n <Button\n fontSize={1}\n padding={2}\n mode=\"bleed\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n text=\"All assets\"\n />\n\n {segments.map((segment) => (\n <Inline key={segment.id} gap={1}>\n <Text muted size={1}>\n /\n </Text>\n <Button\n fontSize={1}\n padding={2}\n mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n text={segment.name}\n />\n </Inline>\n ))}\n </Inline>\n </Box>","(state) => state.folders.panelVisible","{\n position: 'relative',\n width: FOLDERS_PANEL_WIDTH,\n }","<Box\n style={{\n position: 'relative',\n width: FOLDERS_PANEL_WIDTH,\n }}\n >\n <Box\n className=\"media__custom-scrollbar\"\n style={{\n borderRight: '1px solid var(--card-border-color)',\n height: '100%',\n left: 0,\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <FolderView />\n </Box>\n </Box>","{open}","useMemo(() => ({open}), [open])","<DropzoneDispatchContext.Provider value={contextValue}>\n {children}\n </DropzoneDispatchContext.Provider>","DropzoneDispatchContext.Provider","(state) => state.assets.assetTypes","(state) => state.selected.document","{whiteSpace: 'nowrap'}","onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'","<Text textOverflow=\"ellipsis\" weight=\"semibold\">\n <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n </Text>","selectedDocument && (\n <Box display={['none', 'none', 'block']}>\n <Text>\n <span style={{margin: '0 0.5em'}}>\n <ArrowRightIcon />\n </span>\n <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n </Text>\n </Box>\n )","<Box flex={1} marginX={3}>\n <Inline style={{whiteSpace: 'nowrap'}}>\n <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n </Text>\n\n {selectedDocument && (\n <Box display={['none', 'none', 'block']}>\n <Text>\n <span style={{margin: '0 0.5em'}}>\n <ArrowRightIcon />\n </span>\n <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n </Text>\n </Box>\n )}\n </Inline>\n </Box>","directUploads && (\n <Button\n fontSize={1}\n icon={UploadIcon}\n mode=\"bleed\"\n onClick={open}\n text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n />\n )","assetTypes.length","onClose && (\n <Box style={{flexShrink: 0}}>\n <Button\n disabled={!onClose}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n radius={2}\n />\n </Box>\n )","<Flex marginX={2}>\n {/* Upload */}\n {directUploads && (\n <Button\n fontSize={1}\n icon={UploadIcon}\n mode=\"bleed\"\n onClick={open}\n text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n />\n )}\n\n {/* Close */}\n {onClose && (\n <Box style={{flexShrink: 0}}>\n <Button\n disabled={!onClose}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n radius={2}\n />\n </Box>\n )}\n </Flex>","<Box paddingY={2}>\n <Flex align=\"center\" justify=\"space-between\">\n {/* Label */}\n <Box flex={1} marginX={3}>\n <Inline style={{whiteSpace: 'nowrap'}}>\n <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n </Text>\n\n {selectedDocument && (\n <Box display={['none', 'none', 'block']}>\n <Text>\n <span style={{margin: '0 0.5em'}}>\n <ArrowRightIcon />\n </span>\n <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n </Text>\n </Box>\n )}\n </Inline>\n </Box>\n\n <Flex marginX={2}>\n {/* Upload */}\n {directUploads && (\n <Button\n fontSize={1}\n icon={UploadIcon}\n mode=\"bleed\"\n onClick={open}\n text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n />\n )}\n\n {/* Close */}\n {onClose && (\n <Box style={{flexShrink: 0}}>\n <Button\n disabled={!onClose}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n radius={2}\n />\n </Box>\n )}\n </Flex>\n </Flex>\n </Box>","state","(state) => state.assets.order","() => {\n if (!field || !title) {\n return\n }\n\n if (isActive) {\n const direction = order.direction === 'asc' ? 'desc' : 'asc'\n dispatch(assetsActions.orderSet({order: {field, direction}}))\n } else {\n dispatch(assetsActions.orderSet({order: {field, direction: 'asc'}}))\n }\n }","direction","{\n cursor: field ? 'pointer' : 'default',\n display: 'inline',\n whiteSpace: 'nowrap',\n }","field ? 'pointer' : 'default'","{\n marginRight: '0.4em',\n }","<span\n style={{\n marginRight: '0.4em',\n }}\n >\n {title}\n </span>","isActive && order?.direction === 'asc' && <ChevronUpIcon />","isActive && order?.direction === 'desc' && <ChevronDownIcon />","<Box\n onClick={field ? handleClick : undefined}\n style={{\n cursor: field ? 'pointer' : 'default',\n display: 'inline',\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n marginRight: '0.4em',\n }}\n >\n {title}\n </span>\n\n {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n </Box>","field ? handleClick : undefined","<Label muted={!field} size={0}>\n <Box\n onClick={field ? handleClick : undefined}\n style={{\n cursor: field ? 'pointer' : 'default',\n display: 'inline',\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n marginRight: '0.4em',\n }}\n >\n {title}\n </span>\n\n {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n </Box>\n </Label>","!field","(state) => state.assets.fetching","(e: MouseEvent) => {\n e.stopPropagation()\n\n if (allSelected) {\n dispatch(assetsActions.pickClear())\n } else {\n dispatch(assetsActions.pickAll())\n }\n }","{\n alignItems: 'center',\n background: 'var(--card-bg-color)',\n borderBottom: '1px solid var(--card-border-color)',\n columnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n letterSpacing: '0.025em',\n position: 'sticky',\n textTransform: 'uppercase',\n top: 0,\n visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n width: '100%',\n zIndex: 1, // force stacking context\n }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`","mediaIndex < 3 ? 'hidden' : 'visible'","onSelect ? (\n <TableHeaderItem />\n ) : (\n <ContextActionContainer\n align=\"center\"\n justify=\"center\"\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n height: '100%',\n position: 'relative',\n }}\n >\n <Checkbox\n checked={!fetching && allSelected}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n </ContextActionContainer>\n )","<TableHeaderItem field=\"size\" title=\"Size\" />","<TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />","<TableHeaderItem title=\"References\" />","<TableHeaderItem />","<TableHeaderItem field=\"originalFilename\" title=\"Filename\" />","<TableHeaderItem title=\"Resolution\" />","<TableHeaderItem field=\"mimeType\" title=\"MIME type\" />","<Grid\n style={{\n alignItems: 'center',\n background: 'var(--card-bg-color)',\n borderBottom: '1px solid var(--card-border-color)',\n columnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n letterSpacing: '0.025em',\n position: 'sticky',\n textTransform: 'uppercase',\n top: 0,\n visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n width: '100%',\n zIndex: 1, // force stacking context\n }}\n >\n {onSelect ? (\n <TableHeaderItem />\n ) : (\n <ContextActionContainer\n align=\"center\"\n justify=\"center\"\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n height: '100%',\n position: 'relative',\n }}\n >\n <Checkbox\n checked={!fetching && allSelected}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n </ContextActionContainer>\n )}\n\n <TableHeaderItem />\n <TableHeaderItem field=\"originalFilename\" title=\"Filename\" />\n <TableHeaderItem title=\"Resolution\" />\n <TableHeaderItem field=\"mimeType\" title=\"MIME type\" />\n <TableHeaderItem field=\"size\" title=\"Size\" />\n <TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />\n <TableHeaderItem title=\"References\" />\n <TableHeaderItem />\n </Grid>","(state) => state.assets.lastPicked","(state) => selectAssetById(state, id)","state","(e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n } else if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n }","shiftPressed.current","useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n } else if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n },\n [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n )","(e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n onSelect([{kind: 'assetDocumentId', value: asset._id}])\n } else if (onSelect && isMultiSelect) {\n if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n } else if (shiftPressed.current) {\n if (picked) {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n } else {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n }\n } else {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n }\n }","useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n onSelect([{kind: 'assetDocumentId', value: asset._id}])\n } else if (onSelect && isMultiSelect) {\n if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n } else if (shiftPressed.current) {\n if (picked) {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n } else {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n }\n } else {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n }\n },\n [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n )","() => {\n refCountVisibleTimeout.current = setTimeout(\n () => setReferenceCountVisible(true),\n REFERENCE_COUNT_VISIBILITY_DELAY,\n )\n return () => {\n if (refCountVisibleTimeout.current) {\n clearTimeout(refCountVisibleTimeout.current)\n }\n }\n }","[]","{\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE","mediaIndex < 3 ? 'auto' : '1fr'","{\n alignItems: 'center',\n gridColumn: 1,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '100%',\n justifyContent: 'center',\n opacity: opacityCell,\n position: 'relative',\n }","onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n )","<ContextActionContainer\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n alignItems: 'center',\n gridColumn: 1,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '100%',\n justifyContent: 'center',\n opacity: opacityCell,\n position: 'relative',\n }}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n )}\n </ContextActionContainer>","{\n gridColumn: 2,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '90px',\n width: '100px',\n }","{height: '100%', position: 'relative'}","{height: '100%', opacity: opacityPreview, position: 'relative'}","isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />","isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 100, width: 100})}\n />\n )","<Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 100, width: 100})}\n />\n )}\n </Box>","updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )","selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )","<Box\n style={{\n gridColumn: 2,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '90px',\n width: '100px',\n }}\n >\n <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 100, width: 100})}\n />\n )}\n </Box>\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n </Flex>\n </Box>","{\n gridColumn: 3,\n gridRow: mediaIndex < 3 ? 2 : 'auto',\n opacity: opacityCell,\n }","mediaIndex < 3 ? 2 : 'auto'","{lineHeight: '2em'}","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>","originalFilename","<Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: 3,\n gridRow: mediaIndex < 3 ? 2 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>","mediaIndex < 3 ? 3 : 0","{\n gridColumn: mediaIndex < 3 ? 3 : 4,\n gridRow: mediaIndex < 3 ? 3 : 'auto',\n opacity: opacityCell,\n }","mediaIndex < 3 ? 3 : 4","mediaIndex < 3 ? 3 : 'auto'","isImageAsset(asset) && getAssetResolution(asset)","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {isImageAsset(asset) && getAssetResolution(asset)}\n </Text>","<Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 4,\n gridRow: mediaIndex < 3 ? 3 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {isImageAsset(asset) && getAssetResolution(asset)}\n </Text>\n </Box>","{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 5,\n gridRow: 'auto',\n opacity: opacityCell,\n }","mediaIndex < 3 ? 'none' : 'block'","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.mimeType}\n </Text>","mimeType","<Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 5,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.mimeType}\n </Text>\n </Box>","{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 6,\n gridRow: 'auto',\n opacity: opacityCell,\n }","filesize(asset.size, {base: 10, round: 0})","size","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {filesize(asset.size, {base: 10, round: 0})}\n </Text>","<Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 6,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {filesize(asset.size, {base: 10, round: 0})}\n </Text>\n </Box>","{\n gridColumn: mediaIndex < 3 ? 3 : 7,\n gridRow: mediaIndex < 3 ? 4 : 'auto',\n opacity: opacityCell,\n }","mediaIndex < 3 ? 3 : 7","mediaIndex < 3 ? 4 : 'auto'","formatRelative(new Date(asset._updatedAt), new Date())","_updatedAt","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {formatRelative(new Date(asset._updatedAt), new Date())}\n </Text>","<Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 7,\n gridRow: mediaIndex < 3 ? 4 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {formatRelative(new Date(asset._updatedAt), new Date())}\n </Text>\n </Box>","{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 8,\n gridRow: 'auto',\n opacity: opacityCell,\n }","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {referenceCountVisible ? (\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n id={id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueDocuments = getUniqueDocuments(referringDocuments)\n return isLoading ? (\n <>-</>\n ) : (\n <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n )\n }}\n </WithReferringDocuments>\n ) : (\n <>-</>\n )}\n </Text>","({isLoading, referringDocuments}) => {\n const uniqueDocuments = getUniqueDocuments(referringDocuments)\n return isLoading ? (\n <>-</>\n ) : (\n <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n )\n }","<Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 8,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {referenceCountVisible ? (\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n id={id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueDocuments = getUniqueDocuments(referringDocuments)\n return isLoading ? (\n <>-</>\n ) : (\n <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n )\n }}\n </WithReferringDocuments>\n ) : (\n <>-</>\n )}\n </Text>\n </Box>","{\n gridColumn: mediaIndex < 3 ? 4 : 9,\n gridRowStart: '1',\n gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n opacity: opacityCell,\n }","mediaIndex < 3 ? 4 : 9","mediaIndex < 3 ? 'span 5' : 'auto'","error && (\n <Box padding={2}>\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )","<Flex\n align=\"center\"\n justify=\"center\"\n style={{\n gridColumn: mediaIndex < 3 ? 4 : 9,\n gridRowStart: '1',\n gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n opacity: opacityCell,\n }}\n >\n {/* TODO: DRY */}\n {/* Error button */}\n {error && (\n <Box padding={2}>\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )}\n </Flex>","<ContainerGrid\n onClick={selected ? undefined : handleClick}\n $scheme={scheme}\n $selected={selected}\n style={{\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }}\n $updating={item.updating}\n >\n {/* Picked checkbox */}\n <ContextActionContainer\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n alignItems: 'center',\n gridColumn: 1,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '100%',\n justifyContent: 'center',\n opacity: opacityCell,\n position: 'relative',\n }}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n )}\n </ContextActionContainer>\n\n {/* Preview image + spinner */}\n <Box\n style={{\n gridColumn: 2,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '90px',\n width: '100px',\n }}\n >\n <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 100, width: 100})}\n />\n )}\n </Box>\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n </Flex>\n </Box>\n\n {/* Filename */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: 3,\n gridRow: mediaIndex < 3 ? 2 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>\n\n {/* Resolution */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 4,\n gridRow: mediaIndex < 3 ? 3 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {isImageAsset(asset) && getAssetResolution(asset)}\n </Text>\n </Box>\n\n {/* MIME type */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 5,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.mimeType}\n </Text>\n </Box>\n\n {/* Size */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 6,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {filesize(asset.size, {base: 10, round: 0})}\n </Text>\n </Box>\n\n {/* Last updated */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 7,\n gridRow: mediaIndex < 3 ? 4 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {formatRelative(new Date(asset._updatedAt), new Date())}\n </Text>\n </Box>\n\n {/* References */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 8,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {referenceCountVisible ? (\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n id={id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueDocuments = getUniqueDocuments(referringDocuments)\n return isLoading ? (\n <>-</>\n ) : (\n <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n )\n }}\n </WithReferringDocuments>\n ) : (\n <>-</>\n )}\n </Text>\n </Box>\n\n {/* Error */}\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n gridColumn: mediaIndex < 3 ? 4 : 9,\n gridRowStart: '1',\n gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n opacity: opacityCell,\n }}\n >\n {/* TODO: DRY */}\n {/* Error button */}\n {error && (\n <Box padding={2}>\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )}\n </Flex>\n </ContainerGrid>","updating","selected ? undefined : handleClick","item.updating","{isLoading, referringDocuments}","{folderId, name, totalCount}: Props","() => dispatch(foldersActions.currentFolderSet({folderId}))","getSchemeColor(scheme, 'bg')","{\n background: getSchemeColor(scheme, 'bg'),\n gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE","mediaIndex < 3 ? 'auto' : '1fr'","<Box />","<Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n <FolderBadge />\n </Flex>","{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}","mediaIndex < 3 ? 3 : 3","mediaIndex < 3 ? '2/4' : 'auto'","{lineHeight: '1.2em'}","<Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n {name}\n </Text>","<Text muted size={0} style={{lineHeight: '1.1em'}}>\n Folder\n </Text>","<Stack gap={2}>\n <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.1em'}}>\n Folder\n </Text>\n </Stack>","<Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n >\n <Stack gap={2}>\n <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.1em'}}>\n Folder\n </Text>\n </Stack>\n </Box>","mediaIndex < 3 ? 3 : 0","{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}","mediaIndex < 3 ? 'none' : 'block'","<Text muted size={1}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>","totalCount === 1 ? '' : 's'","<Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n <Text muted size={1}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Box>","{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}","<Text muted size={1}>\n Open folder\n </Text>","<Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n <Text muted size={1}>\n Open folder\n </Text>\n </Box>","<ContainerGrid\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }}\n >\n <Box />\n <Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n <FolderBadge />\n </Flex>\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n >\n <Stack gap={2}>\n <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.1em'}}>\n Folder\n </Text>\n </Stack>\n </Box>\n <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n <Text muted size={1}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Box>\n <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n <Text muted size={1}>\n Open folder\n </Text>\n </Box>\n <Box />\n </ContainerGrid>","(state) => selectUploadById(state, id)","filesize(item.size, {base: 10, round: 0})","size","() => {\n dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n }","hash","getSchemeColor(scheme, 'bg')","{\n alignItems: 'center',\n background: getSchemeColor(scheme, 'bg'),\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n height: '100%',\n position: 'relative',\n }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE","mediaIndex < 3 ? 'auto' : '1fr'","<div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />","`scaleX(${percentLoaded * 0.01})`","{\n gridColumn: 2,\n gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n height: '90px',\n width: '100px',\n }","mediaIndex < 3 ? 1 : 'auto'","mediaIndex < 3 ? 'span 4' : 'auto'","{height: '100%', position: 'relative'}","item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{opacity: 0.25}}\n />\n )","assetType","objectUrl","item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"40px\" />\n </div>\n )","!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n position: 'absolute',\n height: '100%',\n left: 0,\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={3}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )","<Box style={{height: '100%', position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{opacity: 0.25}}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"40px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n position: 'absolute',\n height: '100%',\n left: 0,\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={3}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>","<Box\n style={{\n gridColumn: 2,\n gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n height: '90px',\n width: '100px',\n }}\n >\n <Box style={{height: '100%', position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{opacity: 0.25}}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"40px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n position: 'absolute',\n height: '100%',\n left: 0,\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={3}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>\n </Box>","{\n gridColumn: mediaIndex < 3 ? 3 : '3/8',\n gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n marginLeft: mediaIndex < 3 ? 3 : 0,\n }","mediaIndex < 3 ? 3 : '3/8'","mediaIndex < 3 ? '2/4' : 'auto'","mediaIndex < 3 ? 3 : 0","<Text muted size={1} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>","name","<Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n {status}\n </Text>","<Stack gap={3}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n {status}\n </Text>\n </Stack>","<Box\n style={{\n gridColumn: mediaIndex < 3 ? 3 : '3/8',\n gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n marginLeft: mediaIndex < 3 ? 3 : 0,\n }}\n >\n <Stack gap={3}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n {status}\n </Text>\n </Stack>\n </Box>","<Grid\n style={{\n alignItems: 'center',\n background: getSchemeColor(scheme, 'bg'),\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n height: '100%',\n position: 'relative',\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />\n\n {/* Image */}\n <Box\n style={{\n gridColumn: 2,\n gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n height: '90px',\n width: '100px',\n }}\n >\n <Box style={{height: '100%', position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{opacity: 0.25}}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"40px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n position: 'absolute',\n height: '100%',\n left: 0,\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={3}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>\n </Box>\n\n {/* Filename */}\n <Box\n style={{\n gridColumn: mediaIndex < 3 ? 3 : '3/8',\n gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n marginLeft: mediaIndex < 3 ? 3 : 0,\n }}\n >\n <Stack gap={3}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n {status}\n </Text>\n </Stack>\n </Box>\n </Grid>","{\n item,\n selected,\n }: {\n item: CardAssetData | CardFolderData | CardUploadData\n selected: boolean\n }","{height: '100px'}","<Box style={{height: '100px'}}>\n <TableRowAsset id={item.id} selected={selected} />\n </Box>","id","<Box style={{height: '100px'}}>\n <TableRowFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n </Box>","folderId","name","totalCount","<Box style={{height: '100px'}}>\n <TableRowUpload id={item.id} />\n </Box>","(state) => state.selected.assets","(selectedAssets && selectedAssets.map((asset) => asset._id)) || []","(asset) => asset._id","(index) => {\n const item = items[index]\n return item?.id || index\n }","Array(1).fill(totalCount)","(index) => {\n const item = items[index]\n const selected = selectedIds.includes(item?.id || '')\n return <VirtualRow item={item!} selected={selected} />\n }","item","index","{overflowX: 'hidden'}","<GroupedVirtuoso\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n return item?.id || index\n }}\n endReached={onLoadMore}\n groupCounts={Array(1).fill(totalCount)}\n groupContent={() => {\n return <TableHeader />\n }}\n itemContent={(index) => {\n const item = items[index]\n const selected = selectedIds.includes(item?.id || '')\n return <VirtualRow item={item!} selected={selected} />\n }}\n style={{overflowX: 'hidden'}}\n />","() => {\n return <TableHeader />\n }","(state) => state.assets.fetchCount","(state) => state.assets.fetching","(state) => state.folders.panelVisible","(state) => state.tags.panelVisible","(state) => state.assets.view","() => {\n if (!fetching) {\n dispatch(assetsActions.loadNextPage())\n }\n }","() => {\n if (mediaIndex <= 1 && foldersPanelVisible) {\n dispatch(foldersActions.panelVisibleSet({panelVisible: false}))\n }\n\n if (mediaIndex <= 1 && tagsPanelVisible) {\n dispatch(tagsActions.panelVisibleSet({panelVisible: false}))\n }\n }","[dispatch, foldersPanelVisible, mediaIndex, tagsPanelVisible]","{width: '100%'}","<Box flex={1} style={{width: '100%'}}>\n {isEmpty ? (\n <Box padding={4}>\n <Text size={1} weight=\"semibold\">\n No results for the current query\n </Text>\n </Box>\n ) : (\n <>\n {view === 'grid' && (\n <AssetGridVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n )}\n\n {view === 'table' && (\n <AssetTableVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n )}\n </>\n )}\n </Box>","state","(state) => state.folders.currentFolderId","assetsPicked.length === 1 && !!assetsPicked[0] && isImageAsset(assetsPicked[0].asset)","0","length","() => {\n dispatch(assetsActions.pickClear())\n }","() => {\n dispatch(dialogActions.showConfirmDeleteAssets({assets: assetsPicked}))\n }","() => {\n const assetId = assetsPicked[0]?.asset._id\n if (!assetId) {\n return\n }\n dispatch(dialogActions.showAllAssetsDialog({assetId}))\n }","_id","() =>\n dispatch(DIALOG_ACTIONS.showFolderMove({assets: assetsPicked, folderId: currentFolderId}))","() =>\n dispatch(assetsActions.folderSetRequest({assets: assetsPicked, folderId: null}))","() => {\n if (!onSelect) {\n return\n }\n\n const pickedAssetIds = assetsPicked.map((item) => ({\n kind: 'assetDocumentId' as const,\n value: item.asset._id,\n }))\n\n if (pickedAssetIds.length === 0) {\n return\n }\n\n onSelect(pickedAssetIds)\n }","(item) => ({\n kind: 'assetDocumentId' as const,\n value: item.asset._id,\n })","getSchemeColor(scheme, 'bg')","{\n background: getSchemeColor(scheme, 'bg'),\n borderBottom: '1px solid var(--card-border-color)',\n height: `${PANEL_HEIGHT}px`,\n position: 'relative',\n width: '100%',\n }","{color: 'inherit'}","pluralize('asset', assetsPicked.length)","<Box paddingRight={2}>\n <Label size={0} style={{color: 'inherit'}}>\n {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n </Label>\n </Box>","assetsPicked.length","{background: 'none', boxShadow: 'none'}","<Label size={0}>Deselect</Label>","<Button\n mode=\"bleed\"\n onClick={handlePickClear}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Deselect</Label>\n </Button>","onSelect && isMultiSelect ? (\n <Button\n mode=\"bleed\"\n onClick={handleInsertPicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Insert selected</Label>\n </Button>\n ) : (\n <Button\n mode=\"bleed\"\n onClick={handleDeletePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Delete</Label>\n </Button>\n )","canReplace && (\n <Button\n mode=\"bleed\"\n onClick={handleReplaceImages}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Replace</Label>\n </Button>\n )","!onSelect && (\n <>\n <Button\n mode=\"bleed\"\n onClick={handleMovePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Move to folder</Label>\n </Button>\n {currentFolderId && (\n <Button\n mode=\"bleed\"\n onClick={handleRemovePickedFromFolder}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Remove from folder</Label>\n </Button>\n )}\n </>\n )","<Flex align=\"center\" paddingX={3}>\n <Box paddingRight={2}>\n <Label size={0} style={{color: 'inherit'}}>\n {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n </Label>\n </Box>\n\n {/* Deselect button */}\n <Button\n mode=\"bleed\"\n onClick={handlePickClear}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Deselect</Label>\n </Button>\n\n {onSelect && isMultiSelect ? (\n <Button\n mode=\"bleed\"\n onClick={handleInsertPicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Insert selected</Label>\n </Button>\n ) : (\n <Button\n mode=\"bleed\"\n onClick={handleDeletePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Delete</Label>\n </Button>\n )}\n\n {/* Replace button */}\n {canReplace && (\n <Button\n mode=\"bleed\"\n onClick={handleReplaceImages}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Replace</Label>\n </Button>\n )}\n\n {!onSelect && (\n <>\n <Button\n mode=\"bleed\"\n onClick={handleMovePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Move to folder</Label>\n </Button>\n {currentFolderId && (\n <Button\n mode=\"bleed\"\n onClick={handleRemovePickedFromFolder}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Remove from folder</Label>\n </Button>\n )}\n </>\n )}\n </Flex>","<Flex\n align=\"center\"\n justify=\"flex-start\"\n style={{\n background: getSchemeColor(scheme, 'bg'),\n borderBottom: '1px solid var(--card-border-color)',\n height: `${PANEL_HEIGHT}px`,\n position: 'relative',\n width: '100%',\n }}\n >\n <Flex align=\"center\" paddingX={3}>\n <Box paddingRight={2}>\n <Label size={0} style={{color: 'inherit'}}>\n {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n </Label>\n </Box>\n\n {/* Deselect button */}\n <Button\n mode=\"bleed\"\n onClick={handlePickClear}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Deselect</Label>\n </Button>\n\n {onSelect && isMultiSelect ? (\n <Button\n mode=\"bleed\"\n onClick={handleInsertPicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Insert selected</Label>\n </Button>\n ) : (\n <Button\n mode=\"bleed\"\n onClick={handleDeletePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Delete</Label>\n </Button>\n )}\n\n {/* Replace button */}\n {canReplace && (\n <Button\n mode=\"bleed\"\n onClick={handleReplaceImages}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Replace</Label>\n </Button>\n )}\n\n {!onSelect && (\n <>\n <Button\n mode=\"bleed\"\n onClick={handleMovePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Move to folder</Label>\n </Button>\n {currentFolderId && (\n <Button\n mode=\"bleed\"\n onClick={handleRemovePickedFromFolder}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Remove from folder</Label>\n </Button>\n )}\n </>\n )}\n </Flex>\n </Flex>","(state) => state.tags.panelVisible","{\n position: 'relative',\n width: TAGS_PANEL_WIDTH,\n }","<Box\n style={{\n position: 'relative',\n width: TAGS_PANEL_WIDTH,\n }}\n >\n <Box\n className=\"media__custom-scrollbar\"\n style={{\n borderLeft: '1px solid var(--card-border-color)',\n height: '100%',\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'absolute',\n right: 0,\n top: 0,\n width: '100%',\n }}\n >\n <TagView />\n </Box>\n </Box>","{maxSize}","(state) => state.assets.assetTypes","async (acceptedFiles: File[]) => {\n acceptedFiles.forEach((file) =>\n dispatch(\n uploadsActions.uploadRequest({\n file,\n forceAsAssetType: assetTypes.length === 1 ? assetTypes[0] : undefined,\n }),\n ),\n )\n }","0","length","(rejections) => {\n const errorCodes = rejections.flatMap(({errors}) => errors.map(({code}) => code))\n\n if (errorCodes.includes('file-too-large')) {\n dispatch(\n notificationsActions.add({\n status: 'error',\n title: 'One or more files exceed the maximum upload size.',\n }),\n )\n }\n }","({errors}) => errors.map(({code}) => code)","async (event: DropEvent) => {\n let fileList: FileList | undefined\n if (event.type === 'drop' && 'dataTransfer' in event) {\n fileList = event?.dataTransfer?.files\n }\n if (event.type === 'change') {\n const target = event?.target as HTMLInputElement\n if (target?.files) {\n fileList = target.files\n }\n }\n\n if (!fileList) {\n return []\n }\n\n // Filter out non-folders / packages\n const files: File[] = await filterFiles(fileList)\n\n // Dispatch error if some files have been filtered out\n if (fileList?.length !== files.length) {\n dispatch(\n notificationsActions.add({\n status: 'error',\n title: `Unable to upload some items (folders and packages aren't supported)`,\n }),\n )\n }\n\n return files\n }","{\n accept: isImageAssetType ? 'image/*' : '',\n getFilesFromEvent: handleFileGetter,\n noClick: true,\n // HACK: Disable drag and drop functionality when in a selecting context\n // (This is currently due to Sanity's native image input taking precedence with drag and drop)\n noDrag: !!onSelect,\n onDrop: handleDrop,\n maxSize,\n onDropRejected: handleDropRejected,\n disabled: !directUploads,\n }","isImageAssetType ? 'image/*' : ''","!!onSelect","!directUploads","getRootProps()","getInputProps()","<input {...getInputProps()} />","isDragActive && (\n <DragActiveContainer>\n <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n <Text size={3} style={{color: 'inherit'}}>\n Drop files to upload\n </Text>\n </Flex>\n </DragActiveContainer>\n )","<UploadContainer {...getRootProps()}>\n <input {...getInputProps()} />\n\n {isDragActive && (\n <DragActiveContainer>\n <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n <Text size={3} style={{color: 'inherit'}}>\n Drop files to upload\n </Text>\n </Flex>\n </DragActiveContainer>\n )}\n\n {children}\n </UploadContainer>","<DropzoneDispatchProvider open={open}>\n <UploadContainer {...getRootProps()}>\n <input {...getInputProps()} />\n\n {isDragActive && (\n <DragActiveContainer>\n <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n <Text size={3} style={{color: 'inherit'}}>\n Drop files to upload\n </Text>\n </Flex>\n </DragActiveContainer>\n )}\n\n {children}\n </UploadContainer>\n </DropzoneDispatchProvider>","{code}","{errors}","({code}) => code","(state: RootReducerState) => state.tags.byIds","(state: RootReducerState) => state.tags.fetchCount","getMediaTagNames(schemaType)","() => {\n if (!hasMediaTags) {\n dispatch(searchActions.facetsClear())\n }\n\n dispatch(tagsActions.fetchRequest())\n\n // Fetch all folders\n dispatch(foldersActions.fetchRequest())\n\n const assetSubscription = client\n .listen(\n groq`*[_type in [\"sanity.fileAsset\", \"sanity.imageAsset\"] && !(_id in path(\"drafts.**\"))]`,\n )\n .subscribe(createAssetHandler(dispatch))\n\n const tagSubscription = client\n .listen(groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n .subscribe(createTagHandler(dispatch))\n\n const folderSubscription = client\n .listen(groq`*[_type == \"${FOLDER_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n .subscribe(() => dispatch(foldersActions.fetchRequest()))\n\n return () => {\n assetSubscription.unsubscribe()\n tagSubscription.unsubscribe()\n folderSubscription.unsubscribe()\n }\n }","[client, dispatch, hasMediaTags]","() => {\n if (!hasMediaTags || tagsFetchCount < 0) return\n\n const tagFacetInput = inputs.tag\n if (tagFacetInput.type !== 'searchable') return\n\n const resolvedTags = tagNames\n .map((name) => Object.values(tagsByIds).find((item) => item.tag.name.current === name))\n .filter((item): item is NonNullable<typeof item> => Boolean(item))\n\n dispatch(searchActions.facetsClear())\n\n for (const tagItem of resolvedTags) {\n dispatch(\n searchActions.facetsAdd({\n facet: {\n ...tagFacetInput,\n operatorType: 'references',\n value: {label: tagItem.tag.name.current, value: tagItem.tag._id},\n },\n }),\n )\n }\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }","(item): item is NonNullable<typeof item> => Boolean(item)","[tagsFetchCount, hasMediaTags]","item","state","{\n onClose,\n schemaType,\n}: {\n onClose?: AssetSourceComponentProps['onClose']\n schemaType?: AssetSourceComponentProps['schemaType']\n}","<Dialogs />","<Notifications />","<Header onClose={onClose} />","<Controls />","<FolderBreadcrumbs />","<FolderPanel />","<Flex flex={1}>\n <FolderPanel />\n <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n <PickedBar />\n <Items />\n </Flex>\n <TagsPanel />\n </Flex>","<DebugControls />","<UploadDropzone>\n <Dialogs />\n <Notifications />\n\n <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n <Flex direction=\"column\" flex={1}>\n {/* Header */}\n <Header onClose={onClose} />\n\n {/* Browser Controls */}\n <Controls />\n\n <FolderBreadcrumbs />\n\n <Flex flex={1}>\n <FolderPanel />\n <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n <PickedBar />\n <Items />\n </Flex>\n <TagsPanel />\n </Flex>\n\n {/* Debug */}\n <DebugControls />\n </Flex>\n </Card>\n </UploadDropzone>","<PortalProvider element={portalElement}>\n <UploadDropzone>\n <Dialogs />\n <Notifications />\n\n <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n <Flex direction=\"column\" flex={1}>\n {/* Header */}\n <Header onClose={onClose} />\n\n {/* Browser Controls */}\n <Controls />\n\n <FolderBreadcrumbs />\n\n <Flex flex={1}>\n <FolderPanel />\n <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n <PickedBar />\n <Items />\n </Flex>\n <TagsPanel />\n </Flex>\n\n {/* Debug */}\n <DebugControls />\n </Flex>\n </Card>\n </UploadDropzone>\n </PortalProvider>","<GlobalStyle />","<BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />","props?.onClose","props?.schemaType","<AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n <GlobalStyle />\n <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n </AssetBrowserDispatchProvider>","props?.isMultiSelect","props?.onSelect","<ReduxProvider\n assetType={props?.assetType}\n client={client}\n document={props?.document}\n excludeTagSlugs={excludeTagSlugs}\n selectedAssets={props?.selectedAssets}\n >\n <AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n <GlobalStyle />\n <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n </AssetBrowserDispatchProvider>\n </ReduxProvider>","props?.assetType","props?.document","props?.selectedAssets","[]","(event: SyntheticEvent) => {\n event.nativeEvent.stopImmediatePropagation()\n event.stopPropagation()\n }","{\n bottom: 0,\n height: 'auto',\n left: 0,\n position: 'fixed',\n top: 0,\n width: '100%',\n zIndex,\n }","<Browser\n document={currentDocument}\n isMultiSelect={isMultiSelect}\n schemaType={props.schemaType}\n {...props}\n />","props.schemaType","<Portal>\n <Box\n onDragEnter={handleStopPropagation}\n onDragLeave={handleStopPropagation}\n onDragOver={handleStopPropagation}\n onDrop={handleStopPropagation}\n onMouseUp={handleStopPropagation}\n style={{\n bottom: 0,\n height: 'auto',\n left: 0,\n position: 'fixed',\n top: 0,\n width: '100%',\n zIndex,\n }}\n >\n <Browser\n document={currentDocument}\n isMultiSelect={isMultiSelect}\n schemaType={props.schemaType}\n {...props}\n />\n </Box>\n </Portal>","<PortalProvider element={portalElement}>\n <Portal>\n <Box\n onDragEnter={handleStopPropagation}\n onDragLeave={handleStopPropagation}\n onDragOver={handleStopPropagation}\n onDrop={handleStopPropagation}\n onMouseUp={handleStopPropagation}\n style={{\n bottom: 0,\n height: 'auto',\n left: 0,\n position: 'fixed',\n top: 0,\n width: '100%',\n zIndex,\n }}\n >\n <Browser\n document={currentDocument}\n isMultiSelect={isMultiSelect}\n schemaType={props.schemaType}\n {...props}\n />\n </Box>\n </Portal>\n </PortalProvider>","<Flex direction=\"column\" height=\"fill\" flex={1}>\n <Browser />\n </Flex>","() => {\n if (isInitialMount.current) {\n isInitialMount.current = false\n prevAssetRef.current = currentAssetRef\n return\n }\n\n const previousRef = prevAssetRef.current\n prevAssetRef.current = currentAssetRef\n\n if (!mediaTags?.length || !currentAssetRef || currentAssetRef === previousRef) return\n\n applyMediaTags({\n client,\n assetId: currentAssetRef,\n mediaTags,\n createTagsOnUpload,\n }).catch((err) => {\n console.error('[sanity-plugin-media] Failed to apply auto-tags:', err)\n const label = mediaTags.length === 1 ? 'tag' : 'tags'\n toast.push({\n closable: true,\n status: 'error',\n title: `Failed to apply the media ${label} ${mediaTags.join(', ')}`,\n })\n })\n }","[currentAssetRef, mediaTags, client, createTagsOnUpload, toast]","mediaTags?.length","renderDefault(props as InputProps)","props as InputProps"],"sources":["../src/contexts/AssetSourceDispatchContext.tsx","../src/hooks/useRootPortalElement.ts","../src/hooks/useTypedSelector.ts","../src/hooks/useVersionedClient.ts","../src/config/orders.ts","../src/config/searchFacets.ts","../src/constants.ts","../src/operators/debugThrottle.ts","../src/utils/constructFilter.ts","../src/utils/ReplaceImages.ts","../src/operators/checkTagName.ts","../src/utils/getTagSelectOptions.ts","../src/modules/assets/actions.ts","../src/modules/dialog/actions.ts","../src/modules/tags/index.ts","../src/modules/search/index.ts","../src/modules/uploads/actions.ts","../src/modules/assets/index.ts","../src/modules/folders/index.ts","../src/modules/dialog/index.ts","../src/styled/GlobalStyles/index.tsx","../src/contexts/ToolOptionsContext.tsx","../src/formSchema/index.ts","../src/utils/getUniqueDocuments.ts","../src/utils/imageDprUrl.ts","../src/utils/sanitizeFormData.ts","../src/utils/typeGuards.ts","../src/utils/zodFormResolver.ts","../src/utils/getAssetResolution.ts","../src/hooks/usePortalPopoverProps.ts","../src/components/ButtonAssetCopy/index.tsx","../src/components/AssetMetadata/index.tsx","../src/components/Dialog/index.tsx","../src/components/DocumentList/index.tsx","../src/components/FileIcon/index.tsx","../src/components/FileAssetPreview/index.tsx","../src/components/FormSubmitButton/index.tsx","../src/utils/getSchemeColor.ts","../src/components/Image/index.tsx","../src/components/FormFieldInputLabel/index.tsx","../src/styled/react-select/creatable.tsx","../src/components/FormFieldInputTags/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/components/FormFieldInputTextarea/index.tsx","../src/components/DialogAssetEdit/Details.tsx","../src/components/DialogAssetEdit/index.tsx","../src/modules/selectors.ts","../src/hooks/useKeyPress.ts","../src/components/CardAsset/index.tsx","../src/components/CardFolder/index.tsx","../src/utils/generatePreviewBlobUrl.ts","../src/utils/withMaxConcurrency.ts","../src/utils/uploadSanityAsset.ts","../src/modules/uploads/index.ts","../src/components/CardUpload/index.tsx","../src/components/AssetGridVirtualized/index.tsx","../src/components/ReplaceAssetsOverView/index.tsx","../src/components/DialogAssetsOverView/index.tsx","../src/components/DialogConfirm/index.tsx","../src/components/DialogFolderCreate/index.tsx","../src/components/DialogFolderMove/index.tsx","../src/components/DialogFolderRename/index.tsx","../src/components/FolderView/index.tsx","../src/components/DialogFolders/index.tsx","../src/components/SearchFacet/index.tsx","../src/components/TextInputNumber/index.tsx","../src/components/SearchFacetNumber/index.tsx","../src/components/SearchFacetSelect/index.tsx","../src/components/SearchFacetString/index.tsx","../src/styled/react-select/single.tsx","../src/components/SearchFacetTags/index.tsx","../src/components/SearchFacets/index.tsx","../src/components/SearchFacetsControl/index.tsx","../src/components/DialogSearchFacets/index.tsx","../src/components/DialogTagCreate/index.tsx","../src/components/DialogTagEdit/index.tsx","../src/components/Tag/index.tsx","../src/components/TagsVirtualized/index.tsx","../src/components/TagViewHeader/index.tsx","../src/components/TagView/index.tsx","../src/components/DialogTags/index.tsx","../src/components/Dialogs/index.tsx","../src/components/Notifications/index.tsx","../src/modules/debug/index.ts","../src/modules/notifications/index.ts","../src/modules/selected/index.ts","../src/modules/index.ts","../src/utils/getDocumentAssetIds.ts","../src/utils/isSupportedAssetType.ts","../src/components/ReduxProvider/index.tsx","../src/components/EditAssetTool/index.tsx","../src/components/ButtonViewGroup/index.tsx","../src/components/OrderSelect/index.tsx","../src/components/Progress/index.tsx","../src/components/TagIcon/index.tsx","../src/components/TextInputSearch/index.tsx","../src/components/Controls/index.tsx","../src/components/DebugControls/index.tsx","../src/components/FolderBreadcrumbs/index.tsx","../src/components/FolderPanel/index.tsx","../src/contexts/DropzoneDispatchContext.tsx","../src/components/Header/index.tsx","../src/components/TableHeaderItem/index.tsx","../src/components/TableHeader/index.tsx","../src/components/TableRowAsset/index.tsx","../src/components/TableRowFolder/index.tsx","../src/components/TableRowUpload/index.tsx","../src/components/AssetTableVirtualized/index.tsx","../src/components/Items/index.tsx","../src/components/PickedBar/index.tsx","../src/components/TagsPanel/index.tsx","../src/components/UploadDropzone/index.tsx","../src/components/Browser/useBrowserInit.ts","../src/components/Browser/index.tsx","../src/components/FormBuilderTool/index.tsx","../src/components/Tool/index.tsx","../src/schemas/folder.ts","../src/schemas/tag.ts","../src/plugin.tsx","../src/utils/applyMediaTags.ts","../src/components/AutoTagInputWrapper/index.tsx","../src/utils/mediaField.ts"],"sourcesContent":["import {type ReactNode, createContext, useContext, useMemo} from 'react'\nimport type {AssetSourceComponentProps} from 'sanity'\n\ntype ContextProps = {\n isMultiSelect: boolean\n onSelect?: AssetSourceComponentProps['onSelect']\n}\n\ntype Props = {\n children: ReactNode\n isMultiSelect?: boolean\n onSelect?: AssetSourceComponentProps['onSelect']\n}\n\nconst AssetSourceDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const AssetBrowserDispatchProvider = (props: Props) => {\n const {children, isMultiSelect = false, onSelect} = props\n\n const contextValue: ContextProps = useMemo(\n () => ({\n isMultiSelect,\n onSelect,\n }),\n [isMultiSelect, onSelect],\n )\n\n return (\n <AssetSourceDispatchContext.Provider value={contextValue}>\n {children}\n </AssetSourceDispatchContext.Provider>\n )\n}\n\nexport const useAssetSourceActions = () => {\n const context = useContext(AssetSourceDispatchContext)\n if (context === undefined) {\n throw new Error('useAssetSourceActions must be used within an AssetSourceDispatchProvider')\n }\n return context\n}\n","import {useEffect, useState} from 'react'\n\n/**\n * Creates a detached `.media-portal` element appended to `document.body` for the\n * lifetime of the component, used as a portal target for the plugin's dialogs\n * and overlays. The element is removed on unmount.\n */\nconst useRootPortalElement = (): HTMLDivElement => {\n const [container] = useState(() => document.createElement('div'))\n\n useEffect(() => {\n container.classList.add('media-portal')\n document.body.appendChild(container)\n return () => {\n document.body.removeChild(container)\n }\n }, [container])\n\n return container\n}\n\nexport default useRootPortalElement\n","import {type TypedUseSelectorHook, useSelector} from 'react-redux'\n\nimport type {RootReducerState} from '../modules/types'\n\nconst useTypedSelector: TypedUseSelectorHook<RootReducerState> = useSelector\n\nexport default useTypedSelector\n","import type {SanityClient} from '@sanity/client'\nimport {useClient} from 'sanity'\n\nconst useVersionedClient = (): SanityClient => useClient({apiVersion: '2025-10-02'})\n\nexport default useVersionedClient\n","import type {OrderDirection} from '../types'\n\nconst ORDER_DICTIONARY: Record<string, {asc: string; desc: string}> = {\n _createdAt: {\n asc: 'Last created: Oldest first',\n desc: 'Last created: Newest first',\n },\n _updatedAt: {\n asc: 'Last updated: Oldest first',\n desc: 'Last updated: Newest first',\n },\n mimeType: {\n asc: 'MIME type: A to Z',\n desc: 'MIME type: Z to A',\n },\n originalFilename: {\n asc: 'File name: A to Z',\n desc: 'File name: Z to A',\n },\n size: {\n asc: 'File size: Smallest first',\n desc: 'File size: Largest first',\n },\n}\n\nexport const getOrderTitle = (field: string, direction: OrderDirection): string => {\n return ORDER_DICTIONARY[field]![direction]\n}\n","import groq from 'groq'\n\nimport type {\n SearchFacetDivider,\n SearchFacetInputProps,\n SearchFacetName,\n SearchFacetOperators,\n} from '../types'\n\nexport const divider: SearchFacetDivider = {type: 'divider'}\n\nexport const inputs: Record<SearchFacetName, SearchFacetInputProps> = {\n altText: {\n assetTypes: ['file', 'image'],\n field: 'altText',\n name: 'altText',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Alt text',\n type: 'string',\n value: '',\n },\n creditLine: {\n assetTypes: ['file', 'image'],\n field: 'creditLine',\n name: 'creditLine',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Credit',\n type: 'string',\n value: '',\n },\n description: {\n assetTypes: ['file', 'image'],\n field: 'description',\n name: 'description',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Description',\n type: 'string',\n value: '',\n },\n folder: {\n assetTypes: ['file', 'image'],\n field: 'opt.media.folder._ref',\n name: 'folder',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty'],\n title: 'Folder',\n type: 'string',\n value: '',\n },\n fileName: {\n assetTypes: ['file', 'image'],\n field: 'originalFilename',\n name: 'filename',\n operatorType: 'includes',\n operatorTypes: ['includes', 'doesNotInclude'],\n title: 'File name',\n type: 'string',\n value: '',\n },\n height: {\n assetTypes: ['image'],\n field: 'metadata.dimensions.height',\n name: 'height',\n operatorType: 'greaterThan',\n operatorTypes: [\n 'greaterThan',\n 'greaterThanOrEqualTo',\n 'lessThan',\n 'lessThanOrEqualTo',\n null,\n 'equalTo',\n ],\n title: 'Height',\n type: 'number',\n value: 400,\n },\n inCurrentDocument: {\n assetTypes: ['file', 'image'],\n name: 'inCurrentDocument',\n operatorType: 'is',\n options: [\n {\n name: 'true',\n title: 'True',\n value: groq`_id in $documentAssetIds`,\n },\n {\n name: 'false',\n title: 'False',\n value: groq`!(_id in $documentAssetIds)`,\n },\n ],\n selectOnly: true,\n title: 'In use in current document',\n type: 'select',\n value: 'true',\n },\n inUse: {\n assetTypes: ['file', 'image'],\n name: 'inUse',\n operatorType: 'is',\n options: [\n {\n name: 'true',\n title: 'True',\n value: groq`count(*[references(^._id)]) > 0`,\n },\n {\n name: 'false',\n title: 'False',\n value: groq`count(*[references(^._id)]) == 0`,\n },\n ],\n title: 'In use',\n type: 'select',\n value: 'true',\n },\n isOpaque: {\n assetTypes: ['image'],\n field: 'metadata.isOpaque',\n name: 'isOpaque',\n operatorType: 'equalTo',\n options: [\n {\n name: 'true',\n title: 'True',\n value: `false`,\n },\n {\n name: 'false',\n title: 'False',\n value: `true`,\n },\n ],\n title: 'Has transparency',\n type: 'select',\n value: 'true',\n },\n orientation: {\n assetTypes: ['image'],\n name: 'orientation',\n operatorType: 'is',\n operatorTypes: ['is', 'isNot'],\n options: [\n {\n name: 'portrait',\n title: 'Portrait',\n value: 'metadata.dimensions.aspectRatio < 1',\n },\n {\n name: 'landscape',\n title: 'Landscape',\n value: 'metadata.dimensions.aspectRatio > 1',\n },\n {\n name: 'square',\n title: 'Square',\n value: 'metadata.dimensions.aspectRatio == 1',\n },\n ],\n title: 'Orientation',\n type: 'select',\n value: 'portrait',\n },\n size: {\n assetTypes: ['file', 'image'],\n field: 'size',\n modifier: 'kb',\n modifiers: [\n {\n name: 'kb',\n title: 'KB',\n fieldModifier: (fieldName) => `round(${fieldName} / 1000)`,\n },\n {\n name: 'mb',\n title: 'MB',\n fieldModifier: (fieldName) => `round(${fieldName} / 1000000)`,\n },\n ],\n name: 'size',\n operatorType: 'greaterThan',\n operatorTypes: [\n 'greaterThan',\n 'greaterThanOrEqualTo',\n 'lessThan',\n 'lessThanOrEqualTo',\n null,\n 'equalTo',\n ],\n title: 'File size',\n type: 'number',\n value: 0,\n },\n tag: {\n assetTypes: ['file', 'image'],\n field: 'opt.media.tags',\n name: 'tag',\n operatorType: 'references',\n operatorTypes: ['references', 'doesNotReference', null, 'empty', 'notEmpty'],\n title: 'Tags',\n type: 'searchable',\n },\n title: {\n assetTypes: ['file', 'image'],\n field: 'title',\n name: 'title',\n operatorType: 'empty',\n operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n title: 'Title',\n type: 'string',\n value: '',\n },\n type: {\n assetTypes: ['file', 'image'],\n name: 'type',\n operatorType: 'is',\n operatorTypes: ['is', 'isNot'],\n options: [\n {\n name: 'image',\n title: 'Image',\n value: 'mimeType match \"image*\"',\n },\n {\n name: 'video',\n title: 'Video',\n value: 'mimeType match \"video*\"',\n },\n {\n name: 'audio',\n title: 'Audio',\n value: 'mimeType match \"audio*\"',\n },\n {\n name: 'pdf',\n title: 'PDF',\n value: 'mimeType == \"application/pdf\"',\n },\n ],\n title: 'File type',\n type: 'select',\n value: 'image',\n },\n width: {\n assetTypes: ['image'],\n field: 'metadata.dimensions.width',\n name: 'width',\n operatorType: 'greaterThan',\n operatorTypes: [\n 'greaterThan',\n 'greaterThanOrEqualTo',\n 'lessThan',\n 'lessThanOrEqualTo',\n null,\n 'equalTo',\n ],\n title: 'Width',\n type: 'number',\n value: 400,\n },\n}\n\nexport const operators: SearchFacetOperators = {\n doesNotInclude: {\n fn: (value, field) => (value ? `!(${field} match '*${value}*')` : undefined),\n label: 'does not include',\n },\n doesNotReference: {\n fn: (value, _field) => (value ? `!references('${value}')` : undefined),\n label: 'does not include',\n },\n empty: {\n fn: (_value, field) => `!defined(${field})`,\n hideInput: true,\n label: 'is empty',\n },\n equalTo: {\n fn: (value, field) => (value ? `${field} == ${value}` : undefined),\n label: 'is equal to',\n },\n greaterThan: {\n fn: (value, field) => (value ? `${field} > ${value}` : undefined),\n label: 'is greater than',\n },\n greaterThanOrEqualTo: {\n fn: (value, field) => (value ? `${field} >= ${value}` : undefined),\n label: 'is greater than or equal to',\n },\n includes: {\n fn: (value, field) => (value ? `${field} match '*${value}*'` : undefined),\n label: 'includes',\n },\n is: {\n fn: (value, _field) => `${value}`,\n label: 'is',\n },\n isNot: {\n fn: (value, _field) => `!(${value})`,\n label: 'is not',\n },\n lessThan: {\n fn: (value, field) => (value ? `${field} < ${value}` : undefined),\n label: 'is less than',\n },\n lessThanOrEqualTo: {\n fn: (value, field) => (value ? `${field} <= ${value}` : undefined),\n label: 'is less than or equal to',\n },\n notEmpty: {\n fn: (_value, field) => `defined(${field})`,\n hideInput: true,\n label: 'is not empty',\n },\n references: {\n fn: (value, _field) => (value ? `references('${value}')` : undefined),\n label: 'includes',\n },\n}\n","import type {AssetSourceComponentProps} from 'sanity'\n\nimport {divider, inputs} from './config/searchFacets'\nimport type {\n SearchFacetInputProps,\n SearchFacetDivider,\n SearchFacetGroup,\n OrderDirection,\n} from './types'\n\nexport const SUPPORTED_ASSET_TYPES = [\n 'file',\n 'image',\n] as const satisfies AssetSourceComponentProps['assetType'][]\n\n// Sort order dropdown options\n// null values are represented as menu dividers\nexport const ORDER_OPTIONS: ({direction: OrderDirection; field: string} | null)[] = [\n {\n direction: 'desc',\n field: '_createdAt',\n },\n {\n direction: 'asc',\n field: '_createdAt',\n },\n // Divider\n null,\n {\n direction: 'desc',\n field: '_updatedAt',\n },\n {\n direction: 'asc' as OrderDirection,\n field: '_updatedAt',\n },\n // Divider\n null,\n {\n direction: 'asc',\n field: 'originalFilename',\n },\n {\n direction: 'desc',\n field: 'originalFilename',\n },\n // Divider\n null,\n {\n direction: 'desc',\n field: 'size',\n },\n {\n direction: 'asc',\n field: 'size',\n },\n]\n\nexport const FACETS: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[] = [\n inputs.tag,\n divider,\n inputs.inUse,\n inputs.inCurrentDocument,\n divider,\n inputs.title,\n inputs.folder,\n inputs.altText,\n inputs.creditLine,\n inputs.description,\n divider,\n inputs.isOpaque,\n divider,\n inputs.fileName,\n inputs.size,\n inputs.type,\n divider,\n inputs.orientation,\n inputs.width,\n inputs.height,\n]\n\nexport const GRID_TEMPLATE_COLUMNS = {\n SMALL: '3rem 100px auto 1.5rem',\n LARGE: '3rem 100px auto 5.5rem 5.5rem 3.5rem 8.5rem 4.75rem 2rem',\n}\nexport const FOLDERS_PANEL_WIDTH = 260 // px\nexport const FOLDER_DOCUMENT_NAME = 'media.folder'\nexport const PANEL_HEIGHT = 32 // px\nexport const TAG_DOCUMENT_NAME = 'media.tag'\nexport const TAGS_PANEL_WIDTH = 250 // px\n","import {iif, type Observable, of, throwError} from 'rxjs'\nimport {delay, mergeMap} from 'rxjs/operators'\n\nconst debugThrottle = (throttled?: boolean) => {\n return function <T>(source: Observable<T>): Observable<T> {\n return iif(\n () => !!throttled,\n source.pipe(\n delay(3000),\n mergeMap((v) => {\n if (Math.random() > 0.5) {\n return throwError(() => ({\n message: 'Test error',\n statusCode: 500,\n }))\n }\n return of(v)\n }),\n ),\n source,\n )\n }\n}\n\nexport default debugThrottle\n","import groq from 'groq'\n\nimport {operators} from '../config/searchFacets'\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {AssetType, SearchFacetInputProps} from '../types'\n\n/** GROQ fragment that excludes assets tagged with any of the given media.tag slugs. */\nexport const buildExcludeTagsFragment = (excludeTagSlugs?: string[]): string | undefined => {\n const serializedExcludeTagSlugs = excludeTagSlugs?.length\n ? JSON.stringify(excludeTagSlugs)\n : undefined\n\n return serializedExcludeTagSlugs\n ? groq`!(defined(opt.media.tags) && count(opt.media.tags[@._ref in *[_type == \"${TAG_DOCUMENT_NAME}\" && name.current in ${serializedExcludeTagSlugs}]._id]) > 0)`\n : undefined\n}\n\nconst constructFilter = ({\n assetTypes,\n currentFolderId,\n excludeTagSlugs,\n searchFacets,\n searchQuery,\n}: {\n assetTypes: AssetType[]\n currentFolderId?: string | null\n excludeTagSlugs?: string[]\n searchFacets: SearchFacetInputProps[]\n searchQuery?: string\n}): string => {\n // Fetch asset types depending on current context.\n // Either limit to a specific type (if being used as a custom asset source) or fetch both files and images (if being used as a tool)\n // Sanity will crash if you try and insert incompatible asset types into fields!\n const documentAssetTypes = assetTypes.map((type) => `sanity.${type}Asset`)\n\n const baseFilter = groq`\n _type in ${JSON.stringify(documentAssetTypes)} && !(_id in path(\"drafts.**\"))\n `\n\n const excludeTagsFragment = buildExcludeTagsFragment(excludeTagSlugs)\n\n const searchFacetFragments = searchFacets.reduce((acc: string[], facet) => {\n if (facet.type === 'number') {\n const {field, modifier, modifiers, operatorType, value} = facet\n const operator = operators[operatorType]\n\n // Get current modifier\n const currentModifier = modifiers?.find((m) => m.name === modifier)\n\n // Apply field modifier function (if present)\n const facetField = currentModifier?.fieldModifier\n ? currentModifier.fieldModifier(field)\n : field\n\n const fragment = operator.fn(value, facetField)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n if (facet.type === 'searchable') {\n const {field, operatorType, value} = facet\n const operator = operators[operatorType]\n\n const fragment = operator.fn(value?.value, field)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n if (facet.type === 'select') {\n const {field, operatorType, options, value} = facet\n const operator = operators[operatorType]\n\n const currentOptionValue = options?.find((l) => l.name === value)?.value\n\n const fragment = operator.fn(currentOptionValue, field)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n if (facet.type === 'string') {\n const {field, operatorType, value} = facet\n const operator = operators[operatorType]\n\n const fragment = operator.fn(value, field)\n if (fragment) {\n acc.push(fragment)\n }\n }\n\n return acc\n }, [])\n\n // All assets (no folder selected) should not apply a folder filter. A specific\n // folder shows only assets pointing at it.\n const folderFilter: string | undefined = currentFolderId\n ? `opt.media.folder._ref == ${JSON.stringify(currentFolderId)}`\n : undefined\n\n // Join separate filter fragments\n const constructedQuery = [\n // Base filter\n baseFilter,\n ...(excludeTagsFragment ? [excludeTagsFragment] : []),\n // Search query (if present)\n // NOTE: Currently this only searches direct fields on sanity.fileAsset/sanity.imageAsset and NOT referenced tags\n // It's possible to add this by adding the following line to the searchQuery, but it's quite slow\n // references(*[_type == \"media.tag\" && name.current == \"${searchQuery.trim()}\"]._id)\n ...(searchQuery\n ? [\n groq`[_id, altText, assetId, creditLine, description, originalFilename, title, url] match '*${searchQuery.trim()}*'`,\n ]\n : []),\n ...(folderFilter ? [folderFilter] : []),\n // Search facets\n ...searchFacetFragments,\n ].join(' && ')\n\n return constructedQuery\n}\n\nexport default constructFilter\n","import type {Asset} from '../types'\n\ntype AssetRef = {\n _ref?: unknown\n _type?: unknown\n}\n\ntype ImageNode = {\n _type?: unknown\n asset?: AssetRef\n}\n\n/**\n * Re-points every image asset in `document` that references `assetToReplaceId`\n * at `newAsset`, mutating the document in place, and returns one patch object\n * per affected top-level field in the form `{[field]: <full mutated field value>}`.\n *\n * Each patch carries the entire (mutated) top-level field value rather than just\n * the matched image node, so `client.patch().set()` updates the references\n * without discarding sibling data — including deeply nested image fields.\n *\n * NOTE: ported from sanity-plugin-media#236. Because of GROQ limitations the\n * matching image objects are filtered out of the document manually rather than\n * via a projection.\n */\nexport function findImageAssets(\n document: Record<string, unknown>,\n newAsset: Asset,\n assetToReplaceId: string,\n): Record<string, unknown>[] {\n const matchedTopLevelFields = new Set<string>()\n repointNestedImages(document, newAsset, assetToReplaceId, '', matchedTopLevelFields)\n return [...matchedTopLevelFields].map((field) => ({[field]: document[field]}))\n}\n\nfunction repointNestedImages(\n node: unknown,\n newAsset: Asset,\n assetToReplaceId: string,\n topLevelField: string,\n matchedTopLevelFields: Set<string>,\n): void {\n if (typeof node !== 'object' || node === null) {\n return\n }\n\n const candidate = node as ImageNode\n // Match built-in `image` nodes and custom image schema types (e.g. `mainImage`),\n // which store their type name in `_type` rather than `\"image\"`. Skip file fields.\n const assetRef = candidate.asset\n const hasMatchingAssetRef = assetRef?._type === 'reference' && assetRef._ref === assetToReplaceId\n if (hasMatchingAssetRef && candidate._type !== 'file' && assetRef) {\n assetRef._ref = newAsset._id\n if (topLevelField) {\n matchedTopLevelFields.add(topLevelField)\n }\n }\n\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n if (typeof value === 'object' && value !== null) {\n // Once we descend past the document root, keep attributing matches to the\n // top-level field so the patch replaces that whole field.\n repointNestedImages(\n value,\n newAsset,\n assetToReplaceId,\n topLevelField || key,\n matchedTopLevelFields,\n )\n }\n }\n}\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {from, Observable, of, throwError} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {HttpError} from '../types'\n\nconst checkTagName = (client: SanityClient, name: string) => {\n return function <T>(source: Observable<T>): Observable<boolean> {\n return source.pipe(\n mergeMap(() => {\n return from(\n client.fetch(groq`count(*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $name])`, {\n name,\n }),\n ) as Observable<number>\n }),\n mergeMap((existingTagCount: number) => {\n if (existingTagCount > 0) {\n return throwError(\n () =>\n ({\n message: 'Tag already exists',\n statusCode: 409,\n }) satisfies HttpError,\n )\n }\n\n return of(true)\n }),\n )\n }\n}\n\nexport default checkTagName\n","import type {TagSelectOption, TagItem} from '../types'\n\nconst getTagSelectOptions = (tags: TagItem[]): TagSelectOption[] => {\n return tags.reduce((acc: TagSelectOption[], val) => {\n const tag = val?.tag\n if (tag) {\n acc.push({\n label: tag?.name?.current,\n value: tag?._id,\n })\n }\n return acc\n }, [])\n}\n\nexport default getTagSelectOptions\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem, HttpError, Tag} from '../../types'\n\nexport const ASSETS_ACTIONS = {\n tagsAddComplete: createAction(\n 'actions/tagsAddComplete',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n tagsAddError: createAction(\n 'actions/tagsAddError',\n function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n return {payload: {assets, error, tag}}\n },\n ),\n tagsAddRequest: createAction(\n 'actions/tagsAddRequest',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n tagsRemoveComplete: createAction(\n 'actions/tagsRemoveComplete',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n tagsRemoveError: createAction(\n 'actions/tagsRemoveError',\n function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n return {payload: {assets, error, tag}}\n },\n ),\n tagsRemoveRequest: createAction(\n 'actions/tagsRemoveRequest',\n function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n return {payload: {assets, tag}}\n },\n ),\n}\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem} from '../../types'\n\nexport const DIALOG_ACTIONS = {\n showFolderCreate: createAction(\n 'dialog/showFolderCreate',\n function prepare({parentFolderId}: {parentFolderId?: string | null} = {}) {\n return {\n payload: {parentFolderId},\n }\n },\n ),\n showFolderMove: createAction(\n 'dialog/showFolderMove',\n function prepare({assets, folderId}: {assets: AssetItem[]; folderId?: string | null}) {\n return {\n payload: {assets, folderId},\n }\n },\n ),\n showFolderRename: createAction(\n 'dialog/showFolderRename',\n function prepare({folderId}: {folderId: string}) {\n return {\n payload: {folderId},\n }\n },\n ),\n showTagCreate: createAction('dialog/showTagCreate'),\n showTagEdit: createAction('dialog/showTagEdit', function prepare({tagId}: {tagId: string}) {\n return {\n payload: {tagId},\n }\n }),\n}\n","import {createSelector, createSlice, isAnyOf, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {from, Observable, of} from 'rxjs'\nimport {bufferTime, catchError, filter, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../../constants'\nimport checkTagName from '../../operators/checkTagName'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {Asset, HttpError, MyEpic, TagSelectOption, Tag, TagItem} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {DIALOG_ACTIONS} from '../dialog/actions'\nimport type {RootReducerState} from '../types'\n\ntype TagsReducerState = {\n allIds: string[]\n byIds: Record<string, TagItem>\n creating: boolean\n creatingError?: HttpError\n fetchCount: number\n fetching: boolean\n fetchingError?: HttpError\n // totalCount: number\n panelVisible: boolean\n}\n\nconst initialState = {\n allIds: [],\n byIds: {},\n creating: false,\n creatingError: undefined,\n fetchCount: -1,\n fetching: false,\n fetchingError: undefined,\n panelVisible: true,\n} as TagsReducerState\n\nconst tagsSlice = createSlice({\n name: 'tags',\n initialState,\n extraReducers: (builder) => {\n builder\n .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n delete state.creatingError\n })\n .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n const {tagId} = action.payload\n delete state.byIds[tagId]!.error\n })\n .addMatcher(\n isAnyOf(\n ASSETS_ACTIONS.tagsAddComplete,\n ASSETS_ACTIONS.tagsAddError,\n ASSETS_ACTIONS.tagsRemoveComplete,\n ASSETS_ACTIONS.tagsRemoveError,\n ),\n (state, action) => {\n const {tag} = action.payload\n state.byIds[tag._id]!.updating = false\n },\n )\n .addMatcher(\n isAnyOf(ASSETS_ACTIONS.tagsAddRequest, ASSETS_ACTIONS.tagsRemoveRequest),\n (state, action) => {\n const {tag} = action.payload\n state.byIds[tag._id]!.updating = true\n },\n )\n },\n reducers: {\n createComplete(state, action: PayloadAction<{assetId?: string; tag: Tag}>) {\n const {tag} = action.payload\n state.creating = false\n if (!state.allIds.includes(tag._id)) {\n state.allIds.push(tag._id)\n }\n state.byIds[tag._id] = {\n _type: 'tag',\n picked: false,\n tag,\n updating: false,\n }\n },\n createError(state, action: PayloadAction<{error: HttpError; name: string}>) {\n state.creating = false\n state.creatingError = action.payload.error\n },\n createRequest(state, _action: PayloadAction<{assetId?: string; name: string}>) {\n state.creating = true\n delete state.creatingError\n },\n deleteComplete(state, action: PayloadAction<{tagId: string}>) {\n const {tagId} = action.payload\n const deleteIndex = state.allIds.indexOf(tagId)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[tagId]\n },\n deleteError(state, action: PayloadAction<{error: HttpError; tag: Tag}>) {\n const {error, tag} = action.payload\n\n const tagId = tag?._id\n state.byIds[tagId]!.error = error\n state.byIds[tagId]!.updating = false\n },\n deleteRequest(state, action: PayloadAction<{tag: Tag}>) {\n const tagId = action.payload?.tag?._id\n state.byIds[tagId]!.picked = false\n state.byIds[tagId]!.updating = true\n\n Object.keys(state.byIds).forEach((key) => {\n delete state.byIds[key]!.error\n })\n },\n fetchComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n const {tags} = action.payload\n\n tags?.forEach((tag) => {\n state.allIds.push(tag._id)\n state.byIds[tag._id] = {\n _type: 'tag',\n picked: false,\n tag,\n updating: false,\n }\n })\n\n state.fetching = false\n state.fetchCount = tags.length || 0\n delete state.fetchingError\n },\n fetchError(state, action: PayloadAction<{error: HttpError}>) {\n const {error} = action.payload\n state.fetching = false\n state.fetchingError = error\n },\n fetchRequest: {\n reducer: (state, _action: PayloadAction<{query: string}>) => {\n state.fetching = true\n delete state.fetchingError\n },\n prepare: () => {\n // Construct query\n const query = groq`\n {\n \"items\": *[\n _type == \"${TAG_DOCUMENT_NAME}\"\n && !(_id in path(\"drafts.**\"))\n ] {\n _createdAt,\n _updatedAt,\n _id,\n _rev,\n _type,\n name\n } | order(name.current asc),\n }\n `\n return {payload: {query}}\n },\n },\n // Queue batch tag creation\n listenerCreateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n //\n },\n // Apply created tags (via sanity real-time events)\n listenerCreateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n const {tags} = action.payload\n\n tags?.forEach((tag) => {\n state.byIds[tag._id] = {\n _type: 'tag',\n picked: false,\n tag,\n updating: false,\n }\n if (!state.allIds.includes(tag._id)) {\n state.allIds.push(tag._id)\n }\n })\n },\n // Queue batch tag deletion\n listenerDeleteQueue(_state, _action: PayloadAction<{tagId: string}>) {\n //\n },\n // Apply deleted tags (via sanity real-time events)\n listenerDeleteQueueComplete(state, action: PayloadAction<{tagIds: string[]}>) {\n const {tagIds} = action.payload\n\n tagIds?.forEach((tagId) => {\n const deleteIndex = state.allIds.indexOf(tagId)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[tagId]\n })\n },\n // Queue batch tag updates\n listenerUpdateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n //\n },\n // Apply updated tags (via sanity real-time events)\n listenerUpdateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n const {tags} = action.payload\n\n tags?.forEach((tag) => {\n if (state.byIds[tag._id]) {\n state.byIds[tag._id]!.tag = tag\n }\n })\n },\n // Set tag panel visibility\n panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n const {panelVisible} = action.payload\n state.panelVisible = panelVisible\n },\n // Sort all tags by name\n sort(state) {\n state.allIds.sort((a, b) => {\n const tagA = state.byIds[a]!.tag.name.current\n const tagB = state.byIds[b]!.tag.name.current\n\n if (tagA < tagB) {\n return -1\n } else if (tagA > tagB) {\n return 1\n }\n return 0\n })\n },\n updateComplete(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n const {tag} = action.payload\n state.byIds[tag._id]!.tag = tag\n state.byIds[tag._id]!.updating = false\n },\n updateError(state, action: PayloadAction<{tag: Tag; error: HttpError}>) {\n const {error, tag} = action.payload\n const tagId = tag?._id\n state.byIds[tagId]!.error = error\n state.byIds[tagId]!.updating = false\n },\n updateRequest(\n state,\n action: PayloadAction<{\n closeDialogId?: string\n formData: Record<string, any>\n tag: Tag\n }>,\n ) {\n const {tag} = action.payload\n state.byIds[tag?._id]!.updating = true\n },\n },\n})\n\n// Epics\n\n// On tag create request:\n// - async check to see if tag already exists\n// - throw if tag already exists\n// - otherwise, create new tag\nexport const tagsCreateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.createRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assetId, name} = action.payload\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n checkTagName(client, name),\n mergeMap(() =>\n client.observable.create({\n _type: TAG_DOCUMENT_NAME,\n name: {\n _type: 'slug',\n current: name,\n },\n }),\n ),\n mergeMap((result) => of(tagsSlice.actions.createComplete({assetId, tag: result as Tag}))),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.createError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n name,\n }),\n ),\n ),\n )\n }),\n )\n\n// On tag delete request\n// - find referenced assets\n// - remove tag from referenced assets in a sanity transaction\nexport const tagsDeleteEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.deleteRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {tag} = action.payload\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Fetch assets which reference this tag\n mergeMap(() =>\n client.observable.fetch<Asset[]>(\n groq`*[\n _type in [\"sanity.fileAsset\", \"sanity.imageAsset\"]\n && references(*[_type == \"media.tag\" && name.current == $tagName]._id)\n ] {\n _id,\n _rev,\n opt\n }`,\n {tagName: tag.name.current},\n ),\n ),\n // Create transaction which remove tag references from all matched assets and delete tag\n mergeMap((assets) => {\n const patches = assets.map((asset) => ({\n id: asset._id,\n patch: {\n // this will cause the transaction to fail if the document has been modified since it was fetched.\n ifRevisionID: asset._rev,\n unset: [`opt.media.tags[_ref == \"${tag._id}\"]`],\n },\n }))\n\n const transaction: Transaction = patches.reduce(\n (tx, patch) => tx.patch(patch.id, patch.patch),\n client.transaction(),\n )\n\n transaction.delete(tag._id)\n\n return from(transaction.commit())\n }),\n // Dispatch complete action\n mergeMap(() => of(tagsSlice.actions.deleteComplete({tagId: tag._id}))),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.deleteError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n\n// Async fetch tags\nexport const tagsFetchEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action, state]) => {\n const {query} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Fetch tags\n mergeMap(() =>\n client.observable.fetch<{\n items: Tag[]\n }>(query),\n ),\n // Dispatch complete action\n mergeMap((result) => {\n const {items} = result\n return of(tagsSlice.actions.fetchComplete({tags: items}))\n }),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.fetchError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\n// TODO: merge all buffer epics\n// Buffer tag creation via sanity subscriber\nexport const tagsListenerCreateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsSlice.actions.listenerCreateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const tags = actions?.map((action) => action.payload.tag)\n return of(tagsSlice.actions.listenerCreateQueueComplete({tags}))\n }),\n )\n\n// TODO: merge all buffer epics\n// Buffer tag deletion via sanity subscriber\nexport const tagsListenerDeleteQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsSlice.actions.listenerDeleteQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const tagIds = actions?.map((action) => action.payload.tagId)\n return of(tagsSlice.actions.listenerDeleteQueueComplete({tagIds}))\n }),\n )\n\n// TODO: merge all buffer epics\n// Buffer tag update via sanity subscriber\nexport const tagsListenerUpdateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsSlice.actions.listenerUpdateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const tags = actions?.map((action) => action.payload.tag)\n return of(tagsSlice.actions.listenerUpdateQueueComplete({tags}))\n }),\n )\n\n// On successful tag creation or updates:\n// - Re-sort all tags\nexport const tagsSortEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n tagsSlice.actions.listenerCreateQueueComplete.type,\n tagsSlice.actions.listenerUpdateQueueComplete.type,\n ),\n bufferTime(1000),\n filter((actions) => actions.length > 0),\n mergeMap(() => of(tagsSlice.actions.sort())),\n )\n\n// On tag update request\n// - check if tag name already exists\n// - throw if tag already exists\n// - otherwise, patch document\nexport const tagsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(tagsSlice.actions.updateRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {closeDialogId, formData, tag} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Check if tag name is available, throw early if not\n checkTagName(client, formData?.['name']?.current),\n // Patch document (Update tag)\n mergeMap(\n () =>\n from(\n client\n .patch(tag._id)\n .set({name: {_type: 'slug', current: formData?.['name'].current}})\n .commit(),\n ) as Observable<Tag>,\n ),\n // Dispatch complete action\n mergeMap((updatedTag: Tag) => {\n return of(\n tagsSlice.actions.updateComplete({\n closeDialogId,\n tag: updatedTag,\n }),\n )\n }),\n catchError((error: ClientError) =>\n of(\n tagsSlice.actions.updateError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n\n// Selectors\n\nconst selectTagsByIds = (state: RootReducerState) => state.tags.byIds\n\nconst selectTagsAllIds = (state: RootReducerState) => state.tags.allIds\n\nexport const selectTags: Selector<RootReducerState, TagItem[]> = createSelector(\n [selectTagsByIds, selectTagsAllIds],\n (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectTagById = createSelector(\n [selectTagsByIds, (_state: RootReducerState, tagId: string) => tagId],\n (byIds, tagId) => byIds[tagId],\n)\n\n// TODO: use createSelector\n// Map tag references to react-select options, skipping over items with no linked tags\nexport const selectTagSelectOptions =\n (asset?: Asset) =>\n (state: RootReducerState): TagSelectOption[] | null => {\n const tags = asset?.opt?.media?.tags?.reduce((acc: TagItem[], v) => {\n const tagItem = state.tags.byIds[v._ref]\n if (tagItem?.tag) {\n acc.push(tagItem)\n }\n return acc\n }, [])\n\n if (tags && tags?.length > 0) {\n return getTagSelectOptions(tags)\n }\n\n return null\n }\n\nexport const tagsActions = {...tagsSlice.actions}\n\nexport default tagsSlice.reducer\n","import {type PayloadAction, createSelector, createSlice} from '@reduxjs/toolkit'\nimport {uuid} from '@sanity/uuid'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap, withLatestFrom} from 'rxjs/operators'\n\nimport type {MyEpic, SearchFacetInputProps, SearchFacetOperatorType, WithId} from '../../types'\nimport {tagsActions} from '../tags'\nimport type {RootReducerState} from '../types'\n\n// TODO: don't store non-serializable data in the search store\n// (The main offender is `fieldModifier` which is currently a function)\n\ntype SearchState = {\n facets: WithId<SearchFacetInputProps>[]\n query: string\n}\n\nconst initialState = {\n facets: [],\n query: '',\n} as SearchState\n\nconst searchSlice = createSlice({\n name: 'search',\n initialState,\n reducers: {\n // Add search facet\n facetsAdd(state, action: PayloadAction<{facet: SearchFacetInputProps}>) {\n state.facets.push({...action.payload.facet, id: uuid()})\n },\n // Clear all search facets\n facetsClear(state) {\n state.facets = []\n },\n // Remove search facet by name\n facetsRemoveByName(state, action: PayloadAction<{facetName: string}>) {\n state.facets = state.facets.filter((facet) => facet.name !== action.payload.facetName)\n },\n // Remove search facet by name\n facetsRemoveByTag(state, action: PayloadAction<{tagId: string}>) {\n state.facets = state.facets.filter(\n (facet) =>\n !(\n facet.name === 'tag' &&\n facet.type === 'searchable' &&\n (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n facet.value?.value === action.payload.tagId\n ),\n )\n },\n // Remove search facet by name\n facetsRemoveById(state, action: PayloadAction<{facetId: string}>) {\n state.facets = state.facets.filter((facet) => facet.id !== action.payload.facetId)\n },\n // Update an existing search facet\n facetsUpdate(\n state,\n action: PayloadAction<{\n modifier?: string\n name: string\n operatorType?: SearchFacetOperatorType\n value?: any // TODO: type correctly\n }>,\n ) {\n const {modifier, name, operatorType, value} = action.payload\n\n const facet = state.facets.find((f) => f.name === name)\n\n if (!facet) {\n return\n }\n\n if (facet.type === 'number' && modifier) {\n facet.modifier = modifier\n }\n if (operatorType) {\n facet.operatorType = operatorType\n }\n if (typeof value !== 'undefined') {\n facet.value = value\n }\n\n state.facets = state.facets.filter((f) => f.name !== facet.name || f.id === facet.id)\n },\n // Update an existing search facet\n facetsUpdateById(\n state,\n action: PayloadAction<{\n modifier?: string\n id: string\n operatorType?: SearchFacetOperatorType\n value?: any // TODO: type correctly\n }>,\n ) {\n const {modifier, id, operatorType, value} = action.payload\n\n state.facets.forEach((facet, index) => {\n if (facet.id === id) {\n if (facet.type === 'number' && modifier) {\n facet.modifier = modifier\n }\n if (operatorType) {\n facet.operatorType = operatorType\n }\n if (typeof value !== 'undefined') {\n state.facets[index]!.value = value\n }\n }\n })\n },\n // Update existing search query\n querySet(state, action: PayloadAction<{searchQuery: string}>) {\n state.query = action.payload?.searchQuery\n },\n },\n})\n\n// Epics\n\n// On tag update success -> update existing tag search facet (if present)\nexport const searchFacetTagUpdateEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(tagsActions.updateComplete.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {tag} = action.payload\n\n const currentSearchFacetTag = state.search.facets?.find((facet) => facet.name === 'tag')\n const tagItem = state.tags.byIds[tag._id]\n\n if (currentSearchFacetTag?.type === 'searchable') {\n if (currentSearchFacetTag.value?.value === tag._id) {\n return of(\n searchSlice.actions.facetsUpdate({\n name: 'tag',\n value: {\n label: tagItem?.tag?.name?.current,\n value: tagItem?.tag?._id,\n },\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n// Selectors\nexport const selectIsSearchFacetTag = createSelector(\n [\n (state: RootReducerState) => state.search.facets,\n (_state: RootReducerState, tagId: string) => tagId,\n ],\n (searchFacets, tagId) =>\n searchFacets.some(\n (facet) =>\n facet.name === 'tag' &&\n facet.type === 'searchable' &&\n (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n facet.value?.value === tagId,\n ),\n)\n\nexport const searchActions = {...searchSlice.actions}\n\nexport default searchSlice.reducer\n","import {createAction} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\n\nexport const UPLOADS_ACTIONS = {\n uploadComplete: createAction(\n 'uploads/uploadComplete',\n function prepare({asset}: {asset: SanityAssetDocument | SanityImageAssetDocument}) {\n return {\n payload: {asset},\n }\n },\n ),\n}\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {AttributeSet, ClientError, Patch, SanityDocument, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, from, of} from 'rxjs'\nimport {\n bufferTime,\n catchError,\n concatMap,\n debounceTime,\n filter,\n mergeMap,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {\n Asset,\n AssetItem,\n AssetType,\n BrowserView,\n HttpError,\n MyEpic,\n Order,\n OrderDirection,\n Tag,\n} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {findImageAssets} from '../../utils/ReplaceImages'\nimport {searchActions} from '../search'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\nimport {ASSETS_ACTIONS} from './actions'\ntype ItemError = {\n description: string\n id: string\n referencingIDs: string[]\n type: string // 'documentHasExistingReferencesError'\n}\n\nexport type AssetsReducerState = {\n allIds: string[]\n assetTypes: AssetType[]\n byIds: Record<string, AssetItem>\n excludeTagSlugs: string[]\n fetchCount: number\n fetching: boolean\n fetchingError?: HttpError\n lastPicked?: string\n order: Order\n pageIndex: number\n pageSize: number\n view: BrowserView\n // totalCount: number\n}\n\nconst defaultOrder = ORDER_OPTIONS[0] as {\n direction: OrderDirection\n field: string\n}\n\n/**\n * NOTE:\n * `fetchCount` returns the number of items retrieved in the most recent fetch.\n * This is a temporary workaround to be able to determine when there are no more items to retrieve.\n * Typically this would be done by deriving the total number of assets upfront, but currently such\n * queries in GROQ aren't fast enough to use on large datasets (1000s of entries).\n *\n * TODO:\n * When the query engine has been improved and above queries are faster, remove all instances of\n * of `fetchCount` and reinstate `totalCount` across the board.\n */\n\nexport const initialState = {\n allIds: [],\n assetTypes: [],\n byIds: {},\n excludeTagSlugs: [],\n fetchCount: -1,\n fetching: false,\n fetchingError: undefined,\n lastPicked: undefined,\n order: {\n direction: defaultOrder.direction,\n field: defaultOrder.field,\n title: getOrderTitle(defaultOrder.field, defaultOrder.direction),\n },\n pageIndex: 0,\n pageSize: 100,\n // totalCount: -1,\n view: 'grid',\n} as AssetsReducerState\n\nconst assetsSlice = createSlice({\n name: 'assets',\n initialState,\n extraReducers: (builder) => {\n builder //\n .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n const {asset} = action.payload\n\n state.byIds[asset._id] = {\n _type: 'asset',\n asset: asset as Asset,\n picked: false,\n updating: false,\n }\n })\n .addCase(ASSETS_ACTIONS.tagsAddComplete, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsAddError, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsAddRequest, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = true\n })\n })\n .addCase(ASSETS_ACTIONS.tagsRemoveComplete, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsRemoveError, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = false\n })\n })\n .addCase(ASSETS_ACTIONS.tagsRemoveRequest, (state, action) => {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset.asset._id]!.updating = true\n })\n })\n },\n reducers: {\n // Clear asset order\n clear(state) {\n state.allIds = []\n },\n // Remove assets and update page index\n deleteComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n const {assetIds} = action.payload\n\n assetIds?.forEach((id) => {\n const deleteIndex = state.allIds.indexOf(id)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[id]\n })\n\n state.pageIndex = Math.floor(state.allIds.length / state.pageSize) - 1\n },\n deleteError(state, action: PayloadAction<{assetIds: string[]; error: ClientError}>) {\n const {assetIds, error} = action.payload\n const itemErrors: ItemError[] = error?.response?.body?.error?.items?.map(\n (item: any) => item.error,\n )\n\n assetIds?.forEach((id) => {\n state.byIds[id]!.updating = false\n })\n itemErrors?.forEach((item) => {\n state.byIds[item.id]!.error = item.description\n })\n },\n deleteRequest(state, action: PayloadAction<{assets: Asset[]; closeDialogId?: string}>) {\n const {assets} = action.payload\n assets.forEach((asset) => {\n state.byIds[asset?._id]!.updating = true\n })\n\n Object.keys(state.byIds).forEach((key) => {\n delete state.byIds[key]!.error\n })\n },\n fetchComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n const assets = action.payload?.assets || []\n\n if (assets) {\n assets.forEach((asset) => {\n if (!state.allIds.includes(asset._id)) {\n state.allIds.push(asset._id)\n }\n const existing = state.byIds[asset._id]\n // Preserve pick/updating across search refreshes (e.g. replace dialog clearing filters)\n state.byIds[asset._id] = {\n _type: 'asset',\n asset: asset,\n picked: existing?.picked ?? false,\n updating: existing?.updating ?? false,\n ...(existing?.error ? {error: existing.error} : {}),\n }\n })\n }\n\n state.fetching = false\n state.fetchCount = assets.length || 0\n delete state.fetchingError\n },\n fetchError(state, action: PayloadAction<HttpError>) {\n const error = action.payload\n state.fetching = false\n state.fetchingError = error\n },\n folderSetComplete(\n state,\n action: PayloadAction<{assetIds: string[]; folderId: string | null; closeDialogId?: string}>,\n ) {\n const {assetIds, folderId} = action.payload\n\n assetIds.forEach((assetId) => {\n if (state.byIds[assetId]?.asset) {\n state.byIds[assetId].asset.opt = state.byIds[assetId].asset.opt || {}\n state.byIds[assetId].asset.opt.media = state.byIds[assetId].asset.opt.media || {}\n state.byIds[assetId].asset.opt.media.folder = folderId\n ? {_ref: folderId, _type: 'reference', _weak: true}\n : undefined\n state.byIds[assetId].updating = false\n }\n })\n },\n folderSetError(state, action: PayloadAction<{assetIds: string[]; error: HttpError}>) {\n const {assetIds, error} = action.payload\n\n assetIds.forEach((assetId) => {\n if (state.byIds[assetId]) {\n state.byIds[assetId].error = error.message\n state.byIds[assetId].updating = false\n }\n })\n },\n folderSetRequest(\n state,\n action: PayloadAction<{\n assets: AssetItem[]\n folderId: string | null\n closeDialogId?: string\n }>,\n ) {\n action.payload.assets.forEach((asset) => {\n const item = state.byIds[asset.asset._id]\n if (item) {\n item.updating = true\n }\n })\n },\n fetchRequest: {\n reducer: (state, _action: PayloadAction<{params: Record<string, any>; query: string}>) => {\n state.fetching = true\n delete state.fetchingError\n },\n prepare: ({\n params = {},\n queryFilter,\n selector = ``,\n sort = groq`order(_updatedAt desc)`,\n }: {\n params?: Record<string, any>\n queryFilter: string\n replace?: boolean\n selector?: string\n sort?: string\n }) => {\n const pipe = sort || selector ? '|' : ''\n\n // Construct query\n const query = groq`\n {\n \"items\": *[${queryFilter}] {\n _id,\n _type,\n _createdAt,\n _updatedAt,\n altText,\n creditLine,\n description,\n extension,\n metadata {\n dimensions,\n exif,\n image,\n isOpaque,\n },\n mimeType,\n opt {\n media\n },\n originalFilename,\n size,\n source {\n name,\n id,\n url,\n },\n title,\n url\n } ${pipe} ${sort} ${selector},\n }\n `\n\n return {payload: {params, query}}\n },\n },\n insertUploads(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n const {results} = action.payload\n\n Object.entries(results).forEach(([hash, assetId]) => {\n if (assetId && !state.allIds.includes(hash)) {\n state.allIds.push(assetId)\n }\n })\n },\n listenerCreateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n //\n },\n listenerCreateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n const {assets} = action.payload\n assets?.forEach((asset) => {\n if (state.byIds[asset?._id]?.asset) {\n state.byIds[asset._id]!.asset = asset\n }\n })\n },\n listenerDeleteQueue(_state, _action: PayloadAction<{assetId: string}>) {\n //\n },\n listenerDeleteQueueComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n const {assetIds} = action.payload\n assetIds?.forEach((assetId) => {\n const deleteIndex = state.allIds.indexOf(assetId)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[assetId]\n })\n },\n listenerUpdateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n //\n },\n listenerUpdateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n const {assets} = action.payload\n assets?.forEach((asset) => {\n if (state.byIds[asset?._id]?.asset) {\n state.byIds[asset._id]!.asset = asset\n }\n })\n },\n loadNextPage() {\n //\n },\n loadPageIndex(state, action: PayloadAction<{pageIndex: number}>) {\n //\n state.pageIndex = action.payload.pageIndex\n },\n orderSet(state, action: PayloadAction<{order: Order}>) {\n state.order = action.payload?.order\n state.pageIndex = 0\n },\n pick(state, action: PayloadAction<{assetId: string; picked: boolean}>) {\n const {assetId, picked} = action.payload\n const item = state.byIds[assetId]\n if (!item) {\n return\n }\n\n item.picked = picked\n state.lastPicked = picked ? assetId : undefined\n },\n pickAll(state) {\n state.allIds.forEach((id) => {\n state.byIds[id]!.picked = true\n })\n },\n pickClear(state) {\n state.lastPicked = undefined\n Object.values(state.byIds).forEach((asset) => {\n state.byIds[asset.asset._id]!.picked = false\n })\n },\n pickRange(state, action: PayloadAction<{endId: string; startId: string}>) {\n const startIndex = state.allIds.findIndex((id) => id === action.payload.startId)\n const endIndex = state.allIds.findIndex((id) => id === action.payload.endId)\n\n // Sort numerically, ascending order\n const indices = [startIndex, endIndex].sort((a, b) => a - b)\n\n state.allIds.slice(indices[0], indices[1]! + 1).forEach((key) => {\n state.byIds[key]!.picked = true\n })\n state.lastPicked = state.allIds[endIndex]\n },\n sort(state) {\n state.allIds.sort((a, b) => {\n const tagA = state.byIds[a]!.asset[state.order.field]\n const tagB = state.byIds[b]!.asset[state.order.field]\n\n if (tagA < tagB) {\n return state.order.direction === 'asc' ? -1 : 1\n } else if (tagA > tagB) {\n return state.order.direction === 'asc' ? 1 : -1\n }\n return 0\n })\n },\n updateComplete(state, action: PayloadAction<{asset: Asset; closeDialogId?: string}>) {\n const {asset} = action.payload\n state.byIds[asset._id]!.updating = false\n state.byIds[asset._id]!.asset = asset\n },\n updateError(state, action: PayloadAction<{asset: Asset; error: HttpError}>) {\n const {asset, error} = action.payload\n\n const assetId = asset?._id\n state.byIds[assetId]!.error = error.message\n state.byIds[assetId]!.updating = false\n },\n updateImageReferences(state, action: PayloadAction<{asset: Asset; id: string}>) {\n const {id: assetId} = action.payload\n const item = state.byIds[assetId]\n if (!item) {\n return\n }\n item.updating = true\n delete item.error\n },\n updateImageReferencesComplete(state, action: PayloadAction<{id: string}>) {\n const {id} = action.payload\n const item = state.byIds[id]\n if (!item) {\n return\n }\n item.updating = false\n delete item.error\n },\n updateRequest(\n state,\n action: PayloadAction<{asset: Asset; closeDialogId?: string; formData: Record<string, any>}>,\n ) {\n const assetId = action.payload?.asset?._id\n state.byIds[assetId]!.updating = true\n },\n viewSet(state, action: PayloadAction<{view: BrowserView}>) {\n state.view = action.payload?.view\n },\n },\n})\n\n// Epics\n\nexport const assetsDeleteEpic: MyEpic = (action$, _state$, {client}) =>\n action$.pipe(\n filter(assetsActions.deleteRequest.match),\n mergeMap((action) => {\n const {assets} = action.payload\n const assetIds = assets.map((asset) => asset._id)\n return of(assets).pipe(\n mergeMap(() =>\n client.observable.delete({\n query: groq`*[_id in ${JSON.stringify(assetIds)}]`,\n }),\n ),\n mergeMap(() => of(assetsActions.deleteComplete({assetIds}))),\n catchError((error: ClientError) => {\n return of(assetsActions.deleteError({assetIds, error}))\n }),\n )\n }),\n )\n\nexport const assetsFetchEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action, state]) => {\n const params = action.payload?.params\n const query = action.payload?.query\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() =>\n client.observable.fetch<{\n items: Asset[]\n }>(query, params),\n ),\n mergeMap((result) => {\n const {\n items,\n // totalCount\n } = result\n return of(assetsActions.fetchComplete({assets: items}))\n }),\n catchError((error: ClientError) =>\n of(\n assetsActions.fetchError({\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n }),\n ),\n ),\n )\n }),\n )\n\nexport const assetsFetchPageIndexEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(assetsActions.loadPageIndex.match),\n withLatestFrom(state$),\n switchMap(([action, state]) => {\n const pageSize = state.assets.pageSize\n const start = action.payload.pageIndex * pageSize\n const end = start + pageSize\n\n // Document ID can be null when operating on pristine / unsaved drafts\n const documentId = state?.selected.document?._id\n const documentAssetIds = state?.selected?.documentAssetIds\n\n const constructedFilter = constructFilter({\n assetTypes: state.assets.assetTypes,\n currentFolderId: state.folders.currentFolderId,\n excludeTagSlugs: state.assets.excludeTagSlugs,\n searchFacets: state.search.facets,\n searchQuery: state.search.query,\n })\n\n const params = {\n ...(documentId ? {documentId} : {}),\n documentAssetIds,\n }\n\n return of(\n assetsActions.fetchRequest({\n params,\n queryFilter: constructedFilter,\n selector: groq`[${start}...${end}]`,\n sort: groq`order(${state.assets?.order?.field} ${state.assets?.order?.direction})`,\n }),\n )\n }),\n )\n\nexport const assetsFetchNextPageEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(assetsActions.loadNextPage.match),\n withLatestFrom(state$),\n switchMap(([_action, state]) =>\n of(assetsActions.loadPageIndex({pageIndex: state.assets.pageIndex + 1})),\n ),\n )\n\nexport const assetsFetchAfterDeleteAllEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(assetsActions.deleteComplete.match),\n withLatestFrom(state$),\n switchMap(([_action, state]) => {\n if (state.assets.allIds.length === 0) {\n const nextPageIndex = Math.floor(state.assets.allIds.length / state.assets.pageSize)\n return of(assetsActions.loadPageIndex({pageIndex: nextPageIndex}))\n }\n\n return EMPTY\n }),\n )\n\nconst filterAssetWithoutTag = (tag: Tag) => (asset: AssetItem) => {\n const tagIndex = asset?.asset?.opt?.media?.tags?.findIndex((t) => t._ref === tag?._id) ?? -1\n return tagIndex < 0\n}\n\nconst patchOperationTagAppend =\n ({tag}: {tag: Tag}) =>\n (patch: Patch) =>\n patch\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .setIfMissing({'opt.media.tags': []})\n .append('opt.media.tags', [{_key: nanoid(), _ref: tag?._id, _type: 'reference', _weak: true}])\n\nconst patchOperationTagUnset =\n ({asset, tag}: {asset: AssetItem; tag: Tag}) =>\n (patch: Patch) =>\n patch.ifRevisionId(asset?.asset?._rev).unset([`opt.media.tags[_ref == \"${tag._id}\"]`])\n\nconst patchOperationFolderSet =\n ({asset, folderId}: {asset: AssetItem; folderId: string | null}) =>\n (patch: Patch) => {\n const nextPatch = patch.ifRevisionId(asset?.asset?._rev).setIfMissing({opt: {}}).setIfMissing({\n 'opt.media': {},\n })\n\n if (folderId) {\n return nextPatch.set({\n 'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n })\n }\n\n return nextPatch.unset(['opt.media.folder'])\n }\n\nexport const assetsOrderSetEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.orderSet.match),\n mergeMap(() => {\n return of(\n assetsActions.clear(), //\n assetsActions.loadPageIndex({pageIndex: 0}),\n )\n }),\n )\n\nexport const assetsSearchEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n searchActions.facetsAdd.type,\n searchActions.facetsClear.type,\n searchActions.facetsRemoveById.type,\n searchActions.facetsRemoveByName.type,\n searchActions.facetsRemoveByTag.type,\n searchActions.facetsUpdate.type,\n searchActions.facetsUpdateById.type,\n searchActions.querySet.type,\n ),\n debounceTime(400),\n mergeMap(() => {\n return of(\n assetsActions.clear(), //\n assetsActions.loadPageIndex({pageIndex: 0}),\n )\n }),\n )\n\nexport const assetsListenerCreateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.listenerCreateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const assets = actions?.map((action) => action.payload.asset)\n return of(assetsActions.listenerCreateQueueComplete({assets}))\n }),\n )\n\nexport const assetsListenerDeleteQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.listenerDeleteQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const assetIds = actions?.map((action) => action.payload.assetId)\n return of(assetsActions.listenerDeleteQueueComplete({assetIds}))\n }),\n )\n\nexport const assetsListenerUpdateQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.listenerUpdateQueue.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const assets = actions?.map((action) => action.payload.asset)\n return of(assetsActions.listenerUpdateQueueComplete({assets}))\n }),\n )\n\n// Re-sort on all updates (immediate and batched listener events)\nexport const assetsSortEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.insertUploads.type,\n assetsActions.listenerUpdateQueueComplete.type,\n assetsActions.updateComplete.type,\n ),\n mergeMap(() => of(assetsActions.sort())),\n )\n\nexport const assetsTagsAddEpic: MyEpic = (action$, state$, {client}) => {\n return action$.pipe(\n filter(ASSETS_ACTIONS.tagsAddRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets, tag} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Add tag references to all picked assets\n mergeMap(() => {\n const pickedAssets = selectAssetsPicked(state)\n\n // Filter out picked assets which already include tag\n const pickedAssetsFiltered = pickedAssets?.filter(filterAssetWithoutTag(tag))\n\n const transaction: Transaction = pickedAssetsFiltered.reduce(\n (tx, pickedAsset) => tx.patch(pickedAsset?.asset?._id, patchOperationTagAppend({tag})),\n client.transaction(),\n )\n\n return from(transaction.commit())\n }),\n // Dispatch complete action\n mergeMap(() => of(ASSETS_ACTIONS.tagsAddComplete({assets, tag}))),\n catchError((error: ClientError) =>\n of(\n ASSETS_ACTIONS.tagsAddError({\n assets,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n}\n\nexport const assetsTagsRemoveEpic: MyEpic = (action$, state$, {client}) => {\n return action$.pipe(\n filter(ASSETS_ACTIONS.tagsRemoveRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets, tag} = action.payload\n\n return of(action).pipe(\n // Optionally throttle\n debugThrottle(state.debug.badConnection),\n // Remove tag references from all picked assets\n mergeMap(() => {\n const pickedAssets = selectAssetsPicked(state)\n\n const transaction: Transaction = pickedAssets.reduce(\n (tx, pickedAsset) =>\n tx.patch(pickedAsset?.asset?._id, patchOperationTagUnset({asset: pickedAsset, tag})),\n client.transaction(),\n )\n\n return from(transaction.commit())\n }),\n // Dispatch complete action\n mergeMap(() => of(ASSETS_ACTIONS.tagsRemoveComplete({assets, tag}))),\n catchError((error: ClientError) =>\n of(\n ASSETS_ACTIONS.tagsRemoveError({\n assets,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n tag,\n }),\n ),\n ),\n )\n }),\n )\n}\n\nexport const assetsFolderSetEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.folderSetRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets, closeDialogId, folderId} = action.payload\n const assetIds = assets.map((asset) => asset.asset._id)\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => {\n const transaction: Transaction = assets.reduce(\n (tx, asset) => tx.patch(asset.asset._id, patchOperationFolderSet({asset, folderId})),\n client.transaction(),\n )\n\n return from(transaction.commit())\n }),\n mergeMap(() =>\n of(\n assetsActions.folderSetComplete({\n assetIds,\n closeDialogId,\n folderId,\n }),\n ),\n ),\n catchError((error: ClientError) =>\n of(\n assetsActions.folderSetError({\n assetIds,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nexport const assetsFolderSetRefreshEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.folderSetComplete.match),\n mergeMap(() =>\n of(\n assetsActions.pickClear(),\n assetsActions.clear(),\n assetsActions.loadPageIndex({pageIndex: 0}),\n ),\n ),\n )\n\nexport const assetsUnpickEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.orderSet.type,\n assetsActions.viewSet.type,\n searchActions.facetsAdd.type,\n searchActions.facetsClear.type,\n searchActions.facetsRemoveById.type,\n searchActions.facetsRemoveByName.type,\n searchActions.facetsRemoveByTag.type,\n searchActions.facetsUpdate.type,\n searchActions.facetsUpdateById.type,\n searchActions.querySet.type,\n ),\n mergeMap(() => {\n return of(assetsActions.pickClear())\n }),\n )\n\nexport const assetsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.updateRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {asset, closeDialogId, formData} = action.payload\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() =>\n from(\n client\n .patch(asset._id)\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .set(formData)\n .commit(),\n ),\n ),\n mergeMap((updatedAsset: any) =>\n of(\n assetsActions.updateComplete({\n asset: updatedAsset,\n closeDialogId,\n }),\n ),\n ),\n catchError((error: ClientError) =>\n of(\n assetsActions.updateError({\n asset,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nexport const assetsUpdateImageReferencesEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(assetsActions.updateImageReferences.match),\n withLatestFrom(state$),\n // Queue replaces so a later action still runs (exhaustMap would drop it after\n // the reducer already set `updating`, leaving a stuck spinner). Same-asset\n // double-clicks are blocked in the UI when the original is already updating.\n concatMap(([action, state]) => {\n const {asset, id} = action.payload\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => client.observable.fetch<SanityDocument[]>(groq`*[references($id)]`, {id})),\n mergeMap((documents) => {\n // Patch every referencing document in one transaction so we never leave\n // references split across old/new assets if a later commit would fail.\n let patchedCount = 0\n const transaction: Transaction = documents.reduce((tx, document) => {\n const clonedDocument = JSON.parse(JSON.stringify(document)) as Record<string, unknown>\n const assetsToReplace = findImageAssets(clonedDocument, asset, id)\n if (assetsToReplace.length === 0) {\n return tx\n }\n patchedCount += 1\n const patchSet = Object.assign({}, ...assetsToReplace) as AttributeSet\n return tx.patch(document._id, (patch) =>\n patch.ifRevisionId(document._rev).set(patchSet),\n )\n }, client.transaction())\n\n if (patchedCount === 0) {\n return of(assetsActions.updateImageReferencesComplete({id}))\n }\n\n return from(transaction.commit()).pipe(\n mergeMap(() => of(assetsActions.updateImageReferencesComplete({id}))),\n )\n }),\n catchError((error: ClientError) => {\n // The asset marked as `updating` is the original (being replaced), keyed\n // by `id` — not the replacement `asset` that was clicked. Attach the error\n // to (and clear the spinner on) the original asset.\n const originalAsset = state.assets.byIds[id]?.asset ?? asset\n return of(\n assetsActions.updateError({\n asset: originalAsset,\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n )\n }),\n )\n }),\n )\n\n// Selectors\n\nconst selectAssetsByIds = (state: RootReducerState) => state.assets.byIds\n\nconst selectAssetsAllIds = (state: RootReducerState) => state.assets.allIds\n\nexport const selectAssetById = createSelector(\n [\n (state: RootReducerState) => state.assets.byIds,\n (_state: RootReducerState, assetId: string) => assetId,\n ],\n (byIds, assetId) => {\n const asset = byIds[assetId]\n return asset ? asset : undefined\n },\n)\n\nconst selectAssets: Selector<RootReducerState, AssetItem[]> = createSelector(\n [selectAssetsByIds, selectAssetsAllIds],\n (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectAssetsLength = createSelector([selectAssets], (assets) => assets.length)\n\nexport const selectAssetsPicked = createSelector([selectAssets], (assets) =>\n assets.filter((item) => item?.picked),\n)\n\nexport const selectAssetsPickedLength = createSelector(\n [selectAssetsPicked],\n (assetsPicked) => assetsPicked.length,\n)\n\nexport const assetsActions = {...assetsSlice.actions}\n\nexport default assetsSlice.reducer\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Patch} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport {from, of} from 'rxjs'\nimport {\n catchError,\n debounceTime,\n filter,\n map,\n mergeMap,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators'\n\nimport {FOLDER_DOCUMENT_NAME} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {FolderDoc, FolderTreeItem, FolderTreeNode, HttpError, MyEpic} from '../../types'\nimport {buildExcludeTagsFragment} from '../../utils/constructFilter'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\n\ntype FoldersReducerState = {\n byId: Record<string, FolderDoc>\n childrenByParentId: Record<string, string[]>\n rootIds: string[]\n exactCountByFolderId: Record<string, number>\n unfiledCount: number\n currentFolderId: string | null\n currentFolderUnfiled: boolean\n panelVisible: boolean\n fetching: boolean\n fetchCount: number\n fetchingError?: HttpError\n creating: boolean\n creatingError?: HttpError\n deletingId?: string\n deleteError?: HttpError\n renaming: boolean\n renameError?: HttpError\n}\n\nconst initialState: FoldersReducerState = {\n byId: {},\n childrenByParentId: {},\n rootIds: [],\n exactCountByFolderId: {},\n unfiledCount: 0,\n currentFolderId: null,\n currentFolderUnfiled: false,\n panelVisible: false,\n fetching: false,\n fetchCount: -1,\n fetchingError: undefined,\n creating: false,\n creatingError: undefined,\n deletingId: undefined,\n deleteError: undefined,\n renaming: false,\n renameError: undefined,\n}\n\nconst indexFolders = (folders: FolderDoc[]) => {\n const byId: Record<string, FolderDoc> = {}\n const childrenByParentId: Record<string, string[]> = {}\n const rootIds: string[] = []\n\n folders.forEach((folder) => {\n byId[folder._id] = folder\n })\n\n // Resolve parent ids that reference unknown folders to null (defensive — orphan folders surface at root).\n folders.forEach((folder) => {\n const parentKey = folder.parentId && byId[folder.parentId] ? folder.parentId : null\n if (parentKey === null) {\n rootIds.push(folder._id)\n } else {\n if (!childrenByParentId[parentKey]) {\n childrenByParentId[parentKey] = []\n }\n childrenByParentId[parentKey].push(folder._id)\n }\n })\n\n const sortByName = (ids: string[]) =>\n ids.sort((a, b) =>\n (byId[a]?.name || '').localeCompare(byId[b]?.name || '', undefined, {\n numeric: true,\n sensitivity: 'base',\n }),\n )\n\n sortByName(rootIds)\n Object.values(childrenByParentId).forEach((ids) => sortByName(ids))\n\n return {byId, childrenByParentId, rootIds}\n}\n\nconst foldersSlice = createSlice({\n name: 'folders',\n initialState,\n reducers: {\n createComplete(state, _action: PayloadAction<{folder: FolderDoc}>) {\n state.creating = false\n },\n createError(state, action: PayloadAction<{error: HttpError}>) {\n state.creating = false\n state.creatingError = action.payload.error\n },\n createRequest(state, _action: PayloadAction<{name: string; parentId?: string | null}>) {\n state.creating = true\n delete state.creatingError\n },\n currentFolderClear(state) {\n state.currentFolderId = null\n state.currentFolderUnfiled = false\n },\n currentFolderSet(state, action: PayloadAction<{folderId: string}>) {\n state.currentFolderId = action.payload.folderId\n state.currentFolderUnfiled = false\n },\n currentFolderShowUnfiled(state) {\n state.currentFolderId = null\n state.currentFolderUnfiled = true\n },\n deleteComplete(\n state,\n action: PayloadAction<{\n folderId: string\n deletedIds: string[]\n clearedCurrentFolder?: boolean\n }>,\n ) {\n state.deletingId = undefined\n const removed = new Set(action.payload.deletedIds)\n if (state.currentFolderId && removed.has(state.currentFolderId)) {\n state.currentFolderId = null\n state.currentFolderUnfiled = false\n }\n },\n deleteError(state, action: PayloadAction<{error: HttpError; folderId: string}>) {\n state.deletingId = undefined\n state.deleteError = action.payload.error\n },\n deleteRequest(state, action: PayloadAction<{folderId: string}>) {\n state.deletingId = action.payload.folderId\n delete state.deleteError\n },\n fetchComplete(\n state,\n action: PayloadAction<{\n folders: FolderDoc[]\n exactCountByFolderId: Record<string, number>\n unfiledCount: number\n clearedCurrentFolder?: boolean\n }>,\n ) {\n const {byId, childrenByParentId, rootIds} = indexFolders(action.payload.folders)\n state.byId = byId\n state.childrenByParentId = childrenByParentId\n state.rootIds = rootIds\n state.exactCountByFolderId = action.payload.exactCountByFolderId\n state.unfiledCount = action.payload.unfiledCount\n state.fetching = false\n state.fetchCount = action.payload.folders.length\n delete state.fetchingError\n\n if (state.currentFolderId && !byId[state.currentFolderId]) {\n state.currentFolderId = null\n state.currentFolderUnfiled = false\n }\n },\n fetchError(state, action: PayloadAction<{error: HttpError}>) {\n state.fetching = false\n state.fetchingError = action.payload.error\n },\n fetchRequest(state) {\n state.fetching = true\n delete state.fetchingError\n },\n panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n state.panelVisible = action.payload.panelVisible\n },\n renameComplete(state, _action: PayloadAction<{folderId: string; name: string}>) {\n state.renaming = false\n },\n renameError(state, action: PayloadAction<{error: HttpError}>) {\n state.renaming = false\n state.renameError = action.payload.error\n },\n renameRequest(state, _action: PayloadAction<{folderId: string; name: string}>) {\n state.renaming = true\n delete state.renameError\n },\n },\n})\n\nexport const foldersFetchEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action, state]) =>\n of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => {\n const assetTypes = state.assets.assetTypes.map((type) => `sanity.${type}Asset`)\n const excludeTagsFragment = buildExcludeTagsFragment(state.assets.excludeTagSlugs)\n const excludeTagsClause = excludeTagsFragment ? `&& ${excludeTagsFragment}` : ''\n return client.observable.fetch<{\n folders: {_id: string; name?: string; parentId?: string | null; count: number}[]\n unfiledCount: number\n }>(\n groq`{\n \"folders\": *[\n _type == \"${FOLDER_DOCUMENT_NAME}\"\n && !(_id in path(\"drafts.**\"))\n ] {\n _id,\n name,\n \"parentId\": parent._ref,\n \"count\": count(*[\n _type in ${JSON.stringify(assetTypes)}\n && !(_id in path(\"drafts.**\"))\n && opt.media.folder._ref == ^._id\n ${excludeTagsClause}\n ])\n },\n \"unfiledCount\": count(*[\n _type in ${JSON.stringify(assetTypes)}\n && !(_id in path(\"drafts.**\"))\n && !defined(opt.media.folder._ref)\n ${excludeTagsClause}\n ])\n }`,\n )\n }),\n mergeMap((result) => {\n const folders: FolderDoc[] = result.folders.map((f) => ({\n _id: f._id,\n name: f.name || '',\n parentId: f.parentId || null,\n }))\n const exactCountByFolderId: Record<string, number> = {}\n result.folders.forEach(({_id, count}) => {\n exactCountByFolderId[_id] = count\n })\n const folderIds = new Set(folders.map((folder) => folder._id))\n const clearedCurrentFolder = Boolean(\n state.folders.currentFolderId && !folderIds.has(state.folders.currentFolderId),\n )\n return of(\n foldersSlice.actions.fetchComplete({\n folders,\n exactCountByFolderId,\n unfiledCount: result.unfiledCount,\n clearedCurrentFolder,\n }),\n )\n }),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.fetchError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n ),\n ),\n )\n\nexport const foldersRefreshEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(\n (action) =>\n assetsActions.deleteComplete.match(action) ||\n assetsActions.folderSetComplete.match(action) ||\n foldersSlice.actions.createComplete.match(action) ||\n foldersSlice.actions.deleteComplete.match(action) ||\n foldersSlice.actions.renameComplete.match(action) ||\n assetsActions.listenerCreateQueueComplete.match(action) ||\n assetsActions.listenerDeleteQueueComplete.match(action) ||\n assetsActions.listenerUpdateQueueComplete.match(action) ||\n assetsActions.updateComplete.match(action) ||\n UPLOADS_ACTIONS.uploadComplete.match(action),\n ),\n debounceTime(300),\n mergeMap(() => of(foldersSlice.actions.fetchRequest())),\n )\n\nexport const foldersCurrentFolderEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(\n (action) =>\n foldersSlice.actions.currentFolderClear.match(action) ||\n foldersSlice.actions.currentFolderSet.match(action) ||\n foldersSlice.actions.currentFolderShowUnfiled.match(action) ||\n (foldersSlice.actions.deleteComplete.match(action) &&\n Boolean(action.payload.clearedCurrentFolder)) ||\n (foldersSlice.actions.fetchComplete.match(action) &&\n Boolean(action.payload.clearedCurrentFolder)),\n ),\n mergeMap(() =>\n of(\n assetsActions.clear(),\n assetsActions.pickClear(),\n assetsActions.loadPageIndex({pageIndex: 0}),\n ),\n ),\n )\n\nconst patchOperationAssetFolderUnset = (patch: Patch) => patch.unset(['opt.media.folder'])\n\nconst patchOperationFolderParentSet =\n ({parentId}: {parentId: string | null}) =>\n (patch: Patch) => {\n if (parentId) {\n return patch.set({parent: {_ref: parentId, _type: 'reference', _weak: true}})\n }\n\n return patch.unset(['parent'])\n }\n\nexport const foldersCreateEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.createRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const name = action.payload.name.trim()\n const parentId = action.payload.parentId || null\n\n if (!name) {\n return of(\n foldersSlice.actions.createError({\n error: {message: 'Folder name cannot be empty', statusCode: 400},\n }),\n )\n }\n\n const siblingIds = parentId\n ? state.folders.childrenByParentId[parentId] || []\n : state.folders.rootIds\n const collision = siblingIds.some(\n (id) => state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n )\n if (collision) {\n return of(\n foldersSlice.actions.createError({\n error: {message: 'A folder with this name already exists here', statusCode: 409},\n }),\n )\n }\n\n const newId = `${FOLDER_DOCUMENT_NAME}.${nanoid()}`\n const doc: {\n _id: string\n _type: string\n name: string\n parent?: {_ref: string; _type: 'reference'; _weak: true}\n } = {\n _id: newId,\n _type: FOLDER_DOCUMENT_NAME,\n name,\n }\n if (parentId) {\n doc.parent = {_ref: parentId, _type: 'reference', _weak: true}\n }\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => client.observable.create(doc)),\n mergeMap(() =>\n of(\n foldersSlice.actions.createComplete({folder: {_id: newId, name, parentId}}),\n foldersSlice.actions.currentFolderSet({folderId: newId}),\n ),\n ),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.createError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nexport const foldersDeleteEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.deleteRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const folderId = action.payload.folderId\n const childFolderIds = state.folders.childrenByParentId[folderId] || []\n const parentId = state.folders.byId[folderId]?.parentId ?? null\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() =>\n client.observable.fetch<{assets: {_id: string}[]}>(\n groq`{\n \"assets\": *[\n _type in ${JSON.stringify(\n state.assets.assetTypes.map((type) => `sanity.${type}Asset`),\n )}\n && !(_id in path(\"drafts.**\"))\n && opt.media.folder._ref == $folderId\n ] {\n _id\n }\n }`,\n {folderId},\n ),\n ),\n mergeMap((result) => {\n const tx = client.transaction()\n // Deleting a folder only removes the folder document. Assets keep living in the\n // library with their folder assignment cleared, and direct child folders are promoted\n // to the deleted folder's parent (or root).\n result.assets.forEach((asset) => tx.patch(asset._id, patchOperationAssetFolderUnset))\n childFolderIds.forEach((childFolderId) =>\n tx.patch(childFolderId, patchOperationFolderParentSet({parentId})),\n )\n tx.delete(folderId)\n\n return from(tx.commit()).pipe(\n map(() =>\n foldersSlice.actions.deleteComplete({\n folderId,\n deletedIds: [folderId],\n clearedCurrentFolder: state.folders.currentFolderId === folderId,\n }),\n ),\n )\n }),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.deleteError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n folderId,\n }),\n ),\n ),\n )\n }),\n )\n\nexport const foldersRenameEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(foldersSlice.actions.renameRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {folderId} = action.payload\n const name = action.payload.name.trim()\n const folder = state.folders.byId[folderId]\n\n if (!folder) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'Folder not found', statusCode: 404},\n }),\n )\n }\n\n if (!name) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'Folder name cannot be empty', statusCode: 400},\n }),\n )\n }\n\n if (name === folder.name) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'Folder name has not changed', statusCode: 400},\n }),\n )\n }\n\n const siblingIds = folder.parentId\n ? state.folders.childrenByParentId[folder.parentId] || []\n : state.folders.rootIds\n const collision = siblingIds.some(\n (id) =>\n id !== folderId && state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n )\n if (collision) {\n return of(\n foldersSlice.actions.renameError({\n error: {message: 'A folder with this name already exists here', statusCode: 409},\n }),\n )\n }\n\n return of(action).pipe(\n debugThrottle(state.debug.badConnection),\n mergeMap(() => client.observable.patch(folderId).set({name}).commit()),\n mergeMap(() => of(foldersSlice.actions.renameComplete({folderId, name}))),\n catchError((error: ClientError) =>\n of(\n foldersSlice.actions.renameError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n }),\n ),\n ),\n )\n }),\n )\n\nconst selectById = (state: RootReducerState) => state.folders.byId\nconst selectChildrenByParentId = (state: RootReducerState) => state.folders.childrenByParentId\nconst selectRootIds = (state: RootReducerState) => state.folders.rootIds\nconst selectExactCountByFolderId = (state: RootReducerState) => state.folders.exactCountByFolderId\nconst selectCurrentFolderId = (state: RootReducerState) => state.folders.currentFolderId\nconst selectCurrentFolderUnfiled = (state: RootReducerState) => state.folders.currentFolderUnfiled\n\nconst buildFolderPath = (folderId: string, byId: Record<string, FolderDoc>): string => {\n const segments: string[] = []\n let cursor: string | null = folderId\n const seen = new Set<string>()\n while (cursor && !seen.has(cursor)) {\n const folder: FolderDoc | undefined = byId[cursor]\n if (!folder) break\n seen.add(cursor)\n segments.unshift(folder.name)\n cursor = folder.parentId\n }\n return segments.join('/')\n}\n\nexport const selectFolderPathById = createSelector(\n [selectById, (_state: RootReducerState, folderId: string | null | undefined) => folderId],\n (byId, folderId) => (folderId ? buildFolderPath(folderId, byId) : ''),\n)\n\nexport const selectFolderTree = createSelector(\n [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n (byId, childrenByParentId, rootIds, exactCountByFolderId): FolderTreeNode[] => {\n const buildNode = (folderId: string): FolderTreeNode => {\n const folder = byId[folderId]\n const children = (childrenByParentId[folderId] || []).map(buildNode)\n const exactCount = exactCountByFolderId[folderId] || 0\n const totalCount = children.reduce((sum, child) => sum + child.totalCount, exactCount)\n return {\n children,\n exactCount,\n id: folderId,\n name: folder?.name || '',\n parentId: folder?.parentId ?? null,\n path: buildFolderPath(folderId, byId),\n totalCount,\n }\n }\n\n return rootIds.map(buildNode)\n },\n)\n\nexport const selectCurrentFolderSegments = createSelector(\n [selectById, selectCurrentFolderId],\n (byId, currentFolderId): FolderTreeItem[] => {\n if (!currentFolderId) return []\n const chain: string[] = []\n let cursor: string | null = currentFolderId\n const seen = new Set<string>()\n while (cursor && !seen.has(cursor)) {\n const folder: FolderDoc | undefined = byId[cursor]\n if (!folder) break\n seen.add(cursor)\n chain.unshift(cursor)\n cursor = folder.parentId\n }\n return chain.map((id, depth) => ({\n depth,\n exactCount: 0,\n id,\n name: byId[id]?.name || '',\n parentId: byId[id]?.parentId ?? null,\n path: buildFolderPath(id, byId),\n totalCount: 0,\n }))\n },\n)\n\ntype FoldersIndex = {\n byId: Record<string, FolderDoc>\n childrenByParentId: Record<string, string[]>\n rootIds: string[]\n exactCountByFolderId: Record<string, number>\n}\n\nconst selectFoldersIndex = createSelector(\n [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n (byId, childrenByParentId, rootIds, exactCountByFolderId): FoldersIndex => ({\n byId,\n childrenByParentId,\n rootIds,\n exactCountByFolderId,\n }),\n)\n\nexport const selectCurrentFolderChildren = createSelector(\n [selectFoldersIndex, selectCurrentFolderId, selectCurrentFolderUnfiled],\n (\n {byId, childrenByParentId, rootIds, exactCountByFolderId},\n currentFolderId,\n currentFolderUnfiled,\n ): FolderTreeItem[] => {\n if (currentFolderUnfiled || !currentFolderId) return []\n const ids = currentFolderId ? childrenByParentId[currentFolderId] || [] : rootIds\n const depth = currentFolderId ? buildFolderPath(currentFolderId, byId).split('/').length : 0\n return ids.map((id) => {\n const folder = byId[id]\n // Sum totalCount over the subtree.\n const stack = [id]\n let totalCount = 0\n while (stack.length) {\n const cur = stack.pop()!\n totalCount += exactCountByFolderId[cur] || 0\n const kids = childrenByParentId[cur]\n if (kids) stack.push(...kids)\n }\n return {\n depth,\n exactCount: exactCountByFolderId[id] || 0,\n id,\n name: folder?.name || '',\n parentId: folder?.parentId ?? null,\n path: buildFolderPath(id, byId),\n totalCount,\n }\n })\n },\n)\n\nexport const selectCanDeleteFolder = createSelector(\n [selectCurrentFolderId],\n (currentFolderId) => !!currentFolderId,\n)\n\nexport const foldersActions = {...foldersSlice.actions}\n\nexport default foldersSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\n\nimport type {AssetItem, Dialog, MyEpic, Tag} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {DIALOG_ACTIONS} from './actions'\n\ntype DialogReducerState = {\n items: Dialog[]\n}\n\nconst initialState = {\n items: [],\n} as DialogReducerState\n\nconst dialogSlice = createSlice({\n name: 'dialog',\n initialState,\n extraReducers: (builder) => {\n builder\n .addCase(DIALOG_ACTIONS.showFolderCreate, (state, action) => {\n const {parentFolderId} = action.payload\n state.items.push({\n parentFolderId,\n id: 'folderCreate',\n type: 'folderCreate',\n })\n })\n .addCase(DIALOG_ACTIONS.showFolderMove, (state, action) => {\n const {assets, folderId} = action.payload\n state.items.push({\n assets,\n folderId,\n id: 'folderMove',\n type: 'folderMove',\n })\n })\n .addCase(DIALOG_ACTIONS.showFolderRename, (state, action) => {\n const {folderId} = action.payload\n state.items.push({\n folderId,\n id: 'folderRename',\n type: 'folderRename',\n })\n })\n .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n state.items.push({\n id: 'tagCreate',\n type: 'tagCreate',\n })\n })\n .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n const {tagId} = action.payload\n state.items.push({\n id: tagId,\n tagId,\n type: 'tagEdit',\n })\n })\n .addCase(foldersActions.createComplete, (state) => {\n state.items = state.items.filter((item) => item.id !== 'folderCreate')\n })\n .addCase(foldersActions.renameComplete, (state) => {\n state.items = state.items.filter((item) => item.id !== 'folderRename')\n })\n },\n reducers: {\n // Clear all dialogs\n clear(state) {\n state.items = []\n },\n // Add newly created inline tag to assetEdit dialog\n inlineTagCreate(state, action: PayloadAction<{assetId: string; tag: Tag}>) {\n const {assetId, tag} = action.payload\n\n state.items.forEach((item) => {\n if (item.type === 'assetEdit' && item.assetId === assetId) {\n item.lastCreatedTag = {\n label: tag.name.current,\n value: tag._id,\n }\n }\n })\n },\n // Remove inline tags from assetEdit dialog\n inlineTagRemove(state, action: PayloadAction<{tagIds: string[]}>) {\n const {tagIds} = action.payload\n\n state.items.forEach((item) => {\n if (item.type === 'assetEdit') {\n item.lastRemovedTagIds = tagIds\n }\n })\n },\n // Remove dialog by id\n remove(state, action: PayloadAction<{id: string}>) {\n const id = action.payload?.id\n state.items = state.items.filter((item) => item.id !== id)\n },\n showConfirmAssetsTagAdd(\n state,\n action: PayloadAction<{\n assetsPicked: AssetItem[]\n closeDialogId?: string\n tag: Tag\n }>,\n ) {\n const {assetsPicked, closeDialogId, tag} = action.payload\n\n const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: ASSETS_ACTIONS.tagsAddRequest({\n assets: assetsPicked,\n tag,\n }),\n confirmText: `Yes, add tag to ${suffix}`,\n title: `Add tag ${tag.name.current} to ${suffix}?`,\n id: 'confirm',\n headerTitle: 'Confirm tag addition',\n tone: 'primary',\n type: 'confirm',\n })\n },\n showConfirmAssetsTagRemove(\n state,\n action: PayloadAction<{\n assetsPicked: AssetItem[]\n closeDialogId?: string\n tag: Tag\n }>,\n ) {\n const {assetsPicked, closeDialogId, tag} = action.payload\n\n const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: ASSETS_ACTIONS.tagsRemoveRequest({assets: assetsPicked, tag}),\n confirmText: `Yes, remove tag from ${suffix}`,\n headerTitle: 'Confirm tag removal',\n id: 'confirm',\n title: `Remove tag ${tag.name.current} from ${suffix}?`,\n tone: 'critical',\n type: 'confirm',\n })\n },\n showConfirmDeleteAssets(\n state,\n action: PayloadAction<{assets: AssetItem[]; closeDialogId?: string}>,\n ) {\n const {assets, closeDialogId} = action.payload\n\n const suffix = `${assets.length} ${pluralize('asset', assets.length)}`\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: assetsActions.deleteRequest({\n assets: assets.map((assetItem) => assetItem.asset),\n }),\n confirmText: `Yes, delete ${suffix}`,\n description: 'This operation cannot be reversed. Are you sure you want to continue?',\n title: `Permanently delete ${suffix}?`,\n id: 'confirm',\n headerTitle: 'Confirm deletion',\n tone: 'critical',\n type: 'confirm',\n })\n },\n showConfirmDeleteFolder(\n state,\n action: PayloadAction<{closeDialogId?: string; folderId: string; folderName: string}>,\n ) {\n const {closeDialogId, folderId, folderName} = action.payload\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: foldersActions.deleteRequest({folderId}),\n confirmText: `Yes, delete folder`,\n description:\n 'This deletes only the selected folder. Assets in this folder will stay in the library and have their folder assignment removed. Nested folders will move up one level.',\n title: `Delete ${folderName}?`,\n id: 'confirm',\n headerTitle: 'Confirm folder deletion',\n tone: 'critical',\n type: 'confirm',\n })\n },\n showConfirmDeleteTag(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n const {closeDialogId, tag} = action.payload\n\n const suffix = 'tag'\n\n state.items.push({\n closeDialogId,\n confirmCallbackAction: tagsActions.deleteRequest({tag}),\n confirmText: `Yes, delete ${suffix}`,\n description: 'This operation cannot be reversed. Are you sure you want to continue?',\n title: `Permanently delete ${suffix}?`,\n id: 'confirm',\n headerTitle: 'Confirm deletion',\n tone: 'critical',\n type: 'confirm',\n })\n },\n showAllAssetsDialog(state, action: PayloadAction<{assetId: string}>) {\n if (state.items.some((item) => item.type === 'dialogAllAssets')) {\n return\n }\n state.items.push({\n assetId: action.payload.assetId,\n id: 'dialogAllAssets',\n type: 'dialogAllAssets',\n })\n },\n showAssetEdit(state, action: PayloadAction<{assetId: string}>) {\n const {assetId} = action.payload\n state.items.push({\n assetId,\n id: assetId,\n type: 'assetEdit',\n })\n },\n showSearchFacets(state) {\n state.items.push({\n id: 'searchFacets',\n type: 'searchFacets',\n })\n },\n showFolders(state) {\n state.items.push({\n id: 'folders',\n type: 'folders',\n })\n },\n showTags(state) {\n state.items.push({\n id: 'tags',\n type: 'tags',\n })\n },\n },\n})\n\n// Epics\n\nexport const dialogClearOnAssetUpdateEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.deleteComplete.type,\n assetsActions.folderSetComplete.type,\n assetsActions.updateComplete.type,\n tagsActions.deleteComplete.type,\n tagsActions.updateComplete.type,\n ),\n filter(\n (action: {\n payload: {closeDialogId?: string}\n }): action is PayloadAction<{closeDialogId?: string}> => !!action?.payload?.closeDialogId,\n ),\n mergeMap((action) => {\n const dialogId = action?.payload?.closeDialogId\n if (dialogId) {\n return of(dialogSlice.actions.remove({id: dialogId}))\n }\n return EMPTY\n }),\n )\n\nexport const dialogTagCreateEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.createComplete.match),\n mergeMap((action) => {\n const {assetId, tag} = action?.payload || {}\n\n if (assetId) {\n return of(dialogSlice.actions.inlineTagCreate({tag, assetId}))\n }\n\n if (tag._id) {\n return of(dialogSlice.actions.remove({id: 'tagCreate'}))\n }\n\n return EMPTY\n }),\n )\n\nexport const dialogTagDeleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.listenerDeleteQueueComplete.match),\n mergeMap((action) => {\n const {tagIds} = action?.payload || {}\n\n return of(dialogSlice.actions.inlineTagRemove({tagIds}))\n }),\n )\n\nexport const dialogActions = {...dialogSlice.actions}\n\nexport default dialogSlice.reducer\n","import {createGlobalStyle, css} from 'styled-components'\n\nconst customScrollbar = css`\n ::-webkit-scrollbar {\n width: 14px;\n }\n\n ::-webkit-scrollbar-thumb {\n border-radius: 10px;\n border: 4px solid rgba(0, 0, 0, 0);\n background: var(--card-border-color);\n background-clip: padding-box;\n\n &:hover {\n background: var(--card-muted-fg-color);\n background-clip: padding-box;\n }\n }\n`\n\nconst GlobalStyle = createGlobalStyle`\n .media__custom-scrollbar {\n ${customScrollbar}\n }\n\n // @sanity/ui overrides\n\n // Custom scrollbar on Box (used in Dialogs)\n div[data-ui=\"Box\"] {\n ${customScrollbar}\n }\n\n // Dialog background color\n div[data-ui=\"Dialog\"] {\n background-color: rgba(15, 17, 18, 0.9);\n }\n\n`\n\nexport default GlobalStyle\n","import {type PropsWithChildren, createContext, useContext, useMemo} from 'react'\nimport type {DropzoneOptions} from 'react-dropzone'\n\nimport type {MediaToolOptions, Locale} from '../types'\n\ntype ContextProps = {\n dropzone: Pick<DropzoneOptions, 'maxSize'>\n components: MediaToolOptions['components']\n createTagsOnUpload: boolean\n creditLine: MediaToolOptions['creditLine']\n directUploads: MediaToolOptions['directUploads']\n excludeTagSlugs: string[]\n locales?: Locale[]\n}\n\nconst ToolOptionsContext = createContext<ContextProps | null>(null)\n\ntype Props = {\n options?: MediaToolOptions | void\n}\n\nexport const ToolOptionsProvider = ({options, children}: PropsWithChildren<Props>) => {\n const value = useMemo<ContextProps>(() => {\n let creditLineExcludeSources\n\n if (options?.creditLine?.excludeSources) {\n creditLineExcludeSources = Array.isArray(options?.creditLine?.excludeSources)\n ? options.creditLine.excludeSources\n : [options?.creditLine?.excludeSources]\n }\n\n return {\n dropzone: {maxSize: options?.maximumUploadSize},\n components: {\n details: options?.components?.details,\n },\n createTagsOnUpload: options?.createTagsOnUpload ?? true,\n creditLine: {\n enabled: options?.creditLine?.enabled || false,\n excludeSources: creditLineExcludeSources,\n },\n directUploads: options?.directUploads ?? true,\n excludeTagSlugs: options?.excludeTags?.length ? [...options.excludeTags] : [],\n locales: options?.locales,\n }\n // oxlint-disable-next-line react/preserve-manual-memoization\n }, [\n options?.creditLine?.enabled,\n options?.components,\n options?.createTagsOnUpload,\n options?.creditLine?.excludeSources,\n options?.excludeTags,\n options?.maximumUploadSize,\n options?.directUploads,\n options?.locales,\n ])\n\n return <ToolOptionsContext.Provider value={value}>{children}</ToolOptionsContext.Provider>\n}\n\nexport const useToolOptions = () => {\n const context = useContext(ToolOptionsContext)\n\n if (!context) {\n throw new Error('useToolOptions must be used within an ToolOptionsProvider')\n }\n\n return context\n}\n","import * as z from 'zod'\n\n// Helper to generate localized string schema\nfunction localizedStringSchema(locales?: {id: string}[]) {\n if (!locales || locales.length === 0) {\n return z.string().trim().optional()\n }\n const shape: Record<string, z.ZodTypeAny> = {}\n for (const locale of locales) {\n shape[locale.id] = z.string().trim().optional()\n }\n return z.object(shape).passthrough()\n}\n\nexport const tagOptionSchema = z.object({\n label: z.string().trim().min(1, {message: 'Label cannot be empty'}),\n value: z.string().trim().min(1, {message: 'Value cannot be empty'}),\n})\n\nexport function getAssetFormSchema(locales?: {id: string}[]) {\n return z.object({\n altText: localizedStringSchema(locales),\n creditLine: localizedStringSchema(locales),\n description: localizedStringSchema(locales),\n opt: z.object({\n media: z.object({\n tags: z.array(tagOptionSchema).nullable(),\n }),\n }),\n originalFilename: z.string().trim().min(1, {message: 'Filename cannot be empty'}),\n title: localizedStringSchema(locales),\n })\n}\n\nexport const assetFormSchema = getAssetFormSchema()\n\nexport const tagFormSchema = z.object({\n name: z.string().min(1, {message: 'Name cannot be empty'}),\n})\n\nexport const folderFormSchema = z.object({\n name: z.string().trim().min(1, {message: 'Name cannot be empty'}),\n})\n","import type {SanityDocument} from '@sanity/client'\n\nexport function getUniqueDocuments(documents: SanityDocument[]): SanityDocument[] {\n const draftIds = documents.reduce(\n (acc: string[], doc: SanityDocument) =>\n doc._id.startsWith('drafts.') ? acc.concat(doc._id.slice(7)) : acc,\n [],\n )\n\n const filteredDocuments: SanityDocument[] = documents.filter(\n (doc: SanityDocument) => !draftIds.includes(doc._id),\n )\n\n return filteredDocuments\n}\n","import type {ImageAsset} from '../types'\n\nconst imageDprUrl = (\n asset: ImageAsset,\n options: {\n width: number\n height?: number\n },\n): string => {\n const dpi =\n typeof window === 'undefined' || !window.devicePixelRatio\n ? 1\n : Math.round(window.devicePixelRatio)\n const imgH = options?.height ? options?.height * Math.max(1, dpi) : undefined\n const imgW = options.width * Math.max(1, dpi)\n\n const urlParams = new URLSearchParams()\n urlParams.append('fit', 'max')\n urlParams.append('w', imgW.toString())\n if (imgH) {\n urlParams.append('h', imgH.toString())\n }\n\n return `${asset.url}?${urlParams.toString()}`\n}\n\nexport default imageDprUrl\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n return Object.keys(formData).reduce((acc: FormData, key) => {\n const val = formData[key]\n\n // TODO: refactor\n if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n acc[key] = sanitizeFormData(val)\n } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n acc[key] = null\n } else if (typeof val === 'string' && val) {\n acc[key] = formData[key].trim()\n } else {\n acc[key] = formData[key]\n }\n\n return acc\n }, {})\n}\n\nexport default sanitizeFormData\n","import type {Asset, FileAsset, ImageAsset} from '../types'\n\nexport const isFileAsset = (asset: Asset): asset is FileAsset => {\n return (asset as FileAsset)._type === 'sanity.fileAsset'\n}\n\nexport const isImageAsset = (asset: Asset): asset is ImageAsset => {\n return (asset as ImageAsset)._type === 'sanity.imageAsset'\n}\n","import {zodResolver} from '@hookform/resolvers/zod'\nimport type {FieldValues, Resolver} from 'react-hook-form'\n\n/**\n * `@hookform/resolvers/zod` resolves its own `zod` typings through dependency\n * hoisting, which in this monorepo lands on zod v4, while this plugin authors its\n * form schemas with zod v3. The resolver accepts v3 schema instances correctly at\n * runtime, so this thin wrapper only bridges the type-only v3/v4 mismatch. The\n * react-hook-form field types stay fully checked at the call sites.\n */\nexport default function zodFormResolver<TFieldValues extends FieldValues>(\n schema: unknown,\n): Resolver<TFieldValues> {\n return zodResolver(\n schema as Parameters<typeof zodResolver>[0],\n ) as unknown as Resolver<TFieldValues>\n}\n","import type {ImageAsset} from '../types'\n\nconst getAssetResolution = (asset: ImageAsset) => {\n return `${asset.metadata.dimensions.width}x${asset.metadata.dimensions.height}px`\n}\n\nexport default getAssetResolution\n","import {usePortal} from '@sanity/ui'\nimport {type PopoverProps} from '@sanity/ui/popover'\n\nexport function usePortalPopoverProps(): PopoverProps {\n const portal = usePortal()\n\n return {\n animate: true,\n constrainSize: true,\n floatingBoundary: portal.element,\n portal: true,\n referenceBoundary: portal.element,\n }\n}\n","import {ClipboardIcon} from '@sanity/icons/Clipboard'\nimport {Button, Text} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport copy from 'copy-to-clipboard'\nimport {useEffect, useRef, useState} from 'react'\n\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\n\ntype Props = {\n disabled?: boolean\n url: string\n}\n\nconst ButtonAssetCopy = ({disabled, url}: Props) => {\n const popoverProps = usePortalPopoverProps()\n const refPopoverTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n const [popoverVisible, setPopoverVisible] = useState(false)\n\n const handleClick = () => {\n if (refPopoverTimeout.current) {\n clearTimeout(refPopoverTimeout.current)\n }\n\n setPopoverVisible(true)\n copy(url)\n\n refPopoverTimeout.current = setTimeout(() => {\n setPopoverVisible(false)\n }, 1250)\n }\n\n // Effects\n useEffect(() => {\n return () => {\n if (refPopoverTimeout.current) {\n clearTimeout(refPopoverTimeout.current)\n }\n }\n }, [])\n\n return (\n <Popover\n content={\n <Text muted size={1}>\n Copied!\n </Text>\n }\n open={popoverVisible}\n padding={2}\n placement=\"top\"\n radius={1}\n {...popoverProps}\n >\n <Button\n disabled={disabled}\n fontSize={1}\n icon={ClipboardIcon}\n mode=\"ghost\"\n onClick={handleClick}\n text=\"Copy URL\"\n />\n </Popover>\n )\n}\n\nexport default ButtonAssetCopy\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {Box, Button, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport {format} from 'date-fns/format'\nimport filesize from 'filesize'\nimport {type ReactNode} from 'react'\n\nimport type {Asset, AssetItem} from '../../types'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport ButtonAssetCopy from '../ButtonAssetCopy'\n\ntype Props = {\n asset: Asset\n item?: AssetItem\n}\n\nconst Row = ({label, value}: {label: string; value: ReactNode}) => {\n return (\n <Flex justify=\"space-between\">\n <Text\n size={1}\n style={{\n opacity: 0.8,\n width: '40%',\n }}\n textOverflow=\"ellipsis\"\n >\n {label}\n </Text>\n <Text\n size={1}\n style={{\n opacity: 0.4,\n textAlign: 'right',\n width: '60%',\n }}\n textOverflow=\"ellipsis\"\n >\n {value}\n </Text>\n </Flex>\n )\n}\n\nconst AssetMetadata = (props: Props) => {\n const {asset, item} = props\n\n const exif = asset?.metadata?.exif\n\n // Callbacks\n const handleDownload = () => {\n window.location.href = `${asset.url}?dl=${asset.originalFilename}`\n }\n\n return (\n <Box marginTop={3}>\n {/* Base */}\n <Box>\n <Stack gap={3}>\n <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n <Row label=\"MIME type\" value={asset?.mimeType} />\n <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n </Stack>\n </Box>\n {/* EXIF */}\n {exif &&\n (exif.DateTimeOriginal ||\n exif.FNumber ||\n exif.FocalLength ||\n exif.ExposureTime ||\n exif.ISO) && (\n <>\n {/* Divider */}\n <Box\n marginY={4}\n style={{\n background: 'var(--card-border-color)',\n height: '1px',\n width: '100%',\n }}\n />\n <Box>\n <Stack gap={3}>\n {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n {exif.ExposureTime && (\n <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n )}\n {exif.DateTimeOriginal && (\n <Row\n label=\"Original date\"\n value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n />\n )}\n </Stack>\n </Box>\n </>\n )}\n\n {/* Asset actions */}\n <Box marginTop={5}>\n <Inline gap={2}>\n {/* Download */}\n <Button\n disabled={!item || item?.updating}\n fontSize={1}\n icon={DownloadIcon}\n mode=\"ghost\"\n onClick={handleDownload}\n text=\"Download\"\n />\n {/* Copy to clipboard */}\n <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n </Inline>\n </Box>\n </Box>\n )\n}\n\nexport default AssetMetadata\n","import {Dialog as SanityDialog} from '@sanity/ui'\nimport {type ComponentProps} from 'react'\n\nconst Dialog = (props: ComponentProps<typeof SanityDialog>) => {\n // HACK: Temporarily force fixed positioning on all @sanity/ui <Dialog /> components.\n // The studio is currently setting absolute positioning on all root-level dialogs on the mobile breakpoint,\n // causing unwanted scroll behaviour.\n return <SanityDialog {...props} style={{position: 'fixed'}} />\n}\n\nexport default Dialog\n","import type {SanityDocument} from '@sanity/client'\nimport {Box, Button, Card, Stack, Text} from '@sanity/ui'\nimport {Preview, type SchemaType, useSchema} from 'sanity'\nimport {useIntentLink} from 'sanity/router'\n\ntype Props = {\n documents: SanityDocument[]\n isLoading: boolean\n}\n\nconst DocumentList = ({documents, isLoading}: Props) => {\n const schema = useSchema()\n\n if (isLoading) {\n return (\n <Text muted size={1}>\n Loading...\n </Text>\n )\n }\n\n if (documents.length === 0) {\n return (\n <Text muted size={1}>\n No documents are referencing this asset\n </Text>\n )\n }\n\n return (\n <Card flex={1} marginBottom={2} padding={2} radius={2} shadow={1}>\n <Stack gap={2}>\n {documents?.map((doc) => (\n <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n ))}\n </Stack>\n </Card>\n )\n}\n\nconst ReferringDocument = (props: {doc: SanityDocument; schemaType?: SchemaType}) => {\n const {doc, schemaType} = props\n\n const {onClick} = useIntentLink({\n intent: 'edit',\n params: {id: doc._id},\n })\n\n return schemaType ? (\n <Button key={doc._id} mode=\"bleed\" onClick={onClick} padding={2} style={{width: '100%'}}>\n <Preview layout=\"default\" schemaType={schemaType} value={doc} />\n </Button>\n ) : (\n <Box padding={2}>\n <Text size={1}>\n A document of the unknown type <em>{doc._type}</em>\n </Text>\n </Box>\n )\n}\n\nexport default DocumentList\n","import {Box, Flex, type Theme} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {defaultStyles, FileIcon as ReactFileIcon} from 'react-file-icon'\nimport type {DefaultExtensionType} from 'react-file-icon'\nimport {styled, css} from 'styled-components'\n\ntype Props = {\n extension?: string\n onClick?: (e: MouseEvent) => void\n width: string\n}\n\n// Force react-file-icon styles\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled(Box)(({theme}: {theme: Theme}) => {\n return css`\n text {\n font-family: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.fonts.text.family\n } !important;\n font-size: 8px !important;\n font-weight: 500 !important;\n }\n `\n})\n\nconst FileIcon = (props: Props) => {\n const {extension, onClick, width} = props\n\n return (\n <Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n <Container style={{width}}>\n {extension ? (\n <ReactFileIcon\n extension={extension}\n {...defaultStyles[extension as DefaultExtensionType]}\n />\n ) : (\n <ReactFileIcon />\n )}\n </Container>\n </Flex>\n )\n}\n\nexport default FileIcon\n","import {Flex} from '@sanity/ui'\n\nimport type {Asset} from '../../types'\nimport FileIcon from '../FileIcon'\n\ntype Props = {\n asset: Asset\n}\n\nconst FileAssetPreview = (props: Props) => {\n const {asset} = props\n\n if (asset.mimeType.search('audio') === 0) {\n return (\n <Flex align=\"center\" justify=\"center\" style={{height: '100%'}}>\n <audio controls src={asset.url} style={{width: '100%'}} />\n </Flex>\n )\n }\n\n if (asset.mimeType.search('video') === 0) {\n return (\n <video\n controls\n src={asset.url}\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }\n\n return <FileIcon extension={asset.extension} width=\"50%\" />\n}\n\nexport default FileAssetPreview\n","import {Box, Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {format} from 'date-fns/format'\nimport {type ReactNode} from 'react'\n\ntype Props = {\n disabled: boolean\n isValid: boolean\n lastUpdated?: string\n onClick: () => void\n}\n\nconst FormSubmitButton = (props: Props) => {\n const {disabled, isValid, lastUpdated, onClick} = props\n\n let content: ReactNode\n if (isValid) {\n if (lastUpdated) {\n content = (\n <>\n Last updated\n <br /> {format(new Date(lastUpdated), 'PPp')}\n </>\n )\n } else {\n content = 'No unpublished changes'\n }\n } else {\n content =\n 'There are validation errors that need to be fixed before this document can be published'\n }\n\n return (\n <Tooltip\n animate\n content={\n <Box padding={3} style={{maxWidth: '185px'}}>\n <Text muted size={1}>\n {content}\n </Text>\n </Box>\n }\n disabled={'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Box>\n <Button\n disabled={disabled}\n fontSize={1}\n onClick={onClick}\n text=\"Save and close\"\n tone=\"primary\"\n />\n </Box>\n </Tooltip>\n )\n}\n\nexport default FormSubmitButton\n","import {hues} from '@sanity/color'\nimport {type ThemeColorSchemeKey, studioTheme} from '@sanity/ui'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {color: themeColor} = studioTheme\n\nconst SCHEME_COLORS = {\n bg: {\n dark: hues.gray[950].hex,\n light: hues.gray[50].hex,\n },\n bg2: {\n dark: hues.gray[900].hex,\n light: hues.gray[100].hex,\n },\n inputEnabledBorder: {\n dark: themeColor.dark.default.input.default.enabled.border,\n light: themeColor.light.default.input.default.enabled.border,\n },\n inputHoveredBorder: {\n dark: themeColor.dark.default.input.default.hovered.border,\n light: themeColor.light.default.input.default.hovered.border,\n },\n mutedHoveredBg: {\n dark: themeColor.dark.primary.muted.primary.hovered.bg,\n light: themeColor.light.primary.muted.primary.hovered.bg,\n },\n mutedHoveredFg: {\n dark: themeColor.dark.primary.muted.primary.hovered.fg,\n light: themeColor.light.primary.muted.primary.hovered.fg,\n },\n mutedSelectedBg: {\n dark: themeColor.dark.primary.muted.primary.selected.bg,\n light: themeColor.light.primary.muted.primary.selected.bg,\n },\n spotBlue: {\n dark: themeColor.dark.primary.spot.blue,\n light: themeColor.light.primary.spot.blue,\n },\n}\n\ntype SchemeColorKey = keyof typeof SCHEME_COLORS\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport function getSchemeColor(scheme: ThemeColorSchemeKey, colorKey: SchemeColorKey): string {\n return SCHEME_COLORS[colorKey]?.[scheme]\n}\n","import type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport type {MouseEvent} from 'react'\nimport {styled, css} from 'styled-components'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n onClick?: (e: MouseEvent) => void\n $showCheckerboard?: boolean\n $scheme?: ThemeColorSchemeKey\n src: string\n style?: any\n}\n\nconst Image = styled.img.attrs({crossOrigin: 'anonymous' as const})<Props>`\n --checkerboard-color: ${(props) =>\n props.$scheme ? getSchemeColor(props.$scheme, 'bg2') : 'inherit'};\n\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n\n ${(props) =>\n props.$showCheckerboard &&\n css`\n background-image:\n linear-gradient(45deg, var(--checkerboard-color) 25%, transparent 25%),\n linear-gradient(-45deg, var(--checkerboard-color) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, var(--checkerboard-color) 75%),\n linear-gradient(-45deg, transparent 75%, var(--checkerboard-color) 75%);\n background-size: 20px 20px;\n background-position:\n 0 0,\n 0 10px,\n 10px -10px,\n -10px 0;\n `}\n`\n\nexport default Image\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {styled} from 'styled-components'\n\ntype Props = {\n description?: string\n error?: string\n label: string\n name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n return {\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst FormFieldInputLabel = (props: Props) => {\n const {description, error, label, name} = props\n\n return (\n <>\n {/* Label */}\n <Box marginY={3}>\n <Inline gap={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n </Box>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text as=\"label\" htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </>\n )\n}\n\nexport default FormFieldInputLabel\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, Flex, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {radius: themeRadius, space: themeSpace} = studioTheme\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n return {\n control: (styles, {isFocused}) => {\n let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n if (isFocused) {\n boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n 0 0 0 1px var(--card-bg-color),\n 0 0 0 3px var(--card-focus-ring-color) !important`\n }\n\n return {\n ...styles,\n 'backgroundColor': 'var(--card-bg-color)',\n 'color': 'inherit',\n 'border': 'none',\n 'borderRadius': themeRadius[1],\n boxShadow,\n 'margin': 0,\n 'minHeight': '35px',\n 'outline': 'none',\n 'padding': rem(themeSpace[1]!),\n 'transition': 'none',\n '&:hover': {\n boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n },\n }\n },\n indicatorsContainer: (styles, {isDisabled}) => ({\n ...styles,\n opacity: isDisabled ? 0.25 : 1,\n }),\n input: (styles) => ({\n ...styles,\n color: 'var(--card-fg-color)',\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n marginLeft: rem(themeSpace[2]!),\n }),\n menuList: (styles) => ({\n ...styles,\n }),\n multiValue: (styles, {isDisabled}) => ({\n ...styles,\n backgroundColor: getSchemeColor(scheme, 'mutedHoveredBg'),\n borderRadius: themeRadius[2],\n opacity: isDisabled ? 0.5 : 1,\n }),\n multiValueLabel: () => ({\n color: getSchemeColor(scheme, 'mutedHoveredFg'),\n fontSize: 'inherit',\n padding: 0,\n }),\n multiValueRemove: (styles) => ({\n ...styles,\n 'borderTopLeftRadius': 0,\n 'borderBottomLeftRadius': 0,\n 'svg': {color: getSchemeColor(scheme, 'mutedHoveredFg')},\n '&:hover': {\n backgroundColor: getSchemeColor(scheme, 'mutedSelectedBg'),\n },\n }),\n noOptionsMessage: (styles) => ({\n ...styles,\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n lineHeight: '1em',\n }),\n option: (styles, {isFocused}) => ({\n ...styles,\n 'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n 'borderRadius': themeRadius[2],\n 'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n 'padding': `${rem(themeSpace[1]!)} ${rem(themeSpace[2]!)}`,\n '&:hover': {\n backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n color: getSchemeColor(scheme, 'bg'),\n },\n }),\n placeholder: (styles) => ({\n ...styles,\n marginLeft: rem(themeSpace[2]!),\n }),\n valueContainer: (styles) => ({\n ...styles,\n margin: 0,\n padding: 0,\n }),\n }\n}\n\nconst DropdownIndicator = (props: any) => {\n return (\n <components.DropdownIndicator {...props}>\n <Box paddingX={2}>\n <Text size={1}>\n <ChevronDownIcon />\n </Text>\n </Box>\n </components.DropdownIndicator>\n )\n}\n\nconst Menu = (props: any) => {\n return (\n <components.Menu {...props}>\n <Card radius={1} shadow={2}>\n {props.children}\n </Card>\n </components.Menu>\n )\n}\n\nconst MenuList = (props: any) => {\n const {children} = props\n\n const MAX_ROWS = 5\n const OPTION_HEIGHT = 37\n\n if (Array.isArray(children)) {\n const height =\n children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n return (\n <Virtuoso\n className=\"media__custom-scrollbar\"\n itemContent={(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }}\n style={{height}}\n totalCount={children.length}\n />\n )\n }\n return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst MultiValueLabel = (props: any) => {\n return (\n <Box padding={2} paddingRight={1}>\n <Text size={1} weight=\"medium\">\n <components.MultiValueLabel {...props} />\n </Text>\n </Box>\n )\n}\n\nconst MultiValueRemove = (props: any) => {\n return (\n <components.MultiValueRemove {...props}>\n <CloseIcon color=\"#1f2123\" />\n </components.MultiValueRemove>\n )\n}\n\nconst Option = (props: any) => {\n return (\n <Box paddingX={1} paddingY={1}>\n <components.Option {...props}>\n <Flex align=\"center\">\n {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n {props.children}\n </Flex>\n </components.Option>\n </Box>\n )\n}\n\nexport const reactSelectComponents = {\n DropdownIndicator,\n IndicatorSeparator: null,\n Menu,\n MenuList,\n MultiValueLabel,\n MultiValueRemove,\n Option,\n}\n","import {Box} from '@sanity/ui'\nimport {Controller} from 'react-hook-form'\nimport CreatableSelect from 'react-select/creatable'\nimport {useColorSchemeValue} from 'sanity'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/creatable'\nimport type {TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n control: any\n description?: string\n disabled?: boolean\n error?: string\n label: string\n name: string\n onCreateTag: (tagName: string) => void\n options: {\n label: string\n value: string\n }[]\n placeholder?: string\n value?: TagSelectOption[] | null\n}\n\nconst FormFieldInputTags = (props: Props) => {\n const {\n control,\n description,\n disabled,\n error,\n label,\n name,\n onCreateTag,\n options,\n placeholder,\n value,\n } = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const creating = useTypedSelector((state) => state.tags.creating)\n const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n return (\n <Box\n // HACK: force stacking context to ensure react-select dropdown sits above other fields\n style={{zIndex: 2}}\n >\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n {/* Select */}\n <Controller\n control={control}\n defaultValue={value}\n name={name}\n render={({field}) => {\n const {onBlur, onChange, value: controllerValue} = field\n // TODO: investigate overriding `onChange` and updating form state manually.\n // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n //\n // To illustrate this issue:\n // - Edit an asset with no tags\n // - Add a new tag (either an existing one, or create one inline)\n // - Remove the tag you've just created\n //\n // At this point, the form will still be marked as dirty when it shouldnt be\n return (\n <CreatableSelect\n components={reactSelectComponents}\n instanceId=\"tags\"\n isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n isDisabled={creating || disabled || tagsFetching}\n isLoading={creating}\n isMulti\n name={name}\n noOptionsMessage={() => 'No tags'}\n onBlur={onBlur}\n onChange={onChange}\n onCreateOption={onCreateTag}\n options={options}\n placeholder={tagsFetching ? 'Loading...' : placeholder}\n styles={reactSelectStyles(scheme)}\n value={controllerValue}\n />\n )\n }}\n />\n </Box>\n )\n}\n\nexport default FormFieldInputTags\n","import {Box, TextInput} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: string\n label: string\n name: string\n onBlur?: FocusEventHandler<HTMLInputElement>\n onChange?: ChangeEventHandler<HTMLInputElement>\n placeholder?: string\n value?: string\n ref?: Ref<HTMLInputElement>\n}\n\nconst FormFieldInputText = (props: Props) => {\n const {\n description,\n disabled,\n error,\n label,\n name,\n onBlur,\n onChange,\n placeholder,\n value,\n ref,\n ...rest\n } = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n {/* Input */}\n <TextInput\n {...rest}\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n />\n </Box>\n )\n}\n\nexport default FormFieldInputText\n","import {Box, TextArea} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: string\n label: string\n name: string\n onBlur?: FocusEventHandler<HTMLTextAreaElement>\n onChange?: ChangeEventHandler<HTMLTextAreaElement>\n placeholder?: string\n rows?: number\n value?: string\n ref?: Ref<HTMLTextAreaElement>\n}\n\nconst FormFieldInputTextarea = (props: Props) => {\n const {\n description,\n disabled,\n error,\n label,\n name,\n onBlur,\n onChange,\n placeholder,\n rows,\n value,\n ref,\n ...rest\n } = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n {/* Input */}\n <TextArea\n {...rest}\n autoComplete=\"off\"\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n ref={ref}\n rows={rows}\n />\n </Box>\n )\n}\n\nexport default FormFieldInputTextarea\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type Control, type FieldErrors, type UseFormRegister} from 'react-hook-form'\n\nimport type {Asset, AssetFormData, Locale, TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\nimport FormFieldInputTags from '../FormFieldInputTags'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormFieldInputTextarea from '../FormFieldInputTextarea'\n\ntype LocalizedErrors = Record<string, {message?: string} | undefined>\n\n// When locales are not configured, extract a plain string from a potentially localized field\nfunction toStringField(value: unknown): string | undefined {\n if (typeof value === 'string') return value\n if (typeof value === 'object' && value !== null) {\n const found = Object.values(value as Record<string, string>).find((v) => v)\n return found || undefined\n }\n return undefined\n}\n\nfunction truncateFolderPath(path?: string): string | undefined {\n const segments = path?.split('/').filter(Boolean)\n if (!segments || segments.length <= 3) return path\n return [segments[0], '...', ...segments.slice(-2)].join('/')\n}\n\nexport type DetailsProps = {\n formUpdating: boolean\n handleCreateTag: (title: string) => void\n control: Control<AssetFormData>\n errors: FieldErrors<AssetFormData>\n register: UseFormRegister<AssetFormData>\n allTagOptions: TagSelectOption[]\n assetTagOptions: TagSelectOption[] | null\n currentAsset: Asset\n folderPath?: string\n folderMissing?: boolean\n onChangeFolder: () => void\n onRemoveFolder: () => void\n creditLine?: {\n enabled: boolean\n excludeSources?: string | string[] | undefined\n }\n locales?: Locale[]\n}\n\nexport default function Details({\n formUpdating,\n handleCreateTag,\n control,\n errors,\n register,\n allTagOptions,\n assetTagOptions,\n currentAsset,\n folderPath,\n folderMissing,\n onChangeFolder,\n onRemoveFolder,\n creditLine,\n locales,\n}: DetailsProps) {\n 'use no memo'\n // React Compiler memoizes the register() field JSX using asset-derived deps only.\n // That can leave Save stuck disabled while the DOM still updates (uncontrolled inputs).\n // Tags work because they use Controller; string fields use register and need this opt-out.\n\n const hasLocales = locales && locales.length > 0\n const [activeLocaleTab, setActiveLocaleTab] = useState(0)\n const folderId = currentAsset?.opt?.media?.folder?._ref\n const folderLabel =\n truncateFolderPath(folderPath) || (folderMissing ? 'Folder no longer exists' : 'No folder')\n\n return (\n <Stack gap={3}>\n {/* Tags */}\n <FormFieldInputTags\n control={control}\n disabled={formUpdating}\n error={errors?.opt?.media?.tags?.message}\n label=\"Tags\"\n name=\"opt.media.tags\"\n onCreateTag={handleCreateTag}\n options={allTagOptions}\n placeholder=\"Select or create...\"\n value={assetTagOptions}\n />\n {/* Folder */}\n <Box>\n <FormFieldInputLabel label=\"Folder\" name=\"folder\" />\n <Card border padding={2} radius={2}>\n <Flex align=\"center\" gap={3} justify=\"space-between\">\n <Flex\n align=\"center\"\n gap={2}\n flex={1}\n style={{minWidth: 0, overflowX: 'auto', whiteSpace: 'nowrap', overflowY: 'hidden'}}\n >\n <FolderIcon />\n <Text muted={!folderId} size={1}>\n {folderLabel}\n </Text>\n </Flex>\n {folderId && (\n <Button\n aria-label=\"Remove from folder\"\n disabled={formUpdating}\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={onRemoveFolder}\n padding={2}\n tone=\"critical\"\n type=\"button\"\n />\n )}\n <Button\n padding={2}\n disabled={formUpdating}\n fontSize={1}\n mode=\"ghost\"\n onClick={onChangeFolder}\n text={folderId ? 'Change folder' : 'Add to folder'}\n type=\"button\"\n />\n </Flex>\n </Card>\n </Box>\n {/* Filename */}\n <FormFieldInputText\n {...register('originalFilename')}\n disabled={formUpdating}\n error={errors?.originalFilename?.message}\n label=\"Filename\"\n name=\"originalFilename\"\n value={currentAsset?.originalFilename}\n />\n {/* Localized fields grouped by language */}\n {hasLocales ? (\n <Card marginTop={2} shadow={1} padding={3} radius={1}>\n <Stack gap={2}>\n <TabList gap={2}>\n {locales.map((locale, idx) => (\n <Tab\n key={locale.id}\n id={`locale-tab-${locale.id}`}\n aria-controls={`locale-panel-${locale.id}`}\n selected={activeLocaleTab === idx}\n onClick={() => setActiveLocaleTab(idx)}\n label={locale.title}\n />\n ))}\n </TabList>\n {locales.map((locale, idx) => (\n <TabPanel\n key={locale.id}\n id={`locale-panel-${locale.id}`}\n aria-labelledby={`locale-tab-${locale.id}`}\n hidden={activeLocaleTab !== idx}\n >\n <Stack gap={3}>\n <FormFieldInputText\n {...register(`title.${locale.id}` as const)}\n disabled={formUpdating}\n error={(errors?.title as LocalizedErrors)?.[locale.id]?.message}\n label=\"Title\"\n name={`title.${locale.id}`}\n />\n <FormFieldInputText\n {...register(`altText.${locale.id}` as const)}\n disabled={formUpdating}\n error={(errors?.altText as LocalizedErrors)?.[locale.id]?.message}\n label=\"Alt Text\"\n name={`altText.${locale.id}`}\n />\n <FormFieldInputTextarea\n {...register(`description.${locale.id}` as const)}\n disabled={formUpdating}\n error={(errors?.description as LocalizedErrors)?.[locale.id]?.message}\n label=\"Description\"\n name={`description.${locale.id}`}\n rows={5}\n />\n {creditLine?.enabled && (\n <FormFieldInputText\n {...register(`creditLine.${locale.id}` as const)}\n error={(errors?.creditLine as LocalizedErrors)?.[locale.id]?.message}\n label=\"Credit\"\n name={`creditLine.${locale.id}`}\n disabled={\n formUpdating ||\n creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n }\n />\n )}\n </Stack>\n </TabPanel>\n ))}\n </Stack>\n </Card>\n ) : (\n <>\n <FormFieldInputText\n {...register('title')}\n disabled={formUpdating}\n error={errors?.title?.message}\n label=\"Title\"\n name=\"title\"\n value={toStringField(currentAsset?.title)}\n />\n <FormFieldInputText\n {...register('altText')}\n disabled={formUpdating}\n error={errors?.altText?.message}\n label=\"Alt Text\"\n name=\"altText\"\n value={toStringField(currentAsset?.altText)}\n />\n <FormFieldInputTextarea\n {...register('description')}\n disabled={formUpdating}\n error={errors?.description?.message}\n label=\"Description\"\n name=\"description\"\n rows={5}\n />\n {creditLine?.enabled && (\n <FormFieldInputText\n {...register('creditLine')}\n error={errors?.creditLine?.message}\n label=\"Credit\"\n name=\"creditLine\"\n value={toStringField(currentAsset?.creditLine)}\n disabled={\n formUpdating || creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n }\n />\n )}\n </>\n )}\n </Stack>\n )\n}\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {type SubmitHandler, useForm, useFormState} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue, useDocumentStore} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {getAssetFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {selectFolderPathById} from '../../modules/folders'\nimport {selectTags, selectTagSelectOptions, tagsActions} from '../../modules/tags'\nimport type {Asset, AssetFormData, DialogAssetEditProps, TagSelectOption} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport AssetMetadata from '../AssetMetadata'\nimport Dialog from '../Dialog'\nimport DocumentList from '../DocumentList'\nimport FileAssetPreview from '../FileAssetPreview'\nimport FormSubmitButton from '../FormSubmitButton'\nimport Image from '../Image'\nimport Details, {type DetailsProps} from './Details'\n\nfunction renderDefaultDetails(props: DetailsProps) {\n return <Details {...props} />\n}\n\ntype Props = {\n children: ReactNode\n dialog: DialogAssetEditProps\n}\n\nconst DialogAssetEdit = (props: Props) => {\n const {\n children,\n dialog: {assetId, id, lastCreatedTag, lastRemovedTagIds},\n } = props\n\n const client = useVersionedClient()\n const scheme = useColorSchemeValue()\n\n const documentStore = useDocumentStore()\n\n const dispatch = useDispatch()\n const assetItem = useTypedSelector((state) => selectAssetById(state, String(assetId))) // TODO: check casting\n const tags = useTypedSelector(selectTags)\n\n const assetUpdatedPrev = useRef<string | undefined>(undefined)\n\n // Generate a snapshot of the current asset\n const [assetSnapshot, setAssetSnapshot] = useState(assetItem?.asset)\n const [tabSection, setTabSection] = useState<'details' | 'references'>('details')\n\n const currentAsset = assetItem ? assetItem?.asset : assetSnapshot\n const allTagOptions = getTagSelectOptions(tags)\n\n const assetTagOptions = useTypedSelector(selectTagSelectOptions(currentAsset))\n const currentFolderId = currentAsset?.opt?.media?.folder?._ref ?? null\n const currentFolderPath = useTypedSelector((state) =>\n selectFolderPathById(state, currentFolderId),\n )\n\n // Check if credit line options are configured\n const {creditLine, components: {details: CustomDetails} = {}, locales} = useToolOptions()\n\n const generateDefaultValues = useCallback(\n (asset?: Asset): AssetFormData => {\n let imageDescription: string | undefined\n if (asset && isImageAsset(asset)) {\n const raw = asset.metadata?.image?.['ImageDescription']\n if (typeof raw === 'string') {\n imageDescription = raw\n }\n }\n\n if (locales && locales.length > 0) {\n const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n const obj: Record<string, string> = {}\n for (let i = 0; i < locales.length; i++) {\n const locale = locales[i]!\n // Prefer key presence over truthiness so an intentional empty string\n // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n if (typeof field === 'object' && field && locale.id in field) {\n obj[locale.id] = field[locale.id] ?? ''\n } else if (typeof field === 'string') {\n // Only populate the first locale to avoid spreading a legacy value\n // across all languages; the user should fill in other translations manually\n obj[locale.id] = i === 0 ? field : ''\n } else if (typeof field === 'object' && field) {\n // Localized object present but this locale key is missing: leave empty.\n // Do not apply EXIF fallback to partial translations.\n obj[locale.id] = ''\n } else {\n // No description set at all — EXIF fallback only for the first locale.\n obj[locale.id] = i === 0 ? fallback : ''\n }\n }\n return obj\n }\n return {\n altText: makeLocaleObj(asset?.altText),\n creditLine: makeLocaleObj(asset?.creditLine),\n description: makeLocaleObj(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: makeLocaleObj(asset?.title),\n }\n }\n // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n const flattenField = (field: unknown, fallback = ''): string => {\n if (typeof field === 'string') return field\n if (typeof field === 'object' && field !== null) {\n const values = Object.values(field as Record<string, string>)\n return values.find((v) => v) || fallback\n }\n return fallback\n }\n return {\n altText: flattenField(asset?.altText),\n creditLine: flattenField(asset?.creditLine),\n description: flattenField(asset?.description, imageDescription),\n originalFilename: asset?.originalFilename || '',\n opt: {media: {tags: assetTagOptions}},\n title: flattenField(asset?.title),\n }\n },\n [assetTagOptions, locales],\n )\n\n const {control, getValues, handleSubmit, register, reset, setValue} = useForm<AssetFormData>({\n defaultValues: generateDefaultValues(assetItem?.asset),\n mode: 'onChange',\n resolver: zodFormResolver<AssetFormData>(getAssetFormSchema(locales)),\n })\n\n // Subscribe via useFormState so React Compiler cannot skip formState Proxy reads\n // that gate the Save button (isDirty / isValid).\n const {errors, isDirty, isValid} = useFormState({control})\n\n const formUpdating = !assetItem || assetItem?.updating\n\n const handleClose = useCallback(() => {\n dispatch(dialogActions.remove({id}))\n }, [dispatch, id])\n\n const handleDelete = useCallback(() => {\n if (!assetItem?.asset) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteAssets({\n assets: [assetItem],\n closeDialogId: assetItem?.asset._id,\n }),\n )\n }, [assetItem, dispatch])\n\n const handleAssetUpdate = useCallback((update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate asset snapshot\n setAssetSnapshot(result as Asset)\n }\n }, [])\n\n const handleCreateTag = useCallback(\n (tagName: string) => {\n // Dispatch action to create new tag\n dispatch(\n tagsActions.createRequest({\n assetId: currentAsset?._id,\n name: tagName,\n }),\n )\n },\n [currentAsset?._id, dispatch],\n )\n\n const handleChangeFolder = useCallback(() => {\n if (!assetItem) {\n return\n }\n\n dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n }, [assetItem, currentFolderId, dispatch])\n\n const handleRemoveFolder = useCallback(() => {\n if (!assetItem || !currentFolderId) {\n return\n }\n\n dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n }, [assetItem, currentFolderId, dispatch])\n\n // Detect if asset has localized fields (objects) with keys not in the configured locales\n const hasOrphanedLocales = useMemo(() => {\n if (!currentAsset) return false\n const isLocaleObj = (v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)\n const fields = [\n currentAsset.title,\n currentAsset.altText,\n currentAsset.description,\n ...(currentAsset._type === 'sanity.imageAsset' ? [currentAsset.creditLine] : []),\n ]\n const anyLocalized = fields.some((f) => isLocaleObj(f))\n if (!anyLocalized) return false\n if (!locales || locales.length === 0) return true\n const configuredIds = new Set(locales.map((l) => l.id))\n return fields.some((f) => {\n if (!isLocaleObj(f)) return false\n return Object.keys(f as object).some((k) => !configuredIds.has(k))\n })\n }, [currentAsset, locales])\n\n const handleCleanupLocales = useCallback(async () => {\n if (!currentAsset) return\n\n const cleanField = (field: unknown): unknown => {\n if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n const obj = field as Record<string, string>\n if (!locales || locales.length === 0) {\n // Pick the first non-empty value sorted by key for determinism\n const sorted = Object.keys(obj).sort()\n return sorted.map((k) => obj[k]).find((v) => v) || ''\n }\n const configuredIds = new Set(locales.map((l) => l.id))\n const cleaned: Record<string, string> = {}\n for (const [key, val] of Object.entries(obj)) {\n if (configuredIds.has(key)) cleaned[key] = val\n }\n return cleaned\n }\n\n await client\n .patch(currentAsset._id)\n .set({\n title: cleanField(currentAsset.title),\n altText: cleanField(currentAsset.altText),\n description: cleanField(currentAsset.description),\n ...(currentAsset._type === 'sanity.imageAsset' && {\n creditLine: cleanField(currentAsset.creditLine),\n }),\n })\n .commit()\n }, [client, currentAsset, locales])\n\n // Submit react-hook-form\n const onSubmit: SubmitHandler<AssetFormData> = useCallback(\n (formData) => {\n if (!assetItem?.asset) {\n return\n }\n\n const sanitizedFormData = sanitizeFormData(formData)\n\n // Keep an intentionally cleared description as '' (not null) so the EXIF\n // ImageDescription fallback does not refill it the next time the dialog opens.\n if (formData.description === '') {\n sanitizedFormData['description'] = ''\n }\n\n dispatch(\n assetsActions.updateRequest({\n asset: assetItem?.asset,\n closeDialogId: assetItem?.asset._id,\n formData: {\n ...sanitizedFormData,\n // Map tags to sanity references\n opt: {\n media: {\n ...sanitizedFormData['opt'].media,\n tags:\n sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n _ref: tag.value,\n _type: 'reference',\n _weak: true,\n })) || null,\n // Preserve the folder reference — it is managed separately and must\n // not be wiped when patching opt.media via .set().\n ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n },\n },\n },\n }),\n )\n },\n [assetItem?.asset, currentAsset, dispatch],\n )\n\n // Listen for asset mutations and update snapshot\n useEffect(() => {\n if (!assetItem?.asset) {\n return undefined\n }\n\n // Remember that Sanity listeners ignore joins, order clauses and projections\n const subscriptionAsset = client\n .listen(groq`*[_id == $id]`, {id: assetItem?.asset._id})\n .subscribe(handleAssetUpdate)\n\n return () => {\n subscriptionAsset?.unsubscribe()\n }\n }, [assetItem?.asset, client, handleAssetUpdate])\n\n // Update tags form field (react-select) when a new _inline_ tag has been created\n useEffect(() => {\n if (lastCreatedTag) {\n const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n const updatedTags = existingTags.concat([lastCreatedTag])\n setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n }\n }, [getValues, lastCreatedTag, setValue])\n\n // Update tags form field (react-select) when an _inline_ tag has been removed elsewhere\n useEffect(() => {\n if (lastRemovedTagIds) {\n const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n const updatedTags = existingTags.filter((tag) => {\n return !lastRemovedTagIds.includes(tag.value)\n })\n\n setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n }\n }, [getValues, lastRemovedTagIds, setValue])\n\n // Reset react-hook-form local state on mount and every time the asset has been updated elsewhere\n useEffect(() => {\n if (assetUpdatedPrev.current !== assetItem?.asset._updatedAt) {\n reset(generateDefaultValues(assetItem?.asset))\n }\n assetUpdatedPrev.current = assetItem?.asset._updatedAt\n }, [assetItem?.asset, generateDefaultValues, reset])\n\n const footer = (\n <Box padding={3}>\n <Stack gap={3}>\n {hasOrphanedLocales && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Flex align=\"center\" justify=\"space-between\" gap={3}>\n <Text size={1}>\n This asset has localized fields that are no longer configured. Clean them up to\n avoid validation errors.\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleCleanupLocales}\n text=\"Cleanup localized fields\"\n tone=\"caution\"\n />\n </Flex>\n </Card>\n )}\n <Flex justify=\"space-between\">\n {/* Delete button */}\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n isValid={isValid}\n lastUpdated={currentAsset?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Stack>\n </Box>\n )\n\n if (!currentAsset) {\n return null\n }\n\n const detailsProps = {\n control,\n errors,\n formUpdating,\n register,\n setValue,\n assetTagOptions,\n allTagOptions,\n handleCreateTag,\n currentAsset,\n folderPath: currentFolderPath,\n folderMissing: !!currentFolderId && !currentFolderPath,\n onChangeFolder: handleChangeFolder,\n onRemoveFolder: handleRemoveFolder,\n creditLine,\n locales,\n }\n\n return (\n <Dialog animate footer={footer} header=\"Asset details\" id={id} onClose={handleClose} width={3}>\n {/*\n We reverse direction to ensure the download button doesn't appear (in the DOM) before other tabbable items.\n This ensures that the dialog doesn't scroll down to the download button (which on smaller screens, can sometimes\n be below the fold).\n */}\n <Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n documentStore={documentStore}\n id={currentAsset._id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n return (\n <>\n {/* Tabs */}\n <TabList gap={2}>\n <Tab\n aria-controls=\"details-panel\"\n disabled={formUpdating}\n id=\"details-tab\"\n label=\"Details\"\n onClick={() => setTabSection('details')}\n selected={tabSection === 'details'}\n size={2}\n />\n <Tab\n aria-controls=\"references-panel\"\n disabled={formUpdating}\n id=\"references-tab\"\n label={`References${\n !isLoading && Array.isArray(uniqueReferringDocuments)\n ? ` (${uniqueReferringDocuments.length})`\n : ''\n }`}\n onClick={() => setTabSection('references')}\n selected={tabSection === 'references'}\n size={2}\n />\n </TabList>\n\n {/* Form fields */}\n <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!assetItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Panel: details */}\n <TabPanel\n aria-labelledby=\"details\"\n hidden={tabSection !== 'details'}\n id=\"details-panel\"\n >\n {CustomDetails ? (\n <CustomDetails\n {...detailsProps}\n renderDefaultDetails={renderDefaultDetails}\n />\n ) : (\n <Details {...detailsProps} />\n )}\n </TabPanel>\n\n {/* Panel: References */}\n <TabPanel\n aria-labelledby=\"references\"\n hidden={tabSection !== 'references'}\n id=\"references-panel\"\n >\n <Box marginTop={5}>\n {assetItem?.asset && (\n <DocumentList\n documents={uniqueReferringDocuments}\n isLoading={isLoading}\n />\n )}\n </Box>\n </TabPanel>\n </Box>\n </>\n )\n }}\n </WithReferringDocuments>\n </Box>\n\n <Box flex={1} padding={4}>\n <Box style={{aspectRatio: '1'}}>\n {/* File */}\n {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n {/* Image */}\n {isImageAsset(currentAsset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n />\n )}\n </Box>\n\n {/* Metadata */}\n {currentAsset && (\n <Box marginTop={4}>\n <AssetMetadata asset={currentAsset} item={assetItem} />\n </Box>\n )}\n </Box>\n </Flex>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogAssetEdit\n","import {createSelector} from '@reduxjs/toolkit'\n\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../types'\nimport {selectCurrentFolderChildren} from './folders'\nimport type {RootReducerState} from './types'\n\nexport const selectCombinedItems = createSelector(\n [\n (state: RootReducerState) => state.assets.allIds,\n (state: RootReducerState) => state.uploads.allIds,\n selectCurrentFolderChildren,\n ],\n (assetIds, uploadIds, folderChildren) => {\n const assetItems = assetIds.map((id): CardAssetData => ({id, type: 'asset'}))\n const folderItems = folderChildren.map((folder): CardFolderData => ({\n id: `folder:${folder.id}`,\n folderId: folder.id,\n name: folder.name,\n path: folder.path,\n totalCount: folder.totalCount,\n type: 'folder',\n }))\n const uploadItems = uploadIds.map((id): CardUploadData => ({id, type: 'upload'}))\n const combinedItems: (CardAssetData | CardFolderData | CardUploadData)[] = [\n ...folderItems,\n ...uploadItems,\n ...assetItems,\n ]\n return combinedItems\n },\n)\n","import {isHotkey} from 'is-hotkey-esm'\nimport {type RefObject, useCallback, useEffect, useRef} from 'react'\n\nconst useKeyPress = (hotkey: string, onPress?: () => void): RefObject<boolean> => {\n const keyPressed = useRef(false)\n\n // If pressed key is our target key then set to true\n const downHandler = useCallback(\n (e: KeyboardEvent) => {\n if (isHotkey(hotkey, e)) {\n keyPressed.current = true\n if (onPress) {\n onPress()\n }\n }\n },\n [hotkey, onPress],\n )\n\n // If released key is our target key then set to false\n const upHandler = useCallback(() => {\n keyPressed.current = false\n }, [])\n\n // Add event listeners\n useEffect(() => {\n window.addEventListener('keydown', downHandler)\n window.addEventListener('keyup', upHandler)\n // Remove event listeners on cleanup\n return () => {\n window.removeEventListener('keydown', downHandler)\n window.removeEventListener('keyup', upHandler)\n }\n }, [downHandler, upHandler])\n\n return keyPressed\n}\n\nexport default useKeyPress\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n Box,\n Checkbox,\n Container,\n Flex,\n Spinner,\n Text,\n type Theme,\n type ThemeColorSchemeKey,\n} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {memo, type MouseEvent, type RefObject} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n id: string\n selected: boolean\n source?: string\n}\n\nconst CardWrapper = styled(Flex)`\n box-sizing: border-box;\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n`\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst CardContainer = styled(Flex)<{$picked?: boolean; theme: Theme; $updating?: boolean}>(({\n $picked,\n theme,\n $updating,\n}) => {\n return css`\n border: 1px solid transparent;\n height: 100%;\n pointer-events: ${$updating ? 'none' : 'auto'};\n position: relative;\n transition: all 300ms;\n user-select: none;\n width: 100%;\n\n border: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n $picked ? `1px solid ${theme.sanity.color.spot.orange} !important` : '1px solid inherit'\n };\n\n ${\n !$updating &&\n css`\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n border: 1px solid var(--card-border-color);\n }\n }\n `\n }\n `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n $scheme,\n}) => {\n return css`\n cursor: pointer;\n height: ${PANEL_HEIGHT}px;\n transition: all 300ms;\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `\n})\n\nconst StyledWarningOutlineIcon = styled(WarningFilledIcon)(({theme}) => {\n return {\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst CardAsset = (props: Props) => {\n const {id, selected, source} = props\n\n const scheme = useColorSchemeValue()\n const toast = useToast()\n\n // Refs\n const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n // Redux\n const dispatch = useDispatch()\n const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n const item = useTypedSelector((state) => selectAssetById(state, id))\n // Dialog carries the replace target so search refetch (which clears allIds/picks) is safe.\n const dialogReplaceAssetId = useTypedSelector((state) => {\n if (source !== 'replace-asset') {\n return undefined\n }\n const dialog = state.dialog.items.find((d) => d.type === 'dialogAllAssets')\n return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n })\n\n const asset = item?.asset\n const error = item?.error\n const isOpaque = item?.asset?.metadata?.isOpaque\n const picked = item?.picked\n const updating = item?.updating\n\n // Prefer dialog assetId; fall back to the single currently-picked asset (not lastPicked).\n const assetToReplaceId =\n dialogReplaceAssetId ??\n (source === 'replace-asset' && assetsPicked.length === 1\n ? assetsPicked[0]?.asset._id\n : undefined)\n\n const assetToReplace = useTypedSelector((state) =>\n assetToReplaceId ? selectAssetById(state, assetToReplaceId) : undefined,\n )\n\n const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n // Short circuit if no asset is available\n if (!asset) {\n return null\n }\n\n const handleReplaceAsset = () => {\n if (!assetToReplaceId || !isImageAsset(asset) || assetToReplace?.updating) {\n return\n }\n\n dispatch(assetsActions.updateImageReferences({asset, id: assetToReplaceId}))\n toast.push({\n status: 'info',\n title:\n 'Updating in progress. Depending on the amount of changes, this could take a few minutes.',\n })\n dispatch(dialogActions.clear())\n }\n\n // Callbacks\n const handleAssetClick = (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (source === 'replace-asset') {\n handleReplaceAsset()\n return\n }\n\n if (selected) {\n return\n }\n\n if (onSelect && !isMultiSelect) {\n onSelect([\n {\n kind: 'assetDocumentId',\n value: asset._id,\n },\n ])\n } else if (onSelect && isMultiSelect) {\n if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n } else if (shiftPressed.current) {\n if (picked) {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n } else {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n }\n } else {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n }\n }\n\n const handleContextActionClick = (e: MouseEvent) => {\n e.stopPropagation()\n\n if (source === 'replace-asset') {\n handleReplaceAsset()\n return\n }\n\n if (selected) {\n return\n }\n\n if (onSelect && !isMultiSelect) {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n } else if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n }\n\n const opacityContainer = updating ? 0.5 : 1\n const opacityPreview = selected || updating ? 0.25 : 1\n\n return (\n <CardWrapper padding={1}>\n <CardContainer direction=\"column\" $picked={picked} $updating={item.updating}>\n {/* Image */}\n <Box\n flex={1}\n style={{\n cursor: selected ? 'default' : 'pointer',\n position: 'relative',\n }}\n >\n <div\n data-testid={`media-asset-card-${asset._id}`}\n onClick={handleAssetClick}\n style={{height: '100%', opacity: opacityPreview}}\n >\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 250, width: 250})}\n style={{\n draggable: false,\n transition: 'opacity 1000ms',\n }}\n />\n )}\n </div>\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n opacity: opacityContainer,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n </Box>\n\n {/* Footer */}\n <ContextActionContainer\n align=\"center\"\n onClick={handleContextActionClick}\n paddingX={1}\n $scheme={scheme}\n style={{opacity: opacityContainer}}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n flexShrink: 0,\n pointerEvents: 'none',\n transform: 'scale(0.8)',\n }}\n />\n )}\n\n <Box marginLeft={2}>\n <Text muted size={0} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>\n </ContextActionContainer>\n\n {/* TODO: DRY */}\n {/* Error button */}\n {error && (\n <Box\n padding={3}\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningOutlineIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )}\n </CardContainer>\n </CardWrapper>\n )\n}\n\nexport default memo(CardAsset)\n","import {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n folderId: string\n name: string\n totalCount: number\n}\n\nconst CardWrapper = styled(Flex)`\n box-sizing: border-box;\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n`\n\nconst FolderCard = styled(Card)`\n cursor: pointer;\n height: 100%;\n transition: border-color 200ms ease;\n width: 100%;\n\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n border-color: var(--card-border-color);\n }\n }\n`\n\nconst FolderGlyph = styled(Box)(\n ({theme}) => css`\n align-items: flex-end;\n background: linear-gradient(\n 180deg,\n ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n }\n 0%,\n ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n }\n 100%\n );\n border-radius: 8px;\n display: flex;\n height: 72px;\n position: relative;\n width: 96px;\n\n &::before {\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n };\n border-radius: 8px 8px 0 0;\n content: '';\n height: 18px;\n left: 0;\n position: absolute;\n top: -8px;\n width: 38px;\n }\n `,\n)\n\nconst CardFolder = ({folderId, name, totalCount}: Props) => {\n const dispatch = useDispatch()\n const scheme = useColorSchemeValue()\n\n return (\n <CardWrapper padding={1}>\n <FolderCard\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n padding={3}\n radius={2}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n }}\n >\n <Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n <Flex align=\"center\" flex={1} justify=\"center\">\n <FolderGlyph />\n </Flex>\n\n <Stack gap={2}>\n <Text\n size={1}\n style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n weight=\"semibold\"\n >\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.2em'}}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Stack>\n </Flex>\n </FolderCard>\n </CardWrapper>\n )\n}\n\nexport default CardFolder\n","import {Observable, from, of} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nconst PREVIEW_WIDTH = 180 // px\n\nconst createBlob = (img: HTMLImageElement): Promise<Blob | null> => {\n return new Promise((resolve) => {\n const imageAspect = img.width / img.height\n\n // Create a canvas element which we'll use to generate a low resolution preview.\n // Ensure that the canvas is at least 1 pixel high as blob generation will fail otherwise.\n const canvas: HTMLCanvasElement = document.createElement('canvas')\n canvas.width = PREVIEW_WIDTH\n canvas.height = Math.max(PREVIEW_WIDTH / imageAspect, 1)\n\n // Fail silently if we're unable to generate a preview image.\n // This can often be the case when trying to render SVGs containing `<foreignObject>` elements.\n try {\n const ctx = canvas.getContext('2d')\n ctx?.drawImage(img, 0, 0, PREVIEW_WIDTH, PREVIEW_WIDTH / imageAspect)\n canvas.toBlob(resolve, 'image/jpeg')\n } catch (err) {\n console.warn(`Unable to generate preview image:`, err)\n }\n })\n}\n\nconst createImageEl = (file: File): Promise<HTMLImageElement> => {\n return new Promise((resolve) => {\n const blobUrlLarge = window.URL.createObjectURL(file)\n const img = new Image()\n img.onload = () => {\n window.URL.revokeObjectURL(blobUrlLarge)\n resolve(img)\n }\n img.src = blobUrlLarge\n })\n}\n\nconst generatePreviewBlobUrl = async (file: File): Promise<string> => {\n const imageEl = await createImageEl(file)\n const blob = await createBlob(imageEl)\n\n if (!blob) {\n throw Error('Unable to generate file Blob')\n }\n\n return window.URL.createObjectURL(blob)\n}\n\nexport const generatePreviewBlobUrl$ = (file: File): Observable<string> => {\n return of(null).pipe(mergeMap(() => from(generatePreviewBlobUrl(file))))\n}\n","import {Subject, Subscription, Observable, from} from 'rxjs'\n// Takes a observable-returning function and returns a new function that limits on the number of\n// concurrent observables.\nimport {first, mergeMap} from 'rxjs/operators'\n\nconst DEFAULT_CONCURRENCY = 4\n\nfunction remove<T>(array: Array<T>, item: T): Array<T> {\n const index = array.indexOf(item)\n if (index > -1) {\n array.splice(index, 1)\n }\n return array\n}\n\nexport const createThrottler = (concurrency: number = DEFAULT_CONCURRENCY) => {\n const currentSubscriptions: Array<Subscription> = []\n const pendingObservables: Array<Observable<any>> = []\n const ready$ = new Subject()\n\n function request(observable: Observable<any>): Observable<any> {\n return new Observable((observer) => {\n if (currentSubscriptions.length >= concurrency) {\n return scheduleAndWait$(observable)\n .pipe(mergeMap(request)) //\n .subscribe(observer)\n }\n const subscription = observable.subscribe(observer)\n currentSubscriptions.push(subscription)\n return () => {\n remove(currentSubscriptions, subscription)\n remove(pendingObservables, observable)\n subscription.unsubscribe()\n while (pendingObservables.length > 0 && currentSubscriptions.length < concurrency) {\n ready$.next(pendingObservables.shift())\n }\n }\n })\n }\n\n function scheduleAndWait$(observable: Observable<any>): Observable<any> {\n pendingObservables.push(observable)\n return ready$.asObservable().pipe(first((obs) => obs === observable))\n }\n\n return request\n}\n\nexport const withMaxConcurrency = (\n func: (...args: any[]) => Observable<any>,\n concurrency: number = DEFAULT_CONCURRENCY,\n) => {\n const throttler = createThrottler(concurrency)\n return (...args: Array<any>) => from(throttler(func(...args)))\n}\n","// Sourced from:\n// https://github.com/sanity-io/sanity/blob/ccb777e115a8cdf20d81a9a2bc9d8c228568faff/packages/%40sanity/form-builder/src/sanity/inputs/client-adapters/assets.ts\n\nimport type {SanityAssetDocument, SanityClient, SanityImageAssetDocument} from '@sanity/client'\nimport {Observable, of, throwError} from 'rxjs'\nimport {map, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError} from '../types'\nimport {withMaxConcurrency} from './withMaxConcurrency'\n\nconst fetchExisting$ = (client: SanityClient, type: string, hash: string) => {\n return client.observable.fetch('*[_type == $documentType && sha1hash == $hash][0]', {\n documentType: type,\n hash,\n })\n}\n\nconst readFile$ = (file: File): Observable<ArrayBuffer> => {\n return new Observable((subscriber) => {\n const reader = new FileReader()\n reader.onload = () => {\n subscriber.next(reader.result as ArrayBuffer)\n subscriber.complete()\n }\n reader.onerror = (err) => {\n subscriber.error(err)\n }\n reader.readAsArrayBuffer(file)\n return () => {\n reader.abort()\n }\n })\n}\n\nconst hexFromBuffer = (buffer: ArrayBuffer): string => {\n return Array.prototype.map\n .call(new Uint8Array(buffer), (x) => `00${x.toString(16)}`.slice(-2))\n .join('')\n}\n\nexport const hashFile$ = (file: File): Observable<string> => {\n if (!window.crypto || !window.crypto.subtle || !window.FileReader) {\n return throwError(() => ({\n message: 'Unable to generate hash: uploads are only allowed in secure contexts',\n statusCode: 500,\n }))\n }\n return readFile$(file).pipe(\n mergeMap((arrayBuffer) => window.crypto.subtle.digest('SHA-1', arrayBuffer)),\n map(hexFromBuffer),\n )\n}\n\nconst uploadSanityAsset$ = (\n client: SanityClient,\n assetType: 'file' | 'image',\n file: File,\n hash: string,\n) => {\n return of(null).pipe(\n // NOTE: the sanity api will still dedupe unique files, but this saves us from uploading the asset file entirely\n mergeMap(() => fetchExisting$(client, `sanity.${assetType}Asset`, hash)),\n // Cancel if the asset already exists\n mergeMap((existingAsset: SanityAssetDocument | SanityImageAssetDocument | null) => {\n if (existingAsset) {\n return throwError(\n () =>\n ({\n message: 'Asset already exists',\n statusCode: 409,\n }) satisfies HttpError,\n )\n }\n\n return of(null)\n }),\n mergeMap(() => {\n // Begin upload if no existing asset found\n return client.observable.assets\n .upload(assetType, file, {\n extract: ['blurhash', 'exif', 'image', 'location', 'lqip', 'palette'],\n preserveFilename: true,\n })\n .pipe(\n map((event) =>\n event.type === 'response'\n ? {\n // rewrite to a 'complete' event\n asset: event.body.document,\n id: event.body.document._id,\n type: 'complete',\n }\n : event,\n ),\n )\n }),\n )\n}\n\nexport const uploadAsset$ = withMaxConcurrency(uploadSanityAsset$)\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\nimport groq from 'groq'\nimport {EMPTY, from, merge, of} from 'rxjs'\nimport {catchError, delay, filter, mergeMap, takeUntil, withLatestFrom} from 'rxjs/operators'\n\nimport type {HttpError, MyEpic, SanityUploadProgressEvent, UploadItem} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {generatePreviewBlobUrl$} from '../../utils/generatePreviewBlobUrl'\nimport {hashFile$, uploadAsset$} from '../../utils/uploadSanityAsset'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from './actions'\n\nexport type UploadsReducerState = {\n allIds: string[]\n byIds: Record<string, UploadItem>\n}\n\nconst initialState = {\n allIds: [],\n byIds: {},\n} as UploadsReducerState\n\nconst uploadsSlice = createSlice({\n name: 'uploads',\n initialState,\n extraReducers: (builder) => {\n builder //\n .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n const {asset} = action.payload\n if (state.byIds[asset.sha1hash]) {\n state.byIds[asset.sha1hash]!.status = 'complete'\n }\n })\n },\n reducers: {\n checkRequest(\n _state,\n _action: PayloadAction<{assets: (SanityAssetDocument | SanityImageAssetDocument)[]}>,\n ) {\n //\n },\n checkComplete(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n const {results} = action.payload\n\n const assetHashes = Object.keys(results)\n\n assetHashes.forEach((hash) => {\n const deleteIndex = state.allIds.indexOf(hash)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n\n if (state.byIds[hash]) {\n const blobUrl = state.byIds[hash].objectUrl\n if (blobUrl) {\n window.URL.revokeObjectURL(blobUrl)\n }\n\n delete state.byIds[hash]\n }\n })\n },\n previewReady(state, action: PayloadAction<{hash: string; blobUrl: string}>) {\n const {blobUrl, hash} = action.payload\n if (state.byIds[hash]) {\n state.byIds[hash].objectUrl = blobUrl\n }\n },\n uploadCancel(state, action: PayloadAction<{hash: string}>) {\n const {hash} = action.payload\n const deleteIndex = state.allIds.indexOf(hash)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n if (state.byIds[hash]) {\n delete state.byIds[hash]\n }\n },\n uploadError(state, action: PayloadAction<{error: HttpError; hash: string}>) {\n const {hash} = action.payload\n const deleteIndex = state.allIds.indexOf(hash)\n if (deleteIndex >= 0) {\n state.allIds.splice(deleteIndex, 1)\n }\n delete state.byIds[hash]\n },\n uploadRequest(\n _state,\n _action: PayloadAction<{file: File; forceAsAssetType?: 'file' | 'image'}>,\n ) {\n //\n },\n uploadProgress(\n state,\n action: PayloadAction<{event: SanityUploadProgressEvent; uploadHash: string}>,\n ) {\n const {event, uploadHash} = action.payload\n state.byIds[uploadHash]!.percent = event.percent\n state.byIds[uploadHash]!.status = 'uploading'\n },\n uploadStart(state, action: PayloadAction<{file: File; uploadItem: UploadItem}>) {\n const {uploadItem} = action.payload\n if (!state.allIds.includes(uploadItem.hash)) {\n state.allIds.push(uploadItem.hash)\n }\n state.byIds[uploadItem.hash] = uploadItem\n },\n },\n})\n\n// Epics\n\nexport const uploadsAssetStartEpic: MyEpic = (action$, _state$, {client}) =>\n action$.pipe(\n filter(uploadsActions.uploadStart.match),\n mergeMap((action) => {\n const {file, uploadItem} = action.payload\n\n return merge(\n // Generate low res preview\n of(null).pipe(\n mergeMap(() => generatePreviewBlobUrl$(file)),\n mergeMap((url) => {\n return of(\n uploadsActions.previewReady({\n blobUrl: url,\n hash: uploadItem.hash,\n }),\n )\n }),\n ),\n // Upload asset and receive progress / complete events\n of(null).pipe(\n // delay(500000), // debug uploads\n mergeMap(() => uploadAsset$(client, uploadItem.assetType, file, uploadItem.hash)),\n takeUntil(\n action$.pipe(\n filter(uploadsActions.uploadCancel.match),\n filter((v) => v.payload.hash === uploadItem.hash),\n ),\n ),\n mergeMap((event) => {\n if (event?.type === 'complete') {\n const folderId = uploadItem.folderId || null\n\n if (!folderId) {\n return of(\n UPLOADS_ACTIONS.uploadComplete({\n asset: event.asset,\n }),\n )\n }\n\n return from(\n client\n .patch(event.asset._id)\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .set({\n 'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n })\n .commit(),\n ).pipe(\n mergeMap((asset) =>\n of(\n UPLOADS_ACTIONS.uploadComplete({\n asset: asset as SanityAssetDocument | SanityImageAssetDocument,\n }),\n ),\n ),\n )\n }\n if (event?.type === 'progress' && event?.stage === 'upload') {\n return of(\n uploadsActions.uploadProgress({\n event,\n uploadHash: uploadItem.hash,\n }),\n )\n }\n return EMPTY\n }),\n catchError((error: ClientError) =>\n of(\n uploadsActions.uploadError({\n error: {\n message: error?.message || 'Internal error',\n statusCode: error?.statusCode || 500,\n },\n hash: uploadItem.hash,\n }),\n ),\n ),\n ),\n )\n }),\n )\n\nexport const uploadsAssetUploadEpic: MyEpic = (action$, state$) =>\n action$.pipe(\n filter(uploadsActions.uploadRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {file, forceAsAssetType} = action.payload\n\n return of(action).pipe(\n // Generate SHA1 hash from local file\n // This will throw in insecure contexts (non-localhost / https)\n mergeMap(() => hashFile$(file)),\n // Ignore if the file exists and is currently being uploaded\n filter((hash) => {\n const exists = !!state.uploads.byIds[hash]\n return !exists\n }),\n // Dispatch start action and begin upload process\n mergeMap((hash) => {\n const assetType = forceAsAssetType || (file.type.indexOf('image') >= 0 ? 'image' : 'file')\n const uploadItem = {\n _type: 'upload',\n assetType,\n folderId: state.folders.currentFolderId,\n hash,\n name: file.name,\n size: file.size,\n status: 'queued',\n } as UploadItem\n return of(uploadsActions.uploadStart({file, uploadItem}))\n }),\n )\n }),\n )\n\nexport const uploadsCompleteQueueEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(UPLOADS_ACTIONS.uploadComplete.match),\n mergeMap((action) => {\n return of(\n uploadsActions.checkRequest({\n assets: [action.payload.asset],\n }),\n )\n }),\n )\n\nexport const uploadsCheckRequestEpic: MyEpic = (action$, state$, {client}) =>\n action$.pipe(\n filter(uploadsActions.checkRequest.match),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const {assets} = action.payload\n\n const documentIds = assets.map((asset) => asset._id)\n\n const constructedFilter = constructFilter({\n assetTypes: state.assets.assetTypes,\n currentFolderId: state.folders.currentFolderId,\n excludeTagSlugs: state.assets.excludeTagSlugs,\n searchFacets: state.search.facets,\n searchQuery: state.search.query,\n })\n\n const query = groq`\n *[${constructedFilter} && _id in $documentIds].sha1hash\n `\n\n return of(action).pipe(\n delay(1000), // give Sanity some time to register the recently uploaded asset\n mergeMap(() => client.observable.fetch<string[]>(query, {documentIds})),\n mergeMap((resultHashes) => {\n const checkedResults = assets.reduce((acc: Record<string, string | null>, asset) => {\n acc[asset.sha1hash] = resultHashes.includes(asset.sha1hash) ? asset._id : null\n return acc\n }, {})\n\n return of(\n uploadsActions.checkComplete({results: checkedResults}), //\n assetsActions.insertUploads({results: checkedResults}),\n )\n }),\n )\n }),\n )\n\n// Selectors\n\nexport const selectUploadById = createSelector(\n [\n (state: RootReducerState) => state.uploads.byIds,\n (_state: RootReducerState, uploadId: string) => uploadId,\n ],\n (byIds, uploadId) => byIds[uploadId],\n)\n\nexport const uploadsActions = {...uploadsSlice.actions}\n\nexport default uploadsSlice.reducer\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n id: string\n}\n\nconst CardWrapper = styled(Flex)`\n box-sizing: border-box;\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n`\n\nconst CardUpload = (props: Props) => {\n const {id} = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const item = useTypedSelector((state) => selectUploadById(state, id))\n\n if (!item) {\n return null\n }\n\n const fileSize = filesize(item.size, {base: 10, round: 0})\n const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n const isComplete = item.status === 'complete'\n const isUploading = item.status === 'uploading'\n const isQueued = item.status === 'queued'\n\n let status\n if (isComplete) {\n status = 'Verifying'\n }\n if (isUploading) {\n status = `${percentLoaded}%`\n }\n if (isQueued) {\n status = 'Queued'\n }\n\n // Callbacks\n const handleCancelUpload = () => {\n dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n }\n\n return (\n <CardWrapper padding={1}>\n <Flex\n direction=\"column\"\n flex={1}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n border: '1px solid transparent',\n height: '100%',\n position: 'relative',\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />\n\n <Box flex={1} style={{position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{\n opacity: 0.4,\n }}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"80px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n direction=\"column\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={4}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>\n\n {/* Footer */}\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={2}\n style={{height: `${PANEL_HEIGHT}px`}}\n >\n <Box flex={1} marginRight={1}>\n <Text size={0} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n </Box>\n <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n {status}\n </Text>\n </Flex>\n </Flex>\n </CardWrapper>\n )\n}\n\nexport default CardUpload\n","import {memo} from 'react'\nimport {VirtuosoGrid} from 'react-virtuoso'\nimport {styled} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport CardAsset from '../CardAsset'\nimport CardFolder from '../CardFolder'\nimport CardUpload from '../CardUpload'\n\ntype Props = {\n items: (CardAssetData | CardFolderData | CardUploadData)[]\n onLoadMore?: () => void\n source?: string\n}\n\nconst CARD_HEIGHT = 220\nconst CARD_WIDTH = 240\n\nconst VirtualCell = memo(\n ({\n item,\n selected,\n source,\n }: {\n item: CardAssetData | CardFolderData | CardUploadData\n selected: boolean\n source?: string\n }) => {\n if (item?.type === 'asset') {\n return <CardAsset id={item.id} selected={selected} source={source} />\n }\n\n if (item?.type === 'folder') {\n return <CardFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n }\n\n if (item?.type === 'upload') {\n return <CardUpload id={item.id} />\n }\n\n return null\n },\n)\n\nconst StyledItemContainer = styled.div`\n height: ${CARD_HEIGHT}px;\n width: ${CARD_WIDTH}px;\n`\n\nconst ItemContainer = (props: any) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n const {context, ref, ...rest} = props\n return <StyledItemContainer ref={ref} {...rest} />\n}\n\nconst StyledListContainer = styled.div`\n display: grid;\n grid-template-columns: repeat(auto-fill, ${CARD_WIDTH}px);\n grid-template-rows: repeat(auto-fill, ${CARD_HEIGHT}px);\n justify-content: center;\n margin: 0 auto;\n`\n\nconst ListContainer = (props: any) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n const {context, ref, ...rest} = props\n return <StyledListContainer ref={ref} {...rest} />\n}\n\nconst AssetGridVirtualized = (props: Props) => {\n const {items, onLoadMore, source} = props\n\n // Redux\n const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n const totalCount = items?.length\n\n if (totalCount === 0) {\n return null\n }\n\n return (\n <VirtuosoGrid\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n return item?.id ?? index\n }}\n components={{\n Item: ItemContainer,\n List: ListContainer,\n }}\n endReached={onLoadMore}\n itemContent={(index) => {\n const item = items[index]!\n const selected = selectedIds.includes(item.id)\n return <VirtualCell item={item} selected={selected} source={source} />\n }}\n overscan={48}\n style={{overflowX: 'hidden', overflowY: 'scroll'}}\n totalCount={totalCount}\n />\n )\n}\n\nexport default AssetGridVirtualized\n","import {Box, Text} from '@sanity/ui'\nimport {useEffect, useRef, useState} from 'react'\nimport {useDispatch, useStore} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport type {RootReducerState} from '../../modules/types'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\n\nfunction omitFacetId(facet: WithId<SearchFacetInputProps>): SearchFacetInputProps {\n // Strip the runtime `id` so facetsAdd can assign a fresh one on restore.\n const {id: _id, ...withoutId} = facet\n void _id\n return withoutId\n}\n\nconst ReplaceAssetsOverview = () => {\n const dispatch = useDispatch()\n const store = useStore<RootReducerState>()\n const combinedItems = useTypedSelector(selectCombinedItems)\n const assetsById = useTypedSelector((state) => state.assets.byIds)\n const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const fetchingError = useTypedSelector((state) => state.assets.fetchingError)\n const pageSize = useTypedSelector((state) => state.assets.pageSize)\n const searchQuery = useTypedSelector((state) => state.search.query)\n const searchFacets = useTypedSelector((state) => state.search.facets)\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const currentFolderUnfiled = useTypedSelector((state) => state.folders.currentFolderUnfiled)\n\n // Prefer the dialog's assetId — search refetch clears `allIds` / can drop picks.\n const assetToReplaceId = useTypedSelector((state) => {\n const dialog = state.dialog.items.find((item) => item.type === 'dialogAllAssets')\n return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n })\n\n const savedBrowserStateRef = useRef<{\n assetId: string | undefined\n query: string\n facets: WithId<SearchFacetInputProps>[]\n folderId: string | null\n folderUnfiled: boolean\n } | null>(null)\n\n // Clearing the search only triggers a refetch after `assetsSearchEpic`'s debounce, so the\n // stale results stay in the store for a moment. Track that gap to avoid rendering the\n // empty state before the unscoped results arrive.\n const [awaitingRefetch, setAwaitingRefetch] = useState(\n () =>\n searchQuery.length > 0 ||\n searchFacets.length > 0 ||\n Boolean(currentFolderId) ||\n currentFolderUnfiled,\n )\n\n // Clear the browser search, facets and folder scope so the picker is not limited to the\n // result set the user used to find the asset. Restore them when the dialog closes.\n useEffect(() => {\n const {dialog, folders, search} = store.getState()\n const {query, facets} = search\n const dialogItem = dialog.items.find((item) => item.type === 'dialogAllAssets')\n\n savedBrowserStateRef.current = {\n assetId: dialogItem?.type === 'dialogAllAssets' ? dialogItem.assetId : undefined,\n query,\n facets,\n folderId: folders.currentFolderId,\n folderUnfiled: folders.currentFolderUnfiled,\n }\n\n if (query.length > 0) {\n dispatch(searchActions.querySet({searchQuery: ''}))\n }\n if (facets.length > 0) {\n dispatch(searchActions.facetsClear())\n }\n if (folders.currentFolderId || folders.currentFolderUnfiled) {\n dispatch(foldersActions.currentFolderClear())\n }\n\n return () => {\n const saved = savedBrowserStateRef.current\n if (!saved) {\n return\n }\n\n const hadScope =\n saved.query.length > 0 ||\n saved.facets.length > 0 ||\n Boolean(saved.folderId) ||\n saved.folderUnfiled\n\n if (saved.query.length > 0) {\n dispatch(searchActions.querySet({searchQuery: saved.query}))\n }\n for (const facet of saved.facets) {\n dispatch(searchActions.facetsAdd({facet: omitFacetId(facet)}))\n }\n if (saved.folderId) {\n dispatch(foldersActions.currentFolderSet({folderId: saved.folderId}))\n } else if (saved.folderUnfiled) {\n dispatch(foldersActions.currentFolderShowUnfiled())\n }\n\n // Changing the search or folder runs epics that clear picks — put the asset being\n // replaced back so closing the dialog keeps the browser selection.\n if (hadScope && saved.assetId) {\n dispatch(assetsActions.pick({assetId: saved.assetId, picked: true}))\n }\n }\n }, [dispatch, store])\n\n // Every rescoped refetch is preceded by `assetsActions.clear()`, so wait for the asset\n // list to be emptied and the following fetch to settle. Watching `fetching` alone is not\n // enough: `assetsFetchEpic` uses `switchMap`, so replacing an in-flight request leaves\n // `fetching` true throughout. Clearing a folder scope and a search at the same time\n // produces two refetches (the folder one immediately, the search one after its debounce),\n // so each list clear re-arms the wait rather than resolving it for good.\n useEffect(() => {\n let previousIds = store.getState().assets.allIds\n let awaitingSettle = false\n\n return store.subscribe(() => {\n const {allIds, fetching: isFetching} = store.getState().assets\n const listCleared = allIds !== previousIds && allIds.length === 0\n previousIds = allIds\n\n if (listCleared) {\n awaitingSettle = true\n setAwaitingRefetch(true)\n return\n }\n if (awaitingSettle && !isFetching) {\n awaitingSettle = false\n setAwaitingRefetch(false)\n }\n })\n }, [store])\n\n const scopeActive =\n searchQuery.length > 0 ||\n searchFacets.length > 0 ||\n Boolean(currentFolderId) ||\n currentFolderUnfiled\n\n // Only image assets can replace image refs; exclude uploads and the asset being replaced.\n const reducedItems = combinedItems.filter((item) => {\n if (item.type !== 'asset' || item.id === assetToReplaceId) {\n return false\n }\n const asset = assetsById[item.id]?.asset\n return asset ? isImageAsset(asset) : false\n })\n\n const hasFetchedOnce = fetchCount >= 0\n const hasMorePages = fetchCount === pageSize\n // Don't treat a scoped / stale / mid-fetch / incomplete page as \"no replacements\".\n const isEmpty =\n reducedItems.length === 0 &&\n hasFetchedOnce &&\n !fetching &&\n !scopeActive &&\n !awaitingRefetch &&\n !hasMorePages\n\n // Keep loading pages until we find image candidates or exhaust results. A failed fetch\n // leaves `fetchCount` untouched, so stop paging on error instead of retrying forever.\n useEffect(() => {\n if (\n scopeActive ||\n fetching ||\n awaitingRefetch ||\n fetchingError ||\n reducedItems.length > 0 ||\n !hasFetchedOnce ||\n !hasMorePages\n ) {\n return\n }\n dispatch(assetsActions.loadNextPage())\n }, [\n dispatch,\n scopeActive,\n fetching,\n awaitingRefetch,\n fetchingError,\n reducedItems.length,\n hasFetchedOnce,\n hasMorePages,\n ])\n\n const handleLoadMoreItems = () => {\n if (!fetching) {\n dispatch(assetsActions.loadNextPage())\n }\n }\n\n return (\n <Box height=\"fill\">\n {isEmpty ? (\n <Box padding={5}>\n <Text size={1} weight=\"semibold\">\n There are no replacement images\n </Text>\n </Box>\n ) : (\n <Box height=\"fill\">\n <AssetGridVirtualized\n items={reducedItems}\n onLoadMore={handleLoadMoreItems}\n source=\"replace-asset\"\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport default ReplaceAssetsOverview\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogAllAssetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport ReplaceAssetsOverview from '../ReplaceAssetsOverView'\n\ntype Props = {\n children: ReactNode\n dialog: DialogAllAssetsProps\n}\n\nconst DialogAllAssets = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog header=\"Choose a replacement image\" id={id} onClose={handleClose} width={3}>\n <Box padding={4} style={{height: '50vh'}}>\n <ReplaceAssetsOverview />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogAllAssets\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Flex, Stack, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogConfirmProps} from '../../types'\nimport Dialog from '../Dialog'\n\ntype Props = {\n children?: ReactNode\n dialog: DialogConfirmProps\n}\n\nconst DialogConfirm = (props: Props) => {\n const {children, dialog} = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = () => {\n dispatch(dialogActions.remove({id: dialog?.id}))\n }\n\n const handleConfirm = () => {\n // Close target dialog, if provided\n if (dialog?.closeDialogId) {\n dispatch(dialogActions.remove({id: dialog?.closeDialogId}))\n }\n\n if (dialog?.confirmCallbackAction) {\n dispatch(dialog.confirmCallbackAction)\n }\n\n // Close self\n handleClose()\n }\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"space-between\">\n <Button fontSize={1} mode=\"bleed\" onClick={handleClose} text=\"Cancel\" />\n <Button\n fontSize={1}\n onClick={handleConfirm}\n text={dialog?.confirmText}\n tone={dialog?.tone}\n />\n </Flex>\n </Box>\n )\n\n const Header = () => (\n <Flex align=\"center\">\n <Box paddingX={1}>\n <WarningOutlineIcon />\n </Box>\n <Box marginLeft={2}>{dialog?.headerTitle}</Box>\n </Flex>\n )\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n // oxlint-disable-next-line react/static-components\n header={<Header />}\n id=\"confirm\"\n onClose={handleClose}\n width={1}\n >\n <Box paddingX={4} paddingY={4}>\n <Stack gap={3}>\n {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n {dialog?.description && (\n <Text muted size={1}>\n <em>{dialog.description}</em>\n </Text>\n )}\n </Stack>\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogConfirm\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderCreateProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogFolderCreateProps\n}\n\nconst DialogFolderCreate = (props: Props) => {\n const {\n children,\n dialog: {parentFolderId, id},\n } = props\n\n const dispatch = useDispatch()\n const creating = useTypedSelector((state) => state.folders.creating)\n const creatingError = useTypedSelector((state) => state.folders.creatingError)\n const parentPath = useTypedSelector((state) => selectFolderPathById(state, parentFolderId))\n\n const {\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n setError,\n } = useForm<FolderFormData>({\n defaultValues: {\n name: '',\n },\n mode: 'onChange',\n resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n })\n\n const handleClose = () => {\n dispatch(dialogActions.clear())\n }\n\n const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n foldersActions.createRequest({\n name: sanitizedFormData['name'],\n parentId: parentFolderId || null,\n }),\n )\n }\n\n useEffect(() => {\n if (creatingError) {\n setError('name', {message: creatingError.message})\n }\n }, [creatingError, setError])\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n <FormSubmitButton\n disabled={creating || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Create Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {parentPath && (\n <Box marginBottom={3}>\n <Text muted size={1}>\n Creating inside {parentPath}\n </Text>\n </Box>\n )}\n\n <FormFieldInputText\n {...register('name')}\n disabled={creating}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolderCreate\n","import {Box, Button, Flex, Inline, Stack, Text, Tree, TreeItem} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {type ReactNode, useMemo, useState} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectFolderTree} from '../../modules/folders'\nimport type {DialogFolderMoveProps, FolderTreeNode} from '../../types'\nimport Dialog from '../Dialog'\n\nconst getExpandedIdSet = (\n folderId: string | null,\n byId: Record<string, {parentId: string | null}>,\n) => {\n const expanded = new Set<string>()\n let cursor: string | null = folderId\n while (cursor) {\n const node = byId[cursor]\n if (!node) break\n expanded.add(cursor)\n cursor = node.parentId\n }\n return expanded\n}\n\ntype Props = {\n children: ReactNode\n dialog: DialogFolderMoveProps\n}\n\ntype FolderNodeProps = {\n expandedIds: Set<string>\n node: FolderTreeNode\n onSelect: (folderId: string) => void\n selectedId: string | null\n}\n\nconst FolderNode = ({expandedIds, node, onSelect, selectedId}: FolderNodeProps) => {\n const hasChildren = node.children.length > 0\n const selected = selectedId === node.id\n\n return (\n <TreeItem\n expanded={expandedIds.has(node.id)}\n id={node.id}\n onClick={() => onSelect(node.id)}\n selected={selected}\n text={`${node.name} (${node.totalCount})`}\n weight={selected ? 'semibold' : 'medium'}\n >\n {hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))}\n </TreeItem>\n )\n}\n\ntype FolderTreeProps = {\n expandedIds: Set<string>\n folderTree: FolderTreeNode[]\n onSelect: (folderId: string) => void\n selectedId: string | null\n}\n\nconst FolderTree = ({expandedIds, folderTree, onSelect, selectedId}: FolderTreeProps) => (\n <Tree gap={1}>\n {folderTree.map((node) => (\n <FolderNode\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={onSelect}\n selectedId={selectedId}\n />\n ))}\n </Tree>\n)\n\nconst DialogFolderMove = ({children, dialog}: Props) => {\n const dispatch = useDispatch()\n const folderTree = useTypedSelector(selectFolderTree)\n const byId = useTypedSelector((state) => state.folders.byId)\n const {assets, folderId, id} = dialog\n const [selectedId, setSelectedId] = useState<string | null>(folderId || null)\n const selectedFolder = selectedId ? byId[selectedId] : null\n const expandedIds = useMemo(() => getExpandedIdSet(folderId || null, byId), [byId, folderId])\n\n const handleClose = () => {\n dispatch(dialogActions.remove({id}))\n }\n\n const handleMove = () => {\n if (!selectedId) {\n return\n }\n\n dispatch(\n assetsActions.folderSetRequest({\n assets,\n closeDialogId: id,\n folderId: selectedId,\n }),\n )\n }\n\n return (\n <Dialog\n animate\n footer={\n <Box padding={3}>\n <Flex justify=\"flex-end\" gap={2}>\n <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n <Button\n disabled={!selectedId}\n mode=\"default\"\n onClick={handleMove}\n text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n tone=\"primary\"\n />\n </Flex>\n </Box>\n }\n header=\"Move to Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Stack gap={4} padding={4}>\n <Text size={1}>\n Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n </Text>\n\n <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n <FolderTree\n expandedIds={expandedIds}\n folderTree={folderTree}\n onSelect={setSelectedId}\n selectedId={selectedId}\n />\n\n {folderTree.length === 0 && (\n <Box marginTop={3}>\n <Text muted size={1}>\n No folders yet.\n </Text>\n </Box>\n )}\n </Box>\n\n {selectedFolder && (\n <Inline gap={2}>\n <Text muted size={1}>\n Destination:\n </Text>\n <Text size={1} weight=\"semibold\">\n {selectedFolder.name}\n </Text>\n </Inline>\n )}\n </Stack>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolderMove\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderRenameProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogFolderRenameProps\n}\n\nconst DialogFolderRename = ({children, dialog}: Props) => {\n const {folderId, id} = dialog\n const dispatch = useDispatch()\n const renaming = useTypedSelector((state) => state.folders.renaming)\n const renameError = useTypedSelector((state) => state.folders.renameError)\n const folder = useTypedSelector((state) => state.folders.byId[folderId])\n const folderPath = useTypedSelector((state) => selectFolderPathById(state, folderId))\n const currentName = folder?.name || ''\n const parentPath = folderPath.includes('/')\n ? folderPath.slice(0, folderPath.lastIndexOf('/'))\n : null\n\n const {\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n setError,\n } = useForm<FolderFormData>({\n defaultValues: {\n name: currentName,\n },\n mode: 'onChange',\n resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n })\n\n const handleClose = () => {\n dispatch(dialogActions.remove({id}))\n }\n\n const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n foldersActions.renameRequest({\n name: sanitizedFormData['name'],\n folderId,\n }),\n )\n }\n\n useEffect(() => {\n if (renameError) {\n setError('name', {message: renameError.message})\n }\n }, [renameError, setError])\n\n return (\n <Dialog\n animate\n footer={\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n <FormSubmitButton\n disabled={renaming || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n }\n header=\"Rename Folder\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n <Box marginBottom={3}>\n <Text muted size={1}>\n {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n </Text>\n </Box>\n\n <FormFieldInputText\n {...register('name')}\n disabled={renaming}\n error={errors?.name?.message}\n label=\"Folder name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolderRename\n","import {AddIcon} from '@sanity/icons/Add'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Inline, Label, Text, Tree, TreeItem} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode, useMemo} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {foldersActions, selectCanDeleteFolder, selectFolderTree} from '../../modules/folders'\nimport type {FolderTreeNode} from '../../types'\n\nconst getExpandedIdSet = (\n folderId: string | null,\n byId: Record<string, {parentId: string | null}>,\n) => {\n const expanded = new Set<string>()\n let cursor: string | null = folderId\n while (cursor) {\n const node = byId[cursor]\n if (!node) break\n expanded.add(cursor)\n cursor = node.parentId\n }\n return expanded\n}\n\ntype FolderNodeProps = {\n currentFolderId: string | null\n expandedIds: Set<string>\n node: FolderTreeNode\n onSelect: (folderId: string) => void\n}\n\ntype FolderHeaderActionProps = {\n disabled?: boolean\n icon: ReactNode\n onClick: () => void\n tone?: 'critical' | 'default' | 'primary'\n tooltip: string\n}\n\nconst FolderHeaderAction = ({\n disabled = false,\n icon,\n onClick,\n tone = 'default',\n tooltip,\n}: FolderHeaderActionProps) => (\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>\n }\n disabled={typeof window !== 'undefined' && 'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={tooltip}\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />\n </Tooltip>\n)\n\ntype FolderItemTextProps = {\n name: string\n totalCount: number\n}\n\n/**\n * this uses some hacky css to get the desired layout\n * The tree item is a text container, so we need to use a span to wrap the content\n */\nconst FolderItemText = ({name, totalCount}: FolderItemTextProps) => (\n <span\n style={{\n boxSizing: 'border-box',\n display: 'block',\n maxWidth: '100%',\n minWidth: 0,\n overflow: 'hidden',\n paddingRight: '2rem',\n position: 'relative',\n width: '100%',\n }}\n >\n <span\n style={{\n alignItems: 'center',\n display: 'flex',\n paddingLeft: '0.25rem',\n gap: '0.5rem',\n minWidth: 0,\n overflow: 'hidden',\n }}\n >\n <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n <FolderIcon />\n </span>\n <span\n style={{\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {name}\n </span>\n </span>\n <span\n style={{\n fontSize: '0.75rem',\n opacity: 0.78,\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n {totalCount}\n </span>\n </span>\n)\n\nconst FolderNode = ({currentFolderId, expandedIds, node, onSelect}: FolderNodeProps) => {\n const hasChildren = node.children.length > 0\n const selected = currentFolderId === node.id\n\n return (\n <TreeItem\n expanded={expandedIds.has(node.id)}\n id={node.id}\n onClick={() => onSelect(node.id)}\n selected={selected}\n text={<FolderItemText name={node.name} totalCount={node.totalCount} />}\n weight={selected ? 'semibold' : 'medium'}\n >\n {hasChildren &&\n node.children.map((childNode) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={childNode.id}\n node={childNode}\n onSelect={onSelect}\n />\n ))}\n </TreeItem>\n )\n}\n\nconst FolderView = () => {\n const dispatch = useDispatch()\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const byId = useTypedSelector((state) => state.folders.byId)\n const canDeleteFolder = useTypedSelector(selectCanDeleteFolder)\n const fetching = useTypedSelector((state) => state.folders.fetching)\n const folderTree = useTypedSelector(selectFolderTree)\n const currentFolder = currentFolderId ? byId[currentFolderId] : null\n const expandedIds = useMemo(\n () => getExpandedIdSet(currentFolderId, byId),\n [byId, currentFolderId],\n )\n const treeKey = useMemo(() => Array.from(expandedIds).join('|') || 'root', [expandedIds])\n\n const hasFolders = folderTree.length > 0\n\n const handleFolderSelect = (folderId: string) => {\n dispatch(foldersActions.currentFolderSet({folderId}))\n }\n\n const handleFolderDelete = () => {\n if (!currentFolderId || !currentFolder) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteFolder({\n folderId: currentFolderId,\n folderName: currentFolder.name,\n }),\n )\n }\n\n return (\n <Flex direction=\"column\" flex={1} height=\"fill\">\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingX={3}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }}\n >\n <Box flex={1}>\n <Inline gap={2}>\n <Label size={0}>Folders</Label>\n {fetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n </Box>\n\n <Inline gap={1}>\n {currentFolderId && (\n <FolderHeaderAction\n icon={<EditIcon />}\n onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n tone=\"primary\"\n tooltip=\"Rename folder\"\n />\n )}\n\n <FolderHeaderAction\n icon={<AddIcon />}\n onClick={() =>\n dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n }\n tone=\"primary\"\n tooltip=\"Create folder\"\n />\n\n {currentFolderId && canDeleteFolder && (\n <FolderHeaderAction\n icon={<TrashIcon />}\n onClick={handleFolderDelete}\n tone=\"critical\"\n tooltip=\"Delete folder\"\n />\n )}\n </Inline>\n </Flex>\n\n <Box padding={2}>\n <Box>\n <Tree gap={1} key={treeKey}>\n <TreeItem\n id=\"__all-assets\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n selected={currentFolderId === null}\n text=\"All assets\"\n weight={currentFolderId === null ? 'semibold' : 'medium'}\n />\n\n {folderTree.map((node) => (\n <FolderNode\n currentFolderId={currentFolderId}\n expandedIds={expandedIds}\n key={node.id}\n node={node}\n onSelect={handleFolderSelect}\n />\n ))}\n </Tree>\n\n {!hasFolders && !fetching && (\n <Box marginTop={3} paddingX={1}>\n <Text muted size={1}>\n <em>No folders</em>\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n </Flex>\n )\n}\n\nexport default FolderView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogFoldersProps} from '../../types'\nimport Dialog from '../Dialog'\nimport FolderView from '../FolderView'\n\ntype Props = {\n children: ReactNode\n dialog: DialogFoldersProps\n}\n\nconst DialogFolders = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n const dispatch = useDispatch()\n\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog animate header=\"Folders\" id={id} onClose={handleClose} width={1}>\n <Box\n style={{\n height: '100%',\n minHeight: '420px',\n }}\n >\n <FolderView />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogFolders\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Flex, Label, rem, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n children: ReactNode\n facet: WithId<SearchFacetInputProps>\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled<typeof Box, {$scheme: ThemeColorSchemeKey}>(Box)(({$scheme, theme}) => {\n return css`\n background: ${getSchemeColor($scheme, 'bg')};\n border-radius: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n rem(theme.sanity.radius[2]!)\n };\n `\n})\n\nconst SearchFacet = (props: Props) => {\n const {children, facet} = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n\n const handleClose = () => {\n dispatch(searchActions.facetsRemoveById({facetId: facet.id}))\n }\n\n return (\n <Container padding={[2, 2, 1]} $scheme={scheme}>\n <Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n {/* Title */}\n <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n <Label\n size={0}\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n {facet.title}\n </Label>\n </Box>\n\n <Flex align=\"center\">\n {children}\n\n {/* Close button */}\n <Box marginLeft={1} paddingX={2}>\n <Text muted size={0}>\n <CloseIcon onClick={handleClose} />\n </Text>\n </Box>\n </Flex>\n </Flex>\n </Container>\n )\n}\n\nexport default SearchFacet\n","import {TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\n\n// TODO: use correct type\ntype Props = any & {\n onValueChange: (value: number) => void\n value?: number\n}\n\nconst TextInputNumber = (props: Props) => {\n const {onValueChange, value, ...remainingProps} = props\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value\n const regex = /^[0-9\\b]+$/\n\n // Test for number and strip leading zeroes\n if (val === '' || regex.test(val)) {\n onValueChange(parseInt(val, 10) || '')\n }\n }\n\n return (\n <TextInput\n {...remainingProps}\n onChange={handleChange} //\n value={value ?? ''}\n />\n )\n}\n\nexport default TextInputNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n SearchFacetInputNumberModifier,\n SearchFacetInputNumberProps,\n SearchFacetOperatorType,\n WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\nimport TextInputNumber from '../TextInputNumber'\n\ntype Props = {\n facet: WithId<SearchFacetInputNumberProps>\n}\n\nconst SearchFacetNumber = ({facet}: Props) => {\n // Redux\n const dispatch = useDispatch()\n\n const popoverProps = usePortalPopoverProps()\n\n const modifiers = facet?.modifiers\n const selectedModifier = facet?.modifier\n ? modifiers?.find((modifier) => modifier.name === facet?.modifier)\n : modifiers?.[0]\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n }\n\n const handleModifierClick = (modifier: SearchFacetInputNumberModifier) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, modifier: modifier.name}))\n }\n\n const handleValueChange = (value: number) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, value}))\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet.operatorType ?? 'greaterThan'\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n <Box marginX={1} style={{maxWidth: '50px'}}>\n <TextInputNumber\n fontSize={1}\n onValueChange={handleValueChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>\n\n {/* Modifiers */}\n {modifiers && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={selectedModifier?.title}\n />\n }\n id=\"modifier\"\n menu={\n <Menu>\n {modifiers.map((modifier) => {\n const selected = modifier.name === facet.modifier\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={modifier.name}\n onClick={() => handleModifierClick(modifier)}\n padding={2}\n text={modifier.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n </SearchFacet>\n )\n}\n\nexport default SearchFacetNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n SearchFacetInputSelectListItemProps,\n SearchFacetInputSelectProps,\n SearchFacetOperatorType,\n WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n facet: WithId<SearchFacetInputSelectProps>\n}\n\nconst SearchFacetSelect = ({facet}: Props) => {\n // Redux\n const dispatch = useDispatch()\n\n const popoverProps = usePortalPopoverProps()\n\n const options = facet?.options\n\n const selectedItem = options?.find((v) => v.name === facet?.value)\n\n const handleListItemClick = (option: SearchFacetInputSelectListItemProps) => {\n dispatch(searchActions.facetsUpdate({name: facet.name, value: option.name}))\n }\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdate({name: facet.name, operatorType}))\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet?.operatorType ?? 'is'\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Box marginRight={1}>\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n </Box>\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* List */}\n <MenuButton\n button={\n <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n }\n id=\"list\"\n menu={\n <Menu>\n {options?.map((item) => {\n const selected = item.name === selectedItem?.name\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={item.name}\n onClick={() => handleListItemClick(item)}\n padding={2}\n text={item.title}\n />\n )\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n </SearchFacet>\n )\n}\n\nexport default SearchFacetSelect\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputStringProps, SearchFacetOperatorType, WithId} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n facet: WithId<SearchFacetInputStringProps>\n}\n\nconst SearchFacetString = ({facet}: Props) => {\n // Redux\n const dispatch = useDispatch()\n\n const popoverProps = usePortalPopoverProps()\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n }\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n dispatch(searchActions.facetsUpdateById({id: facet.id, value: e.target.value}))\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n {!operators[selectedOperatorType].hideInput && (\n <Box marginLeft={1} style={{maxWidth: '125px'}}>\n <TextInput\n fontSize={1}\n onChange={handleChange}\n padding={2}\n radius={2}\n width={2}\n value={facet?.value}\n />\n </Box>\n )}\n </SearchFacet>\n )\n}\n\nexport default SearchFacetString\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {fonts, radius: themeRadius, space: themeSpace} = studioTheme\nconst themeTextSizes = fonts.text.sizes\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n return {\n control: (styles, {isDisabled, isFocused}) => {\n let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n if (isFocused) {\n boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n 0 0 0 1px ${getSchemeColor(scheme, 'bg2')},\n 0 0 0 3px var(--card-focus-ring-color) !important`\n }\n\n return {\n ...styles,\n 'backgroundColor': 'var(--card-bg-color)',\n 'color': 'inherit',\n 'border': 'none',\n 'borderRadius': themeRadius[2],\n boxShadow,\n 'fontSize': themeTextSizes[1]!.fontSize,\n 'minHeight': '25px',\n 'opacity': isDisabled ? 0.5 : 'inherit',\n 'outline': 'none',\n 'transition': 'none',\n '&:hover': {\n boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n },\n }\n },\n input: (styles) => ({\n ...styles,\n color: 'var(--card-fg-color)',\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n fontSize: themeTextSizes[1]!.fontSize,\n marginLeft: rem(themeSpace[2]!),\n }),\n menuList: (styles) => ({\n ...styles,\n padding: 0,\n }),\n noOptionsMessage: (styles) => ({\n ...styles,\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n fontFamily: studioTheme.fonts.text.family,\n fontSize: themeTextSizes[1]!.fontSize,\n lineHeight: '1em',\n }),\n option: (styles, {isFocused}) => ({\n ...styles,\n 'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n 'borderRadius': themeRadius[2],\n 'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n 'fontSize': themeTextSizes[1]!.fontSize,\n 'lineHeight': '1em',\n 'margin': 0,\n 'padding': rem(themeSpace[1]!),\n '&:hover': {\n backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n color: getSchemeColor(scheme, 'bg'),\n },\n }),\n placeholder: (styles) => ({\n ...styles,\n fontSize: themeTextSizes[1]!.fontSize,\n marginLeft: rem(themeSpace[2]!),\n paddingLeft: 0,\n }),\n singleValue: (styles) => ({\n ...styles,\n alignItems: 'center',\n display: 'inline-flex',\n height: '100%',\n marginLeft: rem(themeSpace[2]!),\n }),\n valueContainer: (styles) => ({\n ...styles,\n margin: 0,\n padding: 0,\n }),\n }\n}\n\nconst ClearIndicator = (props: any) => {\n return (\n <components.ClearIndicator {...props}>\n <Box\n paddingRight={1}\n style={{\n transform: 'scale(0.85)',\n }}\n >\n <Text muted size={0}>\n <CloseIcon />\n </Text>\n </Box>\n </components.ClearIndicator>\n )\n}\n\nconst Menu = (props: any) => {\n return (\n <components.Menu {...props}>\n <Card radius={1} shadow={2}>\n {props.children}\n </Card>\n </components.Menu>\n )\n}\n\nconst MenuList = (props: any) => {\n const {children} = props\n\n const MAX_ROWS = 5\n const OPTION_HEIGHT = 33\n\n if (Array.isArray(children)) {\n const height =\n children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n return (\n <Virtuoso\n className=\"media__custom-scrollbar\"\n itemContent={(index) => {\n const item = children[index]\n return <Option {...item.props} />\n }}\n style={{height}}\n totalCount={children.length}\n />\n )\n }\n return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst NoOptionsMessage = (props: any) => {\n return <components.NoOptionsMessage {...props}>{props.children}</components.NoOptionsMessage>\n}\n\nconst Option = (props: any) => {\n return (\n <Box padding={1}>\n <components.Option {...props}>\n <Box paddingY={1}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n {props.children}\n </Text>\n </Box>\n </components.Option>\n </Box>\n )\n}\n\nconst SingleValue = (props: any) => {\n return (\n <components.SingleValue {...props}>\n <Text size={1} textOverflow=\"ellipsis\">\n {props.children}\n </Text>\n </components.SingleValue>\n )\n}\n\nexport const reactSelectComponents = {\n ClearIndicator,\n DropdownIndicator: null,\n IndicatorSeparator: null,\n Menu,\n MenuList,\n NoOptionsMessage,\n Option,\n SingleValue,\n}\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\nimport Select from 'react-select'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {operators} from '../../config/searchFacets'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport {selectTags} from '../../modules/tags'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/single'\nimport type {\n TagSelectOption,\n SearchFacetInputSearchableProps,\n SearchFacetOperatorType,\n WithId,\n} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n facet: WithId<SearchFacetInputSearchableProps>\n}\n\nconst SearchFacetTags = ({facet}: Props) => {\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const {excludeTagSlugs} = useToolOptions()\n const tagsAll = useTypedSelector((state) => selectTags(state))\n const tags =\n excludeTagSlugs.length > 0\n ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n : tagsAll\n const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n const allTagOptions = getTagSelectOptions(tags)\n\n const popoverProps = usePortalPopoverProps()\n\n const handleChange = (option: TagSelectOption) => {\n dispatch(\n searchActions.facetsUpdateById({\n id: facet.id,\n value: option,\n }),\n )\n }\n\n const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n dispatch(\n searchActions.facetsUpdateById({\n id: facet.id,\n operatorType,\n }),\n )\n }\n\n const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n return (\n <SearchFacet facet={facet}>\n {/* Optional operators */}\n {facet?.operatorTypes && (\n <MenuButton\n button={\n <Button\n fontSize={1}\n iconRight={SelectIcon}\n padding={2}\n text={operators[selectedOperatorType].label}\n />\n }\n id=\"operators\"\n menu={\n <Menu>\n {facet.operatorTypes.map((operatorType, index) => {\n if (operatorType) {\n const selected = operatorType === selectedOperatorType\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n key={operatorType}\n onClick={() => handleOperatorItemClick(operatorType)}\n padding={2}\n gap={4}\n style={{minWidth: '150px'}}\n text={operators[operatorType].label}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )}\n\n {/* Value */}\n {!operators[selectedOperatorType].hideInput && (\n <Box marginX={1} style={{width: '160px'}}>\n <Select\n components={reactSelectComponents}\n instanceId=\"facet-searchable\"\n isClearable\n isDisabled={tagsFetching}\n isSearchable\n name=\"tags\"\n noOptionsMessage={() => 'No tags'}\n onChange={(value: any) => handleChange(value as TagSelectOption)}\n options={allTagOptions}\n placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n styles={reactSelectStyles(scheme)}\n value={facet?.value}\n />\n </Box>\n )}\n </SearchFacet>\n )\n}\n\nexport default SearchFacetTags\n","import {Box, Flex, Inline, rem, type Theme} from '@sanity/ui'\nimport {styled, css} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport SearchFacetNumber from '../SearchFacetNumber'\nimport SearchFacetSelect from '../SearchFacetSelect'\nimport SearchFacetString from '../SearchFacetString'\nimport SearchFacetTags from '../SearchFacetTags'\n\ntype Props = {\n layout?: 'inline' | 'stack'\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst StackContainer = styled(Flex)(({theme}: {theme: Theme}) => {\n return css`\n > * {\n margin-bottom: ${rem(\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.space[2]!,\n )};\n }\n `\n})\n\nconst SearchFacets = (props: Props) => {\n const {layout = 'inline'} = props\n\n // Redux\n const searchFacets = useTypedSelector((state) => state.search.facets)\n\n const Items = searchFacets.map((facet) => {\n const key = facet.id\n if (facet.type === 'number') {\n return <SearchFacetNumber facet={facet} key={key} />\n }\n\n if (facet.type === 'searchable') {\n return <SearchFacetTags facet={facet} key={key} />\n }\n\n if (facet.type === 'select') {\n return <SearchFacetSelect facet={facet} key={key} />\n }\n\n if (facet.type === 'string') {\n return <SearchFacetString facet={facet} key={key} />\n }\n\n return null\n })\n\n if (layout === 'inline') {\n if (searchFacets.length === 0) {\n return null\n }\n\n return (\n <Box marginBottom={2}>\n <Inline gap={2}>{Items}</Inline>\n </Box>\n )\n }\n\n if (layout === 'stack') {\n return (\n <StackContainer align=\"flex-start\" direction=\"column\">\n {Items}\n </StackContainer>\n )\n }\n\n throw Error('Invalid layout')\n}\n\nexport default SearchFacets\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Button, Flex} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuGroup, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {FACETS} from '../../constants'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetDivider, SearchFacetGroup, SearchFacetInputProps} from '../../types'\n\nconst SearchFacetsControl = () => {\n // Redux\n const dispatch = useDispatch()\n const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n const searchFacets = useTypedSelector((state) => state.search.facets)\n const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n const popoverProps = usePortalPopoverProps()\n\n const {creditLine} = useToolOptions()\n\n const isTool = !selectedDocument\n\n const filteredFacets = FACETS\n // Filter facets based on current context, whether it's invoked as a tool, or via selection through via custom asset source.\n .filter((facet) => {\n // Remove credit line filter if it's not enabled\n if (!creditLine?.enabled && facet?.type === 'string' && facet?.name === 'creditLine') {\n return false\n }\n\n if (facet.type === 'group' || facet.type === 'divider') {\n return true\n }\n\n if (isTool) {\n return !facet?.selectOnly\n }\n\n const matchingAssetTypes = facet.assetTypes.filter((assetType) =>\n assetTypes.includes(assetType),\n )\n return matchingAssetTypes.length > 0\n })\n // Remove adjacent and leading / trailing dividers\n .filter((facet, index, facets) => {\n const previousFacet = facets[index - 1]\n // Ignore leading + trailing dividers\n if (facet.type === 'divider' && (index === 0 || index === facets.length - 1)) {\n return false\n }\n // Ignore adjacent dividers\n if (facet.type === 'divider' && previousFacet?.type === 'divider') {\n return false\n }\n return true\n })\n\n const hasSearchFacets = filteredFacets.length > 0\n\n const renderMenuFacets = (\n facets: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[],\n level: number = 0,\n ) => {\n return (\n <>\n {facets?.map((facet, index) => {\n if (facet.type === 'divider') {\n return <MenuDivider key={index} />\n }\n\n // Recursively render menu facets\n if (facet.type === 'group') {\n return (\n <MenuGroup key={`group-${level}-${index}`} text={facet.title} title={facet.title}>\n {renderMenuFacets(facet.facets, level + 1)}\n </MenuGroup>\n )\n }\n\n if (facet) {\n const disabled =\n !facet.operatorTypes && !!searchFacets.find((v) => v.name === facet.name)\n\n return (\n <MenuItem\n disabled={disabled}\n fontSize={1}\n key={facet.name}\n onClick={() => dispatch(searchActions.facetsAdd({facet}))}\n padding={2}\n text={facet.title}\n />\n )\n }\n\n return null\n })}\n </>\n )\n }\n\n return (\n <Flex>\n {/* Add filter button */}\n <MenuButton\n button={\n <Button\n disabled={!hasSearchFacets}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n gap={2}\n text=\"Add filter\"\n tone=\"primary\"\n />\n }\n id=\"facets\"\n menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n popover={{\n ...popoverProps,\n placement: 'right-start',\n }}\n />\n\n {/* Clear facets button */}\n {searchFacets.length > 0 && (\n <Button\n fontSize={1}\n mode=\"bleed\"\n onClick={() => dispatch(searchActions.facetsClear())}\n text=\"Clear\"\n />\n )}\n </Flex>\n )\n}\n\nexport default SearchFacetsControl\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogSearchFacetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\n\ntype Props = {\n children: ReactNode\n dialog: DialogSearchFacetsProps\n}\n\nconst DialogSearchFacets = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog animate header=\"Filters\" id={id} onClose={handleClose} width={1}>\n <Box padding={3}>\n <SearchFacets layout=\"stack\" />\n <SearchFacetsControl />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogSearchFacets\n","import {Box, Flex} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {tagsActions} from '../../modules/tags'\nimport type {DialogTagCreateProps, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogTagCreateProps\n}\n\nconst DialogTagCreate = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n const dispatch = useDispatch()\n\n const creating = useTypedSelector((state) => state.tags.creating)\n const creatingError = useTypedSelector((state) => state.tags.creatingError)\n\n const {\n // Read the formState before render to subscribe the form state through Proxy\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n setError,\n } = useForm<TagFormData>({\n defaultValues: {\n name: '',\n },\n mode: 'onChange',\n resolver: zodFormResolver<TagFormData>(tagFormSchema),\n })\n\n const formUpdating = creating\n\n const handleClose = () => {\n dispatch(dialogActions.clear())\n }\n\n // - submit react-hook-form\n const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n\n dispatch(tagsActions.createRequest({name: sanitizedFormData['name']}))\n }\n\n useEffect(() => {\n if (creatingError) {\n setError('name', {\n message: creatingError?.message,\n })\n }\n }, [creatingError, setError])\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"flex-end\">\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid}\n isValid={isValid}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Create Tag\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n {/* Form fields */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogTagCreate\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useState} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectTagById, tagsActions} from '../../modules/tags'\nimport type {DialogTagEditProps, Tag, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n children: ReactNode\n dialog: DialogTagEditProps\n}\n\nconst DialogTagEdit = (props: Props) => {\n const {\n children,\n dialog: {id, tagId},\n } = props\n\n const client = useVersionedClient()\n\n const dispatch = useDispatch()\n const tagItem = useTypedSelector((state) => selectTagById(state, String(tagId))) // TODO: double check string cast\n\n // - Generate a snapshot of the current tag\n const [tagSnapshot, setTagSnapshot] = useState(tagItem?.tag)\n\n const currentTag = tagItem ? tagItem?.tag : tagSnapshot\n const generateDefaultValues = useCallback(\n (tag?: Tag) => ({\n name: tag?.name?.current || '',\n }),\n [],\n )\n\n const {\n // Read the formState before render to subscribe the form state through Proxy\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n reset,\n setError,\n } = useForm<TagFormData>({\n defaultValues: generateDefaultValues(tagItem?.tag),\n mode: 'onChange',\n resolver: zodFormResolver<TagFormData>(tagFormSchema),\n })\n\n const formUpdating = !tagItem || tagItem?.updating\n\n const handleClose = () => {\n dispatch(dialogActions.remove({id}))\n }\n\n // Submit react-hook-form\n const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n if (!tagItem?.tag) {\n return\n }\n const sanitizedFormData = sanitizeFormData(formData)\n dispatch(\n tagsActions.updateRequest({\n closeDialogId: tagItem?.tag?._id,\n formData: {\n name: {\n _type: 'slug',\n current: sanitizedFormData['name'],\n },\n },\n tag: tagItem?.tag,\n }),\n )\n }\n\n const handleDelete = () => {\n if (!tagItem?.tag) {\n return\n }\n\n dispatch(\n dialogActions.showConfirmDeleteTag({\n closeDialogId: tagItem?.tag?._id,\n tag: tagItem?.tag,\n }),\n )\n }\n\n const handleTagUpdate = useCallback(\n (update: MutationEvent) => {\n const {result, transition} = update\n if (result && transition === 'update') {\n // Regenerate snapshot\n setTagSnapshot(result as Tag)\n // Reset react-hook-form\n reset(generateDefaultValues(result as Tag))\n }\n },\n [reset, generateDefaultValues],\n )\n\n useEffect(() => {\n if (tagItem?.error) {\n setError('name', {\n message: tagItem.error?.message,\n })\n }\n }, [setError, tagItem?.error])\n\n // - Listen for asset mutations and update snapshot\n useEffect(() => {\n if (!tagItem?.tag) {\n return undefined\n }\n\n // Remember that Sanity listeners ignore joins, order clauses and projections\n const subscriptionAsset = client\n .listen(groq`*[_id == $id]`, {id: tagItem?.tag._id})\n .subscribe(handleTagUpdate)\n\n return () => {\n subscriptionAsset?.unsubscribe()\n }\n }, [client, handleTagUpdate, tagItem?.tag])\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify=\"space-between\">\n {/* Delete button */}\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n\n {/* Submit button */}\n <FormSubmitButton\n disabled={formUpdating || !isDirty || !isValid}\n isValid={isValid}\n lastUpdated={tagItem?.tag?._updatedAt}\n onClick={handleSubmit(onSubmit)}\n />\n </Flex>\n </Box>\n )\n\n if (!currentTag) {\n return null\n }\n\n return (\n <Dialog\n animate\n // oxlint-disable-next-line react/static-components\n footer={<Footer />}\n header=\"Edit Tag\"\n id={id}\n onClose={handleClose}\n width={1}\n >\n {/* Form fields */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Deleted notification */}\n {!tagItem && (\n <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n </Card>\n )}\n\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Title */}\n <FormFieldInputText\n {...register('name')}\n disabled={formUpdating}\n error={errors?.name?.message}\n label=\"Name\"\n name=\"name\"\n />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogTagEdit\n","import {ArrowDownIcon} from '@sanity/icons/ArrowDown'\nimport {ArrowUpIcon} from '@sanity/icons/ArrowUp'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {inputs} from '../../config/searchFacets'\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {searchActions, selectIsSearchFacetTag} from '../../modules/search'\nimport type {SearchFacetInputSearchableProps, TagActions, TagItem} from '../../types'\n\ntype Props = {\n actions?: TagActions[]\n tag: TagItem\n}\n\nconst TagContainer = styled(Flex)`\n height: ${PANEL_HEIGHT}px;\n`\n\nconst ButtonContainer = styled(Flex)`\n @media (pointer: fine) {\n visibility: hidden;\n }\n\n @media (hover: hover) and (pointer: fine) {\n ${TagContainer}:hover & {\n visibility: visible;\n }\n }\n`\n\ntype TagButtonProps = {\n disabled?: boolean\n icon: ReactNode\n onClick: () => void\n tone?: 'critical' | 'primary'\n tooltip: string\n}\n\nconst TagButton = (props: TagButtonProps) => {\n const {disabled, icon, onClick, tone, tooltip} = props\n\n return (\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text muted size={1}>\n {tooltip}\n </Text>\n </Container>\n }\n disabled={'ontouchstart' in window}\n placement=\"top\"\n portal\n >\n <Button\n disabled={disabled}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n tone={tone}\n />\n </Tooltip>\n )\n}\n\nconst Tag = (props: Props) => {\n const {actions, tag} = props\n\n // Redux\n const dispatch = useDispatch()\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n const isSearchFacetTag = useTypedSelector((state) => selectIsSearchFacetTag(state, tag?.tag?._id))\n\n // Callbacks\n const handleSearchFacetTagRemove = () => {\n dispatch(searchActions.facetsRemoveByTag({tagId: tag.tag._id}))\n }\n\n const handleShowAddTagToAssetsDialog = () => {\n dispatch(dialogActions.showConfirmAssetsTagAdd({assetsPicked, tag: tag.tag}))\n }\n\n const handleShowRemoveTagFromAssetsDialog = () => {\n dispatch(dialogActions.showConfirmAssetsTagRemove({assetsPicked, tag: tag.tag}))\n }\n\n const handleShowTagDeleteDialog = () => {\n dispatch(dialogActions.showConfirmDeleteTag({tag: tag.tag}))\n }\n\n const handleShowTagEditDialog = () => {\n dispatch(DIALOG_ACTIONS.showTagEdit({tagId: tag?.tag?._id}))\n }\n\n const handleSearchFacetTagAddOrUpdate = () => {\n const searchFacet = {\n ...inputs.tag,\n value: {\n label: tag?.tag?.name?.current,\n value: tag?.tag?._id,\n },\n } as SearchFacetInputSearchableProps\n\n if (isSearchFacetTag) {\n dispatch(\n searchActions.facetsUpdate({\n name: 'tag',\n operatorType: 'references',\n value: searchFacet.value,\n }),\n )\n } else {\n dispatch(searchActions.facetsAdd({facet: searchFacet}))\n }\n }\n\n return (\n <TagContainer align=\"center\" flex={1} justify=\"space-between\" paddingLeft={3}>\n <Box flex={1}>\n <Text\n muted\n size={1}\n style={{\n opacity: tag?.updating ? 0.5 : 1.0,\n userSelect: 'none',\n }}\n textOverflow=\"ellipsis\"\n >\n {tag?.tag?.name?.current}\n </Text>\n </Box>\n\n <ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n {/* Search facet toggle */}\n {actions?.includes('search') && (\n <TagButton\n disabled={tag?.updating}\n icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n onClick={\n isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n }\n tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n />\n )}\n {/* Edit icon */}\n {actions?.includes('edit') && (\n <TagButton\n disabled={tag?.updating}\n icon={<EditIcon />}\n onClick={handleShowTagEditDialog}\n tone=\"primary\"\n tooltip=\"Edit tag\"\n />\n )}\n {/* Apply to all */}\n {actions?.includes('applyAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowUpIcon />}\n onClick={handleShowAddTagToAssetsDialog}\n tone=\"primary\"\n tooltip=\"Add tag to selected assets\"\n />\n )}\n {/* Remove from all */}\n {actions?.includes('removeAll') && (\n <TagButton\n disabled={tag?.updating}\n icon={<ArrowDownIcon />}\n onClick={handleShowRemoveTagFromAssetsDialog}\n tone=\"critical\"\n tooltip=\"Remove tag from selected assets\"\n />\n )}\n\n {/* Delete icon */}\n {actions?.includes('delete') && (\n <TagButton\n disabled={tag?.updating}\n icon={<TrashIcon />}\n onClick={handleShowTagDeleteDialog}\n tone=\"critical\"\n tooltip=\"Delete tag\"\n />\n )}\n </ButtonContainer>\n </TagContainer>\n )\n}\n\nexport default Tag\n","import {Flex, Label} from '@sanity/ui'\nimport {memo, useState} from 'react'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport type {TagActions, TagItem} from '../../types'\nimport Tag from '../Tag'\n\nconst VirtualRow = memo(\n ({\n isScrolling,\n item,\n }: {\n isScrolling?: boolean\n item:\n | string\n | (TagItem & {\n actions: TagActions[]\n })\n }) => {\n // Render label\n if (typeof item === 'string') {\n return (\n <Flex\n align=\"center\"\n justify=\"space-between\"\n key={item}\n paddingX={3}\n style={{height: `${PANEL_HEIGHT}px`}}\n >\n <Label size={0}>{item}</Label>\n </Flex>\n )\n }\n\n // Render tag - only display actions if we're not in the process of scrolling\n return <Tag actions={isScrolling ? undefined : item.actions} key={item.tag?._id} tag={item} />\n },\n)\n\nconst TagsVirtualized = ({tags}: {tags: TagItem[]}) => {\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n\n // State\n const [isScrolling, setIsScrolling] = useState(false)\n\n // TODO: refactor, there's most certainly a more performant way to do this\n\n // Filter out all tag IDS used (across all) and dedupe\n const pickedTagIds = assetsPicked?.reduce((acc: string[], val) => {\n const assetTagIds = val?.asset?.opt?.media?.tags?.map((tag) => tag._ref) || []\n acc = acc.concat(assetTagIds)\n return acc\n }, [])\n const pickedTagIdsUnique = [...new Set(pickedTagIds)]\n\n // Segment tags into two buckets:\n // 1. those which exist in all picked assets ('applied to all')\n // 2. those which exist in some picked assets ('applied to some')\n const tagIdsSegmented = pickedTagIdsUnique.reduce(\n (acc: {appliedToAll: string[]; appliedToSome: string[]}, tagId) => {\n const tagIsInEveryAsset = assetsPicked.every((assetItem) => {\n const tagIndex =\n assetItem.asset.opt?.media?.tags?.findIndex((tag) => tag._ref === tagId) ?? -1\n return tagIndex >= 0\n })\n\n if (tagIsInEveryAsset) {\n acc.appliedToAll.push(tagId)\n } else {\n acc.appliedToSome.push(tagId)\n }\n\n return acc\n },\n {\n appliedToAll: [],\n appliedToSome: [],\n },\n )\n\n const tagsAppliedToAll = tags\n .filter((tag) => tagIdsSegmented.appliedToAll.includes(tag.tag._id))\n .map((tagItem) => ({\n ...tagItem,\n actions: ['delete', 'edit', 'removeAll', 'search'] as TagActions[],\n }))\n const tagsAppliedToSome = tags\n .filter((tag) => tagIdsSegmented.appliedToSome.includes(tag.tag._id))\n .map((tagItem) => ({\n ...tagItem,\n actions: ['applyAll', 'delete', 'edit', 'removeAll', 'search'] as TagActions[],\n }))\n const tagsUnused = tags\n .filter((tag) => !pickedTagIdsUnique.includes(tag.tag._id))\n .map((tagItem) => ({\n ...tagItem,\n actions: ['applyAll', 'delete', 'edit', 'search'] as TagActions[],\n }))\n\n let items: (\n | string\n | (TagItem & {\n actions: TagActions[]\n })\n )[] = []\n if (assetsPicked.length === 0) {\n items = tags.map((tagItem) => ({\n ...tagItem,\n actions: ['delete', 'edit', 'search'] as TagActions[],\n }))\n } else {\n if (tagsAppliedToAll?.length > 0) {\n items = [\n ...items, //\n assetsPicked.length === 1 ? 'Used' : 'Used by all',\n ...tagsAppliedToAll,\n ]\n }\n if (tagsAppliedToSome?.length > 0) {\n items = [\n ...items, //\n 'Used by some',\n ...tagsAppliedToSome,\n ]\n }\n if (tagsUnused?.length > 0) {\n items = [\n ...items, //\n 'Unused',\n ...tagsUnused,\n ]\n }\n }\n\n return (\n <Virtuoso\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n if (typeof item === 'string') {\n return item\n }\n return item!.tag._id\n }}\n isScrolling={setIsScrolling}\n itemContent={(index) => {\n return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n }}\n style={{flex: 1, overflowX: 'hidden'}}\n totalCount={items.length}\n />\n )\n}\n\nexport default TagsVirtualized\n","import {ComposeIcon} from '@sanity/icons/Compose'\nimport {Box, Button, Flex, Inline, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n allowCreate?: boolean\n light?: boolean\n title: string\n}\n\nconst TagViewHeader = ({allowCreate, light, title}: Props) => {\n const scheme = useColorSchemeValue()\n\n const dispatch = useDispatch()\n const tagsCreating = useTypedSelector((state) => state.tags.creating)\n const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n const handleTagCreate = () => {\n dispatch(DIALOG_ACTIONS.showTagCreate())\n }\n\n return (\n <>\n <Flex\n align=\"center\"\n justify=\"space-between\"\n paddingLeft={3}\n style={{\n background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n borderBottom: '1px solid var(--card-border-color)',\n flexShrink: 0,\n height: `${PANEL_HEIGHT}px`,\n }}\n >\n <Inline gap={2}>\n <Label size={0}>{title}</Label>\n {tagsFetching && (\n <Label size={0} style={{opacity: 0.3}}>\n Loading...\n </Label>\n )}\n </Inline>\n {/* Create new tag button */}\n {allowCreate && (\n <Box marginRight={1}>\n <Button\n disabled={tagsCreating}\n fontSize={1} //\n icon={ComposeIcon}\n mode=\"bleed\"\n onClick={handleTagCreate}\n style={{\n background: 'transparent',\n boxShadow: 'none',\n }}\n />\n </Box>\n )}\n </Flex>\n </>\n )\n}\n\nexport default TagViewHeader\n","import {Box, Flex, Text} from '@sanity/ui'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPickedLength} from '../../modules/assets'\nimport {selectTags} from '../../modules/tags'\nimport TagsVirtualized from '../TagsVirtualized'\nimport TagViewHeader from '../TagViewHeader'\n\nconst TagView = () => {\n const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n const {excludeTagSlugs} = useToolOptions()\n const tagsAll = useTypedSelector(selectTags)\n const tags =\n excludeTagSlugs.length > 0\n ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n : tagsAll\n const fetching = useTypedSelector((state) => state.tags.fetching)\n const fetchCount = useTypedSelector((state) => state.tags.fetchCount)\n const fetchComplete = fetchCount !== -1\n const hasTags = !fetching && tags?.length > 0\n const hasPicked = !!(numPickedAssets > 0)\n\n return (\n <Flex direction=\"column\" flex={1} height=\"fill\">\n <TagViewHeader\n allowCreate\n light={hasPicked}\n title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n />\n\n {fetchComplete && !hasTags && (\n <Box padding={3}>\n <Text muted size={1}>\n <em>No tags</em>\n </Text>\n </Box>\n )}\n\n {hasTags && <TagsVirtualized tags={tags} />}\n </Flex>\n )\n}\n\nexport default TagView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogTagsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport TagView from '../TagView'\n\ntype Props = {\n children: ReactNode\n dialog: DialogTagsProps\n}\n\nconst DialogTags = (props: Props) => {\n const {\n children,\n dialog: {id},\n } = props\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleClose = useCallback(() => {\n dispatch(dialogActions.clear())\n }, [dispatch])\n\n return (\n <Dialog animate header=\"All Tags\" id={id} onClose={handleClose} width={1}>\n <Box\n style={{\n height: '100%',\n minHeight: '420px', // explicit height required as <TagView> is virtualized\n }}\n >\n <TagView />\n </Box>\n\n {children}\n </Dialog>\n )\n}\n\nexport default DialogTags\n","import useTypedSelector from '../../hooks/useTypedSelector'\nimport type {Dialog} from '../../types'\nimport DialogAssetEdit from '../DialogAssetEdit'\nimport DialogAllAssets from '../DialogAssetsOverView'\nimport DialogConfirm from '../DialogConfirm'\nimport DialogFolderCreate from '../DialogFolderCreate'\nimport DialogFolderMove from '../DialogFolderMove'\nimport DialogFolderRename from '../DialogFolderRename'\nimport DialogFolders from '../DialogFolders'\nimport DialogSearchFacets from '../DialogSearchFacets'\nimport DialogTagCreate from '../DialogTagCreate'\nimport DialogTagEdit from '../DialogTagEdit'\nimport DialogTags from '../DialogTags'\n\nconst Dialogs = () => {\n // Redux\n const currentDialogs = useTypedSelector((state) => state.dialog.items)\n\n const renderDialogs = (dialogs: Dialog[], index: number) => {\n if (dialogs.length === 0 || index >= dialogs.length) {\n return null\n }\n\n const dialog = dialogs[index]!\n const childDialogs = renderDialogs(dialogs, index + 1)\n\n if (dialog.type === 'assetEdit') {\n return (\n <DialogAssetEdit dialog={dialog} key={index}>\n {childDialogs}\n </DialogAssetEdit>\n )\n }\n\n if (dialog.type === 'confirm') {\n return (\n <DialogConfirm dialog={dialog} key={index}>\n {childDialogs}\n </DialogConfirm>\n )\n }\n\n if (dialog.type === 'folderCreate') {\n return (\n <DialogFolderCreate dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolderCreate>\n )\n }\n\n if (dialog.type === 'folderMove') {\n return (\n <DialogFolderMove dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolderMove>\n )\n }\n\n if (dialog.type === 'folderRename') {\n return (\n <DialogFolderRename dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolderRename>\n )\n }\n\n if (dialog.type === 'folders') {\n return (\n <DialogFolders dialog={dialog} key={index}>\n {childDialogs}\n </DialogFolders>\n )\n }\n\n if (dialog.type === 'searchFacets') {\n return (\n <DialogSearchFacets dialog={dialog} key={index}>\n {childDialogs}\n </DialogSearchFacets>\n )\n }\n\n if (dialog.type === 'tagCreate') {\n return (\n <DialogTagCreate dialog={dialog} key={index}>\n {childDialogs}\n </DialogTagCreate>\n )\n }\n\n if (dialog.type === 'tagEdit') {\n return (\n <DialogTagEdit dialog={dialog} key={index}>\n {childDialogs}\n </DialogTagEdit>\n )\n }\n\n if (dialog.type === 'tags') {\n return (\n <DialogTags dialog={dialog} key={index}>\n {childDialogs}\n </DialogTags>\n )\n }\n\n if (dialog.type === 'dialogAllAssets') {\n return (\n <DialogAllAssets dialog={dialog} key={index}>\n {childDialogs}\n </DialogAllAssets>\n )\n }\n\n return null\n }\n\n return renderDialogs(currentDialogs, 0)\n}\n\nexport default Dialogs\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect} from 'react'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\nconst Notifications = () => {\n const items = useTypedSelector((state) => state.notifications.items)\n const toast = useToast()\n\n useEffect(() => {\n if (items.length > 0) {\n const lastItem = items[items.length - 1]!\n toast.push({\n closable: true,\n status: lastItem.status,\n title: lastItem.title,\n })\n }\n }, [items, toast])\n\n return null\n}\n\nexport default Notifications\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\n\ntype DebugReducerState = {\n badConnection: boolean\n enabled: boolean\n}\n\nconst initialState = {\n badConnection: false,\n enabled: false,\n} as DebugReducerState\n\nconst debugSlice = createSlice({\n name: 'debug',\n initialState,\n reducers: {\n setBadConnection(state, action: PayloadAction<boolean>) {\n state.badConnection = action.payload\n },\n toggleEnabled(state) {\n state.enabled = !state.enabled\n },\n },\n})\n\nexport const debugActions = {...debugSlice.actions}\n\nexport default debugSlice.reducer\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\nimport type {UnknownAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {bufferTime, filter, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError, ImageAsset, MyEpic} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {uploadsActions} from '../uploads'\n\ntype Notification = {\n asset?: ImageAsset\n status?: 'error' | 'warning' | 'success' | 'info'\n title?: string\n}\n\ntype NotificationsReducerState = {\n items: Notification[]\n}\n\nfunction messageFromGenericErrorPayload(payload: unknown): string {\n if (!payload || typeof payload !== 'object') {\n return 'Unknown error'\n }\n if (\n 'error' in payload &&\n payload.error &&\n typeof payload.error === 'object' &&\n payload.error !== null &&\n 'message' in payload.error\n ) {\n return String((payload.error as HttpError).message)\n }\n if ('message' in payload && typeof (payload as HttpError).message === 'string') {\n return String((payload as HttpError).message)\n }\n return 'Unknown error'\n}\n\nconst initialState = {\n items: [],\n} as NotificationsReducerState\n\nconst notificationsSlice = createSlice({\n name: 'notifications',\n initialState,\n reducers: {\n add(state, action: PayloadAction<Notification>) {\n const {asset, status, title} = action.payload\n state.items.push({\n asset,\n status,\n title,\n })\n },\n },\n})\n\n// Epics\n\nexport const notificationsAssetsDeleteCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.deleteComplete.match),\n mergeMap((action) => {\n const {assetIds} = action.payload\n const deletedCount = assetIds.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `${deletedCount} ${pluralize('asset', deletedCount)} deleted`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsDeleteErrorEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.deleteError.match),\n mergeMap((action) => {\n const {assetIds} = action.payload\n const count = assetIds.length\n return of(\n notificationsSlice.actions.add({\n status: 'error',\n title: `Unable to delete ${count} ${pluralize(\n 'asset',\n count,\n )}. Please review any asset errors and try again.`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsUploadCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(uploadsActions.checkComplete.match),\n mergeMap((action) => {\n const {results} = action.payload\n\n const count = Object.keys(results).length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `Uploaded ${count} ${pluralize('asset', count)}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsTagsAddCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(ASSETS_ACTIONS.tagsAddComplete.match),\n mergeMap((action) => {\n const count = action?.payload?.assets?.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `Tag added to ${count} ${pluralize('asset', count)}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsTagsRemoveCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(ASSETS_ACTIONS.tagsRemoveComplete.match),\n mergeMap((action) => {\n const count = action?.payload?.assets?.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `Tag removed from ${count} ${pluralize('asset', count)}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsUpdateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(assetsActions.updateComplete.match),\n bufferTime(2000),\n filter((actions) => actions.length > 0),\n mergeMap((actions) => {\n const updatedCount = actions.length\n return of(\n notificationsSlice.actions.add({\n status: 'info',\n title: `${updatedCount} ${pluralize('asset', updatedCount)} updated`,\n }),\n )\n }),\n )\n\nexport const notificationsGenericErrorEpic: MyEpic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.fetchError.type,\n assetsActions.updateError.type,\n tagsActions.createError.type,\n tagsActions.deleteError.type,\n tagsActions.fetchError.type,\n tagsActions.updateError.type,\n foldersActions.createError.type,\n foldersActions.deleteError.type,\n foldersActions.renameError.type,\n uploadsActions.uploadError.type,\n ),\n mergeMap((action: UnknownAction) => {\n const title = `An error occurred: ${messageFromGenericErrorPayload(action['payload'])}`\n return of(\n notificationsSlice.actions.add({\n status: 'error',\n title,\n }),\n )\n }),\n )\n\nexport const notificationsTagCreateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.createComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag created`}))),\n )\n\nexport const notificationsTagDeleteCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.deleteComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag deleted`}))),\n )\n\nexport const notificationsTagUpdateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(tagsActions.updateComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag updated`}))),\n )\n\nexport const notificationsFolderCreateCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(foldersActions.createComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder created`}))),\n )\n\nexport const notificationsFolderDeleteCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(foldersActions.deleteComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder deleted`}))),\n )\n\nexport const notificationsFolderRenameCompleteEpic: MyEpic = (action$) =>\n action$.pipe(\n filter(foldersActions.renameComplete.match),\n mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder renamed`}))),\n )\n\nexport const notificationsActions = {...notificationsSlice.actions}\n\nexport default notificationsSlice.reducer\n","import {createSlice} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityDocument, SanityImageAssetDocument} from '@sanity/client'\n\ntype SelectedReducerState = {\n assets: (SanityAssetDocument | SanityImageAssetDocument)[]\n document?: SanityDocument\n documentAssetIds?: string[]\n}\n\nconst initialState = {\n assets: [],\n document: undefined,\n documentAssetIds: [],\n} as SelectedReducerState\n\nconst selectedSlice = createSlice({\n name: 'selected',\n initialState,\n reducers: {},\n})\n\nexport default selectedSlice.reducer\n","import {type Reducer, type StateFromReducersMapObject, combineReducers} from '@reduxjs/toolkit'\nimport {combineEpics} from 'redux-observable'\n\nimport assetsReducer, {\n assetsDeleteEpic,\n assetsFetchAfterDeleteAllEpic,\n assetsFetchEpic,\n assetsFolderSetEpic,\n assetsFolderSetRefreshEpic,\n assetsFetchNextPageEpic,\n assetsFetchPageIndexEpic,\n assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsTagsAddEpic,\n assetsTagsRemoveEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n assetsUpdateImageReferencesEpic,\n} from './assets'\nimport debugReducer from './debug'\nimport dialogReducer, {\n dialogClearOnAssetUpdateEpic,\n dialogTagCreateEpic,\n dialogTagDeleteEpic,\n} from './dialog'\nimport foldersReducer, {\n foldersCurrentFolderEpic,\n foldersCreateEpic,\n foldersDeleteEpic,\n foldersFetchEpic,\n foldersRefreshEpic,\n foldersRenameEpic,\n} from './folders'\nimport notificationsReducer, {\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsTagsAddCompleteEpic,\n notificationsAssetsTagsRemoveCompleteEpic,\n notificationsAssetsUpdateCompleteEpic,\n notificationsFolderCreateCompleteEpic,\n notificationsFolderDeleteCompleteEpic,\n notificationsFolderRenameCompleteEpic,\n notificationsGenericErrorEpic,\n notificationsTagCreateCompleteEpic,\n notificationsTagDeleteCompleteEpic,\n notificationsTagUpdateCompleteEpic,\n} from './notifications'\nimport searchReducer, {searchFacetTagUpdateEpic} from './search'\nimport selectedReducer from './selected'\nimport tagsReducer, {\n tagsCreateEpic,\n tagsDeleteEpic,\n tagsFetchEpic,\n tagsListenerCreateQueueEpic,\n tagsListenerDeleteQueueEpic,\n tagsListenerUpdateQueueEpic,\n tagsSortEpic,\n tagsUpdateEpic,\n} from './tags'\nimport uploadsReducer, {\n uploadsAssetStartEpic,\n uploadsAssetUploadEpic,\n uploadsCheckRequestEpic,\n uploadsCompleteQueueEpic,\n} from './uploads'\n\nexport const rootEpic = combineEpics(\n assetsDeleteEpic,\n assetsFetchEpic,\n assetsFetchAfterDeleteAllEpic,\n assetsFetchNextPageEpic,\n assetsFetchPageIndexEpic,\n assetsFolderSetEpic,\n assetsFolderSetRefreshEpic,\n assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsTagsAddEpic,\n assetsTagsRemoveEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n assetsUpdateImageReferencesEpic,\n dialogClearOnAssetUpdateEpic,\n dialogTagCreateEpic,\n dialogTagDeleteEpic,\n foldersCurrentFolderEpic,\n foldersCreateEpic,\n foldersDeleteEpic,\n foldersFetchEpic,\n foldersRefreshEpic,\n foldersRenameEpic,\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsTagsAddCompleteEpic,\n notificationsAssetsTagsRemoveCompleteEpic,\n notificationsAssetsUpdateCompleteEpic,\n notificationsFolderCreateCompleteEpic,\n notificationsFolderDeleteCompleteEpic,\n notificationsFolderRenameCompleteEpic,\n notificationsGenericErrorEpic,\n notificationsTagCreateCompleteEpic,\n notificationsTagDeleteCompleteEpic,\n notificationsTagUpdateCompleteEpic,\n searchFacetTagUpdateEpic,\n tagsCreateEpic,\n tagsDeleteEpic,\n tagsFetchEpic,\n tagsListenerCreateQueueEpic,\n tagsListenerDeleteQueueEpic,\n tagsListenerUpdateQueueEpic,\n tagsSortEpic,\n tagsUpdateEpic,\n uploadsAssetStartEpic,\n uploadsAssetUploadEpic,\n uploadsCheckRequestEpic,\n uploadsCompleteQueueEpic,\n)\n\nconst reducers = {\n assets: assetsReducer,\n debug: debugReducer,\n dialog: dialogReducer,\n folders: foldersReducer,\n notifications: notificationsReducer,\n search: searchReducer,\n selected: selectedReducer,\n tags: tagsReducer,\n uploads: uploadsReducer,\n}\n\ntype ReducersMapObject = typeof reducers\n\n// Workaround to avoid `$CombinedState` ts errors\n// source: https://github.com/reduxjs/redux-toolkit/issues/2068#issuecomment-1130796500\n// TODO: remove once we use `redux-toolkit` v2\nexport const rootReducer: Reducer<StateFromReducersMapObject<ReducersMapObject>> =\n combineReducers(reducers)\n","import type {SanityDocument} from '@sanity/client'\n\nconst isPlainObject = (value: any) =>\n value !== null && typeof value === 'object' && !Array.isArray(value)\n\n// Recursively search node for any linked asset ids (`asset._type === 'reference'`)\nconst getAssetIds = (node: Record<string, any>, acc: string[] = []) => {\n if (Array.isArray(node)) {\n node.forEach((v) => {\n getAssetIds(v, acc)\n })\n }\n\n if (isPlainObject(node)) {\n if (node?.['asset']?._type === 'reference' && node?.['asset']?._ref) {\n acc.push(node['asset']._ref)\n }\n\n Object.values(node).forEach((val) => {\n getAssetIds(val, acc)\n })\n }\n\n return acc\n}\n\n// Retrieve all linked asset ids from a Sanity document\nconst getDocumentAssetIds = (document: SanityDocument): string[] => {\n const assetIds = getAssetIds(document)\n\n // Sort and dedupe\n return [...new Set(assetIds.sort())]\n}\n\nexport default getDocumentAssetIds\n","import {SUPPORTED_ASSET_TYPES} from '../constants'\nimport type {AssetType} from '../types'\n\n/**\n * Determines whether or not the provided asset type (eg 'image', 'file', 'arbitrary')\n * is a supported asset type for this plugin.\n *\n * @param assetType - The asset type to check.\n * @returns True if the asset type is supported, false otherwise.\n * @internal\n */\nexport function isSupportedAssetType(assetType?: string): assetType is AssetType {\n const supported: string[] = SUPPORTED_ASSET_TYPES\n return assetType ? supported.includes(assetType) : false\n}\n","import {configureStore, type Store, type UnknownAction} from '@reduxjs/toolkit'\nimport type {SanityClient} from '@sanity/client'\nimport {type ReactNode, useState} from 'react'\nimport {Provider} from 'react-redux'\nimport {createEpicMiddleware} from 'redux-observable'\nimport type {AssetSourceComponentProps, SanityDocument} from 'sanity'\n\nimport {rootEpic, rootReducer} from '../../modules'\nimport {initialState as assetsInitialState} from '../../modules/assets'\n// import {assetsActions} from '../../modules/assets'\n// import {searchActions} from '../../modules/search'\n// import {uploadsActions} from '../../modules/uploads'\nimport type {RootReducerState} from '../../modules/types'\nimport getDocumentAssetIds from '../../utils/getDocumentAssetIds'\nimport {isSupportedAssetType} from '../../utils/isSupportedAssetType'\n\ntype Props = {\n assetType?: AssetSourceComponentProps['assetType']\n children?: ReactNode\n client: SanityClient\n document?: SanityDocument\n excludeTagSlugs?: string[]\n selectedAssets?: AssetSourceComponentProps['selectedAssets']\n}\n\nfunction createReduxStore(props: Props): Store {\n const epicMiddleware = createEpicMiddleware<UnknownAction, UnknownAction, RootReducerState>({\n dependencies: {\n client: props.client,\n },\n })\n\n const store = configureStore({\n reducer: rootReducer,\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n /*\n serializableCheck: {\n ignoredActions: [\n assetsActions.deleteError.type,\n uploadsActions.uploadRequest.type,\n uploadsActions.uploadStart.type,\n ]\n },\n */\n // TODO: remove once we're no longer storing non-serializable data in the store\n serializableCheck: false,\n thunk: false,\n }).prepend(epicMiddleware),\n devTools: true,\n preloadedState: {\n assets: {\n ...assetsInitialState,\n assetTypes: isSupportedAssetType(props?.assetType) ? [props.assetType] : ['file', 'image'],\n excludeTagSlugs: props.excludeTagSlugs?.length ? [...props.excludeTagSlugs] : [],\n },\n debug: {\n badConnection: false,\n enabled: false,\n },\n dialog: {items: []},\n folders: {\n byId: {},\n childrenByParentId: {},\n rootIds: [],\n exactCountByFolderId: {},\n unfiledCount: 0,\n currentFolderId: null,\n currentFolderUnfiled: false,\n panelVisible: false,\n fetching: false,\n fetchCount: -1,\n creating: false,\n renaming: false,\n },\n notifications: {items: []},\n search: {facets: [], query: ''},\n selected: {\n assets: props.selectedAssets || [],\n document: props.document,\n documentAssetIds: props.document ? getDocumentAssetIds(props.document) : [],\n },\n tags: {\n allIds: [],\n byIds: {},\n creating: false,\n fetchCount: -1,\n fetching: false,\n panelVisible: true,\n },\n uploads: {\n allIds: [],\n byIds: {},\n },\n },\n })\n\n epicMiddleware.run(rootEpic)\n\n return store\n}\n\nfunction ReduxProvider({children, ...props}: Props) {\n const [store] = useState(() => createReduxStore(props))\n\n return <Provider store={store}>{children}</Provider>\n}\n\nexport default ReduxProvider\n","import {PortalProvider} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport constructFilter from '../../utils/constructFilter'\nimport Dialogs from '../Dialogs'\nimport Notifications from '../Notifications'\nimport ReduxProvider from '../ReduxProvider'\n\n/**\n * Fetches the already-selected asset into the store and opens the `assetEdit`\n * dialog for it. Once that dialog (and any nested dialogs, e.g. delete confirm)\n * are dismissed, the asset source itself is closed via `onClose`.\n *\n * Tracking the dialog lifecycle through redux is what allows the source to be\n * reopened: closing the inner dialog only removes it from the store, so without\n * this the source would stay mounted (showing nothing) and could not be opened\n * a second time.\n */\nconst EditAssetDialog = ({assetId, onClose}: {assetId: string; onClose: () => void}) => {\n const dispatch = useDispatch()\n const openDialogCount = useTypedSelector((state) => state.dialog.items.length)\n const hasOpenedRef = useRef(false)\n\n useEffect(() => {\n // Only fetch the single asset being edited, then open its edit dialog.\n const queryFilter = `${constructFilter({\n assetTypes: ['file', 'image'],\n searchFacets: [],\n })} && _id == $assetId`\n\n dispatch(assetsActions.fetchRequest({params: {assetId}, queryFilter}))\n\n // Tags and folders must be loaded into the store so the edit dialog can\n // resolve the asset's existing tag references and folder path (mirroring\n // `useBrowserInit`). Without this, `selectTagSelectOptions` resolves no tags\n // and saving would patch `opt.media.tags` to null, wiping existing tags.\n dispatch(tagsActions.fetchRequest())\n dispatch(foldersActions.fetchRequest())\n\n dispatch(dialogActions.showAssetEdit({assetId}))\n }, [assetId, dispatch])\n\n useEffect(() => {\n if (openDialogCount > 0) {\n hasOpenedRef.current = true\n } else if (hasOpenedRef.current) {\n onClose()\n }\n }, [openDialogCount, onClose])\n\n return (\n <>\n <Dialogs />\n <Notifications />\n </>\n )\n}\n\nconst EditAssetTool = (props: AssetSourceComponentProps) => {\n const {onClose, selectedAssets} = props\n\n const portalElement = useRootPortalElement()\n\n // `useFormValue` can return null/undefined (e.g. on a pristine/unsaved draft).\n const currentDocument = useFormValue([]) as SanityDocument | null | undefined\n\n const client = useVersionedClient()\n\n const assetId = selectedAssets[0]?._id\n\n // Nothing to edit (e.g. opened on an empty field) – close the source again.\n useEffect(() => {\n if (!assetId) {\n onClose()\n }\n }, [assetId, onClose])\n\n if (!assetId) {\n return null\n }\n\n return (\n <ReduxProvider\n assetType={props.assetType}\n client={client}\n document={currentDocument ?? undefined}\n selectedAssets={selectedAssets}\n >\n <AssetBrowserDispatchProvider onSelect={props.onSelect}>\n <GlobalStyle />\n <PortalProvider element={portalElement}>\n <EditAssetDialog assetId={assetId} onClose={onClose} />\n </PortalProvider>\n </AssetBrowserDispatchProvider>\n </ReduxProvider>\n )\n}\n\nexport default EditAssetTool\n","import {ThLargeIcon} from '@sanity/icons/ThLarge'\nimport {ThListIcon} from '@sanity/icons/ThList'\nimport {Button, Inline} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst ButtonViewGroup = () => {\n // Redux\n const dispatch = useDispatch()\n const view = useTypedSelector((state) => state.assets.view)\n\n return (\n <Inline gap={0} style={{whiteSpace: 'nowrap'}}>\n <Button\n fontSize={1}\n icon={ThLargeIcon}\n mode={view === 'grid' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n style={{\n borderBottomRightRadius: 0,\n borderTopRightRadius: 0,\n }}\n />\n <Button\n fontSize={1}\n icon={ThListIcon}\n mode={view === 'table' ? 'default' : 'ghost'}\n onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n style={{\n borderBottomLeftRadius: 0,\n borderTopLeftRadius: 0,\n }}\n />\n </Inline>\n )\n}\n\nexport default ButtonViewGroup\n","import {SortIcon} from '@sanity/icons/Sort'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst OrderSelect = () => {\n // Redux\n const dispatch = useDispatch()\n const order = useTypedSelector((state) => state.assets.order)\n\n const popoverProps = usePortalPopoverProps()\n\n return (\n <MenuButton\n button={\n <Button\n fontSize={1}\n icon={SortIcon}\n mode=\"bleed\"\n padding={3}\n text={getOrderTitle(order.field, order.direction)}\n />\n }\n id=\"order\"\n menu={\n <Menu>\n {ORDER_OPTIONS?.map((item, index) => {\n if (item) {\n const selected = order.field === item.field && order.direction === item.direction\n return (\n <MenuItem\n disabled={selected}\n fontSize={1}\n iconRight={selected}\n key={index}\n onClick={() =>\n dispatch(\n assetsActions.orderSet({\n order: {direction: item.direction, field: item.field},\n }),\n )\n }\n padding={2}\n selected={selected}\n gap={4}\n style={{minWidth: '200px'}}\n text={getOrderTitle(item.field, item.direction)}\n />\n )\n }\n\n return <MenuDivider key={index} />\n })}\n </Menu>\n }\n popover={popoverProps}\n />\n )\n}\n\nexport default OrderSelect\n","import {Box} from '@sanity/ui'\nimport {useNProgress} from '@tanem/react-nprogress'\n\ntype Props = {\n loading?: boolean\n}\n\nconst Progress = (props: Props) => {\n const {loading} = props\n\n const {animationDuration, isFinished, progress} = useNProgress({\n animationDuration: 300,\n isAnimating: loading,\n })\n\n return (\n <Box\n style={{\n opacity: isFinished ? 0 : 1,\n transition: `opacity ${animationDuration}ms linear`,\n }}\n >\n <Box\n style={{\n height: '1px',\n background: 'rgba(255, 255, 255, 0.5)',\n position: 'absolute',\n left: 0,\n top: 0,\n transition: `width ${animationDuration}ms linear`,\n width: `${progress * 100}%`,\n }}\n />\n </Box>\n )\n}\n\nexport default Progress\n","const TagIcon = () => (\n <svg\n data-sanity-icon=\"media__tag\" // For icon usage with @sanity/ui <Button />\n fill=\"currentColor\"\n height=\"1em\"\n stroke=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 512 512\"\n width=\"1em\"\n >\n <path\n d=\"M435.25 48h-122.9a14.46 14.46 0 00-10.2 4.2L56.45 297.9a28.85 28.85 0 000 40.7l117 117a28.85 28.85 0 0040.7 0L459.75 210a14.46 14.46 0 004.2-10.2v-123a28.66 28.66 0 00-28.7-28.8z\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"32\"\n />\n <path d=\"M384 160a32 32 0 1132-32 32 32 0 01-32 32z\" />\n </svg>\n)\n\nexport default TagIcon\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Flex, TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\n\nconst TextInputSearch = () => {\n // Redux\n const searchQuery = useTypedSelector((state) => state.search.query)\n\n // Redux\n const dispatch = useDispatch()\n\n // Callbacks\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n dispatch(searchActions.querySet({searchQuery: e.currentTarget.value}))\n }\n\n const handleClear = () => {\n dispatch(searchActions.querySet({searchQuery: ''}))\n }\n\n return (\n <Box style={{position: 'relative'}}>\n <TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={handleChange}\n placeholder=\"Search\"\n radius={2}\n value={searchQuery}\n />\n\n {/* Clear form button */}\n {searchQuery.length > 0 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n height: '100%',\n opacity: 0.75,\n position: 'absolute',\n right: 0,\n top: 0,\n width: '2em',\n zIndex: 1, // force stacking context\n }}\n >\n <CloseIcon />\n </Flex>\n )}\n </Box>\n )\n}\n\nexport default TextInputSearch\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {Box, Button, Flex, Inline, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport ButtonViewGroup from '../ButtonViewGroup'\nimport OrderSelect from '../OrderSelect'\nimport Progress from '../Progress'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\nimport TagIcon from '../TagIcon'\nimport TextInputSearch from '../TextInputSearch'\n\nconst Controls = () => {\n // Redux\n const dispatch = useDispatch()\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n const pageIndex = useTypedSelector((state) => state.assets.pageIndex)\n const searchFacets = useTypedSelector((state) => state.search.facets)\n const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n const mediaIndex = useMediaIndex()\n\n // Callbacks\n const handleShowSearchFacetDialog = () => {\n dispatch(dialogActions.showSearchFacets())\n }\n\n const handleShowFoldersDialog = () => {\n dispatch(dialogActions.showFolders())\n }\n\n const handleShowTagsDialog = () => {\n dispatch(dialogActions.showTags())\n }\n\n const toggleFoldersPanel = () => {\n dispatch(foldersActions.panelVisibleSet({panelVisible: !foldersPanelVisible}))\n }\n\n const toggleTagsPanelToggle = () => {\n dispatch(tagsActions.panelVisibleSet({panelVisible: !tagsPanelVisible}))\n }\n\n return (\n <Box\n paddingY={2}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n zIndex: 2,\n }}\n >\n {/* Rows: search / filters / orders */}\n <Box marginBottom={2}>\n <Flex\n align=\"flex-start\"\n direction={['column', 'column', 'column', 'column', 'row']}\n justify=\"space-between\"\n >\n {/* Search + Filters */}\n <Flex\n flex={1}\n style={{\n alignItems: 'flex-start',\n flex: 1,\n height: '100%',\n justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n position: 'relative',\n width: '100%',\n }}\n >\n <Box marginX={2} style={{minWidth: '200px'}}>\n {/* Search */}\n <TextInputSearch />\n </Box>\n\n <Box display={['none', 'none', 'block']}>\n <SearchFacets />\n\n {/* Search Facets Control (add / clear) */}\n <Inline gap={2}>\n <SearchFacetsControl />\n </Inline>\n </Box>\n\n <Box display={['block', 'block', 'none']} marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n {/* Filters button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowSearchFacetDialog}\n text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n tone=\"primary\"\n />\n\n {/* Tags button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowTagsDialog}\n text={`Tags`}\n tone=\"primary\"\n />\n\n {/* Folders button (small) */}\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleShowFoldersDialog}\n text=\"Folders\"\n tone=\"primary\"\n />\n </Inline>\n </Box>\n </Flex>\n </Flex>\n </Box>\n\n <Box>\n <Flex align=\"center\" justify={['space-between']}>\n {/* Folders + Views */}\n <Box marginX={2}>\n <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n <Box display={['none', 'none', 'block']}>\n <Button\n aria-label=\"Toggle folders panel\"\n fontSize={1}\n icon={FolderIcon}\n mode={foldersPanelVisible ? 'default' : 'ghost'}\n onClick={toggleFoldersPanel}\n />\n </Box>\n <ButtonViewGroup />\n </Inline>\n </Box>\n\n <Flex marginX={2}>\n {/* Orders */}\n <OrderSelect />\n {/* Tags panel toggle */}\n <Box display={['none', 'none', 'block']} marginLeft={2}>\n <Button\n fontSize={1}\n icon={\n <Box style={{transform: 'scale(0.75)'}}>\n <TagIcon />\n </Box>\n }\n onClick={toggleTagsPanelToggle}\n mode={tagsPanelVisible ? 'default' : 'ghost'}\n text={tagsPanelVisible ? 'Tags' : ''}\n />\n </Box>\n </Flex>\n </Flex>\n </Box>\n\n {/* Progress bar */}\n <Progress key={pageIndex} loading={fetching} />\n </Box>\n )\n}\n\nexport default Controls\n","import {PlugIcon} from '@sanity/icons/Plug'\nimport {Box, Flex, Switch, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {debugActions} from '../../modules/debug'\n\nconst DebugControls = () => {\n // Redux\n const dispatch = useDispatch()\n const badConnection = useTypedSelector((state) => state.debug.badConnection)\n const debugEnabled = useTypedSelector((state) => state.debug.enabled)\n\n // Callbacks\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n\n dispatch(debugActions.setBadConnection(checked))\n }\n\n const handleToggleControls = () => {\n dispatch(debugActions.toggleEnabled())\n }\n\n // Close on escape key press\n useKeyPress('alt+ctrl+shift+/', handleToggleControls)\n\n if (!debugEnabled) {\n return null\n }\n\n return (\n <Box\n padding={4}\n style={{\n bottom: 0,\n left: 0,\n pointerEvents: 'none',\n position: 'fixed',\n width: '100%',\n }}\n >\n {/* Bad connection toggle */}\n <Flex align=\"center\">\n <Box marginRight={3}>\n <Text muted size={1}>\n <PlugIcon />\n </Text>\n </Box>\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n {badConnection\n ? 'Bad connection: +3000ms & 50% chance to fail'\n : 'No connection throttling'}\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"bottom\"\n portal\n >\n <Switch\n checked={badConnection}\n onChange={handleChange}\n style={{\n pointerEvents: 'auto',\n }}\n />\n </Tooltip>\n </Flex>\n </Box>\n )\n}\n\nexport default DebugControls\n","import {Box, Button, Inline, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {foldersActions, selectCurrentFolderSegments} from '../../modules/folders'\n\nconst FolderBreadcrumbs = () => {\n const dispatch = useDispatch()\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const segments = useTypedSelector(selectCurrentFolderSegments)\n\n if (!currentFolderId) {\n return null\n }\n\n return (\n <Box display={['block', 'block', 'none']} padding={2}>\n <Inline gap={1}>\n <Button\n fontSize={1}\n padding={2}\n mode=\"bleed\"\n onClick={() => dispatch(foldersActions.currentFolderClear())}\n text=\"All assets\"\n />\n\n {segments.map((segment) => (\n <Inline key={segment.id} gap={1}>\n <Text muted size={1}>\n /\n </Text>\n <Button\n fontSize={1}\n padding={2}\n mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n text={segment.name}\n />\n </Inline>\n ))}\n </Inline>\n </Box>\n )\n}\n\nexport default FolderBreadcrumbs\n","import {Box} from '@sanity/ui'\n\nimport {FOLDERS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport FolderView from '../FolderView'\n\nconst FolderPanel = () => {\n const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n\n if (!foldersPanelVisible) {\n return null\n }\n\n return (\n <Box\n style={{\n position: 'relative',\n width: FOLDERS_PANEL_WIDTH,\n }}\n >\n <Box\n className=\"media__custom-scrollbar\"\n style={{\n borderRight: '1px solid var(--card-border-color)',\n height: '100%',\n left: 0,\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <FolderView />\n </Box>\n </Box>\n )\n}\n\nexport default FolderPanel\n","import {type ReactNode, createContext, useContext, useMemo} from 'react'\n\ntype ContextProps = {\n open: () => void\n}\n\ntype Props = {\n children: ReactNode\n open: () => void\n}\n\nconst DropzoneDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const DropzoneDispatchProvider = (props: Props) => {\n const {children, open} = props\n\n const contextValue: ContextProps = useMemo(() => ({open}), [open])\n\n return (\n <DropzoneDispatchContext.Provider value={contextValue}>\n {children}\n </DropzoneDispatchContext.Provider>\n )\n}\n\nexport const useDropzoneActions = () => {\n const context = useContext(DropzoneDispatchContext)\n if (context === undefined) {\n throw new Error('useDropzoneActions must be used within an DropzoneDispatchProvider')\n }\n return context\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button, Flex, Inline, Text} from '@sanity/ui'\nimport pluralize from 'pluralize'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {useDropzoneActions} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\ntype Props = {\n onClose?: () => void\n}\n\nconst Header = (props: Props) => {\n const {onClose} = props\n\n const {open} = useDropzoneActions()\n const {onSelect} = useAssetSourceActions()\n\n // Redux\n const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n const {directUploads} = useToolOptions()\n\n // Row: Current document / close button\n return (\n <Box paddingY={2}>\n <Flex align=\"center\" justify=\"space-between\">\n {/* Label */}\n <Box flex={1} marginX={3}>\n <Inline style={{whiteSpace: 'nowrap'}}>\n <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n </Text>\n\n {selectedDocument && (\n <Box display={['none', 'none', 'block']}>\n <Text>\n <span style={{margin: '0 0.5em'}}>\n <ArrowRightIcon />\n </span>\n <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n </Text>\n </Box>\n )}\n </Inline>\n </Box>\n\n <Flex marginX={2}>\n {/* Upload */}\n {directUploads && (\n <Button\n fontSize={1}\n icon={UploadIcon}\n mode=\"bleed\"\n onClick={open}\n text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n />\n )}\n\n {/* Close */}\n {onClose && (\n <Box style={{flexShrink: 0}}>\n <Button\n disabled={!onClose}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n radius={2}\n />\n </Box>\n )}\n </Flex>\n </Flex>\n </Box>\n )\n}\n\nexport default Header\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {Box, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\ntype Props = {\n field?: string\n title?: string\n}\n\nconst TableHeaderItem = (props: Props) => {\n const {field, title} = props\n\n // Redux\n const dispatch = useDispatch()\n const order = useTypedSelector((state) => state.assets.order)\n\n const isActive = order.field === field\n\n // Callbacks\n const handleClick = () => {\n if (!field || !title) {\n return\n }\n\n if (isActive) {\n const direction = order.direction === 'asc' ? 'desc' : 'asc'\n dispatch(assetsActions.orderSet({order: {field, direction}}))\n } else {\n dispatch(assetsActions.orderSet({order: {field, direction: 'asc'}}))\n }\n }\n\n return (\n <Label muted={!field} size={0}>\n <Box\n onClick={field ? handleClick : undefined}\n style={{\n cursor: field ? 'pointer' : 'default',\n display: 'inline',\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n marginRight: '0.4em',\n }}\n >\n {title}\n </span>\n\n {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n </Box>\n </Label>\n )\n}\n\nexport default TableHeaderItem\n","import {Checkbox, Flex, Grid, useMediaIndex} from '@sanity/ui'\nimport type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport {type MouseEvent} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS, PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsLength, selectAssetsPickedLength} from '../../modules/assets'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport TableHeaderItem from '../TableHeaderItem'\n\n// TODO: DRY\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n $scheme,\n}) => {\n return css`\n cursor: pointer;\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `\n})\n\nconst TableHeader = () => {\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const itemsLength = useTypedSelector(selectAssetsLength)\n const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n\n const mediaIndex = useMediaIndex()\n const {onSelect} = useAssetSourceActions()\n\n const allSelected = numPickedAssets === itemsLength\n\n // Callbacks\n const handleContextActionClick = (e: MouseEvent) => {\n e.stopPropagation()\n\n if (allSelected) {\n dispatch(assetsActions.pickClear())\n } else {\n dispatch(assetsActions.pickAll())\n }\n }\n\n // Note that even though we hide the table header on smaller breakpoints, we never set it to\n // `display: none`, as doing so causes issues with react-virtuoso.\n // Instead, we give it 0 height and hide it with `visibility: hidden`.\n return (\n <Grid\n style={{\n alignItems: 'center',\n background: 'var(--card-bg-color)',\n borderBottom: '1px solid var(--card-border-color)',\n columnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n letterSpacing: '0.025em',\n position: 'sticky',\n textTransform: 'uppercase',\n top: 0,\n visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n width: '100%',\n zIndex: 1, // force stacking context\n }}\n >\n {onSelect ? (\n <TableHeaderItem />\n ) : (\n <ContextActionContainer\n align=\"center\"\n justify=\"center\"\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n height: '100%',\n position: 'relative',\n }}\n >\n <Checkbox\n checked={!fetching && allSelected}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n </ContextActionContainer>\n )}\n\n <TableHeaderItem />\n <TableHeaderItem field=\"originalFilename\" title=\"Filename\" />\n <TableHeaderItem title=\"Resolution\" />\n <TableHeaderItem field=\"mimeType\" title=\"MIME type\" />\n <TableHeaderItem field=\"size\" title=\"Size\" />\n <TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />\n <TableHeaderItem title=\"References\" />\n <TableHeaderItem />\n </Grid>\n )\n}\n\nexport default TableHeader\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n Box,\n Checkbox,\n Container,\n Flex,\n Grid,\n Spinner,\n Text,\n type ThemeColorSchemeKey,\n useMediaIndex,\n} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {formatRelative} from 'date-fns/formatRelative'\nimport filesize from 'filesize'\nimport {\n memo,\n type MouseEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\n// Duration (ms) to wait before reference counts (and associated listeners) are rendered\nconst REFERENCE_COUNT_VISIBILITY_DELAY = 750\n\ntype Props = {\n id: string\n selected: boolean\n}\n\nconst ContainerGrid = styled<\n typeof Grid,\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n {$selected?: boolean; $scheme: ThemeColorSchemeKey; $updating?: boolean}\n>(Grid)(({$scheme, $selected, $updating}) => {\n return css`\n align-items: center;\n cursor: ${$selected ? 'default' : 'pointer'};\n height: 100%;\n pointer-events: ${$updating ? 'none' : 'auto'};\n user-select: none;\n white-space: nowrap;\n\n ${\n !$updating &&\n css`\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `\n }\n `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n $scheme,\n}) => {\n return css`\n cursor: pointer;\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg2')};\n }\n }\n `\n})\n\nconst StyledWarningIcon = styled(WarningFilledIcon)(({theme}) => {\n return {\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst TableRowAsset = (props: Props) => {\n const {id, selected} = props\n\n const scheme = useColorSchemeValue()\n\n const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n const [referenceCountVisible, setReferenceCountVisible] = useState(false)\n const refCountVisibleTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n\n const dispatch = useDispatch()\n const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n const item = useTypedSelector((state) => selectAssetById(state, id))\n\n const mediaIndex = useMediaIndex()\n\n const asset = item?.asset\n const error = item?.error\n const isOpaque = item?.asset?.metadata?.isOpaque\n const picked = item?.picked\n const updating = item?.updating\n\n const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n const handleContextActionClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n } else if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n },\n [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n )\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (selected) return\n if (onSelect && !isMultiSelect) {\n onSelect([{kind: 'assetDocumentId', value: asset._id}])\n } else if (onSelect && isMultiSelect) {\n if (shiftPressed.current && !picked) {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n } else {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n }\n } else if (shiftPressed.current) {\n if (picked) {\n dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n } else {\n dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n }\n } else {\n dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n }\n },\n [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n )\n\n const opacityCell = updating ? 0.5 : 1\n const opacityPreview = selected || updating ? 0.1 : 1\n\n // Display reference count after an initial delay to prevent over-eager fetching\n useEffect(() => {\n refCountVisibleTimeout.current = setTimeout(\n () => setReferenceCountVisible(true),\n REFERENCE_COUNT_VISIBILITY_DELAY,\n )\n return () => {\n if (refCountVisibleTimeout.current) {\n clearTimeout(refCountVisibleTimeout.current)\n }\n }\n }, [])\n\n // Short circuit if no asset is available\n if (!asset) {\n return null\n }\n\n return (\n <ContainerGrid\n onClick={selected ? undefined : handleClick}\n $scheme={scheme}\n $selected={selected}\n style={{\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }}\n $updating={item.updating}\n >\n {/* Picked checkbox */}\n <ContextActionContainer\n onClick={handleContextActionClick}\n $scheme={scheme}\n style={{\n alignItems: 'center',\n gridColumn: 1,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '100%',\n justifyContent: 'center',\n opacity: opacityCell,\n position: 'relative',\n }}\n >\n {onSelect && !isMultiSelect ? (\n <EditIcon\n style={{\n flexShrink: 0,\n opacity: 0.5,\n }}\n />\n ) : (\n <Checkbox\n checked={picked}\n readOnly\n style={{\n pointerEvents: 'none', // TODO: consider alternative for usability\n transform: 'scale(0.8)',\n }}\n />\n )}\n </ContextActionContainer>\n\n {/* Preview image + spinner */}\n <Box\n style={{\n gridColumn: 2,\n gridRowStart: 1,\n gridRowEnd: 'span 5',\n height: '90px',\n width: '100px',\n }}\n >\n <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n {/* File icon */}\n {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n {/* Image */}\n {isImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard={!isOpaque}\n src={imageDprUrl(asset, {height: 100, width: 100})}\n />\n )}\n </Box>\n\n {/* Spinner */}\n {updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Spinner />\n </Flex>\n )}\n\n {/* Selected check icon */}\n {selected && !updating && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n }}\n >\n <Text size={2}>\n <CheckmarkCircleIcon />\n </Text>\n </Flex>\n )}\n </Flex>\n </Box>\n\n {/* Filename */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: 3,\n gridRow: mediaIndex < 3 ? 2 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.originalFilename}\n </Text>\n </Box>\n\n {/* Resolution */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 4,\n gridRow: mediaIndex < 3 ? 3 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {isImageAsset(asset) && getAssetResolution(asset)}\n </Text>\n </Box>\n\n {/* MIME type */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 5,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {asset.mimeType}\n </Text>\n </Box>\n\n {/* Size */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 6,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {filesize(asset.size, {base: 10, round: 0})}\n </Text>\n </Box>\n\n {/* Last updated */}\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{\n gridColumn: mediaIndex < 3 ? 3 : 7,\n gridRow: mediaIndex < 3 ? 4 : 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {formatRelative(new Date(asset._updatedAt), new Date())}\n </Text>\n </Box>\n\n {/* References */}\n <Box\n style={{\n display: mediaIndex < 3 ? 'none' : 'block',\n gridColumn: 8,\n gridRow: 'auto',\n opacity: opacityCell,\n }}\n >\n <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n {referenceCountVisible ? (\n <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n id={id}\n >\n {({isLoading, referringDocuments}) => {\n const uniqueDocuments = getUniqueDocuments(referringDocuments)\n return isLoading ? (\n <>-</>\n ) : (\n <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n )\n }}\n </WithReferringDocuments>\n ) : (\n <>-</>\n )}\n </Text>\n </Box>\n\n {/* Error */}\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n gridColumn: mediaIndex < 3 ? 4 : 9,\n gridRowStart: '1',\n gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n opacity: opacityCell,\n }}\n >\n {/* TODO: DRY */}\n {/* Error button */}\n {error && (\n <Box padding={2}>\n <Tooltip\n animate\n content={\n <Container padding={2} width={0}>\n <Text size={1}>{error}</Text>\n </Container>\n }\n placement=\"left\"\n portal\n >\n <Text size={1}>\n <StyledWarningIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Box>\n )}\n </Flex>\n </ContainerGrid>\n )\n}\n\nexport default memo(TableRowAsset)\n","import {Box, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n folderId: string\n name: string\n totalCount: number\n}\n\nconst ContainerGrid = styled(Grid)(\n ({theme}) => css`\n align-items: center;\n cursor: pointer;\n height: 100%;\n user-select: none;\n white-space: nowrap;\n\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.card.enabled.bg\n };\n }\n }\n `,\n)\n\nconst FolderBadge = styled(Box)(\n ({theme}) => css`\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n };\n border-radius: 6px;\n height: 42px;\n position: relative;\n width: 52px;\n\n &::before {\n background: ${\n // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n theme.sanity.color.spot.yellow\n };\n border-radius: 6px 6px 0 0;\n content: '';\n height: 12px;\n left: 0;\n position: absolute;\n top: -6px;\n width: 18px;\n }\n `,\n)\n\nconst TableRowFolder = ({folderId, name, totalCount}: Props) => {\n const dispatch = useDispatch()\n const mediaIndex = useMediaIndex()\n const scheme = useColorSchemeValue()\n\n return (\n <ContainerGrid\n onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n style={{\n background: getSchemeColor(scheme, 'bg'),\n gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n }}\n >\n <Box />\n <Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n <FolderBadge />\n </Flex>\n <Box\n marginLeft={mediaIndex < 3 ? 3 : 0}\n style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n >\n <Stack gap={2}>\n <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n {name}\n </Text>\n <Text muted size={0} style={{lineHeight: '1.1em'}}>\n Folder\n </Text>\n </Stack>\n </Box>\n <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n <Text muted size={1}>\n {totalCount} item{totalCount === 1 ? '' : 's'}\n </Text>\n </Box>\n <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n <Text muted size={1}>\n Open folder\n </Text>\n </Box>\n <Box />\n </ContainerGrid>\n )\n}\n\nexport default TableRowFolder\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n id: string\n}\n\nconst TableRowUpload = (props: Props) => {\n const {id} = props\n\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const item = useTypedSelector((state) => selectUploadById(state, id))\n\n const mediaIndex = useMediaIndex()\n\n if (!item) {\n return null\n }\n\n const fileSize = filesize(item.size, {base: 10, round: 0})\n const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n const isComplete = item.status === 'complete'\n const isUploading = item.status === 'uploading'\n const isQueued = item.status === 'queued'\n\n let status\n if (isComplete) {\n status = 'Verifying'\n }\n if (isUploading) {\n status = `${percentLoaded}%`\n }\n if (isQueued) {\n status = 'Queued'\n }\n\n // Callbacks\n const handleCancelUpload = () => {\n dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n }\n\n return (\n <Grid\n style={{\n alignItems: 'center',\n background: getSchemeColor(scheme, 'bg'),\n columnGap: mediaIndex < 3 ? 0 : '16px',\n rowGap: 0,\n gridTemplateColumns:\n mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n height: '100%',\n position: 'relative',\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n background: 'var(--card-fg-color)',\n bottom: 0,\n height: '1px',\n left: 0,\n position: 'absolute',\n width: '100%',\n transform: `scaleX(${percentLoaded * 0.01})`,\n transformOrigin: 'bottom left',\n transition: 'all 1000ms ease-out',\n }}\n />\n\n {/* Image */}\n <Box\n style={{\n gridColumn: 2,\n gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n height: '90px',\n width: '100px',\n }}\n >\n <Box style={{height: '100%', position: 'relative'}}>\n {item.assetType === 'image' && item?.objectUrl && (\n <Image\n draggable={false}\n $scheme={scheme}\n src={item.objectUrl}\n style={{opacity: 0.25}}\n />\n )}\n\n {item.assetType === 'file' && (\n <div style={{height: '100%', opacity: 0.1}}>\n <FileIcon width=\"40px\" />\n </div>\n )}\n\n {/*\n Cancel upload button.\n Assets will only have a `complete` status _after_ it has been created on your dataset.\n As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n */}\n {!isComplete && percentLoaded !== 100 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n position: 'absolute',\n height: '100%',\n left: 0,\n top: 0,\n width: '100%',\n }}\n >\n <Button\n fontSize={3}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={handleCancelUpload}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n />\n </Flex>\n )}\n </Box>\n </Box>\n\n {/* Filename */}\n <Box\n style={{\n gridColumn: mediaIndex < 3 ? 3 : '3/8',\n gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n marginLeft: mediaIndex < 3 ? 3 : 0,\n }}\n >\n <Stack gap={3}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {item.name} ({fileSize})\n </Text>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n {status}\n </Text>\n </Stack>\n </Box>\n </Grid>\n )\n}\n\nexport default TableRowUpload\n","import {Box} from '@sanity/ui'\nimport {memo} from 'react'\nimport {GroupedVirtuoso} from 'react-virtuoso'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport TableHeader from '../TableHeader'\nimport TableRowAsset from '../TableRowAsset'\nimport TableRowFolder from '../TableRowFolder'\nimport TableRowUpload from '../TableRowUpload'\n\ntype Props = {\n items: (CardAssetData | CardFolderData | CardUploadData)[]\n onLoadMore?: () => void\n}\n\nconst VirtualRow = memo(\n ({\n item,\n selected,\n }: {\n item: CardAssetData | CardFolderData | CardUploadData\n selected: boolean\n }) => {\n if (item?.type === 'asset') {\n return (\n <Box style={{height: '100px'}}>\n <TableRowAsset id={item.id} selected={selected} />\n </Box>\n )\n }\n\n if (item?.type === 'folder') {\n return (\n <Box style={{height: '100px'}}>\n <TableRowFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n </Box>\n )\n }\n\n if (item?.type === 'upload') {\n return (\n <Box style={{height: '100px'}}>\n <TableRowUpload id={item.id} />\n </Box>\n )\n }\n\n return null\n },\n)\n\nconst AssetTableVirtualized = (props: Props) => {\n const {items, onLoadMore} = props\n\n // Redux\n const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n const totalCount = items?.length\n\n if (totalCount === 0) {\n return null\n }\n\n return (\n <GroupedVirtuoso\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n return item?.id || index\n }}\n endReached={onLoadMore}\n groupCounts={Array(1).fill(totalCount)}\n groupContent={() => {\n return <TableHeader />\n }}\n itemContent={(index) => {\n const item = items[index]\n const selected = selectedIds.includes(item?.id || '')\n return <VirtualRow item={item!} selected={selected} />\n }}\n style={{overflowX: 'hidden'}}\n />\n )\n}\n\nexport default AssetTableVirtualized\n","import {Box, Text, useMediaIndex} from '@sanity/ui'\nimport {useEffect} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport {tagsActions} from '../../modules/tags'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\nimport AssetTableVirtualized from '../AssetTableVirtualized'\n\nconst Items = () => {\n // Redux\n const dispatch = useDispatch()\n const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n const fetching = useTypedSelector((state) => state.assets.fetching)\n const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n const view = useTypedSelector((state) => state.assets.view)\n const combinedItems = useTypedSelector(selectCombinedItems)\n\n const mediaIndex = useMediaIndex()\n\n const hasFetchedOnce = fetchCount >= 0\n const hasItems = combinedItems.length > 0\n\n // Only load 1 page of items at a time.\n const handleLoadMoreItems = () => {\n if (!fetching) {\n dispatch(assetsActions.loadNextPage())\n }\n }\n\n // Effects\n\n // - Hide folders/tags panels on smaller breakpoints\n useEffect(() => {\n if (mediaIndex <= 1 && foldersPanelVisible) {\n dispatch(foldersActions.panelVisibleSet({panelVisible: false}))\n }\n\n if (mediaIndex <= 1 && tagsPanelVisible) {\n dispatch(tagsActions.panelVisibleSet({panelVisible: false}))\n }\n }, [dispatch, foldersPanelVisible, mediaIndex, tagsPanelVisible])\n\n const isEmpty = !hasItems && hasFetchedOnce && !fetching\n\n return (\n <Box flex={1} style={{width: '100%'}}>\n {isEmpty ? (\n <Box padding={4}>\n <Text size={1} weight=\"semibold\">\n No results for the current query\n </Text>\n </Box>\n ) : (\n <>\n {view === 'grid' && (\n <AssetGridVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n )}\n\n {view === 'table' && (\n <AssetTableVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n )}\n </>\n )}\n </Box>\n )\n}\n\nexport default Items\n","import {Box, Button, Flex, Label} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {isImageAsset} from '../../utils/typeGuards'\n\nconst PickedBar = () => {\n const scheme = useColorSchemeValue()\n\n // Redux\n const dispatch = useDispatch()\n const assetsPicked = useTypedSelector(selectAssetsPicked)\n const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n // Replace only rewrites image field refs — only offer it for a single image asset.\n const canReplace =\n assetsPicked.length === 1 && !!assetsPicked[0] && isImageAsset(assetsPicked[0].asset)\n\n // Callbacks\n const handlePickClear = () => {\n dispatch(assetsActions.pickClear())\n }\n\n const handleDeletePicked = () => {\n dispatch(dialogActions.showConfirmDeleteAssets({assets: assetsPicked}))\n }\n\n const handleReplaceImages = () => {\n const assetId = assetsPicked[0]?.asset._id\n if (!assetId) {\n return\n }\n dispatch(dialogActions.showAllAssetsDialog({assetId}))\n }\n\n const handleMovePicked = () =>\n dispatch(DIALOG_ACTIONS.showFolderMove({assets: assetsPicked, folderId: currentFolderId}))\n\n const handleRemovePickedFromFolder = () =>\n dispatch(assetsActions.folderSetRequest({assets: assetsPicked, folderId: null}))\n\n const handleInsertPicked = () => {\n if (!onSelect) {\n return\n }\n\n const pickedAssetIds = assetsPicked.map((item) => ({\n kind: 'assetDocumentId' as const,\n value: item.asset._id,\n }))\n\n if (pickedAssetIds.length === 0) {\n return\n }\n\n onSelect(pickedAssetIds)\n }\n\n if (assetsPicked.length === 0) {\n return null\n }\n\n return (\n <Flex\n align=\"center\"\n justify=\"flex-start\"\n style={{\n background: getSchemeColor(scheme, 'bg'),\n borderBottom: '1px solid var(--card-border-color)',\n height: `${PANEL_HEIGHT}px`,\n position: 'relative',\n width: '100%',\n }}\n >\n <Flex align=\"center\" paddingX={3}>\n <Box paddingRight={2}>\n <Label size={0} style={{color: 'inherit'}}>\n {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n </Label>\n </Box>\n\n {/* Deselect button */}\n <Button\n mode=\"bleed\"\n onClick={handlePickClear}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Deselect</Label>\n </Button>\n\n {onSelect && isMultiSelect ? (\n <Button\n mode=\"bleed\"\n onClick={handleInsertPicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Insert selected</Label>\n </Button>\n ) : (\n <Button\n mode=\"bleed\"\n onClick={handleDeletePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Delete</Label>\n </Button>\n )}\n\n {/* Replace button */}\n {canReplace && (\n <Button\n mode=\"bleed\"\n onClick={handleReplaceImages}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"default\"\n >\n <Label size={0}>Replace</Label>\n </Button>\n )}\n\n {!onSelect && (\n <>\n <Button\n mode=\"bleed\"\n onClick={handleMovePicked}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"primary\"\n >\n <Label size={0}>Move to folder</Label>\n </Button>\n {currentFolderId && (\n <Button\n mode=\"bleed\"\n onClick={handleRemovePickedFromFolder}\n padding={2}\n style={{background: 'none', boxShadow: 'none'}}\n tone=\"critical\"\n >\n <Label size={0}>Remove from folder</Label>\n </Button>\n )}\n </>\n )}\n </Flex>\n </Flex>\n )\n}\n\nexport default PickedBar\n","import {Box} from '@sanity/ui'\n\nimport {TAGS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport TagView from '../TagView'\n\nconst TagsPanel = () => {\n const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n if (!tagsPanelVisible) {\n return null\n }\n\n return (\n <Box\n style={{\n position: 'relative',\n width: TAGS_PANEL_WIDTH,\n }}\n >\n <Box\n className=\"media__custom-scrollbar\"\n style={{\n borderLeft: '1px solid var(--card-border-color)',\n height: '100%',\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'absolute',\n right: 0,\n top: 0,\n width: '100%',\n }}\n >\n <TagView />\n </Box>\n </Box>\n )\n}\n\nexport default TagsPanel\n","import {white} from '@sanity/color'\nimport {Flex, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {type DropEvent, type DropzoneOptions, useDropzone} from 'react-dropzone'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {DropzoneDispatchProvider} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {notificationsActions} from '../../modules/notifications'\nimport {uploadsActions} from '../../modules/uploads'\n\ntype Props = {\n children: ReactNode\n}\n\nconst UploadContainer = styled.div`\n color: white;\n height: 100%;\n min-height: 100%;\n right: 0;\n top: 0;\n width: 100%;\n\n &:focus {\n outline: none;\n }\n`\n\nconst DragActiveContainer = styled.div`\n align-items: center;\n background: rgba(0, 0, 0, 0.75);\n display: flex;\n height: 100%;\n justify-content: center;\n position: absolute;\n right: 0;\n top: 0;\n width: 100%;\n z-index: 3;\n`\n\n// Iterate through all files and only return non-folders / packages.\n// We check for files by reading the first byte of the file\nasync function filterFiles(fileList: FileList) {\n const files = Array.from(fileList)\n\n const filteredFiles: File[] = []\n\n for (const file of files) {\n try {\n await file.slice(0, 1).arrayBuffer()\n filteredFiles.push(file)\n } catch {\n // do nothing: file is a package or folder\n }\n }\n\n return filteredFiles\n}\n\nconst UploadDropzone = (props: Props) => {\n const {children} = props\n\n const {\n dropzone: {maxSize},\n directUploads,\n } = useToolOptions()\n\n const {onSelect} = useAssetSourceActions()\n\n // Redux\n const dispatch = useDispatch()\n const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n\n const isImageAssetType = assetTypes.length === 1 && assetTypes[0] === 'image'\n\n // Callbacks\n const handleDrop = async (acceptedFiles: File[]) => {\n acceptedFiles.forEach((file) =>\n dispatch(\n uploadsActions.uploadRequest({\n file,\n forceAsAssetType: assetTypes.length === 1 ? assetTypes[0] : undefined,\n }),\n ),\n )\n }\n\n const handleDropRejected: DropzoneOptions['onDropRejected'] = (rejections) => {\n const errorCodes = rejections.flatMap(({errors}) => errors.map(({code}) => code))\n\n if (errorCodes.includes('file-too-large')) {\n dispatch(\n notificationsActions.add({\n status: 'error',\n title: 'One or more files exceed the maximum upload size.',\n }),\n )\n }\n }\n\n // Use custom file selector to obtain files on file drop + change events (excluding folders and packages)\n const handleFileGetter = async (event: DropEvent) => {\n let fileList: FileList | undefined\n if (event.type === 'drop' && 'dataTransfer' in event) {\n fileList = event?.dataTransfer?.files\n }\n if (event.type === 'change') {\n const target = event?.target as HTMLInputElement\n if (target?.files) {\n fileList = target.files\n }\n }\n\n if (!fileList) {\n return []\n }\n\n // Filter out non-folders / packages\n const files: File[] = await filterFiles(fileList)\n\n // Dispatch error if some files have been filtered out\n if (fileList?.length !== files.length) {\n dispatch(\n notificationsActions.add({\n status: 'error',\n title: `Unable to upload some items (folders and packages aren't supported)`,\n }),\n )\n }\n\n return files\n }\n\n // Limit file picking to only images if we're specifically within an image selection context (e.g. picking from image fields)\n const {getRootProps, getInputProps, isDragActive, open} = useDropzone({\n accept: isImageAssetType ? 'image/*' : '',\n getFilesFromEvent: handleFileGetter,\n noClick: true,\n // HACK: Disable drag and drop functionality when in a selecting context\n // (This is currently due to Sanity's native image input taking precedence with drag and drop)\n noDrag: !!onSelect,\n onDrop: handleDrop,\n maxSize,\n onDropRejected: handleDropRejected,\n disabled: !directUploads,\n })\n\n return (\n <DropzoneDispatchProvider open={open}>\n <UploadContainer {...getRootProps()}>\n <input {...getInputProps()} />\n\n {isDragActive && (\n <DragActiveContainer>\n <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n <Text size={3} style={{color: 'inherit'}}>\n Drop files to upload\n </Text>\n </Flex>\n </DragActiveContainer>\n )}\n\n {children}\n </UploadContainer>\n </DropzoneDispatchProvider>\n )\n}\n\nexport default UploadDropzone\n","import type {MutationEvent, SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {useEffect} from 'react'\nimport {useDispatch, useSelector} from 'react-redux'\nimport type {Dispatch} from 'redux'\nimport type {AssetSourceComponentProps} from 'sanity'\n\nimport {inputs} from '../../config/searchFacets'\nimport {FOLDER_DOCUMENT_NAME, TAG_DOCUMENT_NAME} from '../../constants'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {tagsActions} from '../../modules/tags'\nimport type {RootReducerState} from '../../modules/types'\nimport type {Asset, Tag} from '../../types'\n\nfunction getMediaTagNames(schemaType?: AssetSourceComponentProps['schemaType']): string[] {\n const mediaTags = (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n if (!mediaTags?.length) return []\n const unique = new Set(\n mediaTags.map((t) => t?.trim()).filter((t): t is string => Boolean(t?.length)),\n )\n return Array.from(unique)\n}\n\nfunction createAssetHandler(dispatch: Dispatch) {\n return (update: MutationEvent) => {\n const {documentId, result, transition} = update\n\n switch (transition) {\n case 'appear':\n dispatch(assetsActions.listenerCreateQueue({asset: result as Asset}))\n break\n case 'disappear':\n dispatch(assetsActions.listenerDeleteQueue({assetId: documentId}))\n break\n case 'update':\n dispatch(assetsActions.listenerUpdateQueue({asset: result as Asset}))\n break\n default:\n break\n }\n }\n}\n\nfunction createTagHandler(dispatch: Dispatch) {\n return (update: MutationEvent) => {\n const {documentId, result, transition} = update\n\n switch (transition) {\n case 'appear':\n dispatch(tagsActions.listenerCreateQueue({tag: result as Tag}))\n break\n case 'disappear':\n dispatch(tagsActions.listenerDeleteQueue({tagId: documentId}))\n break\n case 'update':\n dispatch(tagsActions.listenerUpdateQueue({tag: result as Tag}))\n break\n default:\n break\n }\n }\n}\n\nexport function useBrowserInit(\n client: SanityClient,\n schemaType?: AssetSourceComponentProps['schemaType'],\n): void {\n const dispatch = useDispatch()\n const tagsByIds = useSelector((state: RootReducerState) => state.tags.byIds)\n const tagsFetchCount = useSelector((state: RootReducerState) => state.tags.fetchCount)\n\n const tagNames = getMediaTagNames(schemaType)\n const hasMediaTags = tagNames.length > 0\n\n useEffect(() => {\n if (!hasMediaTags) {\n dispatch(searchActions.facetsClear())\n }\n\n dispatch(tagsActions.fetchRequest())\n\n // Fetch all folders\n dispatch(foldersActions.fetchRequest())\n\n const assetSubscription = client\n .listen(\n groq`*[_type in [\"sanity.fileAsset\", \"sanity.imageAsset\"] && !(_id in path(\"drafts.**\"))]`,\n )\n .subscribe(createAssetHandler(dispatch))\n\n const tagSubscription = client\n .listen(groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n .subscribe(createTagHandler(dispatch))\n\n const folderSubscription = client\n .listen(groq`*[_type == \"${FOLDER_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n .subscribe(() => dispatch(foldersActions.fetchRequest()))\n\n return () => {\n assetSubscription.unsubscribe()\n tagSubscription.unsubscribe()\n folderSubscription.unsubscribe()\n }\n }, [client, dispatch, hasMediaTags])\n\n // When mediaTags are configured, wait for the tag fetch to complete then apply facets.\n // Dispatching clear + add synchronously keeps all actions within assetsSearchEpic's\n // 400ms debounce window, so the browser performs exactly one asset fetch on open.\n useEffect(() => {\n if (!hasMediaTags || tagsFetchCount < 0) return\n\n const tagFacetInput = inputs.tag\n if (tagFacetInput.type !== 'searchable') return\n\n const resolvedTags = tagNames\n .map((name) => Object.values(tagsByIds).find((item) => item.tag.name.current === name))\n .filter((item): item is NonNullable<typeof item> => Boolean(item))\n\n dispatch(searchActions.facetsClear())\n\n for (const tagItem of resolvedTags) {\n dispatch(\n searchActions.facetsAdd({\n facet: {\n ...tagFacetInput,\n operatorType: 'references',\n value: {label: tagItem.tag.name.current, value: tagItem.tag._id},\n },\n }),\n )\n }\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }, [tagsFetchCount, hasMediaTags]) // eslint-disable-line react-hooks/exhaustive-deps\n}\n","import {Card, Flex, PortalProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport Controls from '../Controls'\nimport DebugControls from '../DebugControls'\nimport Dialogs from '../Dialogs'\nimport FolderBreadcrumbs from '../FolderBreadcrumbs'\nimport FolderPanel from '../FolderPanel'\nimport Header from '../Header'\nimport Items from '../Items'\nimport Notifications from '../Notifications'\nimport PickedBar from '../PickedBar'\nimport ReduxProvider from '../ReduxProvider'\nimport TagsPanel from '../TagsPanel'\nimport UploadDropzone from '../UploadDropzone'\nimport {useBrowserInit} from './useBrowserInit'\n\ntype Props = {\n assetType?: AssetSourceComponentProps['assetType']\n document?: SanityDocument\n isMultiSelect?: boolean\n onClose?: AssetSourceComponentProps['onClose']\n onSelect?: AssetSourceComponentProps['onSelect']\n selectedAssets?: AssetSourceComponentProps['selectedAssets']\n schemaType?: AssetSourceComponentProps['schemaType']\n}\n\nconst BrowserContent = ({\n onClose,\n schemaType,\n}: {\n onClose?: AssetSourceComponentProps['onClose']\n schemaType?: AssetSourceComponentProps['schemaType']\n}) => {\n const client = useVersionedClient()\n const [portalElement, setPortalElement] = useState<HTMLDivElement | null>(null)\n\n useBrowserInit(client, schemaType)\n\n return (\n <PortalProvider element={portalElement}>\n <UploadDropzone>\n <Dialogs />\n <Notifications />\n\n <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n <Flex direction=\"column\" flex={1}>\n {/* Header */}\n <Header onClose={onClose} />\n\n {/* Browser Controls */}\n <Controls />\n\n <FolderBreadcrumbs />\n\n <Flex flex={1}>\n <FolderPanel />\n <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n <PickedBar />\n <Items />\n </Flex>\n <TagsPanel />\n </Flex>\n\n {/* Debug */}\n <DebugControls />\n </Flex>\n </Card>\n </UploadDropzone>\n </PortalProvider>\n )\n}\n\nconst Browser = (props: Props) => {\n const client = useVersionedClient()\n const {excludeTagSlugs} = useToolOptions()\n\n return (\n <ReduxProvider\n assetType={props?.assetType}\n client={client}\n document={props?.document}\n excludeTagSlugs={excludeTagSlugs}\n selectedAssets={props?.selectedAssets}\n >\n <AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n <GlobalStyle />\n <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n </AssetBrowserDispatchProvider>\n </ReduxProvider>\n )\n}\n\nexport default Browser\n","import {Box, Portal, PortalProvider, useLayer} from '@sanity/ui'\nimport {type SyntheticEvent} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport Browser from '../Browser'\n\nconst FormBuilderTool = (props: AssetSourceComponentProps) => {\n const {onClose} = props\n\n const portalElement = useRootPortalElement()\n\n // Get current Sanity document\n const currentDocument = useFormValue([]) as SanityDocument\n const selectionType = (props as unknown as {selectionType?: string})?.selectionType\n const schemaJsonType = (props?.schemaType as {jsonType?: string} | undefined)?.jsonType\n const isMultiSelect = selectionType === 'multiple' || schemaJsonType === 'array'\n\n // Close on escape key press\n useKeyPress('escape', onClose)\n\n // Stop propagation and prevent document mouse events from firing.\n // This is a bit of a hack to make this work with `editModal = 'popover'` and prevent Sanity's <Popover /> component from\n // prematurely closing, as it attaches events on `document` to detect outside clicks.\n const handleStopPropagation = (event: SyntheticEvent) => {\n event.nativeEvent.stopImmediatePropagation()\n event.stopPropagation()\n }\n\n const {zIndex} = useLayer()\n\n return (\n <PortalProvider element={portalElement}>\n <Portal>\n <Box\n onDragEnter={handleStopPropagation}\n onDragLeave={handleStopPropagation}\n onDragOver={handleStopPropagation}\n onDrop={handleStopPropagation}\n onMouseUp={handleStopPropagation}\n style={{\n bottom: 0,\n height: 'auto',\n left: 0,\n position: 'fixed',\n top: 0,\n width: '100%',\n zIndex,\n }}\n >\n <Browser\n document={currentDocument}\n isMultiSelect={isMultiSelect}\n schemaType={props.schemaType}\n {...props}\n />\n </Box>\n </Portal>\n </PortalProvider>\n )\n}\n\nexport default FormBuilderTool\n","import {Flex} from '@sanity/ui'\n\nimport Browser from '../Browser'\n\nconst Tool = () => {\n return (\n <Flex direction=\"column\" height=\"fill\" flex={1}>\n <Browser />\n </Flex>\n )\n}\n\nexport default Tool\n","import {FolderIcon} from '@sanity/icons/Folder'\n\nimport {FOLDER_DOCUMENT_NAME} from '../constants'\n\nexport default {\n title: 'Media Folder',\n icon: FolderIcon,\n name: FOLDER_DOCUMENT_NAME,\n type: 'document',\n fields: [\n {\n title: 'Name',\n name: 'name',\n type: 'string',\n },\n {\n title: 'Parent',\n name: 'parent',\n type: 'reference',\n to: [{type: FOLDER_DOCUMENT_NAME}],\n weak: true,\n },\n ],\n preview: {\n select: {\n name: 'name',\n parentName: 'parent.name',\n },\n prepare(selection: {name?: string; parentName?: string}): {\n media: typeof FolderIcon\n subtitle?: string\n title: string\n } {\n const {name, parentName} = selection\n return {\n media: FolderIcon,\n title: name || 'Folder',\n subtitle: parentName ? `in ${parentName}` : undefined,\n }\n },\n },\n}\n","import TagIcon from '../components/TagIcon'\nimport {TAG_DOCUMENT_NAME} from '../constants'\n\nexport default {\n title: 'Media Tag',\n icon: TagIcon,\n name: TAG_DOCUMENT_NAME,\n type: 'document',\n fields: [\n {\n title: 'Name',\n name: 'name',\n type: 'slug',\n },\n ],\n preview: {\n select: {\n name: 'name',\n },\n prepare(selection: any) {\n const {name} = selection\n return {\n media: TagIcon,\n title: name?.current,\n }\n },\n },\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {type AssetSource, type Tool as SanityTool, definePlugin} from 'sanity'\n\nimport EditAssetTool from './components/EditAssetTool'\nimport FormBuilderTool from './components/FormBuilderTool'\nimport Tool from './components/Tool'\nimport {ToolOptionsProvider} from './contexts/ToolOptionsContext'\nimport mediaFolder from './schemas/folder'\nimport mediaTag from './schemas/tag'\nimport type {MediaToolOptions} from './types'\n\nconst plugin = {\n icon: ImageIcon,\n name: 'media',\n title: 'Media',\n}\n\nexport const mediaAssetSource = {\n ...plugin,\n component: FormBuilderTool,\n} satisfies AssetSource\n\nconst editMediaAssetSource = {\n icon: EditIcon,\n name: 'edit-media',\n // oxlint-disable-next-line no-deprecated -- `i18nKey` requires a locale bundle; a plain title is intentional here\n title: 'Edit Media',\n component: EditAssetTool,\n} satisfies AssetSource\n\nconst tool = {\n ...plugin,\n component: Tool,\n __internalApplicationType: 'sanity/media',\n} satisfies SanityTool\n\nexport const media = definePlugin<MediaToolOptions | void>((options) => ({\n name: 'media',\n studio: {\n components: {\n layout: (props) => (\n <ToolOptionsProvider options={options}>{props.renderDefault(props)}</ToolOptionsProvider>\n ),\n },\n },\n form: {\n file: {\n assetSources: (prev) => {\n return [...prev, mediaAssetSource, editMediaAssetSource]\n },\n },\n image: {\n assetSources: (prev) => {\n return [...prev, mediaAssetSource, editMediaAssetSource]\n },\n },\n },\n schema: {\n types: [mediaTag, mediaFolder],\n },\n tools: (prev) => {\n return [...prev, tool]\n },\n}))\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {Tag} from '../types'\n\ntype ApplyMediaTagsOptions = {\n client: SanityClient\n assetId: string\n mediaTags: string[]\n createTagsOnUpload?: boolean\n}\n\n// Serialize calls per asset so concurrent fields reading the same asset\n// don't race each other — the second call always runs after the first commits.\nconst pendingByAsset = new Map<string, Promise<void>>()\n\nexport function applyMediaTags(options: ApplyMediaTagsOptions): Promise<void> {\n const {assetId} = options\n const chain = (pendingByAsset.get(assetId) ?? Promise.resolve()).then(() =>\n doApplyMediaTags(options),\n )\n const cleanup = chain\n .catch(() => {})\n .finally(() => {\n if (pendingByAsset.get(assetId) === cleanup) pendingByAsset.delete(assetId)\n })\n pendingByAsset.set(assetId, cleanup)\n return chain\n}\n\nasync function doApplyMediaTags({\n client,\n assetId,\n mediaTags,\n createTagsOnUpload = true,\n}: ApplyMediaTagsOptions): Promise<void> {\n if (!mediaTags || mediaTags.length === 0) return\n\n const resolvedTags = await Promise.all(\n mediaTags.map(async (tagName) => {\n const existingTag = await client.fetch<Tag | null>(\n groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $tagName][0]`,\n {tagName},\n )\n if (existingTag) return existingTag\n if (createTagsOnUpload) {\n const newTag = await client.create({\n _type: TAG_DOCUMENT_NAME,\n name: {_type: 'slug', current: tagName},\n })\n return newTag as Tag\n }\n return null\n }),\n )\n\n const validTags = resolvedTags.filter((tag): tag is Tag => tag !== null)\n if (validTags.length === 0) return\n\n const existing = await client.fetch<{tagIds: string[]} | null>(\n groq`*[_id == $assetId][0]{'tagIds': opt.media.tags[]._ref}`,\n {assetId},\n {useCdn: false}, // bypass CDN cache so we see the latest committed tag refs\n )\n const existingIds = new Set(existing?.tagIds ?? [])\n\n const tagReferences = validTags\n .filter((tag) => !existingIds.has(tag._id))\n .map((tag) => ({\n _key: nanoid(),\n _ref: tag._id,\n _type: 'reference' as const,\n _weak: true,\n }))\n\n if (tagReferences.length === 0) return\n\n await client\n .patch(assetId)\n .setIfMissing({opt: {}})\n .setIfMissing({'opt.media': {}})\n .setIfMissing({'opt.media.tags': []})\n .append('opt.media.tags', tagReferences)\n .commit()\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect, useRef} from 'react'\nimport {type InputProps} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {applyMediaTags} from '../../utils/applyMediaTags'\n\ntype AssetValue = {\n _type: 'image' | 'file'\n asset?: {\n _ref: string\n _type: 'reference'\n }\n}\n\nexport type AutoTagInputProps = InputProps & {\n mediaTags?: string[]\n}\n\n/**\n * Input component that automatically applies media tags when an asset is selected or uploaded.\n *\n * Apply explicitly to image/file fields that should be auto-tagged:\n * ```ts\n * import {AutoTagInput} from 'sanity-plugin-media'\n *\n * defineField({\n * type: 'image',\n * options: { mediaTags: ['product'] }, // also pre-filters the media browser\n * components: { input: AutoTagInput },\n * })\n * ```\n *\n * Pass `mediaTags` as a prop to override or use without `options`:\n * ```ts\n * components: { input: (props) => <AutoTagInput {...props} mediaTags={['product']} /> }\n * ```\n */\nexport function AutoTagInput(props: AutoTagInputProps) {\n const {renderDefault, schemaType, value, mediaTags: mediaTagsProp} = props\n const toast = useToast()\n\n // Prop takes precedence; fall back to schemaType.options.mediaTags (set for browser pre-filtering)\n const mediaTags =\n mediaTagsProp ?? (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n\n const client = useVersionedClient()\n const {createTagsOnUpload} = useToolOptions()\n\n const prevAssetRef = useRef<string | undefined>(undefined)\n const isInitialMount = useRef(true)\n\n const currentAssetRef = (value as AssetValue | undefined)?.asset?._ref\n\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false\n prevAssetRef.current = currentAssetRef\n return\n }\n\n const previousRef = prevAssetRef.current\n prevAssetRef.current = currentAssetRef\n\n if (!mediaTags?.length || !currentAssetRef || currentAssetRef === previousRef) return\n\n applyMediaTags({\n client,\n assetId: currentAssetRef,\n mediaTags,\n createTagsOnUpload,\n }).catch((err) => {\n console.error('[sanity-plugin-media] Failed to apply auto-tags:', err)\n const label = mediaTags.length === 1 ? 'tag' : 'tags'\n toast.push({\n closable: true,\n status: 'error',\n title: `Failed to apply the media ${label} ${mediaTags.join(', ')}`,\n })\n })\n }, [currentAssetRef, mediaTags, client, createTagsOnUpload, toast])\n\n return renderDefault(props as InputProps)\n}\n","import type {\n FieldDefinitionBase,\n FileDefinition,\n ImageDefinition,\n WidenInitialValue,\n WidenValidation,\n} from 'sanity'\n\nimport {AutoTagInput} from '../components/AutoTagInputWrapper'\n\ntype ImageMediaFieldConfig = Omit<ImageDefinition, 'options'> &\n FieldDefinitionBase & {\n name: string\n mediaTags: string[]\n options?: ImageDefinition['options']\n }\n\ntype FileMediaFieldConfig = Omit<FileDefinition, 'options'> &\n FieldDefinitionBase & {\n name: string\n mediaTags: string[]\n options?: FileDefinition['options']\n }\n\ntype ImageMediaFieldResult = Omit<ImageDefinition, 'options'> &\n FieldDefinitionBase & {\n options?: ImageDefinition['options'] & {mediaTags: string[]}\n components: {input: typeof AutoTagInput}\n } & WidenValidation &\n WidenInitialValue\n\ntype FileMediaFieldResult = Omit<FileDefinition, 'options'> &\n FieldDefinitionBase & {\n options?: FileDefinition['options'] & {mediaTags: string[]}\n components: {input: typeof AutoTagInput}\n } & WidenValidation &\n WidenInitialValue\n\n/**\n * Defines an image or file field with automatic media tag application when an asset is selected.\n *\n * Pass `mediaTags` at the top level — they are moved into `options.mediaTags` (for media browser\n * pre-filtering) and wire up {@link AutoTagInput} as the field component automatically:\n * ```ts\n * import {mediaField} from 'sanity-plugin-media'\n *\n * mediaField({\n * name: 'coverImage',\n * type: 'image',\n * mediaTags: ['product-cover'],\n * options: { hotspot: true },\n * })\n * ```\n *\n * For file fields, set `type: 'file'`:\n * ```ts\n * mediaField({ name: 'drawing', type: 'file', mediaTags: ['model-drawing'] })\n * ```\n */\nexport function mediaField(config: ImageMediaFieldConfig): ImageMediaFieldResult\nexport function mediaField(config: FileMediaFieldConfig): FileMediaFieldResult\nexport function mediaField(\n config: ImageMediaFieldConfig | FileMediaFieldConfig,\n): ImageMediaFieldResult | FileMediaFieldResult {\n const {mediaTags, options, components, ...rest} = config as ImageMediaFieldConfig & {\n components?: Record<string, unknown>\n }\n return {\n ...rest,\n options: {...options, mediaTags},\n components: {...components, input: AutoTagInput},\n } as unknown as ImageMediaFieldResult\n}\n"],"mappings":"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"}
\ No newline at end of file