fix(textbooks): retroactive-фикс существующих достижений Алгебры 8

Прошлый коммит хранил название в Map, но старые записи в LocalStorage (Set из id-ов) подгружались с id в качестве текста — пользователь по-прежнему видел 'ring36', 'start'.

Фикс: словарь ACH_LABELS (id → название) применяется при загрузке как fallback:
- старый формат массив id-ов: id → ACH_LABELS[id]
- новый формат объект {id:text}: если text === id, используем ACH_LABELS[id]

Теперь при следующем открытии учебника старые достижения автоматически получат красивые названия.
This commit is contained in:
Maxim Dolgolyov
2026-05-27 11:30:52 +03:00
parent 0927605bd0
commit c335f33e25
+24 -3
View File
@@ -399,6 +399,24 @@ const STATE = {
squaresBest: Infinity,
};
/* Словарь имён достижений — используется и для отображения, и для retroactive-фикса старых записей */
const ACH_LABELS = {
start: 'Начало пути по корням!',
ring36: 'Нашёл сторону ринга',
squares: 'Лучший результат «Таблица квадратов»',
exists: 'Сортировка корней',
classify: 'Классифицировал числа',
rat: 'Распознал иррациональные',
match: 'Match выражений',
simp4: 'Тренажёр упрощения корней',
draw: 'Построил промежуток',
tariff: 'Задача про тарифы',
ass8: 'Самооценка 8+/10',
pr1: 'Дорожка с розами',
pr2: 'Цемент',
decode: 'Расшифровал код',
};
function loadProgress(){
try{
const s = localStorage.getItem('algebra8_ch1_progress');
@@ -407,10 +425,13 @@ function loadProgress(){
if(a){
const parsed = JSON.parse(a);
if(Array.isArray(parsed)){
// старый формат [id, id, ...] — id-ы как текст
parsed.forEach(id => STATE.achievements.set(id, id));
// старый формат [id, id, ...]
parsed.forEach(id => STATE.achievements.set(id, ACH_LABELS[id] || id));
} else if(parsed && typeof parsed === 'object'){
STATE.achievements = new Map(Object.entries(parsed));
for(const [id, txt] of Object.entries(parsed)){
// если ранее сохранили id вместо названия — подменим на красивое
STATE.achievements.set(id, (txt && txt !== id) ? txt : (ACH_LABELS[id] || id));
}
}
}
const sb = localStorage.getItem('algebra8_ch1_squaresBest');