Модули
Три части приложения, которые можно выключить. Тумблер — про внимание, а не про удаление.

Зачем они
Приложение обещает, что отметка занимает два касания. Каждая новая возможность это обещание разъедает: пятая вкладка, лишний блок на экране статистики, ещё один экран в настройках.
Модуль — это способ вернуть приложение к его ядру. Ядро — приоритеты, заряд и статистика — выключить нельзя.
Что выключается
| Модуль | Что исчезает | Что остаётся |
|---|---|---|
| Навыки | вкладка «Навыки», 13 достижений из знаменателя | каталог навыков, все накопленные часы, вся история кликов |
| Достижения | строка в настройках, экран достижений, уведомления о новых | все полученные отметки |
| Наблюдения | блок «Наблюдения» в статистике | ничего — наблюдения не хранятся, они вычисляются |
Выключенный модуль не теряет данных. Включите обратно — всё будет на месте.
Что происходит в момент переключения
- Если вы стояли на вкладке «Навыки» и выключили модуль, приложение само перебросит вас на главную: оставить человека на исчезнувшей вкладке нельзя.
- Если открыт экран достижений и модуль выключен — экран закроется.
- При включении навыков приложение сначала дочитывает историю из облака и только потом показывает вкладку. Клик, сделанный в этот промежуток, иначе затёрся бы приехавшей картой.
Достижения и модуль «Навыки»
13 достижений считаются только по навыкам. При выключенном модуле они уходят из знаменателя: счётчик показывает «Открыто 12 из 62», а не вечно недостижимый остаток из 75.
Уже полученные при этом не пропадают — они просто не видны, пока модуль выключен.
Записи, сделанные до появления модулей
Настройки, записанные старой версией приложения, читаются как «всё включено». Новая возможность должна показать себя сама, а не ждать, пока её найдут в настройках.
Рядом
Настройки · Навыки · Достижения · Наблюдения
Как это работает внутри
- Флаги —
Modulesвsrc/domain/types.ts; полеmodulesвSettingsобъявлено обязательным намеренно: так забытый модуль в любой новой конструкции настроек становится ошибкой компиляции. sanitizeModulesподставляетtrueза любое отсутствующее поле — это и есть чтение старых записей как «всё включено».- Переходы после выключения — эффекты в
src/App.tsx. setModule('skills', true)дожидаетсяloadSkillClicksперед подъёмом флага (src/store/useStore.tsx).- Знаменатель достижений считает
awardProgress(awards, skillsEnabled)вsrc/achievements/evaluate.ts. - Модули «Навыки» и «Достижения» лежат отдельными папками и связаны с остальным приложением ровно тремя точками: флагом в
Settings.modules, вкладкой вApp.tsxи полями состояния в сторе. Состояние при этом держится в главном сторе, а не в своём провайдере: сброс, экспорт, импорт и отложенная запись обязаны быть согласованы — это вопрос сохранности данных, а не раскладки по файлам.