Files
boc/landvex-site/assets/VerifyIdentity-CVO73JZ2.js
T
Bernt 48ea61cdcc docs: add quixzoom-auth-core product to AAMOS
- Product documentation in docs/products/
- Updated MEMORY.md with product info
- quiXzoom Auth Core as AAMOS Identity product
2026-07-14 09:58:53 +00:00

8 lines
31 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{x as he,a as ge,r as d,j as e,y as b,z as N,v as m,X as ke,w as P,u as je,aQ as ye,aR as be,p as Ne,a9 as ve}from"./index-CZD3_4lD.js";import{S as W}from"./shield-DIM7u0gp.js";import{F as _e}from"./file-text-I90VDyBK.js";import{C as Se}from"./clock-CHYQgZWG.js";import{S as $}from"./SecureCamera-0VtB9UCG.js";import{C as we}from"./credit-card-C9X53A_j.js";import{A as Y}from"./arrow-left-DyClWdEf.js";import{A as Ce}from"./index-DXB3_sFe.js";import{C as Q}from"./circle-check-60AjePHB.js";import{R as Ie}from"./refresh-cw-CCL0Gd2i.js";import{C as De}from"./circle-alert-DFiBooaQ.js";import"./check-CCL32zXH.js";/**
* @license lucide-react v0.462.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Te=he("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]),ee={light:()=>{"vibrate"in navigator&&navigator.vibrate(10)},medium:()=>{"vibrate"in navigator&&navigator.vibrate([15,50,15])},heavy:()=>{"vibrate"in navigator&&navigator.vibrate([20,30,20,30,20])},success:()=>{"vibrate"in navigator&&navigator.vibrate([10,50,20])}},Re="1.0.0",se="qz_anon_session_id";function Ae(){let u=localStorage.getItem(se);return u||(u=crypto.randomUUID(),localStorage.setItem(se,u)),u}function Me({onConsent:u,onDecline:S}){const{t:k}=ge(),[i,z]=d.useState(!1),[l,w]=d.useState(!1),[h,K]=d.useState(!1),[g,r]=d.useState(!1),U=async()=>{if(!g){P.error("Du måste bekräfta att du är minst 18 år");return}if(!h){P.error("Du måste godkänna villkoren för att fortsätta");return}w(!0);try{const x=localStorage.getItem("qz_token"),D={"Content-Type":"application/json"};x&&(D.Authorization=`Bearer ${x}`);const H={consent_type:"biometric_collection",text_version:Re,retention_days:30};x||(H.anon_session_id=Ae());const M=await fetch("https://api.quixzoom.com/api/qz/identity/consent",{method:"POST",headers:D,body:JSON.stringify(H)});if(!M.ok){const v=await M.json().catch(()=>({}));throw new Error(v.error??"Kunde inte spara samtycke")}const{consentRef:V}=await M.json();u(V)}catch(x){P.error(x.message)}finally{w(!1)}};return e.jsx("div",{className:"p-4 space-y-4",children:e.jsx(b,{className:"border-primary/30",children:e.jsxs(N,{className:"pt-6 space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center",children:e.jsx(W,{className:"w-6 h-6 text-primary"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"font-semibold text-lg",children:"Samtycke till biometrisk insamling"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Krävs innan verifiering kan påbörjas"})]})]}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(_e,{className:"w-4 h-4 text-primary mt-0.5 shrink-0"}),e.jsxs("p",{children:[e.jsx("strong",{children:"Vad samlas in:"})," Foto på ID-handling (framsida) samt selfie för ansiktsmatchning."]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(Se,{className:"w-4 h-4 text-primary mt-0.5 shrink-0"}),e.jsxs("p",{children:[e.jsx("strong",{children:"Lagringstid:"})," Bilderna raderas automatiskt efter 30 dagar. Endast verifieringsresultatet (godkänd/nekad) sparas längre."]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(W,{className:"w-4 h-4 text-primary mt-0.5 shrink-0"}),e.jsxs("p",{children:[e.jsx("strong",{children:"Rättslig grund:"})," Ditt uttryckliga samtycke (GDPR Art. 9.2.a). Du kan återkalla samtycket när som helst via dina kontoinställningar."]})]})]}),e.jsx("div",{className:"text-center",children:e.jsx("a",{href:"/identity-disclaimer",target:"_blank",className:"text-xs text-primary underline underline-offset-2",children:"Läs fullständiga villkor →"})}),e.jsxs("label",{className:"flex items-start gap-3 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:g,onChange:x=>r(x.target.checked),className:"mt-1 w-4 h-4"}),e.jsxs("span",{className:"text-sm font-medium",children:["Jag bekräftar att jag är minst ",e.jsx("strong",{children:"18 år"})," och har legal handlingsförmåga att ingå detta avtal."]})]}),e.jsxs("label",{className:"flex items-start gap-3 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:h,onChange:x=>K(x.target.checked),className:"mt-1 w-4 h-4"}),e.jsx("span",{className:"text-sm",children:"Jag förstår och samtycker till insamling och bearbetning av biometrisk data för identitetsverifiering enligt villkoren ovan."})]}),e.jsxs("div",{className:"flex gap-3",children:[e.jsxs(m,{variant:"outline",onClick:S,className:"flex-1",disabled:l,children:[e.jsx(ke,{className:"w-4 h-4 mr-2"}),"Avböj"]}),e.jsx(m,{onClick:U,className:"flex-1",disabled:!g||!h||l,children:l?"Sparar...":"Godkänn och fortsätt →"})]})]})})})}const Ee="Svenska körkort: fotografera BAKSIDAN (streckkoden sitter där). Utländska körkort med MRZ: fotografera framsidan.",te=[{id:"passport",label:"Pass",sublabel:"Gäller alla länder — svenska, EU och internationella",icon:Te,instructions:["📖 Öppna passet på bildsidan — sidan med ditt foto","📐 Håll passet plant mot ett jämnt underlag","🔤 De två raderna med bokstäver/siffror längst ner (MRZ) måste synas tydligt","💡 Bra belysning — undvik reflexljus och skuggor på texten","🔲 Hela passet ska synas inom ramen, inga kanter avskurna"],hint:"Håll passets bildsida (med foto + MRZ-rader) plant inom rutan"},{id:"national_id",label:"Nationellt ID-kort",sublabel:"EU/EES-utfärdat identitetskort",icon:we,instructions:["1️⃣ Fotografera FRAMSIDAN av ID-kortet — sidan med ditt foto","2️⃣ Fotografera BAKSIDAN av ID-kortet — där MRZ-raderna finns","🔲 Hela kortet ska synas i båda bilderna","🔤 MRZ-raderna (två rader med bokstäver/siffror på baksidan) måste synas tydligt","💡 Håll under jämnt ljus — undvik reflexljus på kortets yta","📐 Håll kortet plant, inte snett"],hint:"Framsida först, sedan baksida med MRZ"},{id:"drivers_license",label:"Körkort",sublabel:"EU/EES, USA, Kanada och övriga länder",icon:be,instructions:["🇸🇪 Svenskt körkort: fotografera BAKSIDAN (PDF417-streckkoden sitter där)","🇪🇺 EU-körkort (ej Sverige): fotografera FRAMSIDAN","🇺🇸 Amerikanskt/Kanadensiskt körkort: fotografera BAKSIDAN (streckkod)","🔲 Hela kortet ska synas inom ramen","💡 Håll kortet plant i bra belysning — undvik reflexljus"],hint:Ee}],F=100,I=100,O=0,J=["consent","doc_type","doc_front","doc_back","selfie","processing"],Be={consent:"Samtycke",doc_type:"Dokumenttyp",doc_instructions:"Dokumenttyp",doc_front:"ID-handling (framsida)",doc_back:"ID-handling (baksida)",selfie_instructions:"Selfie",challenge:"Selfie",selfie:"Selfie",processing:"Bearbetar"},Fe={consent:"consent",doc_type:"doc_type",doc_instructions:"doc_front",doc_front:"doc_front",doc_back:"doc_back",doc_retry:"doc_front",selfie_instructions:"selfie",challenge:"selfie",selfie:"selfie",processing:"processing"},Oe=({until:u,onExpired:S})=>{const[k,i]=d.useState(Math.max(0,u-Date.now()));d.useEffect(()=>{if(k<=0){S();return}const w=setInterval(()=>{const h=Math.max(0,u-Date.now());i(h),h<=0&&(clearInterval(w),S())},1e3);return()=>clearInterval(w)},[u,S]);const z=Math.floor(k/6e4),l=Math.floor(k%6e4/1e3);return k<=0?null:e.jsxs("div",{className:"text-3xl font-mono font-bold text-orange-500",children:[String(z).padStart(2,"0"),":",String(l).padStart(2,"0")]})},Xe=()=>{const u=je(),[S]=ye(),k=S.get("returnTo")??"/map",[i,z]=d.useState(()=>{try{const s=sessionStorage.getItem("kyc_session");return s?JSON.parse(s):null}catch{return null}}),[l,w]=d.useState(()=>{const s=sessionStorage.getItem("kyc_step");return s&&["selfie_failed","cooldown","challenge","selfie","selfie_instructions"].includes(s)?s:"consent"}),[h,K]=d.useState(()=>{try{return JSON.parse(sessionStorage.getItem("kyc_doc_type")??"null")}catch{return null}}),g=s=>{z(t=>{const a=typeof s=="function"?s(t):s;return a?sessionStorage.setItem("kyc_session",JSON.stringify(a)):sessionStorage.removeItem("kyc_session"),a})},r=s=>{sessionStorage.setItem("kyc_step",s),w(s)},[U,x]=d.useState(""),[D,H]=d.useState(""),[M,V]=d.useState(!1),[v,T]=d.useState(()=>parseInt(localStorage.getItem("kyc_doc_attempts")??"0",10)),[R,E]=d.useState(()=>parseInt(localStorage.getItem("kyc_selfie_attempts")??"0",10)),[ae,A]=d.useState(()=>parseInt(localStorage.getItem("kyc_cooldown_until")??"0",10)),[Z,C]=d.useState(null),ne=()=>ve.getToken()??"",_=()=>({"Content-Type":"application/json",Authorization:`Bearer ${ne()}`}),re=async s=>{try{const t=await fetch("https://api.quixzoom.com/api/qz/identity/session",{method:"POST",headers:_(),body:JSON.stringify({consentRef:s})});if(!t.ok)throw new Error("Kunde inte starta session");const{sessionId:a}=await t.json(),n=await fetch("https://api.quixzoom.com/api/qz/kyc/challenge",{method:"POST",headers:_(),body:JSON.stringify({session_id:a})}),o=n.ok?await n.json():null;g({consentRef:s,sessionId:a,docType:"passport",challenge:o,framesB64:[],attemptCount:0}),r("doc_type")}catch{P.error("Vi har tekniska problem. Försök igen om en stund."),ee.medium()}},ie=s=>{K(s),i&&g(t=>t&&{...t,docType:s}),r("doc_instructions")},q=async(s,t)=>{const a=s.dataUrl.split(",")[1],n=await fetch(`https://api.quixzoom.com/api/qz/kyc/upload/${t}`,{method:"POST",headers:_(),body:JSON.stringify({session_id:i.sessionId,image_base64:a,doc_type:i.docType})});if(!n.ok){const c=await n.json().catch(()=>({}));throw new Error(c.error??"Uppladdning misslyckades")}const{imageRef:o}=await n.json();return o},G=async()=>{const t=await(await fetch("https://api.quixzoom.com/api/qz/kyc/verify-doc",{method:"POST",headers:_(),body:JSON.stringify({session_id:i.sessionId,doc_type:i.docType})})).json();if(t.ok)localStorage.setItem("kyc_doc_attempts","0"),T(0),r("selfie_instructions");else if(t.fatal)C("doc"),x(t.reason),r("appeal");else{const a=v+1;localStorage.setItem("kyc_doc_attempts",String(a)),T(a);const n=(t.reason??"").toLowerCase();let o="",c="";if(n.includes("för ljust")||n.includes("överexponerat")?(o="📷 Bilden är för ljus/överexponerad",c="Flytta till skuggigare ljus eller håll dokumentet lite längre från kameran"):n.includes("för mörkt")||n.includes("mörkast")?(o="🔦 Bilden är för mörk",c="Fotografera i bättre belysning — undvik mörka rum"):n.includes("reflexljus")||n.includes("reflex")||n.includes("bländning")?(o="✨ Reflexljus blockerar dokumentet",c="Håll dokumentet i en vinkel så att ljuset inte reflekteras mot kameran"):n.includes("suddig")||n.includes("blur")||n.includes("oskarp")?(o="🫧 Bilden är suddig",c="Håll telefonen stilla — stötta armbågen mot något fast"):n.includes("kontrast")?(o="🔲 Texten på dokumentet är otydlig",c="Fotografera mot en mörk bakgrund i bra belysning"):n.includes("mrz")||n.includes("streckkod")||n.includes("ej hittad")?i.docType==="drivers_license"?(o="🔍 Streckkoden / ID-informationen kunde inte läsas",c="Svenska körkort: fotografera BAKSIDAN. EU-körkort: fotografera framsidan med all text synlig"):(o="🔍 ID-informationen (MRZ) i dokumentet kunde inte läsas",c="Se till att raderna med bokstäver och siffror längst ner på dokumentet syns tydligt"):n.includes("beskärning")||n.includes("avskuren")||n.includes("saknas")?(o="🔲 Dokumentet är inte helt synligt",c="Flytta kameran lite längre bort så att hela dokumentet ryms inom den gröna ramen"):n.includes("snett")||n.includes("vinkel")||n.includes("sned")?(o="📐 Dokumentet fotograferades snett",c="Håll dokumentet rakt parallellt med telefonen — inte i vinkel"):n.includes("permanent_reject")||n.includes("utgick")||n.includes("18 år")?(o=t.reason??"Dokumentet kunde inte godkännas",c=""):(o=t.reason??`${(f==null?void 0:f.label)??"Dokumentet"} kunde inte läsas`,c=t.hint??""),L(o+(c?"|||"+c:"")),C("doc"),a>=F){const y=Date.now()+O*60*1e3;localStorage.setItem("kyc_cooldown_until",String(y)),A(y),r("cooldown")}else r("doc_retry")}},[X,B]=d.useState(!1),[p,L]=d.useState(""),le=async s=>{B(!0);try{const t=await q(s,"doc_front");if(g(a=>a&&{...a,docFrontRef:t}),i.docType==="national_id"){B(!1),r("doc_back");return}await G()}catch{const a=v+1;localStorage.setItem("kyc_doc_attempts",String(a)),T(a),L("Tekniskt fel — försök igen"),C("doc"),r("doc_retry")}finally{B(!1)}},oe=async s=>{B(!0);try{const t=await q(s,"doc_back");g(a=>a&&{...a,docBackRef:t}),await G()}catch{const a=v+1;localStorage.setItem("kyc_doc_attempts",String(a)),T(a),L("Tekniskt fel — försök igen"),C("doc"),r("doc_retry")}finally{B(!1)}},ce=d.useCallback(s=>{g(t=>!t||t.framesB64.length>=15?t:{...t,framesB64:[...t.framesB64,s]})},[]),de=async s=>{for(let a=0;a<30;a++){await new Promise(n=>setTimeout(n,1e3));try{const o=await(await fetch(`https://api.quixzoom.com/api/qz/kyc/status/${s}`,{headers:_()})).json();if(o.status==="completed"){if(o.verified)localStorage.removeItem("kyc_doc_attempts"),localStorage.removeItem("kyc_selfie_attempts"),localStorage.removeItem("kyc_cooldown_until"),T(0),E(0),A(0),r("done");else if(o.assurance_level==="manual_review")r("manual_review");else{const c=R+1;if(localStorage.setItem("kyc_selfie_attempts",String(c)),E(c),C("selfie"),x(o.reject_reason??"Verifiering misslyckades"),c>=I){const y=Date.now()+O*60*1e3;localStorage.setItem("kyc_cooldown_until",String(y)),A(y),r("cooldown")}else r("selfie_failed")}return}}catch{}}const t=R+1;if(localStorage.setItem("kyc_selfie_attempts",String(t)),E(t),C("selfie"),x("Timeout — verifieringen tog för lång tid"),t>=I){const a=Date.now()+O*60*1e3;localStorage.setItem("kyc_cooldown_until",String(a)),A(a),r("cooldown")}else r("selfie_failed")},me=async s=>{r("processing");try{const t=await q(s,"selfie");g(y=>y&&{...y,selfieRef:t});const a=i.challenge,n=i.framesB64,c=await(await fetch("https://api.quixzoom.com/api/qz/kyc/verify",{method:"POST",headers:_(),body:JSON.stringify({session_id:i.sessionId,consent_ref:i.consentRef,doc_type:i.docType,nonce:(a==null?void 0:a.nonce)??"",hmac:(a==null?void 0:a.hmac)??"",expires_at:(a==null?void 0:a.expires_at)??0,frame_count:n.length,frames_b64:n.slice(0,15)})})).json();if(!c.ok)throw new Error(c.error??"Verifiering misslyckades");await de(i.sessionId)}catch(t){const a=R+1;if(localStorage.setItem("kyc_selfie_attempts",String(a)),E(a),C("selfie"),x(t.message),a>=I){const n=Date.now()+O*60*1e3;localStorage.setItem("kyc_cooldown_until",String(n)),A(n),r("cooldown")}else r("selfie_failed")}},ue=async()=>{try{if(i!=null&&i.sessionId){const s=await fetch("https://api.quixzoom.com/api/qz/kyc/challenge",{method:"POST",headers:_(),body:JSON.stringify({session_id:i.sessionId})}),t=s.ok?await s.json():null;g(a=>a&&{...a,framesB64:[],challenge:t})}}catch{}r("challenge")},fe=async()=>{try{await fetch("https://api.quixzoom.com/api/qz/identity/appeal",{method:"POST",headers:_(),body:JSON.stringify({sessionId:i==null?void 0:i.sessionId,reason:D})}),V(!0)}catch{P.error("Vi har tekniska problem. Försök igen om en stund."),ee.medium()}},f=te.find(s=>s.id===h),xe=Fe[l]??l,pe=J.indexOf(xe),j=(i==null?void 0:i.challenge)??null;return e.jsxs("div",{className:"min-h-screen bg-background pb-24",children:[e.jsx("header",{className:"sticky top-0 z-50 bg-background/80 backdrop-blur-lg border-b border-border",children:e.jsxs("div",{className:"flex items-center justify-between p-4",children:[e.jsx("button",{onClick:()=>u(-1),className:"p-2 -ml-2",children:e.jsx(Y,{className:"w-6 h-6"})}),e.jsx("h1",{className:"font-semibold text-lg",children:"Identitetsverifiering"}),e.jsx("div",{className:"w-10"})]})}),!["done","failed","appeal","manual_review","selfie_failed","cooldown"].includes(l)&&e.jsxs("div",{className:"px-4 pt-4",children:[e.jsx("div",{className:"flex gap-1",children:J.map((s,t)=>e.jsx("div",{className:`h-1 flex-1 rounded-full transition-colors ${t<=pe?"bg-primary":"bg-muted"}`},s))}),e.jsx("div",{className:"flex justify-between mt-1 text-xs text-muted-foreground",children:J.map(s=>e.jsx("span",{children:Be[s]??s},s))})]}),e.jsx(Ce,{mode:"wait",children:e.jsxs(Ne.div,{initial:{opacity:0,x:20},animate:{opacity:1,x:0},exit:{opacity:0,x:-20},transition:{duration:.2},children:[l==="consent"&&e.jsx(Me,{onConsent:re,onDecline:()=>u(-1)}),l==="doc_type"&&e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h2",{className:"font-semibold text-base",children:"Välj typ av ID-handling"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Vi accepterar pass, nationella ID-kort och körkort utfärdade inom EU/EES."})]}),e.jsx("div",{className:"space-y-3",children:te.map(s=>{const t=s.icon;return e.jsx("button",{onClick:()=>ie(s.id),className:"w-full text-left",children:e.jsx(b,{className:"border-border hover:border-primary/50 hover:bg-primary/5 transition-colors active:scale-[0.99]",children:e.jsx(N,{className:"pt-4 pb-4",children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl bg-primary/10 flex items-center justify-center shrink-0",children:e.jsx(t,{className:"w-6 h-6 text-primary"})}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s.label}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s.sublabel})]}),e.jsx(Y,{className:"w-4 h-4 text-muted-foreground ml-auto rotate-180"})]})})})},s.id)})})]}),l==="doc_instructions"&&f&&e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs("h2",{className:"font-semibold text-base",children:["Fotografera ",f.label]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Följ instruktionerna nedan för bästa resultat."})]}),e.jsx("div",{className:"mx-auto w-full max-w-xs rounded-2xl bg-muted border-2 border-dashed border-primary/30 overflow-hidden",style:{aspectRatio:"3/2"},children:e.jsxs("div",{className:"w-full h-full flex flex-col items-center justify-center gap-1 p-4",children:[e.jsx("p",{className:"text-xs text-muted-foreground font-mono tracking-widest",children:f.label.toUpperCase()}),e.jsx("div",{className:"w-full h-px bg-border"}),e.jsx("p",{className:"text-[10px] text-muted-foreground/50 font-mono",children:"MMMMMMMM<<MMMMMMMMM"}),e.jsx("p",{className:"text-[10px] text-muted-foreground/50 font-mono",children:"0000000<MM<1701119<8"})]})}),e.jsx("ol",{className:"space-y-2",children:f.instructions.map((s,t)=>e.jsxs("li",{className:"flex items-start gap-3 text-sm",children:[e.jsx("span",{className:"shrink-0 w-5 h-5 rounded-full bg-primary/15 text-primary flex items-center justify-center text-xs font-medium",children:t+1}),e.jsx("span",{className:"text-muted-foreground",children:s})]},t))}),e.jsxs("div",{className:"flex items-center gap-2 bg-primary/5 border border-primary/20 rounded-lg p-3 text-sm",children:[e.jsx("span",{className:"text-lg",children:"🔒"}),e.jsx("p",{className:"text-muted-foreground text-xs",children:"Bilderna hanteras säkert och raderas automatiskt efter 30 dagar."})]}),e.jsx(m,{onClick:()=>r("doc_front"),className:"w-full",children:"Starta kameran"}),e.jsx(m,{variant:"ghost",onClick:()=>r("doc_type"),className:"w-full",children:"Byt dokumenttyp"})]}),l==="doc_front"&&f&&e.jsx($,{mode:"document",docTypeLabel:f.label+" — framsida",hint:f.id==="national_id"?"Håll framsidan (sidan med fotot) inom ramen":f.hint,onPhotoCapture:le,onCancel:()=>r("doc_instructions"),isUploading:X}),l==="doc_back"&&f&&e.jsx($,{mode:"document",docTypeLabel:f.label+" — baksida",hint:"Håll baksidan med MRZ-raderna inom ramen",onPhotoCapture:oe,onCancel:()=>r("doc_front"),isUploading:X}),l==="doc_retry"&&e.jsx("div",{className:"p-4 space-y-4",children:e.jsx(b,{className:"border-amber-500/50 bg-amber-500/5",children:e.jsxs(N,{className:"pt-6 space-y-4",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"text-4xl mb-2",children:p.includes("ljus")||p.includes("mörk")?"💡":p.includes("reflex")||p.includes("✨")?"✨":p.includes("suddig")||p.includes("🫧")?"🫧":p.includes("streckkod")||p.includes("MRZ")?"🔍":p.includes("synlig")||p.includes("🔲")?"🔲":"📷"}),e.jsx("h3",{className:"font-semibold text-base",children:p.split("|||")[0]||`${(f==null?void 0:f.label)??"Dokumentet"} kunde inte läsas`})]}),p.includes("|||")&&e.jsxs("div",{className:"bg-primary/10 border border-primary/20 rounded-xl p-4 text-sm",children:[e.jsx("p",{className:"font-semibold text-primary mb-1",children:"👉 Gör så här:"}),e.jsx("p",{className:"text-foreground",children:p.split("|||")[1]})]}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-3 space-y-2 text-sm",children:[e.jsx("p",{className:"font-medium text-xs uppercase tracking-wide text-muted-foreground",children:"Checklista"}),h==="passport"&&e.jsxs(e.Fragment,{children:[e.jsx("p",{children:"✅ Bildsidan (foto + MRZ-rader) — inte bakpärmen"}),e.jsx("p",{children:"✅ Båda raderna med bokstäver/siffror längst ner syns"}),e.jsx("p",{children:"✅ Hela sidan inom ramen, inga kanter avskurna"}),e.jsx("p",{children:"✅ Jämnt ljus, inga reflexer på texten"})]}),h==="national_id"&&e.jsxs(e.Fragment,{children:[e.jsx("p",{children:"✅ Framsidan med ditt foto"}),e.jsx("p",{children:"✅ Baksidan med MRZ-raderna"}),e.jsx("p",{children:"✅ Hela kortet inom ramen i båda bilderna"}),e.jsx("p",{children:"✅ Båda MRZ-raderna längst ner syns tydligt"})]}),h==="drivers_license"&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{children:["✅ ",e.jsx("strong",{children:"Sverige / USA / Kanada:"})," BAKSIDAN (streckkod)"]}),e.jsxs("p",{children:["✅ ",e.jsx("strong",{children:"Övriga EU:"})," FRAMSIDAN (med MRZ-rader)"]}),e.jsx("p",{children:"✅ Hela kortet inom ramen"}),e.jsx("p",{children:"✅ Jämnt ljus, streckkoden får ej vara bländad"})]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground justify-center",children:[Array.from({length:F}).map((s,t)=>e.jsx("div",{className:`w-2 h-2 rounded-full ${t<v?"bg-amber-500":"bg-muted-foreground/30"}`},t)),e.jsxs("span",{children:[F-v," försök kvar"]})]}),v<F?e.jsx(m,{onClick:()=>r("doc_front"),className:"w-full",children:"📷 Ta om foto"}):e.jsx(m,{onClick:()=>r("appeal"),variant:"outline",className:"w-full",children:"Kontakta support"}),e.jsx(m,{variant:"ghost",onClick:()=>r("doc_type"),className:"w-full text-xs text-muted-foreground",children:"← Byt dokumenttyp"})]})})}),l==="selfie_instructions"&&e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h2",{className:"font-semibold text-base",children:"Ta en selfie"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Vi jämför din selfie mot ID-handlingens foto."})]}),e.jsx("div",{className:"mx-auto w-32 h-40 rounded-full bg-muted border-2 border-dashed border-primary/30 flex items-center justify-center",children:e.jsx("span",{className:"text-5xl",children:"🤳"})}),e.jsx("ol",{className:"space-y-2",children:["Titta rakt in i kameran","Se till att ditt ansikte är välbelyst — undvik bakgrundsljus","Ta av glasögon om möjligt","Håll telefonen i ögonhöjd"].map((s,t)=>e.jsxs("li",{className:"flex items-start gap-3 text-sm",children:[e.jsx("span",{className:"shrink-0 w-5 h-5 rounded-full bg-primary/15 text-primary flex items-center justify-center text-xs font-medium",children:t+1}),e.jsx("span",{className:"text-muted-foreground",children:s})]},t))}),e.jsx(m,{onClick:()=>r("challenge"),className:"w-full",children:"Fortsätt"})]}),l==="challenge"&&e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsx("h2",{className:"font-semibold",children:"Liveness-kontroll"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Vi behöver bekräfta att du är en riktig person.",j?" När kameran startar, gör följande rörelse:":" Kameran startar nu för selfie-foto."]}),j&&e.jsxs("div",{className:"bg-primary/10 border border-primary/20 rounded-2xl p-6 text-center space-y-3",children:[e.jsx("div",{className:"text-5xl",children:j.action==="BLINK_TWICE"?"👁️":j.action==="TURN_LEFT"?"⬅️":j.action==="TURN_RIGHT"?"➡️":j.action==="NOD"?"↕️":"😊"}),e.jsx("p",{className:"font-semibold text-lg",children:j.action==="BLINK_TWICE"?"Blinka två gånger":j.action==="TURN_LEFT"?"Vänd ansiktet åt vänster":j.action==="TURN_RIGHT"?"Vänd ansiktet åt höger":j.action==="NOD"?"Nicka":"Le"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Du har 45 sekunder"})]}),e.jsx(m,{onClick:()=>r("selfie"),className:"w-full",children:"Starta kameran"})]}),l==="selfie"&&e.jsx($,{mode:"selfie",docTypeLabel:"",hint:"Håll ansiktet inom den markerade ovalen",onPhotoCapture:me,onCancel:()=>r("challenge"),onFrameCapture:ce}),l==="processing"&&e.jsxs("div",{className:"p-4 flex flex-col items-center justify-center min-h-[50vh] gap-4",children:[e.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-primary"}),e.jsx("p",{className:"text-muted-foreground",children:"Verifierar din identitet..."}),e.jsx("p",{className:"text-xs text-muted-foreground/60 text-center max-w-xs",children:"Det tar vanligtvis några sekunder. Stäng inte appen."})]}),l==="done"&&e.jsx("div",{className:"p-4",children:e.jsx(b,{className:"border-green-500/50 bg-green-500/10",children:e.jsxs(N,{className:"pt-6 text-center space-y-4",children:[e.jsx(Q,{className:"w-16 h-16 text-green-500 mx-auto"}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-lg",children:"Verifierad!"}),e.jsx("p",{className:"text-muted-foreground text-sm mt-1",children:"Din identitet är bekräftad. Du kan nu ta uppdrag."})]}),e.jsx(m,{onClick:()=>u(k),className:"w-full",children:k!=="/map"?"Tillbaka till uppdraget":"Hitta uppdrag"})]})})}),l==="manual_review"&&e.jsx("div",{className:"p-4",children:e.jsx(b,{className:"border-primary/30 bg-primary/5",children:e.jsxs(N,{className:"pt-6 text-center space-y-4",children:[e.jsx("div",{className:"w-16 h-16 rounded-full bg-primary/20 flex items-center justify-center mx-auto",children:e.jsx("span",{className:"text-3xl",children:"🔍"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-lg",children:"Under granskning"}),e.jsx("p",{className:"text-muted-foreground text-sm mt-2",children:"Din verifiering har skickats för manuell granskning. Vi återkommer inom 12 arbetsdagar via e-post."}),e.jsx("p",{className:"text-muted-foreground text-xs mt-2",children:"Dina bilder sparas säkert och raderas automatiskt efter granskning."})]}),e.jsx(m,{onClick:()=>u(k),variant:"outline",className:"w-full",children:k!=="/map"?"Tillbaka till uppdraget":"Tillbaka till kartan"})]})})}),l==="selfie_failed"&&e.jsx("div",{className:"p-4 space-y-4",children:e.jsx(b,{className:"border-yellow-500/50 bg-yellow-500/10",children:e.jsxs(N,{className:"pt-6 space-y-4",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("span",{className:"text-4xl",children:"🥀"}),e.jsx("h3",{className:"font-semibold mt-3",children:"Selfie gick inte igenom"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:U}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Försök ",R," av ",I," — ditt passfoto sparas"]})]}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-3 space-y-1 text-sm",children:[e.jsx("p",{className:"font-medium",children:"Tips:"}),e.jsx("p",{children:"• Bra belysning — undvik bakgrundsljus"}),e.jsx("p",{children:"• Håll telefonen i ögonhöjd, titta rakt in i kameran"}),e.jsx("p",{children:"• Gör rörelsen tydligt och långsamt"}),e.jsx("p",{children:"• Ta av glasögon om möjligt"})]}),R<I&&e.jsxs(m,{onClick:ue,className:"w-full",children:[e.jsx(Ie,{className:"w-4 h-4 mr-2"}),"Försök igen med selfie (",I-R," försök kvar)"]}),e.jsx(m,{variant:"outline",onClick:()=>r("appeal"),className:"w-full text-xs",children:"Skicka in för manuell granskning istället"})]})})}),l==="cooldown"&&e.jsx("div",{className:"p-4",children:e.jsx(b,{className:"border-orange-500/50 bg-orange-500/5",children:e.jsxs(N,{className:"pt-6 text-center space-y-4",children:[e.jsx("span",{className:"text-5xl",children:"⏳"}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-lg",children:"Alla försök använda"}),e.jsx("p",{className:"text-muted-foreground text-sm mt-2",children:Z==="doc"?`Du har använt alla ${F} försök på ID-handlingen.`:`Du har använt alla ${I} försök på selfie.`}),e.jsxs("p",{className:"text-muted-foreground text-sm mt-1",children:["Du kan försöka igen om"," ",e.jsxs("span",{className:"font-semibold",children:[O," minuter"]}),", eller skicka in för manuell granskning nu."]})]}),e.jsx(Oe,{until:ae,onExpired:()=>{Z==="doc"?(localStorage.setItem("kyc_doc_attempts","0"),T(0),r("doc_type")):(localStorage.setItem("kyc_selfie_attempts","0"),E(0),r("challenge")),localStorage.removeItem("kyc_cooldown_until"),A(0)}}),e.jsx(m,{variant:"outline",onClick:()=>r("appeal"),className:"w-full",children:"Skicka in för manuell granskning"})]})})}),l==="failed"&&e.jsx("div",{className:"p-4 space-y-4",children:e.jsx(b,{className:"border-red-500/50 bg-red-500/10",children:e.jsxs(N,{className:"pt-6 space-y-4",children:[e.jsxs("div",{className:"text-center",children:[e.jsx(De,{className:"w-12 h-12 text-red-500 mx-auto mb-3"}),e.jsx("h3",{className:"font-semibold",children:"Verifiering misslyckades"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:U})]}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-3 space-y-1 text-sm text-muted-foreground",children:[e.jsx("p",{className:"font-medium text-foreground",children:"Vanliga orsaker:"}),e.jsx("p",{children:"• Suddigt eller mörkt foto"}),e.jsx("p",{children:"• Dokumentet låg utanför bildramen"}),e.jsx("p",{children:"• Reflexljus eller skugga på dokumentet"}),e.jsx("p",{children:"• Selfien matchade inte dokumentets foto"})]}),e.jsx(m,{onClick:()=>r("appeal"),variant:"outline",className:"w-full",children:"Kontakta support"})]})})}),l==="appeal"&&e.jsx("div",{className:"p-4 space-y-4",children:e.jsx(b,{children:e.jsx(N,{className:"pt-6 space-y-4",children:M?e.jsxs("div",{className:"text-center space-y-3",children:[e.jsx(Q,{className:"w-12 h-12 text-primary mx-auto"}),e.jsx("h3",{className:"font-semibold",children:"Ärende skapat"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Vi granskar ditt ärende inom 12 arbetsdagar och återkommer via e-post."}),e.jsx(m,{onClick:()=>u("/"),variant:"outline",className:"w-full",children:"Gå till startsidan"})]}):e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"font-semibold",children:"Manuell granskning"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Beskriv kort varför du tror verifieringen misslyckades — t.ex. dålig belysning, skadat dokument eller tekniskt problem."}),e.jsx("textarea",{className:"w-full p-3 rounded-lg border bg-muted/50 text-sm resize-none",rows:4,placeholder:"Beskriv situationen...",value:D,onChange:s=>H(s.target.value)}),e.jsx(m,{onClick:fe,disabled:!D.trim(),className:"w-full",children:"Skicka in för granskning"})]})})})})]},l)})]})};export{Xe as default};
//# sourceMappingURL=VerifyIdentity-CVO73JZ2.js.map