feat(frontend): wire route locale context for host/player shells (#241)
All checks were successful
CI / test-and-quality (push) Successful in 2m52s
CI / test-and-quality (pull_request) Successful in 2m56s

This commit is contained in:
2026-03-02 01:01:54 +00:00
committed by Asger Geel Weirsoee
parent 79b694c590
commit 5538a91800
2 changed files with 22 additions and 2 deletions

View File

@@ -69,6 +69,7 @@ describe('session route context', () => {
sessionCode: 'AB12',
playerId: 5,
token: 'tok-5',
locale: 'en',
});
});
@@ -80,7 +81,15 @@ describe('session route context', () => {
sessionCode: 'AB12',
playerId: null,
token: null,
locale: 'en',
});
expect(sessionStorage.setItem).toHaveBeenCalledWith('wpp.host-session-code', 'AB12');
});
it('resolvers normalize and expose locale from lang query param', () => {
setWindow(storageMock(), storageMock());
expect(hostRouteContextResolver(route({}, { lang: 'da-DK' }) as never, {} as never).locale).toBe('da');
expect(playerRouteContextResolver(route({}, { lang: 'EN' }) as never, {} as never).locale).toBe('en');
});
});

View File

@@ -2,11 +2,13 @@ import { inject } from '@angular/core';
import { type ActivatedRouteSnapshot, type CanActivateFn, type ResolveFn, Router, type UrlTree } from '@angular/router';
import { createSessionContextStore } from '../../../src/spa/session-context-store';
import { normalizeLocale, setPreferredLocale } from './lobby-i18n';
export interface RouteSessionContext {
sessionCode: string | null;
playerId: number | null;
token: string | null;
locale: string;
}
const HOST_STORAGE_KEY = 'wpp.host-session-code';
@@ -61,6 +63,12 @@ export function resolveSessionCode(route: ActivatedRouteSnapshot, mode: 'host' |
return null;
}
function resolveRouteLocale(route: ActivatedRouteSnapshot): string {
const locale = normalizeLocale(route.queryParamMap.get('lang'));
setPreferredLocale(locale);
return locale;
}
async function sessionExists(code: string): Promise<boolean> {
const response = await fetch(`/lobby/sessions/${encodeURIComponent(code)}`, {
method: 'GET',
@@ -118,23 +126,26 @@ export const playerRouteGuard: CanActivateFn = (route) => guard('player', route)
export const hostRouteContextResolver: ResolveFn<RouteSessionContext> = (route) => {
const code = resolveSessionCode(route, 'host');
const locale = resolveRouteLocale(route);
if (code) {
window.sessionStorage.setItem(HOST_STORAGE_KEY, code);
}
return { sessionCode: code, playerId: null, token: null };
return { sessionCode: code, playerId: null, token: null, locale };
};
export const playerRouteContextResolver: ResolveFn<RouteSessionContext> = (route) => {
const code = resolveSessionCode(route, 'player');
const locale = resolveRouteLocale(route);
const context = createSessionContextStore(window.localStorage).get();
if (!code || !context || normalizeCode(context.sessionCode) !== code) {
return { sessionCode: code, playerId: null, token: null };
return { sessionCode: code, playerId: null, token: null, locale };
}
return {
sessionCode: code,
playerId: Number.isInteger(context.playerId) && context.playerId > 0 ? context.playerId : null,
token: context.token.trim() || null,
locale,
};
};