feat(challenges): 实现自定义挑战的编辑与删除功能并完善多语言支持

- 新增自定义挑战的编辑模式,支持修改挑战信息
- 在详情页为创建者添加删除(归档)挑战的功能入口
- 全面完善挑战创建页面的国际化(i18n)文案适配
- 优化个人中心页面的字体样式,统一使用 AliBold/Regular
- 更新 Store 逻辑以处理挑战更新、删除及列表数据映射调整
This commit is contained in:
richarjiang
2025-11-26 19:07:19 +08:00
parent 39671ed70f
commit 518282ecb8
6 changed files with 866 additions and 160 deletions

View File

@@ -903,6 +903,8 @@ const challengeDetailResources = {
joining: '加入中…',
leave: '退出挑战',
leaving: '退出中…',
delete: '删除挑战',
deleting: '删除中…',
upcoming: '挑战即将开始',
expired: '挑战已结束',
},
@@ -935,6 +937,14 @@ const challengeDetailResources = {
},
joinFailed: '加入挑战失败',
leaveFailed: '退出挑战失败',
archiveConfirm: {
title: '确认删除该挑战?',
message: '删除后将无法恢复,参与者也将无法再访问此挑战。',
cancel: '取消',
confirm: '删除挑战',
},
archiveFailed: '删除挑战失败',
archiveSuccess: '挑战已删除',
},
ranking: {
title: '排行榜',
@@ -1011,6 +1021,8 @@ const challengeDetailResourcesEn = {
joining: 'Joining…',
leave: 'Leave Challenge',
leaving: 'Leaving…',
delete: 'Delete Challenge',
deleting: 'Deleting…',
upcoming: 'Starting Soon',
expired: 'Challenge Ended',
},
@@ -1043,6 +1055,14 @@ const challengeDetailResourcesEn = {
},
joinFailed: 'Failed to join challenge',
leaveFailed: 'Failed to leave challenge',
archiveConfirm: {
title: 'Delete this challenge?',
message: 'This cannot be undone and participants will lose access.',
cancel: 'Cancel',
confirm: 'Delete Challenge',
},
archiveFailed: 'Failed to delete challenge',
archiveSuccess: 'Challenge deleted',
},
ranking: {
title: 'Leaderboard',
@@ -1172,6 +1192,103 @@ const resources = {
ongoing: '进行中',
expired: '已结束',
},
createCustom: {
title: '新建挑战',
editTitle: '编辑挑战',
yourChallenge: '你的专属挑战',
defaultTitle: '自定义挑战',
basicInfo: '基础信息',
challengeSettings: '挑战设置',
displayInteraction: '展示&互动',
durationDays: '持续{{days}}天',
durationDaysChallenge: '{{days}}天挑战',
dayUnit: '天',
typeLabels: {
water: '喝水',
exercise: '运动',
diet: '饮食',
sleep: '睡眠',
mood: '心情',
weight: '体重',
},
fields: {
title: '标题',
titlePlaceholder: '挑战标题最多100字',
coverImage: '封面图',
uploadCover: '上传封面',
challengeDescription: '挑战说明',
descriptionPlaceholder: '简单介绍这个挑战的目标与要求',
challengeType: '挑战类型',
timeRange: '时间范围',
start: '开始',
end: '结束',
duration: '持续时间',
periodLabel: '周期标签',
periodLabelPlaceholder: '如21天挑战',
dailyTargetAndUnit: '每日目标值与进度单位',
dailyTargetPlaceholder: '如8',
unitPlaceholder: '单位',
unitHelper: '进度单位表示每日目标的计量单位,如:次、杯、分钟、页等',
minimumCheckInDays: '最少打卡天数',
minimumCheckInDaysPlaceholder: '至少1天',
challengeRequirement: '挑战要求说明',
requirementPlaceholder: '例如:每日完成 30 分钟运动',
maxParticipants: '参与人数上限',
noLimit: '留空表示无限制',
isPublic: '是否公开',
publicDescription: '公开后其他用户可通过邀请码加入',
},
buttons: {
createAndGenerateCode: '创建并生成邀请码',
updateAndSave: '保存修改',
creating: '创建中…',
updating: '更新中…',
},
floatingCTA: {
title: '生成自定义挑战',
editTitle: '编辑自定义挑战',
subtitle: '自动创建分享码,邀请好友一起挑战',
editSubtitle: '修改挑战信息,编辑后保存',
},
shareModal: {
title: '邀请码已生成',
subtitle: '分享给好友即可加入挑战',
copyCode: '复制邀请码',
viewChallenge: '查看挑战',
later: '稍后再说',
generatingCode: '获取中…',
},
alerts: {
titleRequired: '请填写挑战标题',
requirementRequired: '请填写挑战要求说明',
endTimeError: '结束时间需要晚于开始时间',
targetValueError: '每日目标值需在 1-1000 之间',
minimumDaysError: '最少打卡天数需在 1-365 之间',
minimumDaysExceedError: '最少打卡天数不能超过持续天数',
participantsError: '参与人数需在 2-10000 之间,或留空表示无限制',
createSuccess: '自定义挑战已创建',
updateSuccess: '挑战已更新',
createFailed: '创建失败,请稍后再试',
},
imageUpload: {
uploading: '上传中…',
clear: '清除',
helper: '建议比例 16:9清晰展示挑战氛围',
selectSource: '选择封面图',
camera: '拍照',
album: '从相册选择',
cancel: '取消',
cameraPermission: '权限不足',
cameraPermissionMessage: '需要相机权限以拍摄封面',
albumPermissionMessage: '需要相册权限以选择封面',
uploadFailed: '上传失败',
uploadFailedMessage: '封面上传失败,请稍后重试',
cameraFailed: '拍照失败',
cameraFailedMessage: '无法打开相机,请稍后再试',
selectFailed: '选择失败',
selectFailedMessage: '无法打开相册,请稍后再试',
},
},
},
},
},
@@ -2030,6 +2147,103 @@ const resources = {
ongoing: 'Ongoing',
expired: 'Expired',
},
createCustom: {
title: 'New Challenge',
editTitle: 'Edit Challenge',
yourChallenge: 'Your Custom Challenge',
defaultTitle: 'Custom Challenge',
basicInfo: 'Basic Info',
challengeSettings: 'Challenge Settings',
displayInteraction: 'Display & Interaction',
durationDays: 'Duration {{days}} days',
durationDaysChallenge: '{{days}}-Day Challenge',
dayUnit: 'day',
typeLabels: {
water: 'Water',
exercise: 'Exercise',
diet: 'Diet',
sleep: 'Sleep',
mood: 'Mood',
weight: 'Weight',
},
fields: {
title: 'Title',
titlePlaceholder: 'Challenge title (max 100 characters)',
coverImage: 'Cover Image',
uploadCover: 'Upload Cover',
challengeDescription: 'Challenge Description',
descriptionPlaceholder: 'Brief introduction to the challenge goals and requirements',
challengeType: 'Challenge Type',
timeRange: 'Time Range',
start: 'Start',
end: 'End',
duration: 'Duration',
periodLabel: 'Period Label',
periodLabelPlaceholder: 'e.g., 21-Day Challenge',
dailyTargetAndUnit: 'Daily Target & Unit',
dailyTargetPlaceholder: 'e.g., 8',
unitPlaceholder: 'Unit',
unitHelper: 'Progress unit represents the measurement unit for daily goals, such as: times, cups, minutes, pages, etc.',
minimumCheckInDays: 'Minimum Check-in Days',
minimumCheckInDaysPlaceholder: 'At least 1 day',
challengeRequirement: 'Challenge Requirement',
requirementPlaceholder: 'e.g., Complete 30 minutes of exercise daily',
maxParticipants: 'Max Participants',
noLimit: 'Leave empty for unlimited',
isPublic: 'Public',
publicDescription: 'Others can join via invite code when public',
},
buttons: {
createAndGenerateCode: 'Create & Generate Code',
updateAndSave: 'Save Changes',
creating: 'Creating…',
updating: 'Updating…',
},
floatingCTA: {
title: 'Generate Custom Challenge',
editTitle: 'Edit Custom Challenge',
subtitle: 'Automatically create share code to invite friends',
editSubtitle: 'Modify challenge information, save after editing',
},
shareModal: {
title: 'Invite Code Generated',
subtitle: 'Share with friends to join the challenge',
copyCode: 'Copy Invite Code',
viewChallenge: 'View Challenge',
later: 'Later',
generatingCode: 'Generating…',
},
alerts: {
titleRequired: 'Please enter challenge title',
requirementRequired: 'Please enter challenge requirement description',
endTimeError: 'End time must be later than start time',
targetValueError: 'Daily target value must be between 1-1000',
minimumDaysError: 'Minimum check-in days must be between 1-365',
minimumDaysExceedError: 'Minimum check-in days cannot exceed duration days',
participantsError: 'Participants must be between 2-10000, or leave empty for unlimited',
createSuccess: 'Custom challenge created',
updateSuccess: 'Challenge updated',
createFailed: 'Creation failed, please try again later',
},
imageUpload: {
uploading: 'Uploading…',
clear: 'Clear',
helper: 'Recommended ratio 16:9, clearly display challenge atmosphere',
selectSource: 'Select Cover Image',
selectMessage: 'Please select image source',
camera: 'Camera',
album: 'From Album',
cancel: 'Cancel',
cameraPermission: 'Permission Denied',
cameraPermissionMessage: 'Camera permission is required to take cover photo',
uploadFailed: 'Upload Failed',
uploadFailedMessage: 'Cover upload failed, please try again later',
cameraFailed: 'Camera Failed',
cameraFailedMessage: 'Unable to open camera, please try again later',
selectFailed: 'Selection Failed',
selectFailedMessage: 'Unable to open album, please try again later',
},
},
},
},
},