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
@@ -0,0 +1,11 @@
/// <reference types="react" />
import { AppQueue } from '../../../@types/app';
import { Store } from '../../hooks/useStore';
import { Status } from '../constants';
interface QueueActionProps {
queue: AppQueue;
actions: Store['actions'];
status: Status;
}
export declare const QueueActions: ({ status, actions, queue }: QueueActionProps) => JSX.Element | null;
export {};
@@ -0,0 +1,35 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueueActions = void 0;
const react_1 = __importDefault(require("react"));
const Retry_1 = require("../Icons/Retry");
const Trash_1 = require("../Icons/Trash");
const Button_1 = require("../JobCard/Button/Button");
const QueueActions_module_css_1 = __importDefault(require("./QueueActions.module.css"));
const ACTIONABLE_STATUSES = ['failed', 'delayed', 'completed'];
const isStatusActionable = (status) => ACTIONABLE_STATUSES.includes(status);
const CleanAllButton = ({ onClick }) => (react_1.default.createElement(Button_1.Button, { onClick: onClick, className: QueueActions_module_css_1.default.button },
react_1.default.createElement(Trash_1.TrashIcon, null),
"Clean all"));
const QueueActions = ({ status, actions, queue }) => {
if (!isStatusActionable(status)) {
return null;
}
return (react_1.default.createElement("ul", { className: QueueActions_module_css_1.default.queueActions },
status === 'failed' && (react_1.default.createElement(react_1.default.Fragment, null,
react_1.default.createElement("li", null,
react_1.default.createElement(Button_1.Button, { onClick: actions.retryAll(queue.name), className: QueueActions_module_css_1.default.button },
react_1.default.createElement(Retry_1.RetryIcon, null),
"Retry all")),
react_1.default.createElement("li", null,
react_1.default.createElement(CleanAllButton, { onClick: actions.cleanAllFailed(queue.name) })))),
status === 'delayed' && (react_1.default.createElement("li", null,
react_1.default.createElement(CleanAllButton, { onClick: actions.cleanAllDelayed(queue.name) }))),
status === 'completed' && (react_1.default.createElement("li", null,
react_1.default.createElement(CleanAllButton, { onClick: actions.cleanAllCompleted(queue.name) })))));
};
exports.QueueActions = QueueActions;
//# sourceMappingURL=QueueActions.js.map
@@ -0,0 +1 @@
{"version":3,"file":"QueueActions.js","sourceRoot":"","sources":["../../../../src/ui/components/QueueActions/QueueActions.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AAIzB,0CAA0C;AAC1C,0CAA0C;AAC1C,qDAAiD;AACjD,wFAAyC;AAQzC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;AAE9D,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAW,EAAE,CACrD,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAEtC,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAO,EAAE,EAAE,CAAC,CAC3C,8BAAC,eAAM,IAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iCAAC,CAAC,MAAM;IAC3C,8BAAC,iBAAS,OAAG;gBAEN,CACV,CAAA;AAEM,MAAM,YAAY,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAoB,EAAE,EAAE;IAC3E,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE;QAC/B,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,sCAAI,SAAS,EAAE,iCAAC,CAAC,YAAY;QAC1B,MAAM,KAAK,QAAQ,IAAI,CACtB;YACE;gBACE,8BAAC,eAAM,IAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,iCAAC,CAAC,MAAM;oBAChE,8BAAC,iBAAS,OAAG;gCAEN,CACN;YACL;gBACE,8BAAC,cAAc,IAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,GAAI,CAC5D,CACJ,CACJ;QACA,MAAM,KAAK,SAAS,IAAI,CACvB;YACE,8BAAC,cAAc,IAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAI,CAC7D,CACN;QACA,MAAM,KAAK,WAAW,IAAI,CACzB;YACE,8BAAC,cAAc,IAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAI,CAC/D,CACN,CACE,CACN,CAAA;AACH,CAAC,CAAA;AAhCY,QAAA,YAAY,gBAgCxB"}