feat(challenges): 排行榜支持单位显示与健身圆环自动上报进度
- ChallengeRankingItem 新增 unit 字段,支持按单位格式化今日进度 - FitnessRingsCard 监听圆环闭合,自动向进行中的运动挑战上报 1 次进度 - 过滤已结束挑战,确保睡眠、喝水、运动进度仅上报进行中活动 - 移除 StressMeter 调试日志与 challengesSlice 多余打印
This commit is contained in:
@@ -8,9 +8,46 @@ type ChallengeRankingItemProps = {
|
||||
item: RankingItem;
|
||||
index: number;
|
||||
showDivider?: boolean;
|
||||
unit?: string;
|
||||
};
|
||||
|
||||
export function ChallengeRankingItem({ item, index, showDivider = false }: ChallengeRankingItemProps) {
|
||||
const formatNumber = (value: number): string => {
|
||||
if (Number.isInteger(value)) {
|
||||
return value.toString();
|
||||
}
|
||||
return value.toFixed(2).replace(/0+$/, '').replace(/\.$/, '');
|
||||
};
|
||||
|
||||
const formatMinutes = (value: number): string => {
|
||||
const safeValue = Math.max(0, Math.round(value));
|
||||
const hours = safeValue / 60;
|
||||
return `${hours.toFixed(1)} 小时`;
|
||||
};
|
||||
|
||||
const formatValueWithUnit = (value: number | undefined, unit?: string): string | undefined => {
|
||||
if (typeof value !== 'number' || Number.isNaN(value)) {
|
||||
return undefined;
|
||||
}
|
||||
if (unit === 'min') {
|
||||
return formatMinutes(value);
|
||||
}
|
||||
const formatted = formatNumber(value);
|
||||
return unit ? `${formatted} ${unit}` : formatted;
|
||||
};
|
||||
|
||||
export function ChallengeRankingItem({ item, index, showDivider = false, unit }: ChallengeRankingItemProps) {
|
||||
console.log('unit', unit);
|
||||
|
||||
const reportedLabel = formatValueWithUnit(item.todayReportedValue, unit);
|
||||
const targetLabel = formatValueWithUnit(item.todayTargetValue, unit);
|
||||
const progressLabel = reportedLabel && targetLabel
|
||||
? `今日 ${reportedLabel} / ${targetLabel}`
|
||||
: reportedLabel
|
||||
? `今日 ${reportedLabel}`
|
||||
: targetLabel
|
||||
? `今日目标 ${targetLabel}`
|
||||
: undefined;
|
||||
|
||||
return (
|
||||
<View style={[styles.rankingRow, showDivider && styles.rankingRowDivider]}>
|
||||
<View style={styles.rankingOrderCircle}>
|
||||
@@ -28,6 +65,11 @@ export function ChallengeRankingItem({ item, index, showDivider = false }: Chall
|
||||
{item.name}
|
||||
</Text>
|
||||
<Text style={styles.rankingMetric}>{item.metric}</Text>
|
||||
{progressLabel ? (
|
||||
<Text style={styles.rankingProgress} numberOfLines={1}>
|
||||
{progressLabel}
|
||||
</Text>
|
||||
) : null}
|
||||
</View>
|
||||
{item.badge ? <Text style={styles.rankingBadge}>{item.badge}</Text> : null}
|
||||
</View>
|
||||
@@ -85,9 +127,14 @@ const styles = StyleSheet.create({
|
||||
},
|
||||
rankingMetric: {
|
||||
marginTop: 4,
|
||||
fontSize: 13,
|
||||
fontSize: 12,
|
||||
color: '#6f7ba7',
|
||||
},
|
||||
rankingProgress: {
|
||||
marginTop: 2,
|
||||
fontSize: 10,
|
||||
color: '#8a94c1',
|
||||
},
|
||||
rankingBadge: {
|
||||
fontSize: 12,
|
||||
color: '#A67CFF',
|
||||
|
||||
Reference in New Issue
Block a user