AnRil
bef733a877
feat(meals): вкладка «Питание» — напоминания о еде по времени суток
...
Новая модель Meal — напоминание по настенным часам (time HH:MM + дни недели),
в отличие от interval-based Exercise. Отдельная вкладка «Питание» с пресетами
быстрого добавления (Завтрак/Обед/Ужин/Перекус).
- shared: тип Meal, meals в AppState, nextMealOccurrence (DST-safe), SAMPLE_MEALS,
MEAL_PRESETS; IPC-каналы meal:* + evtFireMeal
- main: валидация (строгая HH:MM-проверка диапазона), store-мутаторы с пересчётом
nextFireAt, scheduler.checkDueMeals (гейт только globalEnabled, grace-окно 120с,
игнор тихих часов/ВКС), notifications.fireMealReminder, IPC-хендлеры
- renderer: вкладка Meals + MealEditor (время/дни/иконка), MealReminder в окне
напоминания (Поел/Отложить, TTS), пункт в Sidebar, маршрут, i18n RU/EN, иконки
UtensilsCrossed/Soup
- persistence: meals additive (без bump схемы — старые state'ы получают [])
- +24 теста (203 -> 227): nextMealOccurrence, валидаторы приёмов пищи,
scheduler meal-gating (вкл/выкл, grace, игнор тихих часов)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-03 23:45:34 +07:00
AnRil
2b7eb412c7
fix: export/import — отмена пользователем не показывает error toast
...
Bug: при отмене save-dialog или open-dialog DataCard показывал тост
«Не удалось сохранить» / «Файл не подошёл». Но cancel — это не ошибка.
Расширил IPC возврат: { ok, canceled, path?, error? }. UI теперь
различает: ok → success toast, !ok && canceled → молча, !ok && !canceled
→ error toast.
+9 тестов на validateSettingsPatch для voicePromptsEnabled,
meetingAutoPause, lastSeenVersion (semver-regex / null-сброс /
malformed). Итого 159 → 168 тестов.
Settings → About теперь показывает текущую версию приложения
(раньше была только кнопка «Что нового»). Загружается через
IPC.getAppVersion при mount.
2026-05-22 23:26:11 +07:00
AnRil
36085f225f
test: expand coverage 53 → 135 (+82 tests)
...
Аудит тестов выявил критические пробелы в покрытии. Расширили
существующие файлы и добавили два новых:
Новые файлы:
- src/main/validate.test.ts (59) — security-boundary IPC layer вообще
не имел тестов. Покрывает NaN/Infinity, range edge cases, тип-
сабверсии, partial-patch semantics, quietHours regex+dedup.
Фиксирует контракт «strict для required, lenient для optional
defaults» (input принимает enabled:'yes' → true, patch строгий).
- src/renderer/src/lib/icon-choices.test.ts (3) — SAMPLE_EXERCISES.icon
⊆ ICON_CHOICES (иначе fallback-Activity на первом запуске).
Расширения:
- format.test.ts: NaN/Infinity guard, EN-локаль.
- history.test.ts: DST-safe инвариант (unique keys, monotonic),
plannedRepsToday, future-dated entries, mixed actions.
- i18n.test.ts: dict parity RU↔EN (с правильным skip для RU-only
*_few CLDR-категории), regex-injection в var-значениях,
weekday.short.* parity.
Рефакторинг:
- ICON_CHOICES вынесен в src/renderer/src/lib/icon-choices.ts
(без JSX) — теперь whitelist импортируется из любого слоя без
React-зависимости. icon.tsx реэкспортирует для обратной
совместимости.
2026-05-19 18:15:37 +07:00