export type ContentCardTemplate = 'minimal' | 'story' | 'focus' export type ContentCardCtaType = 'detail' | 'photo' | 'audio' | 'quiz' export interface ContentCardQuizConfig { bonusScore: number countdownSeconds: number minValue: number maxValue: number allowSubtraction: boolean } export interface ContentCardCtaConfig { type: ContentCardCtaType label: string quiz: ContentCardQuizConfig | null } export interface ContentCardCtaConfigOverride { type?: ContentCardCtaType label?: string bonusScore?: number countdownSeconds?: number minValue?: number maxValue?: number allowSubtraction?: boolean } export interface ContentCardActionViewModel { key: string type: ContentCardCtaType label: string } export const DEFAULT_CONTENT_CARD_QUIZ_CONFIG: ContentCardQuizConfig = { bonusScore: 1, countdownSeconds: 10, minValue: 10, maxValue: 999, allowSubtraction: true, } export function buildDefaultContentCardCtaLabel(type: ContentCardCtaType): string { if (type === 'detail') { return '查看详情' } if (type === 'photo') { return '拍照打卡' } if (type === 'audio') { return '语音留言' } return '答题加分' } export function buildDefaultContentCardQuizConfig( override?: ContentCardCtaConfigOverride | null, ): ContentCardQuizConfig { const minValue = Number(override && override.minValue) const maxValue = Number(override && override.maxValue) return { bonusScore: Number.isFinite(Number(override && override.bonusScore)) ? Math.max(1, Math.round(Number(override && override.bonusScore))) : DEFAULT_CONTENT_CARD_QUIZ_CONFIG.bonusScore, countdownSeconds: Number.isFinite(Number(override && override.countdownSeconds)) ? Math.max(5, Math.round(Number(override && override.countdownSeconds))) : DEFAULT_CONTENT_CARD_QUIZ_CONFIG.countdownSeconds, minValue: Number.isFinite(minValue) ? Math.max(10, Math.round(minValue)) : DEFAULT_CONTENT_CARD_QUIZ_CONFIG.minValue, maxValue: Number.isFinite(maxValue) ? Math.max( Number.isFinite(minValue) ? Math.max(10, Math.round(minValue)) : DEFAULT_CONTENT_CARD_QUIZ_CONFIG.minValue, Math.round(maxValue), ) : DEFAULT_CONTENT_CARD_QUIZ_CONFIG.maxValue, allowSubtraction: override && typeof override.allowSubtraction === 'boolean' ? override.allowSubtraction : DEFAULT_CONTENT_CARD_QUIZ_CONFIG.allowSubtraction, } } export function resolveContentCardCtaConfig( override: ContentCardCtaConfigOverride | null | undefined, ): ContentCardCtaConfig | null { const type = override && override.type if (type !== 'detail' && type !== 'photo' && type !== 'audio' && type !== 'quiz') { return null } return { type, label: override && override.label ? override.label : buildDefaultContentCardCtaLabel(type), quiz: type === 'quiz' ? buildDefaultContentCardQuizConfig(override) : null, } }