// @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 && (
)}
>
)
}