完善样式系统与调试链路底座
This commit is contained in:
95
miniprogram/game/experience/contentCard.ts
Normal file
95
miniprogram/game/experience/contentCard.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
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: 12,
|
||||
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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user