fix(P1): delete-confirm, daily-goal closed UI, meeting indicator, modal-confirm
P1 #4 — ConfirmModal (новый src/renderer/src/components/ui/ConfirmModal.tsx) с iOS-стилем + focus-trap (через Modal). Delete упражнения в Dashboard теперь спрашивает «Удалить упражнение?» с destructive-кнопкой. P1 #5 — Daily goal closed UI. ExerciseCard принимает doneToday prop и при `done >= dailyGoal` показывает «Цель закрыта · 100/100» вместо запутанного «25ч 13м» countdown'а. Цвет — success-зелёный. P1 #6 — Meeting auto-pause indicator. Новый IPC.getMeetingActive + evtMeetingChanged event. meeting-detect broadcast'ит изменения состояния. Dashboard показывает info-баннер «Не дёргаем — ты на встрече» когда meetingAutoPause включён и хотя бы один meeting процесс запущен. P1 #7 — Native window.confirm() заменён на ConfirmModal в Settings DataCard для restore-операции. Теперь iOS-style с destructive confirm-кнопкой и focus-trap'ом. Заодно P2 #8: Brain-иконка-badge на ExerciseCard для adaptive упражнений — пользователь видит почему «Next» не строго равен intervalMinutes. P2 #12: dailyReps/dailyRepsRange/totalDoneReps/repsDoneTodayForExercise используют entry.reps как fallback — heatmap не теряет данные после удаления упражнения.
This commit is contained in:
@@ -39,6 +39,26 @@ function shiftDays(base: Date, dayDelta: number): Date {
|
||||
* связанного Exercise)
|
||||
* 3. byId.get(exerciseId).reps — fallback для старых entries без snapshot'а
|
||||
*/
|
||||
/**
|
||||
* Сколько reps конкретное упражнение принесло за сегодня. Учитываем как
|
||||
* обычные «по таймеру», так и match-челленджи (если их exerciseId совпадает,
|
||||
* чего обычно нет; но fallback не помешает).
|
||||
*/
|
||||
export function repsDoneTodayForExercise(
|
||||
entries: HistoryEntry[],
|
||||
exercise: Exercise
|
||||
): number {
|
||||
const today = todayKey()
|
||||
let sum = 0
|
||||
for (const e of entries) {
|
||||
if (e.action !== 'done') continue
|
||||
if (e.exerciseId !== exercise.id) continue
|
||||
if (dayKey(e.ts) !== today) continue
|
||||
sum += e.actualReps ?? e.reps ?? exercise.reps
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
export function dailyReps(
|
||||
entries: HistoryEntry[],
|
||||
exercises: Exercise[],
|
||||
|
||||
Reference in New Issue
Block a user