@criipto/verify-react 0.8.13 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/context.d.ts +15 -0
- package/dist/criipto-verify-react.cjs.js +1 -1
- package/dist/criipto-verify-react.cjs.js.map +1 -1
- package/dist/criipto-verify-react.esm.js +1 -1
- package/dist/criipto-verify-react.esm.js.map +1 -1
- package/dist/hooks/useNow.d.ts +1 -0
- package/dist/provider.d.ts +7 -0
- package/dist/use-criipto-verify.d.ts +18 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criipto-verify-react.cjs.js","mappings":"AACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,GCLRF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3ER,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,M,yLCLvD,MAAM,EAA+BC,QAAQ,qBCAvC,EAA+BA,QAAQ,S,aCA7C,MAAM,EAA+BA,QAAQ,oB,aCgC7C,MAAMC,EAAO,KACX,MAAM,IAAIC,MAAM,kEAMZC,EAAiB,CACrBC,kBAAmBH,EACnBI,eAAgBJ,EAChBK,yBAA0BL,EAC1BM,kBAAmBN,EACnBO,aAAcP,EACdQ,aAAcR,EACdS,eAAgBT,EAChBU,aAAc,QACdC,mBAAoB,SACpBC,OAAQ,KACRC,OAAQ,GACRC,OAAQ,QACRC,UAAMC,EACNC,MAAOC,eACPC,WAAW,EACXC,OAAQ,MAKV,GAF6B,IAAAC,eAA6CnB,GC/B1E,SAASoB,EAAcC,GAMrB,OALeA,EAAMC,MAAM,OAAOC,KAAIC,GAEb,KADvBA,EAAUA,EAAQC,QAAQ,WAAY,OAC1BC,OAAqBF,EAAQG,cAClCH,EAAQI,OAAO,EAAG,GAAGD,cAAgBH,EAAQI,OAAO,KAE7CC,KAAK,KAShB,SAASC,EAAgBC,EAAoBnB,GAClD,MAAe,UAAXA,EACe,OAAbmB,EAA0B,YACR,OAAbA,EAA0B,eACb,OAAbA,EAA0B,eAC5B,aAEM,YAAXnB,EACe,OAAbmB,EAA0B,cACR,OAAbA,EAA0B,cACb,OAAbA,EAA0B,gBAC5B,eAEM,SAAXnB,EACe,OAAbmB,EAA0B,iBACR,OAAbA,EAA0B,cACb,OAAbA,EAA0B,aAC5B,YAEM,YAAXnB,EACe,OAAbmB,EAA0B,cACR,OAAbA,EAA0B,eACb,OAAbA,EAA0B,cAC5B,eAEM,WAAXnB,EACe,OAAbmB,EAA0B,eACR,OAAbA,EAA0B,gBACb,OAAbA,EAA0B,iBAC5B,mBAnCX,SAA2BC,GACzB,MAAM,IAAIjC,MAAM,6BAqChBkC,GAGK,SAASC,EAAyBtC,GAGvC,OAFAA,EAAQA,EAAM6B,QAAQ,iBAAkB,KAE9BU,WAAW,MACZ,KAEAvC,EAAMuC,WAAW,SACjB,QAEAvC,EAAM0B,MAAM,KAAKc,MAAM,EAAG,GAAGP,KAAK,KAItC,SAASQ,EAAgBN,EAAoBnC,GAElD,MAAM0C,EAAWJ,EADlBtC,EAAQA,EAAM6B,QAAQ,iBAAkB,KAGvC,GAAiB,WAAba,EACF,MAAO,CAACC,MAAOnB,EAAcxB,GAAO6B,QAAQ,QAAS,gBAEvD,GAAiB,aAAba,EACF,MAAO,CAACC,MAAOnB,EAAcxB,GAAO6B,QAAQ,MAAO,KAErD,GAAiB,aAAba,EACF,MAAO,CAACC,MAAO,SAEjB,GAAiB,aAAbD,EAAyB,CAC7B,IAAIE,EACAC,EAAS7C,EAAM6B,QAAQ,YAAa,IAqBtC,MAnBa,UAAXgB,IACc,OAAbV,IAAmBS,EAAW,YACjB,OAAbT,IAAmBS,EAAW,aACjB,OAAbT,IAAmBS,EAAW,aACjB,OAAbT,IAAmBS,EAAW,cAEpB,UAAXC,IACc,OAAbV,IAAmBS,EAAW,qBACjB,OAAbT,IAAmBS,EAAW,yBACjB,OAAbT,IAAmBS,EAAW,uBACjB,OAAbT,IAAmBS,EAAW,sBAEpB,mBAAXC,IACc,OAAbV,IAAmBS,EAAW,qBACjB,OAAbT,IAAmBS,EAAW,wBACjB,OAAbT,IAAmBS,EAAW,sBACjB,OAAbT,IAAmBS,EAAW,qBAG1B,CACRD,MAAO,QACPC,YAGD,GAAiB,OAAbF,EACF,MAAO,CAACC,MAAOnB,EAAcxB,GAAO6B,QAAQ,KAAM,QAEpD,GAAiB,UAAba,EACF,MAAO,CAACC,MAAOnB,EAAcxB,GAAO6B,QAAQ,KAAM,OAEpD,GAAiB,cAAba,EAA0B,CAC9B,IAAIE,EACAC,EAAS7C,EAAM6B,QAAQ,aAAc,IAqBvC,MAnBa,gBAAXgB,IACc,OAAbV,IAAmBS,EAAW,kBACjB,OAAbT,IAAmBS,EAAW,kBACjB,OAAbT,IAAmBS,EAAW,oBACjB,OAAbT,IAAmBS,EAAW,qBAEpB,mBAAXC,IACc,OAAbV,IAAmBS,EAAW,iBACjB,OAAbT,IAAmBS,EAAW,wBACjB,OAAbT,IAAmBS,EAAW,yBACjB,OAAbT,IAAmBS,EAAW,4BAEpB,sBAAXC,IACc,OAAbV,IAAmBS,EAAW,gBACjB,OAAbT,IAAmBS,EAAW,eACjB,OAAbT,IAAmBS,EAAW,cACjB,OAAbT,IAAmBS,EAAW,gBAG1B,CAACD,MAAO,SAAUC,YAE3B,GAAiB,cAAbF,EACF,MAAO,CAACC,MAAOnB,EAAcxB,GAAO6B,QAAQ,MAAO,KAErD,GAAiB,cAAba,EAA0B,CAC5B,IAAIE,EAOJ,OANI5C,EAAM8C,SAAS,kBACA,OAAbX,IAAmBS,EAAW,cACpB,OAAbT,IAAmBS,EAAW,aACjB,OAAbT,IAAmBS,EAAW,YACjB,OAAbT,IAAmBS,EAAW,aAE1B,CAACD,MAAOC,EAAW,SAAWpB,EAAcxB,GAAO6B,QAAQ,MAAO,IAAKe,YAEhF,MAAiB,aAAbF,EACK,CAACC,MAAOnB,EAAcxB,GAAO6B,QAAQ,MAAO,KAG9C,CAACc,MAAOnB,EAAcxB,IAGxB,SAAS+C,EAAgBtB,GAC9B,IAAIuB,EAAWvB,EAAMe,QACjBS,EApLC,SAA0BxB,GAC/B,IAAIwB,EAAgC,KAmBpC,OAjBAxB,EAAMyB,SAAQC,IACZ,GAAIA,EAAEZ,WANoB,0BAOxB,GAAKU,EAEE,CACL,IAAIG,EAAWD,EAAEtB,QAVK,yBAUmB,IACrCwB,EAAWJ,EAAcpB,QAXP,yBAW+B,KACpC,SAAbuB,GAAuB,CAAC,eAAgB,SAASE,SAASD,IAGxC,iBAAbD,GAA4C,UAAbC,KAFtCJ,EAAgBE,QALlBF,EAAgBE,KAcfF,EAgK6BM,CAAiB9B,GAErD,OAAIwB,EACKxB,EAAM+B,QAAOL,IAAMA,EAAEZ,WAzLF,4BAyL8BkB,OAAO,CAACR,IAAgBS,MAAK,CAAC1E,EAAG2E,IAAMX,EAASY,QAAQ5E,GAAKgE,EAASY,QAAQD,KAEjIlC,EC7L4BxB,QAAQ,mC,0SCsC7C,MAAM4D,EAA+B,CACnC,6BACA,qCACA,8BACA,sCACA,yCACA,6CAGF,SAASC,EAAeC,GACtB,MAAM,QAACC,EAAO,OAAEhD,GAAU+C,EACpBE,GAAYD,aAAO,EAAPA,EAASC,WAAYC,MAAMC,QAAQH,aAAO,EAAPA,EAASC,WAAaD,aAAO,EAAPA,EAASC,UAAY,CAACD,aAAO,EAAPA,EAASC,WAAa,GACvH,IAAIG,GAAQJ,aAAO,EAAPA,EAASK,WAAYL,aAAO,EAAPA,EAASK,UAAU3C,MAAM,KAAO,GAcjE,OAbIV,IACuB,IAArBiD,EAAUnC,OACR+B,EAA6BP,SAASW,EAAU,KAClDG,EAAME,KAAK,UAAUtD,KAEdiD,EAAUnC,QAAU,EACzBmC,EAAUM,MAAKC,GAAKX,EAA6BP,SAASkB,MAC5DJ,EAAME,KAAK,UAAUtD,KAGvBoD,EAAME,KAAK,UAAUtD,MAGlBoD,EAAMtC,OAASsC,EAAMnC,KAAK,UAAOf,EAG1C,MAAMC,EAAQC,eA+Ld,EA7L+BqD,IAC7B,MAAMC,EAAcD,EAAMC,aAAeC,OAAOC,SAASC,MAElDvD,IAAU,IAAAwD,WACf,IAAM,IAAI,IAAJ,CAAgB,CACpB/D,OAAQ0D,EAAM1D,OACdgE,SAAUN,EAAMM,SAChB5D,QACAuD,YAAaD,EAAMC,iBAIhBM,EAAeC,IAAoB,IAAAH,UAAqC,OAC/E,IAAAI,YAAU,KACR,IAAIC,GAAe,EAMnB,OALa,OAAD,6BACV,MAAMH,QAAsB1D,EAAOf,2BAC/B4E,GAAcF,EAAiBD,MAG9B,KACLG,GAAe,KAEhB,CAAC7D,IAEJ,MAAOR,EAAQsE,IAAa,IAAAN,UAAwB,OAC7CzD,EAAWgE,IAAgB,IAAAP,WAAS,IACpC7D,EAAMqE,IAAW,IAAAR,UAA4CL,EAAMxD,MACpEL,EAAe6D,EAAMc,UAAY,QACjC1E,EAAqB4D,EAAM5D,oBAAsB,SACjDG,EAASyD,EAAMzD,QAAU,QACzBwE,EAAYf,EAAMe,UAElBC,EAAc,KAClB,IAAIhB,EAAMxD,KAAV,CACA,GAAqB,UAAjBL,GAAmD,WAAvBC,EAG9B,OAFA,IAAA6E,gBAAevE,QACfmE,OAAQpE,IAIV,IAAAwE,gBAAevE,GAEF,OAAD,6BACV,MAAMF,QAAa,IAAAR,gBACnB6E,EAAQrE,QAINP,GAAe,IAAAiF,cAAa3B,I,UAChC,OAAO,OAAP,sBACEU,cACA9D,aAAc,QACXoD,GAAW,IAAE,CAChB4B,MAAkB,QAAX,EAAAnB,EAAMmB,aAAK,QAAI5B,aAAO,EAAPA,EAAS4B,MAC/BC,OAAoB,QAAZ,EAAApB,EAAMoB,cAAM,QAAI7B,aAAO,EAAPA,EAAS6B,OACjCL,UAAWA,QAAAA,EAAaxB,aAAO,EAAPA,EAASwB,UACjCvE,KAAmB,QAAb,EAAA+C,aAAO,EAAPA,EAAS/C,YAAI,QAAIA,EACvBoD,UAAWP,EAAe,CAACE,UAAShD,eAErC,CACDC,EACAwD,EAAMmB,MACNnB,EAAMoB,OACNL,EACAxE,EACA0D,IAGIlE,GAAoB,IAAAmF,cAAmB3B,GAAyC,OAAD,6BACnF,aAAa1C,EAAOd,kBAAkBc,EAAOwE,qBAAqBpF,EAAasD,SAC9E,CAAC1C,EAAQZ,IAENC,GAAiB,IAAAgF,cAAY,CAAOJ,EAA8BxB,IAAgD,OAAD,6BACrH,GAAIA,EAAO9C,MAAyB,UAAjBL,EAA0B,CAC3C,IAAImF,EAAehC,EAAOW,aAAeA,EACzC,IAAKqB,EAAc,MAAM,IAAI5F,MAAM,iFAE7BmB,EAAO0E,gBAAgBT,EAAU,CAACU,cAAelC,EAAO9C,KAAKgF,cAAeC,aAAcH,IAAeI,MAAKZ,KAC9GA,aAAQ,EAARA,EAAUa,MAAMhB,EAAU,CAACgB,KAAMb,EAASa,QACrCb,aAAQ,EAARA,EAAUc,UAAUjB,EAAU,CAACiB,SAAUd,EAASc,WACtDjB,EAAU,SACdkB,OAAOC,IACRnB,EAAUmB,WAGRhB,aAAQ,EAARA,EAAUa,MAAMhB,EAAU,CAACgB,KAAMb,EAASa,QACrCb,aAAQ,EAARA,EAAUc,UAAUjB,EAAU,CAACiB,SAAUd,EAASc,YAClDd,aAAQ,EAARA,EAAUiB,OAAOpB,EAAU,IAAI,EAAAqB,YAAYlB,EAASiB,MAAOjB,EAASmB,oBACxEtB,EAAU,MAGjBK,QACC,CAACA,EAAa7E,EAAcwE,EAAW9D,IAEpCqF,GAAU,IAAAC,UAAuC,KAC9C,CACLvG,kBAA0B0D,GAAwC,OAAD,mCACzDzC,EAAOuF,SAASC,UAAUpG,EAAaqD,OAE/CzD,eAAiByD,GACRzC,EAAOyF,MAAMD,UAAUpG,EAAaqD,IAASoC,MAAKZ,KACnDA,aAAQ,EAARA,EAAUa,MAAMhB,EAAU,CAACgB,KAAMb,EAASa,QACrCb,aAAQ,EAARA,EAAUc,UAAUjB,EAAU,CAACiB,SAAUd,EAASc,WACtDjB,EAAU,SACdkB,OAAOC,IACRnB,EAAUmB,MAGdhG,yBAA0B,IAAMe,EAAOf,2BACvCC,oBACAC,aAAc,IAAY,OAAD,6BACvB,GAAqB,UAAjBG,GAAmD,WAAvBC,EAChC,aAAa,IAAAJ,mBAEfC,eACAC,iBACAC,eACAC,qBACAC,SACAC,OAAQO,EAAOP,OACf2D,cACA1D,SACAC,OACAE,QACAE,YACA4C,UAAWe,EAAgBjC,EAAgBiC,EAAcgC,2BAAwB9F,EACjFI,SACAkE,eAED,CACDlE,EACAoD,EACA9D,EACAC,EACAC,EACAE,EACAC,EACAwD,EAAMmB,MACNnB,EAAMoB,OACNxE,EACAV,EACAqE,EACAQ,IAuCF,OApCA,IAAAN,YAAU,KACR,IAAK5D,EAAOuF,SAASI,WAEnB,YADAxB,IAIF,IAAIN,GAAe,EACnBE,GAAa,GAEb,MAAMtB,GAAS,IAAAmD,oCAAmCvC,OAAOC,UACzD,OAAIb,EAAOqC,MAAyB,SAAjBxF,GACjByE,GAAa,GACbD,EAAU,CAACgB,KAAMrC,EAAOqC,YACxBX,MAIFnE,EAAOuF,SAASM,QAAQhB,MAAKZ,IACtBJ,IACLE,GAAa,IACTE,aAAQ,EAARA,EAAUa,MAAMhB,EAAU,CAACgB,KAAMb,EAASa,QACrCb,aAAQ,EAARA,EAAUc,UAAUjB,EAAU,CAACiB,SAAUd,EAASc,WACtDjB,EAAU,MACfK,QACCa,OAAOC,IACHpB,IACLE,GAAa,GACbD,EAAUmB,GACVd,QAGK,KACLN,GAAe,MAEhB,CAACV,EAAMxD,KAAML,KAGd,SAAC,WAA6B,eAACZ,MAAO2G,GAAO,UAC1ClC,EAAM2C,aC7Pb,SAASC,EAAOC,GACd,OAAOA,EAAQC,KAAKC,UAAUC,WAczB,SAASC,IACd,OAZOL,EAAO,sBAAyB1C,OAAegD,SAYlC,MALeN,EAAO,WAMlB,UAEjB,KCHM,SAASO,EAA0BnD,GAChD,MAAM,MAACoD,EAAK,QAAEC,EAAO,WAAEC,EAAU,WAAEC,GAAcvD,GAC1CwD,EAAWC,IAAgB,IAAApD,WAAS,IACrC,OAAC/D,IAAU,IAAAoH,YAAW,GAsC5B,OApCA,IAAAjD,YAAU,KACR,IAAK+C,EAAW,OAChB,IAAI9C,GAAe,EAEnB,MAAMiD,EAAO,KAAY,O,EAAA,K,OAAA,E,EAAA,YACvB,IAAKjD,EAAc,OACnB,MAAMI,QAAiB8C,MAAMR,EAAMS,SAEnC,GAAwB,MAApB/C,EAASgD,OAAb,CAGO,KAAIhD,EAASgD,QAAU,KAKvB,CACL,IAAKpD,EAAc,OACnB,MAAM,UAACqD,SAAmBjD,EAASkD,OAEnC,kBADMV,EAAW,WAAWhH,IAASyH,MARhC,CACL,IAAKrD,EAAc,OACnB,MAAMqB,QAAcjB,EAASmD,OAC7BZ,EAAQtB,SALRmC,WAAWP,EAAM,M,YALI,K,+QAqBzB,OADAO,WAAWP,EAAM,KACV,KACLjD,GAAe,KAGhB,CAAC8C,IAOG,iBAAmBxD,EAAM2C,SAAU,OAAF,wBACnC3C,EAAM2C,SAAS3C,OAAK,CACvBmE,QAPqB,KACrBZ,IACAE,GAAa,OCtCF,SAASW,EAA0BpE,GAChD,MAAM,MAACoD,EAAK,QAAEC,EAAO,WAAEC,EAAU,WAAEC,EAAU,MAAEc,GAASrE,GACjDwD,EAAWC,IAAgB,IAAApD,WAAS,GAe3C,OC/Ba,SAA2BiE,EAAyBC,EAA8B,IAC/F,MAAMC,GAAkB,IAAAC,QAAOC,SAASF,kBACjCrD,EAAOwD,IAAY,IAAAtE,UAASmE,EAAgBI,UAEnD,IAAAnE,YAAU,KACRiE,SAASG,iBAAiB,mBAAoBC,GAEvC,KACLJ,SAASK,oBAAoB,mBAAoBD,MAElDP,GAEH,MAAMO,EAA0B,KAC9B,MAAME,EAAYN,SAASF,gBAEG,WAA5BA,EAAgBI,SACF,YAAdI,GAEIV,GAAWA,IAGjBE,EAAgBI,QAAUI,EAC1BL,EAASH,EAAgBI,UDJ3BK,EAAkB,KAAY,O,EAAA,K,OAAA,E,EAAA,YAC5BZ,EAAM,UAAW,eAAgBb,EAAU0B,YACtC1B,GAELF,EAAWF,EAAM+B,c,YAJW,K,gRAK3B,CAAC/B,EAAOI,IAQJ,iBAAmBxD,EAAM2C,SAAU,OAAF,wBACnC3C,EAAM2C,SAAS3C,OAAK,CACvBmE,QARqB,KACrBE,EAAM,UAAW,kBACjBd,IACAE,GAAa,OEZjB,MAAM2B,EAAY,uCAWLC,EATN,WACL,MAAMC,EAAW3I,eAAe4I,QAAQH,GACxC,GAAIE,EACF,OAAOE,KAAKC,MAAMH,GAMWI,GCXlB,SAASC,EAAsB3F,GAC5C,MAAM,MAACoD,EAAK,QAAEC,EAAO,WAAEC,EAAU,WAAEC,EAAU,MAAEc,EAAK,KAAE7H,EAAI,YAAEyD,GAAeD,EAoB3E,OANA,IAAAS,YAAU,KACH4E,IDFP1I,eAAeiJ,WAAWR,GCIxB9B,EAAW+B,EAAkBjC,MAAM+B,gBAClC,IAEI,iBAAmBnF,EAAM2C,SAAU,OAAF,wBACnC3C,EAAM2C,SAAS3C,OAAK,CACvBmE,QApBqB,KDclB,IAAmBnH,ECbtBqH,EAAM,MAAO,kBDaSrH,ECXZ,CACRoG,QACAnD,cACAzD,QDSJG,eAAekJ,QAAQT,EAAWI,KAAKM,UAAU9I,ICN/CuG,Q,0SCXJ,MAAMwC,EAAW9C,IASF,SAAS+C,EAAyBhG,G,QAC/C,MAAOI,EAAM6F,IAAW,IAAA5F,UAASL,EAAMI,OAChCgD,EAAO8C,IAAY,IAAA7F,UAA+C,QAAxB,EAAAgF,aAAiB,EAAjBA,EAAA,aAAwB,QAAI,OACtE7I,EAAMqE,IAAW,IAAAR,UAAkD,QAAvB,EAAAgF,aAAiB,EAAjBA,EAAA,YAAuB,aAAI5I,IACvEsF,EAAOoE,IAAY,IAAA9F,UAAwB,OAC3C+F,EAAKC,IAAU,IAAAhG,UAAgC,KAC/CmD,EAAWC,IAAgB,IAAApD,YAASgF,IACrC,kBAACtJ,EAAiB,mBAAEK,EAAkB,aAAEJ,EAAY,eAAEE,EAAgB+D,YAAaqG,IAAsB,IAAA5C,YAAW,GACpHzD,EAAcD,EAAMC,aAAeqG,EAQnCC,EAAY,IAAIC,KACpBC,QAAQL,IAAII,GACZH,GAAOK,GAAQA,EAAK1H,OAAO,CAACwH,OAGxBG,GAAiB,IAAAzF,cAAmBiE,GAAwB,kCAChE,MAAMyB,EAAW,CAACpK,QAXlBqE,OAAQpE,GACRyJ,EAAS,MACTD,EAAQjG,EAAMI,MAYd,MAAMyG,QAAyBjD,MAAMuB,GACrC,GAAI0B,EAAiB/C,QAAU,IAE7B,YADAqC,QAAeU,EAAiB5C,QAIlC,MAAM,SAAC9D,SAAwC0G,EAAiB7C,OAChE,GAA2B,mBAAvB5H,EAEF,YADA8D,OAAOC,SAASC,KAAOD,GAGzB,MAAM2G,EAAM,IAAIC,IAAI5G,GACdb,GA5CkBtC,EA4CU8J,EAAIE,aA3CjCvH,MAAMwH,KAAKjK,EAAMkK,QAAQC,QAAO,CAACC,EAAgC1M,KACtE0M,EAAK1M,GAAOsC,EAAMjC,IAAIL,GACf0M,IACN,KAJL,IAA4BpK,QA8ClBd,EAAeoD,EAAQ,CAC3B9C,KAAMoK,EAASpK,KACfyD,oBAED,CAAC7D,EAAoBI,IAElB6K,GAAU,IAAAnG,cAAY,IAAY,kCACtCqF,EAAU,mCACV,MAAM/J,QAAaR,IAEnBD,EAAkB,CAChByD,UAAW,sCACXI,UAAW,oBACX0H,aAAc,OACd9K,OACAyD,gBACCyB,MAAKoF,GACClD,MAAMkD,GAAKpF,MAAKZ,GAAYA,EAASkD,WAE7CtC,MAAK0B,IACJvC,EAAQrE,QAAQC,GAChByJ,EAAS9C,GACT,MAAMhB,EAAwB,QAAb2D,EAAqBwB,mBAAmBrH,OAAOC,SAASC,MAAQ,OAC3EoH,EAAU,GAAGzB,EAAW3C,EAAMqE,YAAYC,cAAgBtE,EAAMqE,YAAYE,iCAAiCvF,IAEnHmE,EAAUrG,OAAOC,SAASC,MAC1BmG,EAAUiB,GACVvB,EAAQuB,MAET3F,MAAM4E,QAAQ1E,WACd,CAAChG,EAAmBkE,KAGvB,IAAAQ,YAAU,KACJ+C,GACJ6D,MACC,CAACA,EAAS7D,KAGb,IAAA/C,YAAU,KACR,GAAI+C,EAAW,OAEf,MAAMoE,EAAWC,aAAY,KACvBrE,GACJ6D,MACC,MACH,MAAO,IAAMS,cAAcF,KAC1B,CAACP,EAAS7D,IAGb,MAAMuE,EAAiB,KACrBxB,EAAU,aACV9C,GAAa,GACb0C,EAAS,OAGL6B,EAAejG,IACnB0B,GAAa,GACb0C,EAASpE,IAGLkG,GACJ,6BAAGC,UAAW,GAAGlI,EAAMkI,aAAa1E,EAAY,4BAA8B,KAAMpD,KAAMA,EAAM+D,QAAS4D,GAAc,YACrH,8BAAKG,UAAU,oBAAkB,UAC9B1E,GAAY,gBAAK0E,UAAU,uBAA8BlI,EAAMmI,QAEjEnI,EAAM2C,aAIX,OACE,UAAC,aAAc,WACZS,GACC,SAAC,aAAc,UACC,OAAb2C,GACC,SAAC,EAAO,eACN3C,MAAOA,EACPC,QAAS2E,EACT1E,WAAYqD,EACZpD,WAAYwE,EACZ1D,MAAOkC,GAAS,UAEf0B,KAEY,YAAblC,GACF,SAAC,EAAO,eACN3C,MAAOA,EACPC,QAAS2E,EACT1E,WAAYqD,EACZpD,WAAYwE,EACZ1D,MAAOkC,GAAS,UAEf0B,KAEY,QAAblC,GACF,SAAC,EAAG,eACF3C,MAAOA,EACPC,QAAS2E,EACT1E,WAAYqD,EACZpD,WAAYwE,EACZ1D,MAAOkC,EACPtG,YAAaA,EACbzD,KAAMA,GAAI,UAETyL,KAEDA,IAEJA,EACHlG,IAAS,uBAAIA,OC5IpB,MAAM,EAAWkB,IAEV,SAASmF,EAAapI,GAC3B,OACE,4BAAGkI,UAAW,yBAAyBlI,EAAMkI,YAAa9H,KAAMJ,EAAMI,KAAM+D,QAASnE,EAAMmE,SAAO,UAAGnE,EAAM2C,YAIxG,SAAS0F,EAAOrI,GACrB,OACE,iCAAQkI,UAAW,yBAAyBlI,EAAMkI,YAAaI,KAAK,SAAUnE,QAASnE,EAAMmE,SAAO,UAAGnE,EAAM2C,YAelG,SAAS4F,EAAiBvI,GACvC,MAAM,SAACwI,GAAYxI,EACbkC,GAAU,IAAAwB,YAAW,GACrBwE,EAAY,mBAqHS3M,EArH8BiN,GAsHzDjN,EAAQA,EAAM6B,QAAQ,iBAAkB,KACjBH,MAAM,KACDkK,QAAO,CAACC,EAAgBjK,IAC9CiK,EAAK/J,OACA+J,EAAKpI,OAAO,CAAC,GAAGoI,EAAKA,EAAK/J,OAAO,MAAMF,MAEvCiK,EAAKpI,OAAO,CAAC7B,KAErB,IAEeD,KAAIgL,GAAa,oBAAoBA,MAAa1K,KAAK,OAhIJwC,EAAMkI,UAAY,IAAIlI,EAAMkI,YAAc,MACxGO,EAAUC,IAAe,IAAArI,UAAoC,OAE7DD,EAAM6F,IAAW,IAAA5F,UAASL,EAAMI,MACjCH,EAAcD,EAAMC,aAAeiC,EAAQjC,YAiHnD,IAA6B1E,GA/G3B,IAAAkF,YAAU,KACR,GAAIT,EAAMI,KAAM,OAEhB,IACIR,EADAc,GAAe,EAgBnB,OAbI8H,EAAS1K,WAAW,2BAA6B,IACnD8B,EAAY,aAAa,gBAG3BsC,EAAQnG,kBAAkB,CACxBkE,cACAT,UAAWgJ,EACX5I,cACC8B,MAAKtB,IACFM,GAAcuF,EAAQ7F,MAE3ByB,MAAM4E,QAAQ1E,OAER,KACLrB,GAAe,KAEhB,CAACV,EAAMI,KAAMoI,EAAUtG,EAAQ1F,KAAMyD,IAExC,MAAM0I,EAAyCC,IAU7C,GATI1G,EAAQ1F,MAAQ,kBAAmB0F,EAAQ1F,OAE7C,IAAAqM,eAAc3G,EAAQxF,MAAO,CAC3BoM,cAAe,WACfC,mBAAoB7G,EAAQ1F,KAAKgF,cACjCC,aAAcxB,IAIdD,EAAMsC,MAAO,CACf,IAAI0G,EACqB,mBAAhBhJ,EAAMsC,MACXtC,EAAMsC,MAAM,CACVkG,WACAS,OAAQ,IAAMP,EAAY,SAEZ,IAAhB1I,EAAMsC,OAEQ,IAAd0G,IACFJ,EAAMM,iBAEmB,kBAAdF,EACT9G,EAAQrG,eAAe,CACrB2D,UAAW,CAACgJ,GACZvI,YAAaA,EACbwI,UAAU,KAGZC,EAAYM,GACZ9G,EAAQrG,eAAe,CACrB2D,UAAW,CAACgJ,GACZvI,YAAaA,EACbwI,UAAU,MAMdzI,EAAMmE,SAASnE,EAAMmE,QAAQyE,IAGnC,GAAiB,wCAAbJ,EACF,OACE,SAACxC,EAAwB,eACvB/F,YAAaD,EAAMC,YACnBG,KAAMA,EACN8H,UAAWA,EACXC,MAAM,gBAAKgB,IAAKC,EAAeZ,GAAWa,IAAI,MAAK,UAElDrJ,EAAM2C,YAKb,MAAM2G,GACJ,UAAC,aAAc,WACZF,EAAeZ,IACd,8BAAKN,UAAU,oBAAkB,WAC/B,gBAAKiB,IAAKC,EAAeZ,GAAWa,IAAI,QAExC,KACHrJ,EAAM2C,YAIX,OAAIvC,GAEA,UAAC,aAAc,YACb,SAACgI,EAAY,iBAAKpI,EAAK,CAAEI,KAAMA,EAAM8H,UAAWA,EAAW/D,QAASwE,GAAW,UAC5EW,KAEFb,MAML,UAAC,aAAc,YACb,SAACJ,EAAM,iBAAKrI,EAAK,CAAEkI,UAAWA,EAAW/D,QAASwE,GAAW,UAC1DW,KAEFb,KAmBP,SAASW,EAAe7N,GACtB,OAAIA,EAAMuC,WAAW,wBCpMvB,y3DDuMMvC,EAAMuC,WAAW,0BEvMvB,q4DF0MMvC,EAAMuC,WAAW,0BG1MvB,yvDH6MMvC,EAAMuC,WAAW,0BI7MvB,i6DJgNMvC,EAAMuC,WAAW,4BKhNvB,y5FLmNMvC,EAAMuC,WAAW,oBMnNvB,qlGNsNMvC,EAAMuC,WAAW,uBOtNvB,6uEPyNMvC,EAAMuC,WAAW,2BQzNvB,ioER4NMvC,EAAMuC,WAAW,2BS5NvB,i7GT+NMvC,EAAMuC,WAAW,2BU/NvB,iiEVkOMvC,EAAMuC,WAAW,0BWlOvB,8gEXkOE,EY7MF,SAASyL,EAASf,EAAkBhJ,GAClC,MAAMvB,EAAWJ,EAAyB2K,GACpCgB,EAAQhK,EAAU2H,QAAO,CAACC,EAAMoB,IAAapB,GAAQvJ,EAAyB2K,KAAcvK,EAAW,EAAI,IAAI,GACrH,OAAiB,IAAVuL,EAGM,SAASC,EAAmBzJ,G,QACzC,MAAM,yBAAClE,EAAwB,OAAES,EAAM,UAAEwE,IAAa,IAAA2C,YAAW,GAC3DhG,EAAWsC,EAAMtC,UAAYqD,GAAyB,MACrDR,EAAeC,IAAoB,IAAAH,UAAqC,OAE/E,IAAAI,YAAU,KACR,GAAIT,EAAMR,UAAW,OAErB,IAAIkB,GAAe,EAMnB,MALA,M,cAAa,K,OAAA,E,EAAA,YACX,MAAMH,QAAsBzE,IACxB4E,GAAcF,EAAiBD,I,YAFxB,K,mQAAb,GAKO,KACLG,GAAe,KAEhB,CAACV,EAAMR,YAEV,MAAMA,EAAYlB,EAAsE,QAAtD,EAAe,QAAf,EAAA0B,EAAMR,iBAAS,QAAIe,aAAa,EAAbA,EAAegC,4BAAoB,QAAI,IAE5F,OACE,8BAAK2F,UAAU,wBAAsB,UAClC1I,EAAUtC,KAAIsL,IAAY,OACzB,UAACD,EAAgB,eACfC,SAAUA,EAEVrE,QAASnE,EAAM0J,SAAW,IAAO1J,EAAM0J,SAAUlB,QAAa/L,EAC9DwD,YAAaD,EAAMC,YACnBqC,MAAOtC,EAAMsC,OAAK,WAEjB7E,EAAgBC,EAAUnB,GAAU,GAAGkB,EAAgBC,EAAUnB,MAAa,GAAIyB,EAAgBN,EAAU8K,GAAUtK,MAAK,IAC3HqL,EAASf,EAAUhJ,GAAa,MA3CnBxC,EA2CyCgB,EAAgBN,EAAU8K,GAAUrK,SA1C9FnB,EACEA,EAAM2M,UAAU,EAAG,GAAGC,cAAgB5M,EAAMO,OAAO,EAAGP,EAAMK,QADhDL,MAoCNwL,GArCf,IAAwBxL,QCXxB,MAmEA,EA3DMgD,IACJ,MAAM6J,GAAa,IAAApF,QAAuB,OACpC,OAAC5H,EAAM,aAAEZ,EAAY,eAAEC,EAAc,KAAEM,IAAQ,IAAAkH,YAAW,IACzDoG,EAAWC,IAAgB,IAAA1J,WAAS,IAAM2J,KAAKC,SAAS/E,cACxDgF,EAAgBC,IAAmB,IAAA9J,WAAS,IAC5C+J,EAAaC,IAAgB,IAAAhK,WAAS,IACtC0B,EAAOoE,IAAY,IAAA9F,UAAqC,OAE/D,IAAAiK,kBAAgB,KACd,IAAKT,EAAWjF,QAAS,OACzB,MAAM2F,EAAU1N,EAAO2N,GAAGnI,UAAUwH,EAAWjF,QAAU3I,KAwBzD,OAtBAsO,EAAQE,eAAiB,KACvBN,GAAgB,IAGlBI,EAAQ7I,MAAKZ,IACPyJ,EAAQG,WACZxO,EAAe4E,EAAU,CACvBtE,KAAMA,GAAQ,kBAAmBA,EAAOA,OAAOC,OAEhDoF,OAAMC,IACHA,aAAe,EAAA6I,mBACjBN,GAAa,GAGXE,EAAQG,YAEZvE,EAASpE,GACT7F,EAAe,CACb6F,MAAOD,GACN,QAGE,KACLyI,EAAQK,YAET,CAACf,EAAWjF,QAAS/H,EAAQZ,EAAcC,EAAgB4N,IAE9D,MAOMe,GAAY,gBAAKC,IAAKjB,IAC5B,OAAI7J,EAAM2C,SACD3C,EAAM2C,SAAS,CACpBkI,YACAX,iBACAE,cACArI,QACAgJ,MAdgB,KAClBZ,GAAgB,GAChBE,GAAa,GACblE,EAAS,MACT4D,EAAaC,KAAKC,SAAS/E,eActB2F,GCnEM,SAASG,IACtB,MAAM,OAAC3O,EAAM,kBAAET,EAAiB,eAAEC,EAAc,UAAE2D,EAAS,UAAE5C,IAAa,IAAA8G,YAAW,GAErF,MAAO,CAACrH,SAAQT,oBAAmBC,iBAAgB2D,YAAW5C,a","sources":["webpack://@criipto/verify-react/webpack/bootstrap","webpack://@criipto/verify-react/webpack/runtime/compat get default export","webpack://@criipto/verify-react/webpack/runtime/define property getters","webpack://@criipto/verify-react/webpack/runtime/hasOwnProperty shorthand","webpack://@criipto/verify-react/webpack/runtime/make namespace object","webpack://@criipto/verify-react/external commonjs \"react/jsx-runtime\"","webpack://@criipto/verify-react/external commonjs \"react\"","webpack://@criipto/verify-react/external commonjs \"@criipto/auth-js\"","webpack://@criipto/verify-react/./src/context.ts","webpack://@criipto/verify-react/./src/utils.ts","webpack://@criipto/verify-react/external commonjs \"@criipto/auth-js/dist/index.css\"","webpack://@criipto/verify-react/./src/provider.tsx","webpack://@criipto/verify-react/./src/device.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Desktop.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Android.tsx","webpack://@criipto/verify-react/./src/hooks/usePageVisibility.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/shared.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/iOS.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/beeid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nldigid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dkmitid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dknemid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/ftnbankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/ftnmobile@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/itsme@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sebankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sofort@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nobankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/novipps@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodSelector.tsx","webpack://@criipto/verify-react/./src/components/QRCode.tsx","webpack://@criipto/verify-react/./src/use-criipto-verify.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react/jsx-runtime\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@criipto/auth-js\");","import CriiptoAuth, {OpenIDConfiguration, AuthorizeUrlParamsOptional, PKCE, AuthorizeResponse, OAuth2Error, PKCEPublicPart} from '@criipto/auth-js';\nimport { PopupAuthorizeParams, RedirectAuthorizeParams } from '@criipto/auth-js/dist/types';\nimport { createContext } from 'react';\n\nexport type Result = {id_token: string, state?: string} | {code: string, state?: string} | OAuth2Error;\nexport type Action = 'confirm' | 'accept' | 'approve' | 'sign' | 'login';\n\nexport interface CriiptoVerifyContextInterface {\n loginWithRedirect: (params?: RedirectAuthorizeParams) => Promise<void>,\n loginWithPopup: (params?: PopupAuthorizeParams) => Promise<void>,\n fetchOpenIDConfiguration: () => Promise<OpenIDConfiguration>,\n buildAuthorizeUrl: (options?: AuthorizeUrlParamsOptional) => Promise<string>,\n generatePKCE: () => Promise<PKCE | undefined>,\n buildOptions: (options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) => AuthorizeUrlParamsOptional\n handleResponse: (response: AuthorizeResponse, params: {pkce?: PKCE, redirectUri?: string}) => Promise<void>,\n responseType: 'token' | 'code'\n completionStrategy: 'client' | 'openidprovider',\n result: Result | null\n domain: string\n redirectUri?: string,\n action: Action,\n pkce?: PKCE | PKCEPublicPart,\n store: Storage,\n isLoading: boolean,\n acrValues?: string[],\n uiLocales?: string,\n client: CriiptoAuth\n}\n\n/**\n * @ignore\n */\nconst stub = (): never => {\n throw new Error('You forgot to wrap your component in <CriiptoVerifyProvider>.');\n};\n\n/**\n * @ignore\n */\nconst initialContext = {\n loginWithRedirect: stub,\n loginWithPopup: stub,\n fetchOpenIDConfiguration: stub,\n buildAuthorizeUrl: stub,\n generatePKCE: stub,\n buildOptions: stub,\n handleResponse: stub,\n responseType: 'token' as 'token' | 'code',\n completionStrategy: 'client' as 'client' | 'openidprovider',\n result: null,\n domain: '',\n action: 'login' as Action,\n pkce: undefined,\n store: sessionStorage,\n isLoading: false,\n client: null as any as CriiptoAuth\n};\n\nconst CriiptoVerifyContext = createContext<CriiptoVerifyContextInterface>(initialContext);\n\nexport default CriiptoVerifyContext;","import { Action } from \"./context\";\n\nexport const DKMITID_PREFIX = 'urn:grn:authn:dk:mitid';\n\nexport function lowestMitIDValue(input: string[]) : string | null {\n let dkmitidMethod : string | null = null;\n\n input.forEach(s => {\n if (s.startsWith(DKMITID_PREFIX)) {\n if (!dkmitidMethod) {\n dkmitidMethod = s;\n } else {\n let newLevel = s.replace(DKMITID_PREFIX, '');\n let oldLevel = dkmitidMethod.replace(DKMITID_PREFIX, '');\n if (newLevel === ':low' && [':substantial', ':high'].includes(oldLevel)) {\n dkmitidMethod = s;\n }\n else if (newLevel === ':substantial' && oldLevel === ':high') {\n dkmitidMethod = s;\n }\n }\n }\n });\n\n return dkmitidMethod;\n}\n\nfunction autoTitleCase(input: string) {\n var segments = input.split(/:|-/).map(segment => {\n segment = segment.replace(/id(\\s|$)/, 'ID');\n if (segment.length === 2) return segment.toUpperCase();\n return segment.substr(0, 1).toUpperCase() + segment.substr(1);\n });\n return segments.join(' ');\n}\n\nfunction assertUnreachable(x: never): never {\n throw new Error(\"Didn't expect to get here\");\n}\n\nexport type Language = 'en' | 'da' | 'sv' | 'nb';\n\nexport function stringifyAction(language: Language, action: Action) : string {\n if (action === 'login') {\n if (language === 'da') return 'Login med';\n else if (language === 'sv') return 'Logga in med'\n else if (language === 'nb') return 'Logg inn med';\n return 'Login with';\n }\n if (action === 'approve') {\n if (language === 'da') return 'Godkend med';\n else if (language === 'sv') return 'Godkänn med'\n else if (language === 'nb') return 'Godkjenne med';\n return 'Approve with';\n }\n if (action === 'sign') {\n if (language === 'da') return 'Underskriv med';\n else if (language === 'sv') return 'Signera med'\n else if (language === 'nb') return 'Signer med';\n return 'Sign with';\n }\n if (action === 'confirm') {\n if (language === 'da') return 'Bekræft med';\n else if (language === 'sv') return 'Bekräfta med'\n else if (language === 'nb') return 'Bekreft med';\n return 'Confirm with';\n }\n if (action === 'accept') {\n if (language === 'da') return 'Accepter med';\n else if (language === 'sv') return 'Acceptera med'\n else if (language === 'nb') return 'Aksepterer med';\n return 'Accept with';\n }\n\n assertUnreachable(action);\n}\n\nexport function acrValueToProviderPrefix(value: string) {\n value = value.replace('urn:grn:authn:', '');\n\n if (value.startsWith('fi')) {\n return 'fi';\n }\n else if (value.startsWith('itsme')) {\n return 'itsme';\n } else {\n return value.split(':').slice(0, 2).join(':');\n }\n}\n\nexport function acrValueToTitle(language: Language, value: string) : {title: string, subtitle?: string} {\n\tvalue = value.replace('urn:grn:authn:', '');\n const provider = acrValueToProviderPrefix(value);\n\n if (provider === 'be:eid') {\n return {title: autoTitleCase(value).replace('BEEID', 'Belgian eID')};\n }\n if (provider === 'nl:digid') {\n return {title: autoTitleCase(value).replace('NL ', '')};\n }\n if (provider === 'dk:mitid') {\n return {title: 'MitID'};\n }\n if (provider === 'dk:nemid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('dk:nemid:', '');\n\t\t\n\t\tif (suffix === 'poces') {\n\t\t\tif (language === 'en') subtitle = 'Personal';\n\t\t\tif (language === 'da') subtitle = 'Personlig';\n\t\t\tif (language === 'sv') subtitle = 'Personlig';\n\t\t\tif (language === 'nb') subtitle = 'Personlig';\n\t\t}\n\t\tif (suffix === 'moces') {\n\t\t\tif (language === 'en') subtitle = 'Employee key card';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglekort';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelkort';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelkort';\n\t\t}\n\t\tif (suffix === 'moces:codefile') {\n\t\t\tif (language === 'en') subtitle = 'Employee key file';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglefil';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelfil';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelfil';\n\t\t}\n\n return {\n\t\t\ttitle: 'NemID',\n\t\t\tsubtitle\n\t\t}\n }\n if (provider === 'fi') {\n return {title: autoTitleCase(value).replace('FI', 'FTN')};\n }\n if (provider === 'itsme') {\n return {title: autoTitleCase(value).replace('me', 'ME')};\n }\n if (provider === 'se:bankid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('se:bankid:', '');\n\n\t\tif (suffix === 'same-device') {\n\t\t\tif (language === 'en') subtitle = 'On this device';\n\t\t\tif (language === 'da') subtitle = 'På denne enhed';\n\t\t\tif (language === 'sv') subtitle = 'På denna enheten';\n\t\t\tif (language === 'nb') subtitle = 'På denne enheten';\n\t\t}\n\t\tif (suffix === 'another-device') {\n\t\t\tif (language === 'en') subtitle = 'With your SSN';\n\t\t\tif (language === 'da') subtitle = 'Med dit personnummer';\n\t\t\tif (language === 'sv') subtitle = 'Med ditt personnummer';\n\t\t\tif (language === 'nb') subtitle = 'Med personnummeret ditt';\n\t\t}\n\t\tif (suffix === 'another-device:qr') {\n\t\t\tif (language === 'en') subtitle = 'With QR Code';\n\t\t\tif (language === 'da') subtitle = 'Med QR-kode';\n\t\t\tif (language === 'sv') subtitle = 'Med QR-kod';\n\t\t\tif (language === 'nb') subtitle = 'Med QR-kode';\n\t\t}\n\n return {title: 'BankID', subtitle};\n }\n if (provider === 'de:sofort') {\n return {title: autoTitleCase(value).replace('DE ', '')};\n }\n if (provider === 'no:bankid') {\n let subtitle : string | undefined = undefined;\n if (value.endsWith(':substantial')) {\n if (language === 'en') subtitle = 'Biometrics';\n\t\t\tif (language === 'da') subtitle = 'Biometri ';\n\t\t\tif (language === 'sv') subtitle = 'Biometri';\n\t\t\tif (language === 'nb') subtitle = 'Biometri';\n }\n return {title: subtitle ? 'BankID' : autoTitleCase(value).replace('NO ', ''), subtitle};\n }\n if (provider === 'no:vipps') {\n return {title: autoTitleCase(value).replace('NO ', '')};\n }\n\n return {title: autoTitleCase(value)};\n}\n\nexport function filterAcrValues(input: string[]) {\n let original = input.slice();\n let dkmitidMethod : string | null = lowestMitIDValue(input);\n\n if (dkmitidMethod) {\n return input.filter(s => !s.startsWith(DKMITID_PREFIX)).concat([dkmitidMethod]).sort((a, b) => original.indexOf(a) - original.indexOf(b));\n }\n return input;\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@criipto/auth-js/dist/index.css\");","import React, {useMemo, useState, useCallback, useEffect} from 'react';\nimport CriiptoAuth, {AuthorizeUrlParamsOptional, clearPKCEState, generatePKCE, OAuth2Error, OpenIDConfiguration, PKCE, PKCEPublicPart, Prompt, savePKCEState, parseAuthorizeResponseFromLocation} from '@criipto/auth-js';\n\nimport CriiptoVerifyContext, {CriiptoVerifyContextInterface, Action, Result} from './context';\nimport { AuthorizeResponse, PopupAuthorizeParams, RedirectAuthorizeParams, ResponseType } from '@criipto/auth-js/dist/types';\n\nimport '@criipto/auth-js/dist/index.css';\nimport { filterAcrValues } from './utils';\n \nexport interface CriiptoVerifyProviderOptions {\n domain: string\n clientID: string\n redirectUri?: string\n children: React.ReactNode\n pkce?: PKCEPublicPart\n state?: string\n prompt?: Prompt\n uiLocales?: string\n /**\n * Will ammend the login_hint parameter with `action:{action}` which will adjust texsts in certain flows.\n * Default: 'login'\n */\n action?: Action\n /**\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do PKCE on your behalf and return a jwt token.\n * However if you wish you can disable this and get the raw `code` response by setting `response` to 'code'.\n */\n response?: 'token' | 'code'\n /*\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do as much as work on your behalf\n * by interpreting URL parameters and responses with `useCriiptoVerify()` via the default value 'client'.\n * If you wish to only render a UI and redirect to the Criipto IDP for server side code exchange, you can choose 'openidprovider'.\n */\n completionStrategy?: 'client' | 'openidprovider'\n}\n\nconst ACTION_SUPPORTING_ACR_VALUES = [\n 'urn:grn:authn:dk:mitid:low',\n 'urn:grn:authn:dk:mitid:substantial',\n 'urn:grn:authn:dk:mitid:high',\n 'urn:grn:authn:se:bankid:same-device',\n 'urn:grn:authn:se:bankid:another-device',\n 'urn:grn:authn:se:bankid:another-device:qr',\n];\n\nfunction buildLoginHint(params: {options?: AuthorizeUrlParamsOptional, action?: Action}) {\n const {options, action} = params;\n const acrValues = options?.acrValues ? Array.isArray(options?.acrValues) ? options?.acrValues : [options?.acrValues] : [];\n let hints = options?.loginHint ? options?.loginHint.split(' ') : [];\n if (action) {\n if (acrValues.length === 1) {\n if (ACTION_SUPPORTING_ACR_VALUES.includes(acrValues[0])) {\n hints.push(`action:${action}`);\n }\n } else if (acrValues.length >= 2) {\n if (acrValues.some(v => ACTION_SUPPORTING_ACR_VALUES.includes(v))) {\n hints.push(`action:${action}`);\n }\n } else {\n hints.push(`action:${action}`);\n }\n }\n return hints.length ? hints.join(' ') : undefined;\n}\n\nconst store = sessionStorage;\n\nconst CriiptoVerifyProvider = (props: CriiptoVerifyProviderOptions) : JSX.Element => {\n const redirectUri = props.redirectUri || window.location.href;\n\n const [client] = useState(\n () => new CriiptoAuth({\n domain: props.domain,\n clientID: props.clientID,\n store,\n redirectUri: props.redirectUri\n })\n );\n\n const [configuration, setConfiguration] = useState<OpenIDConfiguration | null>(null);\n useEffect(() => {\n let isSubscribed = true;\n (async () => {\n const configuration = await client.fetchOpenIDConfiguration();\n if (isSubscribed) setConfiguration(configuration);\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [client]);\n\n const [result, setResult] = useState<Result | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [pkce, setPKCE] = useState<PKCE | PKCEPublicPart | undefined>(props.pkce);\n const responseType = props.response || 'token';\n const completionStrategy = props.completionStrategy || 'client';\n const action = props.action || 'login';\n const uiLocales = props.uiLocales;\n\n const refreshPKCE = () => {\n if (props.pkce) return;\n if (responseType !== 'token' || completionStrategy !== 'client') {\n clearPKCEState(store);\n setPKCE(undefined);\n return;\n }\n\n clearPKCEState(store);\n\n (async () => {\n const pkce = await generatePKCE();\n setPKCE(pkce);\n })();\n }\n\n const buildOptions = useCallback((options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) : AuthorizeUrlParamsOptional => {\n return {\n redirectUri,\n responseType: 'code' as ResponseType,\n ...options || {},\n state: props.state ?? options?.state,\n prompt: props.prompt ?? options?.prompt,\n uiLocales: uiLocales ?? options?.uiLocales,\n pkce: options?.pkce ?? pkce,\n loginHint: buildLoginHint({options, action})\n }\n }, [\n pkce,\n props.state,\n props.prompt,\n uiLocales,\n action,\n redirectUri\n ]);\n\n const buildAuthorizeUrl = useCallback(async (options?: AuthorizeUrlParamsOptional) => {\n return await client.buildAuthorizeUrl(client.buildAuthorizeParams(buildOptions(options)));\n }, [client, buildOptions]);\n\n const handleResponse = useCallback(async (response : AuthorizeResponse, params: {pkce?: PKCE, redirectUri?: string}) => {\n if (params.pkce && responseType === 'token') {\n let _redirectUri = params.redirectUri || redirectUri;\n if (!_redirectUri) throw new Error('redirectUri must be configured globally or per authentication component');\n\n await client.processResponse(response, {code_verifier: params.pkce.code_verifier, redirect_uri: _redirectUri}).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n } else {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else if (response?.error) setResult(new OAuth2Error(response.error, response.error_description));\n else setResult(null);\n }\n\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }, [refreshPKCE, responseType, setResult, client]);\n\n const context = useMemo<CriiptoVerifyContextInterface>(() => {\n return {\n loginWithRedirect: async (params?: AuthorizeUrlParamsOptional) => {\n await client.redirect.authorize(buildOptions(params));\n },\n loginWithPopup: (params?: PopupAuthorizeParams) => {\n return client.popup.authorize(buildOptions(params)).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n },\n fetchOpenIDConfiguration: () => client.fetchOpenIDConfiguration(),\n buildAuthorizeUrl,\n generatePKCE: async () => {\n if (responseType !== 'token' || completionStrategy !== 'client') return;\n return await generatePKCE();\n },\n buildOptions,\n handleResponse,\n responseType,\n completionStrategy,\n result,\n domain: client.domain,\n redirectUri,\n action,\n pkce,\n store,\n isLoading,\n acrValues: configuration ? filterAcrValues(configuration.acr_values_supported) : undefined,\n client,\n uiLocales\n }\n }, [\n client,\n redirectUri,\n responseType,\n completionStrategy,\n result,\n action,\n pkce,\n props.state,\n props.prompt,\n isLoading,\n handleResponse,\n configuration,\n uiLocales\n ]);\n\n useEffect(() => {\n if (!client.redirect.hasMatch()) {\n refreshPKCE(); // Fresh request, setup PKCE\n return;\n }\n\n let isSubscribed = true;\n setIsLoading(true);\n\n const params = parseAuthorizeResponseFromLocation(window.location);\n if (params.code && responseType === 'code') {\n setIsLoading(false);\n setResult({code: params.code});\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n return;\n }\n\n client.redirect.match().then(response => {\n if (!isSubscribed) return;\n setIsLoading(false);\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else setResult(null);\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }).catch((err: OAuth2Error) => {\n if (!isSubscribed) return;\n setIsLoading(false);\n setResult(err);\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n });\n\n return () => {\n isSubscribed = false;\n };\n }, [props.pkce, responseType]);\n\n return (\n <CriiptoVerifyContext.Provider value={context}>\n {props.children}\n </CriiptoVerifyContext.Provider>\n );\n}\n\nexport default CriiptoVerifyProvider","function testUA(pattern: RegExp) {\n return pattern.test(navigator.userAgent);\n};\nexport function isiOS() {\n return testUA(/iPad|iPhone|iPod/) && !(window as any).MSStream;\n};\n\nexport function isiOSSafari() {\n return isiOS() && !testUA(/ CriOS\\/[.0-9]*/);\n};\n\nexport function isAndroid() { return testUA(/Android/); };\n\nexport type MobileOS = 'ios' | 'android';\n\nexport function getMobileOS() : MobileOS | null {\n if (isiOS()) return 'ios';\n if (isAndroid()) return 'android';\n\n return null;\n}","import React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../../context';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement\n links: Links\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Desktop: Polling scenario\n */\nexport default function SEBankIDSameDeviceDesktop(props: Props) {\n const {links, onError, onComplete, onInitiate} = props;\n const [initiated, setInitiated] = useState(false);\n const {domain} = useContext(CriiptoVerifyContext);\n\n useEffect(() => {\n if (!initiated) return;\n let isSubscribed = true;\n let timeout : string | undefined;\n const poll = async () => {\n if (!isSubscribed) return;\n const response = await fetch(links.pollUrl);\n\n if (response.status === 202) {\n setTimeout(poll, 1000);\n return;\n } else if (response.status >= 400) {\n if (!isSubscribed) return;\n const error = await response.text();\n onError(error);\n return;\n } else {\n if (!isSubscribed) return;\n const {targetUrl} = await response.json();\n await onComplete(`https://${domain}${targetUrl}`);\n return;\n }\n };\n\n setTimeout(poll, 1000);\n return () => {\n isSubscribed = false;\n if (timeout) clearTimeout(timeout);\n };\n }, [initiated]);\n\n const handleInitiate = () => {\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import React, { useState } from 'react';\nimport usePageVisibility from '../../hooks/usePageVisibility';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Android: Background/Foreground scenario\n */\nexport default function SEBankIDSameDeviceAndroid(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog} = props;\n const [initiated, setInitiated] = useState(false);\n\n usePageVisibility(async () => {\n onLog('android', 'onForeground', initiated.toString());\n if (!initiated) return;\n \n onComplete(links.completeUrl);\n }, [links, initiated]);\n\n const handleInitiate = () => {\n onLog('android', 'handleInitiate');\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import React, { useRef, useState, useEffect } from 'react';\n\nexport default function usePageVisibility(onVisible? : () => void, deps : React.DependencyList = []) {\n const visibilityState = useRef(document.visibilityState);\n const [state, setState] = useState(visibilityState.current);\n\n useEffect(() => {\n document.addEventListener('visibilitychange', _handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', _handleVisibilityChange);\n };\n }, deps);\n\n const _handleVisibilityChange = () => {\n const nextState = document.visibilityState;\n if (\n visibilityState.current === 'hidden' &&\n nextState === 'visible'\n ) {\n if (onVisible) onVisible();\n }\n\n visibilityState.current = nextState;\n setState(visibilityState.current);\n };\n\n return state;\n}","import { PKCE } from \"@criipto/auth-js\"\n\nexport interface Links {\n cancelUrl: string\n completeUrl: string\n pollUrl: string\n launchLinks: {\n customFileHandlerUrl: string\n universalLink: string\n }\n};\n\nexport interface State {\n pkce: PKCE | undefined\n redirectUri: string\n links: Links\n}\n\nconst STATE_KEY = '@criipto/verify-react:sebankid:state';\n\nexport function hydrateState() : State | undefined {\n const rawState = sessionStorage.getItem(STATE_KEY);\n if (rawState) {\n return JSON.parse(rawState) as State;\n }\n\n return undefined;\n}\n\nexport const autoHydratedState = hydrateState();\n\nexport function clearState() {\n sessionStorage.removeItem(STATE_KEY);\n}\n\nexport function saveState(input: State) : void {\n sessionStorage.setItem(STATE_KEY, JSON.stringify(input));\n}","import { PKCE } from '@criipto/auth-js';\nimport React, { useEffect, useState } from 'react';\nimport {Links, saveState, autoHydratedState, clearState} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void,\n pkce: PKCE | undefined,\n redirectUri: string\n}\n\n/*\n * iOS: Page reload on switch back scenario\n */\nexport default function SEBankIDSameDeviceIOS(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog, pkce, redirectUri} = props;\n\n const handleInitiate = () => {\n onLog('iOS', 'handleInitiate');\n\n saveState({\n links,\n redirectUri,\n pkce\n });\n\n onInitiate();\n };\n\n useEffect(() => {\n if (!autoHydratedState) return;\n clearState();\n onComplete(autoHydratedState.links.completeUrl);\n }, []);\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import { PKCE, AuthorizeResponse } from '@criipto/auth-js';\nimport React, {useCallback, useContext, useEffect, useState} from 'react';\nimport CriiptoVerifyContext from '..//context';\nimport { getMobileOS } from '../device';\n\nimport Desktop from './SEBankIDSameDeviceButton/Desktop';\nimport Android from './SEBankIDSameDeviceButton/Android';\nimport IOS from './SEBankIDSameDeviceButton/iOS';\n\nimport {autoHydratedState, Links} from './SEBankIDSameDeviceButton/shared';\n\ninterface Props {\n className: string\n children: React.ReactNode\n logo: React.ReactNode\n href?: string\n redirectUri?: string\n}\n\nconst mobileOS = getMobileOS();\n\nfunction searchParamsToPOJO(input: URLSearchParams) {\n return Array.from(input.keys()).reduce((memo : {[key: string]: string}, key) => {\n memo[key] = input.get(key)!;\n return memo;\n }, {});\n}\n\nexport default function SEBankIDSameDeviceButton(props: Props) {\n const [href, setHref] = useState(props.href);\n const [links, setLinks] = useState<Links | null>(autoHydratedState?.links ?? null);\n const [pkce, setPKCE] = useState<PKCE | undefined>(autoHydratedState?.pkce ?? undefined);\n const [error, setError] = useState<string | null>(null);\n const [log, setLog] = useState<(string | string[])[]>([]);\n const [initiated, setInitiated] = useState(autoHydratedState ? true : false);\n const {buildAuthorizeUrl, completionStrategy, generatePKCE, handleResponse, redirectUri: defaultRedirectURi} = useContext(CriiptoVerifyContext);\n const redirectUri = props.redirectUri || defaultRedirectURi;\n\n const reset = () => {\n setPKCE(undefined);\n setLinks(null);\n setHref(props.href);\n };\n\n const handleLog = (...statements: string[]) => {\n console.log(statements);\n setLog(logs => logs.concat([statements]));\n }\n\n const handleComplete = useCallback(async (completeUrl: string) => {\n const required = {pkce};\n reset();\n\n const completeResponse = await fetch(completeUrl);\n if (completeResponse.status >= 400) {\n setError(await completeResponse.text());\n return;\n }\n \n const {location} : {location: string} = await completeResponse.json();\n if (completionStrategy === 'openidprovider') {\n window.location.href = location;\n return;\n }\n const url = new URL(location);\n const params = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n\n await handleResponse(params, {\n pkce: required.pkce,\n redirectUri\n });\n }, [completionStrategy, pkce]);\n\n const refresh = useCallback(async () => {\n handleLog('SEBankID: Refresh authorize url');\n const pkce = await generatePKCE();\n\n buildAuthorizeUrl({\n acrValues: 'urn:grn:authn:se:bankid:same-device',\n loginHint: 'appswitch:browser',\n responseMode: 'json',\n pkce,\n redirectUri\n }).then(url => {\n return fetch(url).then(response => response.json() as Promise<Links>);\n })\n .then(links => {\n setPKCE(pkce || undefined);\n setLinks(links);\n const redirect = mobileOS === 'ios' ? encodeURIComponent(window.location.href) : 'null';\n const newHref = `${mobileOS ? links.launchLinks.universalLink : links.launchLinks.customFileHandlerUrl}&redirect=${redirect}`;\n\n handleLog(window.location.href);\n handleLog(newHref);\n setHref(newHref);\n })\n .catch(console.error);\n }, [buildAuthorizeUrl, redirectUri]);\n\n // Generate URL on first button render\n useEffect(() => {\n if (initiated) return;\n refresh();\n }, [refresh, initiated]);\n\n // Continously fetch new autostart token if UI is open for a long time\n useEffect(() => {\n if (initiated) return;\n\n const interval = setInterval(() => {\n if (initiated) return;\n refresh();\n }, 25000);\n return () => clearInterval(interval);\n }, [refresh, initiated]);\n\n // Track when the button is clicked to stop refreshing URL\n const handleInitiate = () => {\n handleLog('Initiated');\n setInitiated(true);\n setError(null);\n }\n\n const handleError = (error: string) => {\n setInitiated(false);\n setError(error);\n }\n\n const element = (\n <a className={`${props.className} ${initiated ? 'criipto-eid-btn--disabled' : ''}`} href={href} onClick={handleInitiate}>\n <div className=\"criipto-eid-logo\">\n {initiated ? <div className=\"criipto-eid-loader\"></div> : props.logo}\n </div>\n {props.children}\n </a>\n );\n\n return (\n <React.Fragment>\n {links ? (\n <React.Fragment>\n {mobileOS === null ? (\n <Desktop\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </Desktop>\n ) : mobileOS === 'android' ? (\n <Android\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </Android>\n ) : mobileOS === 'ios' ? (\n <IOS\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n redirectUri={redirectUri!}\n pkce={pkce}\n >\n {element}\n </IOS>\n ) : element}\n </React.Fragment>\n ) : element}\n {error && <p>{error}</p>}\n {/* {log && (\n <pre>\n {JSON.stringify(log, null, 2)}\n </pre>\n )} */}\n </React.Fragment>\n )\n}","import React, {useContext, useEffect, useState} from 'react';\n\nimport beeid from './AuthMethodButton/logos/beeid@2x.png';\nimport digid from './AuthMethodButton/logos/nldigid@2x.png';\nimport dkmitid from './AuthMethodButton/logos/dkmitid@2x.png';\nimport dknemid from './AuthMethodButton/logos/dknemid@2x.png';\nimport ftnmobile from './AuthMethodButton/logos/ftnmobile@2x.png';\nimport ftnbankid from './AuthMethodButton/logos/ftnbankid@2x.png';\nimport itsme from './AuthMethodButton/logos/itsme@2x.png';\nimport nobankid from './AuthMethodButton/logos/nobankid@2x.png';\nimport novipps from './AuthMethodButton/logos/novipps@2x.png';\nimport sebankid from './AuthMethodButton/logos/sebankid@2x.png';\nimport sofort from './AuthMethodButton/logos/sofort@2x.png';\n\nimport './AuthMethodButton/AuthMethodButton.css';\nimport { getMobileOS } from '../device';\nimport CriiptoVerifyContext from '..//context';\nimport SEBankIDSameDeviceButton from './SEBankIDSameDeviceButton';\nimport { savePKCEState } from '@criipto/auth-js';\n\nexport type PopupParams = {\n acrValue: string,\n onHide: () => void\n};\nexport type PopupOption = boolean | ((options: PopupParams) => boolean | React.ReactElement)\n\ninterface ButtonProps {\n className?: string,\n children: React.ReactNode,\n onClick?: React.MouseEventHandler,\n}\n\ninterface AnchorButtonProps extends ButtonProps {\n href: string\n}\n\nconst mobileOS = getMobileOS();\n\nexport function AnchorButton(props: AnchorButtonProps) {\n return (\n <a className={`criipto-verify-button ${props.className}`} href={props.href} onClick={props.onClick}>{props.children}</a>\n );\n}\n\nexport function Button(props: ButtonProps) {\n return (\n <button className={`criipto-verify-button ${props.className}`} type=\"button\" onClick={props.onClick}>{props.children}</button>\n );\n}\n\nexport interface AuthMethodButtonProps {\n acrValue: string,\n href?: string;\n onClick?: React.MouseEventHandler,\n children?: React.ReactNode,\n 'data-testid'?: string,\n className?: string,\n redirectUri?: string,\n popup?: PopupOption\n}\n\nexport default function AuthMethodButton(props: AuthMethodButtonProps) {\n const {acrValue} = props;\n const context = useContext(CriiptoVerifyContext);\n const className = `criipto-eid-btn ${acrValueToClassName(acrValue)}${props.className ? ` ${props.className}` : ''}`;\n const [backdrop, setBackdrop] = useState<React.ReactElement | null>(null);\n\n const [href, setHref] = useState(props.href);\n const redirectUri = props.redirectUri || context.redirectUri;\n\n useEffect(() => {\n if (props.href) return;\n\n let isSubscribed = true;\n let loginHint : string | undefined = undefined;\n\n if (acrValue.startsWith('urn:grn:authn:dk:mitid') && mobileOS) {\n loginHint = `appswitch:${mobileOS} target:web`;\n }\n\n context.buildAuthorizeUrl({\n redirectUri,\n acrValues: acrValue,\n loginHint\n }).then(href => {\n if (isSubscribed) setHref(href);\n })\n .catch(console.error);\n\n return () => {\n isSubscribed = false;\n };\n }, [props.href, acrValue, context.pkce, redirectUri]);\n\n const handleClick : React.MouseEventHandler = (event) => {\n if (context.pkce && \"code_verifier\" in context.pkce) {\n // just-in-time saving of PKCE, in case of man-in-the-browser\n savePKCEState(context.store, {\n response_type: 'id_token',\n pkce_code_verifier: context.pkce.code_verifier,\n redirect_uri: redirectUri!\n });\n }\n\n if (props.popup) {\n let willPopup =\n typeof props.popup === \"function\" ?\n props.popup({\n acrValue,\n onHide: () => setBackdrop(null)\n }) :\n props.popup === true;\n\n if (willPopup !== false) {\n event.preventDefault();\n\n if (typeof willPopup === \"boolean\") {\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: true\n }); \n } else {\n setBackdrop(willPopup);\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: false\n }); \n }\n }\n }\n\n if (props.onClick) props.onClick(event);\n }\n\n if (acrValue === 'urn:grn:authn:se:bankid:same-device') {\n return (\n <SEBankIDSameDeviceButton\n redirectUri={props.redirectUri}\n href={href}\n className={className}\n logo={<img src={acrValueToLogo(acrValue)} alt=\"\" />}\n >\n {props.children}\n </SEBankIDSameDeviceButton>\n );\n }\n\n const inner = (\n <React.Fragment>\n {acrValueToLogo(acrValue) ? (\n <div className=\"criipto-eid-logo\">\n <img src={acrValueToLogo(acrValue)} alt=\"\" />\n </div>\n ) : null}\n {props.children}\n </React.Fragment>\n );\n\n if (href) {\n return (\n <React.Fragment>\n <AnchorButton {...props} href={href} className={className} onClick={handleClick}>\n {inner}\n </AnchorButton>\n {backdrop}\n </React.Fragment>\n );\n }\n\n return (\n <React.Fragment>\n <Button {...props} className={className} onClick={handleClick}>\n {inner}\n </Button>\n {backdrop}\n </React.Fragment>\n );\n}\n\nfunction acrValueToClassName(value: string) {\n value = value.replace('urn:grn:authn:', '');\n const segments = value.split(':');\n const classNames = segments.reduce((memo: string[], segment: string) => {\n if (memo.length) {\n return memo.concat([`${memo[memo.length-1]}-${segment}`])\n } else {\n return memo.concat([segment]);\n }\n }, []);\n\n return classNames.map(className => `criipto-eid-btn--${className}`).join(' ');\n}\n\nfunction acrValueToLogo(value : string) {\n if (value.startsWith('urn:grn:authn:be:eid')) {\n return beeid;\n }\n if (value.startsWith('urn:grn:authn:nl:digid')) {\n return digid;\n }\n if (value.startsWith('urn:grn:authn:dk:mitid')) {\n return dkmitid;\n }\n if (value.startsWith('urn:grn:authn:dk:nemid')) {\n return dknemid;\n }\n if (value.startsWith('urn:grn:authn:fi:bank-id')) {\n return ftnbankid;\n }\n if (value.startsWith('urn:grn:authn:fi')) {\n return ftnmobile;\n }\n if (value.startsWith('urn:grn:authn:itsme')) {\n return itsme;\n }\n if (value.startsWith('urn:grn:authn:se:bankid')) {\n return sebankid;\n }\n if (value.startsWith('urn:grn:authn:de:sofort')) {\n return sofort;\n }\n if (value.startsWith('urn:grn:authn:no:bankid')) {\n return nobankid;\n }\n if (value.startsWith('urn:grn:authn:no:vipps')) {\n return novipps;\n }\n}","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAAA8CAYAAAAe5VayAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUdSURBVHgB7Zzveds2EMZPffy9ygRBJrC9ATVB3AmsTOB4AjETSJ3A6gRNJjA9QdUJzEwQZQL0XvEgQZAIgCzo2CR/z4OQog6U9AZ/7g6EiXqE1nqhw/zg8g+Xv7nccclo5ECkiOd45vLARVELfqMRoLjMubQScxTxlDlVYuaxFUYR61lIN1chw1FEP4oLJqErn9EoYpgpVULe1hlMqEdI13sfMIMosMukTCmOLZfZZDLZ0MgBFn3KZS5jX6wrpNz7RLdEqZzR26fksuEWtbUvwsfkQx5Rv+C6M4oFwnFZipffN07GOV393ueIurcx4qGZr/QweNaWKDpOSDSqaaj1hW7SR3JHg1DvWxj7iSsgHx6pmr2GyJrHu0840VVi4tFju2Xbdzhx/cQhCwgwU3/GCQtU8OGrx3YqQh9ElOasaGShD27MfcD2I/7ZdWep9Ewjhq/cEv/ACWuD3pnV2JVs98G0xIxGbG70Yfb1dWlMQFMjYtjvGR5Gk28BO3UhJxk1Y0XH/0MFdQuiixs6/nxcyz110JIyqaeoObvMDXfXklvblupj7MsL3S4ljrDpybzge1DHbJ3Pw48q7Ws1oBXds/2cj/DrFMVj2/pE3M3OinoOi73mA+LdktpRet5TvcknOtEEoo0Hu5ehW/LhE3VAX5Oy6HpzqpKpylwUB7qgxPQ9sw0xH5xrXygxQ1geuNLHGZfkmelUIiLevKZqklJyjmtljT3co4zLO+5iiJo+UDVelZQeCLhfaJJk7JYSckEJ4C/2p3PpO5cNtwC4GEs6+Hg7f891TWTQX7M9xEWY5V1da4G77uJ1WZrSaXe2ZkTThWY+305ayf9xRepQ1CFJRERKSFfLCHArbp0ZEcIgmF/ZK2W6ypz/kJI79p24Il2RpDvTcfJyzgWh0kxaogmd9rOiiHZn1VkgCmG7ldgXgVDrVdFVd1bkuBbO6trHM3XcJEhBb4RULfEc6OJTd2lSWJ255tqVlI6ks7FLlyKCSy4nEwkL+1e4atIf7vqGihLStYg/z13kFgqX59JfNVmiuHQyQKndp05FLD3PrUDAnF6GtfM6uYhd+okrz3twzjsdpwTkPd1YOXkWP1ZECII1VoRnMbFnbkcxcGm09ZSBTDYIDQunHl7PqV18W1oFkc9n/pxr20CSsxklBt052CL4y5ilw634e787JhjjruRebtY7pyqrjLpPtu/Ih5kkB3C/n2Yml2sragBW3XzvSwCwoA6IEhGDsTW+4QcerQfwe4iRvzl1YJfTwanG60fbCZe65xIC3ykhsiC/oPbOu6/eNkpEBns+TJeGKFtZ/Ydw+wlEhEOLzMTO/XBF1UPlaz5+scW06i7oTJfTx/tNYDvV9XtQ8P57OuwKaCPexvnedZRm8d63QN0lu+5PhxTaa2IOfzbiwYbMTCwF/RrMsqai14cZ17OA3b9GxJdyOd4Ka2uo8blEuydudyLK4N5oNuw5O99Shx+x3o2btp+I1ljSSG61wpBLtD65oof7lKxhaWkxD9jWTzZ6uEIuG2rgDx919eD7Ug8DLE/cNBQw/llOueGD7mfLfNTVpvFpQwHBUStsshkI0QSigLah02sBnsjTmc1AsaHh/uH4EdoPW3f6pbalvQXkB6qAmYmrTeZp3CBpo9v/DYgYbuo+t+s1lj5w9tEXm1FEPyVVXbj0GY077+tBLuE6JCAYW+IpBZf7JhPIKGIFxr01VTupQjsSThiiiGZNp6AqlbVpI5zNf5XRuR7tdpDGAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAAAuCAYAAADwZJ3MAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUlSURBVHgB7Zzvdds4DMCRe/f9fBOEneDSCSJPUHeCcyZIOoGVCZxOYN0E6U1gZYKkE1idIOkEOMCkn3WqJEAiacmxf++hckMwpAn+AUEqAGeOmgsYCYho6PGJZELy/eLi4huMCKpfQo+/wNbvieqXwxkLNU6Kv7JxRh26bhOSx5r6rTgNBmY7Al1FulbmjXrhG3jCxqPHoiG5oDI+wICwoegxb0j+RvX7XNE/fFu63tSHV5I1yZLkCnrgRlobCQwEzwAoc1nJs8D+rNG2ZaKt42/gB/e0hOSO5NkZ429tZrRTpBHUrmE4jEIngXAkYNtyrW1LXwNWMSQZ6tcv7yk4Mpr6FRAHA/u2bJzdQhuwXDiPyLs2JTfv59DOPzAcBbQbkdO/Q1wM2LZM6xJjGZDh6XXZVHCJL9DcSA9k5AIGwnWwLy0qDyEcOSWLxrbE/k6Mlta5HK2zsC7ps3N0CyOB6jIjeS7Vjz/PGnQXGJe0rtCVkIkbdOPkFbvDeUQvFe2e6xJGiqvfRNBZKNpiU5I+JNVCV0KGVU1Fr12+DepYwwmAsgHXNXmuSG47tCXrbTtS7zWQ5n4OJ93QxylJpsiSYIctxilB7fhC8tUFLVJFFkOyXWJ+B0+ck3FDxikUhXN6FK8S97FUfu6mOXYwXkj+PaCz4QXV856+yw/6uBJU70jv6/YT9phC68D/OyJNJJU8K0H/UigzUZS7QbelQXmKu+7ynWrqs8B2nkHXlkuUuQ29jbhR6HyCQNAXeKAHrymJoGrAbmmWMDzaOOk9yIGEWVADuuk0F9QS8AStN8g9uetWg0fhHI4AN+VngtpVjI28dI7XK+hdIfX4PQaOhychfRLDgD8kBfTY61HeOXQfecfKi6Tg7YXWENvbWyj1uB6F+xxi1I+SmLHQ4LjRZwS1giShNeRPko8s9H/eX2XwDolhQI2X9RP6IXmwBcmUgwzlH7Jz5YIOKRwXRlKIYUDpANbn+kAipKdtpxe8SQbZSx4TRlKIYcCZkC4uzHWgjbS0jW7uGJooz6huuwlIoceXoAZUrlEZ9EOamrUdQ/SSx4DrsImgFs6ArkCNhyjtbfpi4J2A9qRBc3qTBTGgMx4XaATVzOOEXVo3DeruaQYL5cWgZDwjqLJj9uRlQBfSSunjM+hGwD30xBleMmLrDOA62hxGCtpTfm5Lzb415X+0G3k2VAJ2HWL5wxUyA31wNg1wv4XXuaQlnY9YflI5aTUB7Y2ARxgBuD+RMdCvLbOdw6Y14Axk77KNwrnwvrAHmQg6C7QHxxnsHRaeNn3qHxIDuvWtiQJKM1mMUFpdgVMIA/e6FOSeauD4Nu0aeAmZlmey2KG0olqgD4prfu+ZAmraMqYBc5KPoe910u/L6PEApwWv/Wy8X/a6MQzIo2ROhU1j3UOh38ujsI8RCziuoDa3X+qC8kWdQkgD5mBPvD8oQ1peOCNygLpQZsnBrsWSvpR+CHikpWDbstX52zkx7K3loOetJL63vqSyG08u3HSauRAee57sjk8q9dw2xu6EAru/NNo1dtu1LZkC9nXNqa5HEe6LggsuXDad+ne9ZXZmZGD7qwGqK39j4hD7wGC4a4FSmOlz03SO9m5o2x6y63R5pgvKy66PdescG0+Rd9SB7jpG82dGNKCNIWrDUDlY52D3GrgUvRn8DyqcBMpR2IfzizeHAN2tbAzLSbz6NhqcEVcYBu4M2mOcMyGhhp9j/7dcmeXZeCPAGZK9T83r36/OcAbeAf8BIoccO1vtVLIAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAjCAYAAABctgKLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAS9SURBVHgB7Zv/VdswEMe/6ev/zQZ1J2g6Qc0EtBNgJgAmIEwQOkFgAmACzATABBET4E6g3iGlNUE/LMnBwuXznp5D9BPrfHc6XybIGCllSZev+s+ryWQikCG0zildSiqfqfBnQeWe1nuHd+Kgm3oqXzJHRvDGU1lSeZRmbrUQx47v4lGPf01lQeUgZq4JD2Cp4yfuFD1AcxzSZddQ1dAcPw3tK7oszaPhJ/W5xMDQGmd0uaBSdGh+QmueIxDeZYTTUOH7c05z1t7WHgkrkAiP4ZhjZelz6+hzgYHR/9OjDGOOQGQ6Kyp7rjlYA7ikrCYp2kECNPwtXWaWakHjfzH0YcEoELgm6vcDygab5qnRE571udgJWYdnb0I4g9JCwjiJhz1EQn0PPWPbNMC1o8/SMZ+t3zV6goVMxhO0DtkvK2nQ6B86rIOdsSkC0ZMdII4Ty/eNo+612EU8s5h72RMFletNIegiALzgJcI5RpyahFaT7ByK1tf83U4GR8EZ4uF7WWA4Cigh+CuEXQSAYbVXdmy79uIrJMCevvYPCi5s9zM5V6c+wZ8wLAXUw/lEVwFgll3Ul1Yxx+gJ2vQHLninTw7XpuBjQKcCamOPPO2iVf8aLWhGYWubAFe7DaYmByjSnNRI0273yAP2z45iPM3SNiLXyTBWEeN8T5jPO7ePxDmHPAVswnGMaYgJWLOUdlMQ4yy+KbSDKhDHIfKB93DXJQCN5fsChuOdVJGuAv8HfEJpAvvMSXhyUf9rZi4B4PcANq97LlUs/AnpdvzOoOzmaNCnkX10F4JT6jN0/MJE6TMB+466ReuzzbYJDB+42Qr6hdQ3KAG3IahU1NbnOA/F1HkKYEmnp5sXvzBUszPENs0V3GC1J2RvIe0X66vlc++eN8UUqKmRGJewzC/osk9rYCEvoXIX+H6whrij+hvkTeE9BvIrYfoHOfxZGqpZ7dscwjPqe44t044R0DqbLu22sAYBtybIlq6nAJu9s22+wEhV/9joFAjSapw3dIFuzHNN39oG2gxtBqWaN5AS1nSOBHpMQZtXUf1DIv/lAPL9sOUgQPs+NZRvkmNO411oIMh39BEYuerXji9HETkzqYI/FF1CHalXUuUPFsiHJkgAtAS7Nni0ql+qNDA+7rIZjH0jWFG51UKUA5fBoWCdKFobqkar+vVTy5tfIh0WnoXMI8P5JuZdALNpCgRGqvpbm1+gX44H1gScWymiBMBgCsbs9Se/3naNPaBP8JTyH6sB2qZgzKq/xBYiiC1i0+1S4WyrK/4QkhBiYh95YTuhzBBHb5lNDjikXvaZtu5BoJXUE60BGFb7mal+mwBM20cw7dEfuNSvrivxOqRkGody1N6zJAHIEFfkrYI6i3N0hs/xbMI+O9rHprTHUGH78MNRbf6sbmwC0GfCRYnXYyoTfkTaAQGVUv/CVxuVAGg7WqMfYv2GWL6if/ipn1P5ZnsvkeoE5gg7pknn9i0/jTb6FDjeeDZxv2jjnVlLoxMA/eaSfzzKHnyFOGJDvSkUiEdA+T81AhNR+NfB3y11D315+Dp/0PSLmN8m1aTfttlU4r1PqlvjFHieqbPGmbGj+7kcxG3w4l449uapPZXH1ESXPzSxXZJw46hxAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAeCAYAAADHCUctAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAU5SURBVHgB7Vvtdds6DEVy+v9lg+pNkHSCsBPUnaDOBHEmsDJB+iawO0GyQZQJ7DdB1AnaTsDimkBFq7KoD8qOE91zcGhZImHRIHgJkCfEsNYaLi5Z8pOTk28UCdxuwsWdtHsTeNZw8YX64Zb15LRbx5SLT3L5EPldDRfXLGcsy5htV+i64OKR3DtcBZ7F75mxnMtvCyEX+Z9lXdefZUWp3cazKO8NdK42GnhuauPguqWOGcV5z7SibUMDwXuX5wbPLmw/rFi+WOcUduIduVEEZCywdFSAF7mi/eG993nC8pM6gEfPU83tcylzlrXoueMOyrjemjrCOu8wl8uvLIZcP8K7ZnR4XEiJd0ypvm8TkQuvhCxxk98VHj+trOlZ3iXLxEYcrba5RzKe3pQGgDcyF3K90lFtO3pgjFKpvxm5VXqGgG3nkfT3zakl5P2mXhvaX0n52VP/gq3tgdyoAuY24M5igfVm5EaL6k1peHwm550SlnvqhoXUz6W9VwXwIxbwvX+p+H8SlpV44j84rah/S65jMErvbSS+FAL/WOhN5XJwYxISqdO3aatPnjdy+bkxKT1SyP8Dg8rJ2caj72hOKypgDsXoQunP/4PjAMaUcXHj6TNN6lm3+tN+mfXhWMcEGSwfydnGxtH8uenNfZd+JXAk756hDmjKkSrqzW1kzlTHXfi7pdz7EZrOS7zoro2eWNgXR6pp0+fSc/2y0pDk3n3TDt6hsJMhSd15TGMKGNKZ1+GY/892tOE/99xWTywc2pCk3Ue1DVyfBp4Hh8jJubHBOqYKMs0ph5lXjf6IuuCq1WXXTecpFeT6I71t3EqJwWVqDUk62CekUQJ4TYEVg6d/NuQol/n/xtO19a5yrTG36Wsn1yEIv9SY1KeQR9IKGhJAAM/QHlEypunAxrSk7fDHZolri1QPkAYCn28JmZQmaEiA5Mm00sIOHBIQLpLKPDzZszHpu2r4Q/NawFKm3BEOuZRnjQxJgD8SriyhYnRGh0whIJHgKYZcMlm9BXhJTh1TKC2g3DBhWVHBi25ohI9cyqSxIZUCeNPYfEm8EEY+jBTeALEZ4+8awDSLKGtoJ0FfyLv6keoNGRfOOKLAL/3QxiMNnUKBERn5DB7y4ZBcRIKMMNic5eqtk+sd+EfKn60MSbCVQqEIkDiR5m5mL4WH8O/4Kh7wgUZUIZEyb21I5RRKpPiObmgDmf2PRhwLdPDnXTySun31GrM+IQGsyqiw7HFFdCSQlbuRy4dOhgTA7VMRErjvwZd0w9l65CFHhYn3+amzIQl0T8/eUygjDg5NI4GO5L0MKVIKRZfUe9n3NKI/ZHGUyOWGjvT1SFUplIt2LWxOKwDJvtMvI9pD/iP1RqnSkd6GBJRSKG13VYK4q1e6po7QgGbdNpAR/WDdhj4N+Wyli6IYkqBTCkWmR/1BE9th75EYjgY0ExoRFTJIMeuAB+u5va1TRtEMqbQNo1UKpbQC3Ow9aroKFFeLfJgf0BxTGREgGxNTcrlPnS1mVYcy31FEILHKirGchxFtTtjKrSZ7mrEChNs0Uh/eKeMSJ1bXvnGIkeHE7ISKWAbuz4Y84XrkQH9+DzyDlEciYmh7AZRRXarIFrikCBA3uLLbaMx97N/nqHzs+n5hw3utF/osDQj78rbazm13PEv985AeeCRMK0msBKl4jg/WGWZC7tx/47Zluwg825Sc19FTn+SVOTkvl7F8aziVwVNhhA2dgkH7iegbCmsq3r8WIMTWeaImZ/9zcp4d5dOrpAjcGe8hNOJF4jf9Ajp09a6TmAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABBCAYAAABo3gIBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXjSURBVHgB7VzhVSM5DFby+H/ZCs4dwFXAUAFcBaQD2ArCVgBbQdgKYCvIUEFCBZmrIKECncV4XhSN7Blie+Dty/eemcRWbFmWZVkeM4KBgIiFfSwgHbYuVez5Qs/RaLSCAzGCgWAFcmUfTzAMSEClTc82vVgBVfDVYAUyw8/D3CbTh88xDIcz+DxMbVr3EcyQU2YJulAqqNWbMLHJQF7h0XS6tdPoF+QASdymAmujGaKToBE799Ceu/KcuIPEgigUpun7mUJ7ptCZHvXnxh0kEoYJNDJX6K8EzSyyjZS45e0ealRNoOy3kncqvm+hGwUMg3vsmO69QJIVkt5g7WtotE+CdmnTJFA3accah0MahxF3vsUaAzaBGlSYUIWCum0aAgUkEEgzz6876DYeJu499X0G3rUk1jEz7ln5CLDWHN/0kHuOoGAzgzRzEiuQZrUoAjRGyfM5R/S9gs/D5UGeKtZzn5bXxohSBy+0XSbWfsklo6P029JuA3WTw6ZplXFPqrMAv+YdisegQFxnpKNFzF55mKHdZWnTG8/zdT4Wlr8p1FpqIA1WXQ3eYzyyb+psG4+YBusuDSHLW8Dh2Frt+AaZgfU0o82jgUh0GdXYOVrBAHBT8gESwCsQJ/VYda9gOCTZzoc0xEA8Do5tfhROS2KN9/aPEYhDVoGcQjz+g2ERbfNCAoleLmOOAz4KZ/NiBZJ1ygw9XVL4O2VODcninQZwCfFYqQJJ5F0OrSFXEAk7xV98GpJi01TBQMA6LmogDiX98QkkxQoziIZgHW/pDFr3wCP98QnEQDxeITOcMGi/lUKj6aDcK5Bog5pry98A661/kg0dUBwkdCCO/hhoX6R87YHzNbHpBvWgdQxM08aJ1ih8kV0u7uyDYSk19rTjRCH4Sksu8TKFvPjBv2g2xEA8KkiDFKtdCHfSdowzMZFqU5cz/LiywvghM8c5mEi4qTOQB5VN/2oFmkBiDWpKhyyHhjRHJpVWmENDkvgfmCdaHxQGYZyBiVQakvoQqgLPYRqH1BADaRpOgZQrDAnhoo9tG2dgIpWGFJAGD1YQ//R9V1U6ZimmTKpNXeyUKW36/tEVb5yYiZSbukMHp7SpsHxcjA5Y/lNrSAUJ4Iz7RwangjqeUVLUCyJwwpj4Mps6CPPRvOi/coneLkh23LF32G2F8jfE4S3FlHGD81eu+o844ogjjhgI76sM9jvbKLPdMWFwPsgNy/rZ5WBhHYHnV03oLcdnrF819x1x0mq1UvuE7dsKPiwhM7COqnN0OovYjsJfuvynHn1a8zYa111u6h6h3vkWsO9snaF+H8a41Nuxw/pIwShFMq+Cbkietp66wNPeYo93RZI3rGwmyiYunzp0h+0znDUXGrYvD5EGzAX9NaNf8DKW/yDqeXI8TLCNhkfJ2zXWt7Wm2L5gMOMCWYrCc9bptfyRyw8dZm1Y3X2m48bDy8K19Sjo7xl9odWFiqC4WmAtFI4lL5SdWzjGeP5MYYLK6eXeGQqJBzRsg/r1D22059gerJnomLQ5C4+gluJ3RpSvfSodwq37zSWyaeXy+IUiPuJ8Oq7R2Q3R0Y2nExKt2xLYftv6PiQoZVD3ysmoSkNIS9E77Ofvoux9dGwRXSP75Solhki6/O4LXyYN+1x5IlcNfZdRflPypEGtlHZ5Gw2utXISyKmnQur4gyhrjNXUPkgIJFX6/Ay7u7eErYfhlSe/oZe8yAGZY3slaw2oUj+haj5g7Z9MRflP+kMCMZ4KmzdzOEqn8nPHCMUivtkkGX9fUrG9RFeuXplfQrsTKzcgJa/Xtd3wp71t/cpoOa7c9KWBlP+DYHekiW2nZok7o8qxaTrJ8p5c3g22DTPRyRWmWb0KT/7eCuPypPFDN8Ka/eO2qy/2PXTs9y7IAvd9i6VSzo3b0tHNBF0z5VRvVOTxpVXWQzyTFkqBLzyC0rBA5Wb5wXf/XScoqlU1ITzXYbIDr6HIFoqIGPs9j9jtRcewHc1762jDG/0LhRz/B+qZMIePyz8jAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import {OpenIDConfiguration} from '@criipto/auth-js';\nimport React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../context';\nimport { acrValueToTitle, filterAcrValues, Language, stringifyAction, acrValueToProviderPrefix } from '../utils';\nimport AuthMethodButton, {AuthMethodButtonProps} from './AuthMethodButton';\n\nimport './AuthMethodSelector/AuthMethodSelector.css';\n\ninterface Props {\n acrValues?: string[],\n language?: Language,\n onSelect?: (acrValue: string) => void,\n redirectUri?: string,\n popup?: AuthMethodButtonProps[\"popup\"]\n}\n\nfunction lowercaseFirst(input?: string) {\n if (!input) return input;\n return input.substring(0, 1).toLowerCase() + input.substr(1, input.length);\n}\n\nfunction isSingle(acrValue: string, acrValues: string[]) {\n const provider = acrValueToProviderPrefix(acrValue);\n const count = acrValues.reduce((memo, acrValue) => memo + (acrValueToProviderPrefix(acrValue) === provider ? 1 : 0), 0);\n return count === 1;\n}\n\nexport default function AuthMethodSelector(props: Props) {\n const {fetchOpenIDConfiguration, action, uiLocales} = useContext(CriiptoVerifyContext);\n const language = props.language || uiLocales as Language || 'en';\n const [configuration, setConfiguration] = useState<OpenIDConfiguration | null>(null);\n\n useEffect(() => {\n if (props.acrValues) return;\n\n let isSubscribed = true;\n (async () => {\n const configuration = await fetchOpenIDConfiguration();\n if (isSubscribed) setConfiguration(configuration);\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [props.acrValues]);\n\n const acrValues = filterAcrValues(props.acrValues ?? configuration?.acr_values_supported ?? []);\n\n return (\n <div className=\"criipto-eid-selector\">\n {acrValues.map(acrValue => (\n <AuthMethodButton\n acrValue={acrValue}\n key={acrValue}\n onClick={props.onSelect ? (() => props.onSelect!(acrValue)) : undefined}\n redirectUri={props.redirectUri}\n popup={props.popup}\n >\n {stringifyAction(language, action) ? `${stringifyAction(language, action)} ` : ''}{acrValueToTitle(language, acrValue).title} \n {isSingle(acrValue, acrValues) ? null : lowercaseFirst(acrValueToTitle(language, acrValue).subtitle)}\n </AuthMethodButton>\n ))}\n </div>\n )\n}","import { OAuth2Error, UserCancelledError } from '@criipto/auth-js';\nimport React, { useContext, useRef, useLayoutEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../context';\n\n// Inlined types less readable (for library developers) but improves intellisense for consumers\nconst QRCode : React.FC<{\n children?: (props: {\n qrElement: React.ReactElement\n isAcknowledged: boolean\n isCancelled: boolean\n error: OAuth2Error | Error | null\n retry: () => void\n }) => React.ReactElement\n}> = (props) => {\n const elementRef = useRef<HTMLDivElement>(null);\n const {client, buildOptions, handleResponse, pkce} = useContext(CriiptoVerifyContext);\n const [requestId, setRequestId] = useState(() => Math.random().toString());\n const [isAcknowledged, setAcknowledged] = useState(false);\n const [isCancelled, setCancelled] = useState(false);\n const [error, setError] = useState<OAuth2Error | Error | null>(null);\n\n useLayoutEffect(() => {\n if (!elementRef.current) return;\n const promise = client.qr.authorize(elementRef.current!, buildOptions());\n\n promise.onAcknowledged = () => {\n setAcknowledged(true);\n };\n\n promise.then(response => {\n if (promise.cancelled) return;\n handleResponse(response, {\n pkce: pkce && \"code_verifier\" in pkce ? pkce : undefined\n });\n }).catch(err => {\n if (err instanceof UserCancelledError) {\n setCancelled(true);\n return;\n }\n if (promise.cancelled) return;\n\n setError(error);\n handleResponse({\n error: err\n }, {});\n });\n\n return () => {\n promise.cancel();\n };\n }, [elementRef.current, client, buildOptions, handleResponse, requestId]);\n\n const handleRetry = () => {\n setAcknowledged(false);\n setCancelled(false);\n setError(null);\n setRequestId(Math.random().toString());\n };\n\n const qrElement = <div ref={elementRef} />;\n if (props.children) {\n return props.children({\n qrElement,\n isAcknowledged,\n isCancelled,\n error,\n retry: handleRetry\n });\n }\n\n return qrElement;\n}\nexport default QRCode;","import { useContext } from \"react\";\nimport CriiptoVerifyContext from \"./context\";\n\nexport default function useCriiptoVerify() {\n const {result, loginWithRedirect, loginWithPopup, acrValues, isLoading} = useContext(CriiptoVerifyContext);\n\n return {result, loginWithRedirect, loginWithPopup, acrValues, isLoading};\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","require","stub","Error","initialContext","loginWithRedirect","loginWithPopup","fetchOpenIDConfiguration","buildAuthorizeUrl","generatePKCE","buildOptions","handleResponse","responseType","completionStrategy","result","domain","action","pkce","undefined","store","sessionStorage","isLoading","client","createContext","autoTitleCase","input","split","map","segment","replace","length","toUpperCase","substr","join","stringifyAction","language","x","assertUnreachable","acrValueToProviderPrefix","startsWith","slice","acrValueToTitle","provider","title","subtitle","suffix","endsWith","filterAcrValues","original","dkmitidMethod","forEach","s","newLevel","oldLevel","includes","lowestMitIDValue","filter","concat","sort","b","indexOf","ACTION_SUPPORTING_ACR_VALUES","buildLoginHint","params","options","acrValues","Array","isArray","hints","loginHint","push","some","v","props","redirectUri","window","location","href","useState","clientID","configuration","setConfiguration","useEffect","isSubscribed","setResult","setIsLoading","setPKCE","response","uiLocales","refreshPKCE","clearPKCEState","useCallback","state","prompt","buildAuthorizeParams","_redirectUri","processResponse","code_verifier","redirect_uri","then","code","id_token","catch","err","error","OAuth2Error","error_description","context","useMemo","redirect","authorize","popup","acr_values_supported","hasMatch","parseAuthorizeResponseFromLocation","match","children","testUA","pattern","test","navigator","userAgent","getMobileOS","MSStream","SEBankIDSameDeviceDesktop","links","onError","onComplete","onInitiate","initiated","setInitiated","useContext","poll","fetch","pollUrl","status","targetUrl","json","text","setTimeout","onClick","SEBankIDSameDeviceAndroid","onLog","onVisible","deps","visibilityState","useRef","document","setState","current","addEventListener","_handleVisibilityChange","removeEventListener","nextState","usePageVisibility","toString","completeUrl","STATE_KEY","autoHydratedState","rawState","getItem","JSON","parse","hydrateState","SEBankIDSameDeviceIOS","removeItem","setItem","stringify","mobileOS","SEBankIDSameDeviceButton","setHref","setLinks","setError","log","setLog","defaultRedirectURi","handleLog","statements","console","logs","handleComplete","required","completeResponse","url","URL","searchParams","from","keys","reduce","memo","refresh","responseMode","encodeURIComponent","newHref","launchLinks","universalLink","customFileHandlerUrl","interval","setInterval","clearInterval","handleInitiate","handleError","element","className","logo","AnchorButton","Button","type","AuthMethodButton","acrValue","backdrop","setBackdrop","handleClick","event","savePKCEState","response_type","pkce_code_verifier","willPopup","onHide","preventDefault","src","acrValueToLogo","alt","inner","isSingle","count","AuthMethodSelector","onSelect","substring","toLowerCase","elementRef","requestId","setRequestId","Math","random","isAcknowledged","setAcknowledged","isCancelled","setCancelled","useLayoutEffect","promise","qr","onAcknowledged","cancelled","UserCancelledError","cancel","qrElement","ref","retry","useCriiptoVerify"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"criipto-verify-react.cjs.js","mappings":"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","sources":["webpack://@criipto/verify-react/webpack/bootstrap","webpack://@criipto/verify-react/webpack/runtime/compat get default export","webpack://@criipto/verify-react/webpack/runtime/define property getters","webpack://@criipto/verify-react/webpack/runtime/hasOwnProperty shorthand","webpack://@criipto/verify-react/webpack/runtime/make namespace object","webpack://@criipto/verify-react/external commonjs \"react/jsx-runtime\"","webpack://@criipto/verify-react/external commonjs \"react\"","webpack://@criipto/verify-react/external commonjs \"@criipto/auth-js\"","webpack://@criipto/verify-react/./src/context.ts","webpack://@criipto/verify-react/./src/utils.ts","webpack://@criipto/verify-react/external commonjs \"@criipto/auth-js/dist/index.css\"","webpack://@criipto/verify-react/external commonjs \"jwt-decode\"","webpack://@criipto/verify-react/./src/provider.tsx","webpack://@criipto/verify-react/./src/hooks/useNow.ts","webpack://@criipto/verify-react/./src/device.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Desktop.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Android.tsx","webpack://@criipto/verify-react/./src/hooks/usePageVisibility.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/shared.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/iOS.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/beeid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nldigid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dkmitid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dknemid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/ftnbankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/ftnmobile@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/itsme@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sebankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sofort@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nobankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/novipps@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodSelector.tsx","webpack://@criipto/verify-react/./src/components/QRCode.tsx","webpack://@criipto/verify-react/./src/use-criipto-verify.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react/jsx-runtime\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@criipto/auth-js\");","import CriiptoAuth, {OpenIDConfiguration, AuthorizeUrlParamsOptional, PKCE, AuthorizeResponse, OAuth2Error, PKCEPublicPart} from '@criipto/auth-js';\nimport { PopupAuthorizeParams, RedirectAuthorizeParams } from '@criipto/auth-js/dist/types';\nimport { createContext } from 'react';\n\nexport type Result = {id_token: string, state?: string} | {code: string, state?: string} | OAuth2Error;\nexport type Action = 'confirm' | 'accept' | 'approve' | 'sign' | 'login';\nexport type Claims = {\n iss: string\n aud: string\n identityscheme: string\n authenticationtype: string\n sub: string\n iat: number\n exp: number\n [key: string]: string | number\n}\n\nexport interface CriiptoVerifyContextInterface {\n loginWithRedirect: (params?: RedirectAuthorizeParams) => Promise<void>,\n loginWithPopup: (params?: PopupAuthorizeParams) => Promise<void>,\n checkSession: () => Promise<void>,\n logout: (params?: {redirectUri?: string}) => Promise<void>,\n fetchOpenIDConfiguration: () => Promise<OpenIDConfiguration>,\n buildAuthorizeUrl: (options?: AuthorizeUrlParamsOptional) => Promise<string>,\n generatePKCE: () => Promise<PKCE | undefined>,\n buildOptions: (options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) => AuthorizeUrlParamsOptional\n handleResponse: (response: AuthorizeResponse, params: {pkce?: PKCE, redirectUri?: string}) => Promise<void>,\n responseType: 'token' | 'code'\n completionStrategy: 'client' | 'openidprovider',\n result: Result | null\n claims: Claims | null\n domain: string\n redirectUri?: string,\n action: Action,\n pkce?: PKCE | PKCEPublicPart,\n store: Storage,\n isLoading: boolean,\n acrValues?: string[],\n uiLocales?: string,\n client: CriiptoAuth\n}\n\n/**\n * @ignore\n */\nconst stub = (): never => {\n throw new Error('You forgot to wrap your component in <CriiptoVerifyProvider>.');\n};\n\n/**\n * @ignore\n */\nconst initialContext = {\n loginWithRedirect: stub,\n loginWithPopup: stub,\n checkSession: stub,\n logout: stub,\n fetchOpenIDConfiguration: stub,\n buildAuthorizeUrl: stub,\n generatePKCE: stub,\n buildOptions: stub,\n handleResponse: stub,\n responseType: 'token' as 'token' | 'code',\n completionStrategy: 'client' as 'client' | 'openidprovider',\n result: null,\n claims: null,\n domain: '',\n action: 'login' as Action,\n pkce: undefined,\n store: sessionStorage,\n isLoading: false,\n client: null as any as CriiptoAuth\n};\n\nconst CriiptoVerifyContext = createContext<CriiptoVerifyContextInterface>(initialContext);\n\nexport default CriiptoVerifyContext;","import { Action } from \"./context\";\n\nexport const DKMITID_PREFIX = 'urn:grn:authn:dk:mitid';\n\nexport function lowestMitIDValue(input: string[]) : string | null {\n let dkmitidMethod : string | null = null;\n\n input.forEach(s => {\n if (s.startsWith(DKMITID_PREFIX)) {\n if (!dkmitidMethod) {\n dkmitidMethod = s;\n } else {\n let newLevel = s.replace(DKMITID_PREFIX, '');\n let oldLevel = dkmitidMethod.replace(DKMITID_PREFIX, '');\n if (newLevel === ':low' && [':substantial', ':high'].includes(oldLevel)) {\n dkmitidMethod = s;\n }\n else if (newLevel === ':substantial' && oldLevel === ':high') {\n dkmitidMethod = s;\n }\n }\n }\n });\n\n return dkmitidMethod;\n}\n\nfunction autoTitleCase(input: string) {\n var segments = input.split(/:|-/).map(segment => {\n segment = segment.replace(/id(\\s|$)/, 'ID');\n if (segment.length === 2) return segment.toUpperCase();\n return segment.substr(0, 1).toUpperCase() + segment.substr(1);\n });\n return segments.join(' ');\n}\n\nfunction assertUnreachable(x: never): never {\n throw new Error(\"Didn't expect to get here\");\n}\n\nexport type Language = 'en' | 'da' | 'sv' | 'nb';\n\nexport function stringifyAction(language: Language, action: Action) : string {\n if (action === 'login') {\n if (language === 'da') return 'Login med';\n else if (language === 'sv') return 'Logga in med'\n else if (language === 'nb') return 'Logg inn med';\n return 'Login with';\n }\n if (action === 'approve') {\n if (language === 'da') return 'Godkend med';\n else if (language === 'sv') return 'Godkänn med'\n else if (language === 'nb') return 'Godkjenne med';\n return 'Approve with';\n }\n if (action === 'sign') {\n if (language === 'da') return 'Underskriv med';\n else if (language === 'sv') return 'Signera med'\n else if (language === 'nb') return 'Signer med';\n return 'Sign with';\n }\n if (action === 'confirm') {\n if (language === 'da') return 'Bekræft med';\n else if (language === 'sv') return 'Bekräfta med'\n else if (language === 'nb') return 'Bekreft med';\n return 'Confirm with';\n }\n if (action === 'accept') {\n if (language === 'da') return 'Accepter med';\n else if (language === 'sv') return 'Acceptera med'\n else if (language === 'nb') return 'Aksepterer med';\n return 'Accept with';\n }\n\n assertUnreachable(action);\n}\n\nexport function acrValueToProviderPrefix(value: string) {\n value = value.replace('urn:grn:authn:', '');\n\n if (value.startsWith('fi')) {\n return 'fi';\n }\n else if (value.startsWith('itsme')) {\n return 'itsme';\n } else {\n return value.split(':').slice(0, 2).join(':');\n }\n}\n\nexport function acrValueToTitle(language: Language, value: string) : {title: string, subtitle?: string} {\n\tvalue = value.replace('urn:grn:authn:', '');\n const provider = acrValueToProviderPrefix(value);\n\n if (provider === 'be:eid') {\n return {title: autoTitleCase(value).replace('BEEID', 'Belgian eID')};\n }\n if (provider === 'nl:digid') {\n return {title: autoTitleCase(value).replace('NL ', '')};\n }\n if (provider === 'dk:mitid') {\n return {title: 'MitID'};\n }\n if (provider === 'dk:nemid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('dk:nemid:', '');\n\t\t\n\t\tif (suffix === 'poces') {\n\t\t\tif (language === 'en') subtitle = 'Personal';\n\t\t\tif (language === 'da') subtitle = 'Personlig';\n\t\t\tif (language === 'sv') subtitle = 'Personlig';\n\t\t\tif (language === 'nb') subtitle = 'Personlig';\n\t\t}\n\t\tif (suffix === 'moces') {\n\t\t\tif (language === 'en') subtitle = 'Employee key card';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglekort';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelkort';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelkort';\n\t\t}\n\t\tif (suffix === 'moces:codefile') {\n\t\t\tif (language === 'en') subtitle = 'Employee key file';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglefil';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelfil';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelfil';\n\t\t}\n\n return {\n\t\t\ttitle: 'NemID',\n\t\t\tsubtitle\n\t\t}\n }\n if (provider === 'fi') {\n return {title: autoTitleCase(value).replace('FI', 'FTN')};\n }\n if (provider === 'itsme') {\n return {title: autoTitleCase(value).replace('me', 'ME')};\n }\n if (provider === 'se:bankid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('se:bankid:', '');\n\n\t\tif (suffix === 'same-device') {\n\t\t\tif (language === 'en') subtitle = 'On this device';\n\t\t\tif (language === 'da') subtitle = 'På denne enhed';\n\t\t\tif (language === 'sv') subtitle = 'På denna enheten';\n\t\t\tif (language === 'nb') subtitle = 'På denne enheten';\n\t\t}\n\t\tif (suffix === 'another-device') {\n\t\t\tif (language === 'en') subtitle = 'With your SSN';\n\t\t\tif (language === 'da') subtitle = 'Med dit personnummer';\n\t\t\tif (language === 'sv') subtitle = 'Med ditt personnummer';\n\t\t\tif (language === 'nb') subtitle = 'Med personnummeret ditt';\n\t\t}\n\t\tif (suffix === 'another-device:qr') {\n\t\t\tif (language === 'en') subtitle = 'With QR Code';\n\t\t\tif (language === 'da') subtitle = 'Med QR-kode';\n\t\t\tif (language === 'sv') subtitle = 'Med QR-kod';\n\t\t\tif (language === 'nb') subtitle = 'Med QR-kode';\n\t\t}\n\n return {title: 'BankID', subtitle};\n }\n if (provider === 'de:sofort') {\n return {title: autoTitleCase(value).replace('DE ', '')};\n }\n if (provider === 'no:bankid') {\n let subtitle : string | undefined = undefined;\n if (value.endsWith(':substantial')) {\n if (language === 'en') subtitle = 'Biometrics';\n\t\t\tif (language === 'da') subtitle = 'Biometri ';\n\t\t\tif (language === 'sv') subtitle = 'Biometri';\n\t\t\tif (language === 'nb') subtitle = 'Biometri';\n }\n return {title: subtitle ? 'BankID' : autoTitleCase(value).replace('NO ', ''), subtitle};\n }\n if (provider === 'no:vipps') {\n return {title: autoTitleCase(value).replace('NO ', '')};\n }\n\n return {title: autoTitleCase(value)};\n}\n\nexport function filterAcrValues(input: string[]) {\n let original = input.slice();\n let dkmitidMethod : string | null = lowestMitIDValue(input);\n\n if (dkmitidMethod) {\n return input.filter(s => !s.startsWith(DKMITID_PREFIX)).concat([dkmitidMethod]).sort((a, b) => original.indexOf(a) - original.indexOf(b));\n }\n return input;\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@criipto/auth-js/dist/index.css\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"jwt-decode\");","import React, {useMemo, useState, useCallback, useEffect} from 'react';\nimport CriiptoAuth, {AuthorizeUrlParamsOptional, clearPKCEState, generatePKCE, OAuth2Error, OpenIDConfiguration, PKCE, PKCEPublicPart, Prompt, savePKCEState, parseAuthorizeResponseFromLocation} from '@criipto/auth-js';\n\nimport CriiptoVerifyContext, {CriiptoVerifyContextInterface, Action, Result, Claims} from './context';\nimport { AuthorizeResponse, PopupAuthorizeParams, RedirectAuthorizeParams, ResponseType } from '@criipto/auth-js/dist/types';\n\nimport '@criipto/auth-js/dist/index.css';\nimport { filterAcrValues } from './utils';\nimport jwtDecode from 'jwt-decode';\nimport useNow from './hooks/useNow';\n\nconst SESSION_KEY = `@criipto-verify-react/session`;\n \nexport interface CriiptoVerifyProviderOptions {\n domain: string\n clientID: string\n redirectUri?: string\n children: React.ReactNode\n pkce?: PKCEPublicPart\n state?: string\n prompt?: Prompt\n uiLocales?: string\n /**\n * Enables storage and automatic refresh of tokens\n * by utilizing browser storage and SSO silent logins.\n * Make sure \"SSO for OAuth2\" is enabled on your Criipto Domain.\n * Only works for `response: 'token'` (default)\n */\n sessionStore?: Storage,\n /**\n * Will ammend the login_hint parameter with `action:{action}` which will adjust texsts in certain flows.\n * Default: 'login'\n */\n action?: Action\n /**\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do PKCE on your behalf and return a jwt token.\n * However if you wish you can disable this and get the raw `code` response by setting `response` to 'code'.\n */\n response?: 'token' | 'code'\n /*\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do as much as work on your behalf\n * by interpreting URL parameters and responses with `useCriiptoVerify()` via the default value 'client'.\n * If you wish to only render a UI and redirect to the Criipto IDP for server side code exchange, you can choose 'openidprovider'.\n */\n completionStrategy?: 'client' | 'openidprovider'\n}\n\nconst ACTION_SUPPORTING_ACR_VALUES = [\n 'urn:grn:authn:dk:mitid:low',\n 'urn:grn:authn:dk:mitid:substantial',\n 'urn:grn:authn:dk:mitid:high',\n 'urn:grn:authn:se:bankid:same-device',\n 'urn:grn:authn:se:bankid:another-device',\n 'urn:grn:authn:se:bankid:another-device:qr',\n];\n\nfunction buildLoginHint(params: {options?: AuthorizeUrlParamsOptional, action?: Action}) {\n const {options, action} = params;\n const acrValues = options?.acrValues ? Array.isArray(options?.acrValues) ? options?.acrValues : [options?.acrValues] : [];\n let hints = options?.loginHint ? options?.loginHint.split(' ') : [];\n if (action) {\n if (acrValues.length === 1) {\n if (ACTION_SUPPORTING_ACR_VALUES.includes(acrValues[0])) {\n hints.push(`action:${action}`);\n }\n } else if (acrValues.length >= 2) {\n if (acrValues.some(v => ACTION_SUPPORTING_ACR_VALUES.includes(v))) {\n hints.push(`action:${action}`);\n }\n } else {\n hints.push(`action:${action}`);\n }\n }\n return hints.length ? hints.join(' ') : undefined;\n}\n\nconst store = sessionStorage;\n\nconst CriiptoVerifyProvider = (props: CriiptoVerifyProviderOptions) : JSX.Element => {\n const redirectUri = props.redirectUri || window.location.href;\n\n const [client] = useState(\n () => new CriiptoAuth({\n domain: props.domain,\n clientID: props.clientID,\n store,\n redirectUri: props.redirectUri\n })\n );\n\n const [configuration, setConfiguration] = useState<OpenIDConfiguration | null>(null);\n useEffect(() => {\n let isSubscribed = true;\n (async () => {\n const configuration = await client.fetchOpenIDConfiguration();\n if (isSubscribed) setConfiguration(configuration);\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [client]);\n\n const [result, setResult] = useState<Result | null>(null);\n const claims = useMemo(() => {\n if (!result) return null;\n if (!(\"id_token\" in result)) return null;\n return jwtDecode<Claims>(result.id_token);\n }, [result]);\n const [isLoading, setIsLoading] = useState(false);\n const [pkce, setPKCE] = useState<PKCE | PKCEPublicPart | undefined>(props.pkce);\n const responseType = props.response || 'token';\n const completionStrategy = props.completionStrategy || 'client';\n const action = props.action || 'login';\n const uiLocales = props.uiLocales;\n const sessionStore = props.sessionStore;\n\n const hasClaims = useCallback(() => {\n return claims !== null && responseType === 'token';\n }, [sessionStore, responseType, claims]);\n const now = useNow(hasClaims, 3000);\n\n const refreshPKCE = () => {\n if (props.pkce) return;\n if (responseType !== 'token' || completionStrategy !== 'client') {\n clearPKCEState(store);\n setPKCE(undefined);\n return;\n }\n\n clearPKCEState(store);\n\n (async () => {\n const pkce = await generatePKCE();\n setPKCE(pkce);\n })();\n }\n\n const buildOptions = useCallback((options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) : AuthorizeUrlParamsOptional => {\n return {\n redirectUri,\n responseType: 'code' as ResponseType,\n ...options || {},\n state: props.state ?? options?.state,\n prompt: props.prompt ?? options?.prompt,\n uiLocales: uiLocales ?? options?.uiLocales,\n pkce: options?.pkce ?? pkce,\n loginHint: buildLoginHint({options, action})\n }\n }, [\n pkce,\n props.state,\n props.prompt,\n uiLocales,\n action,\n redirectUri\n ]);\n\n const buildAuthorizeUrl = useCallback(async (options?: AuthorizeUrlParamsOptional) => {\n return await client.buildAuthorizeUrl(client.buildAuthorizeParams(buildOptions(options)));\n }, [client, buildOptions]);\n\n const handleResponse = useCallback(async (response : AuthorizeResponse, params: {pkce?: PKCE, redirectUri?: string}) => {\n if (params.pkce && responseType === 'token') {\n let _redirectUri = params.redirectUri || redirectUri;\n if (!_redirectUri) throw new Error('redirectUri must be configured globally or per authentication component');\n\n await client.processResponse(response, {code_verifier: params.pkce.code_verifier, redirect_uri: _redirectUri}).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) {\n setResult({id_token: response.id_token});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n } else {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) {\n setResult({id_token: response.id_token});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else if (response?.error) setResult(new OAuth2Error(response.error, response.error_description));\n else setResult(null);\n }\n\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }, [refreshPKCE, responseType, setResult, client, sessionStore]);\n\n const checkSession = useCallback(async () => {\n return client.checkSession({redirectUri}).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) {\n setResult({id_token: response.id_token});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else setResult(null);\n });\n }, [sessionStore, client, redirectUri]);\n\n const logout = useCallback(async (params?: {redirectUri?: string}) => {\n sessionStore?.removeItem(SESSION_KEY);\n await client.logout({\n redirectUri: params?.redirectUri ?? redirectUri\n });\n }, [sessionStore, client]);\n\n const context = useMemo<CriiptoVerifyContextInterface>(() => {\n return {\n loginWithRedirect: async (params) => {\n await client.redirect.authorize(buildOptions(params));\n },\n loginWithPopup: (params) => {\n return client.popup.authorize(buildOptions(params)).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n },\n checkSession,\n logout,\n fetchOpenIDConfiguration: () => client.fetchOpenIDConfiguration(),\n buildAuthorizeUrl,\n generatePKCE: async () => {\n if (responseType !== 'token' || completionStrategy !== 'client') return;\n return await generatePKCE();\n },\n buildOptions,\n handleResponse,\n responseType,\n completionStrategy,\n result,\n claims,\n domain: client.domain,\n redirectUri,\n action,\n pkce,\n store,\n isLoading,\n acrValues: configuration ? filterAcrValues(configuration.acr_values_supported) : undefined,\n client,\n uiLocales\n }\n }, [\n client,\n redirectUri,\n responseType,\n completionStrategy,\n result,\n claims,\n action,\n pkce,\n props.state,\n props.prompt,\n isLoading,\n handleResponse,\n logout,\n configuration,\n uiLocales,\n checkSession\n ]);\n\n useEffect(() => {\n if (!client.redirect.hasMatch()) {\n refreshPKCE(); // Fresh request, setup PKCE\n return;\n }\n\n let isSubscribed = true;\n setIsLoading(true);\n\n const params = parseAuthorizeResponseFromLocation(window.location);\n if (params.code && responseType === 'code') {\n setIsLoading(false);\n setResult({code: params.code});\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n return;\n }\n\n client.redirect.match().then(response => {\n if (!isSubscribed) return;\n setIsLoading(false);\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else setResult(null);\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }).catch((err: OAuth2Error) => {\n if (!isSubscribed) return;\n setIsLoading(false);\n setResult(err);\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n });\n\n return () => {\n isSubscribed = false;\n };\n }, [props.pkce, responseType]);\n\n /*\n * Fetch claims from session store if available\n */\n useEffect(() => {\n if (!sessionStore || claims) return;\n if (!claims) {\n // No result available, fetch from session store\n const token = sessionStore.getItem(SESSION_KEY);\n if (!token) return;\n\n setResult({id_token: token});\n return;\n }\n }, [sessionStore, claims]);\n \n /*\n * Unset result if claims are expired\n */\n useEffect(() => {\n if (!claims) return;\n if (!now) return;\n\n if (claims.exp < (now / 1000)) {\n setResult(null);\n sessionStore?.removeItem(SESSION_KEY);\n return;\n }\n }, [sessionStore, claims, now, result]);\n\n /**\n * Fresh page load SSO check\n */\n useEffect(() => {\n if (!sessionStore) return;\n if (client.redirect.hasMatch()) return; // Do not issue SSO check if we're just being redirected back to\n if (sessionStore.getItem(SESSION_KEY)) return;\n let isSubscribed = true;\n\n setIsLoading(true);\n checkSession().catch(err => {\n console.error(\"session silent check error\", err);\n }).finally(() => {\n if (isSubscribed) setIsLoading(false);\n });\n\n return () => {\n isSubscribed = false\n };\n }, [sessionStore, client, redirectUri]);\n\n return (\n <CriiptoVerifyContext.Provider value={context}>\n {props.children}\n </CriiptoVerifyContext.Provider>\n );\n}\n\nexport default CriiptoVerifyProvider","import { useState, useEffect } from \"react\";\n\nexport default function useNow(isEnabled: () => boolean, refreshInterval: number = 30000) {\n const [now, setNow] = useState<number | null>(null);\n\n useEffect(() => {\n const enabled = isEnabled();\n if (!enabled) {\n setNow(null);\n return;\n }\n\n setNow(Date.now());\n const interval = setInterval(() => {\n setNow(Date.now());\n }, refreshInterval);\n\n return () => clearInterval(interval);\n }, [isEnabled]);\n\n return now;\n}","function testUA(pattern: RegExp) {\n return pattern.test(navigator.userAgent);\n};\nexport function isiOS() {\n return testUA(/iPad|iPhone|iPod/) && !(window as any).MSStream;\n};\n\nexport function isiOSSafari() {\n return isiOS() && !testUA(/ CriOS\\/[.0-9]*/);\n};\n\nexport function isAndroid() { return testUA(/Android/); };\n\nexport type MobileOS = 'ios' | 'android';\n\nexport function getMobileOS() : MobileOS | null {\n if (isiOS()) return 'ios';\n if (isAndroid()) return 'android';\n\n return null;\n}","import React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../../context';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement\n links: Links\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Desktop: Polling scenario\n */\nexport default function SEBankIDSameDeviceDesktop(props: Props) {\n const {links, onError, onComplete, onInitiate} = props;\n const [initiated, setInitiated] = useState(false);\n const {domain} = useContext(CriiptoVerifyContext);\n\n useEffect(() => {\n if (!initiated) return;\n let isSubscribed = true;\n let timeout : string | undefined;\n const poll = async () => {\n if (!isSubscribed) return;\n const response = await fetch(links.pollUrl);\n\n if (response.status === 202) {\n setTimeout(poll, 1000);\n return;\n } else if (response.status >= 400) {\n if (!isSubscribed) return;\n const error = await response.text();\n onError(error);\n return;\n } else {\n if (!isSubscribed) return;\n const {targetUrl} = await response.json();\n await onComplete(`https://${domain}${targetUrl}`);\n return;\n }\n };\n\n setTimeout(poll, 1000);\n return () => {\n isSubscribed = false;\n if (timeout) clearTimeout(timeout);\n };\n }, [initiated]);\n\n const handleInitiate = () => {\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import React, { useState } from 'react';\nimport usePageVisibility from '../../hooks/usePageVisibility';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Android: Background/Foreground scenario\n */\nexport default function SEBankIDSameDeviceAndroid(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog} = props;\n const [initiated, setInitiated] = useState(false);\n\n usePageVisibility(async () => {\n onLog('android', 'onForeground', initiated.toString());\n if (!initiated) return;\n \n onComplete(links.completeUrl);\n }, [links, initiated]);\n\n const handleInitiate = () => {\n onLog('android', 'handleInitiate');\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import React, { useRef, useState, useEffect } from 'react';\n\nexport default function usePageVisibility(onVisible? : () => void, deps : React.DependencyList = []) {\n const visibilityState = useRef(document.visibilityState);\n const [state, setState] = useState(visibilityState.current);\n\n useEffect(() => {\n document.addEventListener('visibilitychange', _handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', _handleVisibilityChange);\n };\n }, deps);\n\n const _handleVisibilityChange = () => {\n const nextState = document.visibilityState;\n if (\n visibilityState.current === 'hidden' &&\n nextState === 'visible'\n ) {\n if (onVisible) onVisible();\n }\n\n visibilityState.current = nextState;\n setState(visibilityState.current);\n };\n\n return state;\n}","import { PKCE } from \"@criipto/auth-js\"\n\nexport interface Links {\n cancelUrl: string\n completeUrl: string\n pollUrl: string\n launchLinks: {\n customFileHandlerUrl: string\n universalLink: string\n }\n};\n\nexport interface State {\n pkce: PKCE | undefined\n redirectUri: string\n links: Links\n}\n\nconst STATE_KEY = '@criipto/verify-react:sebankid:state';\n\nexport function hydrateState() : State | undefined {\n const rawState = sessionStorage.getItem(STATE_KEY);\n if (rawState) {\n return JSON.parse(rawState) as State;\n }\n\n return undefined;\n}\n\nexport const autoHydratedState = hydrateState();\n\nexport function clearState() {\n sessionStorage.removeItem(STATE_KEY);\n}\n\nexport function saveState(input: State) : void {\n sessionStorage.setItem(STATE_KEY, JSON.stringify(input));\n}","import { PKCE } from '@criipto/auth-js';\nimport React, { useEffect, useState } from 'react';\nimport {Links, saveState, autoHydratedState, clearState} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void,\n pkce: PKCE | undefined,\n redirectUri: string\n}\n\n/*\n * iOS: Page reload on switch back scenario\n */\nexport default function SEBankIDSameDeviceIOS(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog, pkce, redirectUri} = props;\n\n const handleInitiate = () => {\n onLog('iOS', 'handleInitiate');\n\n saveState({\n links,\n redirectUri,\n pkce\n });\n\n onInitiate();\n };\n\n useEffect(() => {\n if (!autoHydratedState) return;\n clearState();\n onComplete(autoHydratedState.links.completeUrl);\n }, []);\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import { PKCE, AuthorizeResponse } from '@criipto/auth-js';\nimport React, {useCallback, useContext, useEffect, useState} from 'react';\nimport CriiptoVerifyContext from '..//context';\nimport { getMobileOS } from '../device';\n\nimport Desktop from './SEBankIDSameDeviceButton/Desktop';\nimport Android from './SEBankIDSameDeviceButton/Android';\nimport IOS from './SEBankIDSameDeviceButton/iOS';\n\nimport {autoHydratedState, Links} from './SEBankIDSameDeviceButton/shared';\n\ninterface Props {\n className: string\n children: React.ReactNode\n logo: React.ReactNode\n href?: string\n redirectUri?: string\n}\n\nconst mobileOS = getMobileOS();\n\nfunction searchParamsToPOJO(input: URLSearchParams) {\n return Array.from(input.keys()).reduce((memo : {[key: string]: string}, key) => {\n memo[key] = input.get(key)!;\n return memo;\n }, {});\n}\n\nexport default function SEBankIDSameDeviceButton(props: Props) {\n const [href, setHref] = useState(props.href);\n const [links, setLinks] = useState<Links | null>(autoHydratedState?.links ?? null);\n const [pkce, setPKCE] = useState<PKCE | undefined>(autoHydratedState?.pkce ?? undefined);\n const [error, setError] = useState<string | null>(null);\n const [log, setLog] = useState<(string | string[])[]>([]);\n const [initiated, setInitiated] = useState(autoHydratedState ? true : false);\n const {buildAuthorizeUrl, completionStrategy, generatePKCE, handleResponse, redirectUri: defaultRedirectURi} = useContext(CriiptoVerifyContext);\n const redirectUri = props.redirectUri || defaultRedirectURi;\n\n const reset = () => {\n setPKCE(undefined);\n setLinks(null);\n setHref(props.href);\n };\n\n const handleLog = (...statements: string[]) => {\n setLog(logs => logs.concat([statements]));\n }\n\n const handleComplete = useCallback(async (completeUrl: string) => {\n const required = {pkce};\n reset();\n\n const completeResponse = await fetch(completeUrl);\n if (completeResponse.status >= 400) {\n setError(await completeResponse.text());\n return;\n }\n \n const {location} : {location: string} = await completeResponse.json();\n if (completionStrategy === 'openidprovider') {\n window.location.href = location;\n return;\n }\n const url = new URL(location);\n const params = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n\n await handleResponse(params, {\n pkce: required.pkce,\n redirectUri\n });\n }, [completionStrategy, pkce]);\n\n const refresh = useCallback(async () => {\n handleLog('SEBankID: Refresh authorize url');\n const pkce = await generatePKCE();\n\n buildAuthorizeUrl({\n acrValues: 'urn:grn:authn:se:bankid:same-device',\n loginHint: 'appswitch:browser',\n responseMode: 'json',\n pkce,\n redirectUri\n }).then(url => {\n return fetch(url).then(response => response.json() as Promise<Links>);\n })\n .then(links => {\n setPKCE(pkce || undefined);\n setLinks(links);\n const redirect = mobileOS === 'ios' ? encodeURIComponent(window.location.href) : 'null';\n const newHref = `${mobileOS ? links.launchLinks.universalLink : links.launchLinks.customFileHandlerUrl}&redirect=${redirect}`;\n\n handleLog(window.location.href);\n handleLog(newHref);\n setHref(newHref);\n })\n .catch(console.error);\n }, [buildAuthorizeUrl, redirectUri]);\n\n // Generate URL on first button render\n useEffect(() => {\n if (initiated) return;\n refresh();\n }, [refresh, initiated]);\n\n // Continously fetch new autostart token if UI is open for a long time\n useEffect(() => {\n if (initiated) return;\n\n const interval = setInterval(() => {\n if (initiated) return;\n refresh();\n }, 25000);\n return () => clearInterval(interval);\n }, [refresh, initiated]);\n\n // Track when the button is clicked to stop refreshing URL\n const handleInitiate = () => {\n handleLog('Initiated');\n setInitiated(true);\n setError(null);\n }\n\n const handleError = (error: string) => {\n setInitiated(false);\n setError(error);\n }\n\n const element = (\n <a className={`${props.className} ${initiated ? 'criipto-eid-btn--disabled' : ''}`} href={href} onClick={handleInitiate}>\n <div className=\"criipto-eid-logo\">\n {initiated ? <div className=\"criipto-eid-loader\"></div> : props.logo}\n </div>\n {props.children}\n </a>\n );\n\n return (\n <React.Fragment>\n {links ? (\n <React.Fragment>\n {mobileOS === null ? (\n <Desktop\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </Desktop>\n ) : mobileOS === 'android' ? (\n <Android\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </Android>\n ) : mobileOS === 'ios' ? (\n <IOS\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n redirectUri={redirectUri!}\n pkce={pkce}\n >\n {element}\n </IOS>\n ) : element}\n </React.Fragment>\n ) : element}\n {error && <p>{error}</p>}\n {/* {log && (\n <pre>\n {JSON.stringify(log, null, 2)}\n </pre>\n )} */}\n </React.Fragment>\n )\n}","import React, {useContext, useEffect, useState} from 'react';\n\nimport beeid from './AuthMethodButton/logos/beeid@2x.png';\nimport digid from './AuthMethodButton/logos/nldigid@2x.png';\nimport dkmitid from './AuthMethodButton/logos/dkmitid@2x.png';\nimport dknemid from './AuthMethodButton/logos/dknemid@2x.png';\nimport ftnmobile from './AuthMethodButton/logos/ftnmobile@2x.png';\nimport ftnbankid from './AuthMethodButton/logos/ftnbankid@2x.png';\nimport itsme from './AuthMethodButton/logos/itsme@2x.png';\nimport nobankid from './AuthMethodButton/logos/nobankid@2x.png';\nimport novipps from './AuthMethodButton/logos/novipps@2x.png';\nimport sebankid from './AuthMethodButton/logos/sebankid@2x.png';\nimport sofort from './AuthMethodButton/logos/sofort@2x.png';\n\nimport './AuthMethodButton/AuthMethodButton.css';\nimport { getMobileOS } from '../device';\nimport CriiptoVerifyContext from '..//context';\nimport SEBankIDSameDeviceButton from './SEBankIDSameDeviceButton';\nimport { savePKCEState } from '@criipto/auth-js';\n\nexport type PopupParams = {\n acrValue: string,\n onHide: () => void\n};\nexport type PopupOption = boolean | ((options: PopupParams) => boolean | React.ReactElement)\n\ninterface ButtonProps {\n className?: string,\n children: React.ReactNode,\n onClick?: React.MouseEventHandler,\n}\n\ninterface AnchorButtonProps extends ButtonProps {\n href: string\n}\n\nconst mobileOS = getMobileOS();\n\nexport function AnchorButton(props: AnchorButtonProps) {\n return (\n <a className={`criipto-verify-button ${props.className}`} href={props.href} onClick={props.onClick}>{props.children}</a>\n );\n}\n\nexport function Button(props: ButtonProps) {\n return (\n <button className={`criipto-verify-button ${props.className}`} type=\"button\" onClick={props.onClick}>{props.children}</button>\n );\n}\n\nexport interface AuthMethodButtonProps {\n acrValue: string,\n href?: string;\n onClick?: React.MouseEventHandler,\n children?: React.ReactNode,\n 'data-testid'?: string,\n className?: string,\n redirectUri?: string,\n popup?: PopupOption\n}\n\nexport default function AuthMethodButton(props: AuthMethodButtonProps) {\n const {acrValue} = props;\n const context = useContext(CriiptoVerifyContext);\n const className = `criipto-eid-btn ${acrValueToClassName(acrValue)}${props.className ? ` ${props.className}` : ''}`;\n const [backdrop, setBackdrop] = useState<React.ReactElement | null>(null);\n\n const [href, setHref] = useState(props.href);\n const redirectUri = props.redirectUri || context.redirectUri;\n\n useEffect(() => {\n if (props.href) return;\n\n let isSubscribed = true;\n let loginHint : string | undefined = undefined;\n\n if (acrValue.startsWith('urn:grn:authn:dk:mitid') && mobileOS) {\n loginHint = `appswitch:${mobileOS} target:web`;\n }\n\n context.buildAuthorizeUrl({\n redirectUri,\n acrValues: acrValue,\n loginHint\n }).then(href => {\n if (isSubscribed) setHref(href);\n })\n .catch(console.error);\n\n return () => {\n isSubscribed = false;\n };\n }, [props.href, acrValue, context.pkce, redirectUri]);\n\n const handleClick : React.MouseEventHandler = (event) => {\n if (context.pkce && \"code_verifier\" in context.pkce) {\n // just-in-time saving of PKCE, in case of man-in-the-browser\n savePKCEState(context.store, {\n response_type: 'id_token',\n pkce_code_verifier: context.pkce.code_verifier,\n redirect_uri: redirectUri!\n });\n }\n\n if (props.popup) {\n let willPopup =\n typeof props.popup === \"function\" ?\n props.popup({\n acrValue,\n onHide: () => setBackdrop(null)\n }) :\n props.popup === true;\n\n if (willPopup !== false) {\n event.preventDefault();\n\n if (typeof willPopup === \"boolean\") {\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: true\n }); \n } else {\n setBackdrop(willPopup);\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: false\n }); \n }\n }\n }\n\n if (props.onClick) props.onClick(event);\n }\n\n if (acrValue === 'urn:grn:authn:se:bankid:same-device') {\n return (\n <SEBankIDSameDeviceButton\n redirectUri={props.redirectUri}\n href={href}\n className={className}\n logo={<img src={acrValueToLogo(acrValue)} alt=\"\" />}\n >\n {props.children}\n </SEBankIDSameDeviceButton>\n );\n }\n\n const inner = (\n <React.Fragment>\n {acrValueToLogo(acrValue) ? (\n <div className=\"criipto-eid-logo\">\n <img src={acrValueToLogo(acrValue)} alt=\"\" />\n </div>\n ) : null}\n {props.children}\n </React.Fragment>\n );\n\n if (href) {\n return (\n <React.Fragment>\n <AnchorButton {...props} href={href} className={className} onClick={handleClick}>\n {inner}\n </AnchorButton>\n {backdrop}\n </React.Fragment>\n );\n }\n\n return (\n <React.Fragment>\n <Button {...props} className={className} onClick={handleClick}>\n {inner}\n </Button>\n {backdrop}\n </React.Fragment>\n );\n}\n\nfunction acrValueToClassName(value: string) {\n value = value.replace('urn:grn:authn:', '');\n const segments = value.split(':');\n const classNames = segments.reduce((memo: string[], segment: string) => {\n if (memo.length) {\n return memo.concat([`${memo[memo.length-1]}-${segment}`])\n } else {\n return memo.concat([segment]);\n }\n }, []);\n\n return classNames.map(className => `criipto-eid-btn--${className}`).join(' ');\n}\n\nfunction acrValueToLogo(value : string) {\n if (value.startsWith('urn:grn:authn:be:eid')) {\n return beeid;\n }\n if (value.startsWith('urn:grn:authn:nl:digid')) {\n return digid;\n }\n if (value.startsWith('urn:grn:authn:dk:mitid')) {\n return dkmitid;\n }\n if (value.startsWith('urn:grn:authn:dk:nemid')) {\n return dknemid;\n }\n if (value.startsWith('urn:grn:authn:fi:bank-id')) {\n return ftnbankid;\n }\n if (value.startsWith('urn:grn:authn:fi')) {\n return ftnmobile;\n }\n if (value.startsWith('urn:grn:authn:itsme')) {\n return itsme;\n }\n if (value.startsWith('urn:grn:authn:se:bankid')) {\n return sebankid;\n }\n if (value.startsWith('urn:grn:authn:de:sofort')) {\n return sofort;\n }\n if (value.startsWith('urn:grn:authn:no:bankid')) {\n return nobankid;\n }\n if (value.startsWith('urn:grn:authn:no:vipps')) {\n return novipps;\n }\n}","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAAA8CAYAAAAe5VayAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUdSURBVHgB7Zzveds2EMZPffy9ygRBJrC9ATVB3AmsTOB4AjETSJ3A6gRNJjA9QdUJzEwQZQL0XvEgQZAIgCzo2CR/z4OQog6U9AZ/7g6EiXqE1nqhw/zg8g+Xv7nccclo5ECkiOd45vLARVELfqMRoLjMubQScxTxlDlVYuaxFUYR61lIN1chw1FEP4oLJqErn9EoYpgpVULe1hlMqEdI13sfMIMosMukTCmOLZfZZDLZ0MgBFn3KZS5jX6wrpNz7RLdEqZzR26fksuEWtbUvwsfkQx5Rv+C6M4oFwnFZipffN07GOV393ueIurcx4qGZr/QweNaWKDpOSDSqaaj1hW7SR3JHg1DvWxj7iSsgHx6pmr2GyJrHu0840VVi4tFju2Xbdzhx/cQhCwgwU3/GCQtU8OGrx3YqQh9ElOasaGShD27MfcD2I/7ZdWep9Ewjhq/cEv/ACWuD3pnV2JVs98G0xIxGbG70Yfb1dWlMQFMjYtjvGR5Gk28BO3UhJxk1Y0XH/0MFdQuiixs6/nxcyz110JIyqaeoObvMDXfXklvblupj7MsL3S4ljrDpybzge1DHbJ3Pw48q7Ws1oBXds/2cj/DrFMVj2/pE3M3OinoOi73mA+LdktpRet5TvcknOtEEoo0Hu5ehW/LhE3VAX5Oy6HpzqpKpylwUB7qgxPQ9sw0xH5xrXygxQ1geuNLHGZfkmelUIiLevKZqklJyjmtljT3co4zLO+5iiJo+UDVelZQeCLhfaJJk7JYSckEJ4C/2p3PpO5cNtwC4GEs6+Hg7f891TWTQX7M9xEWY5V1da4G77uJ1WZrSaXe2ZkTThWY+305ayf9xRepQ1CFJRERKSFfLCHArbp0ZEcIgmF/ZK2W6ypz/kJI79p24Il2RpDvTcfJyzgWh0kxaogmd9rOiiHZn1VkgCmG7ldgXgVDrVdFVd1bkuBbO6trHM3XcJEhBb4RULfEc6OJTd2lSWJ255tqVlI6ks7FLlyKCSy4nEwkL+1e4atIf7vqGihLStYg/z13kFgqX59JfNVmiuHQyQKndp05FLD3PrUDAnF6GtfM6uYhd+okrz3twzjsdpwTkPd1YOXkWP1ZECII1VoRnMbFnbkcxcGm09ZSBTDYIDQunHl7PqV18W1oFkc9n/pxr20CSsxklBt052CL4y5ilw634e787JhjjruRebtY7pyqrjLpPtu/Ih5kkB3C/n2Yml2sragBW3XzvSwCwoA6IEhGDsTW+4QcerQfwe4iRvzl1YJfTwanG60fbCZe65xIC3ykhsiC/oPbOu6/eNkpEBns+TJeGKFtZ/Ydw+wlEhEOLzMTO/XBF1UPlaz5+scW06i7oTJfTx/tNYDvV9XtQ8P57OuwKaCPexvnedZRm8d63QN0lu+5PhxTaa2IOfzbiwYbMTCwF/RrMsqai14cZ17OA3b9GxJdyOd4Ka2uo8blEuydudyLK4N5oNuw5O99Shx+x3o2btp+I1ljSSG61wpBLtD65oof7lKxhaWkxD9jWTzZ6uEIuG2rgDx919eD7Ug8DLE/cNBQw/llOueGD7mfLfNTVpvFpQwHBUStsshkI0QSigLah02sBnsjTmc1AsaHh/uH4EdoPW3f6pbalvQXkB6qAmYmrTeZp3CBpo9v/DYgYbuo+t+s1lj5w9tEXm1FEPyVVXbj0GY077+tBLuE6JCAYW+IpBZf7JhPIKGIFxr01VTupQjsSThiiiGZNp6AqlbVpI5zNf5XRuR7tdpDGAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAAAuCAYAAADwZJ3MAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUlSURBVHgB7Zzvdds4DMCRe/f9fBOEneDSCSJPUHeCcyZIOoGVCZxOYN0E6U1gZYKkE1idIOkEOMCkn3WqJEAiacmxf++hckMwpAn+AUEqAGeOmgsYCYho6PGJZELy/eLi4huMCKpfQo+/wNbvieqXwxkLNU6Kv7JxRh26bhOSx5r6rTgNBmY7Al1FulbmjXrhG3jCxqPHoiG5oDI+wICwoegxb0j+RvX7XNE/fFu63tSHV5I1yZLkCnrgRlobCQwEzwAoc1nJs8D+rNG2ZaKt42/gB/e0hOSO5NkZ429tZrRTpBHUrmE4jEIngXAkYNtyrW1LXwNWMSQZ6tcv7yk4Mpr6FRAHA/u2bJzdQhuwXDiPyLs2JTfv59DOPzAcBbQbkdO/Q1wM2LZM6xJjGZDh6XXZVHCJL9DcSA9k5AIGwnWwLy0qDyEcOSWLxrbE/k6Mlta5HK2zsC7ps3N0CyOB6jIjeS7Vjz/PGnQXGJe0rtCVkIkbdOPkFbvDeUQvFe2e6xJGiqvfRNBZKNpiU5I+JNVCV0KGVU1Fr12+DepYwwmAsgHXNXmuSG47tCXrbTtS7zWQ5n4OJ93QxylJpsiSYIctxilB7fhC8tUFLVJFFkOyXWJ+B0+ck3FDxikUhXN6FK8S97FUfu6mOXYwXkj+PaCz4QXV856+yw/6uBJU70jv6/YT9phC68D/OyJNJJU8K0H/UigzUZS7QbelQXmKu+7ynWrqs8B2nkHXlkuUuQ29jbhR6HyCQNAXeKAHrymJoGrAbmmWMDzaOOk9yIGEWVADuuk0F9QS8AStN8g9uetWg0fhHI4AN+VngtpVjI28dI7XK+hdIfX4PQaOhychfRLDgD8kBfTY61HeOXQfecfKi6Tg7YXWENvbWyj1uB6F+xxi1I+SmLHQ4LjRZwS1giShNeRPko8s9H/eX2XwDolhQI2X9RP6IXmwBcmUgwzlH7Jz5YIOKRwXRlKIYUDpANbn+kAipKdtpxe8SQbZSx4TRlKIYcCZkC4uzHWgjbS0jW7uGJooz6huuwlIoceXoAZUrlEZ9EOamrUdQ/SSx4DrsImgFs6ArkCNhyjtbfpi4J2A9qRBc3qTBTGgMx4XaATVzOOEXVo3DeruaQYL5cWgZDwjqLJj9uRlQBfSSunjM+hGwD30xBleMmLrDOA62hxGCtpTfm5Lzb415X+0G3k2VAJ2HWL5wxUyA31wNg1wv4XXuaQlnY9YflI5aTUB7Y2ARxgBuD+RMdCvLbOdw6Y14Axk77KNwrnwvrAHmQg6C7QHxxnsHRaeNn3qHxIDuvWtiQJKM1mMUFpdgVMIA/e6FOSeauD4Nu0aeAmZlmey2KG0olqgD4prfu+ZAmraMqYBc5KPoe910u/L6PEApwWv/Wy8X/a6MQzIo2ROhU1j3UOh38ujsI8RCziuoDa3X+qC8kWdQkgD5mBPvD8oQ1peOCNygLpQZsnBrsWSvpR+CHikpWDbstX52zkx7K3loOetJL63vqSyG08u3HSauRAee57sjk8q9dw2xu6EAru/NNo1dtu1LZkC9nXNqa5HEe6LggsuXDad+ne9ZXZmZGD7qwGqK39j4hD7wGC4a4FSmOlz03SO9m5o2x6y63R5pgvKy66PdescG0+Rd9SB7jpG82dGNKCNIWrDUDlY52D3GrgUvRn8DyqcBMpR2IfzizeHAN2tbAzLSbz6NhqcEVcYBu4M2mOcMyGhhp9j/7dcmeXZeCPAGZK9T83r36/OcAbeAf8BIoccO1vtVLIAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAjCAYAAABctgKLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAS9SURBVHgB7Zv/VdswEMe/6ev/zQZ1J2g6Qc0EtBNgJgAmIEwQOkFgAmACzATABBET4E6g3iGlNUE/LMnBwuXznp5D9BPrfHc6XybIGCllSZev+s+ryWQikCG0zildSiqfqfBnQeWe1nuHd+Kgm3oqXzJHRvDGU1lSeZRmbrUQx47v4lGPf01lQeUgZq4JD2Cp4yfuFD1AcxzSZddQ1dAcPw3tK7oszaPhJ/W5xMDQGmd0uaBSdGh+QmueIxDeZYTTUOH7c05z1t7WHgkrkAiP4ZhjZelz6+hzgYHR/9OjDGOOQGQ6Kyp7rjlYA7ikrCYp2kECNPwtXWaWakHjfzH0YcEoELgm6vcDygab5qnRE571udgJWYdnb0I4g9JCwjiJhz1EQn0PPWPbNMC1o8/SMZ+t3zV6goVMxhO0DtkvK2nQ6B86rIOdsSkC0ZMdII4Ty/eNo+612EU8s5h72RMFletNIegiALzgJcI5RpyahFaT7ByK1tf83U4GR8EZ4uF7WWA4Cigh+CuEXQSAYbVXdmy79uIrJMCevvYPCi5s9zM5V6c+wZ8wLAXUw/lEVwFgll3Ul1Yxx+gJ2vQHLninTw7XpuBjQKcCamOPPO2iVf8aLWhGYWubAFe7DaYmByjSnNRI0273yAP2z45iPM3SNiLXyTBWEeN8T5jPO7ePxDmHPAVswnGMaYgJWLOUdlMQ4yy+KbSDKhDHIfKB93DXJQCN5fsChuOdVJGuAv8HfEJpAvvMSXhyUf9rZi4B4PcANq97LlUs/AnpdvzOoOzmaNCnkX10F4JT6jN0/MJE6TMB+466ReuzzbYJDB+42Qr6hdQ3KAG3IahU1NbnOA/F1HkKYEmnp5sXvzBUszPENs0V3GC1J2RvIe0X66vlc++eN8UUqKmRGJewzC/osk9rYCEvoXIX+H6whrij+hvkTeE9BvIrYfoHOfxZGqpZ7dscwjPqe44t044R0DqbLu22sAYBtybIlq6nAJu9s22+wEhV/9joFAjSapw3dIFuzHNN39oG2gxtBqWaN5AS1nSOBHpMQZtXUf1DIv/lAPL9sOUgQPs+NZRvkmNO411oIMh39BEYuerXji9HETkzqYI/FF1CHalXUuUPFsiHJkgAtAS7Nni0ql+qNDA+7rIZjH0jWFG51UKUA5fBoWCdKFobqkar+vVTy5tfIh0WnoXMI8P5JuZdALNpCgRGqvpbm1+gX44H1gScWymiBMBgCsbs9Se/3naNPaBP8JTyH6sB2qZgzKq/xBYiiC1i0+1S4WyrK/4QkhBiYh95YTuhzBBHb5lNDjikXvaZtu5BoJXUE60BGFb7mal+mwBM20cw7dEfuNSvrivxOqRkGody1N6zJAHIEFfkrYI6i3N0hs/xbMI+O9rHprTHUGH78MNRbf6sbmwC0GfCRYnXYyoTfkTaAQGVUv/CVxuVAGg7WqMfYv2GWL6if/ipn1P5ZnsvkeoE5gg7pknn9i0/jTb6FDjeeDZxv2jjnVlLoxMA/eaSfzzKHnyFOGJDvSkUiEdA+T81AhNR+NfB3y11D315+Dp/0PSLmN8m1aTfttlU4r1PqlvjFHieqbPGmbGj+7kcxG3w4l449uapPZXH1ESXPzSxXZJw46hxAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAeCAYAAADHCUctAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAU5SURBVHgB7Vvtdds6DEVy+v9lg+pNkHSCsBPUnaDOBHEmsDJB+iawO0GyQZQJ7DdB1AnaTsDimkBFq7KoD8qOE91zcGhZImHRIHgJkCfEsNYaLi5Z8pOTk28UCdxuwsWdtHsTeNZw8YX64Zb15LRbx5SLT3L5EPldDRfXLGcsy5htV+i64OKR3DtcBZ7F75mxnMtvCyEX+Z9lXdefZUWp3cazKO8NdK42GnhuauPguqWOGcV5z7SibUMDwXuX5wbPLmw/rFi+WOcUduIduVEEZCywdFSAF7mi/eG993nC8pM6gEfPU83tcylzlrXoueMOyrjemjrCOu8wl8uvLIZcP8K7ZnR4XEiJd0ypvm8TkQuvhCxxk98VHj+trOlZ3iXLxEYcrba5RzKe3pQGgDcyF3K90lFtO3pgjFKpvxm5VXqGgG3nkfT3zakl5P2mXhvaX0n52VP/gq3tgdyoAuY24M5igfVm5EaL6k1peHwm550SlnvqhoXUz6W9VwXwIxbwvX+p+H8SlpV44j84rah/S65jMErvbSS+FAL/WOhN5XJwYxISqdO3aatPnjdy+bkxKT1SyP8Dg8rJ2caj72hOKypgDsXoQunP/4PjAMaUcXHj6TNN6lm3+tN+mfXhWMcEGSwfydnGxtH8uenNfZd+JXAk756hDmjKkSrqzW1kzlTHXfi7pdz7EZrOS7zoro2eWNgXR6pp0+fSc/2y0pDk3n3TDt6hsJMhSd15TGMKGNKZ1+GY/892tOE/99xWTywc2pCk3Ue1DVyfBp4Hh8jJubHBOqYKMs0ph5lXjf6IuuCq1WXXTecpFeT6I71t3EqJwWVqDUk62CekUQJ4TYEVg6d/NuQol/n/xtO19a5yrTG36Wsn1yEIv9SY1KeQR9IKGhJAAM/QHlEypunAxrSk7fDHZolri1QPkAYCn28JmZQmaEiA5Mm00sIOHBIQLpLKPDzZszHpu2r4Q/NawFKm3BEOuZRnjQxJgD8SriyhYnRGh0whIJHgKYZcMlm9BXhJTh1TKC2g3DBhWVHBi25ohI9cyqSxIZUCeNPYfEm8EEY+jBTeALEZ4+8awDSLKGtoJ0FfyLv6keoNGRfOOKLAL/3QxiMNnUKBERn5DB7y4ZBcRIKMMNic5eqtk+sd+EfKn60MSbCVQqEIkDiR5m5mL4WH8O/4Kh7wgUZUIZEyb21I5RRKpPiObmgDmf2PRhwLdPDnXTySun31GrM+IQGsyqiw7HFFdCSQlbuRy4dOhgTA7VMRErjvwZd0w9l65CFHhYn3+amzIQl0T8/eUygjDg5NI4GO5L0MKVIKRZfUe9n3NKI/ZHGUyOWGjvT1SFUplIt2LWxOKwDJvtMvI9pD/iP1RqnSkd6GBJRSKG13VYK4q1e6po7QgGbdNpAR/WDdhj4N+Wyli6IYkqBTCkWmR/1BE9th75EYjgY0ExoRFTJIMeuAB+u5va1TRtEMqbQNo1UKpbQC3Ow9aroKFFeLfJgf0BxTGREgGxNTcrlPnS1mVYcy31FEILHKirGchxFtTtjKrSZ7mrEChNs0Uh/eKeMSJ1bXvnGIkeHE7ISKWAbuz4Y84XrkQH9+DzyDlEciYmh7AZRRXarIFrikCBA3uLLbaMx97N/nqHzs+n5hw3utF/osDQj78rbazm13PEv985AeeCRMK0msBKl4jg/WGWZC7tx/47Zluwg825Sc19FTn+SVOTkvl7F8aziVwVNhhA2dgkH7iegbCmsq3r8WIMTWeaImZ/9zcp4d5dOrpAjcGe8hNOJF4jf9Ajp09a6TmAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJsAAAA8CAYAAABxeMjaAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAgzSURBVHgB7Z3/fdo6EMCPfvp/2eCpE5ROEGeCphOUTBDeBPAmSDoBZIKmE0AnCJ1A7gThTXDVRScsZMn4JzZE389HH2PZkoV11p1OsjyCjkFEoTaJCp9UoN8TFcYcDDsVUt5u+fev0Wi0hUikCCVgiQr3KrxgMyj9UoUbiEQMSiDGKiywuYCFkCx4AiJvkxMImY9lFLrzYwQNUBU+U5s5HNpfIYxdZmwyFwGHNl2Z/L4ru24BkcuFWhUV1iVaIDrnToV/KuY/UWGqwo8S15CxlbtQUBv/RSqTjs1VKNM6lbmeYMGTR675DSKXg6rQ2amELHD9Y0K3gMj5g7oTEOK+SyFzyjFmoY4Cd4kUCBq1ZlfQA6jtOhkF7oLAsOqU2LNhjtqee44CdwFw6+GDKvgkavMYqNXqKlDOOPJwDnCrIYcsaDbod5O89N36RkqA2kvvIodaedzC+VTqGiLDBbWL4exaCW6NfT7A6IMbKuhXn3dwBqB2OvselMGp/jdPoFVbwhmBfhNgDpFeyQ3EU6sGekDc5qMa8E6hBK6qddNRywPZREpqbcwA/W917gZagFsxCfkJmvQ/dhDpnzZaNVcFW/FjPD4NSWJL04fQP8pwFqbAmwD9MzlExTxkQNgElkdiQ6Me/cIde6ZDICAMP6Ai2I6wGRbQANRjti6VpjtF2uO99TvxHF9B+9DkyQ1kkyjHfG3y9gvn3DnJa4MJkj9VmDlxUxX+gwqgtjPLsB2CTchaYcq7VKZ/S6azJ67u7BeOnGM+yv93zHvgX6AGWGyzXR1JG5pCNIOaYAuqFKuxgJ7BQ3u19P/FQzNq6RyTx//6q1M9aP68s35PnGMbaBGSehV+HTlnpTbXkJ82Psf6frKVsz/Bbn1uVNa3OiZLMrTCwEjTqxrlA+7BDfQAuUpUeUjgniFrtmlLPclK6o/57exTXgK0Gq/DkyetgExtEXd83qWyhcN7YEwhU19ChbWqx8851Yp+r3uteWoYUKM18nHdMHXVuq9jUqmnWyYt5l0t44L8xtjQvcP/a1yiLF2o0XmJ6xIHHUyjRj950v6GHmGVaj8VVEETqEjAGS2gfX4WHUT9QK/5oaFgKu+5QIAlh7UnD3Jav3D6SvcF9WTYfd7Yklmh7jVpngcr6sYumxG2sSfhEDztK2f/E9QjdfYFtI9d4al9/1hYKCSQv9fGzvE5z4UJqDtJvjwofWmBwez1S8FRty3XNQmcnd9eQxphE06CFIZB6uwLqEebN1NwC2MHstFs1bJw0mx4u4LMxfNZBdslMcVwr5sE6Z5/7zi/1Dl+1DRQ+U+dfL6WHYYsCwuubc8l5sd7GDb/Qzu4wiagPgsovs5C3fBHJ/67Co9Oxf5RYasE4IOV5xc4VEMG02otWFWZTp3diSpUpazO7q2o2w4X7qF8E/4tTOQ7GDYf4Lygir/B/GSEnRE0NuyFdY5tGxcJzMoIGueZwmGPV4QS8rXWkAnmTKXvsre88/0eesuWOPttPYlN1OoK/G6hBLT7g7ZkQ+27/WxPkYokVSdMAtSdddeFUHRdlxSOI+BQ0MjT/x26xfvQGGFLnXgBPYPZum42dXvIwtlvImwbj5okHq0y0/bVL8iCRpU9sa79ZJUrgW4Rzj45talle4DusIVt/zAZNZq7+dj/gPUUDp/0bQNjVjj7KXTDxvp9w9spZDefhIzm1N1yIOf1V+geql+7MzLHjqb4ox6uE1bUXl0bYfvjSfcReoKNWddxWOtJDPigujKME0/cF+v3k8fN0GZP2Ueqwmduycw9pIe49dnX3Nu16y21hyiNGvXdfPJpbeDEoJ5h4U5tSgOqqwzCE9ekggXmZ4GY4Ro7fuu5Fgn+/n9w6+J66ict9xJTSyNQB8O4XpIG6nTCgmX4wPkmVhz972tvaszPjqg8l43zkXYmVjxV0jLUfKMewnlAPwJqgp73EaAiWJ39m2iYH3Zbc5nWmN1zaR8PXPfKU655IJ03no+5Q5OJdWxtxdeZ9WGg/5XTKLbrw+0KU6GKekd1mIIeplmjntg45y3dEBqC8U3bnjV0PCbO/ga6ZaPCtSkzD7s9OOWZQlaur3BCDcLvedjlWbZYz9SarUCr7VzrbLs+3INUAJLODbRPAsd7YVTwWQP1aVSycKKfoDqLEue8es5906ho8qIqC/WkyX4bQzYKQI7enTq25Tg6tg1c12dX/7LOSUvE2+Wx1bvg6z5CVt9uz/8Bwq6ZHWQrvB83UVCrMZc6Ew2lnYEVL7A8a6wx6O4py9KTt4BI/2C3L7yMsXhp1Bc+3soSXAHhfoZIb7gjCNRbSZw46sreQkO4eb1GbR9QT3cMWbNMTXY6anf2wdQTV8t9EukI9Pc6RN300APoX/NDQqRXfAPxvqnXrTsAO8a3XP4KIsMDG7zh1HfLhv63+iXGhWWGCYZXAhIl0sq+hA3DCxhWeucgcmLQv5KjPCZwfQkb6t6uT9DikgtDp6DyCpc57VHYaj0ckYGANRZwPrWwYVzA+XLAikvT4wmFDYuXpp9D5PzA8BdVJDrGN55I2FB3YmQUtAsEiz/h88U6T3YpbFg8FSkK2qVQIHDfrHNkV8KG2of2EgXtjaAq9Abz6qszYcNyX2qOn4C8VDD/cdtWhY3zv8NyH9ClDoKAyOCp9d4oz0KlGRxTyL+Y4gWz+fYphD/bPYFsFfFjmLfPu34HMjIUuBWaWPvS17JhvTV1Q5zs+6aRAeOqPiu+qbB1/qXmyBnCgkWtj3Ti6gjYUoWrKGTnzwhOBAsLvR5IWwH5r6+YpZZSyF6eaPP9yUjP/AWAjNmVqO0z0AAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABBCAYAAABo3gIBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXjSURBVHgB7VzhVSM5DFby+H/ZCs4dwFXAUAFcBaQD2ArCVgBbQdgKYCvIUEFCBZmrIKECncV4XhSN7Blie+Dty/eemcRWbFmWZVkeM4KBgIiFfSwgHbYuVez5Qs/RaLSCAzGCgWAFcmUfTzAMSEClTc82vVgBVfDVYAUyw8/D3CbTh88xDIcz+DxMbVr3EcyQU2YJulAqqNWbMLHJQF7h0XS6tdPoF+QASdymAmujGaKToBE799Ceu/KcuIPEgigUpun7mUJ7ptCZHvXnxh0kEoYJNDJX6K8EzSyyjZS45e0ealRNoOy3kncqvm+hGwUMg3vsmO69QJIVkt5g7WtotE+CdmnTJFA3accah0MahxF3vsUaAzaBGlSYUIWCum0aAgUkEEgzz6876DYeJu499X0G3rUk1jEz7ln5CLDWHN/0kHuOoGAzgzRzEiuQZrUoAjRGyfM5R/S9gs/D5UGeKtZzn5bXxohSBy+0XSbWfsklo6P029JuA3WTw6ZplXFPqrMAv+YdisegQFxnpKNFzF55mKHdZWnTG8/zdT4Wlr8p1FpqIA1WXQ3eYzyyb+psG4+YBusuDSHLW8Dh2Frt+AaZgfU0o82jgUh0GdXYOVrBAHBT8gESwCsQJ/VYda9gOCTZzoc0xEA8Do5tfhROS2KN9/aPEYhDVoGcQjz+g2ERbfNCAoleLmOOAz4KZ/NiBZJ1ygw9XVL4O2VODcninQZwCfFYqQJJ5F0OrSFXEAk7xV98GpJi01TBQMA6LmogDiX98QkkxQoziIZgHW/pDFr3wCP98QnEQDxeITOcMGi/lUKj6aDcK5Bog5pry98A661/kg0dUBwkdCCO/hhoX6R87YHzNbHpBvWgdQxM08aJ1ih8kV0u7uyDYSk19rTjRCH4Sksu8TKFvPjBv2g2xEA8KkiDFKtdCHfSdowzMZFqU5cz/LiywvghM8c5mEi4qTOQB5VN/2oFmkBiDWpKhyyHhjRHJpVWmENDkvgfmCdaHxQGYZyBiVQakvoQqgLPYRqH1BADaRpOgZQrDAnhoo9tG2dgIpWGFJAGD1YQ//R9V1U6ZimmTKpNXeyUKW36/tEVb5yYiZSbukMHp7SpsHxcjA5Y/lNrSAUJ4Iz7RwangjqeUVLUCyJwwpj4Mps6CPPRvOi/coneLkh23LF32G2F8jfE4S3FlHGD81eu+o844ogjjhgI76sM9jvbKLPdMWFwPsgNy/rZ5WBhHYHnV03oLcdnrF819x1x0mq1UvuE7dsKPiwhM7COqnN0OovYjsJfuvynHn1a8zYa111u6h6h3vkWsO9snaF+H8a41Nuxw/pIwShFMq+Cbkietp66wNPeYo93RZI3rGwmyiYunzp0h+0znDUXGrYvD5EGzAX9NaNf8DKW/yDqeXI8TLCNhkfJ2zXWt7Wm2L5gMOMCWYrCc9bptfyRyw8dZm1Y3X2m48bDy8K19Sjo7xl9odWFiqC4WmAtFI4lL5SdWzjGeP5MYYLK6eXeGQqJBzRsg/r1D22059gerJnomLQ5C4+gluJ3RpSvfSodwq37zSWyaeXy+IUiPuJ8Oq7R2Q3R0Y2nExKt2xLYftv6PiQoZVD3ysmoSkNIS9E77Ofvoux9dGwRXSP75Solhki6/O4LXyYN+1x5IlcNfZdRflPypEGtlHZ5Gw2utXISyKmnQur4gyhrjNXUPkgIJFX6/Ay7u7eErYfhlSe/oZe8yAGZY3slaw2oUj+haj5g7Z9MRflP+kMCMZ4KmzdzOEqn8nPHCMUivtkkGX9fUrG9RFeuXplfQrsTKzcgJa/Xtd3wp71t/cpoOa7c9KWBlP+DYHekiW2nZok7o8qxaTrJ8p5c3g22DTPRyRWmWb0KT/7eCuPypPFDN8Ka/eO2qy/2PXTs9y7IAvd9i6VSzo3b0tHNBF0z5VRvVOTxpVXWQzyTFkqBLzyC0rBA5Wb5wXf/XScoqlU1ITzXYbIDr6HIFoqIGPs9j9jtRcewHc1762jDG/0LhRz/B+qZMIePyz8jAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import {OpenIDConfiguration} from '@criipto/auth-js';\nimport React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../context';\nimport { acrValueToTitle, filterAcrValues, Language, stringifyAction, acrValueToProviderPrefix } from '../utils';\nimport AuthMethodButton, {AuthMethodButtonProps} from './AuthMethodButton';\n\nimport './AuthMethodSelector/AuthMethodSelector.css';\n\ninterface Props {\n acrValues?: string[],\n language?: Language,\n onSelect?: (acrValue: string) => void,\n redirectUri?: string,\n popup?: AuthMethodButtonProps[\"popup\"]\n}\n\nfunction lowercaseFirst(input?: string) {\n if (!input) return input;\n return input.substring(0, 1).toLowerCase() + input.substr(1, input.length);\n}\n\nfunction isSingle(acrValue: string, acrValues: string[]) {\n const provider = acrValueToProviderPrefix(acrValue);\n const count = acrValues.reduce((memo, acrValue) => memo + (acrValueToProviderPrefix(acrValue) === provider ? 1 : 0), 0);\n return count === 1;\n}\n\nexport default function AuthMethodSelector(props: Props) {\n const {fetchOpenIDConfiguration, action, uiLocales} = useContext(CriiptoVerifyContext);\n const language = props.language || uiLocales as Language || 'en';\n const [configuration, setConfiguration] = useState<OpenIDConfiguration | null>(null);\n\n useEffect(() => {\n if (props.acrValues) return;\n\n let isSubscribed = true;\n (async () => {\n const configuration = await fetchOpenIDConfiguration();\n if (isSubscribed) setConfiguration(configuration);\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [props.acrValues]);\n\n const acrValues = filterAcrValues(props.acrValues ?? configuration?.acr_values_supported ?? []);\n\n return (\n <div className=\"criipto-eid-selector\">\n {acrValues.map(acrValue => (\n <AuthMethodButton\n acrValue={acrValue}\n key={acrValue}\n onClick={props.onSelect ? (() => props.onSelect!(acrValue)) : undefined}\n redirectUri={props.redirectUri}\n popup={props.popup}\n >\n {stringifyAction(language, action) ? `${stringifyAction(language, action)} ` : ''}{acrValueToTitle(language, acrValue).title} \n {isSingle(acrValue, acrValues) ? null : lowercaseFirst(acrValueToTitle(language, acrValue).subtitle)}\n </AuthMethodButton>\n ))}\n </div>\n )\n}","import { OAuth2Error, UserCancelledError } from '@criipto/auth-js';\nimport React, { useContext, useRef, useLayoutEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../context';\n\n// Inlined types less readable (for library developers) but improves intellisense for consumers\nconst QRCode : React.FC<{\n children?: (props: {\n qrElement: React.ReactElement\n isAcknowledged: boolean\n isCancelled: boolean\n error: OAuth2Error | Error | null\n retry: () => void\n }) => React.ReactElement\n}> = (props) => {\n const elementRef = useRef<HTMLDivElement>(null);\n const {client, buildOptions, handleResponse, pkce} = useContext(CriiptoVerifyContext);\n const [requestId, setRequestId] = useState(() => Math.random().toString());\n const [isAcknowledged, setAcknowledged] = useState(false);\n const [isCancelled, setCancelled] = useState(false);\n const [error, setError] = useState<OAuth2Error | Error | null>(null);\n\n useLayoutEffect(() => {\n if (!elementRef.current) return;\n const promise = client.qr.authorize(elementRef.current!, buildOptions());\n\n promise.onAcknowledged = () => {\n setAcknowledged(true);\n };\n\n promise.then(response => {\n if (promise.cancelled) return;\n handleResponse(response, {\n pkce: pkce && \"code_verifier\" in pkce ? pkce : undefined\n });\n }).catch(err => {\n if (err instanceof UserCancelledError) {\n setCancelled(true);\n return;\n }\n if (promise.cancelled) return;\n\n setError(error);\n handleResponse({\n error: err\n }, {});\n });\n\n return () => {\n promise.cancel();\n };\n }, [elementRef.current, client, buildOptions, handleResponse, requestId]);\n\n const handleRetry = () => {\n setAcknowledged(false);\n setCancelled(false);\n setError(null);\n setRequestId(Math.random().toString());\n };\n\n const qrElement = <div ref={elementRef} />;\n if (props.children) {\n return props.children({\n qrElement,\n isAcknowledged,\n isCancelled,\n error,\n retry: handleRetry\n });\n }\n\n return qrElement;\n}\nexport default QRCode;","import { useContext } from \"react\";\nimport CriiptoVerifyContext from \"./context\";\n\nexport default function useCriiptoVerify() {\n const {result, claims, loginWithRedirect, loginWithPopup, acrValues, isLoading, logout, checkSession} = useContext(CriiptoVerifyContext);\n\n return {\n result,\n /**\n * The claims of the decoded id_token (if available)\n */\n claims,\n error: result && \"error\" in result ? result : null,\n loginWithRedirect,\n loginWithPopup,\n acrValues,\n /**\n * Will be true when performing token exchange after redirect or during an initial SSO check\n */\n isLoading,\n /**\n * Check if there is an existing SSO session.\n */\n checkSession,\n /**\n * Clear local session store and logout of any existing SSO session\n */\n logout\n };\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","require","stub","Error","initialContext","loginWithRedirect","loginWithPopup","checkSession","logout","fetchOpenIDConfiguration","buildAuthorizeUrl","generatePKCE","buildOptions","handleResponse","responseType","completionStrategy","result","claims","domain","action","pkce","undefined","store","sessionStorage","isLoading","client","createContext","autoTitleCase","input","split","map","segment","replace","length","toUpperCase","substr","join","stringifyAction","language","x","assertUnreachable","acrValueToProviderPrefix","startsWith","slice","acrValueToTitle","provider","title","subtitle","suffix","endsWith","filterAcrValues","original","dkmitidMethod","forEach","s","newLevel","oldLevel","includes","lowestMitIDValue","filter","concat","sort","b","indexOf","SESSION_KEY","ACTION_SUPPORTING_ACR_VALUES","buildLoginHint","params","options","acrValues","Array","isArray","hints","loginHint","push","some","v","props","redirectUri","window","location","href","useState","clientID","configuration","setConfiguration","useEffect","isSubscribed","setResult","useMemo","id_token","setIsLoading","setPKCE","response","uiLocales","sessionStore","now","isEnabled","refreshInterval","setNow","Date","interval","setInterval","clearInterval","useNow","useCallback","refreshPKCE","clearPKCEState","state","prompt","buildAuthorizeParams","_redirectUri","processResponse","code_verifier","redirect_uri","then","code","setItem","catch","err","error","OAuth2Error","error_description","removeItem","context","redirect","authorize","popup","acr_values_supported","hasMatch","parseAuthorizeResponseFromLocation","match","token","getItem","exp","console","finally","children","testUA","pattern","test","navigator","userAgent","getMobileOS","MSStream","SEBankIDSameDeviceDesktop","links","onError","onComplete","onInitiate","initiated","setInitiated","useContext","poll","fetch","pollUrl","status","targetUrl","json","text","setTimeout","onClick","SEBankIDSameDeviceAndroid","onLog","onVisible","deps","visibilityState","useRef","document","setState","current","addEventListener","_handleVisibilityChange","removeEventListener","nextState","usePageVisibility","toString","completeUrl","STATE_KEY","autoHydratedState","rawState","JSON","parse","hydrateState","SEBankIDSameDeviceIOS","stringify","mobileOS","SEBankIDSameDeviceButton","setHref","setLinks","setError","log","setLog","defaultRedirectURi","handleLog","statements","logs","handleComplete","required","completeResponse","url","URL","searchParams","from","keys","reduce","memo","refresh","responseMode","encodeURIComponent","newHref","launchLinks","universalLink","customFileHandlerUrl","handleInitiate","handleError","element","className","logo","AnchorButton","Button","type","AuthMethodButton","acrValue","backdrop","setBackdrop","handleClick","event","savePKCEState","response_type","pkce_code_verifier","willPopup","onHide","preventDefault","src","acrValueToLogo","alt","inner","isSingle","count","AuthMethodSelector","onSelect","substring","toLowerCase","elementRef","requestId","setRequestId","Math","random","isAcknowledged","setAcknowledged","isCancelled","setCancelled","useLayoutEffect","promise","qr","onAcknowledged","cancelled","UserCancelledError","cancel","qrElement","ref","retry","useCriiptoVerify"],"sourceRoot":""}
|