72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import { t } from '@/i18n'
|
||
import type { ImageVariant, VariantFormat } from '@/composables/useImageVariants'
|
||
import { formatType } from '@/lib/mediaFormat'
|
||
import { formatDimensions, formatLabel } from '@/lib/variants/variantFormat'
|
||
|
||
const SEPARATOR = ' · '
|
||
const VECTOR = 'Vector'
|
||
const SVG_TYPE = 'image/svg+xml'
|
||
const ORIGINAL_VALUE = ''
|
||
|
||
export interface VariantOption {
|
||
value: string
|
||
label: string
|
||
}
|
||
|
||
export interface OptionSource {
|
||
url: string
|
||
width: number | null
|
||
height: number | null
|
||
content_type: string
|
||
}
|
||
|
||
export const ORIGINAL_OPTION_VALUE = ORIGINAL_VALUE
|
||
|
||
export function isVector(source: OptionSource) {
|
||
return source.content_type === SVG_TYPE
|
||
}
|
||
|
||
function sourceSize(source: OptionSource) {
|
||
if (source.width === null || source.height === null) {
|
||
return t(VECTOR)
|
||
}
|
||
return `${source.width}×${source.height}`
|
||
}
|
||
|
||
export function capitalised(name: string) {
|
||
return name.charAt(0).toUpperCase() + name.slice(1)
|
||
}
|
||
|
||
export function originalOption(source: OptionSource): VariantOption {
|
||
return {
|
||
value: ORIGINAL_VALUE,
|
||
label: [t('Original'), sourceSize(source), formatType(source.content_type)].join(SEPARATOR),
|
||
}
|
||
}
|
||
|
||
export function bareOriginalOption(): VariantOption {
|
||
return { value: ORIGINAL_VALUE, label: t('Original') }
|
||
}
|
||
|
||
export function variantOption(variant: ImageVariant): VariantOption {
|
||
return {
|
||
value: variant.name,
|
||
label: [
|
||
capitalised(variant.name),
|
||
formatDimensions(variant.width, variant.height),
|
||
formatLabel(variant.format as VariantFormat),
|
||
].join(SEPARATOR),
|
||
}
|
||
}
|
||
|
||
export function buildOptions(source: OptionSource, variants: ImageVariant[]): VariantOption[] {
|
||
const offered = isVector(source) ? [] : variants.map(variantOption)
|
||
return [originalOption(source), ...offered]
|
||
}
|
||
|
||
export function insertedUrl(source: OptionSource, variantName: string) {
|
||
return variantName === ORIGINAL_VALUE
|
||
? source.url
|
||
: `${source.url}?v=${encodeURIComponent(variantName)}`
|
||
}
|