merge: sync upstream duckietm/Dev (b2318b9) into feat/react19-modernization

Absorbs 10 upstream commits (JSON5 config support, user-settings reset
password/email/username, wear-badge popup fix, login screen fix, About
update, offer selection logic, client path fix).

Conflicts resolved by keeping the modernized React 19 / Zustand / Form
Actions structure and porting upstream intent surgically:

- bootstrap.ts: kept GetConfiguration().init() pre-init + useEffectEvent,
  added JSON5 import (already wired into the parse fallback)
- LoginView.tsx: kept Form Actions (useActionState/useFormStatus); the
  upstream persistAccessTokenFromPayload(payload) fix was already
  integrated in the modernized SSO branch
- App.tsx: kept useEffectEvent import + StrictMode/ErrorBoundary umbrella
- vite.config.mjs: kept sirv plugin + react-compiler babel; absorbed
  upstream's base: process.env.VITE_BASE || './'
- package.json: kept superset (sirv, Vitest, Zustand, react-colorful,
  React Compiler) + added json5
- User-settings views: accepted upstream (duplicate of local cherry-pick
  2053c8e); notification badge bubble: accepted upstream fix

Verification: yarn typecheck clean, 193/193 Vitest, yarn build green.
This commit is contained in:
simoleo89
2026-05-18 20:14:58 +02:00
12 changed files with 505 additions and 20 deletions
+2 -9
View File
@@ -489,16 +489,9 @@ const useCatalogStore = () =>
{
if(!offer) return;
if(!offer.isLazy)
{
applySelectedOffer(offer);
return;
}
applySelectedOffer(offer);
if(offer.offerId > -1)
{
offer.activate();
}
if(offer.isLazy && (offer.offerId > -1)) offer.activate();
}, [ applySelectedOffer ]);
const refreshBuilderStatus = useCallback(() =>