Phase 2: Language Context & Selector - Add language dropdown to Header and auth pages

- Create LanguageSelector component with dropdown (shows flag + name)
- Add LanguageSelector to Header (right side, near user email/logout)
- Add LanguageSelector to login, signup, and signup/[code] pages
- Create test-utils.tsx with renderWithProviders helper
- Add vitest.setup.ts to mock localStorage
- Update all test files to use renderWithProviders
- Language selector persists choice in localStorage
- HTML lang attribute updates dynamically based on selected language

All frontend and e2e tests passing.
This commit is contained in:
counterweight 2025-12-25 21:54:19 +01:00
parent f7553df05d
commit f86ec8b62d
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
11 changed files with 214 additions and 37 deletions

27
frontend/vitest.setup.ts Normal file
View file

@ -0,0 +1,27 @@
import { beforeEach } from "vitest";
// Mock localStorage
const localStorageMock = (() => {
let store: Record<string, string> = {};
return {
getItem: (key: string) => store[key] || null,
setItem: (key: string, value: string) => {
store[key] = value.toString();
},
removeItem: (key: string) => {
delete store[key];
},
clear: () => {
store = {};
},
};
})();
Object.defineProperty(window, "localStorage", {
value: localStorageMock,
});
beforeEach(() => {
localStorageMock.clear();
});