scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
62 lines (49 loc) • 1.76 kB
text/typescript
import { ArgumentError, isValidInteger } from 'scrivito_sdk/common';
import { createStateContainer } from 'scrivito_sdk/state';
import { PreviewSize } from 'scrivito_sdk/ui_interface/app_adapter';
const state = createStateContainer<PreviewSize[]>();
interface PreviewSizeInput {
title: string;
width?: number | null;
description?: string;
icon?: string;
}
/** @public */
export function configurePreviewSizes(previewSizes: PreviewSizeInput[]): void {
if (!previewSizes.length) {
throw new ArgumentError(
'No sizes has been provided for "configurePreviewSizes"',
);
}
if (
!previewSizes.every(
(size) => typeof size.title === 'string' && size.title.length > 0,
)
) {
throw new ArgumentError('Each preview size must have a non-empty title');
}
const numericWidths = previewSizes
.map(({ width }) => width)
.filter((width) => typeof width === 'number');
if (new Set(numericWidths).size !== numericWidths.length) {
throw new ArgumentError('A "width" must be unique for sizes');
}
if (!previewSizes.every(validatePreviewSizeWidth)) {
throw new ArgumentError('A "width" must be a positive integer');
}
const normalizedPreviewSizes = previewSizes.map(normalizePreviewSize);
state.set(normalizedPreviewSizes);
}
function validatePreviewSizeWidth(previewSize: PreviewSizeInput) {
const width = previewSize?.width;
if (width === null || width === undefined) return true;
return isValidInteger(width) && width > 0;
}
export function getPreviewSizes(): PreviewSize[] | undefined {
return state.get();
}
function normalizePreviewSize(input: PreviewSizeInput): PreviewSize {
return input.width === null
? { ...input, width: undefined }
: (input as PreviewSize);
}