// Author: fruit.com.cn import type { FormItemRule, FormRules } from 'element-plus' import type { MediaTranscodeProfile } from '@/api/admin/types' import { MAX_QUALITY_LENGTH, MAX_SEGMENT_SECONDS, MAX_SPRITE_COLUMNS, MAX_SPRITE_INTERVAL, MAX_THUMB_WIDTH, MIN_SPRITE_COLUMNS, MIN_SEGMENT_SECONDS, MIN_SPRITE_INTERVAL, MIN_THUMB_WIDTH } from './transcodeProfileDefaults' type Translate = (key: string, named?: Record) => string const rangeRule = (min: number, max: number, t: Translate): FormItemRule => ({ trigger: 'change', validator: (_rule, value, callback) => { const parsed = Number(value) callback( Number.isInteger(parsed) && parsed >= min && parsed <= max ? undefined : new Error(t('transcodeSettings.validation.range', { min, max })) ) } }) export const positiveIntegerRule = (t: Translate): FormItemRule => ({ trigger: 'change', validator: (_rule, value, callback) => { const parsed = Number(value) callback( Number.isInteger(parsed) && parsed > 0 ? undefined : new Error(t('transcodeSettings.validation.positiveInteger')) ) } }) export const positiveEvenRule = (t: Translate): FormItemRule => ({ trigger: 'change', validator: (_rule, value, callback) => { const parsed = Number(value) callback( Number.isInteger(parsed) && parsed > 0 && parsed % 2 === 0 ? undefined : new Error(t('transcodeSettings.validation.positiveEven')) ) } }) export const createProfileRules = (t: Translate): FormRules => ({ segmentSeconds: [rangeRule(MIN_SEGMENT_SECONDS, MAX_SEGMENT_SECONDS, t)], 'sprite.intervalSeconds': [rangeRule(MIN_SPRITE_INTERVAL, MAX_SPRITE_INTERVAL, t)], 'sprite.columns': [rangeRule(MIN_SPRITE_COLUMNS, MAX_SPRITE_COLUMNS, t)], 'sprite.thumbWidth': [rangeRule(MIN_THUMB_WIDTH, MAX_THUMB_WIDTH, t)] }) export const createQualityRules = ( form: MediaTranscodeProfile, index: number, t: Translate ): FormItemRule[] => [ { trigger: 'blur', validator: (_rule, value, callback) => { const quality = String(value ?? '').trim() if (!quality) { callback(new Error(t('transcodeSettings.validation.required'))) return } if (quality.length > MAX_QUALITY_LENGTH) { callback(new Error(t('transcodeSettings.validation.qualityTooLong'))) return } const duplicate = form.ladder.some( (row, rowIndex) => rowIndex !== index && row.quality.trim() === quality ) callback(duplicate ? new Error(t('transcodeSettings.validation.qualityUnique')) : undefined) } } ] export const createEnabledRules = (form: MediaTranscodeProfile, t: Translate): FormItemRule[] => [ { trigger: 'change', validator: (_rule, _value, callback) => { callback( form.ladder.some((row) => row.enabled) ? undefined : new Error(t('transcodeSettings.validation.atLeastOneEnabled')) ) } } ]