// @todo: remove the following line when part imports has been removed from this file /// import FileIcon from 'part:@sanity/base/file-icon' import React, {useMemo} from 'react' import {Box, Card, Flex, Stack, Text} from '@sanity/ui' import styled from 'styled-components' import {isFileSource} from '@sanity/asset-utils' import {WarningOutlineIcon} from '@sanity/icons' import { DiffComponent, DiffCard, DiffTooltip, FromTo, MetaInfo, ChangeList, ObjectDiff, } from '../../../diff' import {useRefValue} from '../../../diff/hooks' import {getSizeDiff} from './helpers' import {File, FileAsset} from './types' const SizeDiff = styled.div` ${({theme}) => ` --size-diff-positive: ${theme.sanity.color.solid.positive.enabled.bg}; --size-diff-negative: ${theme.sanity.color.solid.critical.enabled.bg}; `} &:not([hidden]) { display: inline-block; } [data-number='positive'] { color: var(--size-diff-positive); } [data-number='negative'] { color: var(--size-diff-negative); } ` export const FileFieldDiff: DiffComponent> = ({diff, schemaType}) => { const {fromValue, toValue, fields} = diff const fromAsset = fromValue?.asset const toAsset = toValue?.asset const prev = useRefValue(fromAsset?._ref) const next = useRefValue(toAsset?._ref) const fromInvalid = fromAsset?._ref && !isFileSource(fromAsset?._ref) const toInvalid = toAsset?._ref && !isFileSource(toAsset?._ref) const changedFields = Object.keys(fields).filter( (name) => fields[name].isChanged && name !== '_type' ) const didAssetChange = changedFields.includes('asset') const nestedFields = schemaType.fields .filter((field) => field.name !== 'asset' && changedFields.includes(field.name)) .map((field) => field.name) // Sizes in MB TODO: improve. Apple uses 1000^2 const prevSize = prev?.size && prev.size / 1000 / 1000 const nextSize = next?.size && next.size / 1000 / 1000 const pctDiff = getSizeDiff(prevSize, nextSize) const roundedPrevSize = prevSize ? prevSize.toFixed(2) : undefined const roundedNextSize = nextSize ? nextSize.toFixed(2) : undefined const cardStyles = useMemo(() => ({display: 'block', flex: 1}), []) const from = prev && ( {fromInvalid && ( Invalid file value )} {!fromInvalid && ( {`${roundedPrevSize}MB`} )} ) const to = next && ( {toInvalid && ( Invalid file value )} {!toInvalid && ( {`${roundedNextSize}MB`} {pctDiff !== 0 && ( 0 ? 'positive' : 'negative'}> {pctDiff > 0 && '+'} {pctDiff}% )} )} ) const FileAssetChange = ( <> {/* Removed only */} {from && !to && ( {from} )} {/* Removed and added */} {from && to && ( )} {/* Added only */} {!from && to && ( {to} )} ) return ( <> {didAssetChange && FileAssetChange} {nestedFields.length > 0 && ( )} ) }