feat: Passwordless cross-device authentication

- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
This commit is contained in:
Bernt
2026-07-07 07:11:50 +00:00
parent 4aa984ad74
commit 6989a98d75
61843 changed files with 5491611 additions and 872231 deletions
+6
View File
@@ -0,0 +1,6 @@
/// <reference types="react" />
import { Store } from '../../hooks/useStore';
export declare const Menu: ({ queues, selectedStatuses, }: {
queues: string[] | undefined;
selectedStatuses: Store['selectedStatuses'];
}) => JSX.Element;
+20
View File
@@ -0,0 +1,20 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Menu = void 0;
const react_1 = __importDefault(require("react"));
const react_router_dom_1 = require("react-router-dom");
const constants_1 = require("../constants");
const Menu_module_css_1 = __importDefault(require("./Menu.module.css"));
const Menu = ({ queues, selectedStatuses, }) => (react_1.default.createElement("aside", { className: Menu_module_css_1.default.aside },
react_1.default.createElement("div", null, "QUEUES"),
react_1.default.createElement("nav", null, !!queues && (react_1.default.createElement("ul", { className: Menu_module_css_1.default.menu }, queues.map((queueName) => (react_1.default.createElement("li", { key: queueName },
react_1.default.createElement(react_router_dom_1.NavLink, { to: `/queue/${encodeURIComponent(queueName)}${!selectedStatuses[queueName] ||
selectedStatuses[queueName] === constants_1.STATUS_LIST[0]
? ''
: `?status=${selectedStatuses[queueName]}`}`, activeClassName: Menu_module_css_1.default.active, title: queueName }, queueName))))))),
react_1.default.createElement("div", { className: Menu_module_css_1.default.appVersion }, process.env.APP_VERSION)));
exports.Menu = Menu;
//# sourceMappingURL=Menu.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../../src/ui/components/Menu/Menu.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AACzB,uDAA0C;AAE1C,4CAA0C;AAC1C,wEAAiC;AAE1B,MAAM,IAAI,GAAG,CAAC,EACnB,MAAM,EACN,gBAAgB,GAIjB,EAAE,EAAE,CAAC,CACJ,yCAAO,SAAS,EAAE,yBAAC,CAAC,KAAK;IACvB,oDAAiB;IACjB,2CACG,CAAC,CAAC,MAAM,IAAI,CACX,sCAAI,SAAS,EAAE,yBAAC,CAAC,IAAI,IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CACzB,sCAAI,GAAG,EAAE,SAAS;QAChB,8BAAC,0BAAO,IACN,EAAE,EAAE,UAAU,kBAAkB,CAAC,SAAS,CAAC,GACzC,CAAC,gBAAgB,CAAC,SAAS,CAAC;gBAC5B,gBAAgB,CAAC,SAAS,CAAC,KAAK,uBAAW,CAAC,CAAC,CAAC;gBAC5C,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,WAAW,gBAAgB,CAAC,SAAS,CAAC,EAC5C,EAAE,EACF,eAAe,EAAE,yBAAC,CAAC,MAAM,EACzB,KAAK,EAAE,SAAS,IAEf,SAAS,CACF,CACP,CACN,CAAC,CACC,CACN,CACG;IACN,uCAAK,SAAS,EAAE,yBAAC,CAAC,UAAU,IAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAO,CACvD,CACT,CAAA;AAjCY,QAAA,IAAI,QAiChB"}