SHA256
71 lines
2.9 KiB
JavaScript
71 lines
2.9 KiB
JavaScript
import { renderHeader } from '../components/header.js';
|
|
import { saveEntryLanguage, state } from '../state.js';
|
|
|
|
export const pageMeta = { id: 'language-view', title: 'Язык' };
|
|
|
|
function resolveReturnPage() {
|
|
const stored = String(sessionStorage.getItem('shine-language-return-page') || '').trim();
|
|
return stored === 'start-view' ? 'start-view' : 'settings-view';
|
|
}
|
|
|
|
export function render({ navigate }) {
|
|
const screen = document.createElement('section');
|
|
screen.className = 'stack language-screen';
|
|
const returnPage = resolveReturnPage();
|
|
let pendingLanguage = state.entrySettings.language === 'en' ? 'en' : 'ru';
|
|
|
|
screen.append(
|
|
renderHeader({
|
|
title: 'Язык / Language',
|
|
leftAction: { label: '←', onClick: () => {
|
|
sessionStorage.removeItem('shine-language-return-page');
|
|
navigate(returnPage);
|
|
} },
|
|
}),
|
|
);
|
|
|
|
const card = document.createElement('div');
|
|
card.className = 'card stack language-choice-card';
|
|
card.innerHTML = `
|
|
<p class="meta-muted language-choice-hint">Выберите язык интерфейса</p>
|
|
<div class="language-segmented-control" role="radiogroup" aria-label="Язык интерфейса">
|
|
<button class="language-segment${pendingLanguage === 'ru' ? ' is-selected' : ''}" type="button" data-language="ru" role="radio" aria-checked="${pendingLanguage === 'ru'}">Русский</button>
|
|
<button class="language-segment${pendingLanguage === 'en' ? ' is-selected' : ''}" type="button" data-language="en" role="radio" aria-checked="${pendingLanguage === 'en'}">English</button>
|
|
<span class="language-segmented-thumb" aria-hidden="true"></span>
|
|
</div>
|
|
<div class="language-choice-actions">
|
|
<button class="shine-btn shine-btn--settings" type="button" data-action="cancel">Отмена</button>
|
|
<button class="shine-btn shine-btn--primary" type="button" data-action="ok">OK</button>
|
|
</div>
|
|
`;
|
|
|
|
const syncSelection = () => {
|
|
card.dataset.language = pendingLanguage;
|
|
card.querySelectorAll('[data-language]').forEach((item) => {
|
|
const selected = item.dataset.language === pendingLanguage;
|
|
item.classList.toggle('is-selected', selected);
|
|
item.setAttribute('aria-checked', String(selected));
|
|
});
|
|
};
|
|
syncSelection();
|
|
|
|
card.querySelectorAll('[data-language]').forEach((button) => {
|
|
button.addEventListener('click', () => {
|
|
pendingLanguage = button.dataset.language === 'en' ? 'en' : 'ru';
|
|
syncSelection();
|
|
});
|
|
});
|
|
card.querySelector('[data-action="cancel"]')?.addEventListener('click', () => {
|
|
sessionStorage.removeItem('shine-language-return-page');
|
|
navigate(returnPage);
|
|
});
|
|
card.querySelector('[data-action="ok"]')?.addEventListener('click', () => {
|
|
saveEntryLanguage(pendingLanguage);
|
|
sessionStorage.removeItem('shine-language-return-page');
|
|
navigate(returnPage);
|
|
});
|
|
|
|
screen.append(card);
|
|
return screen;
|
|
}
|