Skip to content

Commit bb2ab10

Browse files
committed
fix: scroll behaviour when scroll
1 parent 9a535a1 commit bb2ab10

1 file changed

Lines changed: 116 additions & 4 deletions

File tree

src/app/docs/utils/fetch-menu.ts

Lines changed: 116 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,121 @@
11
import { Menu } from '../types';
22

3-
export const fetchMenu = async (lang: string): Promise<Menu> => {
4-
const data = await fetch(
5-
`https://raw.githubusercontent.com/rolling-scopes-school/docs/refs/heads/master/docs/${lang}/docsMenu_${lang}.json`,
6-
);
3+
const DOCS_MENU_URL =
4+
'https://raw.githubusercontent.com/rolling-scopes-school/docs/refs/heads/master/docs';
5+
6+
type MenuNode = Menu[number];
7+
8+
const EN_TO_RU_TITLE_MAP: Record<string, string> = {
9+
'RS School Overview': 'RS School. Общая информация',
10+
'Education Process': 'Процесс обучения',
11+
'Communication. Communication Channels': 'Общение. Каналы связи',
12+
'Code of Conduct': 'Нормы поведения',
13+
'Dismission': 'Отчисление',
14+
'Certificate': 'Сертификат',
15+
'JavaScript/Front-end Course': 'Курс JavaScript/Front-end',
16+
'Course Overview': 'Описание курса',
17+
'How to enroll': 'Как записаться',
18+
'Education process': 'Процесс обучения',
19+
'Git convention': 'Требования к коммитам',
20+
'First Interview': 'Первое интервью',
21+
'Cross check': 'Кросс-чек',
22+
'Course project': 'Курсовой проект',
23+
'Code of conduct': 'Нормы поведения',
24+
'Node.js EN Course': 'Курс Node.js EN',
25+
'Short-track Course': 'Курс Short-track',
26+
'Tasks': 'Задания',
27+
'Pull Request Requirements': 'Требования к Pull Request',
28+
'Moderation': 'Модерация',
29+
'RS APP': 'RS APP',
30+
'APP Overview': 'Описание приложения',
31+
'Schedule': 'Расписание',
32+
'Notifications': 'Нотификации',
33+
'Roles': 'Роли',
34+
'Moderators': 'Модераторы',
35+
'Activists': 'Активисты',
36+
'Support community': 'Поддержать сообщество',
37+
'Activist': 'Активист',
38+
'Mentor': 'Ментор',
39+
'Trainer': 'Тренер',
40+
'Mentoring': 'Менторинг',
41+
'How to Become a Mentor?': 'Как стать ментором?',
42+
'Pair Mentoring': 'Парный менторинг',
43+
'Registration and Getting Students': 'Регистрация и получение студентов',
44+
'Mentoring Process': 'Процесс менторинга',
45+
'Mentor Assignment Review': 'Проверка задания ментором',
46+
'For Trainers and Admins': 'Для тренеров и админов',
47+
'General Information': 'Общая информация',
48+
'Task Creation': 'Подготовка заданий',
49+
'Adding Tests to RS App': 'Добавление тестов в RS App',
50+
'Streaming': 'Стриминг',
51+
'RS APP Platform': 'Платформа RS APP',
52+
'Overview': 'Описание',
53+
'Submitting Assignments in RS APP': 'Сдача заданий в RS APP',
54+
'Typical Problems': 'Типичные проблемы',
55+
'Private Repository': 'Приватный репозиторий',
56+
'Git Convention': 'Требования к коммитам',
57+
'How to help the school?': 'Как помочь школе?',
58+
'Become an Activist': 'Стать активистом',
59+
'How to Fix a Typo in Documentation?': 'Как исправить ошибку в документации?',
60+
'Who are RSS AI?': 'Кто такие RSS AI?',
61+
'How to contribute': 'Как контрибьютить',
62+
'About The Rolling Scopes': 'О сообществе The Rolling Scopes',
63+
'Cross-check': 'Кросс-чек',
64+
};
65+
66+
const translateTitleToRu = (title: string): string => EN_TO_RU_TITLE_MAP[title] ?? title;
67+
68+
const fetchMenuByLang = async (lang: string): Promise<Menu> => {
69+
const data = await fetch(`${DOCS_MENU_URL}/${lang}/docsMenu_${lang}.json`);
770

871
return await data.json();
972
};
73+
74+
const buildNodeKey = (node: MenuNode, index: number): string => {
75+
if (node.link) {
76+
return `link:${node.link}`;
77+
}
78+
79+
return `group:${index}`;
80+
};
81+
82+
const mergeRuWithEnglishMenu = (englishMenu: Menu, ruMenu: Menu): Menu => {
83+
const ruNodeByKey = new Map<string, MenuNode>();
84+
85+
ruMenu.forEach((node, index) => {
86+
ruNodeByKey.set(buildNodeKey(node, index), node);
87+
});
88+
89+
const mergeNodes = (enNode: MenuNode, ruNode?: MenuNode): MenuNode => {
90+
const mergedChildren = enNode.items?.map((child, index) => {
91+
const key = buildNodeKey(child, index);
92+
const ruChild = ruNode?.items?.find((item, itemIndex) => buildNodeKey(item, itemIndex) === key);
93+
94+
return mergeNodes(child, ruChild);
95+
});
96+
97+
return {
98+
...enNode,
99+
// Keep existing Russian wording whenever available, otherwise translate known English labels.
100+
title: translateTitleToRu(ruNode?.title ?? enNode.title),
101+
...(mergedChildren ? { items: mergedChildren } : {}),
102+
};
103+
};
104+
105+
return englishMenu.map((enNode, index) => {
106+
const key = buildNodeKey(enNode, index);
107+
const ruNode = ruNodeByKey.get(key);
108+
109+
return mergeNodes(enNode, ruNode);
110+
});
111+
};
112+
113+
export const fetchMenu = async (lang: string): Promise<Menu> => {
114+
if (lang !== 'ru') {
115+
return fetchMenuByLang(lang);
116+
}
117+
118+
const [englishMenu, ruMenu] = await Promise.all([fetchMenuByLang('en'), fetchMenuByLang('ru')]);
119+
120+
return mergeRuWithEnglishMenu(englishMenu, ruMenu);
121+
};

0 commit comments

Comments
 (0)