feat(challenges): 支持自定义挑战类型并优化必填字段验证
- 新增 CUSTOM 挑战类型枚举值 - requirementLabel 字段改为可选,允许为空并添加默认值处理 - minimumCheckInDays 最大值从 365 提升至 1000,支持更长周期挑战 - 推送通知模板支持自定义挑战的动态文案生成 - 新增 getCustomEncouragementTemplate 和 getCustomInvitationTemplate 函数
This commit is contained in:
@@ -46,6 +46,9 @@ export const ENCOURAGEMENT_TEMPLATES = {
|
||||
{ title: '团队体重挑战', body: '今天体重挑战群里又有很多人完成了目标!一起健康生活!' },
|
||||
{ title: '健康生活记录', body: '挑战者们都在坚持健康饮食+适量运动,你也是其中一员!' },
|
||||
],
|
||||
[ChallengeType.CUSTOM]: [
|
||||
// 自定义挑战使用动态模板,不在此处定义
|
||||
],
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -82,6 +85,9 @@ export const INVITATION_TEMPLATES = {
|
||||
{ title: '健康体重挑战', body: '21天体重管理,见证自己的变化!' },
|
||||
{ title: '体重目标挑战', body: '科学管理体重,享受健康生活!' },
|
||||
],
|
||||
[ChallengeType.CUSTOM]: [
|
||||
// 自定义挑战使用动态模板,不在此处定义
|
||||
],
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -106,7 +112,12 @@ export function getRandomTemplate<T>(templates: T[]): T {
|
||||
/**
|
||||
* 根据挑战类型获取鼓励文案
|
||||
*/
|
||||
export function getEncouragementTemplate(challengeType: ChallengeType) {
|
||||
export function getEncouragementTemplate(challengeType: ChallengeType, challengeTitle?: string) {
|
||||
// 自定义挑战使用动态模板
|
||||
if (challengeType === ChallengeType.CUSTOM && challengeTitle) {
|
||||
return getCustomEncouragementTemplate(challengeTitle);
|
||||
}
|
||||
|
||||
const templates = ENCOURAGEMENT_TEMPLATES[challengeType] || ENCOURAGEMENT_TEMPLATES[ChallengeType.EXERCISE];
|
||||
return getRandomTemplate(templates);
|
||||
}
|
||||
@@ -114,7 +125,12 @@ export function getEncouragementTemplate(challengeType: ChallengeType) {
|
||||
/**
|
||||
* 根据挑战类型获取邀请文案
|
||||
*/
|
||||
export function getInvitationTemplate(challengeType: ChallengeType) {
|
||||
export function getInvitationTemplate(challengeType: ChallengeType, challengeTitle?: string) {
|
||||
// 自定义挑战使用动态模板
|
||||
if (challengeType === ChallengeType.CUSTOM && challengeTitle) {
|
||||
return getCustomInvitationTemplate(challengeTitle);
|
||||
}
|
||||
|
||||
const templates = INVITATION_TEMPLATES[challengeType] || INVITATION_TEMPLATES[ChallengeType.EXERCISE];
|
||||
return getRandomTemplate(templates);
|
||||
}
|
||||
@@ -124,4 +140,30 @@ export function getInvitationTemplate(challengeType: ChallengeType) {
|
||||
*/
|
||||
export function getGeneralInvitationTemplate() {
|
||||
return getRandomTemplate(GENERAL_INVITATION_TEMPLATES);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成自定义挑战的鼓励文案模板
|
||||
*/
|
||||
export function getCustomEncouragementTemplate(challengeTitle: string) {
|
||||
const templates = [
|
||||
{ title: `${challengeTitle}进行中`, body: `今天已有多人参与「${challengeTitle}」!你也要加油哦!` },
|
||||
{ title: `${challengeTitle}提醒`, body: `挑战伙伴们都在坚持「${challengeTitle}」,每一步努力都值得!` },
|
||||
{ title: `${challengeTitle}打卡`, body: `看到很多挑战者都在参与「${challengeTitle}」,你也是其中一员!` },
|
||||
{ title: `团队挑战`, body: `「${challengeTitle}」挑战群里又有很多人完成了目标!别掉队,一起加油!` },
|
||||
{ title: `挑战分享`, body: `挑战者们都在分享「${challengeTitle}」的心得,你今天打卡了吗?` },
|
||||
];
|
||||
return getRandomTemplate(templates);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成自定义挑战的邀请文案模板
|
||||
*/
|
||||
export function getCustomInvitationTemplate(challengeTitle: string) {
|
||||
const templates = [
|
||||
{ title: `${challengeTitle}邀请`, body: `加入「${challengeTitle}」,一起挑战自我,收获成长!` },
|
||||
{ title: `挑战邀请`, body: `「${challengeTitle}」正在进行中,快来加入我们吧!` },
|
||||
{ title: `一起挑战`, body: `开启「${challengeTitle}」之旅,遇见更好的自己!` },
|
||||
];
|
||||
return getRandomTemplate(templates);
|
||||
}
|
||||
Reference in New Issue
Block a user