sanity-plugin-s3-media 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../src/hooks/useKeyPress.ts","../../src/hooks/useTypedSelector.ts","../../src/utils/accepts.ts","../../src/utils/file/hashFile.ts","../../src/utils/imageUrlToBlob.ts","../../src/utils/mediaBrowser/constructFilter.ts","../../src/utils/mediaBrowser/generatePreviewBlobUrl.ts","../../src/utils/mediaBrowser/getAssetResolution.ts","../../src/utils/mediaBrowser/getSchemeColor.ts","../../src/utils/mediaBrowser/getUniqueDocuments.ts","../../packages/types/src/asset.ts","../../src/constants.ts","../../src/utils/upload.ts","../../src/utils/withMaxConcurrency.ts","../../src/components/UI/MenuItem.tsx","../../src/components/UI/Button.tsx","../../src/components/UI/Dialog.tsx","../../src/components/File/FileInputButton.tsx","../../src/components/File/FileInputMenuItem.tsx","../../src/contexts/DropzoneDispatchContext.tsx","../../src/contexts/S3AssetSourceDispatchContext.tsx","../../packages/asset-utils/src/constants.ts","../../packages/asset-utils/src/errors.ts","../../packages/asset-utils/src/utils.ts","../../packages/asset-utils/src/asserters.ts","../../packages/asset-utils/src/parse.ts","../../packages/asset-utils/src/paths.ts","../../src/lib/S3AssetSource/assets.ts","../../src/utils/isObject.ts","../../src/lib/S3Client/http/errors.ts","../../src/lib/S3Client/http/fetchClient.ts","../../src/lib/S3Client/http/request.ts","../../src/lib/S3Client/defineCreateClient.ts","../../src/lib/S3Client/validators.ts","../../src/lib/S3Client/assets/AssetsClient.ts","../../src/lib/S3Client/S3Client.ts","../../src/lib/S3Client/createS3Client.ts","../../src/contexts/S3MediaContext.tsx","../../src/contexts/S3MediaOptionsContext.tsx","../../src/config/orders.ts","../../src/modules/search/store.ts","../../src/modules/uploads/actions.ts","../../src/modules/assets/store.ts","../../src/modules/dialog/store.ts","../../src/modules/uploads/store.ts","../../src/modules/notifications/store.ts","../../src/modules/rootEpic.ts","../../src/modules/selected/store.ts","../../src/modules/rootReducer.ts","../../src/modules/selectors.ts","../../src/components/MediaBrowser/FileIcon/FileIcon.tsx","../../src/components/MediaBrowser/Image/Image.tsx","../../src/components/MediaBrowser/constants.ts","../../src/components/MediaBrowser/CardAsset/CardAsset.tsx","../../src/components/MediaBrowser/CardUpload/CardUpload.tsx","../../src/components/MediaBrowser/AssetGridVirtualized/AssetGridVirtualized.tsx","../../src/components/MediaBrowser/TableHeaderItem/TableHeaderItem.tsx","../../src/components/MediaBrowser/TableHeader/TableHeader.tsx","../../src/components/MediaBrowser/TableRowAsset/TableRowAsset.tsx","../../src/components/MediaBrowser/styled/GlobalStyles/GlobalStyle.tsx","../../src/components/MediaBrowser/UploadDropzone/UploadDropzone.tsx","../../src/components/Upload/UploadDropDownMenu.tsx","../../src/components/Upload/UploadPlaceholder.tsx","../../src/components/Upload/UploadProgress.tsx","../../src/components/Upload/UploadDestinationPicker.tsx","../../src/components/Upload/UploadFileTarget.tsx","../../src/components/Upload/UploadTargetCard.tsx"],"sourcesContent":["import {isHotkey} from 'is-hotkey'\nimport {type RefObject, useCallback, useEffect, useRef} from 'react'\n\nexport const 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","import {type TypedUseSelectorHook, useSelector} from 'react-redux'\n\nimport type {RootReducerState} from '../types'\n\nexport const useTypedSelector: TypedUseSelectorHook<RootReducerState> = useSelector\n","import {type FileLike} from 'sanity'\n\n/**\n * Check if the provided file type should be accepted by the input with accept attribute.\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input#attr-accept\n *\n * Inspired by https://github.com/enyo/dropzone (MIT) (c) 2021 Matias Meno\n * Based on https://github.com/react-dropzone/attr-accept (MIT) (c) 2015 Andrey Okonetchnikov\n *\n * @param file - https://developer.mozilla.org/en-US/docs/Web/API/File\n * @param acceptedFiles - List of accepted mime types (comma-separated string or array)\n * @returns True if file is accepted, false otherwise\n */\nexport function accepts(file: FileLike, acceptedFiles: string | string[]): boolean {\n if (!file || !acceptedFiles) {\n return true\n }\n\n const acceptedFilesArray = Array.isArray(acceptedFiles)\n ? acceptedFiles // eg `['image/png', 'image/jpeg']`\n : acceptedFiles.split(',') // eg `image/png,image/jpeg`\n\n const fileName = file.name || ''\n const mimeType = (file.type || '').toLowerCase()\n const baseMimeType = mimeType.replace(/\\/.*$/, '')\n\n return acceptedFilesArray.some((type) => {\n const validType = type.trim().toLowerCase()\n\n if (validType.charAt(0) === '.') {\n if (fileName) {\n return fileName.toLowerCase().endsWith(validType)\n }\n // If we do not have a valid fileName and validType is an extension, we\n // should fail open. This happens because when hovering a file, the browser\n // does not pass the name of the file but it will pass the file name when the\n // file is dropped on the file upload input\n return true\n }\n\n if (validType.endsWith('/*')) {\n // This is something like a image/* mime type\n return baseMimeType === validType.replace(/\\/.*$/, '')\n }\n\n return mimeType === validType\n })\n}\n","import {from, type Observable} from 'rxjs'\n\nexport const hashFile = (file: File): Observable<string> => {\n return from(\n file.arrayBuffer().then((buffer) => {\n return crypto.subtle.digest('SHA-1', buffer).then((hash) => {\n const hashArray = Array.from(new Uint8Array(hash))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n })\n }),\n )\n}\n","export function imageUrlToBlob(\n imageUrl: string,\n format = 'image/jpeg',\n quality = 1,\n): Promise<Blob | null> {\n if (imageUrl.match(/^webkit-fake-url:\\/\\//)) {\n return Promise.reject(new Error('Cannot read image contents from webkit fake url'))\n }\n\n return new Promise((resolve, reject) => {\n const loader = new Image()\n\n loader.crossOrigin = 'anonymous'\n loader.referrerPolicy = 'strict-origin-when-cross-origin'\n loader.onload = () => {\n const canvas = document.createElement('canvas')\n\n canvas.width = loader.width\n canvas.height = loader.height\n const ctx = canvas.getContext('2d')\n\n ctx?.drawImage(loader, 0, 0, canvas.width, canvas.height)\n try {\n canvas.toBlob(resolve, format, quality)\n } catch (error) {\n reject(error)\n }\n }\n loader.src = imageUrl\n })\n}\n","import groq from 'groq'\nimport type {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nexport const constructFilter = ({\n assetTypes,\n searchQuery,\n}: {\n assetTypes: S3AssetType[]\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) => `${type}Asset`)\n\n const baseFilter = groq`\n _type in ${JSON.stringify(documentAssetTypes)} && !(_id in path(\"drafts.**\"))\n `\n\n // Join separate filter fragments\n const constructedQuery = [\n // Base filter\n baseFilter,\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 ].join(' && ')\n\n return constructedQuery\n}\n","import {from, Observable, 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 resolve(null)\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 type {S3ImageAsset, S3VideoAsset} from 'sanity-plugin-s3-media-types'\n\nexport const getAssetResolution = (asset: S3ImageAsset | S3VideoAsset): string => {\n return `${asset.metadata.dimensions.width}x${asset.metadata.dimensions.height}px`\n}\n","import {hues} from '@sanity/color'\nimport {studioTheme, type ThemeColorSchemeKey} from '@sanity/ui'\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: studioTheme.color.dark.default.input.default.enabled.border,\n light: studioTheme.color.light.default.input.default.enabled.border,\n },\n inputHoveredBorder: {\n dark: studioTheme.color.dark.default.input.default.hovered.border,\n light: studioTheme.color.light.default.input.default.hovered.border,\n },\n mutedHoveredBg: {\n dark: studioTheme.color.dark.primary.muted.primary.hovered.bg,\n light: studioTheme.color.light.primary.muted.primary.hovered.bg,\n },\n mutedHoveredFg: {\n dark: studioTheme.color.dark.primary.muted.primary.hovered.fg,\n light: studioTheme.color.light.primary.muted.primary.hovered.fg,\n },\n mutedSelectedBg: {\n dark: studioTheme.color.dark.primary.muted.primary.selected.bg,\n light: studioTheme.color.light.primary.muted.primary.selected.bg,\n },\n spotBlue: {\n dark: studioTheme.color.dark.primary.spot.blue,\n light: studioTheme.color.light.primary.spot.blue,\n },\n}\n\ntype SchemeColorKey = keyof typeof SCHEME_COLORS\n\nexport function getSchemeColor(scheme: ThemeColorSchemeKey, colorKey: SchemeColorKey): string {\n return SCHEME_COLORS[colorKey]?.[scheme]\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","/** @internal */\ninterface SanityDocument {\n _id: string\n _type: string\n _createdAt: string\n _updatedAt: string\n _rev: string\n [key: string]: unknown\n}\n\n/** @public */\nexport interface S3AssetDocument extends SanityDocument {\n _id: string\n _type: 's3FileAsset' | 's3ImageAsset' | 's3VideoAsset'\n assetId: string\n extension: string\n mimeType: string\n sha1hash: string\n size: number\n originalFilename?: string\n}\n\n/** @public */\nexport type S3FileAsset = S3AssetDocument & {_type: 's3FileAsset'}\n\n/** @public */\nexport type S3ImageAsset = S3AssetDocument & {_type: 's3ImageAsset'; metadata: S3ImageMetaData}\n\n/** @public */\nexport type S3VideoAsset = S3AssetDocument & {_type: 's3VideoAsset'; metadata: S3VideoMetaData}\n\n/** @public */\nexport type S3Asset = S3FileAsset | S3ImageAsset | S3VideoAsset\n\n/** @public */\nexport enum S3AssetType {\n FILE = 's3File',\n IMAGE = 's3Image',\n VIDEO = 's3Video',\n}\n\n/** @internal */\ninterface S3ImageDimensions {\n _type: 's3ImageDimensions'\n height: number\n width: number\n aspectRatio: number\n}\n\n/** @internal */\ninterface S3ImageMetaData {\n _type: 's3ImageMetadata'\n dimensions: S3ImageDimensions\n}\n\n/** @internal */\ninterface S3VideoDimensions {\n _type: 's3VideoDimensions'\n height: number\n width: number\n aspectRatio: number\n}\n\n/** @internal */\ninterface S3VideoMetaData {\n _type: 's3VideoMetadata'\n dimensions: S3VideoDimensions\n}\n","import {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport type {Order} from './types/browser'\n\nexport const UPLOAD_STATUS_KEY = '_upload'\nexport const STALE_UPLOAD_MS = 1000 * 60 * 2\n\nexport const SUPPORTED_ASSET_TYPES = [S3AssetType.FILE, S3AssetType.IMAGE, S3AssetType.VIDEO]\n\nexport const ORDER_OPTIONS: (Order | null)[] = [\n {\n direction: 'desc',\n field: '_createdAt',\n },\n {\n direction: 'asc',\n field: '_createdAt',\n },\n null,\n {\n direction: 'desc',\n field: '_updatedAt',\n },\n {\n direction: 'asc',\n field: '_updatedAt',\n },\n null,\n {\n direction: 'asc',\n field: 'originalFilename',\n },\n {\n direction: 'desc',\n field: 'originalFilename',\n },\n null,\n {\n direction: 'desc',\n field: 'size',\n },\n {\n direction: 'asc',\n field: 'size',\n },\n]\n","import {type FormPatch, set, unset, type UploadProgressEvent} from 'sanity'\n\nimport {UPLOAD_STATUS_KEY} from '../constants'\n\nconst UNSET_UPLOAD_PATCH = unset([UPLOAD_STATUS_KEY])\n\nexport function createUploadEvent(patches: FormPatch[] = []): UploadProgressEvent {\n return {\n type: 'uploadProgress',\n patches,\n }\n}\n\nexport const CLEANUP_EVENT = createUploadEvent([UNSET_UPLOAD_PATCH])\n\nexport const createInitialUploadPatches = (file: File) => {\n const now = new Date().toISOString()\n const value = {\n progress: 2,\n createdAt: now,\n updatedAt: now,\n file: {name: file.name, type: file.type},\n }\n\n return [set(value, [UPLOAD_STATUS_KEY])]\n}\n\nexport const createInitialUploadEvent = (file: File) => {\n return createUploadEvent(createInitialUploadPatches(file))\n}\n","// Takes a observable-returning function and returns a new function that limits on the number of\n// concurrent observables.\nimport {Observable, Subject, Subscription} from 'rxjs'\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\nconst createThrottler = <T>(concurrency: number = DEFAULT_CONCURRENCY) => {\n const currentSubscriptions: Array<Subscription> = []\n const pendingObservables: Array<Observable<T>> = []\n const ready$ = new Subject<Observable<T>>()\n\n function request(observable: Observable<T>): Observable<T> {\n return new Observable((observer) => {\n if (currentSubscriptions.length >= concurrency) {\n return scheduleAndWait$(observable).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 // We check length > 0, so shift() will not return undefined here\n ready$.next(pendingObservables.shift()!)\n }\n }\n })\n }\n\n function scheduleAndWait$(observable: Observable<T>): Observable<T> {\n pendingObservables.push(observable)\n return ready$.asObservable().pipe(\n first((obs) => obs === observable),\n mergeMap((obs) => obs), // Unwrap Observable<Observable<T>> to Observable<T>\n )\n }\n\n return request\n}\n\nexport const withMaxConcurrency = <A extends any[], R>(\n func: (...args: A) => Observable<R>,\n concurrency: number = DEFAULT_CONCURRENCY,\n): ((...args: A) => Observable<R>) => {\n const throttler = createThrottler<R>(concurrency)\n return (...args: A) => throttler(func(...args))\n}\n","import {\n Badge,\n Box,\n Flex,\n Hotkeys,\n MenuItem as UIMenuItem,\n type MenuItemProps as UIMenuItemProps,\n Stack,\n Text,\n Tooltip,\n type TooltipProps,\n} from '@sanity/ui'\nimport {\n forwardRef,\n type HTMLProps,\n isValidElement,\n type JSX,\n type ReactNode,\n type Ref,\n useMemo,\n} from 'react'\nimport {isValidElementType} from 'react-is'\nimport {styled} from 'styled-components'\n\nconst FONT_SIZE = 1\nconst SUBTITLE_FONT_SIZE = 0\n\n/* Using px value here to make title/subtitles align with icon */\nconst SubtitleText = styled(Text)`\n margin-top: 2px;\n`\n\n/** @internal */\ntype MenuItemProps = Pick<\n UIMenuItemProps,\n 'as' | 'icon' | 'iconRight' | 'pressed' | 'selected' | 'tone' | 'hotkeys'\n> & {\n badgeText?: string\n /**\n * Usage of `children` is not supported, import `MenuItem` from `@sanity/ui` instead.\n */\n children?: undefined\n /**\n * Previews should be 25x25.\n */\n preview?: ReactNode\n /**\n * Optional render callback which receives menu item content.\n */\n renderMenuItem?: (menuItemContent: JSX.Element) => ReactNode\n text?: string\n tooltipProps?: TooltipProps | null\n /**\n * Optional subtitle prop for the menu item.\n * While not recommended, it is utilized for the workspace menu button.\n */\n __unstable_subtitle?: string\n /**\n * An optional property to adjust spacing in the preview between the icon and the text.\n * Not recommended, but is applied to the workspace menu button..\n */\n __unstable_space?: number\n}\n\nconst PreviewWrapper = styled(Box)`\n height: 25px;\n width: 25px;\n overflow: hidden;\n`\n\n/**\n * Customized Sanity UI <MenuItem> that restricts usage of `children` to encourage simple,\n * single line menu items.\n *\n * The workspace menu button needed a subtitle - hence, the StudioUI MenuIten now takes a subtitle prop.\n * This is only an escape hatch for the workspace menu button and is not recommended for general use.\n *\n * It also accepts a prop to attach tooltips as well as custom badges too.\n *\n * @internal\n */\nexport const MenuItem = forwardRef(function MenuItem(\n {\n badgeText,\n children: childrenProp,\n disabled,\n hotkeys,\n icon: Icon,\n iconRight: IconRight,\n preview = null,\n renderMenuItem,\n text,\n tooltipProps,\n __unstable_subtitle,\n __unstable_space,\n ...rest\n }: MenuItemProps &\n Omit<HTMLProps<HTMLDivElement>, 'as' | 'height' | 'ref' | 'selected' | 'tabIndex' | 'size'>,\n ref: Ref<HTMLDivElement>,\n) {\n const menuItemContent = useMemo(() => {\n return (\n <Flex align=\"center\" gap={2}>\n {preview && (\n <PreviewWrapper\n style={{opacity: disabled ? 0.25 : undefined}}\n paddingRight={__unstable_space ? 1 : 0}\n >\n <Flex align=\"center\" height=\"fill\" justify=\"center\">\n {preview}\n </Flex>\n </PreviewWrapper>\n )}\n {Icon && (\n <Box paddingRight={1}>\n <Text size={FONT_SIZE}>\n {isValidElement(Icon) && Icon}\n {isValidElementType(Icon) && <Icon />}\n </Text>\n </Box>\n )}\n {text && (\n <Stack flex={1} space={__unstable_subtitle ? 1 : 2}>\n <Text size={FONT_SIZE} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n {__unstable_subtitle && (\n <SubtitleText size={SUBTITLE_FONT_SIZE} textOverflow=\"ellipsis\" weight=\"medium\" muted>\n {__unstable_subtitle}\n </SubtitleText>\n )}\n </Stack>\n )}\n {(badgeText || hotkeys || IconRight) && (\n <Flex align=\"center\" gap={3} marginLeft={3}>\n {hotkeys && <Hotkeys keys={hotkeys} style={{marginTop: -4, marginBottom: -4}} />}\n\n {badgeText && (\n <Badge fontSize={0} style={{marginTop: -4, marginBottom: -4}}>\n {badgeText}\n </Badge>\n )}\n\n {IconRight && (\n <Text size={FONT_SIZE}>\n {isValidElement(IconRight) && IconRight}\n {isValidElementType(IconRight) && <IconRight />}\n </Text>\n )}\n </Flex>\n )}\n </Flex>\n )\n }, [\n preview,\n disabled,\n __unstable_space,\n Icon,\n text,\n __unstable_subtitle,\n badgeText,\n hotkeys,\n IconRight,\n ])\n\n const children = (\n <UIMenuItem\n disabled={disabled}\n paddingLeft={preview ? 1 : 3}\n paddingRight={3}\n paddingY={preview ? 1 : 3}\n ref={ref}\n {...rest}\n >\n {typeof childrenProp === 'undefined' && typeof renderMenuItem === 'function'\n ? renderMenuItem(menuItemContent)\n : menuItemContent}\n </UIMenuItem>\n )\n\n if (tooltipProps) {\n return (\n <Tooltip content={tooltipProps?.content} portal {...tooltipProps}>\n {/* This div is needed to make the tooltip work in disabled menu items */}\n <div>{children}</div>\n </Tooltip>\n )\n }\n\n return children\n})\n","import {\n Button as UIButton,\n type ButtonProps as UIButtonProps,\n Tooltip,\n type TooltipProps,\n} from '@sanity/ui'\nimport {type ForwardedRef, forwardRef, type HTMLProps} from 'react'\nimport {styled} from 'styled-components'\n\ntype BaseButtonProps = Pick<\n UIButtonProps,\n | 'as'\n | 'icon'\n | 'iconRight'\n | 'justify'\n | 'loading'\n | 'mode'\n | 'paddingY'\n | 'paddingLeft'\n | 'selected'\n | 'tone'\n | 'type'\n | 'width'\n> & {\n size?: 'default' | 'large'\n radius?: 'full'\n}\n\ntype ButtonWithText = {\n text: string\n tooltipProps?: TooltipProps | null\n icon?: UIButtonProps['icon']\n}\n\ntype IconButton = {\n text?: undefined\n icon?: UIButtonProps['icon']\n /**\n * When using a button with an icon, tooltipProps are required to enforce consistency in UI.\n */\n tooltipProps: TooltipProps | null\n}\n\n/** @internal */\nexport type ButtonProps = BaseButtonProps & (ButtonWithText | IconButton)\n\nconst LARGE_BUTTON_PROPS = {\n space: 3,\n padding: 3,\n}\nconst DEFAULT_BUTTON_PROPS = {\n space: 2,\n padding: 2,\n}\n\nconst TooltipButtonWrapper = styled.span`\n display: inline-flex;\n`\n\nexport const Button = forwardRef(function Button(\n {\n size = 'default',\n mode = 'default',\n paddingY,\n paddingLeft,\n tone = 'default',\n tooltipProps,\n ...rest\n }: ButtonProps & Omit<HTMLProps<HTMLButtonElement>, 'as' | 'size' | 'title'>,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const sizeProps = size === 'default' ? DEFAULT_BUTTON_PROPS : LARGE_BUTTON_PROPS\n\n const children = (\n <UIButton\n {...rest}\n {...sizeProps}\n paddingY={paddingY}\n paddingLeft={paddingLeft}\n ref={ref}\n mode={mode}\n tone={tone}\n />\n )\n\n if (tooltipProps) {\n return (\n <Tooltip content={tooltipProps?.content} portal {...tooltipProps}>\n {/* This span is needed to make the tooltip work in disabled buttons */}\n <TooltipButtonWrapper>{children}</TooltipButtonWrapper>\n </Tooltip>\n )\n }\n\n return children\n})\n","import {\n Box,\n type BoxHeight,\n Button as UIButton,\n Dialog as UIDialog,\n type DialogProps as UIDialogProps,\n Flex,\n Text,\n} from '@sanity/ui'\nimport {type ComponentProps, forwardRef, type HTMLProps, type ReactNode, type Ref} from 'react'\nimport {useTranslation} from 'sanity'\n\ntype DialogProps = Pick<\n UIDialogProps,\n | '__unstable_autoFocus'\n | '__unstable_hideCloseButton'\n | 'animate'\n | 'contentRef'\n | 'header'\n | 'id'\n | 'onActivate'\n | 'onClickOutside'\n | 'onClose'\n | 'portal'\n | 'position'\n | 'scheme'\n | 'width'\n> & {\n /**\n * Dialog body height.\n * Set this to 'fill' (i.e. 100%) if you want overflow body content to be contained\n * and not trigger dynamic border visibility.\n */\n bodyHeight?: BoxHeight\n children?: ReactNode\n zOffset?: number\n footer?: {\n cancelButton?: Omit<ComponentProps<typeof UIButton>, 'fontSize' | 'padding'>\n confirmButton?: Omit<ComponentProps<typeof UIButton>, 'fontSize' | 'padding'>\n /**\n * Description to be displayed side by side with the buttons.\n */\n description?: string\n }\n /**\n * If enabled, removes all default padding from dialog content.\n */\n padding?: boolean\n}\n\n/**\n * Customized Sanity UI <Dialog> that enforces an opinionated footer layout with a max of two buttons (confirm and cancel).\n *\n * @internal\n */\nexport const Dialog = forwardRef(function Dialog(\n {\n animate = true,\n bodyHeight,\n children,\n footer,\n padding = true,\n zOffset,\n ...props\n }: DialogProps & Pick<HTMLProps<HTMLDivElement>, 'onDragEnter' | 'onDrop'>,\n ref: Ref<HTMLDivElement>,\n) {\n const {t} = useTranslation()\n\n return (\n <UIDialog\n {...props}\n animate={animate}\n zOffset={zOffset}\n ref={ref}\n footer={\n (footer?.confirmButton || footer?.cancelButton) && (\n <Flex width=\"full\" gap={3} justify=\"flex-end\" padding={3} align=\"center\">\n {footer?.description && (\n <Box flex={1} paddingLeft={1}>\n <Text size={1} muted>\n {footer.description}\n </Text>\n </Box>\n )}\n {props.onClose && (\n <UIButton\n mode=\"bleed\"\n padding={2}\n text={t('common.dialog.cancel-button.text')}\n tone=\"default\"\n onClick={props.onClose}\n data-testid=\"cancel-button\"\n {...footer.cancelButton}\n />\n )}\n {footer.confirmButton && (\n <UIButton\n mode=\"default\"\n padding={2}\n text={t('common.dialog.confirm-button.text')}\n tone=\"critical\"\n data-testid=\"confirm-button\"\n {...footer.confirmButton}\n />\n )}\n </Flex>\n )\n }\n >\n <Box height={bodyHeight} padding={padding ? 4 : 0}>\n {children}\n </Box>\n </UIDialog>\n )\n})\n","import {type ChangeEvent, type FC, type HTMLProps, useCallback, useId} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {Button, type ButtonProps} from '../UI'\n\ntype FileInputButtonProps = ButtonProps & {\n accept?: string\n capture?: 'user' | 'environment'\n multiple?: boolean\n onSelect?: (files: File[]) => void\n disabled?: boolean\n}\n\nconst FileButton = styled(Button).attrs({forwardedAs: 'label'})(\n () => css`\n // The underlying file input is rendered as children within a Sanity UI <Button> component.\n // The below visibly hides it by targeting the input's parent <span> element, which is\n // added by the <Button> component.\n // TODO: refactor, avoid nth-child selector usage\n & > span:nth-child(2) {\n overflow: hidden;\n overflow: clip;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n min-width: 0;\n display: block;\n appearance: none;\n padding: 0;\n margin: 0;\n border: 0;\n opacity: 0;\n }\n `,\n)\n\nexport const FileInputButton: FC<\n FileInputButtonProps &\n Omit<HTMLProps<HTMLButtonElement>, 'as' | 'ref' | 'type' | 'value' | 'onSelect'>\n> = (props) => {\n const {icon, id: idProp, accept, capture, multiple, onSelect, text, disabled, ...rest} = props\n const id = `${idProp || ''}-${useId()}`\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (onSelect && event.target.files) {\n onSelect(Array.from(event.target.files))\n }\n },\n [onSelect],\n )\n\n return (\n <FileButton\n {...rest}\n space={2}\n padding={2}\n icon={icon}\n text={text}\n htmlFor={id}\n disabled={disabled}\n >\n <input\n accept={accept}\n capture={capture}\n id={id}\n multiple={multiple}\n onChange={handleChange}\n type=\"file\"\n value=\"\"\n disabled={disabled}\n />\n </FileButton>\n )\n}\n","import {type MenuItemProps} from '@sanity/ui'\nimport React, {type ChangeEvent, type FC, type HTMLProps, useCallback, useId} from 'react'\nimport {styled} from 'styled-components'\n\nimport {MenuItem} from '../UI'\n\nconst FileMenuItem = styled(MenuItem)`\n position: relative;\n\n & input {\n overflow: hidden;\n overflow: clip;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n min-width: 0;\n display: block;\n appearance: none;\n padding: 0;\n margin: 0;\n border: 0;\n opacity: 0;\n }\n`\n\ntype FileInputMenuItemProps = Omit<MenuItemProps, 'onSelect'> & {\n accept?: string\n capture?: 'user' | 'environment'\n multiple?: boolean\n onSelect?: (files: File[]) => void\n disabled?: boolean\n}\n\nexport const FileInputMenuItem: FC<\n FileInputMenuItemProps &\n Omit<HTMLProps<HTMLButtonElement>, 'as' | 'ref' | 'type' | 'value' | 'onSelect'>\n> = (props) => {\n const {icon, id: idProp, accept, capture, multiple, onSelect, text, disabled, ...rest} = props\n\n const id = `${idProp || ''}-${useId()}`\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (onSelect && event.target.files) {\n onSelect(Array.from(event.target.files))\n }\n },\n [onSelect],\n )\n\n const renderMenuItem = useCallback(\n (item: React.JSX.Element) => (\n <div>\n {item}\n {/* Visibly hidden input */}\n <input\n accept={accept}\n capture={capture}\n id={id}\n multiple={multiple}\n onChange={handleChange}\n type=\"file\"\n value=\"\"\n disabled={disabled}\n />\n </div>\n ),\n [accept, capture, disabled, handleChange, id, multiple],\n )\n\n return (\n <FileMenuItem\n {...rest}\n htmlFor={id}\n disabled={disabled}\n icon={icon}\n text={text}\n renderMenuItem={renderMenuItem}\n />\n )\n}\n","import {createContext, type FC, type PropsWithChildren, useContext} from 'react'\n\ntype ContextProps = {\n open: () => void\n}\n\ntype DropzoneDispatchProviderProps = {\n open: () => void\n}\n\nconst DropzoneDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const DropzoneDispatchProvider: FC<PropsWithChildren<DropzoneDispatchProviderProps>> = (\n props,\n) => {\n const {children, open} = props\n\n const contextValue: ContextProps = {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 {createContext, type FC, type PropsWithChildren, useContext} from 'react'\n\nimport type {S3AssetSourceComponentProps} from '../types'\n\ntype ContextProps = {\n onSelect?: S3AssetSourceComponentProps['onSelect']\n}\n\ntype AssetBrowserDispatchProviderProps = {\n onSelect?: S3AssetSourceComponentProps['onSelect']\n}\n\nconst AssetSourceDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const AssetBrowserDispatchProvider: FC<\n PropsWithChildren<AssetBrowserDispatchProviderProps>\n> = (props) => {\n const {children, onSelect} = props\n\n const contextValue: ContextProps = {\n 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 {S3AssetType} from 'sanity-plugin-s3-media-types'\n\n/**\n * @internal\n */\nexport const s3FileAssetIdPattern = /^s3File-([a-zA-Z0-9_-]+)-([a-z0-9]+)$/\n\n/**\n * @internal\n */\nexport const s3ImageAssetIdPattern = /^s3Image-([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)-([a-z0-9]+)$/\n\n/**\n * @internal\n */\nexport const s3VideoAssetIdPattern = /^s3Video-([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)-([a-z0-9]+)$/\n\n/**\n * @internal\n */\nexport const s3FileAssetFilenamePattern = /^([a-zA-Z0-9_-]+)\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3ImageAssetFilenamePattern = /^([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3VideoAssetFilenamePattern = /^([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3AssetFilenamePattern = /^([a-zA-Z0-9_-]+)(?:-(\\d+)x(\\d+))?\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3AssetIdPattern = new RegExp(\n `^(?:` +\n `${S3AssetType.IMAGE}-[a-zA-Z0-9_-]+-\\\\d+x\\\\d+-[a-z0-9]+` +\n `|` +\n `${S3AssetType.VIDEO}-[a-zA-Z0-9_-]+-\\\\d+x\\\\d+-[a-z0-9]+` +\n `|` +\n `${S3AssetType.FILE}-[a-zA-Z0-9_-]+-[a-z0-9]+` +\n `)$`,\n)\n\n/**\n * @internal\n */\nexport const s3InProgressAssetId = 'upload-in-progress-placeholder'\n\n/**\n * @internal\n */\nexport const s3InProgressAssetExtension = 'tmp'\n\n/**\n * @internal\n */\nexport const s3VideoExtensions = new Set([\n 'mp4',\n 'webm',\n 'mov',\n 'm4v',\n 'avi',\n 'mkv',\n 'wmv',\n 'flv',\n 'mpeg',\n 'mpg',\n '3gp',\n 'ogv',\n])\n","/**\n * Error type thrown when the library fails to resolve a value, such as an asset ID,\n * filename or project ID/dataset information.\n *\n * The `input` property holds the value passed as the input, which failed to be\n * resolved to something meaningful.\n *\n * @public\n */\nexport class UnresolvableError extends Error {\n unresolvable = true\n\n // The input may not be a valid source, so let's not type it as one\n input?: unknown\n\n constructor(inputSource: unknown, message = 'Failed to resolve asset ID from source') {\n super(message)\n this.input = inputSource\n }\n}\n\n/**\n * Checks whether or not an error instance is of type UnresolvableError\n *\n * @param err - Error to check for unresolvable error type\n * @returns True if the passed error instance appears to be an unresolvable error\n * @public\n */\nexport function isUnresolvableError(err: unknown): err is UnresolvableError {\n const error = err as UnresolvableError\n return Boolean(error.unresolvable && 'input' in error)\n}\n","import {isUnresolvableError} from './errors'\nimport type {SafeFunction} from './types'\n\n/**\n * Returns a getter which returns `undefined` instead of throwing,\n * if encountering an `UnresolvableError`\n *\n * @param method - Function to use as resolver\n * @returns Function that returns `undefined` if passed resolver throws UnresolvableError\n * @internal\n */\nexport function getForgivingResolver<Args extends unknown[], Return>(\n method: (...args: Args) => Return,\n): SafeFunction<Args, Return> {\n return (...args: Args): Return | undefined => {\n try {\n return method(...args)\n } catch (err) {\n if (isUnresolvableError(err)) {\n return undefined\n }\n\n throw err\n }\n }\n}\n\n/**\n * Checks whether or not the passed object is an object (and not `null`)\n *\n * @param obj Item to check whether or not is an object\n * @returns Whether or not `obj` is an object\n * @internal\n */\nexport function isObject(obj: unknown): obj is object {\n return obj !== null && !Array.isArray(obj) && typeof obj === 'object'\n}\n","import type {S3Asset, S3FileAsset, S3ImageAsset, S3VideoAsset} from 'sanity-plugin-s3-media-types'\n\nimport {s3FileAssetIdPattern, s3ImageAssetIdPattern, s3VideoAssetIdPattern} from './constants'\nimport type {\n Reference,\n S3AssetObjectStub,\n S3FileUploadStub,\n S3ImageUploadStub,\n S3VideoUploadStub,\n} from './types'\nimport {isObject} from './utils'\n\n/**\n * Checks whether or not the given source is a reference object\n * (an object containing _ref string key)\n *\n * @param ref - Possible reference\n * @returns Whether or not the passed object is a reference\n * @public\n */\nexport function isReference(ref: unknown): ref is Reference {\n return isObject(ref) && typeof (ref as Reference)._ref === 'string'\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 file asset document ID\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 file asset document ID\n * @public\n */\nexport function isS3FileAssetId(documentId: string): boolean {\n return s3FileAssetIdPattern.test(documentId)\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 image asset document ID\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 image asset document ID\n * @public\n */\nexport function isS3ImageAssetId(documentId: string): boolean {\n return s3ImageAssetIdPattern.test(documentId)\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 video asset document ID\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 video asset document ID\n * @public\n */\nexport function isS3VideoAssetId(documentId: string): boolean {\n return s3VideoAssetIdPattern.test(documentId)\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 asset document ID (file/image/video)\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 asset document ID\n * @public\n */\nexport function isS3AssetId(documentId: string): boolean {\n return isS3FileAssetId(documentId) || isS3ImageAssetId(documentId) || isS3VideoAssetId(documentId)\n}\n\n/**\n * Checks whether or not the given source is an asset object stub\n *\n * @param stub - Possible asset object stub\n * @returns Whether or not the passed object is an object stub\n * @public\n */\nexport function isS3AssetObjectStub(stub: unknown): stub is S3AssetObjectStub {\n const item = stub as S3AssetObjectStub\n return isObject(item) && Boolean(item.asset) && typeof item.asset === 'object'\n}\n\n/**\n * Checks whether or not the given source is an in-progress upload\n * (has upload property but no asset property)\n *\n * @param stub - Possible in-progress upload\n * @returns Whether or not the passed object is an in-progress upload\n * @public\n */\nexport function isInProgressUpload(\n stub: unknown,\n): stub is S3ImageUploadStub | S3FileUploadStub | S3VideoUploadStub {\n const item = stub as S3ImageUploadStub | S3FileUploadStub | S3VideoUploadStub\n return isObject(item) && Boolean(item._upload) && !('asset' in item)\n}\n\n/**\n * Return whether or not the passed asset document is an s3 file asset\n *\n * @param asset - Asset document to check\n * @returns Whether or not the given asset is an s3 file asset\n * @public\n */\nexport function isS3FileAsset(asset: S3Asset): asset is S3FileAsset {\n return (asset as S3FileAsset)._type === 's3FileAsset'\n}\n\n/**\n * Return whether or not the passed asset document is an s3 image asset\n *\n * @param asset - Asset document to check\n * @returns Whether or not the given asset is an s3 image asset\n * @public\n */\nexport function isS3ImageAsset(asset: S3Asset): asset is S3ImageAsset {\n return (asset as S3ImageAsset)._type === 's3ImageAsset'\n}\n\n/**\n * Return whether or not the passed asset document is an s3 video asset\n *\n * @param asset - Asset document to check\n * @returns Whether or not the given asset is an s3 video asset\n * @public\n */\nexport function isS3VideoAsset(asset: S3Asset): asset is S3VideoAsset {\n return (asset as S3VideoAsset)._type === 's3VideoAsset'\n}\n","import {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {\n s3AssetFilenamePattern,\n s3FileAssetFilenamePattern,\n s3FileAssetIdPattern,\n s3ImageAssetFilenamePattern,\n s3ImageAssetIdPattern,\n s3VideoAssetFilenamePattern,\n s3VideoAssetIdPattern,\n s3VideoExtensions,\n} from './constants'\nimport type {S3FileAssetIdParts, S3ImageAssetIdParts, S3UrlType, S3VideoAssetIdParts} from './types'\n\n/**\n * @public\n */\nexport type S3AssetIdParts = S3FileAssetIdParts | S3ImageAssetIdParts | S3VideoAssetIdParts\n\nfunction getFilename(input: string): string {\n if (!input) {\n return ''\n }\n\n let raw = input\n\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(raw)) {\n try {\n raw = new URL(raw).pathname\n } catch {\n // Fall back to raw string handling below.\n }\n }\n\n const [withoutQuery = ''] = raw.split('?')\n const [withoutHash = ''] = withoutQuery.split('#')\n const normalized = withoutHash.replace(/^\\/+/, '')\n const parts = normalized.split('/').filter(Boolean)\n\n return parts[parts.length - 1] ?? ''\n}\n\n/**\n * Parses an S3 file asset document ID into individual parts (type, id, extension)\n *\n * @param documentId - File asset document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID invalid\n */\nexport function parseS3FileAssetId(documentId: string): S3FileAssetIdParts {\n const match = s3FileAssetIdPattern.exec(documentId)\n\n if (!match) {\n throw new Error(`Malformed file asset ID '${documentId}'.`)\n }\n\n const [, assetId, extension] = match\n return {type: S3AssetType.FILE, assetId, extension}\n}\n\n/**\n * Parses an S3 image asset document ID into individual parts (type, id, extension, width, height)\n *\n * @param documentId - Image asset document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID invalid\n */\nexport function parseS3ImageAssetId(documentId: string): S3ImageAssetIdParts {\n const match = s3ImageAssetIdPattern.exec(documentId)\n\n if (!match) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n const [, assetId, widthString, heightString, extension] = match\n const width = Number(widthString)\n const height = Number(heightString)\n\n if (!(width > 0) || !(height > 0)) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n return {type: S3AssetType.IMAGE, assetId, width, height, extension}\n}\n\n/**\n * Parses an S3 video asset document ID into individual parts (type, id, extension, width, height)\n *\n * @param documentId - Video asset document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID invalid\n */\nexport function parseS3VideoAssetId(documentId: string): S3VideoAssetIdParts {\n const match = s3VideoAssetIdPattern.exec(documentId)\n\n if (!match) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n const [, assetId, widthString, heightString, extension] = match\n const width = Number(widthString)\n const height = Number(heightString)\n\n if (!(width > 0) || !(height > 0)) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n return {type: S3AssetType.VIDEO, assetId, width, height, extension}\n}\n\n/**\n * Parses an S3 asset document ID into individual parts.\n *\n * @param documentId - Document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID is invalid\n */\nexport function parseS3AssetId(documentId: string): S3AssetIdParts {\n if (documentId.startsWith(`${S3AssetType.FILE}-`)) {\n return parseS3FileAssetId(documentId)\n }\n\n if (documentId.startsWith(`${S3AssetType.IMAGE}-`)) {\n return parseS3ImageAssetId(documentId)\n }\n\n if (documentId.startsWith(`${S3AssetType.VIDEO}-`)) {\n return parseS3VideoAssetId(documentId)\n }\n\n throw new Error(`Invalid S3 asset ID '${documentId}'.`)\n}\n\n/**\n * Parses an S3 file asset filename into individual parts (type, id, extension)\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If file name is invalid\n */\nexport function parseS3FileAssetFilename(filename: string): S3FileAssetIdParts {\n const file = getFilename(filename)\n const match = s3FileAssetFilenamePattern.exec(file)\n\n if (!match || s3ImageAssetFilenamePattern.test(file)) {\n throw new Error(`Malformed file asset filename '${filename}'.`)\n }\n\n const [, assetId, extension] = match\n return parseS3FileAssetId(`${S3AssetType.FILE}-${assetId}-${extension.toLowerCase()}`)\n}\n\n/**\n * Parses an S3 image asset filename into individual parts (type, id, extension, width, height)\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If image file name is invalid\n */\nexport function parseS3ImageAssetFilename(filename: string): S3ImageAssetIdParts {\n const file = getFilename(filename)\n const match = s3ImageAssetFilenamePattern.exec(file)\n\n if (!match) {\n throw new Error(`Malformed image asset filename '${filename}'.`)\n }\n\n const [, assetId, width, height, extension] = match\n return parseS3ImageAssetId(\n `${S3AssetType.IMAGE}-${assetId}-${width}x${height}-${extension.toLowerCase()}`,\n )\n}\n\n/**\n * Parses an S3 video asset filename into individual parts (type, id, extension, width, height)\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If video file name is invalid\n */\nexport function parseS3VideoAssetFilename(filename: string): S3VideoAssetIdParts {\n const file = getFilename(filename)\n const match = s3VideoAssetFilenamePattern.exec(file)\n\n if (!match) {\n throw new Error(`Malformed video asset filename '${filename}'.`)\n }\n\n const [, assetId, width, height, extension] = match\n return parseS3VideoAssetId(\n `${S3AssetType.VIDEO}-${assetId}-${width}x${height}-${extension.toLowerCase()}`,\n )\n}\n\n/**\n * Parses an S3 asset filename into individual parts.\n *\n * Note: image/video filenames share the same shape, so this function determines\n * image vs video using extension heuristics.\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If file name is invalid\n */\nexport function parseS3AssetFilename(filename: string): S3AssetIdParts {\n const file = getFilename(filename)\n\n if (!s3AssetFilenamePattern.test(file)) {\n throw new Error(`Malformed asset filename '${filename}'.`)\n }\n\n const match = s3ImageAssetFilenamePattern.exec(file)\n if (match) {\n const extension = match[4].toLowerCase()\n\n if (s3VideoExtensions.has(extension)) {\n return parseS3VideoAssetFilename(file)\n }\n\n return parseS3ImageAssetFilename(file)\n }\n\n return parseS3FileAssetFilename(file)\n}\n\n/**\n * Parses a full S3 asset URL into individual parts.\n *\n * @param url - Full URL to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If URL is invalid\n */\nexport function parseS3AssetUrl(url: string): S3AssetIdParts {\n return parseS3AssetFilename(getFilename(url))\n}\n\n/**\n * Validates that a given URL is an S3 asset URL, and returns the asset type if valid.\n *\n * @param url - URL to extract asset type from\n * @returns Asset type if valid URL, false otherwise\n * @public\n */\nexport function getS3AssetUrlType(url: string): S3UrlType | false {\n try {\n const parsed = parseS3AssetUrl(url)\n\n if (parsed.type === S3AssetType.FILE) {\n return 'file'\n }\n\n if (parsed.type === S3AssetType.VIDEO) {\n return 'video'\n }\n\n return 'image'\n } catch {\n return false\n }\n}\n","import {s3AssetFilenamePattern} from './constants'\nimport {UnresolvableError} from './errors'\nimport {parseS3FileAssetId, parseS3ImageAssetId, parseS3VideoAssetId} from './parse'\nimport {getForgivingResolver} from './utils'\n\n/**\n * @public\n */\nexport interface S3UrlBuilderOptions {\n baseUrl: string\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(value)\n}\n\n/**\n * Builds the base file path from the minimal set of parts required to assemble it\n *\n * @param documentId - File asset document ID to build path from\n * @returns The path to the file\n * @public\n */\nexport function buildS3FilePath(documentId: string): string {\n const {assetId, extension} = parseS3FileAssetId(documentId)\n return `${assetId}.${extension}`\n}\n\n/**\n * Builds the base file URL from the minimal set of parts required to assemble it\n *\n * @param documentId - File asset document ID to build URL from\n * @param options - Base URL configuration\n * @returns The URL to the file, as a string\n * @public\n */\nexport function buildS3FileUrl(documentId: string, options: S3UrlBuilderOptions): string {\n return `${options.baseUrl}/${buildS3FilePath(documentId)}`\n}\n\n/**\n * Builds the base image path from the minimal set of parts required to assemble it\n *\n * @param documentId - Image asset document ID to build path from\n * @returns The path to the image\n * @public\n */\nexport function buildS3ImagePath(documentId: string): string {\n const {assetId, width, height, extension} = parseS3ImageAssetId(documentId)\n return `${assetId}-${width}x${height}.${extension}`\n}\n\n/**\n * Builds the base image URL from the minimal set of parts required to assemble it\n *\n * @param documentId - Image asset document ID to build URL from\n * @param options - Base URL configuration\n * @returns The URL to the image, as a string\n * @public\n */\nexport function buildS3ImageUrl(documentId: string, options: S3UrlBuilderOptions): string {\n return `${options.baseUrl}/${buildS3ImagePath(documentId)}`\n}\n\n/**\n * Builds the base video path from the minimal set of parts required to assemble it\n *\n * @param documentId - Video asset document ID to build path from\n * @returns The path to the video\n * @public\n */\nexport function buildS3VideoPath(documentId: string): string {\n const {assetId, width, height, extension} = parseS3VideoAssetId(documentId)\n return `${assetId}-${width}x${height}.${extension}`\n}\n\n/**\n * Builds the base video URL from the minimal set of parts required to assemble it\n *\n * @param documentId - Video asset document ID to build URL from\n * @param options - Base URL configuration\n * @returns The URL to the video, as a string\n * @public\n */\nexport function buildS3VideoUrl(documentId: string, options: S3UrlBuilderOptions): string {\n return `${options.baseUrl}/${buildS3VideoPath(documentId)}`\n}\n\n/**\n * Checks whether or not a given filename matches the expected S3 asset filename pattern\n *\n * @param filename - Filename to check for validity\n * @returns Whether or not the specified filename is valid\n * @public\n */\nexport function isValidS3Filename(filename: string): boolean {\n if (!filename || filename.includes('/')) {\n return false\n }\n\n return s3AssetFilenamePattern.test(filename)\n}\n\n/**\n * Strips query params/hash and returns the path portion from a URL or raw path.\n *\n * @param urlOrPath - URL or path to extract from\n * @returns Normalized path without leading slash\n * @public\n * @throws If URL/path could not be resolved\n */\nexport function getS3UrlPath(urlOrPath: string): string {\n if (typeof urlOrPath !== 'string' || !urlOrPath.trim()) {\n throw new UnresolvableError(urlOrPath, 'Failed to resolve path from URL/path')\n }\n\n if (isAbsoluteUrl(urlOrPath)) {\n const pathname = new URL(urlOrPath).pathname.replace(/^\\/+/, '')\n\n if (!pathname) {\n throw new UnresolvableError(urlOrPath, 'Failed to resolve path from URL/path')\n }\n\n return pathname\n }\n\n const normalized =\n urlOrPath.split('?')[0]?.split('#')[0]?.replace(/^\\/+/, '') || urlOrPath.replace(/^\\/+/, '')\n\n if (!normalized) {\n throw new UnresolvableError(urlOrPath, 'Failed to resolve path from URL/path')\n }\n\n return normalized\n}\n\n/**\n * {@inheritDoc getS3UrlPath}\n * @returns Returns `undefined` instead of throwing if a value cannot be resolved\n * @public\n */\nexport const tryGetS3UrlPath = getForgivingResolver(getS3UrlPath)\n\n/**\n * Returns the last path segment (asset filename) from a URL or path.\n *\n * @param urlOrPath - URL or path to parse\n * @returns The filename portion\n * @public\n * @throws If URL/path could not be resolved to an asset filename\n */\nexport function getS3UrlFilename(urlOrPath: string): string {\n const path = getS3UrlPath(urlOrPath)\n const parts = path.split('/').filter(Boolean)\n const filename = parts[parts.length - 1]\n\n if (!isValidS3Filename(filename)) {\n throw new UnresolvableError(\n urlOrPath,\n `Failed to resolve filename from URL/path '${urlOrPath}'`,\n )\n }\n\n return filename\n}\n\n/**\n * {@inheritDoc getS3UrlFilename}\n * @returns Returns `undefined` instead of throwing if a value cannot be resolved\n * @public\n */\nexport const tryGetS3UrlFilename = getForgivingResolver(getS3UrlFilename)\n","/* eslint-disable max-params */\nimport {Observable, of} from 'rxjs'\nimport {catchError, map, mergeMap} from 'rxjs/operators'\nimport {type SanityClient, type UploadOptions} from 'sanity'\nimport {\n type S3Asset,\n type S3AssetDocument,\n S3AssetType,\n type S3FileAsset,\n type S3ImageAsset,\n type S3VideoAsset,\n} from 'sanity-plugin-s3-media-types'\n\nimport {type UploadCompleteEvent, type UploadEvent} from '../../types'\nimport {hashFile, withMaxConcurrency} from '../../utils'\nimport type {S3Client} from '../S3Client'\n\nconst MAX_CONCURRENT_UPLOADS = 4\n\ninterface ImageDimensions {\n width: number\n height: number\n}\n\ninterface UploadAssetParams {\n sanityClient: SanityClient\n s3Client: S3Client\n assetType: S3AssetType\n file: File\n options?: UploadOptions\n}\n\nconst fetchExistingAsset = (\n client: SanityClient,\n assetType: S3AssetType,\n id: string,\n): Observable<S3ImageAsset | S3FileAsset | S3VideoAsset | null> =>\n client.observable.fetch(\n '*[_type == $documentType && _id == $id][0]',\n {documentType: `${assetType}Asset`, id},\n {tag: 's3Asset.find-duplicate'},\n )\n\nconst getImageDimensions = (file: File): Observable<ImageDimensions | null> => {\n if (!file.type.startsWith('image/')) {\n return of(null)\n }\n\n return new Observable<ImageDimensions>((subscriber) => {\n const img = new Image()\n const url = URL.createObjectURL(file)\n\n const cleanup = () => URL.revokeObjectURL(url)\n\n img.onload = () => {\n subscriber.next({width: img.width, height: img.height})\n subscriber.complete()\n cleanup()\n }\n\n img.onerror = () => {\n subscriber.error(new Error('Failed to load image'))\n cleanup()\n }\n\n img.src = url\n }).pipe(catchError(() => of(null)))\n}\n\nconst getVideoDimensions = (file: File): Observable<ImageDimensions | null> => {\n if (!file.type.startsWith('video/')) {\n return of(null)\n }\n\n return new Observable<ImageDimensions>((subscriber) => {\n const video = document.createElement('video')\n const url = URL.createObjectURL(file)\n\n const cleanup = () => {\n URL.revokeObjectURL(url)\n video.removeAttribute('src')\n video.load()\n }\n\n video.onloadedmetadata = () => {\n subscriber.next({width: video.videoWidth, height: video.videoHeight})\n subscriber.complete()\n cleanup()\n }\n\n video.onerror = () => {\n subscriber.error(new Error('Failed to load video metadata'))\n cleanup()\n }\n\n video.preload = 'metadata'\n video.src = url\n }).pipe(catchError(() => of(null)))\n}\n\nconst getFileExtension = (filename: string): string => {\n const segments = filename.split('.')\n return segments[segments.length - 1]\n}\n\nconst buildFileName = (\n fileId: string,\n extension: string,\n dimensions: ImageDimensions | null,\n): string =>\n dimensions\n ? `${fileId}-${dimensions.width}x${dimensions.height}.${extension}`\n : `${fileId}.${extension}`\n\nconst buildDocumentId = (\n assetType: S3AssetType,\n fileId: string,\n extension: string,\n dimensions: ImageDimensions | null,\n): string =>\n assetType === S3AssetType.IMAGE && dimensions\n ? `${S3AssetType.IMAGE}-${fileId}-${dimensions.width}x${dimensions.height}-${extension}`\n : assetType === S3AssetType.VIDEO && dimensions\n ? `${S3AssetType.VIDEO}-${fileId}-${dimensions.width}x${dimensions.height}-${extension}`\n : `${S3AssetType.FILE}-${fileId}-${extension}`\n\nconst buildAssetDocument = (\n assetType: S3AssetType,\n fileId: string,\n file: File,\n documentId: string,\n hash: string | undefined,\n dimensions: ImageDimensions | null,\n storeOriginalFilename: boolean,\n): S3Asset => {\n const baseDocument = {\n _id: documentId,\n _type:\n assetType === S3AssetType.IMAGE\n ? 's3ImageAsset'\n : assetType === S3AssetType.VIDEO\n ? 's3VideoAsset'\n : 's3FileAsset',\n assetId: fileId,\n originalFilename: storeOriginalFilename ? file.name : undefined,\n sha1hash: hash,\n extension: getFileExtension(file.name),\n mimeType: file.type,\n size: file.size,\n } as S3Asset\n\n if (assetType === S3AssetType.IMAGE && dimensions) {\n return {\n ...baseDocument,\n _type: 's3ImageAsset',\n metadata: {\n _type: 's3ImageMetadata',\n dimensions: {\n _type: 's3ImageDimensions',\n height: dimensions.height,\n width: dimensions.width,\n aspectRatio: dimensions.width / dimensions.height,\n },\n },\n }\n }\n\n if (assetType === S3AssetType.VIDEO && dimensions) {\n return {\n ...baseDocument,\n _type: 's3VideoAsset',\n metadata: {\n _type: 's3VideoMetadata',\n dimensions: {\n _type: 's3VideoDimensions',\n height: dimensions.height,\n width: dimensions.width,\n aspectRatio: dimensions.width / dimensions.height,\n },\n },\n }\n }\n\n return baseDocument\n}\n\nconst createCompleteEvent = ({\n asset,\n exists,\n}: {\n asset: S3AssetDocument\n exists?: boolean\n}): UploadCompleteEvent => ({\n type: 'complete',\n id: asset._id,\n asset,\n exists,\n})\n\n// Main Upload Function\nconst uploadAsset = ({\n file,\n assetType,\n s3Client,\n sanityClient,\n options = {},\n}: UploadAssetParams): Observable<UploadEvent> => {\n const {storeOriginalFilename = true} = options\n const extension = getFileExtension(file.name)\n\n return hashFile(file).pipe(\n mergeMap((hash) => {\n const dimensions$ =\n assetType === S3AssetType.IMAGE\n ? getImageDimensions(file)\n : assetType === S3AssetType.VIDEO\n ? getVideoDimensions(file)\n : of(null)\n\n return dimensions$.pipe(map((dimensions) => ({hash, dimensions})))\n }),\n\n mergeMap(({hash, dimensions}) => {\n if (assetType === S3AssetType.VIDEO && !dimensions) {\n throw new Error('Unable to determine video dimensions')\n }\n\n // Check for existing asset if we have a hash\n if (hash) {\n const documentId = buildDocumentId(assetType, hash, extension, dimensions)\n\n return fetchExistingAsset(sanityClient, assetType, documentId).pipe(\n map((existing) => ({existing, hash, dimensions, documentId})),\n )\n }\n\n return of({existing: null, hash, dimensions, documentId: ''})\n }),\n\n mergeMap(({existing, hash, dimensions, documentId}) => {\n // Return early if asset already exists\n if (existing) {\n return of(createCompleteEvent({asset: existing, exists: true}))\n }\n\n const fileName = buildFileName(hash, extension, dimensions)\n\n // Upload to S3 and create Sanity document\n return s3Client.observable.assets.uploadAsset({assetType, file, fileName}).pipe(\n mergeMap((event) => {\n if (event.type !== 'response') {\n return of(event as UploadEvent)\n }\n\n const document = buildAssetDocument(\n assetType,\n hash,\n file,\n documentId,\n hash || undefined,\n dimensions,\n storeOriginalFilename,\n )\n\n return sanityClient.observable\n .create<S3Asset>(document)\n .pipe(map((asset) => createCompleteEvent({asset})))\n }),\n )\n }),\n )\n}\n\nexport const uploadS3Asset = withMaxConcurrency(uploadAsset, MAX_CONCURRENT_UPLOADS)\n","/**\n * Checks whether or not the passed object is an object (and not `null`)\n *\n * @param obj Item to check whether or not is an object\n * @returns Whether or not `obj` is an object\n * @internal\n */\nexport function isObject(obj: unknown): obj is object {\n return obj !== null && !Array.isArray(obj) && typeof obj === 'object'\n}\n","import {isObject} from '../../../utils/isObject'\nimport type {Any, ErrorProps} from '../types'\n\n/**\n * Shared properties for HTTP errors (eg both ClientError and ServerError)\n * Use `isHttpError` for type narrowing and accessing response properties.\n *\n * @public\n */\nexport interface HttpError {\n statusCode: number\n message: string\n response: {\n body: unknown\n url: string\n method: string\n headers: Record<string, string>\n statusCode: number\n statusMessage: string | null\n }\n}\n\n/** @public */\nexport class ClientError extends Error {\n response: ErrorProps['response']\n statusCode: ErrorProps['statusCode'] = 400\n responseBody: ErrorProps['responseBody']\n details: ErrorProps['details']\n\n constructor(res: Any) {\n const props = extractErrorProps(res)\n super(props.message)\n Object.assign(this, props)\n }\n}\n\n/** @public */\nexport class ServerError extends Error {\n response: ErrorProps['response']\n statusCode: ErrorProps['statusCode'] = 500\n responseBody: ErrorProps['responseBody']\n details: ErrorProps['details']\n\n constructor(res: Any) {\n const props = extractErrorProps(res)\n super(props.message)\n Object.assign(this, props)\n }\n}\n\nfunction extractErrorProps(res: Any): ErrorProps {\n const body = res.body\n const props = {\n response: res,\n statusCode: res.statusCode,\n responseBody: stringifyBody(body, res),\n message: '',\n details: undefined as Any,\n }\n\n // Fall back early if we didn't get a JSON object returned as expected\n if (!isObject(body)) {\n props.message = httpErrorMessage(res, body)\n return props\n }\n\n // Cast to any for property access after isObject check\n const bodyObj = body as any\n const error = bodyObj.error\n\n // API/Boom style errors ({statusCode, error, message})\n if (typeof error === 'string' && typeof bodyObj.message === 'string') {\n props.message = `${error} - ${bodyObj.message}`\n return props\n }\n\n // Content Lake errors with a `error` prop being an object\n if (typeof error !== 'object' || error === null) {\n if (typeof error === 'string') {\n props.message = error\n } else if (typeof bodyObj.message === 'string') {\n props.message = bodyObj.message\n } else {\n props.message = httpErrorMessage(res, body)\n }\n return props\n }\n\n if ('description' in error && typeof error.description === 'string') {\n // Query/database errors ({error: {description, other, arb, props}})\n props.message = error.description\n props.details = error\n return props\n }\n\n // Other, more arbitrary errors\n props.message = httpErrorMessage(res, body)\n return props\n}\n\nfunction httpErrorMessage(res: Any, body: unknown) {\n const details = typeof body === 'string' ? ` (${sliceWithEllipsis(body, 100)})` : ''\n const statusMessage = res.statusMessage ? ` ${res.statusMessage}` : ''\n return `${res.method}-request to ${res.url} resulted in HTTP ${res.statusCode}${statusMessage}${details}`\n}\n\nfunction stringifyBody(body: Any, res: Any) {\n const contentType = (res.headers['content-type'] || '').toLowerCase()\n const isJson = contentType.indexOf('application/json') !== -1\n return isJson ? JSON.stringify(body, null, 2) : body\n}\n\nfunction sliceWithEllipsis(str: string, max: number) {\n return str.length > max ? `${str.slice(0, max)}…` : str\n}\n","/* eslint-disable consistent-return */\nimport {Observable} from 'rxjs'\n\nimport type {Any, HttpRequestEvent} from '../types'\nimport {ClientError, ServerError} from './errors'\n\ninterface FetchOptions extends globalThis.RequestInit {\n url?: string\n timeout?: number\n retries?: number\n retryDelay?: number\n maxRetries?: number\n body?: any\n}\n\nexport const createFetchClient = () => {\n return (options: FetchOptions): Observable<HttpRequestEvent> => {\n return new Observable((subscriber) => {\n const controller = new AbortController()\n const signal = options.signal || controller.signal\n\n const execute = async (attemptNumber = 0) => {\n try {\n // Validate required fields\n if (!options.url) {\n throw new Error('URL is required for fetch request')\n }\n\n // Set timeout\n const timeoutMs = options.timeout || 5 * 60 * 1000\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n // Prepare fetch options\n const fetchOptions: globalThis.RequestInit = {\n method: options.method || 'GET',\n headers: {\n ...(options.headers || {}),\n },\n signal,\n }\n\n // Only add Content-Type for requests with body\n if (options.body) {\n fetchOptions.body = JSON.stringify(options.body)\n ;(fetchOptions.headers as Record<string, string>)['Content-Type'] = 'application/json'\n }\n\n // Make fetch request\n const response = await fetch(options.url, fetchOptions)\n\n clearTimeout(timeoutId)\n\n // Parse JSON response\n const body = await response.json().catch(() => ({}))\n\n // Emit response event\n const event: Any = {\n type: 'response',\n method: options.method || 'GET',\n statusCode: response.status,\n statusMessage: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n body,\n url: options.url,\n }\n\n // Handle errors\n if (response.status >= 500) {\n const maxRetries = options.maxRetries !== undefined ? options.maxRetries : 3\n const shouldRetry = attemptNumber < maxRetries && [502, 503].includes(response.status)\n\n if (shouldRetry) {\n const delay = (options.retryDelay || 1000) * Math.pow(2, attemptNumber)\n await new Promise((resolve) => setTimeout(resolve, delay))\n return execute(attemptNumber + 1)\n }\n\n throw new ServerError(event)\n } else if (response.status >= 400) {\n // Retry rate limiting\n const maxRetries = options.maxRetries !== undefined ? options.maxRetries : 3\n\n if (response.status === 429 && attemptNumber < maxRetries) {\n const delay = (options.retryDelay || 1000) * Math.pow(2, attemptNumber)\n await new Promise((resolve) => setTimeout(resolve, delay))\n return execute(attemptNumber + 1)\n }\n\n throw new ClientError(event)\n }\n\n subscriber.next(event)\n subscriber.complete()\n } catch (error) {\n if (error instanceof ClientError || error instanceof ServerError) {\n subscriber.error(error)\n } else {\n subscriber.error(new Error(`HTTP request failed: ${error}`))\n }\n }\n }\n\n execute()\n\n // Cleanup function\n return () => controller.abort()\n })\n }\n}\n","import {tap} from 'rxjs/operators'\n\nimport type {Requester, RequestOptions} from '../types'\nimport {createFetchClient} from './fetchClient'\n\ntype HttpRequestConfig = {\n ignoreWarnings?: string | RegExp | Array<string | RegExp>\n}\n\n/** @internal */\nexport function defineHttpRequest(config: HttpRequestConfig = {}): Requester {\n const fetchClient = createFetchClient()\n const seen: Record<string, boolean> = {}\n\n return (options: RequestOptions) => {\n return fetchClient({\n ...options,\n timeout: options.timeout || 5 * 60 * 1000,\n maxRetries: options.maxRetries === undefined ? 3 : options.maxRetries,\n retryDelay: 1000,\n }).pipe(\n tap((event) => {\n if (event.type === 'response') {\n const warn = event.headers['x-sanity-warning']\n if (!warn) return\n\n const warnings = Array.isArray(warn) ? warn : [warn]\n warnings.forEach((msg) => {\n if (!msg || seen[msg]) return\n\n // Skip warnings that match ignore patterns\n if (shouldIgnoreWarning(msg, config)) return\n\n seen[msg] = true\n console.warn(msg)\n })\n }\n }),\n )\n }\n}\n\nfunction shouldIgnoreWarning(message: string, config: HttpRequestConfig): boolean {\n if (!config.ignoreWarnings) return false\n\n const patterns = Array.isArray(config.ignoreWarnings)\n ? config.ignoreWarnings\n : [config.ignoreWarnings]\n\n return patterns.some((pattern) => {\n if (typeof pattern === 'string') {\n return message.includes(pattern)\n } else if (pattern instanceof RegExp) {\n return pattern.test(message)\n }\n return false\n })\n}\n","import {defineHttpRequest} from './http/request'\nimport type {HttpRequest, S3ClientConfig} from './types'\n\n/**\n * Create the `requester` and `createClient` exports\n * @internal\n */\nexport default function defineCreateClientExports<\n S3ClientType,\n ClientConfigType extends S3ClientConfig,\n>(ClassConstructor: new (httpRequest: HttpRequest, config: ClientConfigType) => S3ClientType) {\n const createClient = (config: ClientConfigType) => {\n const clientRequester = defineHttpRequest()\n\n return new ClassConstructor(\n (options, requester) => (requester || clientRequester)(options),\n config,\n )\n }\n\n return {createClient}\n}\n","import type {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {SUPPORTED_ASSET_TYPES} from '../../constants'\n\nexport const validateAssetType = (type: S3AssetType): void => {\n if (SUPPORTED_ASSET_TYPES.indexOf(type) === -1) {\n throw new Error(\n `Invalid asset type: ${type}. Must be one of ${SUPPORTED_ASSET_TYPES.join(', ')}`,\n )\n }\n}\n","import {lastValueFrom, Observable} from 'rxjs'\nimport {filter} from 'rxjs/operators'\nimport type {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport type {ObservableS3Client, S3Client} from '../S3Client'\nimport type {HttpRequestEvent, ResponseEvent} from '../types'\nimport * as validators from '../validators'\n\nconst upload = ({\n file,\n fileName,\n client,\n assetType,\n}: {\n file: File\n fileName: string\n client: S3Client | ObservableS3Client\n assetType: S3AssetType\n}): Observable<HttpRequestEvent> => {\n validators.validateAssetType(assetType)\n\n const config = client.config()\n\n const {bucketRegion, bucketKey, getSignedUrlEndpoint, secret} = config\n\n // Validate required config fields\n if (!bucketRegion) {\n throw new Error('S3Client: Missing required config field: bucketRegion')\n }\n if (!bucketKey) {\n throw new Error('S3Client: Missing required config field: bucketKey')\n }\n if (!getSignedUrlEndpoint) {\n throw new Error('S3Client: Missing required config field: getSignedUrlEndpoint')\n }\n if (!secret) {\n throw new Error('S3Client: Missing required config field: secret')\n }\n\n if (!fileName) {\n throw new Error('S3Client: filename is required in options')\n }\n\n const fileSize = file.size || 0\n const fileType = file.type\n\n return new Observable((subscriber) => {\n const executeUpload = async () => {\n try {\n // Stage 1: Get Signed URL (0-10%)\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: 5,\n loaded: 0,\n total: fileSize,\n lengthComputable: true,\n })\n\n // Fetch signed URL\n const signedUrlResponse = await fetch(getSignedUrlEndpoint, {\n method: 'POST',\n body: JSON.stringify({\n secret,\n fileName,\n bucketKey,\n bucketRegion,\n contentType: file.type,\n }),\n headers: {'Content-Type': 'application/json'},\n mode: 'cors',\n })\n\n const {url: signedUrl} = (await signedUrlResponse.json()) as {url: string}\n\n if (!signedUrl || !URL.canParse(signedUrl)) {\n throw new Error('Invalid signed URL received from endpoint')\n }\n\n // Stage 2: Upload to S3 (10-100%)\n const xhr = new XMLHttpRequest()\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n // Map 0-100% upload progress to 10-100% overall progress\n const uploadPercent = (event.loaded / event.total) * 100\n const overallPercent = 10 + uploadPercent * 0.9\n\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: overallPercent,\n loaded: event.loaded,\n total: event.total,\n lengthComputable: true,\n })\n }\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n // Upload successful, emit final progress\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: 100,\n loaded: fileSize,\n total: fileSize,\n lengthComputable: true,\n })\n\n // Emit response event\n subscriber.next({\n type: 'response',\n method: 'PUT',\n statusCode: xhr.status,\n statusMessage: xhr.statusText,\n headers: {},\n })\n\n subscriber.complete()\n } else {\n subscriber.error(new Error(`S3 upload failed: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n subscriber.error(new Error('S3 upload failed: Network error'))\n }\n\n xhr.open('PUT', signedUrl)\n xhr.setRequestHeader('Content-Type', fileType)\n xhr.send(file)\n } catch (error) {\n subscriber.error(error)\n }\n }\n\n executeUpload()\n })\n}\n\nconst deleteAsset = ({\n fileName,\n client,\n}: {\n fileName: string\n client: S3Client | ObservableS3Client\n}): Observable<HttpRequestEvent> => {\n const config = client.config()\n\n const {deleteEndpoint, secret, bucketKey, bucketRegion} = config\n\n if (!deleteEndpoint) {\n throw new Error('S3Client: Missing required config field: deleteEndpoint')\n }\n\n if (!fileName) {\n throw new Error('S3Client: fileKey is required in options')\n }\n\n return new Observable((subscriber) => {\n const executeDelete = async () => {\n try {\n const response = await fetch(deleteEndpoint, {\n method: 'POST',\n body: JSON.stringify({\n fileKey: fileName,\n secret,\n bucketKey,\n bucketRegion,\n }),\n headers: {'Content-Type': 'application/json'},\n mode: 'cors',\n })\n\n if (!response.ok) {\n throw new Error(`S3 delete failed: ${response.status} ${response.statusText}`)\n }\n\n subscriber.next({\n type: 'response',\n method: 'POST',\n statusCode: response.status,\n statusMessage: response.statusText,\n headers: {},\n })\n\n subscriber.complete()\n } catch (error) {\n subscriber.error(error)\n }\n }\n\n executeDelete()\n })\n}\n\nexport class ObservableAssetsClient {\n #client: ObservableS3Client\n constructor(client: ObservableS3Client) {\n this.#client = client\n }\n\n uploadAsset({\n assetType,\n file,\n fileName,\n }: {\n file: File\n fileName: string\n assetType: S3AssetType\n }): Observable<HttpRequestEvent> {\n return upload({client: this.#client, file, fileName, assetType})\n }\n\n deleteAsset({fileName}: {fileName: string}): Observable<HttpRequestEvent> {\n return deleteAsset({client: this.#client, fileName})\n }\n}\n\nexport class AssetsClient {\n #client: S3Client\n constructor(client: S3Client) {\n this.#client = client\n }\n\n uploadAsset({\n assetType,\n file,\n fileName,\n }: {\n assetType: S3AssetType\n file: File\n fileName: string\n }): Promise<ResponseEvent> {\n const observable = upload({client: this.#client, assetType, file, fileName})\n\n return lastValueFrom(observable.pipe(filter((event) => event.type === 'response')))\n }\n\n deleteAsset({fileName}: {fileName: string}): Promise<ResponseEvent> {\n const observable = deleteAsset({client: this.#client, fileName})\n\n return lastValueFrom(observable.pipe(filter((event) => event.type === 'response')))\n }\n}\n","import {AssetsClient, ObservableAssetsClient} from './assets/AssetsClient'\nimport type {HttpRequest, InitializedClientConfig, S3ClientConfig} from './types'\n\n/** @public */\nexport class ObservableS3Client {\n assets: ObservableAssetsClient\n\n /**\n * Private properties\n */\n #clientConfig: InitializedClientConfig\n #httpRequest: HttpRequest\n\n constructor(httpRequest: HttpRequest, config: S3ClientConfig) {\n // Initialize with empty object cast to InitializedClientConfig\n this.#clientConfig = {} as InitializedClientConfig\n this.config(config)\n\n this.#httpRequest = httpRequest\n\n this.assets = new ObservableAssetsClient(this)\n }\n\n /**\n * Clone the client - returns a new instance\n */\n clone(): ObservableS3Client {\n return new ObservableS3Client(this.#httpRequest, this.config())\n }\n\n /**\n * Returns the current client configuration\n */\n config(): InitializedClientConfig\n /**\n * Reconfigure the client. Note that this _mutates_ the current client.\n */\n config(newConfig?: Partial<S3ClientConfig>): this\n config(newConfig?: Partial<S3ClientConfig>): InitializedClientConfig | this {\n if (newConfig === undefined) {\n return {...this.#clientConfig}\n }\n\n // Merge config properly\n this.#clientConfig = {\n ...this.#clientConfig,\n ...newConfig,\n } as InitializedClientConfig\n\n return this\n }\n\n /**\n * Clone the client with a new (partial) configuration.\n *\n * @param newConfig - New client configuration properties, shallowly merged with existing configuration\n */\n withConfig(newConfig?: Partial<S3ClientConfig>): ObservableS3Client {\n const thisConfig = this.config()\n return new ObservableS3Client(this.#httpRequest, {\n ...thisConfig,\n ...newConfig,\n })\n }\n}\n\n/** @public */\nexport class S3Client {\n assets: AssetsClient\n\n /**\n * Observable version of the Sanity client, with the same configuration as the promise-based one\n */\n observable: ObservableS3Client\n\n /**\n * Private properties\n */\n #clientConfig: InitializedClientConfig\n #httpRequest: HttpRequest\n\n constructor(httpRequest: HttpRequest, config: S3ClientConfig) {\n // Initialize with empty object cast to InitializedClientConfig\n this.#clientConfig = {} as InitializedClientConfig\n this.config(config)\n\n this.#httpRequest = httpRequest\n\n this.assets = new AssetsClient(this)\n\n this.observable = new ObservableS3Client(httpRequest, config)\n }\n\n /**\n * Clone the client - returns a new instance\n */\n clone(): S3Client {\n return new S3Client(this.#httpRequest, this.config())\n }\n\n /**\n * Returns the current client configuration\n */\n config(): InitializedClientConfig\n /**\n * Reconfigure the client. Note that this _mutates_ the current client.\n */\n config(newConfig?: Partial<S3ClientConfig>): this\n config(newConfig?: Partial<S3ClientConfig>): InitializedClientConfig | this {\n if (newConfig === undefined) {\n return {...this.#clientConfig}\n }\n\n if (this.observable) {\n this.observable.config(newConfig)\n }\n\n // Merge config properly\n this.#clientConfig = {\n ...this.#clientConfig,\n ...newConfig,\n } as InitializedClientConfig\n\n return this\n }\n\n /**\n * Clone the client with a new (partial) configuration.\n *\n * @param newConfig - New client configuration properties, shallowly merged with existing configuration\n */\n withConfig(newConfig?: Partial<S3ClientConfig>): S3Client {\n const thisConfig = this.config()\n return new S3Client(this.#httpRequest, {\n ...thisConfig,\n ...newConfig,\n })\n }\n}\n","import defineCreateClientExports from './defineCreateClient'\nimport {S3Client} from './S3Client'\nimport type {S3ClientConfig} from './types'\n\nconst exp = defineCreateClientExports<S3Client, S3ClientConfig>(S3Client)\n\n/** @public */\nexport const createS3Client = exp.createClient\n","import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {createContext, type FC, PropsWithChildren, useCallback, useContext, useState} from 'react'\nimport {buildS3FileUrl, buildS3ImageUrl, buildS3VideoUrl} from 'sanity-plugin-s3-media-asset-utils'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {createS3Client, type S3Client} from '../lib'\nimport type {S3Credentials} from '../types'\n\ntype IS3MediaContext = {\n s3Client: S3Client\n buildAssetUrl: ({assetId, assetType}: {assetId: string; assetType: S3AssetType}) => string\n}\n\nconst credentialsNamespace = 's3MediaCredentials'\n\nconst pluginConfigKeys = [\n {\n key: 'bucketRegion',\n title: 'Bucket Region',\n },\n {\n key: 'bucketKey',\n title: 'Bucket Key',\n },\n {key: 'getSignedUrlEndpoint', title: 'getSignedUrlEndpoint', description: 'test'},\n {key: 'deleteEndpoint', title: 'deleteEndpoint'},\n {key: 'cloudfrontDomain', title: 'cloudfrontDomain'},\n {key: 'secret', title: 'secret'},\n]\n\nconst S3MediaContext = createContext<IS3MediaContext>({} as IS3MediaContext)\n\nexport const S3MediaContextProvider: FC<PropsWithChildren> = (props) => {\n const {children} = props\n\n const [isCredentialsDialogDismissed, setIsCredentialsDialogDismissed] = useState(false)\n const {secrets: credentials, loading: isCredentialsLoading} =\n useSecrets<S3Credentials>(credentialsNamespace)\n\n const {bucketRegion, bucketKey, getSignedUrlEndpoint, deleteEndpoint, cloudfrontDomain, secret} =\n credentials || {}\n\n const s3AssetBaseUrl =\n cloudfrontDomain || (bucketRegion && bucketKey)\n ? cloudfrontDomain || `https://s3.${bucketRegion}.amazonaws.com/${bucketKey}`\n : null\n\n const isCredentialsDialogOpen =\n !isCredentialsDialogDismissed &&\n !isCredentialsLoading &&\n (!credentials ||\n !credentials.bucketKey ||\n !credentials.bucketRegion ||\n !credentials.getSignedUrlEndpoint ||\n !credentials.secret)\n\n const s3Client = createS3Client({\n bucketRegion,\n bucketKey,\n getSignedUrlEndpoint,\n deleteEndpoint,\n cloudfrontDomain,\n secret,\n })\n\n const buildAssetUrl = useCallback(\n ({assetId, assetType}: {assetId: string; assetType: S3AssetType}) => {\n if (!assetId || !assetType) {\n throw new Error('')\n }\n\n if (!s3AssetBaseUrl) {\n throw new Error('S3 Base URL is not defined')\n }\n\n if (assetType === S3AssetType.IMAGE) {\n return buildS3ImageUrl(assetId, {baseUrl: s3AssetBaseUrl})\n }\n\n if (assetType === S3AssetType.FILE) {\n return buildS3FileUrl(assetId, {baseUrl: s3AssetBaseUrl})\n }\n\n if (assetType === S3AssetType.VIDEO) {\n return buildS3VideoUrl(assetId, {baseUrl: s3AssetBaseUrl})\n }\n\n throw new Error(\"Can't build asset id\")\n },\n [s3AssetBaseUrl],\n )\n\n return (\n <S3MediaContext.Provider value={{s3Client, buildAssetUrl}}>\n {children}\n\n {isCredentialsDialogOpen && !isCredentialsLoading ? (\n <SettingsView\n title=\"S3 Media Credentials\"\n namespace={credentialsNamespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setIsCredentialsDialogDismissed(true)\n }}\n />\n ) : null}\n </S3MediaContext.Provider>\n )\n}\n\nexport const useS3MediaContext = (): IS3MediaContext => {\n const context = useContext(S3MediaContext)\n\n if (!context) {\n throw new Error('useS3MediaContext must be used within a S3MediaContextProvider')\n }\n\n return context\n}\n","import {createContext, type FC, PropsWithChildren, useContext} from 'react'\n\nimport type {S3MediaPluginOptions} from '../types'\n\ntype S3MediaOptionsContextProviderProps = {options: S3MediaPluginOptions | void}\n\nconst S3MediaOptionsContext = createContext<S3MediaPluginOptions>({\n directUploads: true,\n})\n\nexport const S3MediaOptionsContextProvider: FC<\n PropsWithChildren<S3MediaOptionsContextProviderProps>\n> = (props) => {\n const {options, children} = props\n\n const {directUploads = true, ...rest} = options || {}\n\n return (\n <S3MediaOptionsContext.Provider value={{...rest, directUploads}}>\n {children}\n </S3MediaOptionsContext.Provider>\n )\n}\n\nexport const useS3MediaOptionsContext = (): S3MediaPluginOptions => {\n const context = useContext(S3MediaOptionsContext)\n\n if (!context) {\n throw new Error('useS3MediaOptionsContext must be used within a S3MediaOptionsContextProvider')\n }\n\n return context\n}\n","import type {Order} 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 = (order: Order): string => {\n return ORDER_DICTIONARY[order.field][order.direction]\n}\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\n\ntype SearchState = {\n query: string\n}\n\nconst initialState = {\n query: '',\n} as SearchState\n\nconst searchSlice = createSlice({\n name: 'search',\n initialState,\n reducers: {\n querySet(state, action: PayloadAction<{searchQuery: string}>) {\n state.query = action.payload?.searchQuery\n },\n },\n})\n\nexport const searchActions = {...searchSlice.actions}\n\nexport const searchReducer = searchSlice.reducer\n","import {createAction} from '@reduxjs/toolkit'\nimport type {S3AssetDocument} from 'sanity-plugin-s3-media-types'\n\nexport const UPLOADS_ACTIONS = {\n uploadComplete: createAction(\n 'uploads/uploadComplete',\n function prepare({asset}: {asset: S3AssetDocument}) {\n return {\n payload: {asset},\n }\n },\n ),\n}\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError} from '@sanity/client'\nimport groq from 'groq'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {concat, EMPTY, forkJoin, from, of} from 'rxjs'\nimport {\n bufferTime,\n catchError,\n debounceTime,\n filter,\n mergeMap,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators'\nimport {\n buildS3FilePath,\n buildS3ImagePath,\n buildS3VideoPath,\n isS3FileAsset,\n isS3ImageAsset,\n isS3VideoAsset,\n} from 'sanity-plugin-s3-media-asset-utils'\nimport type {S3Asset, S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport type {AssetItem, BrowserView, Epic, HttpError, Order, RootReducerState} from '../../types'\nimport {constructFilter} from '../../utils'\nimport {searchActions} from '../search'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\n\ntype ItemError = {\n description: string\n id: string\n referencingIDs: string[]\n type: string // 'documentHasExistingReferencesError'\n}\n\nconst buildFileName = (asset: S3Asset): string => {\n if (isS3ImageAsset(asset)) {\n return buildS3ImagePath(asset._id)\n }\n\n if (isS3VideoAsset(asset)) {\n return buildS3VideoPath(asset._id)\n }\n\n if (isS3FileAsset(asset)) {\n return buildS3FilePath(asset._id)\n }\n\n throw new Error('Unsupported asset type')\n}\n\ntype AssetsReducerState = {\n allIds: string[]\n assetTypes: S3AssetType[]\n byIds: Record<string, AssetItem>\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 Order\n\nexport const initialState = {\n allIds: [],\n assetTypes: [],\n byIds: {},\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),\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 S3Asset,\n picked: false,\n updating: false,\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\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: S3Asset[]; 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 deleteSkipped(state, action: PayloadAction<{assetIds: string[]; reason: string}>) {\n const {assetIds, reason} = action.payload\n assetIds.forEach((assetId) => {\n if (state.byIds[assetId]) {\n state.byIds[assetId].updating = false\n state.byIds[assetId].error = reason\n }\n })\n },\n fetchComplete(state, action: PayloadAction<{assets: S3Asset[]}>) {\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 state.byIds[asset._id] = {\n _type: 'asset',\n asset: asset,\n picked: false,\n updating: false,\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 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 extension,\n metadata {\n dimensions\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: S3Asset}>) {\n //\n },\n listenerCreateQueueComplete(state, action: PayloadAction<{assets: S3Asset[]}>) {\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: S3Asset}>) {\n //\n },\n listenerUpdateQueueComplete(state, action: PayloadAction<{assets: S3Asset[]}>) {\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\n state.byIds[assetId].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] as number\n const tagB = state.byIds[b].asset[state.order.field] as number\n const direction = state.order.direction === 'asc' ? 1 : -1\n\n if (tagA < tagB) {\n return -1 * direction\n } else if (tagA > tagB) {\n return 1 * direction\n }\n return 0\n })\n },\n updateComplete(state, action: PayloadAction<{asset: S3Asset; 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: S3Asset; 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 updateRequest(\n state,\n action: PayloadAction<{\n asset: S3Asset\n closeDialogId?: string\n formData: Record<string, any>\n }>,\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\nexport const assetsActions = {...assetsSlice.actions}\n\n// Epics\n\nexport const assetsDeleteEpic: Epic = (action$, _state$, {sanityClient, s3Client}) =>\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\n return sanityClient.observable\n .fetch<\n {_id: string; referenceCount: number}[]\n >(groq`*[_id in $assetIds]{_id, \"referenceCount\": count(*[references(^._id)])}`, {assetIds})\n .pipe(\n mergeMap((referenceResults) => {\n const referenceMap = new Map(\n referenceResults.map((item) => [item._id, item.referenceCount]),\n )\n\n const blockedAssets = assets.filter((asset) => (referenceMap.get(asset._id) || 0) > 0)\n const deletableAssets = assets.filter(\n (asset) => (referenceMap.get(asset._id) || 0) === 0,\n )\n\n const blockedIds = blockedAssets.map((asset) => asset._id)\n const deletableIds = deletableAssets.map((asset) => asset._id)\n\n const blockedActions$ = blockedIds.length\n ? of(\n assetsActions.deleteSkipped({\n assetIds: blockedIds,\n reason: 'Asset has references and cannot be deleted.',\n }),\n )\n : EMPTY\n\n if (deletableAssets.length === 0) {\n return blockedActions$\n }\n\n const deleteRequests = deletableAssets.map((asset) =>\n s3Client.observable.assets.deleteAsset({fileName: buildFileName(asset)}),\n )\n\n const deleteFlow$ = forkJoin(deleteRequests).pipe(\n mergeMap(() =>\n sanityClient.observable.delete({\n query: groq`*[_id in ${JSON.stringify(deletableIds)}]`,\n }),\n ),\n mergeMap(() => of(assetsActions.deleteComplete({assetIds: deletableIds}))),\n catchError((error: ClientError) => {\n return of(assetsActions.deleteError({assetIds: deletableIds, error}))\n }),\n )\n\n return blockedIds.length ? concat(blockedActions$, deleteFlow$) : deleteFlow$\n }),\n catchError((error: ClientError) => of(assetsActions.deleteError({assetIds, error}))),\n )\n }),\n )\n\nexport const assetsFetchEpic: Epic = (action$, state$, {sanityClient}) =>\n action$.pipe(\n filter(assetsActions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action]) => {\n const params = action.payload?.params\n const query = action.payload?.query\n\n return of(action).pipe(\n mergeMap(() =>\n sanityClient.observable.fetch<{\n items: S3Asset[]\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: Epic = (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 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: Epic = (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: Epic = (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\nexport const assetsOrderSetEpic: Epic = (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: Epic = (action$) =>\n action$.pipe(\n ofType(searchActions.querySet.type),\n debounceTime(400),\n mergeMap(() => {\n return of(\n assetsActions.clear(), //\n assetsActions.loadPageIndex({pageIndex: 0}),\n )\n }),\n )\n\nexport const assetsListenerCreateQueueEpic: Epic = (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: Epic = (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: Epic = (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: Epic = (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 assetsUnpickEpic: Epic = (action$) =>\n action$.pipe(\n ofType(assetsActions.orderSet.type, assetsActions.viewSet.type, searchActions.querySet.type),\n mergeMap(() => {\n return of(assetsActions.pickClear())\n }),\n )\n\nexport const assetsUpdateEpic: Epic = (action$, state$, {sanityClient}) =>\n action$.pipe(\n filter(assetsActions.updateRequest.match),\n withLatestFrom(state$),\n mergeMap(([action]) => {\n const {asset, closeDialogId, formData} = action.payload\n\n return of(action).pipe(\n mergeMap(() =>\n from(\n sanityClient\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\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 assetsReducer = assetsSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\n\nimport type {AssetItem, Dialog, Epic} from '../../types'\nimport {assetsActions} from '../assets'\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 reducers: {\n // Clear all dialogs\n clear(state) {\n state.items = []\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 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 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 },\n})\n\n// Epics\n\nexport const dialogClearOnAssetUpdateEpic: Epic = (action$) =>\n action$.pipe(\n ofType(assetsActions.deleteComplete.type, assetsActions.updateComplete.type),\n filter(\n (action: {\n payload: {closeDialogId?: string}\n }): action is PayloadAction<{closeDialogId?: string}> => !!action?.payload?.closeDialogId,\n ),\n mergeMap((action) => {\n return of(dialogSlice.actions.remove({id: action.payload.closeDialogId as string}))\n }),\n )\n\nexport const dialogActions = {...dialogSlice.actions}\n\nexport const dialogReducer = dialogSlice.reducer\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError} from '@sanity/client'\nimport groq from 'groq'\nimport {empty, merge, of, throwError} from 'rxjs'\nimport {catchError, delay, filter, mergeMap, takeUntil, withLatestFrom} from 'rxjs/operators'\nimport type {S3AssetDocument} from 'sanity-plugin-s3-media-types'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {uploadS3Asset} from '../../lib'\nimport type {RootReducerState, UploadProgressEvent} from '../../types'\nimport {Epic, HttpError, UploadItem} from '../../types'\nimport {constructFilter, generatePreviewBlobUrl$, hashFile} from '../../utils'\nimport {assetsActions} from '../assets'\nimport {UPLOADS_ACTIONS} from './actions'\n\ntype 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(_state, _action: PayloadAction<{assets: S3AssetDocument[]}>) {\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\n uploadRequest(_state, _action: PayloadAction<{file: File; forceAsAssetType?: S3AssetType}>) {\n //\n },\n uploadProgress(state, action: PayloadAction<{event: UploadProgressEvent; uploadHash: string}>) {\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\n if (!state.allIds.includes(uploadItem.hash)) {\n state.allIds.push(uploadItem.hash)\n }\n state.byIds[uploadItem.hash] = uploadItem\n },\n },\n})\n\nexport const uploadsActions = {...uploadsSlice.actions}\n\n// Epics\n\nexport const uploadsAssetStartEpic: Epic = (action$, _state$, {sanityClient, s3Client}) =>\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(() =>\n uploadS3Asset({assetType: uploadItem.assetType, s3Client, sanityClient, file}),\n ),\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 if (event.exists) {\n return throwError({\n message: 'Asset already exists',\n statusCode: 409,\n } as HttpError)\n }\n\n return of(\n UPLOADS_ACTIONS.uploadComplete({\n asset: event.asset,\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: Epic = (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 =\n forceAsAssetType ||\n (file.type.indexOf('image') >= 0\n ? S3AssetType.IMAGE\n : file.type.indexOf('video') >= 0\n ? S3AssetType.VIDEO\n : S3AssetType.FILE)\n\n const uploadItem = {\n hash,\n _type: 'upload',\n assetType,\n name: file.name,\n size: file.size,\n status: 'queued',\n } as UploadItem\n\n return of(uploadsActions.uploadStart({file, uploadItem}))\n }),\n )\n }),\n )\n\nexport const uploadsCompleteQueueEpic: Epic = (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: Epic = (action$, state$, {sanityClient}) =>\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 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(() => sanityClient.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\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 uploadsReducer = uploadsSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\nimport type {S3ImageAsset} from 'sanity-plugin-s3-media-types'\n\nimport type {Epic} from '../../types'\nimport {assetsActions} from '../assets'\nimport {uploadsActions} from '../uploads'\n\ntype Notification = {\n asset?: S3ImageAsset\n status?: 'error' | 'warning' | 'success' | 'info'\n title?: string\n}\n\ntype NotificationsReducerState = {\n items: Notification[]\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: Epic = (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: Epic = (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 notificationsAssetsDeleteSkippedEpic: Epic = (action$) =>\n action$.pipe(\n filter(assetsActions.deleteSkipped.match),\n mergeMap((action) => {\n const {assetIds, reason} = action.payload\n const count = assetIds.length\n return of(\n notificationsSlice.actions.add({\n status: 'warning',\n title: `Skipped ${count} ${pluralize('asset', count)}. ${reason}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsUploadCompleteEpic: Epic = (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 notificationsGenericErrorEpic: Epic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.fetchError.type,\n assetsActions.updateError.type,\n uploadsActions.uploadError.type,\n ),\n mergeMap((action: {payload: {error: {message: string}}}) => {\n const error = action.payload?.error\n\n return of(\n notificationsSlice.actions.add({\n status: 'error',\n title: `An error occured: ${error?.message}`,\n }),\n )\n }),\n )\n\nexport const notificationsActions = {...notificationsSlice.actions}\n\nexport const notificationsReducer = notificationsSlice.reducer\n","import {combineEpics} from 'redux-observable'\n\nimport {\n assetsDeleteEpic,\n assetsFetchAfterDeleteAllEpic,\n assetsFetchEpic,\n assetsFetchNextPageEpic,\n assetsFetchPageIndexEpic,\n assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n} from './assets'\nimport {dialogClearOnAssetUpdateEpic} from './dialog'\nimport {\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteSkippedEpic,\n notificationsAssetsUploadCompleteEpic,\n notificationsGenericErrorEpic,\n} from './notifications'\nimport {\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 assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n dialogClearOnAssetUpdateEpic,\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsDeleteSkippedEpic,\n notificationsAssetsUploadCompleteEpic,\n notificationsGenericErrorEpic,\n uploadsAssetStartEpic,\n uploadsAssetUploadEpic,\n uploadsCheckRequestEpic,\n uploadsCompleteQueueEpic,\n)\n","import {createSlice} from '@reduxjs/toolkit'\nimport type {SanityDocument} from '@sanity/client'\nimport type {S3AssetDocument} from 'sanity-plugin-s3-media-types'\n\ntype SelectedReducerState = {\n assets: S3AssetDocument[]\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 const selectedReducer = selectedSlice.reducer\n","import {\n type ActionFromReducersMapObject,\n combineReducers,\n type Reducer,\n type StateFromReducersMapObject,\n} from '@reduxjs/toolkit'\n\nimport {assetsReducer} from './assets'\nimport {dialogReducer} from './dialog'\nimport {notificationsReducer} from './notifications'\nimport {searchReducer} from './search'\nimport {selectedReducer} from './selected'\nimport {uploadsReducer} from './uploads'\n\nconst reducers = {\n assets: assetsReducer,\n dialog: dialogReducer,\n notifications: notificationsReducer,\n search: searchReducer,\n selected: selectedReducer,\n uploads: uploadsReducer,\n}\n\ntype ReducersMapObject = typeof reducers\n\nexport const rootReducer: Reducer<\n StateFromReducersMapObject<ReducersMapObject>,\n ActionFromReducersMapObject<ReducersMapObject>\n> = combineReducers(reducers)\n","import {createSelector} from '@reduxjs/toolkit'\n\nimport type {CardAssetData, CardUploadData,RootReducerState} from '../types'\n\nexport const selectCombinedItems = createSelector(\n [\n (state: RootReducerState) => state.assets.allIds,\n (state: RootReducerState) => state.uploads.allIds,\n ],\n (assetIds, uploadIds) => {\n const assetItems = assetIds.map((id) => ({id, type: 'asset'}) as CardAssetData)\n const uploadItems = uploadIds.map((id) => ({id, type: 'upload'}) as CardUploadData)\n const combinedItems: (CardAssetData | CardUploadData)[] = [...uploadItems, ...assetItems]\n return combinedItems\n },\n)\n","import {Box, Flex} from '@sanity/ui'\nimport {type FC, type MouseEvent} from 'react'\nimport type {DefaultExtensionType} from 'react-file-icon'\nimport {defaultStyles, FileIcon as ReactFileIcon} from 'react-file-icon'\nimport {S3AssetType, type S3FileAsset, type S3VideoAsset} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport {useS3MediaContext} from '../../../contexts'\n\ntype FileIconProps = {\n extension?: string\n onClick?: (e: MouseEvent) => void\n width: string\n asset?: S3FileAsset | S3VideoAsset\n}\n\n// Force react-file-icon styles\nconst Container = styled(Box)`\n text {\n font-size: 8px !important;\n font-weight: 500 !important;\n }\n`\n\nexport const FileIcon: FC<FileIconProps> = (props) => {\n const {extension, onClick, width, asset} = props\n\n const {buildAssetUrl} = useS3MediaContext()\n\n const assetUrl = asset\n ? buildAssetUrl({\n assetType: asset._type === 's3VideoAsset' ? S3AssetType.VIDEO : S3AssetType.FILE,\n assetId: asset._id,\n })\n : null\n\n return (\n <Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n {assetUrl && asset?.mimeType.search('video') === 0 ? (\n <video\n autoPlay\n muted\n loop\n src={assetUrl}\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n ) : (\n <Container style={{width}}>\n {extension ? (\n <ReactFileIcon\n extension={extension}\n {...defaultStyles[extension as DefaultExtensionType]}\n />\n ) : (\n <ReactFileIcon />\n )}\n </Container>\n )}\n </Flex>\n )\n}\n","import type {ThemeColorSchemeKey} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {getSchemeColor} from '../../../utils'\n\ntype Props = {\n onClick?: (e: MouseEvent) => void\n $showCheckerboard?: boolean\n $scheme?: ThemeColorSchemeKey\n src: string\n}\n\nexport const Image: any = styled.img<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","export 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 PANEL_HEIGHT = 32 // px\n","import {CheckmarkCircleIcon, EditIcon, WarningFilledIcon} from '@sanity/icons'\nimport {\n Box,\n Card,\n Checkbox,\n Container,\n Flex,\n Spinner,\n Text,\n type Theme,\n type ThemeColorSchemeKey,\n Tooltip,\n} from '@sanity/ui'\nimport {type FC, memo, type MouseEvent, type RefObject} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {isS3FileAsset, isS3ImageAsset, isS3VideoAsset} from 'sanity-plugin-s3-media-asset-utils'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {css, styled} from 'styled-components'\n\nimport {useS3MediaContext} from '../../../contexts'\nimport {useAssetSourceActions} from '../../../contexts/S3AssetSourceDispatchContext'\nimport {useKeyPress, useTypedSelector} from '../../../hooks'\nimport {assetsActions, dialogActions, selectAssetById} from '../../../modules'\nimport {getSchemeColor} from '../../../utils'\nimport {PANEL_HEIGHT} from '../constants'\nimport {FileIcon} from '../FileIcon'\nimport {Image} from '../Image'\n\ntype CardAssetProps = {\n id: string\n selected: boolean\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 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: ${$picked\n ? `1px solid ${theme.sanity.color.spot.orange} !important`\n : '1px solid inherit'};\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\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 BaseCardAsset: FC<CardAssetProps> = (props) => {\n const {id, selected} = props\n\n const scheme = useColorSchemeValue()\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 item = useTypedSelector((state) => selectAssetById(state, id))\n\n const asset = item?.asset\n const error = item?.error\n const picked = item?.picked\n const updating = item?.updating\n\n const {onSelect} = useAssetSourceActions()\n\n const {buildAssetUrl} = useS3MediaContext()\n\n // Short circuit if no asset is available\n if (!asset) {\n return null\n }\n\n // Callbacks\n const handleAssetClick = (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (onSelect) {\n onSelect([\n {\n kind: 'assetDocumentId',\n value: asset._id,\n },\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 (onSelect) {\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 onClick={handleAssetClick} style={{height: '100%', opacity: opacityPreview}}>\n {/* File icon */}\n {(isS3FileAsset(asset) || isS3VideoAsset(asset)) && (\n <FileIcon asset={asset} extension={asset.extension} width=\"80px\" />\n )}\n\n {/* Image */}\n {isS3ImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard\n src={buildAssetUrl({assetId: asset._id, assetType: S3AssetType.IMAGE})}\n style={{\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 ? (\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 {/* Error button */}\n {error && (\n <Card\n tone=\"critical\"\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 <WarningFilledIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Card>\n )}\n </CardContainer>\n </CardWrapper>\n )\n}\n\nexport const CardAsset = memo(BaseCardAsset)\n","import {CloseIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {filesize} from 'filesize'\nimport type {FC} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport {useTypedSelector} from '../../../hooks'\nimport {selectUploadById, uploadsActions} from '../../../modules'\nimport {getSchemeColor} from '../../../utils'\nimport {PANEL_HEIGHT} from '../constants'\nimport {FileIcon} from '../FileIcon'\nimport {Image} from '../Image'\n\ntype CardUploadProps = {\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\nexport const CardUpload: FC<CardUploadProps> = (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 === S3AssetType.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 === S3AssetType.FILE || item.assetType === S3AssetType.VIDEO) && (\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","import type {FC} from 'react'\nimport {VirtuosoGrid} from 'react-virtuoso'\nimport {styled} from 'styled-components'\n\nimport {useTypedSelector} from '../../../hooks'\nimport type {CardAssetData, CardUploadData} from '../../../types/browser'\nimport {CardAsset} from '../CardAsset'\nimport {CardUpload} from '../CardUpload'\n\ntype AssetGridVirtualizedProps = {\n items: (CardAssetData | CardUploadData)[]\n onLoadMore?: () => void\n}\n\nconst CARD_HEIGHT = 220\nconst CARD_WIDTH = 240\n\nconst VirtualCell = ({\n item,\n selected,\n}: {\n item: CardAssetData | CardUploadData\n selected: boolean\n}) => {\n if (item?.type === 'asset') {\n return <CardAsset id={item.id} selected={selected} />\n }\n\n if (item?.type === 'upload') {\n return <CardUpload id={item.id} />\n }\n\n return null\n}\n\nconst StyledItemContainer = styled.div`\n height: ${CARD_HEIGHT}px;\n width: ${CARD_WIDTH}px;\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\nexport const AssetGridVirtualized: FC<AssetGridVirtualizedProps> = (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 <VirtuosoGrid\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n\n return item?.id\n }}\n components={{\n Item: StyledItemContainer,\n List: StyledListContainer,\n }}\n endReached={onLoadMore}\n itemContent={(index) => {\n const item = items[index]\n const selected = selectedIds.includes(item?.id)\n\n return <VirtualCell item={item} selected={selected} />\n }}\n overscan={48}\n style={{overflowX: 'hidden', overflowY: 'scroll'}}\n totalCount={totalCount}\n />\n )\n}\n","import {ChevronDownIcon, ChevronUpIcon} from '@sanity/icons'\nimport {Box, Label} from '@sanity/ui'\nimport type {FC} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {useTypedSelector} from '../../../hooks'\nimport {assetsActions} from '../../../modules'\n\ntype TableHeaderItemProps = {\n field?: string\n title?: string\n}\n\nexport const TableHeaderItem: FC<TableHeaderItemProps> = (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","import {Checkbox, Flex, Grid, type ThemeColorSchemeKey, useMediaIndex} from '@sanity/ui'\nimport {type FC, type MouseEvent} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {useAssetSourceActions} from '../../../contexts'\nimport {useTypedSelector} from '../../../hooks'\nimport {assetsActions, selectAssetsLength, selectAssetsPickedLength} from '../../../modules'\nimport {getSchemeColor} from '../../../utils'\nimport {GRID_TEMPLATE_COLUMNS, PANEL_HEIGHT} from '../constants'\nimport {TableHeaderItem} from '../TableHeaderItem'\n\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\nexport const TableHeader: FC = () => {\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 gridColumnGap: 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',\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","import {CheckmarkCircleIcon, EditIcon, WarningFilledIcon} from '@sanity/icons'\nimport {\n Box,\n Card,\n Checkbox,\n Container,\n Flex,\n Grid,\n Spinner,\n Text,\n type ThemeColorSchemeKey,\n Tooltip,\n useMediaIndex,\n} from '@sanity/ui'\nimport {formatRelative} from 'date-fns'\nimport {filesize} from 'filesize'\nimport {\n type FC,\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 {useColorSchemeValue, WithReferringDocuments} from 'sanity'\nimport {isS3FileAsset, isS3ImageAsset, isS3VideoAsset} from 'sanity-plugin-s3-media-asset-utils'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {css, styled} from 'styled-components'\n\nimport {useS3MediaContext} from '../../../contexts'\nimport {useAssetSourceActions} from '../../../contexts/S3AssetSourceDispatchContext'\nimport {useKeyPress, useTypedSelector} from '../../../hooks'\nimport {assetsActions, dialogActions, selectAssetById} from '../../../modules'\nimport {getAssetResolution, getSchemeColor, getUniqueDocuments} from '../../../utils'\nimport {GRID_TEMPLATE_COLUMNS} from '../constants'\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 TableRowAssetProps = {\n id: string\n selected: boolean\n}\n\nconst ContainerGrid = styled<\n typeof Grid,\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 ${!$updating &&\n css`\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `}\n `\n})\n\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\n// eslint-disable-next-line complexity\nconst BaseTableRowAsset: FC<TableRowAssetProps> = (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 {buildAssetUrl} = useS3MediaContext()\n\n const asset = item?.asset\n const error = item?.error\n const picked = item?.picked\n const updating = item?.updating\n\n const {onSelect} = useAssetSourceActions()\n\n const handleContextActionClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (onSelect) {\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, lastPicked, onSelect, picked, shiftPressed],\n )\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (onSelect) {\n onSelect([{kind: 'assetDocumentId', value: asset._id}])\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, lastPicked, onSelect, picked, 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 gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n gridRowGap: 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 ? (\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',\n transform: 'scale(0.8)',\n }}\n />\n )}\n </ContextActionContainer>\n\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 {(isS3FileAsset(asset) || isS3VideoAsset(asset)) && (\n <FileIcon asset={asset} extension={asset.extension} width=\"40px\" />\n )}\n\n {/* Image */}\n {isS3ImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard\n src={buildAssetUrl({assetId: asset._id, assetType: S3AssetType.IMAGE})}\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 {(isS3ImageAsset(asset) || isS3VideoAsset(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 id={id}>\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 {/* Error button */}\n {error && (\n <Card tone=\"critical\" 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 <WarningFilledIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Card>\n )}\n </Flex>\n </ContainerGrid>\n )\n}\n\nexport const TableRowAsset = memo(BaseTableRowAsset)\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\nexport const 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","/* eslint-disable no-empty */\nimport {white} from '@sanity/color'\nimport {Flex, Text} from '@sanity/ui'\nimport {type FC, type PropsWithChildren} from 'react'\nimport {type DropEvent, type DropzoneOptions, useDropzone} from 'react-dropzone'\nimport {useDispatch} from 'react-redux'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport {DropzoneDispatchProvider, useS3MediaOptionsContext} from '../../../contexts'\nimport {useAssetSourceActions} from '../../../contexts/S3AssetSourceDispatchContext'\nimport {useTypedSelector} from '../../../hooks'\nimport {notificationsActions, uploadsActions} from '../../../modules'\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 }\n\n return filteredFiles\n}\n\nexport const UploadDropzone: FC<PropsWithChildren> = (props) => {\n const {children} = props\n\n const {directUploads} = useS3MediaOptionsContext()\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] === S3AssetType.IMAGE\n const isVideoAssetType = assetTypes.length === 1 && assetTypes[0] === S3AssetType.VIDEO\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/*' : isVideoAssetType ? 'video/*' : '',\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 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","import {ChevronDownIcon, UploadIcon} from '@sanity/icons'\nimport {Menu, MenuButton, type MenuButtonProps, MenuGroup, type MenuGroupProps} from '@sanity/ui'\nimport {startCase, uniqueId} from 'lodash'\nimport {type ChangeEvent, type FC, type JSX, type MouseEvent, useCallback, useMemo} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport type {S3AssetSource} from '../../types'\nimport {Button, MenuItem} from '../UI'\n\nconst UPLOAD_DROP_DOWN_MENU_POPOVER: MenuButtonProps['popover'] = {portal: true} as const\nconst MENU_GROUP_POPOVER: MenuGroupProps['popover'] = {\n placement: 'right-start',\n fallbackPlacements: ['left-start', 'bottom', 'top'],\n}\nconst ASSET_SOURCE_DATA_ATTRIBUTE = 'data-asset-source-name'\n\ninterface UploadDropDownMenuProps {\n accept?: string\n assetSources: S3AssetSource[]\n capture?: 'user' | 'environment'\n directUploads?: boolean\n multiple?: boolean\n onSelectFiles?: (assetSource: S3AssetSource, files: File[]) => void\n readOnly?: boolean\n renderAsMenuGroup?: boolean\n}\n\nexport const UploadDropDownMenu: FC<UploadDropDownMenuProps> = (props) => {\n const {\n accept,\n assetSources,\n capture,\n directUploads,\n multiple,\n onSelectFiles,\n readOnly,\n renderAsMenuGroup = false,\n } = props\n const {t} = useTranslation()\n\n const uniqId = useMemo(() => uniqueId(), [])\n const uploadsDisabled = readOnly || directUploads === false\n\n const createAssetSourceInputId = useCallback(\n (assetSource: S3AssetSource) => {\n return `${uniqId}-${assetSource.name}-upload-button`\n },\n [uniqId],\n )\n\n // Needed for keyboard navigation (arrow keys + enter/space)\n const handleMenuItemClick = useCallback(\n (event: MouseEvent) => {\n const assetSourceName = event.currentTarget.getAttribute(ASSET_SOURCE_DATA_ATTRIBUTE)\n const assetSource = assetSources.find((source) => source.name === assetSourceName)\n if (!assetSource) {\n return\n }\n const element = document.getElementById(createAssetSourceInputId(assetSource))\n // Test for document.activeElement to avoid clicking the button twice\n if (element && document.activeElement !== element) {\n element.click()\n }\n },\n [assetSources, createAssetSourceInputId],\n )\n\n const renderMenuItemLabel = useCallback(\n (menuItemContent: JSX.Element) => {\n const assetSourceName = menuItemContent.props[ASSET_SOURCE_DATA_ATTRIBUTE]\n const assetSource = assetSources.find((source) => source.name === assetSourceName)\n if (!assetSource) {\n return menuItemContent\n }\n return <label htmlFor={createAssetSourceInputId(assetSource)}>{menuItemContent}</label>\n },\n [assetSources, createAssetSourceInputId],\n )\n\n const renderMenuItemForAssetSource = useCallback(\n (assetSource: S3AssetSource) => {\n const inputId = createAssetSourceInputId(assetSource)\n\n return (\n <MenuItem\n key={`${inputId}-menu-button`}\n {...{[ASSET_SOURCE_DATA_ATTRIBUTE]: assetSource.name}}\n disabled={uploadsDisabled}\n htmlFor={inputId}\n icon={assetSource.icon}\n onClick={handleMenuItemClick}\n renderMenuItem={renderMenuItemLabel}\n text={assetSource.title || startCase(assetSource.name)}\n />\n )\n },\n [createAssetSourceInputId, handleMenuItemClick, renderMenuItemLabel, uploadsDisabled],\n )\n\n const handleFileInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const assetSourceName = event.target.dataset.assetSourceName\n const assetSource = assetSources.find((source) => source.name === assetSourceName)\n if (!assetSource) {\n return\n }\n if (onSelectFiles && event.target.files) {\n onSelectFiles(assetSource, Array.from(event.target.files))\n }\n event.stopPropagation()\n event.preventDefault()\n },\n [assetSources, onSelectFiles],\n )\n\n const fileInputs = useMemo(() => {\n return assetSources.map((assetSource) => {\n const _id = createAssetSourceInputId(assetSource)\n return (\n <input\n key={_id}\n accept={accept}\n capture={capture}\n id={_id}\n data-asset-source-name={assetSource.name}\n multiple={multiple}\n onChange={handleFileInputChange}\n type=\"file\"\n value=\"\"\n style={{display: 'none'}}\n />\n )\n })\n }, [accept, assetSources, capture, createAssetSourceInputId, handleFileInputChange, multiple])\n\n if (assetSources && assetSources.length > 1) {\n const menuItems = assetSources.map((assetSource) => renderMenuItemForAssetSource(assetSource))\n\n if (renderAsMenuGroup) {\n return (\n <>\n <MenuGroup\n icon={UploadIcon}\n text={t('input.files.common.upload-placeholder.file-input-button.text')}\n popover={MENU_GROUP_POPOVER}\n >\n {menuItems}\n </MenuGroup>\n {fileInputs}\n </>\n )\n }\n return (\n <>\n <MenuButton\n id={`${uniqId}_upload-button`}\n button={\n <Button\n data-testid=\"file-input-upload-button-0\"\n icon={UploadIcon}\n iconRight={ChevronDownIcon}\n mode=\"bleed\"\n disabled={uploadsDisabled}\n text={t('input.files.common.upload-placeholder.file-input-button.text')}\n />\n }\n menu={<Menu>{menuItems}</Menu>}\n popover={UPLOAD_DROP_DOWN_MENU_POPOVER}\n />\n {fileInputs}\n </>\n )\n }\n\n return null\n}\n","import {\n AccessDeniedIcon,\n BinaryDocumentIcon,\n ImageIcon,\n ReadOnlyIcon,\n UploadIcon,\n} from '@sanity/icons'\nimport {Flex, Text, useElementSize} from '@sanity/ui'\nimport {get} from 'lodash'\nimport {type FC, type ReactNode, useCallback, useMemo, useState} from 'react'\nimport {type SchemaType} from 'sanity'\nimport {useTranslation} from 'sanity'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport type {S3AssetSource} from '../../types'\nimport {FileInputButton} from '../File/FileInputButton'\nimport {UploadDropDownMenu} from './UploadDropDownMenu'\n\ninterface UploadPlaceholderProps {\n assetSources: S3AssetSource[]\n browse: ReactNode | undefined\n directUploads: boolean | undefined\n onUpload: ((assetSource: S3AssetSource, files: File[]) => void) | undefined\n readOnly: boolean | undefined\n schemaType: SchemaType\n type: S3AssetType\n}\n\nconst RootFlex = styled(Flex)`\n pointer-events: none;\n`\n\nexport const UploadPlaceholder: FC<UploadPlaceholderProps> = (props) => {\n const {assetSources, browse, directUploads, onUpload, readOnly, schemaType, type} = props\n\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null)\n const rect = useElementSize(rootElement)\n\n // Adjust the layout in narrow containers\n const collapsed = rect?.border && rect.border.width < 440\n\n const isFileType = type === S3AssetType.FILE\n const isVideoType = type === S3AssetType.VIDEO\n\n const {t} = useTranslation()\n\n const assetSourcesWithUpload = useMemo(() => {\n const result: S3AssetSource[] = assetSources.filter((s) => Boolean(s.Uploader))\n\n return result\n }, [assetSources])\n\n const handleSelectFiles = useCallback(\n (assetSource: S3AssetSource, files: File[]) => {\n if (onUpload) {\n onUpload(assetSource, files)\n }\n },\n [onUpload],\n )\n\n const accept = get(\n schemaType,\n 'options.accept',\n isFileType ? '' : isVideoType ? 'video/*' : 'image/*',\n )\n\n const uploadButton = useMemo(() => {\n switch (assetSourcesWithUpload.length) {\n case 0:\n return null\n case 1:\n return (\n <FileInputButton\n accept={accept}\n disabled={readOnly || directUploads === false}\n icon={UploadIcon}\n mode=\"bleed\"\n onSelect={(files) => {\n if (onUpload) {\n onUpload(assetSourcesWithUpload[0], files)\n }\n }}\n text={t('input.files.common.upload-placeholder.file-input-button.text')}\n />\n )\n default:\n return (\n <UploadDropDownMenu\n accept={accept}\n assetSources={assetSourcesWithUpload}\n directUploads={directUploads}\n onSelectFiles={handleSelectFiles}\n readOnly={readOnly}\n />\n )\n }\n }, [accept, assetSourcesWithUpload, directUploads, handleSelectFiles, onUpload, readOnly, t])\n\n const messageIcon = useMemo(() => {\n if (readOnly) {\n return <ReadOnlyIcon />\n }\n\n if (directUploads === false) {\n return <AccessDeniedIcon />\n }\n\n if (isVideoType || isFileType) {\n return <BinaryDocumentIcon />\n }\n\n return <ImageIcon />\n }, [directUploads, isFileType, isVideoType, readOnly])\n\n const messageText = useMemo(() => {\n if (directUploads === false) {\n return \"Can't upload files here\"\n }\n\n if (readOnly) {\n return 'Read only'\n }\n\n return isVideoType\n ? 'Drag or paste video here'\n : isFileType\n ? 'Drag or paste file here'\n : 'Drag or paste image here'\n }, [directUploads, readOnly, isFileType, isVideoType])\n\n return assetSourcesWithUpload.length === 0 ? null : (\n <Flex\n align={collapsed ? undefined : 'center'}\n direction={collapsed ? 'column' : 'row'}\n gap={4}\n justify=\"space-between\"\n paddingY={collapsed ? 1 : undefined}\n ref={setRootElement}\n >\n <Flex flex={1}>\n <RootFlex align=\"center\" gap={3} justify=\"center\" paddingLeft={1}>\n <Text muted size={1}>\n {messageIcon}\n </Text>\n\n <Text size={1} muted>\n {messageText}\n </Text>\n </RootFlex>\n </Flex>\n\n <Flex align=\"center\" gap={1} justify=\"center\" wrap=\"wrap\">\n {uploadButton}\n {browse}\n </Flex>\n </Flex>\n )\n}\n","import {Card, Code, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport {type FC, useEffect} from 'react'\nimport {LinearProgress, Translate, type UploadState, useTranslation} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {STALE_UPLOAD_MS} from '../../constants'\nimport {Button} from '../UI'\n\nconst FlexWrapper = styled(Flex)`\n box-sizing: border-box;\n text-overflow: ellipsis;\n overflow: hidden;\n overflow: clip;\n`\n\nconst LeftSection = styled(Stack)`\n position: relative;\n width: 60%;\n`\n\nconst CodeWrapper = styled(Code)`\n position: relative;\n width: 100%;\n\n code {\n overflow: hidden;\n overflow: clip;\n text-overflow: ellipsis;\n position: relative;\n max-width: 200px;\n }\n`\n\ninterface UploadProgressProps {\n uploadState: UploadState\n onCancel?: () => void\n onStale?: () => void\n}\n\nconst elapsedMs = (date: string): number => new Date().getTime() - new Date(date).getTime()\n\nexport const UploadProgress: FC<UploadProgressProps> = (props) => {\n const {uploadState, onCancel, onStale} = props\n const filename = uploadState.file.name\n\n useEffect(() => {\n if (elapsedMs(uploadState.updatedAt) > STALE_UPLOAD_MS) {\n onStale?.()\n }\n }, [uploadState.updatedAt, onStale])\n\n const {t} = useTranslation()\n\n return (\n <Card tone=\"primary\" border>\n <FlexWrapper\n padding={4}\n align=\"center\"\n justify=\"space-between\"\n height=\"fill\"\n direction=\"row\"\n gap={2}\n >\n <LeftSection>\n <Flex justify=\"center\" gap={[3, 3, 2, 2]} direction={['column', 'column', 'row']}>\n <Text size={1}>\n <Inline space={2}>\n <Translate\n t={t}\n i18nKey=\"input.files.common.upload-progress\"\n components={{\n FileName: () => <CodeWrapper size={1}>{filename ? filename : '…'}</CodeWrapper>,\n }}\n />\n </Inline>\n </Text>\n </Flex>\n\n <Card border marginTop={3} radius={5}>\n <LinearProgress value={uploadState.progress} />\n </Card>\n </LeftSection>\n\n {onCancel ? (\n <Button\n mode=\"ghost\"\n onClick={onCancel}\n text={t('input.files.common.cancel-upload')}\n tone=\"critical\"\n />\n ) : null}\n </FlexWrapper>\n </Card>\n )\n}\n","import {Box, Flex, Stack, Text, useGlobalKeyDown} from '@sanity/ui'\nimport {type FC, type MouseEvent, useCallback} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport type {S3AssetSource} from '../../types'\nimport {Button, Dialog} from '../UI'\n\ninterface UploadDestinationPickerProps {\n assetSources: S3AssetSource[]\n onSelectAssetSource?: (source: S3AssetSource | null) => void\n onClose?: () => void\n text?: string\n}\n\nexport const UploadDestinationPicker: FC<UploadDestinationPickerProps> = (props) => {\n const {assetSources, onSelectAssetSource, text, onClose} = props\n\n const assetSourcesWithUpload = assetSources.filter((s) => Boolean(s.Uploader))\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n const target = event.currentTarget as HTMLElement\n const sourceName = target.getAttribute('data-asset-source-name') as string\n const assetSource = assetSources.find((source) => source.name === sourceName)\n if (assetSource && onSelectAssetSource) {\n onSelectAssetSource(assetSource)\n }\n },\n [assetSources, onSelectAssetSource],\n )\n\n useGlobalKeyDown((event) => {\n if (event.key === 'Escape') {\n if (onClose) {\n onClose()\n }\n }\n })\n\n if (assetSourcesWithUpload.length === 0) {\n return null\n }\n\n return (\n <Dialog\n onClickOutside={onClose}\n onClose={onClose}\n id=\"upload-destination-picker\"\n header={\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n }\n width={1}\n bodyHeight=\"stretch\"\n >\n <Box padding={2}>\n <Stack space={2}>\n {assetSourcesWithUpload.map((assetSource) => {\n const Icon = assetSource.icon\n return (\n <Button\n key={assetSource.name}\n data-asset-source-name={assetSource.name}\n mode=\"bleed\"\n onClick={handleClick}\n tone=\"default\"\n tooltipProps={null}\n >\n <Flex align=\"center\">\n {isValidElementType(Icon) && <Icon style={{fontSize: '2rem'}} />}\n <Box>\n <Text>{assetSource.title}</Text>\n </Box>\n </Flex>\n </Button>\n )\n })}\n </Stack>\n </Box>\n </Dialog>\n )\n}\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n type ClipboardEvent,\n type ComponentType,\n type DragEvent,\n type KeyboardEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport type {FileInfo} from '../../types'\nimport {imageUrlToBlob} from '../../utils'\n\nconst extractDroppedFiles = async (dataTransfer: DataTransfer): Promise<File[]> => {\n return Array.from(dataTransfer.files)\n}\n\nconst extractPastedFiles = async (clipboardData: DataTransfer): Promise<File[]> => {\n return Array.from(clipboardData.files)\n}\n\ntype CamelToKebab<S extends string> = S extends `${infer P1}${infer P2}`\n ? P2 extends Uncapitalize<P2>\n ? `${Lowercase<P1>}${CamelToKebab<P2>}`\n : `${Lowercase<P1>}-${CamelToKebab<Uncapitalize<P2>>}`\n : S\n\ntype DataAttribute<S extends string> = `data-${CamelToKebab<S>}`\n\nconst fileTargetDataAttribute: Record<DataAttribute<'isFileTarget'>, 'true'> = {\n 'data-is-file-target': 'true',\n}\n\n// this is a hack for Safari that reads pasted image(s) from an ContentEditable div instead of the onpaste event\nconst convertImagesToFilesAndClearContentEditable = (\n element: HTMLElement,\n targetFormat = 'image/jpeg',\n): Promise<File[]> => {\n if (!element.isContentEditable) {\n return Promise.reject(\n new Error(\n `Expected element to be contentEditable=\"true\". Instead found a non contenteditable ${element.tagName}`,\n ),\n )\n }\n return new Promise((resolve) => setTimeout(resolve, 10)) // add a delay so the paste event can finish\n .then(() => Array.from(element.querySelectorAll('img')))\n .then((imageElements) => {\n element.innerHTML = '' // clear\n return imageElements\n })\n .then((images) => Promise.all(images.map((img) => imageUrlToBlob(img.src))))\n .then((imageBlobs) =>\n imageBlobs.map((blob) => new File([blob!], 'pasted-image.jpg', {type: targetFormat})),\n )\n}\n\n// needed by Edge\nconst select = (el: Element) => {\n const range = document.createRange()\n range.selectNodeContents(el)\n const sel = window.getSelection()\n sel?.removeAllRanges()\n sel?.addRange(range)\n}\n\ntype Props = {\n onFiles?: (files: File[]) => void\n onFilesOver?: (files: FileInfo[]) => void\n onFilesOut?: () => void\n pasteTarget?: HTMLElement\n disabled?: boolean\n}\n\ntype ManagedProps =\n | 'onDrop'\n | 'onDragOver'\n | 'onPaste'\n | 'onDragEnter'\n | 'onDragLeave'\n | 'onKeyDown'\n\nconst PASTE_INPUT_STYLE = {opacity: 0, position: 'absolute'} as const\n\nexport function UploadFileTarget<ComponentProps>(Component: ComponentType<ComponentProps>) {\n // eslint-disable-next-line react/display-name\n return (props: Omit<ComponentProps, ManagedProps> & Props) => {\n const {onFiles, onFilesOver, onFilesOut, pasteTarget, disabled, ...rest} = props\n const [showPasteInput, setShowPasteInput] = useState(false)\n\n const pasteInput = useRef<HTMLDivElement | null>(null)\n const ref = useRef<HTMLElement | null>(null)\n\n const enteredElements = useRef<Element[]>([])\n\n const emitFiles = useCallback(\n (files: File[]) => {\n onFiles?.(files)\n },\n [onFiles],\n )\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (\n !pasteTarget &&\n event.target === ref.current &&\n (event.ctrlKey || event.metaKey) &&\n event.key === 'v'\n ) {\n setShowPasteInput(true)\n }\n },\n [pasteTarget],\n )\n\n const handlePaste = useCallback(\n (event: ClipboardEvent) => {\n void extractPastedFiles(event.clipboardData)\n .then((files) => {\n if (pasteTarget) {\n return files\n }\n if (!pasteInput.current) {\n return []\n }\n return files.length > 0\n ? files\n : // Invoke Safari hack if we didn't get any files\n convertImagesToFilesAndClearContentEditable(pasteInput.current, 'image/jpeg')\n })\n .then((files) => {\n emitFiles(files)\n if (!pasteTarget) {\n setShowPasteInput(false)\n ref.current?.focus()\n }\n })\n },\n [emitFiles, pasteTarget],\n )\n\n useEffect(() => {\n if (pasteTarget) {\n const pasteTargetElementListener = (event: globalThis.ClipboardEvent) => {\n // Some applications may put both text and files on the clipboard when content is copied (Word, Excel etc).\n // If we have both text and html on the clipboard, the intention is probably to paste text, so ignore the files.\n const hasHtml = !!event.clipboardData?.getData('text/html')\n const hasText = !!event.clipboardData?.getData('text/plain')\n if (hasHtml && hasText) {\n console.warn(\n 'Clipboard contains both text and HTML, ignoring additional file data on the clipboard.',\n )\n return\n }\n handlePaste(event as unknown as ClipboardEvent)\n }\n pasteTarget.addEventListener('paste', pasteTargetElementListener)\n return () => {\n pasteTarget.removeEventListener('paste', pasteTargetElementListener)\n }\n }\n return undefined\n }, [pasteTarget, handlePaste])\n\n const handleDrop = useCallback(\n (event: DragEvent) => {\n enteredElements.current = []\n\n event.preventDefault()\n event.stopPropagation()\n const dataTransfer = event.nativeEvent.dataTransfer\n\n if (onFiles && dataTransfer) {\n void extractDroppedFiles(dataTransfer).then((files) => {\n if (files) {\n emitFiles(files)\n }\n })\n }\n onFilesOut?.()\n },\n [emitFiles, onFiles, onFilesOut],\n )\n\n const handleDragOver = useCallback(\n (event: DragEvent) => {\n if (onFiles) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n [onFiles],\n )\n\n const handleDragEnter = useCallback(\n (event: DragEvent) => {\n const fileTypes = Array.from(event.dataTransfer.items).map((item) => ({\n type: item.type,\n kind: item.kind,\n }))\n\n event.stopPropagation()\n\n if (onFilesOver && ref.current === event.currentTarget) {\n /* this is a (hackish) work around to have the drag and drop work when the file is hovered back and forth over it\n as part of the refactor and adding more components to the \"hover\" state, it didn't recognise that it just kept adding the same\n element over and over, so when it tried to remove them on the handleDragLeave, it only removed the last instance.\n */\n enteredElements.current = [...new Set(enteredElements.current), event.currentTarget]\n\n onFilesOver(fileTypes)\n }\n },\n [onFilesOver],\n )\n\n const handleDragLeave = useCallback(\n (event: DragEvent) => {\n event.stopPropagation()\n const idx = enteredElements.current.indexOf(event.currentTarget)\n if (idx > -1) {\n enteredElements.current.splice(idx, 1)\n }\n if (enteredElements.current.length === 0) {\n onFilesOut?.()\n }\n },\n [onFilesOut],\n )\n\n const prevShowPasteInput = useRef(false)\n\n useEffect(() => {\n if (!prevShowPasteInput.current && showPasteInput && pasteInput.current) {\n pasteInput.current.focus()\n select(pasteInput.current) // Needed by Edge\n } else if (prevShowPasteInput.current && !showPasteInput) {\n pasteInput.current?.focus()\n }\n prevShowPasteInput.current = showPasteInput\n }, [pasteTarget, showPasteInput])\n\n return (\n <>\n <Component\n {...(rest as ComponentProps)}\n ref={ref}\n onKeyDown={disabled ? undefined : handleKeyDown}\n onDragOver={disabled ? undefined : handleDragOver}\n onDragEnter={disabled ? undefined : handleDragEnter}\n onDragLeave={disabled ? undefined : handleDragLeave}\n onDrop={disabled ? undefined : handleDrop}\n {...fileTargetDataAttribute}\n />\n\n {!disabled && showPasteInput && (\n <div contentEditable onPaste={handlePaste} ref={pasteInput} style={PASTE_INPUT_STYLE} />\n )}\n </>\n )\n }\n}\n","import {AccessDeniedIcon, UploadIcon} from '@sanity/icons'\nimport {Box, Card, type CardTone, Flex, Inline, Layer, Text, useToast} from '@sanity/ui'\nimport {uniqBy} from 'lodash'\nimport {type FC, type ReactNode, useCallback, useMemo, useRef, useState} from 'react'\nimport {type FileLike, type InputOnSelectFileFunctionProps, type SchemaType,useTranslation} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport type {FileInfo, S3AssetSource, S3FileSchemaType, S3ImageSchemaType} from '../../types'\nimport {accepts} from '../../utils'\nimport {UploadDestinationPicker} from './UploadDestinationPicker'\nimport {UploadFileTarget} from './UploadFileTarget'\n\ntype FileEntry = {\n file: File\n schemaType: SchemaType | null\n assetSource: S3AssetSource | null\n}\n\nconst StyledCard = styled(Card)`\n height: 100%;\n`\n\nconst Overlay = styled(Layer)`\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n top: -2px;\n left: -2px;\n right: -2px;\n bottom: -2px;\n background-color: var(--card-bg-color);\n opacity: 0.8;\n`\n\nconst Sticky = styled(Box)`\n position: sticky;\n top: 0;\n bottom: 0;\n margin: auto;\n`\n\nconst fileMatchesSchema = (\n file: FileLike,\n schemaType: S3FileSchemaType | S3ImageSchemaType,\n): boolean => {\n const accept = schemaType.options?.accept\n\n if (!accept) return true\n return accepts(file, accept)\n}\n\nconst getFilesAndAssetSources = ({\n files,\n schemaType,\n assetSources,\n directUploads,\n destinationName,\n}: {\n files: File[]\n schemaType: S3FileSchemaType | S3ImageSchemaType\n assetSources: S3AssetSource[]\n directUploads: boolean | undefined\n destinationName: string | null\n}): FileEntry[] => {\n if (!directUploads) {\n return files.map((file) => ({\n file,\n schemaType: null,\n assetSource: null,\n }))\n }\n\n const uploadSources = assetSources.filter((s) => Boolean(s.Uploader))\n\n return files.map((file) => {\n if (!fileMatchesSchema(file, schemaType)) {\n return {file, schemaType: null, assetSource: null}\n }\n\n const assetSource =\n uploadSources.find((source) => !destinationName || source.name === destinationName) ?? null\n\n return {\n file,\n schemaType: assetSource ? schemaType : null,\n assetSource,\n }\n })\n}\n\ntype UploadTargetCardProps = Parameters<typeof Card>['0'] & {\n directUploads: boolean | undefined\n assetSources: S3AssetSource[]\n schemaType: S3FileSchemaType | S3ImageSchemaType\n isReadOnly?: boolean\n onSetHoveringFiles?: (files: FileInfo[]) => void\n onSelectFile?: (\n props: Omit<InputOnSelectFileFunctionProps, 'assetSource'> & {assetSource: S3AssetSource},\n ) => void\n pasteTarget?: HTMLElement\n children?: ReactNode\n}\n\nconst Root = styled.div`\n position: relative;\n`\n\nexport const UploadTargetCard: FC<UploadTargetCardProps> = (props) => {\n const {\n schemaType,\n children,\n assetSources,\n isReadOnly,\n pasteTarget,\n onSelectFile,\n onSetHoveringFiles,\n tone: toneFromProps,\n directUploads,\n ...rest\n } = props\n\n const assetSourcesWithUpload = useMemo(\n () => assetSources.filter((source) => Boolean(source.Uploader)),\n [assetSources],\n )\n\n const FileTarget = UploadFileTarget(StyledCard)\n\n const {push: pushToast} = useToast()\n const {t} = useTranslation()\n\n const [filesToUpload, setFilesToUpload] = useState<File[]>([])\n const [showAssetSourceDestinationPicker, setShowAssetSourceDestinationPicker] = useState(false)\n const [tone, setTone] = useState<CardTone>(\n toneFromProps || (isReadOnly ? 'transparent' : 'default'),\n )\n\n const assetSourceDestinationName = useRef<string | null>(null)\n\n const alertRejectedFiles = useCallback(\n (rejected: FileEntry[]) => {\n pushToast({\n closable: true,\n status: 'warning',\n title: t('inputs.array.error.cannot-upload-unable-to-convert', {\n count: rejected.length,\n }),\n description: rejected.map((task, i) => (\n // oxlint-disable-next-line no-array-index-key\n <Flex key={i} gap={2} padding={2}>\n <Box>\n <Text weight=\"medium\">{task.file.name}</Text>\n </Box>\n <Box>\n <Text size={1}>({task.file.type})</Text>\n </Box>\n </Flex>\n )),\n })\n },\n [pushToast, t],\n )\n\n // This is called after the user has dropped or pasted files and selected an asset source destination (if applicable)\n const handleUploadFiles = useCallback(\n (files: File[]) => {\n const filesAndAssetSources = getFilesAndAssetSources({\n files,\n directUploads,\n schemaType,\n assetSources,\n destinationName: assetSourceDestinationName.current,\n })\n\n const ready = filesAndAssetSources.filter((entry) => entry.assetSource !== null)\n const rejected = filesAndAssetSources.filter((entry) => entry.assetSource === null)\n\n if (rejected.length > 0) {\n alertRejectedFiles(rejected)\n }\n\n if (onSelectFile) {\n ready.forEach((entry) => {\n onSelectFile({\n assetSource: entry.assetSource!,\n schemaType: entry.schemaType!,\n file: entry.file,\n })\n })\n }\n },\n [directUploads, schemaType, assetSources, onSelectFile, alertRejectedFiles],\n )\n\n // This is called when files are dropped or pasted onto the upload target. It may show the asset source destination picker if needed.\n const handleFiles = useCallback(\n (files: File[]) => {\n if (isReadOnly) {\n return\n }\n\n const filesAndAssetSources = getFilesAndAssetSources({\n files,\n schemaType,\n destinationName: assetSourceDestinationName.current,\n assetSources,\n directUploads,\n })\n\n const ready = filesAndAssetSources.filter((entry) => entry.assetSource !== null)\n\n if (ready.length === 0) {\n alertRejectedFiles(filesAndAssetSources)\n return\n }\n\n const uniqueAssetSources = uniqBy(assetSourcesWithUpload, 'name')\n if (uniqueAssetSources.length > 1 && !assetSourceDestinationName.current) {\n setShowAssetSourceDestinationPicker(true)\n setFilesToUpload(files)\n return\n }\n setShowAssetSourceDestinationPicker(false)\n setFilesToUpload([])\n handleUploadFiles(ready.map((entry) => entry.file))\n },\n [\n isReadOnly,\n schemaType,\n assetSources,\n directUploads,\n assetSourcesWithUpload,\n handleUploadFiles,\n alertRejectedFiles,\n ],\n )\n\n const [hoveringFiles, setHoveringFiles] = useState<FileInfo[]>([])\n\n const handleFilesOver = useCallback(\n (files: FileInfo[]) => {\n if (isReadOnly) {\n return\n }\n setHoveringFiles(files)\n\n const acceptedFiles = files.filter((file) => fileMatchesSchema(file, schemaType))\n\n const rejectedFilesCount = files.length - acceptedFiles.length\n\n if (rejectedFilesCount > 0) {\n setTone('critical')\n } else if (acceptedFiles.length > 0) {\n setTone('primary')\n } else {\n setTone('default')\n }\n\n if (onSetHoveringFiles) {\n onSetHoveringFiles(files)\n }\n },\n [isReadOnly, onSetHoveringFiles, schemaType],\n )\n\n const handleFilesOut = useCallback(() => {\n if (isReadOnly) {\n return\n }\n setHoveringFiles([])\n setTone('default')\n if (onSetHoveringFiles) {\n onSetHoveringFiles([])\n }\n setFilesToUpload([])\n }, [isReadOnly, onSetHoveringFiles])\n\n // Asset sources may be returned for multiple types (file, image), we need to deduplicate them in order to show a unique list\n const assetSourcesWithUploadByName = uniqBy(assetSourcesWithUpload, 'name')\n\n const handleSetAssetSourceDestination = useCallback(\n (assetSource: S3AssetSource | null) => {\n assetSourceDestinationName.current = assetSource?.name ?? null\n if (filesToUpload.length > 0 && assetSource) {\n handleUploadFiles(filesToUpload)\n }\n setFilesToUpload([])\n setShowAssetSourceDestinationPicker(false)\n assetSourceDestinationName.current = null\n },\n [filesToUpload, handleUploadFiles],\n )\n\n const handleUploadDestinationPickerClose = useCallback(() => {\n handleFilesOver([])\n setFilesToUpload([])\n setShowAssetSourceDestinationPicker(false)\n assetSourceDestinationName.current = null\n }, [handleFilesOver])\n\n const uploadDestinationPickerText = t(\n 'inputs.files.common.placeholder.select-asset-source-upload-destination',\n {\n context: schemaType.name,\n },\n )\n\n const acceptedFiles = hoveringFiles.filter((file) => fileMatchesSchema(file, schemaType))\n\n const rejectedFilesCount = hoveringFiles.length - acceptedFiles.length\n\n return (\n <Root>\n {showAssetSourceDestinationPicker && (\n <UploadDestinationPicker\n assetSources={assetSourcesWithUploadByName}\n onSelectAssetSource={handleSetAssetSourceDestination}\n onClose={handleUploadDestinationPickerClose}\n text={uploadDestinationPickerText}\n />\n )}\n\n <FileTarget\n {...rest}\n tone={toneFromProps || tone}\n onFiles={handleFiles}\n onFilesOver={handleFilesOver}\n onFilesOut={handleFilesOut}\n pasteTarget={pasteTarget}\n >\n {hoveringFiles.length > 0 && (\n <Overlay zOffset={10}>\n <Sticky paddingBottom={3} paddingTop={3}>\n {acceptedFiles.length > 0 ? (\n <>\n <Inline space={2}>\n <Text>\n <UploadIcon />\n </Text>\n {t('inputs.files.common.drop-message.drop-to-upload')}\n <Text />\n </Inline>\n\n {rejectedFilesCount > 0 && (\n <Box marginTop={4}>\n <Inline space={2}>\n <Text muted size={1}>\n <AccessDeniedIcon />\n </Text>\n <Text muted size={1}>\n {t(\n 'inputs.files.common.drop-message.drop-to-upload.rejected-file-message',\n {\n count: rejectedFilesCount,\n },\n )}\n </Text>\n </Inline>\n </Box>\n )}\n </>\n ) : (\n <Inline space={2}>\n <Text>\n <AccessDeniedIcon />\n </Text>\n <Text>\n {t('inputs.files.common.drop-message.drop-to-upload.no-accepted-file-message', {\n count: hoveringFiles.length,\n })}\n </Text>\n </Inline>\n )}\n </Sticky>\n </Overlay>\n )}\n {children}\n </FileTarget>\n </Root>\n )\n}\n"],"names":["useKeyPress","hotkey","onPress","$","_c","keyPressed","useRef","t0","e","isHotkey","current","downHandler","t1","Symbol","for","upHandler","t2","t3","window","addEventListener","removeEventListener","useEffect","useTypedSelector","useSelector","accepts","file","acceptedFiles","acceptedFilesArray","Array","isArray","split","fileName","name","mimeType","type","toLowerCase","baseMimeType","replace","some","validType","trim","charAt","endsWith","hashFile","from","arrayBuffer","then","buffer","crypto","subtle","digest","hash","Uint8Array","map","b","toString","padStart","join","imageUrlToBlob","imageUrl","format","quality","match","Promise","reject","Error","resolve","loader","Image","crossOrigin","referrerPolicy","onload","canvas","document","createElement","width","height","getContext","drawImage","toBlob","error","src","constructFilter","assetTypes","searchQuery","documentAssetTypes","groq","JSON","stringify","PREVIEW_WIDTH","createBlob","img","imageAspect","Math","max","err","console","warn","createImageEl","blobUrlLarge","URL","createObjectURL","revokeObjectURL","generatePreviewBlobUrl","imageEl","blob","generatePreviewBlobUrl$","of","pipe","mergeMap","getAssetResolution","asset","metadata","dimensions","SCHEME_COLORS","bg","dark","hues","gray","hex","light","bg2","inputEnabledBorder","studioTheme","color","default","input","enabled","border","inputHoveredBorder","hovered","mutedHoveredBg","primary","muted","mutedHoveredFg","fg","mutedSelectedBg","selected","spotBlue","spot","blue","getSchemeColor","scheme","colorKey","getUniqueDocuments","documents","draftIds","reduce","acc","doc","_id","startsWith","concat","slice","filter","includes","S3AssetType","UPLOAD_STATUS_KEY","STALE_UPLOAD_MS","SUPPORTED_ASSET_TYPES","FILE","IMAGE","VIDEO","ORDER_OPTIONS","direction","field","UNSET_UPLOAD_PATCH","unset","createUploadEvent","patches","CLEANUP_EVENT","createInitialUploadPatches","now","Date","toISOString","value","progress","createdAt","updatedAt","set","createInitialUploadEvent","DEFAULT_CONCURRENCY","remove","array","item","index","indexOf","splice","createThrottler","concurrency","currentSubscriptions","pendingObservables","ready$","Subject","request","observable","Observable","observer","length","scheduleAndWait$","subscribe","subscription","push","unsubscribe","next","shift","asObservable","first","obs","withMaxConcurrency","func","throttler","args","FONT_SIZE","SUBTITLE_FONT_SIZE","SubtitleText","styled","Text","PreviewWrapper","Box","MenuItem","forwardRef","ref","Icon","IconRight","__unstable_space","__unstable_subtitle","badgeText","childrenProp","disabled","hotkeys","renderMenuItem","rest","text","tooltipProps","children","icon","iconRight","preview","undefined","jsx","opacity","Flex","jsxs","isValidElement","isValidElementType","t4","Stack","t5","Hotkeys","marginTop","marginBottom","Badge","t6","menuItemContent","t7","t8","t9","t10","UIMenuItem","t11","content","t12","t13","Tooltip","LARGE_BUTTON_PROPS","space","padding","DEFAULT_BUTTON_PROPS","TooltipButtonWrapper","span","Button","paddingLeft","paddingY","size","mode","tone","sizeProps","UIButton","Dialog","bodyHeight","footer","props","zOffset","animate","t","useTranslation","confirmButton","cancelButton","description","onClose","UIDialog","FileButton","attrs","forwardedAs","css","FileInputButton","accept","capture","idProp","multiple","onSelect","id","useId","event","target","files","handleChange","FileMenuItem","FileInputMenuItem","DropzoneDispatchContext","createContext","DropzoneDispatchProvider","open","contextValue","useDropzoneActions","context","useContext","AssetSourceDispatchContext","AssetBrowserDispatchProvider","useAssetSourceActions","s3FileAssetIdPattern","s3ImageAssetIdPattern","s3VideoAssetIdPattern","s3FileAssetFilenamePattern","s3ImageAssetFilenamePattern","s3VideoAssetFilenamePattern","s3AssetFilenamePattern","s3AssetIdPattern","RegExp","s3InProgressAssetId","s3VideoExtensions","Set","UnresolvableError","unresolvable","constructor","inputSource","message","isUnresolvableError","Boolean","getForgivingResolver","method","isObject","obj","isReference","_ref","isS3AssetObjectStub","stub","isInProgressUpload","_upload","isS3FileAsset","_type","isS3ImageAsset","isS3VideoAsset","getFilename","raw","test","pathname","withoutQuery","withoutHash","parts","parseS3FileAssetId","documentId","exec","assetId","extension","parseS3ImageAssetId","widthString","heightString","Number","parseS3VideoAssetId","parseS3FileAssetFilename","filename","parseS3ImageAssetFilename","parseS3VideoAssetFilename","parseS3AssetFilename","has","isAbsoluteUrl","buildS3FilePath","buildS3FileUrl","options","baseUrl","buildS3ImagePath","buildS3ImageUrl","buildS3VideoPath","buildS3VideoUrl","isValidS3Filename","getS3UrlPath","urlOrPath","normalized","getS3UrlFilename","tryGetS3UrlFilename","MAX_CONCURRENT_UPLOADS","fetchExistingAsset","client","assetType","fetch","documentType","tag","getImageDimensions","subscriber","url","cleanup","complete","onerror","catchError","getVideoDimensions","video","removeAttribute","load","onloadedmetadata","videoWidth","videoHeight","preload","getFileExtension","segments","buildFileName","fileId","buildDocumentId","buildAssetDocument","storeOriginalFilename","baseDocument","originalFilename","sha1hash","aspectRatio","createCompleteEvent","exists","uploadAsset","s3Client","sanityClient","existing","assets","create","uploadS3Asset","ClientError","statusCode","res","extractErrorProps","Object","assign","ServerError","body","response","responseBody","stringifyBody","details","httpErrorMessage","bodyObj","sliceWithEllipsis","statusMessage","headers","str","createFetchClient","controller","AbortController","signal","execute","attemptNumber","timeoutMs","timeout","timeoutId","setTimeout","abort","fetchOptions","clearTimeout","json","catch","status","statusText","fromEntries","entries","maxRetries","delay","retryDelay","pow","defineHttpRequest","config","fetchClient","seen","tap","warnings","forEach","msg","shouldIgnoreWarning","ignoreWarnings","pattern","defineCreateClientExports","ClassConstructor","createClient","clientRequester","requester","validateAssetType","upload","validators","bucketRegion","bucketKey","getSignedUrlEndpoint","secret","fileSize","fileType","executeUpload","stage","percent","loaded","total","lengthComputable","signedUrlResponse","contentType","signedUrl","canParse","xhr","XMLHttpRequest","onprogress","overallPercent","setRequestHeader","send","deleteAsset","deleteEndpoint","executeDelete","fileKey","ok","ObservableAssetsClient","AssetsClient","lastValueFrom","ObservableS3Client","httpRequest","clone","newConfig","withConfig","thisConfig","S3Client","exp","createS3Client","credentialsNamespace","pluginConfigKeys","key","title","S3MediaContext","S3MediaContextProvider","isCredentialsDialogDismissed","setIsCredentialsDialogDismissed","useState","secrets","credentials","loading","isCredentialsLoading","useSecrets","isCredentialsDialogOpen","s3AssetBaseUrl","cloudfrontDomain","buildAssetUrl","SettingsView","useS3MediaContext","S3MediaOptionsContext","directUploads","S3MediaOptionsContextProvider","useS3MediaOptionsContext","ORDER_DICTIONARY","_createdAt","asc","desc","_updatedAt","getOrderTitle","order","initialState","query","searchSlice","createSlice","reducers","querySet","state","action","payload","searchActions","actions","searchReducer","reducer","UPLOADS_ACTIONS","uploadComplete","createAction","defaultOrder","allIds","byIds","fetchCount","fetching","fetchingError","lastPicked","pageIndex","pageSize","view","assetsSlice","extraReducers","builder","addCase","picked","updating","clear","deleteComplete","assetIds","deleteIndex","floor","deleteError","itemErrors","items","deleteRequest","keys","deleteSkipped","reason","fetchComplete","fetchError","fetchRequest","_action","prepare","params","queryFilter","selector","sort","insertUploads","results","listenerCreateQueue","_state","listenerCreateQueueComplete","listenerDeleteQueue","listenerDeleteQueueComplete","listenerUpdateQueue","listenerUpdateQueueComplete","loadNextPage","loadPageIndex","orderSet","pick","pickAll","pickClear","values","pickRange","startIndex","findIndex","startId","endIndex","endId","indices","a","tagA","tagB","updateComplete","updateError","updateRequest","viewSet","assetsActions","assetsDeleteEpic","action$","_state$","referenceResults","referenceMap","Map","referenceCount","blockedAssets","get","deletableAssets","blockedIds","deletableIds","blockedActions$","EMPTY","deleteRequests","deleteFlow$","forkJoin","delete","assetsFetchEpic","state$","withLatestFrom","switchMap","result","assetsFetchPageIndexEpic","start","end","documentAssetIds","constructedFilter","search","assetsFetchNextPageEpic","assetsFetchAfterDeleteAllEpic","nextPageIndex","assetsOrderSetEpic","assetsSearchEpic","ofType","debounceTime","assetsListenerCreateQueueEpic","bufferTime","assetsListenerDeleteQueueEpic","assetsListenerUpdateQueueEpic","assetsSortEpic","assetsUnpickEpic","assetsUpdateEpic","closeDialogId","formData","patch","setIfMissing","opt","commit","updatedAsset","selectAssetsByIds","selectAssetsAllIds","selectAssetById","createSelector","selectAssets","selectAssetsLength","selectAssetsPicked","selectAssetsPickedLength","assetsPicked","assetsReducer","dialogSlice","showConfirmDeleteAssets","suffix","pluralize","confirmCallbackAction","assetItem","confirmText","headerTitle","showAssetEdit","dialogClearOnAssetUpdateEpic","dialogActions","dialogReducer","uploadsSlice","checkRequest","checkComplete","blobUrl","objectUrl","previewReady","uploadCancel","uploadError","uploadRequest","uploadProgress","uploadHash","uploadStart","uploadItem","uploadsActions","uploadsAssetStartEpic","merge","takeUntil","v","throwError","empty","uploadsAssetUploadEpic","forceAsAssetType","uploads","uploadsCompleteQueueEpic","uploadsCheckRequestEpic","documentIds","resultHashes","checkedResults","selectUploadById","uploadId","uploadsReducer","notificationsSlice","add","notificationsAssetsDeleteCompleteEpic","deletedCount","notificationsAssetsDeleteErrorEpic","count","notificationsAssetsDeleteSkippedEpic","notificationsAssetsUploadCompleteEpic","notificationsGenericErrorEpic","notificationsActions","notificationsReducer","rootEpic","combineEpics","selectedSlice","selectedReducer","dialog","notifications","rootReducer","combineReducers","selectCombinedItems","uploadIds","assetItems","Container","FileIcon","onClick","assetUrl","ReactFileIcon","defaultStyles","$scheme","$showCheckerboard","GRID_TEMPLATE_COLUMNS","SMALL","LARGE","PANEL_HEIGHT","CardWrapper","CardContainer","$picked","theme","$updating","sanity","orange","ContextActionContainer","BaseCardAsset","useColorSchemeValue","shiftPressed","dispatch","useDispatch","_temp","state_0","stopPropagation","kind","handleAssetClick","e_0","handleContextActionClick","opacityContainer","opacityPreview","cursor","position","transition","left","top","CheckmarkCircleIcon","Spinner","EditIcon","flexShrink","Checkbox","pointerEvents","transform","t14","t15","t16","Card","right","WarningFilledIcon","t17","CardAsset","memo","CardUpload","filesize","base","round","percentLoaded","isComplete","isUploading","isQueued","handleCancelUpload","background","bottom","transformOrigin","CloseIcon","boxShadow","CARD_HEIGHT","CARD_WIDTH","VirtualCell","StyledItemContainer","div","StyledListContainer","AssetGridVirtualized","onLoadMore","selectedAssets","_temp2","selectedIds","totalCount","Item","List","index_0","item_0","overflowX","overflowY","VirtuosoGrid","TableHeaderItem","isActive","handleClick","display","whiteSpace","marginRight","ChevronUpIcon","ChevronDownIcon","Label","TableHeader","itemsLength","numPickedAssets","mediaIndex","useMediaIndex","allSelected","alignItems","borderBottom","gridColumnGap","gridTemplateColumns","letterSpacing","textTransform","visibility","zIndex","Grid","REFERENCE_COUNT_VISIBILITY_DELAY","ContainerGrid","$selected","BaseTableRowAsset","referenceCountVisible","setReferenceCountVisible","refCountVisibleTimeout","opacityCell","gridRowGap","gridTemplateRows","gridColumn","gridRowStart","gridRowEnd","justifyContent","t18","t19","t20","t21","t22","t23","t24","t25","gridRow","t26","lineHeight","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","t44","t45","t46","t47","t48","t49","t50","t51","t52","t53","formatRelative","t54","t55","t56","t57","t58","t59","WithReferringDocuments","Fragment","t60","t61","t62","t63","t64","t65","t66","TableRowAsset","isLoading","referringDocuments","uniqueDocuments","customScrollbar","GlobalStyle","createGlobalStyle","UploadContainer","DragActiveContainer","filterFiles","fileList","filteredFiles","UploadDropzone","isImageAssetType","isVideoAssetType","handleDrop","rejections","flatMap","_temp3","handleDropRejected","dataTransfer","handleFileGetter","getFilesFromEvent","noClick","noDrag","onDrop","onDropRejected","getRootProps","getInputProps","isDragActive","useDropzone","white","code","errors","UPLOAD_DROP_DOWN_MENU_POPOVER","portal","MENU_GROUP_POPOVER","placement","fallbackPlacements","ASSET_SOURCE_DATA_ATTRIBUTE","UploadDropDownMenu","assetSources","onSelectFiles","readOnly","renderAsMenuGroup","uniqueId","uniqId","uploadsDisabled","assetSource","createAssetSourceInputId","assetSourceName","currentTarget","getAttribute","assetSource_0","find","source","element","getElementById","activeElement","click","handleMenuItemClick","assetSourceName_0","assetSource_1","source_0","renderMenuItemLabel","assetSource_2","inputId","startCase","renderMenuItemForAssetSource","event_0","assetSourceName_1","dataset","assetSource_3","source_1","preventDefault","handleFileInputChange","assetSource_4","fileInputs","assetSource_5","menuItems","MenuGroup","UploadIcon","Menu","MenuButton","RootFlex","UploadPlaceholder","browse","onUpload","schemaType","rootElement","setRootElement","rect","useElementSize","collapsed","isFileType","isVideoType","assetSourcesWithUpload","handleSelectFiles","bb0","files_0","uploadButton","bb1","ReadOnlyIcon","AccessDeniedIcon","BinaryDocumentIcon","ImageIcon","messageIcon","bb2","messageText","s","Uploader","FlexWrapper","LeftSection","CodeWrapper","Code","elapsedMs","date","getTime","UploadProgress","uploadState","onCancel","onStale","FileName","Inline","Translate","LinearProgress","UploadDestinationPicker","onSelectAssetSource","sourceName","useGlobalKeyDown","T0","T1","T2","fontSize","extractDroppedFiles","extractPastedFiles","clipboardData","fileTargetDataAttribute","convertImagesToFilesAndClearContentEditable","targetFormat","isContentEditable","querySelectorAll","imageElements","innerHTML","images","all","imageBlobs","File","tagName","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","PASTE_INPUT_STYLE","UploadFileTarget","Component","onFiles","onFilesOver","onFilesOut","pasteTarget","showPasteInput","setShowPasteInput","pasteInput","enteredElements","emitFiles","useCallback","handleKeyDown","ctrlKey","metaKey","handlePaste","focus","pasteTargetElementListener","hasHtml","getData","hasText","nativeEvent","handleDragOver","handleDragEnter","fileTypes","handleDragLeave","idx","prevShowPasteInput","StyledCard","Overlay","Layer","Sticky","fileMatchesSchema","getFilesAndAssetSources","destinationName","uploadSources","Root","UploadTargetCard","isReadOnly","onSelectFile","onSetHoveringFiles","toneFromProps","FileTarget","pushToast","useToast","filesToUpload","setFilesToUpload","showAssetSourceDestinationPicker","setShowAssetSourceDestinationPicker","setTone","assetSourceDestinationName","rejected","closable","alertRejectedFiles","filesAndAssetSources","ready","rejected_0","_temp4","entry_1","entry","handleUploadFiles","filesAndAssetSources_0","ready_0","_temp5","uniqBy","_temp6","handleFiles","hoveringFiles","setHoveringFiles","files_1","handleFilesOver","handleFilesOut","assetSourcesWithUploadByName","handleSetAssetSourceDestination","handleUploadDestinationPickerClose","uploadDestinationPickerText","file_0","acceptedFiles_0","rejectedFilesCount_0","rejectedFilesCount","task","i","entry_0","entry_2","entry_3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../src/hooks/useKeyPress.ts","../../src/hooks/useTypedSelector.ts","../../src/utils/accepts.ts","../../src/utils/file/hashFile.ts","../../src/utils/imageUrlToBlob.ts","../../src/utils/mediaBrowser/constructFilter.ts","../../src/utils/mediaBrowser/generatePreviewBlobUrl.ts","../../src/utils/mediaBrowser/getAssetResolution.ts","../../src/utils/mediaBrowser/getSchemeColor.ts","../../src/utils/mediaBrowser/getUniqueDocuments.ts","../../packages/types/src/asset.ts","../../src/constants.ts","../../src/utils/upload.ts","../../src/utils/withMaxConcurrency.ts","../../src/components/UI/MenuItem.tsx","../../src/components/UI/Button.tsx","../../src/components/UI/Dialog.tsx","../../src/components/File/FileInputButton.tsx","../../src/components/File/FileInputMenuItem.tsx","../../src/contexts/DropzoneDispatchContext.tsx","../../src/contexts/S3AssetSourceDispatchContext.tsx","../../packages/asset-utils/src/constants.ts","../../packages/asset-utils/src/errors.ts","../../packages/asset-utils/src/utils.ts","../../packages/asset-utils/src/asserters.ts","../../packages/asset-utils/src/parse.ts","../../packages/asset-utils/src/paths.ts","../../src/lib/S3AssetSource/assets.ts","../../src/utils/isObject.ts","../../src/lib/S3Client/http/errors.ts","../../src/lib/S3Client/http/fetchClient.ts","../../src/lib/S3Client/http/request.ts","../../src/lib/S3Client/defineCreateClient.ts","../../src/lib/S3Client/validators.ts","../../src/lib/S3Client/assets/AssetsClient.ts","../../src/lib/S3Client/S3Client.ts","../../src/lib/S3Client/createS3Client.ts","../../src/contexts/S3MediaContext.tsx","../../src/contexts/S3MediaOptionsContext.tsx","../../src/config/orders.ts","../../src/modules/search/store.ts","../../src/modules/uploads/actions.ts","../../src/modules/assets/store.ts","../../src/modules/dialog/store.ts","../../src/modules/uploads/store.ts","../../src/modules/notifications/store.ts","../../src/modules/rootEpic.ts","../../src/modules/selected/store.ts","../../src/modules/rootReducer.ts","../../src/modules/selectors.ts","../../src/components/MediaBrowser/FileIcon/FileIcon.tsx","../../src/components/MediaBrowser/Image/Image.tsx","../../src/components/MediaBrowser/constants.ts","../../src/components/MediaBrowser/CardAsset/CardAsset.tsx","../../src/components/MediaBrowser/CardUpload/CardUpload.tsx","../../src/components/MediaBrowser/AssetGridVirtualized/AssetGridVirtualized.tsx","../../src/components/MediaBrowser/TableHeaderItem/TableHeaderItem.tsx","../../src/components/MediaBrowser/TableHeader/TableHeader.tsx","../../src/components/MediaBrowser/TableRowAsset/TableRowAsset.tsx","../../src/components/MediaBrowser/styled/GlobalStyles/GlobalStyle.tsx","../../src/components/MediaBrowser/UploadDropzone/UploadDropzone.tsx","../../src/components/Upload/UploadDropDownMenu.tsx","../../src/components/Upload/UploadPlaceholder.tsx","../../src/components/Upload/UploadProgress.tsx","../../src/components/Upload/UploadDestinationPicker.tsx","../../src/components/Upload/UploadFileTarget.tsx","../../src/components/Upload/UploadTargetCard.tsx"],"sourcesContent":["import {isHotkey} from 'is-hotkey'\nimport {type RefObject, useCallback, useEffect, useRef} from 'react'\n\nexport const 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","import {type TypedUseSelectorHook, useSelector} from 'react-redux'\n\nimport type {RootReducerState} from '../types'\n\nexport const useTypedSelector: TypedUseSelectorHook<RootReducerState> = useSelector\n","import {type FileLike} from 'sanity'\n\n/**\n * Check if the provided file type should be accepted by the input with accept attribute.\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input#attr-accept\n *\n * Inspired by https://github.com/enyo/dropzone (MIT) (c) 2021 Matias Meno\n * Based on https://github.com/react-dropzone/attr-accept (MIT) (c) 2015 Andrey Okonetchnikov\n *\n * @param file - https://developer.mozilla.org/en-US/docs/Web/API/File\n * @param acceptedFiles - List of accepted mime types (comma-separated string or array)\n * @returns True if file is accepted, false otherwise\n */\nexport function accepts(file: FileLike, acceptedFiles: string | string[]): boolean {\n if (!file || !acceptedFiles) {\n return true\n }\n\n const acceptedFilesArray = Array.isArray(acceptedFiles)\n ? acceptedFiles // eg `['image/png', 'image/jpeg']`\n : acceptedFiles.split(',') // eg `image/png,image/jpeg`\n\n const fileName = file.name || ''\n const mimeType = (file.type || '').toLowerCase()\n const baseMimeType = mimeType.replace(/\\/.*$/, '')\n\n return acceptedFilesArray.some((type) => {\n const validType = type.trim().toLowerCase()\n\n if (validType.charAt(0) === '.') {\n if (fileName) {\n return fileName.toLowerCase().endsWith(validType)\n }\n // If we do not have a valid fileName and validType is an extension, we\n // should fail open. This happens because when hovering a file, the browser\n // does not pass the name of the file but it will pass the file name when the\n // file is dropped on the file upload input\n return true\n }\n\n if (validType.endsWith('/*')) {\n // This is something like a image/* mime type\n return baseMimeType === validType.replace(/\\/.*$/, '')\n }\n\n return mimeType === validType\n })\n}\n","import {from, type Observable} from 'rxjs'\n\nexport const hashFile = (file: File): Observable<string> => {\n return from(\n file.arrayBuffer().then((buffer) => {\n return crypto.subtle.digest('SHA-1', buffer).then((hash) => {\n const hashArray = Array.from(new Uint8Array(hash))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n })\n }),\n )\n}\n","export function imageUrlToBlob(\n imageUrl: string,\n format = 'image/jpeg',\n quality = 1,\n): Promise<Blob | null> {\n if (imageUrl.match(/^webkit-fake-url:\\/\\//)) {\n return Promise.reject(new Error('Cannot read image contents from webkit fake url'))\n }\n\n return new Promise((resolve, reject) => {\n const loader = new Image()\n\n loader.crossOrigin = 'anonymous'\n loader.referrerPolicy = 'strict-origin-when-cross-origin'\n loader.onload = () => {\n const canvas = document.createElement('canvas')\n\n canvas.width = loader.width\n canvas.height = loader.height\n const ctx = canvas.getContext('2d')\n\n ctx?.drawImage(loader, 0, 0, canvas.width, canvas.height)\n try {\n canvas.toBlob(resolve, format, quality)\n } catch (error) {\n reject(error)\n }\n }\n loader.src = imageUrl\n })\n}\n","import groq from 'groq'\nimport type {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nexport const constructFilter = ({\n assetTypes,\n searchQuery,\n}: {\n assetTypes: S3AssetType[]\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) => `${type}Asset`)\n\n const baseFilter = groq`\n _type in ${JSON.stringify(documentAssetTypes)} && !(_id in path(\"drafts.**\"))\n `\n\n // Join separate filter fragments\n const constructedQuery = [\n // Base filter\n baseFilter,\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 ].join(' && ')\n\n return constructedQuery\n}\n","import {from, Observable, 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 resolve(null)\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 type {S3ImageAsset, S3VideoAsset} from 'sanity-plugin-s3-media-types'\n\nexport const getAssetResolution = (asset: S3ImageAsset | S3VideoAsset): string => {\n return `${asset.metadata.dimensions.width}x${asset.metadata.dimensions.height}px`\n}\n","import {hues} from '@sanity/color'\nimport {studioTheme, type ThemeColorSchemeKey} from '@sanity/ui'\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: studioTheme.color.dark.default.input.default.enabled.border,\n light: studioTheme.color.light.default.input.default.enabled.border,\n },\n inputHoveredBorder: {\n dark: studioTheme.color.dark.default.input.default.hovered.border,\n light: studioTheme.color.light.default.input.default.hovered.border,\n },\n mutedHoveredBg: {\n dark: studioTheme.color.dark.primary.muted.primary.hovered.bg,\n light: studioTheme.color.light.primary.muted.primary.hovered.bg,\n },\n mutedHoveredFg: {\n dark: studioTheme.color.dark.primary.muted.primary.hovered.fg,\n light: studioTheme.color.light.primary.muted.primary.hovered.fg,\n },\n mutedSelectedBg: {\n dark: studioTheme.color.dark.primary.muted.primary.selected.bg,\n light: studioTheme.color.light.primary.muted.primary.selected.bg,\n },\n spotBlue: {\n dark: studioTheme.color.dark.primary.spot.blue,\n light: studioTheme.color.light.primary.spot.blue,\n },\n}\n\ntype SchemeColorKey = keyof typeof SCHEME_COLORS\n\nexport function getSchemeColor(scheme: ThemeColorSchemeKey, colorKey: SchemeColorKey): string {\n return SCHEME_COLORS[colorKey]?.[scheme]\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","/** @internal */\ninterface SanityDocument {\n _id: string\n _type: string\n _createdAt: string\n _updatedAt: string\n _rev: string\n [key: string]: unknown\n}\n\n/** @public */\nexport interface S3AssetDocument extends SanityDocument {\n _id: string\n _type: 's3FileAsset' | 's3ImageAsset' | 's3VideoAsset'\n assetId: string\n extension: string\n mimeType: string\n sha1hash: string\n size: number\n originalFilename?: string\n}\n\n/** @public */\nexport type S3FileAsset = S3AssetDocument & {_type: 's3FileAsset'}\n\n/** @public */\nexport type S3ImageAsset = S3AssetDocument & {_type: 's3ImageAsset'; metadata: S3ImageMetaData}\n\n/** @public */\nexport type S3VideoAsset = S3AssetDocument & {_type: 's3VideoAsset'; metadata: S3VideoMetaData}\n\n/** @public */\nexport type S3Asset = S3FileAsset | S3ImageAsset | S3VideoAsset\n\n/** @public */\nexport enum S3AssetType {\n FILE = 's3File',\n IMAGE = 's3Image',\n VIDEO = 's3Video',\n}\n\n/** @internal */\ninterface S3ImageDimensions {\n _type: 's3ImageDimensions'\n height: number\n width: number\n aspectRatio: number\n}\n\n/** @internal */\ninterface S3ImageMetaData {\n _type: 's3ImageMetadata'\n dimensions: S3ImageDimensions\n}\n\n/** @internal */\ninterface S3VideoDimensions {\n _type: 's3VideoDimensions'\n height: number\n width: number\n aspectRatio: number\n}\n\n/** @internal */\ninterface S3VideoMetaData {\n _type: 's3VideoMetadata'\n dimensions: S3VideoDimensions\n}\n","import {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport type {Order} from './types/browser'\n\nexport const UPLOAD_STATUS_KEY = '_upload'\nexport const STALE_UPLOAD_MS = 1000 * 60 * 2\n\nexport const SUPPORTED_ASSET_TYPES = [S3AssetType.FILE, S3AssetType.IMAGE, S3AssetType.VIDEO]\n\nexport const ORDER_OPTIONS: (Order | null)[] = [\n {\n direction: 'desc',\n field: '_createdAt',\n },\n {\n direction: 'asc',\n field: '_createdAt',\n },\n null,\n {\n direction: 'desc',\n field: '_updatedAt',\n },\n {\n direction: 'asc',\n field: '_updatedAt',\n },\n null,\n {\n direction: 'asc',\n field: 'originalFilename',\n },\n {\n direction: 'desc',\n field: 'originalFilename',\n },\n null,\n {\n direction: 'desc',\n field: 'size',\n },\n {\n direction: 'asc',\n field: 'size',\n },\n]\n","import {type FormPatch, set, unset, type UploadProgressEvent} from 'sanity'\n\nimport {UPLOAD_STATUS_KEY} from '../constants'\n\nconst UNSET_UPLOAD_PATCH = unset([UPLOAD_STATUS_KEY])\n\nexport function createUploadEvent(patches: FormPatch[] = []): UploadProgressEvent {\n return {\n type: 'uploadProgress',\n patches,\n }\n}\n\nexport const CLEANUP_EVENT = createUploadEvent([UNSET_UPLOAD_PATCH])\n\nexport const createInitialUploadPatches = (file: File) => {\n const now = new Date().toISOString()\n const value = {\n progress: 2,\n createdAt: now,\n updatedAt: now,\n file: {name: file.name, type: file.type},\n }\n\n return [set(value, [UPLOAD_STATUS_KEY])]\n}\n\nexport const createInitialUploadEvent = (file: File) => {\n return createUploadEvent(createInitialUploadPatches(file))\n}\n","// Takes a observable-returning function and returns a new function that limits on the number of\n// concurrent observables.\nimport {Observable, Subject, Subscription} from 'rxjs'\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\nconst createThrottler = <T>(concurrency: number = DEFAULT_CONCURRENCY) => {\n const currentSubscriptions: Array<Subscription> = []\n const pendingObservables: Array<Observable<T>> = []\n const ready$ = new Subject<Observable<T>>()\n\n function request(observable: Observable<T>): Observable<T> {\n return new Observable((observer) => {\n if (currentSubscriptions.length >= concurrency) {\n return scheduleAndWait$(observable).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 // We check length > 0, so shift() will not return undefined here\n ready$.next(pendingObservables.shift()!)\n }\n }\n })\n }\n\n function scheduleAndWait$(observable: Observable<T>): Observable<T> {\n pendingObservables.push(observable)\n return ready$.asObservable().pipe(\n first((obs) => obs === observable),\n mergeMap((obs) => obs), // Unwrap Observable<Observable<T>> to Observable<T>\n )\n }\n\n return request\n}\n\nexport const withMaxConcurrency = <A extends any[], R>(\n func: (...args: A) => Observable<R>,\n concurrency: number = DEFAULT_CONCURRENCY,\n): ((...args: A) => Observable<R>) => {\n const throttler = createThrottler<R>(concurrency)\n return (...args: A) => throttler(func(...args))\n}\n","import {\n Badge,\n Box,\n Flex,\n Hotkeys,\n MenuItem as UIMenuItem,\n type MenuItemProps as UIMenuItemProps,\n Stack,\n Text,\n Tooltip,\n type TooltipProps,\n} from '@sanity/ui'\nimport {\n forwardRef,\n type HTMLProps,\n isValidElement,\n type JSX,\n type ReactNode,\n type Ref,\n useMemo,\n} from 'react'\nimport {isValidElementType} from 'react-is'\nimport {styled} from 'styled-components'\n\nconst FONT_SIZE = 1\nconst SUBTITLE_FONT_SIZE = 0\n\n/* Using px value here to make title/subtitles align with icon */\nconst SubtitleText = styled(Text)`\n margin-top: 2px;\n`\n\n/** @internal */\ntype MenuItemProps = Pick<\n UIMenuItemProps,\n 'as' | 'icon' | 'iconRight' | 'pressed' | 'selected' | 'tone' | 'hotkeys'\n> & {\n badgeText?: string\n /**\n * Usage of `children` is not supported, import `MenuItem` from `@sanity/ui` instead.\n */\n children?: undefined\n /**\n * Previews should be 25x25.\n */\n preview?: ReactNode\n /**\n * Optional render callback which receives menu item content.\n */\n renderMenuItem?: (menuItemContent: JSX.Element) => ReactNode\n text?: string\n tooltipProps?: TooltipProps | null\n /**\n * Optional subtitle prop for the menu item.\n * While not recommended, it is utilized for the workspace menu button.\n */\n __unstable_subtitle?: string\n /**\n * An optional property to adjust spacing in the preview between the icon and the text.\n * Not recommended, but is applied to the workspace menu button..\n */\n __unstable_space?: number\n}\n\nconst PreviewWrapper = styled(Box)`\n height: 25px;\n width: 25px;\n overflow: hidden;\n`\n\n/**\n * Customized Sanity UI <MenuItem> that restricts usage of `children` to encourage simple,\n * single line menu items.\n *\n * The workspace menu button needed a subtitle - hence, the StudioUI MenuIten now takes a subtitle prop.\n * This is only an escape hatch for the workspace menu button and is not recommended for general use.\n *\n * It also accepts a prop to attach tooltips as well as custom badges too.\n *\n * @internal\n */\nexport const MenuItem = forwardRef(function MenuItem(\n {\n badgeText,\n children: childrenProp,\n disabled,\n hotkeys,\n icon: Icon,\n iconRight: IconRight,\n preview = null,\n renderMenuItem,\n text,\n tooltipProps,\n __unstable_subtitle,\n __unstable_space,\n ...rest\n }: MenuItemProps &\n Omit<HTMLProps<HTMLDivElement>, 'as' | 'height' | 'ref' | 'selected' | 'tabIndex' | 'size'>,\n ref: Ref<HTMLDivElement>,\n) {\n const menuItemContent = useMemo(() => {\n return (\n <Flex align=\"center\" gap={2}>\n {preview && (\n <PreviewWrapper\n style={{opacity: disabled ? 0.25 : undefined}}\n paddingRight={__unstable_space ? 1 : 0}\n >\n <Flex align=\"center\" height=\"fill\" justify=\"center\">\n {preview}\n </Flex>\n </PreviewWrapper>\n )}\n {Icon && (\n <Box paddingRight={1}>\n <Text size={FONT_SIZE}>\n {isValidElement(Icon) && Icon}\n {isValidElementType(Icon) && <Icon />}\n </Text>\n </Box>\n )}\n {text && (\n <Stack flex={1} space={__unstable_subtitle ? 1 : 2}>\n <Text size={FONT_SIZE} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n {__unstable_subtitle && (\n <SubtitleText size={SUBTITLE_FONT_SIZE} textOverflow=\"ellipsis\" weight=\"medium\" muted>\n {__unstable_subtitle}\n </SubtitleText>\n )}\n </Stack>\n )}\n {(badgeText || hotkeys || IconRight) && (\n <Flex align=\"center\" gap={3} marginLeft={3}>\n {hotkeys && <Hotkeys keys={hotkeys} style={{marginTop: -4, marginBottom: -4}} />}\n\n {badgeText && (\n <Badge fontSize={0} style={{marginTop: -4, marginBottom: -4}}>\n {badgeText}\n </Badge>\n )}\n\n {IconRight && (\n <Text size={FONT_SIZE}>\n {isValidElement(IconRight) && IconRight}\n {isValidElementType(IconRight) && <IconRight />}\n </Text>\n )}\n </Flex>\n )}\n </Flex>\n )\n }, [\n preview,\n disabled,\n __unstable_space,\n Icon,\n text,\n __unstable_subtitle,\n badgeText,\n hotkeys,\n IconRight,\n ])\n\n const children = (\n <UIMenuItem\n disabled={disabled}\n paddingLeft={preview ? 1 : 3}\n paddingRight={3}\n paddingY={preview ? 1 : 3}\n ref={ref}\n {...rest}\n >\n {typeof childrenProp === 'undefined' && typeof renderMenuItem === 'function'\n ? renderMenuItem(menuItemContent)\n : menuItemContent}\n </UIMenuItem>\n )\n\n if (tooltipProps) {\n return (\n <Tooltip content={tooltipProps?.content} portal {...tooltipProps}>\n {/* This div is needed to make the tooltip work in disabled menu items */}\n <div>{children}</div>\n </Tooltip>\n )\n }\n\n return children\n})\n","import {\n Button as UIButton,\n type ButtonProps as UIButtonProps,\n Tooltip,\n type TooltipProps,\n} from '@sanity/ui'\nimport {type ForwardedRef, forwardRef, type HTMLProps} from 'react'\nimport {styled} from 'styled-components'\n\ntype BaseButtonProps = Pick<\n UIButtonProps,\n | 'as'\n | 'icon'\n | 'iconRight'\n | 'justify'\n | 'loading'\n | 'mode'\n | 'paddingY'\n | 'paddingLeft'\n | 'selected'\n | 'tone'\n | 'type'\n | 'width'\n> & {\n size?: 'default' | 'large'\n radius?: 'full'\n}\n\ntype ButtonWithText = {\n text: string\n tooltipProps?: TooltipProps | null\n icon?: UIButtonProps['icon']\n}\n\ntype IconButton = {\n text?: undefined\n icon?: UIButtonProps['icon']\n /**\n * When using a button with an icon, tooltipProps are required to enforce consistency in UI.\n */\n tooltipProps: TooltipProps | null\n}\n\n/** @internal */\nexport type ButtonProps = BaseButtonProps & (ButtonWithText | IconButton)\n\nconst LARGE_BUTTON_PROPS = {\n space: 3,\n padding: 3,\n}\nconst DEFAULT_BUTTON_PROPS = {\n space: 2,\n padding: 2,\n}\n\nconst TooltipButtonWrapper = styled.span`\n display: inline-flex;\n`\n\nexport const Button = forwardRef(function Button(\n {\n size = 'default',\n mode = 'default',\n paddingY,\n paddingLeft,\n tone = 'default',\n tooltipProps,\n ...rest\n }: ButtonProps & Omit<HTMLProps<HTMLButtonElement>, 'as' | 'size' | 'title'>,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const sizeProps = size === 'default' ? DEFAULT_BUTTON_PROPS : LARGE_BUTTON_PROPS\n\n const children = (\n <UIButton\n {...rest}\n {...sizeProps}\n paddingY={paddingY}\n paddingLeft={paddingLeft}\n ref={ref}\n mode={mode}\n tone={tone}\n />\n )\n\n if (tooltipProps) {\n return (\n <Tooltip content={tooltipProps?.content} portal {...tooltipProps}>\n {/* This span is needed to make the tooltip work in disabled buttons */}\n <TooltipButtonWrapper>{children}</TooltipButtonWrapper>\n </Tooltip>\n )\n }\n\n return children\n})\n","import {\n Box,\n type BoxHeight,\n Button as UIButton,\n Dialog as UIDialog,\n type DialogProps as UIDialogProps,\n Flex,\n Text,\n} from '@sanity/ui'\nimport {type ComponentProps, forwardRef, type HTMLProps, type ReactNode, type Ref} from 'react'\nimport {useTranslation} from 'sanity'\n\ntype DialogProps = Pick<\n UIDialogProps,\n | '__unstable_autoFocus'\n | '__unstable_hideCloseButton'\n | 'animate'\n | 'contentRef'\n | 'header'\n | 'id'\n | 'onActivate'\n | 'onClickOutside'\n | 'onClose'\n | 'portal'\n | 'position'\n | 'scheme'\n | 'width'\n> & {\n /**\n * Dialog body height.\n * Set this to 'fill' (i.e. 100%) if you want overflow body content to be contained\n * and not trigger dynamic border visibility.\n */\n bodyHeight?: BoxHeight\n children?: ReactNode\n zOffset?: number\n footer?: {\n cancelButton?: Omit<ComponentProps<typeof UIButton>, 'fontSize' | 'padding'>\n confirmButton?: Omit<ComponentProps<typeof UIButton>, 'fontSize' | 'padding'>\n /**\n * Description to be displayed side by side with the buttons.\n */\n description?: string\n }\n /**\n * If enabled, removes all default padding from dialog content.\n */\n padding?: boolean\n}\n\n/**\n * Customized Sanity UI <Dialog> that enforces an opinionated footer layout with a max of two buttons (confirm and cancel).\n *\n * @internal\n */\nexport const Dialog = forwardRef(function Dialog(\n {\n animate = true,\n bodyHeight,\n children,\n footer,\n padding = true,\n zOffset,\n ...props\n }: DialogProps & Pick<HTMLProps<HTMLDivElement>, 'onDragEnter' | 'onDrop'>,\n ref: Ref<HTMLDivElement>,\n) {\n const {t} = useTranslation()\n\n return (\n <UIDialog\n {...props}\n animate={animate}\n zOffset={zOffset}\n ref={ref}\n footer={\n (footer?.confirmButton || footer?.cancelButton) && (\n <Flex width=\"full\" gap={3} justify=\"flex-end\" padding={3} align=\"center\">\n {footer?.description && (\n <Box flex={1} paddingLeft={1}>\n <Text size={1} muted>\n {footer.description}\n </Text>\n </Box>\n )}\n {props.onClose && (\n <UIButton\n mode=\"bleed\"\n padding={2}\n text={t('common.dialog.cancel-button.text')}\n tone=\"default\"\n onClick={props.onClose}\n data-testid=\"cancel-button\"\n {...footer.cancelButton}\n />\n )}\n {footer.confirmButton && (\n <UIButton\n mode=\"default\"\n padding={2}\n text={t('common.dialog.confirm-button.text')}\n tone=\"critical\"\n data-testid=\"confirm-button\"\n {...footer.confirmButton}\n />\n )}\n </Flex>\n )\n }\n >\n <Box height={bodyHeight} padding={padding ? 4 : 0}>\n {children}\n </Box>\n </UIDialog>\n )\n})\n","import {type ChangeEvent, type FC, type HTMLProps, useCallback, useId} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {Button, type ButtonProps} from '../UI'\n\ntype FileInputButtonProps = ButtonProps & {\n accept?: string\n capture?: 'user' | 'environment'\n multiple?: boolean\n onSelect?: (files: File[]) => void\n disabled?: boolean\n}\n\nconst FileButton = styled(Button).attrs({forwardedAs: 'label'})(\n () => css`\n // The underlying file input is rendered as children within a Sanity UI <Button> component.\n // The below visibly hides it by targeting the input's parent <span> element, which is\n // added by the <Button> component.\n // TODO: refactor, avoid nth-child selector usage\n & > span:nth-child(2) {\n overflow: hidden;\n overflow: clip;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n min-width: 0;\n display: block;\n appearance: none;\n padding: 0;\n margin: 0;\n border: 0;\n opacity: 0;\n }\n `,\n)\n\nexport const FileInputButton: FC<\n FileInputButtonProps &\n Omit<HTMLProps<HTMLButtonElement>, 'as' | 'ref' | 'type' | 'value' | 'onSelect'>\n> = (props) => {\n const {icon, id: idProp, accept, capture, multiple, onSelect, text, disabled, ...rest} = props\n const id = `${idProp || ''}-${useId()}`\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (onSelect && event.target.files) {\n onSelect(Array.from(event.target.files))\n }\n },\n [onSelect],\n )\n\n return (\n <FileButton\n {...rest}\n space={2}\n padding={2}\n icon={icon}\n text={text}\n htmlFor={id}\n disabled={disabled}\n >\n <input\n accept={accept}\n capture={capture}\n id={id}\n multiple={multiple}\n onChange={handleChange}\n type=\"file\"\n value=\"\"\n disabled={disabled}\n />\n </FileButton>\n )\n}\n","import {type MenuItemProps} from '@sanity/ui'\nimport React, {type ChangeEvent, type FC, type HTMLProps, useCallback, useId} from 'react'\nimport {styled} from 'styled-components'\n\nimport {MenuItem} from '../UI'\n\nconst FileMenuItem = styled(MenuItem)`\n position: relative;\n\n & input {\n overflow: hidden;\n overflow: clip;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n min-width: 0;\n display: block;\n appearance: none;\n padding: 0;\n margin: 0;\n border: 0;\n opacity: 0;\n }\n`\n\ntype FileInputMenuItemProps = Omit<MenuItemProps, 'onSelect'> & {\n accept?: string\n capture?: 'user' | 'environment'\n multiple?: boolean\n onSelect?: (files: File[]) => void\n disabled?: boolean\n}\n\nexport const FileInputMenuItem: FC<\n FileInputMenuItemProps &\n Omit<HTMLProps<HTMLButtonElement>, 'as' | 'ref' | 'type' | 'value' | 'onSelect'>\n> = (props) => {\n const {icon, id: idProp, accept, capture, multiple, onSelect, text, disabled, ...rest} = props\n\n const id = `${idProp || ''}-${useId()}`\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (onSelect && event.target.files) {\n onSelect(Array.from(event.target.files))\n }\n },\n [onSelect],\n )\n\n const renderMenuItem = useCallback(\n (item: React.JSX.Element) => (\n <div>\n {item}\n {/* Visibly hidden input */}\n <input\n accept={accept}\n capture={capture}\n id={id}\n multiple={multiple}\n onChange={handleChange}\n type=\"file\"\n value=\"\"\n disabled={disabled}\n />\n </div>\n ),\n [accept, capture, disabled, handleChange, id, multiple],\n )\n\n return (\n <FileMenuItem\n {...rest}\n htmlFor={id}\n disabled={disabled}\n icon={icon}\n text={text}\n renderMenuItem={renderMenuItem}\n />\n )\n}\n","import {createContext, type FC, type PropsWithChildren, useContext} from 'react'\n\ntype ContextProps = {\n open: () => void\n}\n\ntype DropzoneDispatchProviderProps = {\n open: () => void\n}\n\nconst DropzoneDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const DropzoneDispatchProvider: FC<PropsWithChildren<DropzoneDispatchProviderProps>> = (\n props,\n) => {\n const {children, open} = props\n\n const contextValue: ContextProps = {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 {createContext, type FC, type PropsWithChildren, useContext} from 'react'\n\nimport type {S3AssetSourceComponentProps} from '../types'\n\ntype ContextProps = {\n onSelect?: S3AssetSourceComponentProps['onSelect']\n}\n\ntype AssetBrowserDispatchProviderProps = {\n onSelect?: S3AssetSourceComponentProps['onSelect']\n}\n\nconst AssetSourceDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const AssetBrowserDispatchProvider: FC<\n PropsWithChildren<AssetBrowserDispatchProviderProps>\n> = (props) => {\n const {children, onSelect} = props\n\n const contextValue: ContextProps = {\n 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 {S3AssetType} from 'sanity-plugin-s3-media-types'\n\n/**\n * @internal\n */\nexport const s3FileAssetIdPattern = /^s3File-([a-zA-Z0-9_-]+)-([a-z0-9]+)$/\n\n/**\n * @internal\n */\nexport const s3ImageAssetIdPattern = /^s3Image-([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)-([a-z0-9]+)$/\n\n/**\n * @internal\n */\nexport const s3VideoAssetIdPattern = /^s3Video-([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)-([a-z0-9]+)$/\n\n/**\n * @internal\n */\nexport const s3FileAssetFilenamePattern = /^([a-zA-Z0-9_-]+)\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3ImageAssetFilenamePattern = /^([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3VideoAssetFilenamePattern = /^([a-zA-Z0-9_-]+)-(\\d+)x(\\d+)\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3AssetFilenamePattern = /^([a-zA-Z0-9_-]+)(?:-(\\d+)x(\\d+))?\\.([a-z0-9]+)$/i\n\n/**\n * @internal\n */\nexport const s3AssetIdPattern = new RegExp(\n `^(?:` +\n `${S3AssetType.IMAGE}-[a-zA-Z0-9_-]+-\\\\d+x\\\\d+-[a-z0-9]+` +\n `|` +\n `${S3AssetType.VIDEO}-[a-zA-Z0-9_-]+-\\\\d+x\\\\d+-[a-z0-9]+` +\n `|` +\n `${S3AssetType.FILE}-[a-zA-Z0-9_-]+-[a-z0-9]+` +\n `)$`,\n)\n\n/**\n * @internal\n */\nexport const s3InProgressAssetId = 'upload-in-progress-placeholder'\n\n/**\n * @internal\n */\nexport const s3InProgressAssetExtension = 'tmp'\n\n/**\n * @internal\n */\nexport const s3VideoExtensions = new Set([\n 'mp4',\n 'webm',\n 'mov',\n 'm4v',\n 'avi',\n 'mkv',\n 'wmv',\n 'flv',\n 'mpeg',\n 'mpg',\n '3gp',\n 'ogv',\n])\n","/**\n * Error type thrown when the library fails to resolve a value, such as an asset ID,\n * filename or project ID/dataset information.\n *\n * The `input` property holds the value passed as the input, which failed to be\n * resolved to something meaningful.\n *\n * @public\n */\nexport class UnresolvableError extends Error {\n unresolvable = true\n\n // The input may not be a valid source, so let's not type it as one\n input?: unknown\n\n constructor(inputSource: unknown, message = 'Failed to resolve asset ID from source') {\n super(message)\n this.input = inputSource\n }\n}\n\n/**\n * Checks whether or not an error instance is of type UnresolvableError\n *\n * @param err - Error to check for unresolvable error type\n * @returns True if the passed error instance appears to be an unresolvable error\n * @public\n */\nexport function isUnresolvableError(err: unknown): err is UnresolvableError {\n const error = err as UnresolvableError\n return Boolean(error.unresolvable && 'input' in error)\n}\n","import {isUnresolvableError} from './errors'\nimport type {SafeFunction} from './types'\n\n/**\n * Returns a getter which returns `undefined` instead of throwing,\n * if encountering an `UnresolvableError`\n *\n * @param method - Function to use as resolver\n * @returns Function that returns `undefined` if passed resolver throws UnresolvableError\n * @internal\n */\nexport function getForgivingResolver<Args extends unknown[], Return>(\n method: (...args: Args) => Return,\n): SafeFunction<Args, Return> {\n return (...args: Args): Return | undefined => {\n try {\n return method(...args)\n } catch (err) {\n if (isUnresolvableError(err)) {\n return undefined\n }\n\n throw err\n }\n }\n}\n\n/**\n * Checks whether or not the passed object is an object (and not `null`)\n *\n * @param obj Item to check whether or not is an object\n * @returns Whether or not `obj` is an object\n * @internal\n */\nexport function isObject(obj: unknown): obj is object {\n return obj !== null && !Array.isArray(obj) && typeof obj === 'object'\n}\n","import type {S3Asset, S3FileAsset, S3ImageAsset, S3VideoAsset} from 'sanity-plugin-s3-media-types'\n\nimport {s3FileAssetIdPattern, s3ImageAssetIdPattern, s3VideoAssetIdPattern} from './constants'\nimport type {\n Reference,\n S3AssetObjectStub,\n S3FileUploadStub,\n S3ImageUploadStub,\n S3VideoUploadStub,\n} from './types'\nimport {isObject} from './utils'\n\n/**\n * Checks whether or not the given source is a reference object\n * (an object containing _ref string key)\n *\n * @param ref - Possible reference\n * @returns Whether or not the passed object is a reference\n * @public\n */\nexport function isReference(ref: unknown): ref is Reference {\n return isObject(ref) && typeof (ref as Reference)._ref === 'string'\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 file asset document ID\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 file asset document ID\n * @public\n */\nexport function isS3FileAssetId(documentId: string): boolean {\n return s3FileAssetIdPattern.test(documentId)\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 image asset document ID\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 image asset document ID\n * @public\n */\nexport function isS3ImageAssetId(documentId: string): boolean {\n return s3ImageAssetIdPattern.test(documentId)\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 video asset document ID\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 video asset document ID\n * @public\n */\nexport function isS3VideoAssetId(documentId: string): boolean {\n return s3VideoAssetIdPattern.test(documentId)\n}\n\n/**\n * Checks whether or not the given document ID is a valid S3 asset document ID (file/image/video)\n *\n * @param documentId - Document ID to check\n * @returns Whether or not the given document ID is an S3 asset document ID\n * @public\n */\nexport function isS3AssetId(documentId: string): boolean {\n return isS3FileAssetId(documentId) || isS3ImageAssetId(documentId) || isS3VideoAssetId(documentId)\n}\n\n/**\n * Checks whether or not the given source is an asset object stub\n *\n * @param stub - Possible asset object stub\n * @returns Whether or not the passed object is an object stub\n * @public\n */\nexport function isS3AssetObjectStub(stub: unknown): stub is S3AssetObjectStub {\n const item = stub as S3AssetObjectStub\n return isObject(item) && Boolean(item.asset) && typeof item.asset === 'object'\n}\n\n/**\n * Checks whether or not the given source is an in-progress upload\n * (has upload property but no asset property)\n *\n * @param stub - Possible in-progress upload\n * @returns Whether or not the passed object is an in-progress upload\n * @public\n */\nexport function isInProgressUpload(\n stub: unknown,\n): stub is S3ImageUploadStub | S3FileUploadStub | S3VideoUploadStub {\n const item = stub as S3ImageUploadStub | S3FileUploadStub | S3VideoUploadStub\n return isObject(item) && Boolean(item._upload) && !('asset' in item)\n}\n\n/**\n * Return whether or not the passed asset document is an s3 file asset\n *\n * @param asset - Asset document to check\n * @returns Whether or not the given asset is an s3 file asset\n * @public\n */\nexport function isS3FileAsset(asset: S3Asset): asset is S3FileAsset {\n return (asset as S3FileAsset)._type === 's3FileAsset'\n}\n\n/**\n * Return whether or not the passed asset document is an s3 image asset\n *\n * @param asset - Asset document to check\n * @returns Whether or not the given asset is an s3 image asset\n * @public\n */\nexport function isS3ImageAsset(asset: S3Asset): asset is S3ImageAsset {\n return (asset as S3ImageAsset)._type === 's3ImageAsset'\n}\n\n/**\n * Return whether or not the passed asset document is an s3 video asset\n *\n * @param asset - Asset document to check\n * @returns Whether or not the given asset is an s3 video asset\n * @public\n */\nexport function isS3VideoAsset(asset: S3Asset): asset is S3VideoAsset {\n return (asset as S3VideoAsset)._type === 's3VideoAsset'\n}\n","import {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {\n s3AssetFilenamePattern,\n s3FileAssetFilenamePattern,\n s3FileAssetIdPattern,\n s3ImageAssetFilenamePattern,\n s3ImageAssetIdPattern,\n s3VideoAssetFilenamePattern,\n s3VideoAssetIdPattern,\n s3VideoExtensions,\n} from './constants'\nimport type {S3FileAssetIdParts, S3ImageAssetIdParts, S3UrlType, S3VideoAssetIdParts} from './types'\n\n/**\n * @public\n */\nexport type S3AssetIdParts = S3FileAssetIdParts | S3ImageAssetIdParts | S3VideoAssetIdParts\n\nfunction getFilename(input: string): string {\n if (!input) {\n return ''\n }\n\n let raw = input\n\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(raw)) {\n try {\n raw = new URL(raw).pathname\n } catch {\n // Fall back to raw string handling below.\n }\n }\n\n const [withoutQuery = ''] = raw.split('?')\n const [withoutHash = ''] = withoutQuery.split('#')\n const normalized = withoutHash.replace(/^\\/+/, '')\n const parts = normalized.split('/').filter(Boolean)\n\n return parts[parts.length - 1] ?? ''\n}\n\n/**\n * Parses an S3 file asset document ID into individual parts (type, id, extension)\n *\n * @param documentId - File asset document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID invalid\n */\nexport function parseS3FileAssetId(documentId: string): S3FileAssetIdParts {\n const match = s3FileAssetIdPattern.exec(documentId)\n\n if (!match) {\n throw new Error(`Malformed file asset ID '${documentId}'.`)\n }\n\n const [, assetId, extension] = match\n return {type: S3AssetType.FILE, assetId, extension}\n}\n\n/**\n * Parses an S3 image asset document ID into individual parts (type, id, extension, width, height)\n *\n * @param documentId - Image asset document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID invalid\n */\nexport function parseS3ImageAssetId(documentId: string): S3ImageAssetIdParts {\n const match = s3ImageAssetIdPattern.exec(documentId)\n\n if (!match) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n const [, assetId, widthString, heightString, extension] = match\n const width = Number(widthString)\n const height = Number(heightString)\n\n if (!(width > 0) || !(height > 0)) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n return {type: S3AssetType.IMAGE, assetId, width, height, extension}\n}\n\n/**\n * Parses an S3 video asset document ID into individual parts (type, id, extension, width, height)\n *\n * @param documentId - Video asset document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID invalid\n */\nexport function parseS3VideoAssetId(documentId: string): S3VideoAssetIdParts {\n const match = s3VideoAssetIdPattern.exec(documentId)\n\n if (!match) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n const [, assetId, widthString, heightString, extension] = match\n const width = Number(widthString)\n const height = Number(heightString)\n\n if (!(width > 0) || !(height > 0)) {\n throw new Error(`Malformed asset ID '${documentId}'.`)\n }\n\n return {type: S3AssetType.VIDEO, assetId, width, height, extension}\n}\n\n/**\n * Parses an S3 asset document ID into individual parts.\n *\n * @param documentId - Document ID to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If document ID is invalid\n */\nexport function parseS3AssetId(documentId: string): S3AssetIdParts {\n if (documentId.startsWith(`${S3AssetType.FILE}-`)) {\n return parseS3FileAssetId(documentId)\n }\n\n if (documentId.startsWith(`${S3AssetType.IMAGE}-`)) {\n return parseS3ImageAssetId(documentId)\n }\n\n if (documentId.startsWith(`${S3AssetType.VIDEO}-`)) {\n return parseS3VideoAssetId(documentId)\n }\n\n throw new Error(`Invalid S3 asset ID '${documentId}'.`)\n}\n\n/**\n * Parses an S3 file asset filename into individual parts (type, id, extension)\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If file name is invalid\n */\nexport function parseS3FileAssetFilename(filename: string): S3FileAssetIdParts {\n const file = getFilename(filename)\n const match = s3FileAssetFilenamePattern.exec(file)\n\n if (!match || s3ImageAssetFilenamePattern.test(file)) {\n throw new Error(`Malformed file asset filename '${filename}'.`)\n }\n\n const [, assetId, extension] = match\n return parseS3FileAssetId(`${S3AssetType.FILE}-${assetId}-${extension.toLowerCase()}`)\n}\n\n/**\n * Parses an S3 image asset filename into individual parts (type, id, extension, width, height)\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If image file name is invalid\n */\nexport function parseS3ImageAssetFilename(filename: string): S3ImageAssetIdParts {\n const file = getFilename(filename)\n const match = s3ImageAssetFilenamePattern.exec(file)\n\n if (!match) {\n throw new Error(`Malformed image asset filename '${filename}'.`)\n }\n\n const [, assetId, width, height, extension] = match\n return parseS3ImageAssetId(\n `${S3AssetType.IMAGE}-${assetId}-${width}x${height}-${extension.toLowerCase()}`,\n )\n}\n\n/**\n * Parses an S3 video asset filename into individual parts (type, id, extension, width, height)\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If video file name is invalid\n */\nexport function parseS3VideoAssetFilename(filename: string): S3VideoAssetIdParts {\n const file = getFilename(filename)\n const match = s3VideoAssetFilenamePattern.exec(file)\n\n if (!match) {\n throw new Error(`Malformed video asset filename '${filename}'.`)\n }\n\n const [, assetId, width, height, extension] = match\n return parseS3VideoAssetId(\n `${S3AssetType.VIDEO}-${assetId}-${width}x${height}-${extension.toLowerCase()}`,\n )\n}\n\n/**\n * Parses an S3 asset filename into individual parts.\n *\n * Note: image/video filenames share the same shape, so this function determines\n * image vs video using extension heuristics.\n *\n * @param filename - Filename to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If file name is invalid\n */\nexport function parseS3AssetFilename(filename: string): S3AssetIdParts {\n const file = getFilename(filename)\n\n if (!s3AssetFilenamePattern.test(file)) {\n throw new Error(`Malformed asset filename '${filename}'.`)\n }\n\n const match = s3ImageAssetFilenamePattern.exec(file)\n if (match) {\n const extension = match[4].toLowerCase()\n\n if (s3VideoExtensions.has(extension)) {\n return parseS3VideoAssetFilename(file)\n }\n\n return parseS3ImageAssetFilename(file)\n }\n\n return parseS3FileAssetFilename(file)\n}\n\n/**\n * Parses a full S3 asset URL into individual parts.\n *\n * @param url - Full URL to parse into named parts\n * @returns Object of named properties\n * @public\n * @throws If URL is invalid\n */\nexport function parseS3AssetUrl(url: string): S3AssetIdParts {\n return parseS3AssetFilename(getFilename(url))\n}\n\n/**\n * Validates that a given URL is an S3 asset URL, and returns the asset type if valid.\n *\n * @param url - URL to extract asset type from\n * @returns Asset type if valid URL, false otherwise\n * @public\n */\nexport function getS3AssetUrlType(url: string): S3UrlType | false {\n try {\n const parsed = parseS3AssetUrl(url)\n\n if (parsed.type === S3AssetType.FILE) {\n return 'file'\n }\n\n if (parsed.type === S3AssetType.VIDEO) {\n return 'video'\n }\n\n return 'image'\n } catch {\n return false\n }\n}\n","import {s3AssetFilenamePattern} from './constants'\nimport {UnresolvableError} from './errors'\nimport {parseS3FileAssetId, parseS3ImageAssetId, parseS3VideoAssetId} from './parse'\nimport {getForgivingResolver} from './utils'\n\n/**\n * @public\n */\nexport interface S3UrlBuilderOptions {\n baseUrl: string\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(value)\n}\n\n/**\n * Builds the base file path from the minimal set of parts required to assemble it\n *\n * @param documentId - File asset document ID to build path from\n * @returns The path to the file\n * @public\n */\nexport function buildS3FilePath(documentId: string): string {\n const {assetId, extension} = parseS3FileAssetId(documentId)\n return `${assetId}.${extension}`\n}\n\n/**\n * Builds the base file URL from the minimal set of parts required to assemble it\n *\n * @param documentId - File asset document ID to build URL from\n * @param options - Base URL configuration\n * @returns The URL to the file, as a string\n * @public\n */\nexport function buildS3FileUrl(documentId: string, options: S3UrlBuilderOptions): string {\n return `${options.baseUrl}/${buildS3FilePath(documentId)}`\n}\n\n/**\n * Builds the base image path from the minimal set of parts required to assemble it\n *\n * @param documentId - Image asset document ID to build path from\n * @returns The path to the image\n * @public\n */\nexport function buildS3ImagePath(documentId: string): string {\n const {assetId, width, height, extension} = parseS3ImageAssetId(documentId)\n return `${assetId}-${width}x${height}.${extension}`\n}\n\n/**\n * Builds the base image URL from the minimal set of parts required to assemble it\n *\n * @param documentId - Image asset document ID to build URL from\n * @param options - Base URL configuration\n * @returns The URL to the image, as a string\n * @public\n */\nexport function buildS3ImageUrl(documentId: string, options: S3UrlBuilderOptions): string {\n return `${options.baseUrl}/${buildS3ImagePath(documentId)}`\n}\n\n/**\n * Builds the base video path from the minimal set of parts required to assemble it\n *\n * @param documentId - Video asset document ID to build path from\n * @returns The path to the video\n * @public\n */\nexport function buildS3VideoPath(documentId: string): string {\n const {assetId, width, height, extension} = parseS3VideoAssetId(documentId)\n return `${assetId}-${width}x${height}.${extension}`\n}\n\n/**\n * Builds the base video URL from the minimal set of parts required to assemble it\n *\n * @param documentId - Video asset document ID to build URL from\n * @param options - Base URL configuration\n * @returns The URL to the video, as a string\n * @public\n */\nexport function buildS3VideoUrl(documentId: string, options: S3UrlBuilderOptions): string {\n return `${options.baseUrl}/${buildS3VideoPath(documentId)}`\n}\n\n/**\n * Checks whether or not a given filename matches the expected S3 asset filename pattern\n *\n * @param filename - Filename to check for validity\n * @returns Whether or not the specified filename is valid\n * @public\n */\nexport function isValidS3Filename(filename: string): boolean {\n if (!filename || filename.includes('/')) {\n return false\n }\n\n return s3AssetFilenamePattern.test(filename)\n}\n\n/**\n * Strips query params/hash and returns the path portion from a URL or raw path.\n *\n * @param urlOrPath - URL or path to extract from\n * @returns Normalized path without leading slash\n * @public\n * @throws If URL/path could not be resolved\n */\nexport function getS3UrlPath(urlOrPath: string): string {\n if (typeof urlOrPath !== 'string' || !urlOrPath.trim()) {\n throw new UnresolvableError(urlOrPath, 'Failed to resolve path from URL/path')\n }\n\n if (isAbsoluteUrl(urlOrPath)) {\n const pathname = new URL(urlOrPath).pathname.replace(/^\\/+/, '')\n\n if (!pathname) {\n throw new UnresolvableError(urlOrPath, 'Failed to resolve path from URL/path')\n }\n\n return pathname\n }\n\n const normalized =\n urlOrPath.split('?')[0]?.split('#')[0]?.replace(/^\\/+/, '') || urlOrPath.replace(/^\\/+/, '')\n\n if (!normalized) {\n throw new UnresolvableError(urlOrPath, 'Failed to resolve path from URL/path')\n }\n\n return normalized\n}\n\n/**\n * {@inheritDoc getS3UrlPath}\n * @returns Returns `undefined` instead of throwing if a value cannot be resolved\n * @public\n */\nexport const tryGetS3UrlPath = getForgivingResolver(getS3UrlPath)\n\n/**\n * Returns the last path segment (asset filename) from a URL or path.\n *\n * @param urlOrPath - URL or path to parse\n * @returns The filename portion\n * @public\n * @throws If URL/path could not be resolved to an asset filename\n */\nexport function getS3UrlFilename(urlOrPath: string): string {\n const path = getS3UrlPath(urlOrPath)\n const parts = path.split('/').filter(Boolean)\n const filename = parts[parts.length - 1]\n\n if (!isValidS3Filename(filename)) {\n throw new UnresolvableError(\n urlOrPath,\n `Failed to resolve filename from URL/path '${urlOrPath}'`,\n )\n }\n\n return filename\n}\n\n/**\n * {@inheritDoc getS3UrlFilename}\n * @returns Returns `undefined` instead of throwing if a value cannot be resolved\n * @public\n */\nexport const tryGetS3UrlFilename = getForgivingResolver(getS3UrlFilename)\n","/* eslint-disable max-params */\nimport {Observable, of} from 'rxjs'\nimport {catchError, map, mergeMap} from 'rxjs/operators'\nimport {type SanityClient, type UploadOptions} from 'sanity'\nimport {\n type S3Asset,\n type S3AssetDocument,\n S3AssetType,\n type S3FileAsset,\n type S3ImageAsset,\n type S3VideoAsset,\n} from 'sanity-plugin-s3-media-types'\n\nimport {type UploadCompleteEvent, type UploadEvent} from '../../types'\nimport {hashFile, withMaxConcurrency} from '../../utils'\nimport type {S3Client} from '../S3Client'\n\nconst MAX_CONCURRENT_UPLOADS = 4\n\ninterface ImageDimensions {\n width: number\n height: number\n}\n\ninterface UploadAssetParams {\n sanityClient: SanityClient\n s3Client: S3Client\n assetType: S3AssetType\n file: File\n options?: UploadOptions\n}\n\nconst fetchExistingAsset = (\n client: SanityClient,\n assetType: S3AssetType,\n id: string,\n): Observable<S3ImageAsset | S3FileAsset | S3VideoAsset | null> =>\n client.observable.fetch(\n '*[_type == $documentType && _id == $id][0]',\n {documentType: `${assetType}Asset`, id},\n {tag: 's3Asset.find-duplicate'},\n )\n\nconst getImageDimensions = (file: File): Observable<ImageDimensions | null> => {\n if (!file.type.startsWith('image/')) {\n return of(null)\n }\n\n return new Observable<ImageDimensions>((subscriber) => {\n const img = new Image()\n const url = URL.createObjectURL(file)\n\n const cleanup = () => URL.revokeObjectURL(url)\n\n img.onload = () => {\n subscriber.next({width: img.width, height: img.height})\n subscriber.complete()\n cleanup()\n }\n\n img.onerror = () => {\n subscriber.error(new Error('Failed to load image'))\n cleanup()\n }\n\n img.src = url\n }).pipe(catchError(() => of(null)))\n}\n\nconst getVideoDimensions = (file: File): Observable<ImageDimensions | null> => {\n if (!file.type.startsWith('video/')) {\n return of(null)\n }\n\n return new Observable<ImageDimensions>((subscriber) => {\n const video = document.createElement('video')\n const url = URL.createObjectURL(file)\n\n const cleanup = () => {\n URL.revokeObjectURL(url)\n video.removeAttribute('src')\n video.load()\n }\n\n video.onloadedmetadata = () => {\n subscriber.next({width: video.videoWidth, height: video.videoHeight})\n subscriber.complete()\n cleanup()\n }\n\n video.onerror = () => {\n subscriber.error(new Error('Failed to load video metadata'))\n cleanup()\n }\n\n video.preload = 'metadata'\n video.src = url\n }).pipe(catchError(() => of(null)))\n}\n\nconst getFileExtension = (filename: string): string => {\n const segments = filename.split('.')\n return segments[segments.length - 1]\n}\n\nconst buildFileName = (\n fileId: string,\n extension: string,\n dimensions: ImageDimensions | null,\n): string =>\n dimensions\n ? `${fileId}-${dimensions.width}x${dimensions.height}.${extension}`\n : `${fileId}.${extension}`\n\nconst buildDocumentId = (\n assetType: S3AssetType,\n fileId: string,\n extension: string,\n dimensions: ImageDimensions | null,\n): string =>\n assetType === S3AssetType.IMAGE && dimensions\n ? `${S3AssetType.IMAGE}-${fileId}-${dimensions.width}x${dimensions.height}-${extension}`\n : assetType === S3AssetType.VIDEO && dimensions\n ? `${S3AssetType.VIDEO}-${fileId}-${dimensions.width}x${dimensions.height}-${extension}`\n : `${S3AssetType.FILE}-${fileId}-${extension}`\n\nconst buildAssetDocument = (\n assetType: S3AssetType,\n fileId: string,\n file: File,\n documentId: string,\n hash: string | undefined,\n dimensions: ImageDimensions | null,\n storeOriginalFilename: boolean,\n): S3Asset => {\n const baseDocument = {\n _id: documentId,\n _type:\n assetType === S3AssetType.IMAGE\n ? 's3ImageAsset'\n : assetType === S3AssetType.VIDEO\n ? 's3VideoAsset'\n : 's3FileAsset',\n assetId: fileId,\n originalFilename: storeOriginalFilename ? file.name : undefined,\n sha1hash: hash,\n extension: getFileExtension(file.name),\n mimeType: file.type,\n size: file.size,\n } as S3Asset\n\n if (assetType === S3AssetType.IMAGE && dimensions) {\n return {\n ...baseDocument,\n _type: 's3ImageAsset',\n metadata: {\n _type: 's3ImageMetadata',\n dimensions: {\n _type: 's3ImageDimensions',\n height: dimensions.height,\n width: dimensions.width,\n aspectRatio: dimensions.width / dimensions.height,\n },\n },\n }\n }\n\n if (assetType === S3AssetType.VIDEO && dimensions) {\n return {\n ...baseDocument,\n _type: 's3VideoAsset',\n metadata: {\n _type: 's3VideoMetadata',\n dimensions: {\n _type: 's3VideoDimensions',\n height: dimensions.height,\n width: dimensions.width,\n aspectRatio: dimensions.width / dimensions.height,\n },\n },\n }\n }\n\n return baseDocument\n}\n\nconst createCompleteEvent = ({\n asset,\n exists,\n}: {\n asset: S3AssetDocument\n exists?: boolean\n}): UploadCompleteEvent => ({\n type: 'complete',\n id: asset._id,\n asset,\n exists,\n})\n\n// Main Upload Function\nconst uploadAsset = ({\n file,\n assetType,\n s3Client,\n sanityClient,\n options = {},\n}: UploadAssetParams): Observable<UploadEvent> => {\n const {storeOriginalFilename = true} = options\n const extension = getFileExtension(file.name)\n\n return hashFile(file).pipe(\n mergeMap((hash) => {\n const dimensions$ =\n assetType === S3AssetType.IMAGE\n ? getImageDimensions(file)\n : assetType === S3AssetType.VIDEO\n ? getVideoDimensions(file)\n : of(null)\n\n return dimensions$.pipe(map((dimensions) => ({hash, dimensions})))\n }),\n\n mergeMap(({hash, dimensions}) => {\n if (assetType === S3AssetType.VIDEO && !dimensions) {\n throw new Error('Unable to determine video dimensions')\n }\n\n // Check for existing asset if we have a hash\n if (hash) {\n const documentId = buildDocumentId(assetType, hash, extension, dimensions)\n\n return fetchExistingAsset(sanityClient, assetType, documentId).pipe(\n map((existing) => ({existing, hash, dimensions, documentId})),\n )\n }\n\n return of({existing: null, hash, dimensions, documentId: ''})\n }),\n\n mergeMap(({existing, hash, dimensions, documentId}) => {\n // Return early if asset already exists\n if (existing) {\n return of(createCompleteEvent({asset: existing, exists: true}))\n }\n\n const fileName = buildFileName(hash, extension, dimensions)\n\n // Upload to S3 and create Sanity document\n return s3Client.observable.assets.uploadAsset({assetType, file, fileName}).pipe(\n mergeMap((event) => {\n if (event.type !== 'response') {\n return of(event as UploadEvent)\n }\n\n const document = buildAssetDocument(\n assetType,\n hash,\n file,\n documentId,\n hash || undefined,\n dimensions,\n storeOriginalFilename,\n )\n\n return sanityClient.observable\n .create<S3Asset>(document)\n .pipe(map((asset) => createCompleteEvent({asset})))\n }),\n )\n }),\n )\n}\n\nexport const uploadS3Asset = withMaxConcurrency(uploadAsset, MAX_CONCURRENT_UPLOADS)\n","/**\n * Checks whether or not the passed object is an object (and not `null`)\n *\n * @param obj Item to check whether or not is an object\n * @returns Whether or not `obj` is an object\n * @internal\n */\nexport function isObject(obj: unknown): obj is object {\n return obj !== null && !Array.isArray(obj) && typeof obj === 'object'\n}\n","import {isObject} from '../../../utils/isObject'\nimport type {Any, ErrorProps} from '../types'\n\n/**\n * Shared properties for HTTP errors (eg both ClientError and ServerError)\n * Use `isHttpError` for type narrowing and accessing response properties.\n *\n * @public\n */\nexport interface HttpError {\n statusCode: number\n message: string\n response: {\n body: unknown\n url: string\n method: string\n headers: Record<string, string>\n statusCode: number\n statusMessage: string | null\n }\n}\n\n/** @public */\nexport class ClientError extends Error {\n response: ErrorProps['response']\n statusCode: ErrorProps['statusCode'] = 400\n responseBody: ErrorProps['responseBody']\n details: ErrorProps['details']\n\n constructor(res: Any) {\n const props = extractErrorProps(res)\n super(props.message)\n Object.assign(this, props)\n }\n}\n\n/** @public */\nexport class ServerError extends Error {\n response: ErrorProps['response']\n statusCode: ErrorProps['statusCode'] = 500\n responseBody: ErrorProps['responseBody']\n details: ErrorProps['details']\n\n constructor(res: Any) {\n const props = extractErrorProps(res)\n super(props.message)\n Object.assign(this, props)\n }\n}\n\nfunction extractErrorProps(res: Any): ErrorProps {\n const body = res.body\n const props = {\n response: res,\n statusCode: res.statusCode,\n responseBody: stringifyBody(body, res),\n message: '',\n details: undefined as Any,\n }\n\n // Fall back early if we didn't get a JSON object returned as expected\n if (!isObject(body)) {\n props.message = httpErrorMessage(res, body)\n return props\n }\n\n // Cast to any for property access after isObject check\n const bodyObj = body as any\n const error = bodyObj.error\n\n // API/Boom style errors ({statusCode, error, message})\n if (typeof error === 'string' && typeof bodyObj.message === 'string') {\n props.message = `${error} - ${bodyObj.message}`\n return props\n }\n\n // Content Lake errors with a `error` prop being an object\n if (typeof error !== 'object' || error === null) {\n if (typeof error === 'string') {\n props.message = error\n } else if (typeof bodyObj.message === 'string') {\n props.message = bodyObj.message\n } else {\n props.message = httpErrorMessage(res, body)\n }\n return props\n }\n\n if ('description' in error && typeof error.description === 'string') {\n // Query/database errors ({error: {description, other, arb, props}})\n props.message = error.description\n props.details = error\n return props\n }\n\n // Other, more arbitrary errors\n props.message = httpErrorMessage(res, body)\n return props\n}\n\nfunction httpErrorMessage(res: Any, body: unknown) {\n const details = typeof body === 'string' ? ` (${sliceWithEllipsis(body, 100)})` : ''\n const statusMessage = res.statusMessage ? ` ${res.statusMessage}` : ''\n return `${res.method}-request to ${res.url} resulted in HTTP ${res.statusCode}${statusMessage}${details}`\n}\n\nfunction stringifyBody(body: Any, res: Any) {\n const contentType = (res.headers['content-type'] || '').toLowerCase()\n const isJson = contentType.indexOf('application/json') !== -1\n return isJson ? JSON.stringify(body, null, 2) : body\n}\n\nfunction sliceWithEllipsis(str: string, max: number) {\n return str.length > max ? `${str.slice(0, max)}…` : str\n}\n","/* eslint-disable consistent-return */\nimport {Observable} from 'rxjs'\n\nimport type {Any, HttpRequestEvent} from '../types'\nimport {ClientError, ServerError} from './errors'\n\ninterface FetchOptions extends globalThis.RequestInit {\n url?: string\n timeout?: number\n retries?: number\n retryDelay?: number\n maxRetries?: number\n body?: any\n}\n\nexport const createFetchClient = () => {\n return (options: FetchOptions): Observable<HttpRequestEvent> => {\n return new Observable((subscriber) => {\n const controller = new AbortController()\n const signal = options.signal || controller.signal\n\n const execute = async (attemptNumber = 0) => {\n try {\n // Validate required fields\n if (!options.url) {\n throw new Error('URL is required for fetch request')\n }\n\n // Set timeout\n const timeoutMs = options.timeout || 5 * 60 * 1000\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n // Prepare fetch options\n const fetchOptions: globalThis.RequestInit = {\n method: options.method || 'GET',\n headers: {\n ...(options.headers || {}),\n },\n signal,\n }\n\n // Only add Content-Type for requests with body\n if (options.body) {\n fetchOptions.body = JSON.stringify(options.body)\n ;(fetchOptions.headers as Record<string, string>)['Content-Type'] = 'application/json'\n }\n\n // Make fetch request\n const response = await fetch(options.url, fetchOptions)\n\n clearTimeout(timeoutId)\n\n // Parse JSON response\n const body = await response.json().catch(() => ({}))\n\n // Emit response event\n const event: Any = {\n type: 'response',\n method: options.method || 'GET',\n statusCode: response.status,\n statusMessage: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n body,\n url: options.url,\n }\n\n // Handle errors\n if (response.status >= 500) {\n const maxRetries = options.maxRetries !== undefined ? options.maxRetries : 3\n const shouldRetry = attemptNumber < maxRetries && [502, 503].includes(response.status)\n\n if (shouldRetry) {\n const delay = (options.retryDelay || 1000) * Math.pow(2, attemptNumber)\n await new Promise((resolve) => setTimeout(resolve, delay))\n return execute(attemptNumber + 1)\n }\n\n throw new ServerError(event)\n } else if (response.status >= 400) {\n // Retry rate limiting\n const maxRetries = options.maxRetries !== undefined ? options.maxRetries : 3\n\n if (response.status === 429 && attemptNumber < maxRetries) {\n const delay = (options.retryDelay || 1000) * Math.pow(2, attemptNumber)\n await new Promise((resolve) => setTimeout(resolve, delay))\n return execute(attemptNumber + 1)\n }\n\n throw new ClientError(event)\n }\n\n subscriber.next(event)\n subscriber.complete()\n } catch (error) {\n if (error instanceof ClientError || error instanceof ServerError) {\n subscriber.error(error)\n } else {\n subscriber.error(new Error(`HTTP request failed: ${error}`))\n }\n }\n }\n\n execute()\n\n // Cleanup function\n return () => controller.abort()\n })\n }\n}\n","import {tap} from 'rxjs/operators'\n\nimport type {Requester, RequestOptions} from '../types'\nimport {createFetchClient} from './fetchClient'\n\ntype HttpRequestConfig = {\n ignoreWarnings?: string | RegExp | Array<string | RegExp>\n}\n\n/** @internal */\nexport function defineHttpRequest(config: HttpRequestConfig = {}): Requester {\n const fetchClient = createFetchClient()\n const seen: Record<string, boolean> = {}\n\n return (options: RequestOptions) => {\n return fetchClient({\n ...options,\n timeout: options.timeout || 5 * 60 * 1000,\n maxRetries: options.maxRetries === undefined ? 3 : options.maxRetries,\n retryDelay: 1000,\n }).pipe(\n tap((event) => {\n if (event.type === 'response') {\n const warn = event.headers['x-sanity-warning']\n if (!warn) return\n\n const warnings = Array.isArray(warn) ? warn : [warn]\n warnings.forEach((msg) => {\n if (!msg || seen[msg]) return\n\n // Skip warnings that match ignore patterns\n if (shouldIgnoreWarning(msg, config)) return\n\n seen[msg] = true\n console.warn(msg)\n })\n }\n }),\n )\n }\n}\n\nfunction shouldIgnoreWarning(message: string, config: HttpRequestConfig): boolean {\n if (!config.ignoreWarnings) return false\n\n const patterns = Array.isArray(config.ignoreWarnings)\n ? config.ignoreWarnings\n : [config.ignoreWarnings]\n\n return patterns.some((pattern) => {\n if (typeof pattern === 'string') {\n return message.includes(pattern)\n } else if (pattern instanceof RegExp) {\n return pattern.test(message)\n }\n return false\n })\n}\n","import {defineHttpRequest} from './http/request'\nimport type {HttpRequest, S3ClientConfig} from './types'\n\n/**\n * Create the `requester` and `createClient` exports\n * @internal\n */\nexport default function defineCreateClientExports<\n S3ClientType,\n ClientConfigType extends S3ClientConfig,\n>(ClassConstructor: new (httpRequest: HttpRequest, config: ClientConfigType) => S3ClientType) {\n const createClient = (config: ClientConfigType) => {\n const clientRequester = defineHttpRequest()\n\n return new ClassConstructor(\n (options, requester) => (requester || clientRequester)(options),\n config,\n )\n }\n\n return {createClient}\n}\n","import type {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {SUPPORTED_ASSET_TYPES} from '../../constants'\n\nexport const validateAssetType = (type: S3AssetType): void => {\n if (SUPPORTED_ASSET_TYPES.indexOf(type) === -1) {\n throw new Error(\n `Invalid asset type: ${type}. Must be one of ${SUPPORTED_ASSET_TYPES.join(', ')}`,\n )\n }\n}\n","import {lastValueFrom, Observable} from 'rxjs'\nimport {filter} from 'rxjs/operators'\nimport type {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport type {ObservableS3Client, S3Client} from '../S3Client'\nimport type {HttpRequestEvent, ResponseEvent} from '../types'\nimport * as validators from '../validators'\n\nconst upload = ({\n file,\n fileName,\n client,\n assetType,\n}: {\n file: File\n fileName: string\n client: S3Client | ObservableS3Client\n assetType: S3AssetType\n}): Observable<HttpRequestEvent> => {\n validators.validateAssetType(assetType)\n\n const config = client.config()\n\n const {bucketRegion, bucketKey, getSignedUrlEndpoint, secret} = config\n\n // Validate required config fields\n if (!bucketRegion) {\n throw new Error('S3Client: Missing required config field: bucketRegion')\n }\n if (!bucketKey) {\n throw new Error('S3Client: Missing required config field: bucketKey')\n }\n if (!getSignedUrlEndpoint) {\n throw new Error('S3Client: Missing required config field: getSignedUrlEndpoint')\n }\n if (!secret) {\n throw new Error('S3Client: Missing required config field: secret')\n }\n\n if (!fileName) {\n throw new Error('S3Client: filename is required in options')\n }\n\n const fileSize = file.size || 0\n const fileType = file.type\n\n return new Observable((subscriber) => {\n const executeUpload = async () => {\n try {\n // Stage 1: Get Signed URL (0-10%)\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: 5,\n loaded: 0,\n total: fileSize,\n lengthComputable: true,\n })\n\n // Fetch signed URL\n const signedUrlResponse = await fetch(getSignedUrlEndpoint, {\n method: 'POST',\n body: JSON.stringify({\n secret,\n fileName,\n bucketKey,\n bucketRegion,\n contentType: file.type,\n }),\n headers: {'Content-Type': 'application/json'},\n mode: 'cors',\n })\n\n const {url: signedUrl} = (await signedUrlResponse.json()) as {url: string}\n\n if (!signedUrl || !URL.canParse(signedUrl)) {\n throw new Error('Invalid signed URL received from endpoint')\n }\n\n // Stage 2: Upload to S3 (10-100%)\n const xhr = new XMLHttpRequest()\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n // Map 0-100% upload progress to 10-100% overall progress\n const uploadPercent = (event.loaded / event.total) * 100\n const overallPercent = 10 + uploadPercent * 0.9\n\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: overallPercent,\n loaded: event.loaded,\n total: event.total,\n lengthComputable: true,\n })\n }\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n // Upload successful, emit final progress\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: 100,\n loaded: fileSize,\n total: fileSize,\n lengthComputable: true,\n })\n\n // Emit response event\n subscriber.next({\n type: 'response',\n method: 'PUT',\n statusCode: xhr.status,\n statusMessage: xhr.statusText,\n headers: {},\n })\n\n subscriber.complete()\n } else {\n subscriber.error(new Error(`S3 upload failed: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n subscriber.error(new Error('S3 upload failed: Network error'))\n }\n\n xhr.open('PUT', signedUrl)\n xhr.setRequestHeader('Content-Type', fileType)\n xhr.send(file)\n } catch (error) {\n subscriber.error(error)\n }\n }\n\n executeUpload()\n })\n}\n\nconst deleteAsset = ({\n fileName,\n client,\n}: {\n fileName: string\n client: S3Client | ObservableS3Client\n}): Observable<HttpRequestEvent> => {\n const config = client.config()\n\n const {deleteEndpoint, secret, bucketKey, bucketRegion} = config\n\n if (!deleteEndpoint) {\n throw new Error('S3Client: Missing required config field: deleteEndpoint')\n }\n\n if (!fileName) {\n throw new Error('S3Client: fileKey is required in options')\n }\n\n return new Observable((subscriber) => {\n const executeDelete = async () => {\n try {\n const response = await fetch(deleteEndpoint, {\n method: 'POST',\n body: JSON.stringify({\n fileKey: fileName,\n secret,\n bucketKey,\n bucketRegion,\n }),\n headers: {'Content-Type': 'application/json'},\n mode: 'cors',\n })\n\n if (!response.ok) {\n throw new Error(`S3 delete failed: ${response.status} ${response.statusText}`)\n }\n\n subscriber.next({\n type: 'response',\n method: 'POST',\n statusCode: response.status,\n statusMessage: response.statusText,\n headers: {},\n })\n\n subscriber.complete()\n } catch (error) {\n subscriber.error(error)\n }\n }\n\n executeDelete()\n })\n}\n\nexport class ObservableAssetsClient {\n #client: ObservableS3Client\n constructor(client: ObservableS3Client) {\n this.#client = client\n }\n\n uploadAsset({\n assetType,\n file,\n fileName,\n }: {\n file: File\n fileName: string\n assetType: S3AssetType\n }): Observable<HttpRequestEvent> {\n return upload({client: this.#client, file, fileName, assetType})\n }\n\n deleteAsset({fileName}: {fileName: string}): Observable<HttpRequestEvent> {\n return deleteAsset({client: this.#client, fileName})\n }\n}\n\nexport class AssetsClient {\n #client: S3Client\n constructor(client: S3Client) {\n this.#client = client\n }\n\n uploadAsset({\n assetType,\n file,\n fileName,\n }: {\n assetType: S3AssetType\n file: File\n fileName: string\n }): Promise<ResponseEvent> {\n const observable = upload({client: this.#client, assetType, file, fileName})\n\n return lastValueFrom(observable.pipe(filter((event) => event.type === 'response')))\n }\n\n deleteAsset({fileName}: {fileName: string}): Promise<ResponseEvent> {\n const observable = deleteAsset({client: this.#client, fileName})\n\n return lastValueFrom(observable.pipe(filter((event) => event.type === 'response')))\n }\n}\n","import {AssetsClient, ObservableAssetsClient} from './assets/AssetsClient'\nimport type {HttpRequest, InitializedClientConfig, S3ClientConfig} from './types'\n\n/** @public */\nexport class ObservableS3Client {\n assets: ObservableAssetsClient\n\n /**\n * Private properties\n */\n #clientConfig: InitializedClientConfig\n #httpRequest: HttpRequest\n\n constructor(httpRequest: HttpRequest, config: S3ClientConfig) {\n // Initialize with empty object cast to InitializedClientConfig\n this.#clientConfig = {} as InitializedClientConfig\n this.config(config)\n\n this.#httpRequest = httpRequest\n\n this.assets = new ObservableAssetsClient(this)\n }\n\n /**\n * Clone the client - returns a new instance\n */\n clone(): ObservableS3Client {\n return new ObservableS3Client(this.#httpRequest, this.config())\n }\n\n /**\n * Returns the current client configuration\n */\n config(): InitializedClientConfig\n /**\n * Reconfigure the client. Note that this _mutates_ the current client.\n */\n config(newConfig?: Partial<S3ClientConfig>): this\n config(newConfig?: Partial<S3ClientConfig>): InitializedClientConfig | this {\n if (newConfig === undefined) {\n return {...this.#clientConfig}\n }\n\n // Merge config properly\n this.#clientConfig = {\n ...this.#clientConfig,\n ...newConfig,\n } as InitializedClientConfig\n\n return this\n }\n\n /**\n * Clone the client with a new (partial) configuration.\n *\n * @param newConfig - New client configuration properties, shallowly merged with existing configuration\n */\n withConfig(newConfig?: Partial<S3ClientConfig>): ObservableS3Client {\n const thisConfig = this.config()\n return new ObservableS3Client(this.#httpRequest, {\n ...thisConfig,\n ...newConfig,\n })\n }\n}\n\n/** @public */\nexport class S3Client {\n assets: AssetsClient\n\n /**\n * Observable version of the Sanity client, with the same configuration as the promise-based one\n */\n observable: ObservableS3Client\n\n /**\n * Private properties\n */\n #clientConfig: InitializedClientConfig\n #httpRequest: HttpRequest\n\n constructor(httpRequest: HttpRequest, config: S3ClientConfig) {\n // Initialize with empty object cast to InitializedClientConfig\n this.#clientConfig = {} as InitializedClientConfig\n this.config(config)\n\n this.#httpRequest = httpRequest\n\n this.assets = new AssetsClient(this)\n\n this.observable = new ObservableS3Client(httpRequest, config)\n }\n\n /**\n * Clone the client - returns a new instance\n */\n clone(): S3Client {\n return new S3Client(this.#httpRequest, this.config())\n }\n\n /**\n * Returns the current client configuration\n */\n config(): InitializedClientConfig\n /**\n * Reconfigure the client. Note that this _mutates_ the current client.\n */\n config(newConfig?: Partial<S3ClientConfig>): this\n config(newConfig?: Partial<S3ClientConfig>): InitializedClientConfig | this {\n if (newConfig === undefined) {\n return {...this.#clientConfig}\n }\n\n if (this.observable) {\n this.observable.config(newConfig)\n }\n\n // Merge config properly\n this.#clientConfig = {\n ...this.#clientConfig,\n ...newConfig,\n } as InitializedClientConfig\n\n return this\n }\n\n /**\n * Clone the client with a new (partial) configuration.\n *\n * @param newConfig - New client configuration properties, shallowly merged with existing configuration\n */\n withConfig(newConfig?: Partial<S3ClientConfig>): S3Client {\n const thisConfig = this.config()\n return new S3Client(this.#httpRequest, {\n ...thisConfig,\n ...newConfig,\n })\n }\n}\n","import defineCreateClientExports from './defineCreateClient'\nimport {S3Client} from './S3Client'\nimport type {S3ClientConfig} from './types'\n\nconst exp = defineCreateClientExports<S3Client, S3ClientConfig>(S3Client)\n\n/** @public */\nexport const createS3Client = exp.createClient\n","import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {createContext, type FC, PropsWithChildren, useCallback, useContext, useState} from 'react'\nimport {buildS3FileUrl, buildS3ImageUrl, buildS3VideoUrl} from 'sanity-plugin-s3-media-asset-utils'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {createS3Client, type S3Client} from '../lib'\nimport type {S3Credentials} from '../types'\n\ntype S3AssetTypeValue = `${S3AssetType}`\n\ntype IS3MediaContext = {\n s3Client: S3Client\n buildAssetUrl: ({assetId, assetType}: {assetId: string; assetType: S3AssetTypeValue}) => string\n}\n\nconst credentialsNamespace = 's3MediaCredentials'\n\nconst pluginConfigKeys = [\n {\n key: 'bucketRegion',\n title: 'Bucket Region',\n },\n {\n key: 'bucketKey',\n title: 'Bucket Key',\n },\n {key: 'getSignedUrlEndpoint', title: 'getSignedUrlEndpoint', description: 'test'},\n {key: 'deleteEndpoint', title: 'deleteEndpoint'},\n {key: 'cloudfrontDomain', title: 'cloudfrontDomain'},\n {key: 'secret', title: 'secret'},\n]\n\nconst S3MediaContext = createContext<IS3MediaContext>({} as IS3MediaContext)\n\nexport const S3MediaContextProvider: FC<PropsWithChildren> = (props) => {\n const {children} = props\n\n const [isCredentialsDialogDismissed, setIsCredentialsDialogDismissed] = useState(false)\n const {secrets: credentials, loading: isCredentialsLoading} =\n useSecrets<S3Credentials>(credentialsNamespace)\n\n const {bucketRegion, bucketKey, getSignedUrlEndpoint, deleteEndpoint, cloudfrontDomain, secret} =\n credentials || {}\n\n const s3AssetBaseUrl =\n cloudfrontDomain || (bucketRegion && bucketKey)\n ? cloudfrontDomain || `https://s3.${bucketRegion}.amazonaws.com/${bucketKey}`\n : null\n\n const isCredentialsDialogOpen =\n !isCredentialsDialogDismissed &&\n !isCredentialsLoading &&\n (!credentials ||\n !credentials.bucketKey ||\n !credentials.bucketRegion ||\n !credentials.getSignedUrlEndpoint ||\n !credentials.secret)\n\n const s3Client = createS3Client({\n bucketRegion,\n bucketKey,\n getSignedUrlEndpoint,\n deleteEndpoint,\n cloudfrontDomain,\n secret,\n })\n\n const buildAssetUrl = useCallback(\n ({assetId, assetType}: {assetId: string; assetType: S3AssetTypeValue}) => {\n if (!assetId || !assetType) {\n throw new Error('')\n }\n\n if (!s3AssetBaseUrl) {\n throw new Error('S3 Base URL is not defined')\n }\n\n if (assetType === S3AssetType.IMAGE) {\n return buildS3ImageUrl(assetId, {baseUrl: s3AssetBaseUrl})\n }\n\n if (assetType === S3AssetType.FILE) {\n return buildS3FileUrl(assetId, {baseUrl: s3AssetBaseUrl})\n }\n\n if (assetType === S3AssetType.VIDEO) {\n return buildS3VideoUrl(assetId, {baseUrl: s3AssetBaseUrl})\n }\n\n throw new Error(\"Can't build asset id\")\n },\n [s3AssetBaseUrl],\n )\n\n return (\n <S3MediaContext.Provider value={{s3Client, buildAssetUrl}}>\n {children}\n\n {isCredentialsDialogOpen && !isCredentialsLoading ? (\n <SettingsView\n title=\"S3 Media Credentials\"\n namespace={credentialsNamespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setIsCredentialsDialogDismissed(true)\n }}\n />\n ) : null}\n </S3MediaContext.Provider>\n )\n}\n\nexport const useS3MediaContext = (): IS3MediaContext => {\n const context = useContext(S3MediaContext)\n\n if (!context) {\n throw new Error('useS3MediaContext must be used within a S3MediaContextProvider')\n }\n\n return context\n}\n","import {createContext, type FC, PropsWithChildren, useContext} from 'react'\n\nimport type {S3MediaPluginOptions} from '../types'\n\ntype S3MediaOptionsContextProviderProps = {options: S3MediaPluginOptions | void}\n\nconst S3MediaOptionsContext = createContext<S3MediaPluginOptions>({\n directUploads: true,\n})\n\nexport const S3MediaOptionsContextProvider: FC<\n PropsWithChildren<S3MediaOptionsContextProviderProps>\n> = (props) => {\n const {options, children} = props\n\n const {directUploads = true, ...rest} = options || {}\n\n return (\n <S3MediaOptionsContext.Provider value={{...rest, directUploads}}>\n {children}\n </S3MediaOptionsContext.Provider>\n )\n}\n\nexport const useS3MediaOptionsContext = (): S3MediaPluginOptions => {\n const context = useContext(S3MediaOptionsContext)\n\n if (!context) {\n throw new Error('useS3MediaOptionsContext must be used within a S3MediaOptionsContextProvider')\n }\n\n return context\n}\n","import type {Order} 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 = (order: Order): string => {\n return ORDER_DICTIONARY[order.field][order.direction]\n}\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\n\ntype SearchState = {\n query: string\n}\n\nconst initialState = {\n query: '',\n} as SearchState\n\nconst searchSlice = createSlice({\n name: 'search',\n initialState,\n reducers: {\n querySet(state, action: PayloadAction<{searchQuery: string}>) {\n state.query = action.payload?.searchQuery\n },\n },\n})\n\nexport const searchActions = {...searchSlice.actions}\n\nexport const searchReducer = searchSlice.reducer\n","import {createAction} from '@reduxjs/toolkit'\nimport type {S3AssetDocument} from 'sanity-plugin-s3-media-types'\n\nexport const UPLOADS_ACTIONS = {\n uploadComplete: createAction(\n 'uploads/uploadComplete',\n function prepare({asset}: {asset: S3AssetDocument}) {\n return {\n payload: {asset},\n }\n },\n ),\n}\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError} from '@sanity/client'\nimport groq from 'groq'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {concat, EMPTY, forkJoin, from, of} from 'rxjs'\nimport {\n bufferTime,\n catchError,\n debounceTime,\n filter,\n mergeMap,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators'\nimport {\n buildS3FilePath,\n buildS3ImagePath,\n buildS3VideoPath,\n isS3FileAsset,\n isS3ImageAsset,\n isS3VideoAsset,\n} from 'sanity-plugin-s3-media-asset-utils'\nimport type {S3Asset, S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport type {AssetItem, BrowserView, Epic, HttpError, Order, RootReducerState} from '../../types'\nimport {constructFilter} from '../../utils'\nimport {searchActions} from '../search'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\n\ntype ItemError = {\n description: string\n id: string\n referencingIDs: string[]\n type: string // 'documentHasExistingReferencesError'\n}\n\nconst buildFileName = (asset: S3Asset): string => {\n if (isS3ImageAsset(asset)) {\n return buildS3ImagePath(asset._id)\n }\n\n if (isS3VideoAsset(asset)) {\n return buildS3VideoPath(asset._id)\n }\n\n if (isS3FileAsset(asset)) {\n return buildS3FilePath(asset._id)\n }\n\n throw new Error('Unsupported asset type')\n}\n\ntype AssetsReducerState = {\n allIds: string[]\n assetTypes: S3AssetType[]\n byIds: Record<string, AssetItem>\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 Order\n\nexport const initialState = {\n allIds: [],\n assetTypes: [],\n byIds: {},\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),\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 S3Asset,\n picked: false,\n updating: false,\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\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: S3Asset[]; 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 deleteSkipped(state, action: PayloadAction<{assetIds: string[]; reason: string}>) {\n const {assetIds, reason} = action.payload\n assetIds.forEach((assetId) => {\n if (state.byIds[assetId]) {\n state.byIds[assetId].updating = false\n state.byIds[assetId].error = reason\n }\n })\n },\n fetchComplete(state, action: PayloadAction<{assets: S3Asset[]}>) {\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 state.byIds[asset._id] = {\n _type: 'asset',\n asset: asset,\n picked: false,\n updating: false,\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 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 extension,\n metadata {\n dimensions\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: S3Asset}>) {\n //\n },\n listenerCreateQueueComplete(state, action: PayloadAction<{assets: S3Asset[]}>) {\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: S3Asset}>) {\n //\n },\n listenerUpdateQueueComplete(state, action: PayloadAction<{assets: S3Asset[]}>) {\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\n state.byIds[assetId].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] as number\n const tagB = state.byIds[b].asset[state.order.field] as number\n const direction = state.order.direction === 'asc' ? 1 : -1\n\n if (tagA < tagB) {\n return -1 * direction\n } else if (tagA > tagB) {\n return 1 * direction\n }\n return 0\n })\n },\n updateComplete(state, action: PayloadAction<{asset: S3Asset; 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: S3Asset; 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 updateRequest(\n state,\n action: PayloadAction<{\n asset: S3Asset\n closeDialogId?: string\n formData: Record<string, any>\n }>,\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\nexport const assetsActions = {...assetsSlice.actions}\n\n// Epics\n\nexport const assetsDeleteEpic: Epic = (action$, _state$, {sanityClient, s3Client}) =>\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\n return sanityClient.observable\n .fetch<\n {_id: string; referenceCount: number}[]\n >(groq`*[_id in $assetIds]{_id, \"referenceCount\": count(*[references(^._id)])}`, {assetIds})\n .pipe(\n mergeMap((referenceResults) => {\n const referenceMap = new Map(\n referenceResults.map((item) => [item._id, item.referenceCount]),\n )\n\n const blockedAssets = assets.filter((asset) => (referenceMap.get(asset._id) || 0) > 0)\n const deletableAssets = assets.filter(\n (asset) => (referenceMap.get(asset._id) || 0) === 0,\n )\n\n const blockedIds = blockedAssets.map((asset) => asset._id)\n const deletableIds = deletableAssets.map((asset) => asset._id)\n\n const blockedActions$ = blockedIds.length\n ? of(\n assetsActions.deleteSkipped({\n assetIds: blockedIds,\n reason: 'Asset has references and cannot be deleted.',\n }),\n )\n : EMPTY\n\n if (deletableAssets.length === 0) {\n return blockedActions$\n }\n\n const deleteRequests = deletableAssets.map((asset) =>\n s3Client.observable.assets.deleteAsset({fileName: buildFileName(asset)}),\n )\n\n const deleteFlow$ = forkJoin(deleteRequests).pipe(\n mergeMap(() =>\n sanityClient.observable.delete({\n query: groq`*[_id in ${JSON.stringify(deletableIds)}]`,\n }),\n ),\n mergeMap(() => of(assetsActions.deleteComplete({assetIds: deletableIds}))),\n catchError((error: ClientError) => {\n return of(assetsActions.deleteError({assetIds: deletableIds, error}))\n }),\n )\n\n return blockedIds.length ? concat(blockedActions$, deleteFlow$) : deleteFlow$\n }),\n catchError((error: ClientError) => of(assetsActions.deleteError({assetIds, error}))),\n )\n }),\n )\n\nexport const assetsFetchEpic: Epic = (action$, state$, {sanityClient}) =>\n action$.pipe(\n filter(assetsActions.fetchRequest.match),\n withLatestFrom(state$),\n switchMap(([action]) => {\n const params = action.payload?.params\n const query = action.payload?.query\n\n return of(action).pipe(\n mergeMap(() =>\n sanityClient.observable.fetch<{\n items: S3Asset[]\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: Epic = (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 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: Epic = (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: Epic = (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\nexport const assetsOrderSetEpic: Epic = (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: Epic = (action$) =>\n action$.pipe(\n ofType(searchActions.querySet.type),\n debounceTime(400),\n mergeMap(() => {\n return of(\n assetsActions.clear(), //\n assetsActions.loadPageIndex({pageIndex: 0}),\n )\n }),\n )\n\nexport const assetsListenerCreateQueueEpic: Epic = (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: Epic = (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: Epic = (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: Epic = (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 assetsUnpickEpic: Epic = (action$) =>\n action$.pipe(\n ofType(assetsActions.orderSet.type, assetsActions.viewSet.type, searchActions.querySet.type),\n mergeMap(() => {\n return of(assetsActions.pickClear())\n }),\n )\n\nexport const assetsUpdateEpic: Epic = (action$, state$, {sanityClient}) =>\n action$.pipe(\n filter(assetsActions.updateRequest.match),\n withLatestFrom(state$),\n mergeMap(([action]) => {\n const {asset, closeDialogId, formData} = action.payload\n\n return of(action).pipe(\n mergeMap(() =>\n from(\n sanityClient\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\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 assetsReducer = assetsSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\n\nimport type {AssetItem, Dialog, Epic} from '../../types'\nimport {assetsActions} from '../assets'\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 reducers: {\n // Clear all dialogs\n clear(state) {\n state.items = []\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 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 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 },\n})\n\n// Epics\n\nexport const dialogClearOnAssetUpdateEpic: Epic = (action$) =>\n action$.pipe(\n ofType(assetsActions.deleteComplete.type, assetsActions.updateComplete.type),\n filter(\n (action: {\n payload: {closeDialogId?: string}\n }): action is PayloadAction<{closeDialogId?: string}> => !!action?.payload?.closeDialogId,\n ),\n mergeMap((action) => {\n return of(dialogSlice.actions.remove({id: action.payload.closeDialogId as string}))\n }),\n )\n\nexport const dialogActions = {...dialogSlice.actions}\n\nexport const dialogReducer = dialogSlice.reducer\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError} from '@sanity/client'\nimport groq from 'groq'\nimport {empty, merge, of, throwError} from 'rxjs'\nimport {catchError, delay, filter, mergeMap, takeUntil, withLatestFrom} from 'rxjs/operators'\nimport type {S3AssetDocument} from 'sanity-plugin-s3-media-types'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\n\nimport {uploadS3Asset} from '../../lib'\nimport type {RootReducerState, UploadProgressEvent} from '../../types'\nimport {Epic, HttpError, UploadItem} from '../../types'\nimport {constructFilter, generatePreviewBlobUrl$, hashFile} from '../../utils'\nimport {assetsActions} from '../assets'\nimport {UPLOADS_ACTIONS} from './actions'\n\ntype 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(_state, _action: PayloadAction<{assets: S3AssetDocument[]}>) {\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\n uploadRequest(_state, _action: PayloadAction<{file: File; forceAsAssetType?: S3AssetType}>) {\n //\n },\n uploadProgress(state, action: PayloadAction<{event: UploadProgressEvent; uploadHash: string}>) {\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\n if (!state.allIds.includes(uploadItem.hash)) {\n state.allIds.push(uploadItem.hash)\n }\n state.byIds[uploadItem.hash] = uploadItem\n },\n },\n})\n\nexport const uploadsActions = {...uploadsSlice.actions}\n\n// Epics\n\nexport const uploadsAssetStartEpic: Epic = (action$, _state$, {sanityClient, s3Client}) =>\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(() =>\n uploadS3Asset({assetType: uploadItem.assetType, s3Client, sanityClient, file}),\n ),\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 if (event.exists) {\n return throwError({\n message: 'Asset already exists',\n statusCode: 409,\n } as HttpError)\n }\n\n return of(\n UPLOADS_ACTIONS.uploadComplete({\n asset: event.asset,\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: Epic = (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 =\n forceAsAssetType ||\n (file.type.indexOf('image') >= 0\n ? S3AssetType.IMAGE\n : file.type.indexOf('video') >= 0\n ? S3AssetType.VIDEO\n : S3AssetType.FILE)\n\n const uploadItem = {\n hash,\n _type: 'upload',\n assetType,\n name: file.name,\n size: file.size,\n status: 'queued',\n } as UploadItem\n\n return of(uploadsActions.uploadStart({file, uploadItem}))\n }),\n )\n }),\n )\n\nexport const uploadsCompleteQueueEpic: Epic = (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: Epic = (action$, state$, {sanityClient}) =>\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 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(() => sanityClient.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\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 uploadsReducer = uploadsSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\nimport type {S3ImageAsset} from 'sanity-plugin-s3-media-types'\n\nimport type {Epic} from '../../types'\nimport {assetsActions} from '../assets'\nimport {uploadsActions} from '../uploads'\n\ntype Notification = {\n asset?: S3ImageAsset\n status?: 'error' | 'warning' | 'success' | 'info'\n title?: string\n}\n\ntype NotificationsReducerState = {\n items: Notification[]\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: Epic = (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: Epic = (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 notificationsAssetsDeleteSkippedEpic: Epic = (action$) =>\n action$.pipe(\n filter(assetsActions.deleteSkipped.match),\n mergeMap((action) => {\n const {assetIds, reason} = action.payload\n const count = assetIds.length\n return of(\n notificationsSlice.actions.add({\n status: 'warning',\n title: `Skipped ${count} ${pluralize('asset', count)}. ${reason}`,\n }),\n )\n }),\n )\n\nexport const notificationsAssetsUploadCompleteEpic: Epic = (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 notificationsGenericErrorEpic: Epic = (action$) =>\n action$.pipe(\n ofType(\n assetsActions.fetchError.type,\n assetsActions.updateError.type,\n uploadsActions.uploadError.type,\n ),\n mergeMap((action: {payload: {error: {message: string}}}) => {\n const error = action.payload?.error\n\n return of(\n notificationsSlice.actions.add({\n status: 'error',\n title: `An error occured: ${error?.message}`,\n }),\n )\n }),\n )\n\nexport const notificationsActions = {...notificationsSlice.actions}\n\nexport const notificationsReducer = notificationsSlice.reducer\n","import {combineEpics} from 'redux-observable'\n\nimport {\n assetsDeleteEpic,\n assetsFetchAfterDeleteAllEpic,\n assetsFetchEpic,\n assetsFetchNextPageEpic,\n assetsFetchPageIndexEpic,\n assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n} from './assets'\nimport {dialogClearOnAssetUpdateEpic} from './dialog'\nimport {\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteSkippedEpic,\n notificationsAssetsUploadCompleteEpic,\n notificationsGenericErrorEpic,\n} from './notifications'\nimport {\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 assetsListenerCreateQueueEpic,\n assetsListenerDeleteQueueEpic,\n assetsListenerUpdateQueueEpic,\n assetsOrderSetEpic,\n assetsSearchEpic,\n assetsSortEpic,\n assetsUnpickEpic,\n assetsUpdateEpic,\n dialogClearOnAssetUpdateEpic,\n notificationsAssetsDeleteErrorEpic,\n notificationsAssetsDeleteCompleteEpic,\n notificationsAssetsDeleteSkippedEpic,\n notificationsAssetsUploadCompleteEpic,\n notificationsGenericErrorEpic,\n uploadsAssetStartEpic,\n uploadsAssetUploadEpic,\n uploadsCheckRequestEpic,\n uploadsCompleteQueueEpic,\n)\n","import {createSlice} from '@reduxjs/toolkit'\nimport type {SanityDocument} from '@sanity/client'\nimport type {S3AssetDocument} from 'sanity-plugin-s3-media-types'\n\ntype SelectedReducerState = {\n assets: S3AssetDocument[]\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 const selectedReducer = selectedSlice.reducer\n","import {\n type ActionFromReducersMapObject,\n combineReducers,\n type Reducer,\n type StateFromReducersMapObject,\n} from '@reduxjs/toolkit'\n\nimport {assetsReducer} from './assets'\nimport {dialogReducer} from './dialog'\nimport {notificationsReducer} from './notifications'\nimport {searchReducer} from './search'\nimport {selectedReducer} from './selected'\nimport {uploadsReducer} from './uploads'\n\nconst reducers = {\n assets: assetsReducer,\n dialog: dialogReducer,\n notifications: notificationsReducer,\n search: searchReducer,\n selected: selectedReducer,\n uploads: uploadsReducer,\n}\n\ntype ReducersMapObject = typeof reducers\n\nexport const rootReducer: Reducer<\n StateFromReducersMapObject<ReducersMapObject>,\n ActionFromReducersMapObject<ReducersMapObject>\n> = combineReducers(reducers)\n","import {createSelector} from '@reduxjs/toolkit'\n\nimport type {CardAssetData, CardUploadData,RootReducerState} from '../types'\n\nexport const selectCombinedItems = createSelector(\n [\n (state: RootReducerState) => state.assets.allIds,\n (state: RootReducerState) => state.uploads.allIds,\n ],\n (assetIds, uploadIds) => {\n const assetItems = assetIds.map((id) => ({id, type: 'asset'}) as CardAssetData)\n const uploadItems = uploadIds.map((id) => ({id, type: 'upload'}) as CardUploadData)\n const combinedItems: (CardAssetData | CardUploadData)[] = [...uploadItems, ...assetItems]\n return combinedItems\n },\n)\n","import {Box, Flex} from '@sanity/ui'\nimport {type FC, type MouseEvent} from 'react'\nimport type {DefaultExtensionType} from 'react-file-icon'\nimport {defaultStyles, FileIcon as ReactFileIcon} from 'react-file-icon'\nimport {S3AssetType, type S3FileAsset, type S3VideoAsset} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport {useS3MediaContext} from '../../../contexts'\n\ntype FileIconProps = {\n extension?: string\n onClick?: (e: MouseEvent) => void\n width: string\n asset?: S3FileAsset | S3VideoAsset\n}\n\n// Force react-file-icon styles\nconst Container = styled(Box)`\n text {\n font-size: 8px !important;\n font-weight: 500 !important;\n }\n`\n\nexport const FileIcon: FC<FileIconProps> = (props) => {\n const {extension, onClick, width, asset} = props\n\n const {buildAssetUrl} = useS3MediaContext()\n\n const assetUrl = asset\n ? buildAssetUrl({\n assetType: asset._type === 's3VideoAsset' ? S3AssetType.VIDEO : S3AssetType.FILE,\n assetId: asset._id,\n })\n : null\n\n return (\n <Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n {assetUrl && asset?.mimeType.search('video') === 0 ? (\n <video\n autoPlay\n muted\n loop\n src={assetUrl}\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n ) : (\n <Container style={{width}}>\n {extension ? (\n <ReactFileIcon\n extension={extension}\n {...defaultStyles[extension as DefaultExtensionType]}\n />\n ) : (\n <ReactFileIcon />\n )}\n </Container>\n )}\n </Flex>\n )\n}\n","import type {ThemeColorSchemeKey} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {getSchemeColor} from '../../../utils'\n\ntype Props = {\n onClick?: (e: MouseEvent) => void\n $showCheckerboard?: boolean\n $scheme?: ThemeColorSchemeKey\n src: string\n}\n\nexport const Image: any = styled.img<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","export 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 PANEL_HEIGHT = 32 // px\n","import {CheckmarkCircleIcon, EditIcon, WarningFilledIcon} from '@sanity/icons'\nimport {\n Box,\n Card,\n Checkbox,\n Container,\n Flex,\n Spinner,\n Text,\n type Theme,\n type ThemeColorSchemeKey,\n Tooltip,\n} from '@sanity/ui'\nimport {type FC, memo, type MouseEvent, type RefObject} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {isS3FileAsset, isS3ImageAsset, isS3VideoAsset} from 'sanity-plugin-s3-media-asset-utils'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {css, styled} from 'styled-components'\n\nimport {useS3MediaContext} from '../../../contexts'\nimport {useAssetSourceActions} from '../../../contexts/S3AssetSourceDispatchContext'\nimport {useKeyPress, useTypedSelector} from '../../../hooks'\nimport {assetsActions, dialogActions, selectAssetById} from '../../../modules'\nimport {getSchemeColor} from '../../../utils'\nimport {PANEL_HEIGHT} from '../constants'\nimport {FileIcon} from '../FileIcon'\nimport {Image} from '../Image'\n\ntype CardAssetProps = {\n id: string\n selected: boolean\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 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: ${$picked\n ? `1px solid ${theme.sanity.color.spot.orange} !important`\n : '1px solid inherit'};\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\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 BaseCardAsset: FC<CardAssetProps> = (props) => {\n const {id, selected} = props\n\n const scheme = useColorSchemeValue()\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 item = useTypedSelector((state) => selectAssetById(state, id))\n\n const asset = item?.asset\n const error = item?.error\n const picked = item?.picked\n const updating = item?.updating\n\n const {onSelect} = useAssetSourceActions()\n\n const {buildAssetUrl} = useS3MediaContext()\n\n // Short circuit if no asset is available\n if (!asset) {\n return null\n }\n\n // Callbacks\n const handleAssetClick = (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (onSelect) {\n onSelect([\n {\n kind: 'assetDocumentId',\n value: asset._id,\n },\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 (onSelect) {\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 onClick={handleAssetClick} style={{height: '100%', opacity: opacityPreview}}>\n {/* File icon */}\n {(isS3FileAsset(asset) || isS3VideoAsset(asset)) && (\n <FileIcon asset={asset} extension={asset.extension} width=\"80px\" />\n )}\n\n {/* Image */}\n {isS3ImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard\n src={buildAssetUrl({assetId: asset._id, assetType: S3AssetType.IMAGE})}\n style={{\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 ? (\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 {/* Error button */}\n {error && (\n <Card\n tone=\"critical\"\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 <WarningFilledIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Card>\n )}\n </CardContainer>\n </CardWrapper>\n )\n}\n\nexport const CardAsset = memo(BaseCardAsset)\n","import {CloseIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {filesize} from 'filesize'\nimport type {FC} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport {useTypedSelector} from '../../../hooks'\nimport {selectUploadById, uploadsActions} from '../../../modules'\nimport {getSchemeColor} from '../../../utils'\nimport {PANEL_HEIGHT} from '../constants'\nimport {FileIcon} from '../FileIcon'\nimport {Image} from '../Image'\n\ntype CardUploadProps = {\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\nexport const CardUpload: FC<CardUploadProps> = (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 === S3AssetType.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 === S3AssetType.FILE || item.assetType === S3AssetType.VIDEO) && (\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","import type {FC} from 'react'\nimport {VirtuosoGrid} from 'react-virtuoso'\nimport {styled} from 'styled-components'\n\nimport {useTypedSelector} from '../../../hooks'\nimport type {CardAssetData, CardUploadData} from '../../../types/browser'\nimport {CardAsset} from '../CardAsset'\nimport {CardUpload} from '../CardUpload'\n\ntype AssetGridVirtualizedProps = {\n items: (CardAssetData | CardUploadData)[]\n onLoadMore?: () => void\n}\n\nconst CARD_HEIGHT = 220\nconst CARD_WIDTH = 240\n\nconst VirtualCell = ({\n item,\n selected,\n}: {\n item: CardAssetData | CardUploadData\n selected: boolean\n}) => {\n if (item?.type === 'asset') {\n return <CardAsset id={item.id} selected={selected} />\n }\n\n if (item?.type === 'upload') {\n return <CardUpload id={item.id} />\n }\n\n return null\n}\n\nconst StyledItemContainer = styled.div`\n height: ${CARD_HEIGHT}px;\n width: ${CARD_WIDTH}px;\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\nexport const AssetGridVirtualized: FC<AssetGridVirtualizedProps> = (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 <VirtuosoGrid\n className=\"media__custom-scrollbar\"\n computeItemKey={(index) => {\n const item = items[index]\n\n return item?.id\n }}\n components={{\n Item: StyledItemContainer,\n List: StyledListContainer,\n }}\n endReached={onLoadMore}\n itemContent={(index) => {\n const item = items[index]\n const selected = selectedIds.includes(item?.id)\n\n return <VirtualCell item={item} selected={selected} />\n }}\n overscan={48}\n style={{overflowX: 'hidden', overflowY: 'scroll'}}\n totalCount={totalCount}\n />\n )\n}\n","import {ChevronDownIcon, ChevronUpIcon} from '@sanity/icons'\nimport {Box, Label} from '@sanity/ui'\nimport type {FC} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {useTypedSelector} from '../../../hooks'\nimport {assetsActions} from '../../../modules'\n\ntype TableHeaderItemProps = {\n field?: string\n title?: string\n}\n\nexport const TableHeaderItem: FC<TableHeaderItemProps> = (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","import {Checkbox, Flex, Grid, type ThemeColorSchemeKey, useMediaIndex} from '@sanity/ui'\nimport {type FC, type MouseEvent} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {useAssetSourceActions} from '../../../contexts'\nimport {useTypedSelector} from '../../../hooks'\nimport {assetsActions, selectAssetsLength, selectAssetsPickedLength} from '../../../modules'\nimport {getSchemeColor} from '../../../utils'\nimport {GRID_TEMPLATE_COLUMNS, PANEL_HEIGHT} from '../constants'\nimport {TableHeaderItem} from '../TableHeaderItem'\n\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\nexport const TableHeader: FC = () => {\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 gridColumnGap: 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',\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","import {CheckmarkCircleIcon, EditIcon, WarningFilledIcon} from '@sanity/icons'\nimport {\n Box,\n Card,\n Checkbox,\n Container,\n Flex,\n Grid,\n Spinner,\n Text,\n type ThemeColorSchemeKey,\n Tooltip,\n useMediaIndex,\n} from '@sanity/ui'\nimport {formatRelative} from 'date-fns'\nimport {filesize} from 'filesize'\nimport {\n type FC,\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 {useColorSchemeValue, WithReferringDocuments} from 'sanity'\nimport {isS3FileAsset, isS3ImageAsset, isS3VideoAsset} from 'sanity-plugin-s3-media-asset-utils'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {css, styled} from 'styled-components'\n\nimport {useS3MediaContext} from '../../../contexts'\nimport {useAssetSourceActions} from '../../../contexts/S3AssetSourceDispatchContext'\nimport {useKeyPress, useTypedSelector} from '../../../hooks'\nimport {assetsActions, dialogActions, selectAssetById} from '../../../modules'\nimport {getAssetResolution, getSchemeColor, getUniqueDocuments} from '../../../utils'\nimport {GRID_TEMPLATE_COLUMNS} from '../constants'\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 TableRowAssetProps = {\n id: string\n selected: boolean\n}\n\nconst ContainerGrid = styled<\n typeof Grid,\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 ${!$updating &&\n css`\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background: ${getSchemeColor($scheme, 'bg')};\n }\n }\n `}\n `\n})\n\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\n// eslint-disable-next-line complexity\nconst BaseTableRowAsset: FC<TableRowAssetProps> = (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 {buildAssetUrl} = useS3MediaContext()\n\n const asset = item?.asset\n const error = item?.error\n const picked = item?.picked\n const updating = item?.updating\n\n const {onSelect} = useAssetSourceActions()\n\n const handleContextActionClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (onSelect) {\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, lastPicked, onSelect, picked, shiftPressed],\n )\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n\n if (!asset) return\n if (onSelect) {\n onSelect([{kind: 'assetDocumentId', value: asset._id}])\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, lastPicked, onSelect, picked, 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 gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n gridRowGap: 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 ? (\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',\n transform: 'scale(0.8)',\n }}\n />\n )}\n </ContextActionContainer>\n\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 {(isS3FileAsset(asset) || isS3VideoAsset(asset)) && (\n <FileIcon asset={asset} extension={asset.extension} width=\"40px\" />\n )}\n\n {/* Image */}\n {isS3ImageAsset(asset) && (\n <Image\n draggable={false}\n $scheme={scheme}\n $showCheckerboard\n src={buildAssetUrl({assetId: asset._id, assetType: S3AssetType.IMAGE})}\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 {(isS3ImageAsset(asset) || isS3VideoAsset(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 id={id}>\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 {/* Error button */}\n {error && (\n <Card tone=\"critical\" 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 <WarningFilledIcon color=\"critical\" />\n </Text>\n </Tooltip>\n </Card>\n )}\n </Flex>\n </ContainerGrid>\n )\n}\n\nexport const TableRowAsset = memo(BaseTableRowAsset)\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\nexport const 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","/* eslint-disable no-empty */\nimport {white} from '@sanity/color'\nimport {Flex, Text} from '@sanity/ui'\nimport {type FC, type PropsWithChildren} from 'react'\nimport {type DropEvent, type DropzoneOptions, useDropzone} from 'react-dropzone'\nimport {useDispatch} from 'react-redux'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport {DropzoneDispatchProvider, useS3MediaOptionsContext} from '../../../contexts'\nimport {useAssetSourceActions} from '../../../contexts/S3AssetSourceDispatchContext'\nimport {useTypedSelector} from '../../../hooks'\nimport {notificationsActions, uploadsActions} from '../../../modules'\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 }\n\n return filteredFiles\n}\n\nexport const UploadDropzone: FC<PropsWithChildren> = (props) => {\n const {children} = props\n\n const {directUploads} = useS3MediaOptionsContext()\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] === S3AssetType.IMAGE\n const isVideoAssetType = assetTypes.length === 1 && assetTypes[0] === S3AssetType.VIDEO\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/*' : isVideoAssetType ? 'video/*' : '',\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 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","import {ChevronDownIcon, UploadIcon} from '@sanity/icons'\nimport {Menu, MenuButton, type MenuButtonProps, MenuGroup, type MenuGroupProps} from '@sanity/ui'\nimport {startCase, uniqueId} from 'lodash'\nimport {type ChangeEvent, type FC, type JSX, type MouseEvent, useCallback, useMemo} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport type {S3AssetSource} from '../../types'\nimport {Button, MenuItem} from '../UI'\n\nconst UPLOAD_DROP_DOWN_MENU_POPOVER: MenuButtonProps['popover'] = {portal: true} as const\nconst MENU_GROUP_POPOVER: MenuGroupProps['popover'] = {\n placement: 'right-start',\n fallbackPlacements: ['left-start', 'bottom', 'top'],\n}\nconst ASSET_SOURCE_DATA_ATTRIBUTE = 'data-asset-source-name'\n\ninterface UploadDropDownMenuProps {\n accept?: string\n assetSources: S3AssetSource[]\n capture?: 'user' | 'environment'\n directUploads?: boolean\n multiple?: boolean\n onSelectFiles?: (assetSource: S3AssetSource, files: File[]) => void\n readOnly?: boolean\n renderAsMenuGroup?: boolean\n}\n\nexport const UploadDropDownMenu: FC<UploadDropDownMenuProps> = (props) => {\n const {\n accept,\n assetSources,\n capture,\n directUploads,\n multiple,\n onSelectFiles,\n readOnly,\n renderAsMenuGroup = false,\n } = props\n const {t} = useTranslation()\n\n const uniqId = useMemo(() => uniqueId(), [])\n const uploadsDisabled = readOnly || directUploads === false\n\n const createAssetSourceInputId = useCallback(\n (assetSource: S3AssetSource) => {\n return `${uniqId}-${assetSource.name}-upload-button`\n },\n [uniqId],\n )\n\n // Needed for keyboard navigation (arrow keys + enter/space)\n const handleMenuItemClick = useCallback(\n (event: MouseEvent) => {\n const assetSourceName = event.currentTarget.getAttribute(ASSET_SOURCE_DATA_ATTRIBUTE)\n const assetSource = assetSources.find((source) => source.name === assetSourceName)\n if (!assetSource) {\n return\n }\n const element = document.getElementById(createAssetSourceInputId(assetSource))\n // Test for document.activeElement to avoid clicking the button twice\n if (element && document.activeElement !== element) {\n element.click()\n }\n },\n [assetSources, createAssetSourceInputId],\n )\n\n const renderMenuItemLabel = useCallback(\n (menuItemContent: JSX.Element) => {\n const assetSourceName = menuItemContent.props[ASSET_SOURCE_DATA_ATTRIBUTE]\n const assetSource = assetSources.find((source) => source.name === assetSourceName)\n if (!assetSource) {\n return menuItemContent\n }\n return <label htmlFor={createAssetSourceInputId(assetSource)}>{menuItemContent}</label>\n },\n [assetSources, createAssetSourceInputId],\n )\n\n const renderMenuItemForAssetSource = useCallback(\n (assetSource: S3AssetSource) => {\n const inputId = createAssetSourceInputId(assetSource)\n\n return (\n <MenuItem\n key={`${inputId}-menu-button`}\n {...{[ASSET_SOURCE_DATA_ATTRIBUTE]: assetSource.name}}\n disabled={uploadsDisabled}\n htmlFor={inputId}\n icon={assetSource.icon}\n onClick={handleMenuItemClick}\n renderMenuItem={renderMenuItemLabel}\n text={assetSource.title || startCase(assetSource.name)}\n />\n )\n },\n [createAssetSourceInputId, handleMenuItemClick, renderMenuItemLabel, uploadsDisabled],\n )\n\n const handleFileInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const assetSourceName = event.target.dataset.assetSourceName\n const assetSource = assetSources.find((source) => source.name === assetSourceName)\n if (!assetSource) {\n return\n }\n if (onSelectFiles && event.target.files) {\n onSelectFiles(assetSource, Array.from(event.target.files))\n }\n event.stopPropagation()\n event.preventDefault()\n },\n [assetSources, onSelectFiles],\n )\n\n const fileInputs = useMemo(() => {\n return assetSources.map((assetSource) => {\n const _id = createAssetSourceInputId(assetSource)\n return (\n <input\n key={_id}\n accept={accept}\n capture={capture}\n id={_id}\n data-asset-source-name={assetSource.name}\n multiple={multiple}\n onChange={handleFileInputChange}\n type=\"file\"\n value=\"\"\n style={{display: 'none'}}\n />\n )\n })\n }, [accept, assetSources, capture, createAssetSourceInputId, handleFileInputChange, multiple])\n\n if (assetSources && assetSources.length > 1) {\n const menuItems = assetSources.map((assetSource) => renderMenuItemForAssetSource(assetSource))\n\n if (renderAsMenuGroup) {\n return (\n <>\n <MenuGroup\n icon={UploadIcon}\n text={t('input.files.common.upload-placeholder.file-input-button.text')}\n popover={MENU_GROUP_POPOVER}\n >\n {menuItems}\n </MenuGroup>\n {fileInputs}\n </>\n )\n }\n return (\n <>\n <MenuButton\n id={`${uniqId}_upload-button`}\n button={\n <Button\n data-testid=\"file-input-upload-button-0\"\n icon={UploadIcon}\n iconRight={ChevronDownIcon}\n mode=\"bleed\"\n disabled={uploadsDisabled}\n text={t('input.files.common.upload-placeholder.file-input-button.text')}\n />\n }\n menu={<Menu>{menuItems}</Menu>}\n popover={UPLOAD_DROP_DOWN_MENU_POPOVER}\n />\n {fileInputs}\n </>\n )\n }\n\n return null\n}\n","import {\n AccessDeniedIcon,\n BinaryDocumentIcon,\n ImageIcon,\n ReadOnlyIcon,\n UploadIcon,\n} from '@sanity/icons'\nimport {Flex, Text, useElementSize} from '@sanity/ui'\nimport {get} from 'lodash'\nimport {type FC, type ReactNode, useCallback, useMemo, useState} from 'react'\nimport {type SchemaType} from 'sanity'\nimport {useTranslation} from 'sanity'\nimport {S3AssetType} from 'sanity-plugin-s3-media-types'\nimport {styled} from 'styled-components'\n\nimport type {S3AssetSource} from '../../types'\nimport {FileInputButton} from '../File/FileInputButton'\nimport {UploadDropDownMenu} from './UploadDropDownMenu'\n\ninterface UploadPlaceholderProps {\n assetSources: S3AssetSource[]\n browse: ReactNode | undefined\n directUploads: boolean | undefined\n onUpload: ((assetSource: S3AssetSource, files: File[]) => void) | undefined\n readOnly: boolean | undefined\n schemaType: SchemaType\n type: S3AssetType\n}\n\nconst RootFlex = styled(Flex)`\n pointer-events: none;\n`\n\nexport const UploadPlaceholder: FC<UploadPlaceholderProps> = (props) => {\n const {assetSources, browse, directUploads, onUpload, readOnly, schemaType, type} = props\n\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null)\n const rect = useElementSize(rootElement)\n\n // Adjust the layout in narrow containers\n const collapsed = rect?.border && rect.border.width < 440\n\n const isFileType = type === S3AssetType.FILE\n const isVideoType = type === S3AssetType.VIDEO\n\n const {t} = useTranslation()\n\n const assetSourcesWithUpload = useMemo(() => {\n const result: S3AssetSource[] = assetSources.filter((s) => Boolean(s.Uploader))\n\n return result\n }, [assetSources])\n\n const handleSelectFiles = useCallback(\n (assetSource: S3AssetSource, files: File[]) => {\n if (onUpload) {\n onUpload(assetSource, files)\n }\n },\n [onUpload],\n )\n\n const accept = get(\n schemaType,\n 'options.accept',\n isFileType ? '' : isVideoType ? 'video/*' : 'image/*',\n )\n\n const uploadButton = useMemo(() => {\n switch (assetSourcesWithUpload.length) {\n case 0:\n return null\n case 1:\n return (\n <FileInputButton\n accept={accept}\n disabled={readOnly || directUploads === false}\n icon={UploadIcon}\n mode=\"bleed\"\n onSelect={(files) => {\n if (onUpload) {\n onUpload(assetSourcesWithUpload[0], files)\n }\n }}\n text={t('input.files.common.upload-placeholder.file-input-button.text')}\n />\n )\n default:\n return (\n <UploadDropDownMenu\n accept={accept}\n assetSources={assetSourcesWithUpload}\n directUploads={directUploads}\n onSelectFiles={handleSelectFiles}\n readOnly={readOnly}\n />\n )\n }\n }, [accept, assetSourcesWithUpload, directUploads, handleSelectFiles, onUpload, readOnly, t])\n\n const messageIcon = useMemo(() => {\n if (readOnly) {\n return <ReadOnlyIcon />\n }\n\n if (directUploads === false) {\n return <AccessDeniedIcon />\n }\n\n if (isVideoType || isFileType) {\n return <BinaryDocumentIcon />\n }\n\n return <ImageIcon />\n }, [directUploads, isFileType, isVideoType, readOnly])\n\n const messageText = useMemo(() => {\n if (directUploads === false) {\n return \"Can't upload files here\"\n }\n\n if (readOnly) {\n return 'Read only'\n }\n\n return isVideoType\n ? 'Drag or paste video here'\n : isFileType\n ? 'Drag or paste file here'\n : 'Drag or paste image here'\n }, [directUploads, readOnly, isFileType, isVideoType])\n\n return assetSourcesWithUpload.length === 0 ? null : (\n <Flex\n align={collapsed ? undefined : 'center'}\n direction={collapsed ? 'column' : 'row'}\n gap={4}\n justify=\"space-between\"\n paddingY={collapsed ? 1 : undefined}\n ref={setRootElement}\n >\n <Flex flex={1}>\n <RootFlex align=\"center\" gap={3} justify=\"center\" paddingLeft={1}>\n <Text muted size={1}>\n {messageIcon}\n </Text>\n\n <Text size={1} muted>\n {messageText}\n </Text>\n </RootFlex>\n </Flex>\n\n <Flex align=\"center\" gap={1} justify=\"center\" wrap=\"wrap\">\n {uploadButton}\n {browse}\n </Flex>\n </Flex>\n )\n}\n","import {Card, Code, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport {type FC, useEffect} from 'react'\nimport {LinearProgress, Translate, type UploadState, useTranslation} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {STALE_UPLOAD_MS} from '../../constants'\nimport {Button} from '../UI'\n\nconst FlexWrapper = styled(Flex)`\n box-sizing: border-box;\n text-overflow: ellipsis;\n overflow: hidden;\n overflow: clip;\n`\n\nconst LeftSection = styled(Stack)`\n position: relative;\n width: 60%;\n`\n\nconst CodeWrapper = styled(Code)`\n position: relative;\n width: 100%;\n\n code {\n overflow: hidden;\n overflow: clip;\n text-overflow: ellipsis;\n position: relative;\n max-width: 200px;\n }\n`\n\ninterface UploadProgressProps {\n uploadState: UploadState\n onCancel?: () => void\n onStale?: () => void\n}\n\nconst elapsedMs = (date: string): number => new Date().getTime() - new Date(date).getTime()\n\nexport const UploadProgress: FC<UploadProgressProps> = (props) => {\n const {uploadState, onCancel, onStale} = props\n const filename = uploadState.file.name\n\n useEffect(() => {\n if (elapsedMs(uploadState.updatedAt) > STALE_UPLOAD_MS) {\n onStale?.()\n }\n }, [uploadState.updatedAt, onStale])\n\n const {t} = useTranslation()\n\n return (\n <Card tone=\"primary\" border>\n <FlexWrapper\n padding={4}\n align=\"center\"\n justify=\"space-between\"\n height=\"fill\"\n direction=\"row\"\n gap={2}\n >\n <LeftSection>\n <Flex justify=\"center\" gap={[3, 3, 2, 2]} direction={['column', 'column', 'row']}>\n <Text size={1}>\n <Inline space={2}>\n <Translate\n t={t}\n i18nKey=\"input.files.common.upload-progress\"\n components={{\n FileName: () => <CodeWrapper size={1}>{filename ? filename : '…'}</CodeWrapper>,\n }}\n />\n </Inline>\n </Text>\n </Flex>\n\n <Card border marginTop={3} radius={5}>\n <LinearProgress value={uploadState.progress} />\n </Card>\n </LeftSection>\n\n {onCancel ? (\n <Button\n mode=\"ghost\"\n onClick={onCancel}\n text={t('input.files.common.cancel-upload')}\n tone=\"critical\"\n />\n ) : null}\n </FlexWrapper>\n </Card>\n )\n}\n","import {Box, Flex, Stack, Text, useGlobalKeyDown} from '@sanity/ui'\nimport {type FC, type MouseEvent, useCallback} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport type {S3AssetSource} from '../../types'\nimport {Button, Dialog} from '../UI'\n\ninterface UploadDestinationPickerProps {\n assetSources: S3AssetSource[]\n onSelectAssetSource?: (source: S3AssetSource | null) => void\n onClose?: () => void\n text?: string\n}\n\nexport const UploadDestinationPicker: FC<UploadDestinationPickerProps> = (props) => {\n const {assetSources, onSelectAssetSource, text, onClose} = props\n\n const assetSourcesWithUpload = assetSources.filter((s) => Boolean(s.Uploader))\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n const target = event.currentTarget as HTMLElement\n const sourceName = target.getAttribute('data-asset-source-name') as string\n const assetSource = assetSources.find((source) => source.name === sourceName)\n if (assetSource && onSelectAssetSource) {\n onSelectAssetSource(assetSource)\n }\n },\n [assetSources, onSelectAssetSource],\n )\n\n useGlobalKeyDown((event) => {\n if (event.key === 'Escape') {\n if (onClose) {\n onClose()\n }\n }\n })\n\n if (assetSourcesWithUpload.length === 0) {\n return null\n }\n\n return (\n <Dialog\n onClickOutside={onClose}\n onClose={onClose}\n id=\"upload-destination-picker\"\n header={\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n }\n width={1}\n bodyHeight=\"stretch\"\n >\n <Box padding={2}>\n <Stack space={2}>\n {assetSourcesWithUpload.map((assetSource) => {\n const Icon = assetSource.icon\n return (\n <Button\n key={assetSource.name}\n data-asset-source-name={assetSource.name}\n mode=\"bleed\"\n onClick={handleClick}\n tone=\"default\"\n tooltipProps={null}\n >\n <Flex align=\"center\">\n {isValidElementType(Icon) && <Icon style={{fontSize: '2rem'}} />}\n <Box>\n <Text>{assetSource.title}</Text>\n </Box>\n </Flex>\n </Button>\n )\n })}\n </Stack>\n </Box>\n </Dialog>\n )\n}\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n type ClipboardEvent,\n type ComponentType,\n type DragEvent,\n type KeyboardEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport type {FileInfo} from '../../types'\nimport {imageUrlToBlob} from '../../utils'\n\nconst extractDroppedFiles = async (dataTransfer: DataTransfer): Promise<File[]> => {\n return Array.from(dataTransfer.files)\n}\n\nconst extractPastedFiles = async (clipboardData: DataTransfer): Promise<File[]> => {\n return Array.from(clipboardData.files)\n}\n\ntype CamelToKebab<S extends string> = S extends `${infer P1}${infer P2}`\n ? P2 extends Uncapitalize<P2>\n ? `${Lowercase<P1>}${CamelToKebab<P2>}`\n : `${Lowercase<P1>}-${CamelToKebab<Uncapitalize<P2>>}`\n : S\n\ntype DataAttribute<S extends string> = `data-${CamelToKebab<S>}`\n\nconst fileTargetDataAttribute: Record<DataAttribute<'isFileTarget'>, 'true'> = {\n 'data-is-file-target': 'true',\n}\n\n// this is a hack for Safari that reads pasted image(s) from an ContentEditable div instead of the onpaste event\nconst convertImagesToFilesAndClearContentEditable = (\n element: HTMLElement,\n targetFormat = 'image/jpeg',\n): Promise<File[]> => {\n if (!element.isContentEditable) {\n return Promise.reject(\n new Error(\n `Expected element to be contentEditable=\"true\". Instead found a non contenteditable ${element.tagName}`,\n ),\n )\n }\n return new Promise((resolve) => setTimeout(resolve, 10)) // add a delay so the paste event can finish\n .then(() => Array.from(element.querySelectorAll('img')))\n .then((imageElements) => {\n element.innerHTML = '' // clear\n return imageElements\n })\n .then((images) => Promise.all(images.map((img) => imageUrlToBlob(img.src))))\n .then((imageBlobs) =>\n imageBlobs.map((blob) => new File([blob!], 'pasted-image.jpg', {type: targetFormat})),\n )\n}\n\n// needed by Edge\nconst select = (el: Element) => {\n const range = document.createRange()\n range.selectNodeContents(el)\n const sel = window.getSelection()\n sel?.removeAllRanges()\n sel?.addRange(range)\n}\n\ntype Props = {\n onFiles?: (files: File[]) => void\n onFilesOver?: (files: FileInfo[]) => void\n onFilesOut?: () => void\n pasteTarget?: HTMLElement\n disabled?: boolean\n}\n\ntype ManagedProps =\n | 'onDrop'\n | 'onDragOver'\n | 'onPaste'\n | 'onDragEnter'\n | 'onDragLeave'\n | 'onKeyDown'\n\nconst PASTE_INPUT_STYLE = {opacity: 0, position: 'absolute'} as const\n\nexport function UploadFileTarget<ComponentProps>(Component: ComponentType<ComponentProps>) {\n // eslint-disable-next-line react/display-name\n return (props: Omit<ComponentProps, ManagedProps> & Props) => {\n const {onFiles, onFilesOver, onFilesOut, pasteTarget, disabled, ...rest} = props\n const [showPasteInput, setShowPasteInput] = useState(false)\n\n const pasteInput = useRef<HTMLDivElement | null>(null)\n const ref = useRef<HTMLElement | null>(null)\n\n const enteredElements = useRef<Element[]>([])\n\n const emitFiles = useCallback(\n (files: File[]) => {\n onFiles?.(files)\n },\n [onFiles],\n )\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (\n !pasteTarget &&\n event.target === ref.current &&\n (event.ctrlKey || event.metaKey) &&\n event.key === 'v'\n ) {\n setShowPasteInput(true)\n }\n },\n [pasteTarget],\n )\n\n const handlePaste = useCallback(\n (event: ClipboardEvent) => {\n void extractPastedFiles(event.clipboardData)\n .then((files) => {\n if (pasteTarget) {\n return files\n }\n if (!pasteInput.current) {\n return []\n }\n return files.length > 0\n ? files\n : // Invoke Safari hack if we didn't get any files\n convertImagesToFilesAndClearContentEditable(pasteInput.current, 'image/jpeg')\n })\n .then((files) => {\n emitFiles(files)\n if (!pasteTarget) {\n setShowPasteInput(false)\n ref.current?.focus()\n }\n })\n },\n [emitFiles, pasteTarget],\n )\n\n useEffect(() => {\n if (pasteTarget) {\n const pasteTargetElementListener = (event: globalThis.ClipboardEvent) => {\n // Some applications may put both text and files on the clipboard when content is copied (Word, Excel etc).\n // If we have both text and html on the clipboard, the intention is probably to paste text, so ignore the files.\n const hasHtml = !!event.clipboardData?.getData('text/html')\n const hasText = !!event.clipboardData?.getData('text/plain')\n if (hasHtml && hasText) {\n console.warn(\n 'Clipboard contains both text and HTML, ignoring additional file data on the clipboard.',\n )\n return\n }\n handlePaste(event as unknown as ClipboardEvent)\n }\n pasteTarget.addEventListener('paste', pasteTargetElementListener)\n return () => {\n pasteTarget.removeEventListener('paste', pasteTargetElementListener)\n }\n }\n return undefined\n }, [pasteTarget, handlePaste])\n\n const handleDrop = useCallback(\n (event: DragEvent) => {\n enteredElements.current = []\n\n event.preventDefault()\n event.stopPropagation()\n const dataTransfer = event.nativeEvent.dataTransfer\n\n if (onFiles && dataTransfer) {\n void extractDroppedFiles(dataTransfer).then((files) => {\n if (files) {\n emitFiles(files)\n }\n })\n }\n onFilesOut?.()\n },\n [emitFiles, onFiles, onFilesOut],\n )\n\n const handleDragOver = useCallback(\n (event: DragEvent) => {\n if (onFiles) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n [onFiles],\n )\n\n const handleDragEnter = useCallback(\n (event: DragEvent) => {\n const fileTypes = Array.from(event.dataTransfer.items).map((item) => ({\n type: item.type,\n kind: item.kind,\n }))\n\n event.stopPropagation()\n\n if (onFilesOver && ref.current === event.currentTarget) {\n /* this is a (hackish) work around to have the drag and drop work when the file is hovered back and forth over it\n as part of the refactor and adding more components to the \"hover\" state, it didn't recognise that it just kept adding the same\n element over and over, so when it tried to remove them on the handleDragLeave, it only removed the last instance.\n */\n enteredElements.current = [...new Set(enteredElements.current), event.currentTarget]\n\n onFilesOver(fileTypes)\n }\n },\n [onFilesOver],\n )\n\n const handleDragLeave = useCallback(\n (event: DragEvent) => {\n event.stopPropagation()\n const idx = enteredElements.current.indexOf(event.currentTarget)\n if (idx > -1) {\n enteredElements.current.splice(idx, 1)\n }\n if (enteredElements.current.length === 0) {\n onFilesOut?.()\n }\n },\n [onFilesOut],\n )\n\n const prevShowPasteInput = useRef(false)\n\n useEffect(() => {\n if (!prevShowPasteInput.current && showPasteInput && pasteInput.current) {\n pasteInput.current.focus()\n select(pasteInput.current) // Needed by Edge\n } else if (prevShowPasteInput.current && !showPasteInput) {\n pasteInput.current?.focus()\n }\n prevShowPasteInput.current = showPasteInput\n }, [pasteTarget, showPasteInput])\n\n return (\n <>\n <Component\n {...(rest as ComponentProps)}\n ref={ref}\n onKeyDown={disabled ? undefined : handleKeyDown}\n onDragOver={disabled ? undefined : handleDragOver}\n onDragEnter={disabled ? undefined : handleDragEnter}\n onDragLeave={disabled ? undefined : handleDragLeave}\n onDrop={disabled ? undefined : handleDrop}\n {...fileTargetDataAttribute}\n />\n\n {!disabled && showPasteInput && (\n <div contentEditable onPaste={handlePaste} ref={pasteInput} style={PASTE_INPUT_STYLE} />\n )}\n </>\n )\n }\n}\n","import {AccessDeniedIcon, UploadIcon} from '@sanity/icons'\nimport {Box, Card, type CardTone, Flex, Inline, Layer, Text, useToast} from '@sanity/ui'\nimport {uniqBy} from 'lodash'\nimport {type FC, type ReactNode, useCallback, useMemo, useRef, useState} from 'react'\nimport {type FileLike, type InputOnSelectFileFunctionProps, type SchemaType,useTranslation} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport type {FileInfo, S3AssetSource, S3FileSchemaType, S3ImageSchemaType} from '../../types'\nimport {accepts} from '../../utils'\nimport {UploadDestinationPicker} from './UploadDestinationPicker'\nimport {UploadFileTarget} from './UploadFileTarget'\n\ntype FileEntry = {\n file: File\n schemaType: SchemaType | null\n assetSource: S3AssetSource | null\n}\n\nconst StyledCard = styled(Card)`\n height: 100%;\n`\n\nconst Overlay = styled(Layer)`\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n top: -2px;\n left: -2px;\n right: -2px;\n bottom: -2px;\n background-color: var(--card-bg-color);\n opacity: 0.8;\n`\n\nconst Sticky = styled(Box)`\n position: sticky;\n top: 0;\n bottom: 0;\n margin: auto;\n`\n\nconst fileMatchesSchema = (\n file: FileLike,\n schemaType: S3FileSchemaType | S3ImageSchemaType,\n): boolean => {\n const accept = schemaType.options?.accept\n\n if (!accept) return true\n return accepts(file, accept)\n}\n\nconst getFilesAndAssetSources = ({\n files,\n schemaType,\n assetSources,\n directUploads,\n destinationName,\n}: {\n files: File[]\n schemaType: S3FileSchemaType | S3ImageSchemaType\n assetSources: S3AssetSource[]\n directUploads: boolean | undefined\n destinationName: string | null\n}): FileEntry[] => {\n if (!directUploads) {\n return files.map((file) => ({\n file,\n schemaType: null,\n assetSource: null,\n }))\n }\n\n const uploadSources = assetSources.filter((s) => Boolean(s.Uploader))\n\n return files.map((file) => {\n if (!fileMatchesSchema(file, schemaType)) {\n return {file, schemaType: null, assetSource: null}\n }\n\n const assetSource =\n uploadSources.find((source) => !destinationName || source.name === destinationName) ?? null\n\n return {\n file,\n schemaType: assetSource ? schemaType : null,\n assetSource,\n }\n })\n}\n\ntype UploadTargetCardProps = Parameters<typeof Card>['0'] & {\n directUploads: boolean | undefined\n assetSources: S3AssetSource[]\n schemaType: S3FileSchemaType | S3ImageSchemaType\n isReadOnly?: boolean\n onSetHoveringFiles?: (files: FileInfo[]) => void\n onSelectFile?: (\n props: Omit<InputOnSelectFileFunctionProps, 'assetSource'> & {assetSource: S3AssetSource},\n ) => void\n pasteTarget?: HTMLElement\n children?: ReactNode\n}\n\nconst Root = styled.div`\n position: relative;\n`\n\nexport const UploadTargetCard: FC<UploadTargetCardProps> = (props) => {\n const {\n schemaType,\n children,\n assetSources,\n isReadOnly,\n pasteTarget,\n onSelectFile,\n onSetHoveringFiles,\n tone: toneFromProps,\n directUploads,\n ...rest\n } = props\n\n const assetSourcesWithUpload = useMemo(\n () => assetSources.filter((source) => Boolean(source.Uploader)),\n [assetSources],\n )\n\n const FileTarget = UploadFileTarget(StyledCard)\n\n const {push: pushToast} = useToast()\n const {t} = useTranslation()\n\n const [filesToUpload, setFilesToUpload] = useState<File[]>([])\n const [showAssetSourceDestinationPicker, setShowAssetSourceDestinationPicker] = useState(false)\n const [tone, setTone] = useState<CardTone>(\n toneFromProps || (isReadOnly ? 'transparent' : 'default'),\n )\n\n const assetSourceDestinationName = useRef<string | null>(null)\n\n const alertRejectedFiles = useCallback(\n (rejected: FileEntry[]) => {\n pushToast({\n closable: true,\n status: 'warning',\n title: t('inputs.array.error.cannot-upload-unable-to-convert', {\n count: rejected.length,\n }),\n description: rejected.map((task, i) => (\n // oxlint-disable-next-line no-array-index-key\n <Flex key={i} gap={2} padding={2}>\n <Box>\n <Text weight=\"medium\">{task.file.name}</Text>\n </Box>\n <Box>\n <Text size={1}>({task.file.type})</Text>\n </Box>\n </Flex>\n )),\n })\n },\n [pushToast, t],\n )\n\n // This is called after the user has dropped or pasted files and selected an asset source destination (if applicable)\n const handleUploadFiles = useCallback(\n (files: File[]) => {\n const filesAndAssetSources = getFilesAndAssetSources({\n files,\n directUploads,\n schemaType,\n assetSources,\n destinationName: assetSourceDestinationName.current,\n })\n\n const ready = filesAndAssetSources.filter((entry) => entry.assetSource !== null)\n const rejected = filesAndAssetSources.filter((entry) => entry.assetSource === null)\n\n if (rejected.length > 0) {\n alertRejectedFiles(rejected)\n }\n\n if (onSelectFile) {\n ready.forEach((entry) => {\n onSelectFile({\n assetSource: entry.assetSource!,\n schemaType: entry.schemaType!,\n file: entry.file,\n })\n })\n }\n },\n [directUploads, schemaType, assetSources, onSelectFile, alertRejectedFiles],\n )\n\n // This is called when files are dropped or pasted onto the upload target. It may show the asset source destination picker if needed.\n const handleFiles = useCallback(\n (files: File[]) => {\n if (isReadOnly) {\n return\n }\n\n const filesAndAssetSources = getFilesAndAssetSources({\n files,\n schemaType,\n destinationName: assetSourceDestinationName.current,\n assetSources,\n directUploads,\n })\n\n const ready = filesAndAssetSources.filter((entry) => entry.assetSource !== null)\n\n if (ready.length === 0) {\n alertRejectedFiles(filesAndAssetSources)\n return\n }\n\n const uniqueAssetSources = uniqBy(assetSourcesWithUpload, 'name')\n if (uniqueAssetSources.length > 1 && !assetSourceDestinationName.current) {\n setShowAssetSourceDestinationPicker(true)\n setFilesToUpload(files)\n return\n }\n setShowAssetSourceDestinationPicker(false)\n setFilesToUpload([])\n handleUploadFiles(ready.map((entry) => entry.file))\n },\n [\n isReadOnly,\n schemaType,\n assetSources,\n directUploads,\n assetSourcesWithUpload,\n handleUploadFiles,\n alertRejectedFiles,\n ],\n )\n\n const [hoveringFiles, setHoveringFiles] = useState<FileInfo[]>([])\n\n const handleFilesOver = useCallback(\n (files: FileInfo[]) => {\n if (isReadOnly) {\n return\n }\n setHoveringFiles(files)\n\n const acceptedFiles = files.filter((file) => fileMatchesSchema(file, schemaType))\n\n const rejectedFilesCount = files.length - acceptedFiles.length\n\n if (rejectedFilesCount > 0) {\n setTone('critical')\n } else if (acceptedFiles.length > 0) {\n setTone('primary')\n } else {\n setTone('default')\n }\n\n if (onSetHoveringFiles) {\n onSetHoveringFiles(files)\n }\n },\n [isReadOnly, onSetHoveringFiles, schemaType],\n )\n\n const handleFilesOut = useCallback(() => {\n if (isReadOnly) {\n return\n }\n setHoveringFiles([])\n setTone('default')\n if (onSetHoveringFiles) {\n onSetHoveringFiles([])\n }\n setFilesToUpload([])\n }, [isReadOnly, onSetHoveringFiles])\n\n // Asset sources may be returned for multiple types (file, image), we need to deduplicate them in order to show a unique list\n const assetSourcesWithUploadByName = uniqBy(assetSourcesWithUpload, 'name')\n\n const handleSetAssetSourceDestination = useCallback(\n (assetSource: S3AssetSource | null) => {\n assetSourceDestinationName.current = assetSource?.name ?? null\n if (filesToUpload.length > 0 && assetSource) {\n handleUploadFiles(filesToUpload)\n }\n setFilesToUpload([])\n setShowAssetSourceDestinationPicker(false)\n assetSourceDestinationName.current = null\n },\n [filesToUpload, handleUploadFiles],\n )\n\n const handleUploadDestinationPickerClose = useCallback(() => {\n handleFilesOver([])\n setFilesToUpload([])\n setShowAssetSourceDestinationPicker(false)\n assetSourceDestinationName.current = null\n }, [handleFilesOver])\n\n const uploadDestinationPickerText = t(\n 'inputs.files.common.placeholder.select-asset-source-upload-destination',\n {\n context: schemaType.name,\n },\n )\n\n const acceptedFiles = hoveringFiles.filter((file) => fileMatchesSchema(file, schemaType))\n\n const rejectedFilesCount = hoveringFiles.length - acceptedFiles.length\n\n return (\n <Root>\n {showAssetSourceDestinationPicker && (\n <UploadDestinationPicker\n assetSources={assetSourcesWithUploadByName}\n onSelectAssetSource={handleSetAssetSourceDestination}\n onClose={handleUploadDestinationPickerClose}\n text={uploadDestinationPickerText}\n />\n )}\n\n <FileTarget\n {...rest}\n tone={toneFromProps || tone}\n onFiles={handleFiles}\n onFilesOver={handleFilesOver}\n onFilesOut={handleFilesOut}\n pasteTarget={pasteTarget}\n >\n {hoveringFiles.length > 0 && (\n <Overlay zOffset={10}>\n <Sticky paddingBottom={3} paddingTop={3}>\n {acceptedFiles.length > 0 ? (\n <>\n <Inline space={2}>\n <Text>\n <UploadIcon />\n </Text>\n {t('inputs.files.common.drop-message.drop-to-upload')}\n <Text />\n </Inline>\n\n {rejectedFilesCount > 0 && (\n <Box marginTop={4}>\n <Inline space={2}>\n <Text muted size={1}>\n <AccessDeniedIcon />\n </Text>\n <Text muted size={1}>\n {t(\n 'inputs.files.common.drop-message.drop-to-upload.rejected-file-message',\n {\n count: rejectedFilesCount,\n },\n )}\n </Text>\n </Inline>\n </Box>\n )}\n </>\n ) : (\n <Inline space={2}>\n <Text>\n <AccessDeniedIcon />\n </Text>\n <Text>\n {t('inputs.files.common.drop-message.drop-to-upload.no-accepted-file-message', {\n count: hoveringFiles.length,\n })}\n </Text>\n </Inline>\n )}\n </Sticky>\n </Overlay>\n )}\n {children}\n </FileTarget>\n </Root>\n )\n}\n"],"names":["useKeyPress","hotkey","onPress","$","_c","keyPressed","useRef","t0","e","isHotkey","current","downHandler","t1","Symbol","for","upHandler","t2","t3","window","addEventListener","removeEventListener","useEffect","useTypedSelector","useSelector","accepts","file","acceptedFiles","acceptedFilesArray","Array","isArray","split","fileName","name","mimeType","type","toLowerCase","baseMimeType","replace","some","validType","trim","charAt","endsWith","hashFile","from","arrayBuffer","then","buffer","crypto","subtle","digest","hash","Uint8Array","map","b","toString","padStart","join","imageUrlToBlob","imageUrl","format","quality","match","Promise","reject","Error","resolve","loader","Image","crossOrigin","referrerPolicy","onload","canvas","document","createElement","width","height","getContext","drawImage","toBlob","error","src","constructFilter","assetTypes","searchQuery","documentAssetTypes","groq","JSON","stringify","PREVIEW_WIDTH","createBlob","img","imageAspect","Math","max","err","console","warn","createImageEl","blobUrlLarge","URL","createObjectURL","revokeObjectURL","generatePreviewBlobUrl","imageEl","blob","generatePreviewBlobUrl$","of","pipe","mergeMap","getAssetResolution","asset","metadata","dimensions","SCHEME_COLORS","bg","dark","hues","gray","hex","light","bg2","inputEnabledBorder","studioTheme","color","default","input","enabled","border","inputHoveredBorder","hovered","mutedHoveredBg","primary","muted","mutedHoveredFg","fg","mutedSelectedBg","selected","spotBlue","spot","blue","getSchemeColor","scheme","colorKey","getUniqueDocuments","documents","draftIds","reduce","acc","doc","_id","startsWith","concat","slice","filter","includes","S3AssetType","UPLOAD_STATUS_KEY","STALE_UPLOAD_MS","SUPPORTED_ASSET_TYPES","FILE","IMAGE","VIDEO","ORDER_OPTIONS","direction","field","UNSET_UPLOAD_PATCH","unset","createUploadEvent","patches","CLEANUP_EVENT","createInitialUploadPatches","now","Date","toISOString","value","progress","createdAt","updatedAt","set","createInitialUploadEvent","DEFAULT_CONCURRENCY","remove","array","item","index","indexOf","splice","createThrottler","concurrency","currentSubscriptions","pendingObservables","ready$","Subject","request","observable","Observable","observer","length","scheduleAndWait$","subscribe","subscription","push","unsubscribe","next","shift","asObservable","first","obs","withMaxConcurrency","func","throttler","args","FONT_SIZE","SUBTITLE_FONT_SIZE","SubtitleText","styled","Text","PreviewWrapper","Box","MenuItem","forwardRef","ref","Icon","IconRight","__unstable_space","__unstable_subtitle","badgeText","childrenProp","disabled","hotkeys","renderMenuItem","rest","text","tooltipProps","children","icon","iconRight","preview","undefined","jsx","opacity","Flex","jsxs","isValidElement","isValidElementType","t4","Stack","t5","Hotkeys","marginTop","marginBottom","Badge","t6","menuItemContent","t7","t8","t9","t10","UIMenuItem","t11","content","t12","t13","Tooltip","LARGE_BUTTON_PROPS","space","padding","DEFAULT_BUTTON_PROPS","TooltipButtonWrapper","span","Button","paddingLeft","paddingY","size","mode","tone","sizeProps","UIButton","Dialog","bodyHeight","footer","props","zOffset","animate","t","useTranslation","confirmButton","cancelButton","description","onClose","UIDialog","FileButton","attrs","forwardedAs","css","FileInputButton","accept","capture","idProp","multiple","onSelect","id","useId","event","target","files","handleChange","FileMenuItem","FileInputMenuItem","DropzoneDispatchContext","createContext","DropzoneDispatchProvider","open","contextValue","useDropzoneActions","context","useContext","AssetSourceDispatchContext","AssetBrowserDispatchProvider","useAssetSourceActions","s3FileAssetIdPattern","s3ImageAssetIdPattern","s3VideoAssetIdPattern","s3FileAssetFilenamePattern","s3ImageAssetFilenamePattern","s3VideoAssetFilenamePattern","s3AssetFilenamePattern","s3AssetIdPattern","RegExp","s3InProgressAssetId","s3VideoExtensions","Set","UnresolvableError","unresolvable","constructor","inputSource","message","isUnresolvableError","Boolean","getForgivingResolver","method","isObject","obj","isReference","_ref","isS3AssetObjectStub","stub","isInProgressUpload","_upload","isS3FileAsset","_type","isS3ImageAsset","isS3VideoAsset","getFilename","raw","test","pathname","withoutQuery","withoutHash","parts","parseS3FileAssetId","documentId","exec","assetId","extension","parseS3ImageAssetId","widthString","heightString","Number","parseS3VideoAssetId","parseS3FileAssetFilename","filename","parseS3ImageAssetFilename","parseS3VideoAssetFilename","parseS3AssetFilename","has","isAbsoluteUrl","buildS3FilePath","buildS3FileUrl","options","baseUrl","buildS3ImagePath","buildS3ImageUrl","buildS3VideoPath","buildS3VideoUrl","isValidS3Filename","getS3UrlPath","urlOrPath","normalized","getS3UrlFilename","tryGetS3UrlFilename","MAX_CONCURRENT_UPLOADS","fetchExistingAsset","client","assetType","fetch","documentType","tag","getImageDimensions","subscriber","url","cleanup","complete","onerror","catchError","getVideoDimensions","video","removeAttribute","load","onloadedmetadata","videoWidth","videoHeight","preload","getFileExtension","segments","buildFileName","fileId","buildDocumentId","buildAssetDocument","storeOriginalFilename","baseDocument","originalFilename","sha1hash","aspectRatio","createCompleteEvent","exists","uploadAsset","s3Client","sanityClient","existing","assets","create","uploadS3Asset","ClientError","statusCode","res","extractErrorProps","Object","assign","ServerError","body","response","responseBody","stringifyBody","details","httpErrorMessage","bodyObj","sliceWithEllipsis","statusMessage","headers","str","createFetchClient","controller","AbortController","signal","execute","attemptNumber","timeoutMs","timeout","timeoutId","setTimeout","abort","fetchOptions","clearTimeout","json","catch","status","statusText","fromEntries","entries","maxRetries","delay","retryDelay","pow","defineHttpRequest","config","fetchClient","seen","tap","warnings","forEach","msg","shouldIgnoreWarning","ignoreWarnings","pattern","defineCreateClientExports","ClassConstructor","createClient","clientRequester","requester","validateAssetType","upload","validators","bucketRegion","bucketKey","getSignedUrlEndpoint","secret","fileSize","fileType","executeUpload","stage","percent","loaded","total","lengthComputable","signedUrlResponse","contentType","signedUrl","canParse","xhr","XMLHttpRequest","onprogress","overallPercent","setRequestHeader","send","deleteAsset","deleteEndpoint","executeDelete","fileKey","ok","ObservableAssetsClient","AssetsClient","lastValueFrom","ObservableS3Client","httpRequest","clone","newConfig","withConfig","thisConfig","S3Client","exp","createS3Client","credentialsNamespace","pluginConfigKeys","key","title","S3MediaContext","S3MediaContextProvider","isCredentialsDialogDismissed","setIsCredentialsDialogDismissed","useState","secrets","credentials","loading","isCredentialsLoading","useSecrets","isCredentialsDialogOpen","s3AssetBaseUrl","cloudfrontDomain","buildAssetUrl","SettingsView","useS3MediaContext","S3MediaOptionsContext","directUploads","S3MediaOptionsContextProvider","useS3MediaOptionsContext","ORDER_DICTIONARY","_createdAt","asc","desc","_updatedAt","getOrderTitle","order","initialState","query","searchSlice","createSlice","reducers","querySet","state","action","payload","searchActions","actions","searchReducer","reducer","UPLOADS_ACTIONS","uploadComplete","createAction","defaultOrder","allIds","byIds","fetchCount","fetching","fetchingError","lastPicked","pageIndex","pageSize","view","assetsSlice","extraReducers","builder","addCase","picked","updating","clear","deleteComplete","assetIds","deleteIndex","floor","deleteError","itemErrors","items","deleteRequest","keys","deleteSkipped","reason","fetchComplete","fetchError","fetchRequest","_action","prepare","params","queryFilter","selector","sort","insertUploads","results","listenerCreateQueue","_state","listenerCreateQueueComplete","listenerDeleteQueue","listenerDeleteQueueComplete","listenerUpdateQueue","listenerUpdateQueueComplete","loadNextPage","loadPageIndex","orderSet","pick","pickAll","pickClear","values","pickRange","startIndex","findIndex","startId","endIndex","endId","indices","a","tagA","tagB","updateComplete","updateError","updateRequest","viewSet","assetsActions","assetsDeleteEpic","action$","_state$","referenceResults","referenceMap","Map","referenceCount","blockedAssets","get","deletableAssets","blockedIds","deletableIds","blockedActions$","EMPTY","deleteRequests","deleteFlow$","forkJoin","delete","assetsFetchEpic","state$","withLatestFrom","switchMap","result","assetsFetchPageIndexEpic","start","end","documentAssetIds","constructedFilter","search","assetsFetchNextPageEpic","assetsFetchAfterDeleteAllEpic","nextPageIndex","assetsOrderSetEpic","assetsSearchEpic","ofType","debounceTime","assetsListenerCreateQueueEpic","bufferTime","assetsListenerDeleteQueueEpic","assetsListenerUpdateQueueEpic","assetsSortEpic","assetsUnpickEpic","assetsUpdateEpic","closeDialogId","formData","patch","setIfMissing","opt","commit","updatedAsset","selectAssetsByIds","selectAssetsAllIds","selectAssetById","createSelector","selectAssets","selectAssetsLength","selectAssetsPicked","selectAssetsPickedLength","assetsPicked","assetsReducer","dialogSlice","showConfirmDeleteAssets","suffix","pluralize","confirmCallbackAction","assetItem","confirmText","headerTitle","showAssetEdit","dialogClearOnAssetUpdateEpic","dialogActions","dialogReducer","uploadsSlice","checkRequest","checkComplete","blobUrl","objectUrl","previewReady","uploadCancel","uploadError","uploadRequest","uploadProgress","uploadHash","uploadStart","uploadItem","uploadsActions","uploadsAssetStartEpic","merge","takeUntil","v","throwError","empty","uploadsAssetUploadEpic","forceAsAssetType","uploads","uploadsCompleteQueueEpic","uploadsCheckRequestEpic","documentIds","resultHashes","checkedResults","selectUploadById","uploadId","uploadsReducer","notificationsSlice","add","notificationsAssetsDeleteCompleteEpic","deletedCount","notificationsAssetsDeleteErrorEpic","count","notificationsAssetsDeleteSkippedEpic","notificationsAssetsUploadCompleteEpic","notificationsGenericErrorEpic","notificationsActions","notificationsReducer","rootEpic","combineEpics","selectedSlice","selectedReducer","dialog","notifications","rootReducer","combineReducers","selectCombinedItems","uploadIds","assetItems","Container","FileIcon","onClick","assetUrl","ReactFileIcon","defaultStyles","$scheme","$showCheckerboard","GRID_TEMPLATE_COLUMNS","SMALL","LARGE","PANEL_HEIGHT","CardWrapper","CardContainer","$picked","theme","$updating","sanity","orange","ContextActionContainer","BaseCardAsset","useColorSchemeValue","shiftPressed","dispatch","useDispatch","_temp","state_0","stopPropagation","kind","handleAssetClick","e_0","handleContextActionClick","opacityContainer","opacityPreview","cursor","position","transition","left","top","CheckmarkCircleIcon","Spinner","EditIcon","flexShrink","Checkbox","pointerEvents","transform","t14","t15","t16","Card","right","WarningFilledIcon","t17","CardAsset","memo","CardUpload","filesize","base","round","percentLoaded","isComplete","isUploading","isQueued","handleCancelUpload","background","bottom","transformOrigin","CloseIcon","boxShadow","CARD_HEIGHT","CARD_WIDTH","VirtualCell","StyledItemContainer","div","StyledListContainer","AssetGridVirtualized","onLoadMore","selectedAssets","_temp2","selectedIds","totalCount","Item","List","index_0","item_0","overflowX","overflowY","VirtuosoGrid","TableHeaderItem","isActive","handleClick","display","whiteSpace","marginRight","ChevronUpIcon","ChevronDownIcon","Label","TableHeader","itemsLength","numPickedAssets","mediaIndex","useMediaIndex","allSelected","alignItems","borderBottom","gridColumnGap","gridTemplateColumns","letterSpacing","textTransform","visibility","zIndex","Grid","REFERENCE_COUNT_VISIBILITY_DELAY","ContainerGrid","$selected","BaseTableRowAsset","referenceCountVisible","setReferenceCountVisible","refCountVisibleTimeout","opacityCell","gridRowGap","gridTemplateRows","gridColumn","gridRowStart","gridRowEnd","justifyContent","t18","t19","t20","t21","t22","t23","t24","t25","gridRow","t26","lineHeight","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","t44","t45","t46","t47","t48","t49","t50","t51","t52","t53","formatRelative","t54","t55","t56","t57","t58","t59","WithReferringDocuments","Fragment","t60","t61","t62","t63","t64","t65","t66","TableRowAsset","isLoading","referringDocuments","uniqueDocuments","customScrollbar","GlobalStyle","createGlobalStyle","UploadContainer","DragActiveContainer","filterFiles","fileList","filteredFiles","UploadDropzone","isImageAssetType","isVideoAssetType","handleDrop","rejections","flatMap","_temp3","handleDropRejected","dataTransfer","handleFileGetter","getFilesFromEvent","noClick","noDrag","onDrop","onDropRejected","getRootProps","getInputProps","isDragActive","useDropzone","white","code","errors","UPLOAD_DROP_DOWN_MENU_POPOVER","portal","MENU_GROUP_POPOVER","placement","fallbackPlacements","ASSET_SOURCE_DATA_ATTRIBUTE","UploadDropDownMenu","assetSources","onSelectFiles","readOnly","renderAsMenuGroup","uniqueId","uniqId","uploadsDisabled","assetSource","createAssetSourceInputId","assetSourceName","currentTarget","getAttribute","assetSource_0","find","source","element","getElementById","activeElement","click","handleMenuItemClick","assetSourceName_0","assetSource_1","source_0","renderMenuItemLabel","assetSource_2","inputId","startCase","renderMenuItemForAssetSource","event_0","assetSourceName_1","dataset","assetSource_3","source_1","preventDefault","handleFileInputChange","assetSource_4","fileInputs","assetSource_5","menuItems","MenuGroup","UploadIcon","Menu","MenuButton","RootFlex","UploadPlaceholder","browse","onUpload","schemaType","rootElement","setRootElement","rect","useElementSize","collapsed","isFileType","isVideoType","assetSourcesWithUpload","handleSelectFiles","bb0","files_0","uploadButton","bb1","ReadOnlyIcon","AccessDeniedIcon","BinaryDocumentIcon","ImageIcon","messageIcon","bb2","messageText","s","Uploader","FlexWrapper","LeftSection","CodeWrapper","Code","elapsedMs","date","getTime","UploadProgress","uploadState","onCancel","onStale","FileName","Inline","Translate","LinearProgress","UploadDestinationPicker","onSelectAssetSource","sourceName","useGlobalKeyDown","T0","T1","T2","fontSize","extractDroppedFiles","extractPastedFiles","clipboardData","fileTargetDataAttribute","convertImagesToFilesAndClearContentEditable","targetFormat","isContentEditable","querySelectorAll","imageElements","innerHTML","images","all","imageBlobs","File","tagName","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","PASTE_INPUT_STYLE","UploadFileTarget","Component","onFiles","onFilesOver","onFilesOut","pasteTarget","showPasteInput","setShowPasteInput","pasteInput","enteredElements","emitFiles","useCallback","handleKeyDown","ctrlKey","metaKey","handlePaste","focus","pasteTargetElementListener","hasHtml","getData","hasText","nativeEvent","handleDragOver","handleDragEnter","fileTypes","handleDragLeave","idx","prevShowPasteInput","StyledCard","Overlay","Layer","Sticky","fileMatchesSchema","getFilesAndAssetSources","destinationName","uploadSources","Root","UploadTargetCard","isReadOnly","onSelectFile","onSetHoveringFiles","toneFromProps","FileTarget","pushToast","useToast","filesToUpload","setFilesToUpload","showAssetSourceDestinationPicker","setShowAssetSourceDestinationPicker","setTone","assetSourceDestinationName","rejected","closable","alertRejectedFiles","filesAndAssetSources","ready","rejected_0","_temp4","entry_1","entry","handleUploadFiles","filesAndAssetSources_0","ready_0","_temp5","uniqBy","_temp6","handleFiles","hoveringFiles","setHoveringFiles","files_1","handleFilesOver","handleFilesOut","assetSourcesWithUploadByName","handleSetAssetSourceDestination","handleUploadDestinationPickerClose","uploadDestinationPickerText","file_0","acceptedFiles_0","rejectedFilesCount_0","rejectedFilesCount","task","i","entry_0","entry_2","entry_3"],"mappings":"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"}
|