48ea61cdcc
- Product documentation in docs/products/ - Updated MEMORY.md with product info - quiXzoom Auth Core as AAMOS Identity product
8 lines
31 KiB
JavaScript
8 lines
31 KiB
JavaScript
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 1–2 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 1–2 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
|