Spaces:
Running
Running
| import { | |
| initI18n, | |
| bindLanguageSelector, | |
| t, | |
| onLanguageChange, | |
| setLanguage, | |
| getCurrentLanguage, | |
| } from './i18n.js'; | |
| import { | |
| findAccount, | |
| getAuthUser, | |
| getFakeAccounts, | |
| saveAuthUser, | |
| } from './auth.js'; | |
| const form = document.getElementById('login-form'); | |
| const usernameInput = document.getElementById('username'); | |
| const passwordInput = document.getElementById('password'); | |
| const errorElement = document.getElementById('login-error'); | |
| initI18n(); | |
| bindLanguageSelector('#language-select'); | |
| const languageLabelMap = { | |
| en: () => t('languageEnglish') || 'English', | |
| ja: () => t('languageJapanese') || 'Japanese', | |
| vi: () => t('languageVietnamese') || 'Vietnamese', | |
| }; | |
| const languageDropdown = document.getElementById('language-dropdown'); | |
| const languageToggle = document.getElementById('language-toggle'); | |
| const languageOptions = document.querySelectorAll('.language-option'); | |
| const languageSelectedLabel = document.getElementById( | |
| 'language-selected-label' | |
| ); | |
| const hiddenLanguageSelect = document.getElementById('language-select'); | |
| function setLanguageUI(lang) { | |
| const labelFn = languageLabelMap[lang]; | |
| if (languageSelectedLabel && labelFn) { | |
| languageSelectedLabel.textContent = labelFn(); | |
| } | |
| languageOptions.forEach((option) => { | |
| const isActive = option.dataset.lang === lang; | |
| option.classList.toggle('active', isActive); | |
| option.setAttribute('aria-selected', isActive.toString()); | |
| }); | |
| if (hiddenLanguageSelect) { | |
| hiddenLanguageSelect.value = lang; | |
| } | |
| if (languageToggle) { | |
| languageToggle.setAttribute('aria-expanded', 'false'); | |
| } | |
| if (languageDropdown) { | |
| languageDropdown.classList.remove('open'); | |
| } | |
| } | |
| function setupLanguageDropdown() { | |
| if (!languageDropdown || !languageToggle) return; | |
| languageToggle.addEventListener('click', (event) => { | |
| event.stopPropagation(); | |
| const isOpen = languageDropdown.classList.toggle('open'); | |
| languageToggle.setAttribute('aria-expanded', isOpen.toString()); | |
| }); | |
| languageOptions.forEach((option) => { | |
| option.addEventListener('click', (event) => { | |
| event.stopPropagation(); | |
| const lang = option.dataset.lang; | |
| if (lang) { | |
| setLanguage(lang); | |
| } | |
| }); | |
| }); | |
| document.addEventListener('click', (event) => { | |
| if (!languageDropdown.classList.contains('open')) return; | |
| if (!languageDropdown.contains(event.target)) { | |
| languageDropdown.classList.remove('open'); | |
| languageToggle.setAttribute('aria-expanded', 'false'); | |
| } | |
| }); | |
| setLanguageUI(getCurrentLanguage()); | |
| } | |
| setupLanguageDropdown(); | |
| function redirectToApp() { | |
| window.location.href = 'index.html'; | |
| } | |
| function setError(message) { | |
| errorElement.textContent = message || ''; | |
| } | |
| function applyLoginTitle() { | |
| document.title = t('loginTitle'); | |
| } | |
| const existingUser = getAuthUser(); | |
| if (existingUser) { | |
| redirectToApp(); | |
| } | |
| applyLoginTitle(); | |
| onLanguageChange((lang) => { | |
| setLanguageUI(lang); | |
| applyLoginTitle(); | |
| if (errorElement.textContent) { | |
| setError(t('loginError')); | |
| } | |
| }); | |
| form?.addEventListener('submit', (event) => { | |
| event.preventDefault(); | |
| const username = usernameInput?.value; | |
| const password = passwordInput?.value; | |
| const account = findAccount(username, password); | |
| if (!account) { | |
| setError(t('loginError')); | |
| return; | |
| } | |
| saveAuthUser(account); | |
| setError(''); | |
| redirectToApp(); | |
| }); | |