Сброс
Две кнопки разной глубины внизу настроек. Обе необратимы.

Что именно исчезает
| Стереть историю | Сбросить кабинет | |
|---|---|---|
| Клики по приоритетам | исчезают | исчезают |
| Журнал заряда и ответы о разряде | исчезают | исчезают |
| Часы навыков, набранные кликами | исчезают | исчезают |
| Часы навыков, вписанные вручную | остаются | исчезают |
| Список приоритетов и архив | остаются | исчезают |
| Список навыков и архив | остаются | исчезают |
| Автоматические достижения | снимаются | исчезают |
| Достижения за действие и ручные | остаются | исчезают |
| Настройки (цена блока, модули, набор) | остаются | исчезают |
| Куда попадёте после | на главную | в онбординг |
Почему автоматические достижения снимаются, а ручные — нет
Автоматическое достижение — это вывод из данных. Данных больше нет, значит и вывода быть не может: держать «месяц без пропусков» при пустом журнале было бы враньём.
Ручные и выданные за действие — это факты, а не выводы. Вы пробежали марафон и сделали обои; история кликов к этому отношения не имеет.
Почему стартовый капитал навыка переживает «стереть историю»
По той же причине. «В гитару вложено 1640 часов до приложения» — не вывод из кликов, а вписанное вами утверждение о прошлом. Оно и живёт в другом месте хранилища — в ключе без даты, который шаблон истории не задевает.
Насколько далеко достаёт сброс
Если вы вошли — сброс задевает все ваши устройства
Стирание — это барьер в журнале, а не удаление строк на месте. Барьер уезжает на сервер обычным обменом, и телефон, планшет и компьютер применяют его каждый у себя.
Пока вы не вошли, история никуда не едет, и сброс удаляет её только здесь.
Приложение говорит это прямо — приписка стоит под обеими кнопками и меняется в зависимости от того, где вы открыли приложение.
Перед тем как нажать
Сделайте копию. Отката нет: стирание — это не пропажа строк, а барьер в журнале, и он доезжает до всех ваших устройств обычным обменом.
Пределы и предупреждения
- Обе кнопки спрашивают подтверждение, и текст подтверждения называет число блоков, которые исчезнут.
- Кнопки заблокированы, пока идёт экспорт, импорт или другой сброс.
- В демо сброс не касается настоящих данных: хранилище там подменено памятью. На экране он при этом отрабатывает честно — и всё возвращается перезагрузкой. В гостевом виде этих кнопок нет вовсе.
Рядом
Настройки · Копия данных · Данные и синхронизация · Достижения
Как это работает внутри
resetHistory()иresetEverything()вsrc/store/useStore.tsx.- Перед обоими вызывается
dropPendingWrites(): он гасит таймер, чистит очередь и дожидается уже идущих записей. Иначе взведённый последним кликом таймер дописал бы месяц обратно поверх стёртого. clearHistory()удаляет ключи, а не пишет в них пустые объекты. Иначе в облаке остались бы месяцы, которых нет в памяти, и следующая загрузка вернула бы стёртое.- Одного удаления мало: на втором устройстве месяц остаётся в локальной копии и воскресает при слиянии. Поэтому сброс ещё и поднимает номер поколения (
mp:v), а второе устройство при запуске видит расхождение и выбрасывает свою локальную историю до слияния. - Шаблон ключей истории —
/^mp:[pbk]:(\d{4}-\d{2})$/. Ключиmp:kиmp:aпод него не подходят: у них нет даты, и это не случайность, а способ отделить «выведенное» от «вписанного». - Снятие автоматических достижений —
stripAutoвsrc/achievements/evaluate.ts; он сохраняет незнакомые идентификаторы, чтобы старая версия клиента не стирала достижения из новой. resetHistoryобнуляет иcarryBlocksкаждого навыка — свёрнутые часы тоже выведены из кликов.