sales-frontend-solution 0.0.19 → 0.0.20

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/dist/index.cjs CHANGED
@@ -11,10 +11,10 @@ var React2__default = /*#__PURE__*/_interopDefault(React2);
11
11
  // src/v3-provider.tsx
12
12
 
13
13
  // src/utils/load-script.ts
14
- async function loadScript(url2) {
14
+ async function loadScript(url) {
15
15
  await new Promise((resolve, reject) => {
16
16
  const script = document.createElement("script");
17
- script.src = url2;
17
+ script.src = url;
18
18
  script.async = true;
19
19
  script.addEventListener("load", () => {
20
20
  resolve({ loaded: true, error: false });
@@ -422,20 +422,10 @@ function Keypad({ value, onChange, mode, maxLength, inputElement }) {
422
422
  }, []);
423
423
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: cloneElement });
424
424
  }
425
- var url = (() => {
426
- const url2 = typeof window !== "undefined" ? window.location.href : "";
427
- if (url2.includes("localhost") || url2.includes("dev")) {
428
- return "https://nxl-nlc-dev.hanwhalife.com";
429
- } else if (url2.includes("stg")) {
430
- return "https://nxl-nlc-stg.hanwhalife.com";
431
- } else {
432
- return "https://nxl-nlc.hanwhalife.com";
433
- }
434
- })();
435
- function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }) {
436
- const baseUrl = env === "prod" ? "https://nxl-nlc.hanwhalife.com" : env === "stg" ? "https://nxl-nlc-stg.hanwhalife.com" : env === "dev" ? "https://nxl-nlc-dev.hanwhalife.com" : void 0;
425
+ var baseUrl = salesFrontendUtils.getNlcHostFromEnvironment();
426
+ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }) {
437
427
  const buildUrl = React2.useCallback(() => {
438
- const targetUrl = new URL("/auth/v1", baseUrl || url);
428
+ const targetUrl = new URL("/auth/v1", baseUrl);
439
429
  targetUrl.searchParams.set("bizCode", bizCode);
440
430
  targetUrl.searchParams.set("tmplCode", tmplCode);
441
431
  if (nlcCtfnId) {
@@ -502,7 +492,7 @@ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }) {
502
492
  return;
503
493
  }
504
494
  const handler = (e) => {
505
- if (strictOrigin && e.origin !== url) {
495
+ if (strictOrigin && e.origin !== baseUrl) {
506
496
  return;
507
497
  }
508
498
  const d = e.data;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/load-script.ts","../src/api/endpoint.ts","../src/v3.ts","../src/v3-provider.tsx","../src/libs/xkeyboard.ts","../src/types/keypad-message.enum.ts","../src/types/keypad-mode.enum.ts","../src/utils/uuid.ts","../src/hooks/use-keypad.ts","../src/components/Keypad.tsx","../src/hooks/use-nxl-one.tsx"],"names":["url","isClient","getEnvironmentFromHostname","getServicePath","createContext","useState","useEffect","jsx","useContext","KeypadMessageTypeEnum","KeypadModeEnum","useCallback","useRef","React","Fragment"],"mappings":";;;;;;;;;;;;;AAAA,eAAsB,WAAWA,IAAa,EAAA;AAC5C,EAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACrC,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAMA,GAAAA,IAAAA;AACb,IAAA,MAAA,CAAO,KAAQ,GAAA,IAAA;AACf,IAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,MAAM;AACpC,MAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,IAAM,EAAA,KAAA,EAAO,OAAO,CAAA;AAAA,KACvC,CAAA;AAED,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAO,MAAA,CAAA;AAAA,QACL,MAAQ,EAAA,KAAA;AAAA,QACR,KAAO,EAAA,IAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACV,CAAA;AAAA,KACF,CAAA;AAED,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,GACjC,CAAA;AACH;ACjBO,IAAM,aAAA,GAAgB,CAAC,WAAwB,KAAA;AACpD,EAAI,IAAA,CAACC,6BAAY,EAAA;AACf,IAAO,OAAA,EAAA;AAAA;AAGT,EAAM,MAAA,GAAA,GAAMC,6CAA2B,CAAA,QAAA,CAAS,QAAQ,CAAA;AAExD,EAAA,QAAQ,GAAK;AAAA,IACX,KAAK,OAAA;AACH,MAAA,OAAO,CAAG,EAAAC,iCAAA,EAAgB,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAA;AAAA,IAC/C,KAAK,KAAA;AACH,MAAA,OAAO,eAAe,WAAW,CAAA,uBAAA,CAAA;AAAA,IACnC,KAAK,KAAA;AACH,MAAA,OAAO,eAAe,WAAW,CAAA,uBAAA,CAAA;AAAA,IACnC,KAAK,KAAA;AACH,MAAA,OAAO,eAAe,WAAW,CAAA,mBAAA,CAAA;AAAA,IACnC;AACE,MAAO,OAAA,CAAA,CAAA;AAAA;AAIb,CAAA;CAE6B;AAAA,EAc3B,kBAAoB,EAAA,CAAA,EAAG,aAAc,CAAA,KAAK,CAAC,CAAA,8BAAA;AAC7C;;;AChBA,IAAM,YAAY,MAAe;AAC/B,EAAO,OAAA,UAAA,CAAW,KAAK,SAAU,CAAA,SAAS,KAAK,CAAC,OAAA,CAAQ,IAAK,CAAA,SAAA,CAAU,SAAS,CAAA;AAClF,CAAA;AAoCA,IAAM,SAAS,MAAM;AACnB,EAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,EAAA,MAAM,MAAM,cAAe,CAAA,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,SAAY,IAAA;AAChE,EAAA,MAAM,MAAM,cAAe,CAAA,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,aAAgB,IAAA;AAEpE,EAAA,IAAI,OAAO,GAAO,IAAA,MAAA,CAAO,YAAY,GAAQ,KAAA,WAAA,IAAe,QAAQ,WAAa,EAAA;AAC/E,IAAO,MAAA,CAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA;AAE5B,CAAA;AAEA,IAAM,aAAA,GAAgB,OAAO,IAAiB,KAAA;AAC5C,EAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,EAAA,MAAM,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAAS,GAAG,CAAC,CAAA;AAEvD,EAAA,IAAI,CAAC,SAAA,EAAe,IAAA,CAAC,OAAO,UAAY,EAAA;AACtC,IAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAE1C,IAAO,OAAA,IAAA;AAAA;AAGT,EAAI,IAAA,MAAA,CAAO,UAAW,EAAA,KAAM,OAAS,EAAA;AACnC,IAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,IAAO,MAAA,EAAA;AAEP,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAS1B,EAAO,OAAA,KAAA;AACT,CAAA;AAEO,IAAM,WAAW,YAAY;AAClC,EAAO,MAAA,EAAA;AAEP,EAAO,OAAA,MAAM,cAAsB,CAAA;AACrC,CAAA;AC/FA,IAAM,SAAA,GAAYC,qBAAyC,MAAS,CAAA;AAEpE,IAAM,aAAgB,GAAA,6CAAA;AAEf,IAAM,UAAa,GAAA,CAAC,EAAE,QAAA,EAA8C,KAAA;AACzE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,gBAAkB,KAAK,CAAA;AAEvD,EAAAC,gBAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAa,YAAY;AAC7B,MAAA,MAAM,WAAW,aAAa,CAAA;AAC9B,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,KAClB;AAEA,IAAW,UAAA,EAAA;AAAA,GACb,EAAG,EAAE,CAAA;AAEL,EAAO,uBAAAC,cAAA,CAAC,SAAU,CAAA,QAAA,EAAV,EAAmB,KAAA,EAAO,EAAE,QAAU,EAAA,MAAA,EAAQ,QAAS,EAAA,EAAI,QAAS,EAAA,CAAA;AAC9E;AAEO,IAAM,QAAQ,MAAM;AACzB,EAAM,MAAA,OAAA,GAAUC,kBAAW,SAAS,CAAA;AAEpC,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAM,MAAA,IAAI,MAAM,wDAAqB,CAAA;AAAA;AAGvC,EAAO,OAAA,OAAA;AACT;AC9BA,IAAM,OAAU,GAAA,CAAC,OAAiB,EAAA,GAAA,KAChC,CAAe,YAAA,EAAiB,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAY,CAAA,eAAA,CAAA;AAE/D,IAAM,SAAoB,MAAM;AAW9B,EAAO,OAAA,KAAA;AACT,CAAA;AAoBO,IAAM,2BAA2B,MAAM;AAC5C,EAAI,IAAA,CAACP,6BAAY,EAAA;AACf,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,MAAM,MAAO,EAAA;AAEnB,EAAA,MAAM,iBAAoB,GAAA,CAAA,EAAG,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAC,CAAA,oBAAA,CAAA;AAChD,EAAA,MAAM,kBAAqB,GAAA,CAAA,EAAG,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAC,CAAA,qBAAA,CAAA;AAGjD,EAAC,OAAe,cAAiB,GAAA;AAAA,IAC/B,OAAS,EAAA,SAAA;AAAA,IACT,MAAQ,EAAA,iBAAA;AAAA,IACR,WAAA,EAAa,GAAG,kBAAkB,CAAA,GAAA,CAAA;AAAA,IAClC,OAAA,EAAS,GAAG,kBAAkB,CAAA,mBAAA,CAAA;AAAA,IAC9B,WAAA,EAAa,GAAG,kBAAkB,CAAA,aAAA,CAAA;AAAA,IAClC,0BAA4B,EAAA,SAAA;AAAA,IAC5B,sBAAwB,EAAA,mBAAA;AAAA,IACxB,0BAA4B,EAAA,+KAAA;AAAA,IAC5B,yBAA2B,EAAA,IAAA;AAAA,IAC3B,mBAAqB,EAAA,IAAA;AAAA,IACrB,cAAgB,EAAA,KAAA;AAAA,IAChB,sBAAwB,EAAA,MAAA;AAAA,IACxB,YAAc,EAAA,EAAA;AAAA,IACd,aAAe,EAAA,CAAA;AAAA,IACf,WAAa,EAAA;AAAA,GACf;AAEA,EAAA,QAAA,CAAS,gBAAgB,MAAM,KAAA;AAC/B,EAAA,QAAA,CAAS,cAAc,MAAM,KAAA;AAC7B,EAAA,QAAA,CAAS,gBAAgB,MAAM,KAAA;AAE/B,EAAA,MAAM,UAAU,QAAS,CAAA,IAAA;AACzB,EAAM,MAAA,aAAA,GAAgB,CAAC,mBAAmB,CAAA;AAE1C,EAAA,MAAM,OAAO,aAAc,CAAA,GAAA;AAAA;AAAA,IAEzB,CAAC,CAAM,KAAA,CAAA,EAAI,OAAe,cAAe,CAAA,WAAW,IAAI,CAAC,CAAA;AAAA,GAC3D;AAEA,EAAQ,OAAA,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,UAAW,CAAA,CAAC,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,MAAM;AACrD,IAAM,MAAA,YAAA,GAAe,QAAS,CAAA,cAAA,CAAe,SAAS,CAAA;AAEtD,IAAA,IAAI,cAAc,UAAY,EAAA;AAC5B,MAAa,YAAA,CAAA,UAAA,CAAW,YAAY,YAAY,CAAA;AAAA;AAGlD,IAAM,MAAA,WAAA,GAAc,QAAS,CAAA,aAAA,CAAc,MAAM,CAAA;AACjD,IAAA,WAAA,CAAY,EAAK,GAAA,SAAA;AACjB,IAAA,WAAA,CAAY,GAAM,GAAA,YAAA;AAClB,IAAA,WAAA,CAAY,IAAO,GAAA,UAAA;AAEnB,IAAY,WAAA,CAAA,IAAA,GAAQ,OAAe,cAAe,CAAA,OAAA;AAElD,IAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAAA,GAChC,CAAA;AAED,EAAA,MAAM,UAA2D,EAAC;AAElE,EAAA,MAAM,SAAY,GAAA,CAAC,IAAiB,KAAA,OAAA,CAAQ,IAAI,CAAA;AAEhD,EAAM,MAAA,SAAA,GAAY,CAAC,IAAA,EAAc,MAA6B,KAAA;AAC5D,IAAA,OAAA,CAAQ,IAAI,CAAI,GAAA,MAAA;AAEhB,IAAO,OAAA,MAAA;AAAA,GACT;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,IAAiB,KAAA;AACrC,IAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,GACrB;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAA,CAAO,IAAK,CAAA,OAAO,CAAE,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACnC,MAAM,MAAA,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,MAAI,IAAA,MAAA,IAAU,MAAO,CAAA,MAAA,EAAU,EAAA;AAC7B,QAAA,MAAA,CAAO,KAAM,EAAA;AAAA;AACf,KACD,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,SAAA,GAAY,CAAC,IAAiB,KAAA;AAElC,IAAA,OAAO,SAAU,CAAA,IAAA,EAAM,IAAK,MAAA,CAAe,UAAU,CAAA;AAAA,GACvD;AAEA,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF,CAAG,GAAA;;;ACxIH,IAAK,qBAAA,qBAAAQ,sBAAL,KAAA;AACE,EAAAA,sBAAAA,CAAAA,sBAAAA,CAAA,sBAAmB,EAAnB,CAAA,GAAA,kBAAA;AACA,EAAAA,sBAAAA,CAAAA,sBAAAA,CAAA,aAAU,EAAV,CAAA,GAAA,SAAA;AAFG,EAAAA,OAAAA,sBAAAA;AAAA,CAAA,EAAA,qBAAA,IAAA,EAAA,CAAA;AAKL,IAAO,2BAAQ,GAAA,qBAAA;;;ACLf,IAAK,cAAA,qBAAAC,eAAL,KAAA;AACE,EAAAA,gBAAA,cAAe,CAAA,GAAA,aAAA;AACf,EAAAA,gBAAA,QAAS,CAAA,GAAA,QAAA;AAFN,EAAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA,CAAA;AAKL,IAAO,wBAAQ,GAAA;;;ACLR,IAAM,SAAS,MAAc;AAClC,EAAA,OAAO,sCAAuC,CAAA,OAAA,CAAQ,OAAS,EAAA,CAAC,CAAM,KAAA;AACpE,IAAM,MAAA,CAAA,GAAI,IAAK,CAAA,MAAA,EAAW,GAAA,EAAA,IAAM,CAC9B,EAAA,CAAA,GAAI,CAAM,KAAA,GAAA,GAAM,CAAK,GAAA,CAAA,IAAK,CAAQ,IAAA,CAAA;AAEpC,IAAO,OAAA,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,GACrB,CAAA;AACH,CAAA;;;ACCe,SAAR,SAA6B,GAAA;AAClC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIL,gBAAkB,KAAK,CAAA;AAEnD,EAAA,MAAM,IAAO,GAAAM,kBAAA;AAAA,IACX,CACE,UACA,aACA,EAAA,aAAA,EACA,UAA0B,wBAAe,CAAA,YAAA,EACzC,WACA,iBACG,KAAA;AACH,MAAA,MAAM,OAAO,MAAO,EAAA;AAEpB,MAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,QAAA;AAAA;AAGF,MAAI,IAAA,MAAA,GAAS,uBAAwB,CAAA,SAAA,CAAU,IAAI,CAAA;AACnD,MAAA,IAAI,CAAC,MAAQ,EAAA;AACX,QAAS,MAAA,GAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA;AAAA,OAC1C,MAAA;AACL,QAAA,MAAA,CAAO,OAAQ,EAAA;AAAA;AAGjB,MAAI,IAAA,aAAA,IAAiB,OAAO,aAAA,KAAkB,UAAY,EAAA;AACxD,QAAA,aAAA,CAAc,CAAC,CAAA;AAAA;AAGjB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,IAAA,EAAM,UAAU,IAAI,CAAA,CAAA;AAAA,QACpB,OAAS,EAAA,QAAA;AAAA,QACT,OAAA;AAAA,QACA,KAAO,EAAA,GAAA;AAAA,QACP,QAAU,EAAA,EAAE,GAAK,EAAA,EAAA,EAAI,MAAM,IAAK,EAAA;AAAA,QAChC,QAAU,EAAA,MAAA;AAAA,QACV,UAAY,EAAA,CAAA;AAAA,QACZ,aAAe,EAAA,IAAA;AAAA,QACf,KAAO,EAAA,IAAA;AAAA,QACP,UAAY,EAAA,KAAA;AAAA,QACZ,cAAgB,EAAA,IAAA;AAAA,QAChB,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,aAAA,EAAe,CAAC,SAAsB,KAAA;AACpC,UAAI,IAAA,aAAA,IAAiB,OAAO,aAAA,KAAkB,UAAY,EAAA;AACxD,YAAA,aAAA,CAAc,SAAS,CAAA;AAAA;AAIzB,UAAA,IAAI,CAAC,MAAQ,EAAA;AACX,YAAA;AAAA;AAIF,UACE,IAAA,WAAA,CAAY,SACZ,IAAA,WAAA,CAAY,SAAY,GAAA,CAAA,IACxB,aAAa,WAAY,CAAA,SAAA,IACzB,MAAO,CAAA,OAAA,EACP,EAAA;AACA,YAAA,MAAA,CAAO,KAAM,EAAA;AACb,YAAA,SAAA,CAAU,KAAK,CAAA;AAEf,YAAA;AAAA;AACF,SACF;AAAA,QACA,eAAe,MAAM;AACnB,UAAA,IAAI,CAAC,MAAQ,EAAA;AACX,YAAA;AAAA;AAGF,UAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,YAAA;AAAA;AAGF,UAAI,IAAA,aAAA,IAAiB,OAAO,aAAA,KAAkB,UAAY,EAAA;AACxD,YAAM,MAAA,WAAA,GAAc,OAAO,eAAgB,EAAA;AAC3C,YAAA,IAAI,MAAS,GAAA,CAAA;AACb,YAAA,IAAI,YAAY,KAAS,IAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,GAAG,KAAK,CAAG,EAAA;AAC5D,cAAA,MAAA,GAAS,WAAY,CAAA,KAAA,CAAM,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA;AAAA;AAGxC,YAAA,MAAM,GAAM,GAAA;AAAA,cACV,MAAA;AAAA,cACA,OAAS,EAAA,QAAA;AAAA,cACT,WAAa,EAAA;AAAA,gBACX,OAAO,WAAY,CAAA,KAAA;AAAA,gBACnB,WAAW,WAAY,CAAA,SAAA;AAAA,gBACvB,UAAU,WAAY,CAAA;AAAA,eACxB;AAAA,cACA,OAAA;AAAA,cACA;AAAA,aACF;AAEA,YAAA,SAAA,CAAU,KAAK,CAAA;AACf,YAAA,aAAA,CAAc,GAAG,CAAA;AAAA;AAGnB,UAAA,uBAAA,CAAwB,aAAa,IAAI,CAAA;AAEzC,UAAA,IAAI,CAAC,aAAe,EAAA;AAClB,YAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAG3C,UAAI,IAAA,OAAO,kBAAkB,UAAY,EAAA;AACvC,YAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAC3C;AACF,OACF;AAEA,MAAM,MAAA,IAAA,GAAO,MAAO,CAAA,UAAA,CAAW,WAAW,CAAA;AAE1C,MAAI,IAAA,IAAA,KAAS,4BAAsB,gBAAkB,EAAA;AAEnD,QAAA,KAAA,CAAM,wEAAiB,CAAA;AAEvB,QAAA;AAAA,OACF,MAAA,IAAW,IAAS,KAAA,2BAAA,CAAsB,OAAS,EAAA;AAEjD,QAAA;AAAA;AAGF,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,KAChB;AAAA,IACA;AAAC,GACH;AAEA,EAAM,MAAA,QAAA,GAAW,CAAC,IAAiB,KAAA;AACjC,IAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,MAAA;AAAA;AAGF,IAAM,MAAA,YAAA,GAAe,uBAAwB,CAAA,OAAA,CAAQ,IAAI,CAAA;AAEzD,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,OAAO,aAAa,eAAgB,EAAA;AAAA,GACtC;AAMA,EAAM,MAAA,IAAA,GAAO,CAAC,IAAkB,KAAA;AAC9B,IAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,MAAA;AAAA;AAGF,IAAA,IAAI,IAAM,EAAA;AACR,MAAO,OAAA,uBAAA,CAAwB,QAAQ,IAAI,CAAA;AAAA,KACtC,MAAA;AAEL,MAAA,MAAM,SAAY,GAAA,MAAA,CAAO,IAAK,CAAA,uBAAA,CAAwB,OAAO,CAAA;AAE7D,MAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAChC,QAAM,MAAA,YAAA,GAAe,uBAAwB,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAE7D,QAAI,IAAA,YAAA,IAAgB,YAAa,CAAA,MAAA,EAAU,EAAA;AACzC,UAAO,OAAA,YAAA;AAAA;AACT;AACF;AACF,GACF;AAEA,EAAM,MAAA,MAAA,GAAS,CAAC,IAAkB,KAAA;AAChC,IAAM,MAAA,YAAA,GAAe,KAAK,IAAI,CAAA;AAE9B,IAAA,OAAO,CAAC,CAAC,YAAA;AAAA,GACX;AAEA,EAAM,MAAA,KAAA,GAAQ,CAAC,IAAkB,KAAA;AAC/B,IAAM,MAAA,YAAA,GAAe,KAAK,IAAI,CAAA;AAC9B,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,YAAA,CAAa,KAAM,EAAA;AACnB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAM,MAAA,KAAA,GAAQ,CAAC,IAAkB,KAAA;AAC/B,IAAM,MAAA,SAAA,GAAY,KAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,SAAA,CAAU,KAAM,EAAA;AAChB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAM,MAAA,OAAA,GAAU,CAAC,IAAkB,KAAA;AACjC,IAAM,MAAA,YAAA,GAAe,KAAK,IAAI,CAAA;AAC9B,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,YAAA,CAAa,OAAQ,EAAA;AAAA;AACvB,GACF;AAEA,EAAAL,iBAAU,MAAM;AACd,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAsB,KAAA;AAC7C,MAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,QAAA;AAAA;AAGF,MAAM,MAAA,iBAAA,GAAoB,QAAS,CAAA,aAAA,CAAc,UAAU,CAAA;AAE3D,MAAA,MAAM,eAAe,iBAAmB,EAAA,aAAA;AACxC,MAAA,IAAI,gBAAgB,CAAC,YAAA,CAAa,QAAS,CAAA,KAAA,CAAM,MAAc,CAAG,EAAA;AAChE,QAAA,uBAAA,CAAwB,QAAS,EAAA;AACjC,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,KACF;AACA,IAAS,QAAA,CAAA,gBAAA,CAAiB,aAAa,eAAe,CAAA;AAEtD,IAAA,OAAO,MAAM;AACX,MAAS,QAAA,CAAA,mBAAA,CAAoB,aAAa,eAAe,CAAA;AAAA,KAC3D;AAAA,GACF,EAAG,EAAE,CAAA;AAEL,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AC1Ne,SAAR,OAAwB,EAAE,KAAA,EAAO,UAAU,IAAM,EAAA,SAAA,EAAW,cAAuB,EAAA;AACxF,EAAA,MAAM,EAAE,IAAa,CAAA,GAAI,SAAW,EAAA;AAEpC,EAAM,MAAA,QAAA,GAAWM,cAAyB,IAAI,CAAA;AAE9C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIP,gBAAiB,EAAE,CAAA;AAEzD,EAAA,MAAM,WAAcM,GAAAA,kBAAAA;AAAA,IAClB,CAAC,GAA4B,KAAA;AAC3B,MAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,YAAeA,GAAAA,kBAAAA;AAAA,IACnB,CAAC,MAAmB,KAAA;AAClB,MAAA,IAAI,WAAW,CAAG,EAAA;AAChB,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA;AAEf,MAAA,cAAA,CAAe,EAAG,CAAA,QAAA,CAAS,MAAQ,EAAA,GAAG,CAAC,CAAA;AAAA,KACzC;AAAA,IACA,CAAC,UAAU,cAAc;AAAA,GAC3B;AAEA,EAAM,MAAA,YAAA,GAAeA,mBAAY,MAAM;AACrC,IAAA,IAAA,CAAK,SAAS,OAA6B,EAAA,YAAA,EAAc,WAAa,EAAA,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,GAC1F,EAAG,CAAC,IAAM,EAAA,QAAA,EAAU,cAAc,WAAa,EAAA,IAAA,EAAM,SAAS,CAAC,CAAA;AAE/D,EAAM,MAAA,eAAA,GAAkB,CAAC,oBAAA,EAAkC,eAAgC,KAAA;AACzF,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,oBAAsB,EAAA;AACxB,QAAqB,oBAAA,EAAA;AAAA;AAEvB,MAAgB,eAAA,EAAA;AAAA,KAClB;AAAA,GACF;AAEA,EAAM,MAAA,YAAA,GAAeE,uBAAM,CAAA,YAAA,CAAa,YAAc,EAAA;AAAA,IACpD,GAAK,EAAA,QAAA;AAAA,IACL,KAAO,EAAA,WAAA;AAAA,IACP,OAAS,EAAA,eAAA,CAAgB,YAAa,CAAA,KAAA,CAAM,SAAS,YAAY;AAAA;AAAA,GAElE,CAAA;AAED,EAAAP,iBAAU,MAAM;AACd,IAAA,MAAM,MAAS,GAAA,KAAA,EAAO,KAAS,IAAA,KAAA,CAAM,KAAM,CAAA,MAAA,GAAS,CAAI,GAAA,KAAA,CAAM,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,MAAS,GAAA,CAAA;AACxF,IAAA,cAAA,CAAe,EAAG,CAAA,QAAA,CAAS,MAAQ,EAAA,GAAG,CAAC,CAAA;AAAA,GACzC,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,QAAS,CAAA,OAAA,IAAW,EAAE,QAAA,CAAS,mBAAmB,gBAAmB,CAAA,EAAA;AACvE,MAAM,MAAA,IAAI,MAAM,mFAAuB,CAAA;AAAA;AACzC,GACF,EAAG,EAAE,CAAA;AAEL,EAAO,uBAAAC,cAAA,CAAAO,mBAAA,EAAA,EAAG,QAAa,EAAA,YAAA,EAAA,CAAA;AACzB;ACvDA,IAAM,OAAO,MAAM;AACjB,EAAA,MAAMd,OAAM,OAAO,MAAA,KAAW,WAAc,GAAA,MAAA,CAAO,SAAS,IAAO,GAAA,EAAA;AAEnE,EAAA,IAAIA,KAAI,QAAS,CAAA,WAAW,KAAKA,IAAI,CAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AACpD,IAAO,OAAA,oCAAA;AAAA,GACEA,MAAAA,IAAAA,IAAAA,CAAI,QAAS,CAAA,KAAK,CAAG,EAAA;AAC9B,IAAO,OAAA,oCAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,gCAAA;AAAA;AAEX,CAAG,GAAA;AAUY,SAAR,SAAA,CAA2B,EAAE,OAAS,EAAA,QAAA,EAAU,cAAc,SAAW,EAAA,CAAA,EAAG,KAAoB,EAAA;AACrG,EAAM,MAAA,OAAA,GACJ,QAAQ,MACJ,GAAA,gCAAA,GACA,QAAQ,KACN,GAAA,oCAAA,GACA,GAAQ,KAAA,KAAA,GACN,oCACA,GAAA,MAAA;AAEV,EAAM,MAAA,QAAA,GAAWW,mBAAY,MAAM;AACjC,IAAA,MAAM,SAAY,GAAA,IAAI,GAAI,CAAA,UAAA,EAAY,WAAW,GAAG,CAAA;AACpD,IAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,SAAA,EAAW,OAAO,CAAA;AAC7C,IAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,UAAA,EAAY,QAAQ,CAAA;AAE/C,IAAA,IAAI,SAAW,EAAA;AACb,MAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,WAAA,EAAa,SAAS,CAAA;AAAA;AAGnD,IAAA,IAAI,CAAG,EAAA;AACL,MAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,GAAA,EAAK,CAAC,CAAA;AAAA;AAGnC,IAAA,IAAI,YAAc,EAAA;AAChB,MAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,cAAA,EAAgB,YAAY,CAAA;AAAA;AAGzD,IAAA,OAAO,UAAU,QAAS,EAAA;AAAA,GAC5B,EAAG,CAAC,OAAS,EAAA,QAAA,EAAU,GAAG,YAAc,EAAA,SAAA,EAAW,OAAO,CAAC,CAAA;AAM3D,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,YAAY,QAAS,EAAA;AAE3B,IAAA,QAAA,CAAS,IAAO,GAAA,SAAA;AAAA,GAClB;AAqBA,EAAM,MAAA,IAAA,GAAO,OAAO,OAA6B,KAAA;AAC/C,IAAA,OAAO,IAAI,OAAA,CAAwB,CAAC,OAAA,EAAS,MAAW,KAAA;AACtD,MAAA,MAAM,YAAY,QAAS,EAAA;AAE3B,MAAM,MAAA,KAAA,GAAS,OAAW,IAAA,OAAA,CAAQ,UAAe,IAAA,GAAA;AACjD,MAAM,MAAA,MAAA,GAAU,OAAW,IAAA,OAAA,CAAQ,WAAgB,IAAA,GAAA;AAEnD,MAAM,MAAA,IAAA,GAAQ,WAAW,OAAQ,CAAA,SAAA,IAAc,OAAO,OAAW,GAAA,CAAA,MAAA,CAAO,aAAa,KAAS,IAAA,CAAA;AAC9F,MAAM,MAAA,GAAA,GAAO,WAAW,OAAQ,CAAA,QAAA,IAAa,OAAO,OAAW,GAAA,CAAA,MAAA,CAAO,aAAa,KAAS,IAAA,CAAA;AAE5F,MAAM,MAAA,aAAA,GAAgB,SAAS,KAAK,CAAA,QAAA,EAAW,MAAM,CAAS,MAAA,EAAA,IAAI,QAAQ,GAAG,CAAA,CAAA;AAC7E,MAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAA,SAAA,EAAY,WAAW,OAAQ,CAAA,UAAA,IAAe,aAAa,aAAa,CAAA;AAElG,MAAA,IAAI,CAAC,KAAO,EAAA;AACV,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,mFAAkB,CAAC,CAAA;AAEpC,QAAA;AAAA;AAGF,MAAA,IAAI,SAAY,GAAA,KAAA;AAEhB,MAAM,MAAA,aAAA,GAAgB,CAAC,KAAwB,KAAA;AAC7C,QAAA,IAAI,MAAM,MAAW,KAAA,IAAI,GAAI,CAAA,SAAS,EAAE,MAAQ,EAAA;AAC9C,UAAA;AAAA;AAGF,QAAA,IAAI,CAAC,SAAW,EAAA;AACd,UAAY,SAAA,GAAA,IAAA;AAEZ,UAAA,IAAI,MAAM,IAAM,EAAA;AACd,YAAA,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,WACb,MAAA;AACL,YAAA,MAAA,CAAO,yFAAmB,CAAA;AAAA;AAG5B,UAAA,KAAA,EAAO,KAAM,EAAA;AACb,UAAO,MAAA,CAAA,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA;AACrD,OACF;AAEA,MAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,KACjD,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,SAAS,SAAU;AAAA,IACvB,MAAS,GAAA,GAAA;AAAA,IACT,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAU,GAAA,6CAAA;AAAA,IACV,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAe,GAAA;AAAA,GAWd,EAAA;AACD,IAAA,MAAM,YAAY,QAAS,EAAA;AAE3B,IAAAL,iBAAU,MAAM;AACd,MAAI,IAAA,CAAC,SAAa,IAAA,CAAC,OAAS,EAAA;AAC1B,QAAA;AAAA;AAGF,MAAM,MAAA,OAAA,GAAU,CAAC,CAAoB,KAAA;AACnC,QAAI,IAAA,YAAA,IAAgB,CAAE,CAAA,MAAA,KAAW,GAAK,EAAA;AACpC,UAAA;AAAA;AAGF,QAAA,MAAM,IAAI,CAAE,CAAA,IAAA;AACZ,QAAA,IAAI,CAAG,EAAA;AACL,UAAI,IAAA,CAAA,CAAE,WAAW,OAAS,EAAA;AACxB,YAAA,OAAA,CAAQ,CAAC,CAAA;AAET,YAAA;AAAA,WACS,MAAA,IAAA,OAAA,IAAW,CAAE,CAAA,MAAA,KAAW,OAAS,EAAA;AAC1C,YAAA,OAAA,CAAQ,CAAC,CAAA;AAET,YAAA;AAAA,WACS,MAAA,IAAA,SAAA,IAAa,CAAE,CAAA,MAAA,KAAW,UAAY,EAAA;AAC/C,YAAA,SAAA,CAAU,CAAC,CAAA;AAEX,YAAA;AAAA;AACF,mBACS,OAAS,EAAA;AAClB,UAAQ,OAAA,CAAA;AAAA,YACN,MAAQ,EAAA,OAAA;AAAA,YACR,SAAW,EAAA,EAAA;AAAA,YACX,WAAa,EAAA;AAAA,WACd,CAAA;AAAA;AACH,OACF;AAEA,MAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,OAAwB,CAAA;AAE3D,MAAA,OAAO,MAAM,MAAA,CAAO,mBAAoB,CAAA,SAAA,EAAW,OAAwB,CAAA;AAAA,OAC1E,CAAC,OAAA,EAAS,OAAS,EAAA,SAAA,EAAW,YAAY,CAAC,CAAA;AAE9C,IAAA,uBACEC,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,SAAA;AAAA,QACL,KAAM,EAAA,MAAA;AAAA,QACN,QAAQ,OAAO,MAAA,KAAW,QAAW,GAAA,CAAA,EAAG,MAAM,CAAO,EAAA,CAAA,GAAA,MAAA;AAAA,QACrD,KAAO,EAAA,EAAE,MAAQ,EAAA,CAAA,EAAG,GAAG,KAAM,EAAA;AAAA,QAC7B,SAAA;AAAA,QACA,OAAA;AAAA,QACC,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC;AAAA,KAC5B;AAAA,GAEJ;AAEA,EAAO,OAAA,EAAE,QAAU,EAAA,IAAA,EAAM,MAAO,EAAA;AAClC","file":"index.cjs","sourcesContent":["export async function loadScript(url: string) {\r\n await new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n script.addEventListener('load', () => {\r\n resolve({ loaded: true, error: false });\r\n });\r\n\r\n script.addEventListener('error', () => {\r\n reject({\r\n loaded: false,\r\n error: true,\r\n message: '파일 로드에 실패하였습니다.'\r\n });\r\n });\r\n\r\n document.body.appendChild(script);\r\n });\r\n}\r\n","import { getEnvironmentFromHostname, getServicePath, isClient } from 'sales-frontend-utils';\n\nexport const getServiceUrl = (serviceName: string) => {\n if (!isClient()) {\n return '';\n }\n\n const env = getEnvironmentFromHostname(location.hostname);\n\n switch (env) {\n case 'local':\n return `${getServicePath()}/api/${serviceName}`;\n case 'dev':\n return `https://nxl-${serviceName}-dev.hanwhalife.com/api`;\n case 'stg':\n return `https://nxl-${serviceName}-stg.hanwhalife.com/api`;\n case 'prd':\n return `https://nxl-${serviceName}.hanwhalife.com/api`;\n default:\n return ``;\n }\n\n // return `https://nxl-${env !== 'prd' ? `${serviceName}-${env}` : serviceName}.hanwhalife.com`;\n};\n\nexport const API_ENDPOINTS = {\n GET_NXL_CODES: (codeId: string) => `${getServiceUrl('nlc')}/code/code-list/get?codeId=${codeId}&intgYn=N`,\n GET_NOTICE_SYSTEM: (code: string) => `${getServiceUrl('nlc')}/notice/system/${code}/get`,\n GET_NOTICE_INTEGRATED: (code: string) => `${getServiceUrl('nlc')}/notice/integrated/${code}/get`,\n GET_V3_LICENSE: (date: Date) => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const dateStr = `${year}-${month}-${day} ${hours}:${minutes}`;\n\n return `${getServiceUrl('nlm')}/v3/init?time=${dateStr}`;\n },\n INPUT_PREFILL_USER: `${getServiceUrl('nlc')}/user-ctfn/ncsr-info-inpt/post`\n} as const;\n","// import { getV3License } from '@nxl-kit/api';\r\nimport { getV3License } from './api/get-v3-license';\r\n\r\ndeclare global {\r\n interface Window {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n mpl_start?: (license?: any, time?: any, cryptoKeyVersion?: any, RootCheckTimeOut?: any) => void;\r\n\r\n /**\r\n * MPL의 상태를 반환하는 API\r\n * @returns\r\n * INITIAL - 동작중이지 않음\r\n * ALIVE - 동작중임\r\n * Undefined 네트워크 연결 문제\r\n */\r\n mpl_status?: () => 'INITAL' | 'ALIVE' | 'Undefined';\r\n\r\n mpl_load?: (tk?: string, cd?: string) => void;\r\n mpl_token?: () => string;\r\n mpl_enc_param?: () => string;\r\n mpl_stop?: () => void;\r\n }\r\n}\r\n\r\nconst isAndroid = (): boolean => {\r\n return /android/i.test(navigator.userAgent) && !/edge/i.test(navigator.userAgent);\r\n};\r\n\r\nconst startV3 = async () => {\r\n console.log('start v3');\r\n if (!isAndroid() || !window.mpl_start) {\r\n return;\r\n }\r\n\r\n window.mpl_stop?.();\r\n sessionStorage.removeItem('mtk');\r\n sessionStorage.removeItem('mcd');\r\n\r\n const v3Response = await getV3License({\r\n date: new Date()\r\n });\r\n\r\n console.log('getV3 License', v3Response);\r\n if (!v3Response) {\r\n return;\r\n }\r\n\r\n window.mpl_start(v3Response.data?.encLicense, v3Response.data?.time);\r\n\r\n setTimeout(() => {\r\n const mtk = window.mpl_token?.();\r\n const mcd = window.mpl_enc_param?.();\r\n\r\n if (mtk) {\r\n sessionStorage.setItem('mtk', mtk);\r\n }\r\n if (mcd) {\r\n sessionStorage.setItem('mcd', mcd);\r\n }\r\n }, 500);\r\n};\r\n\r\nconst loadV3 = () => {\r\n console.log('load v3');\r\n const mtk = sessionStorage.getItem('mtk') || window.mpl_token?.();\r\n const mcd = sessionStorage.getItem('mcd') || window.mpl_enc_param?.();\r\n\r\n if (mtk && mcd && window.mpl_load && mtk !== 'undefined' && mcd !== 'undefined') {\r\n window.mpl_load(mtk, mcd);\r\n }\r\n};\r\n\r\nconst checkV3Status = async (type: string) => {\r\n console.log('check v3 status');\r\n await new Promise((resolve) => setTimeout(resolve, 500));\r\n\r\n if (!isAndroid() || !window.mpl_status) {\r\n console.log('not android or no mpl_status');\r\n\r\n return true;\r\n }\r\n\r\n if (window.mpl_status() === 'ALIVE') {\r\n console.log('mpl status is alive');\r\n loadV3();\r\n\r\n return true;\r\n }\r\n\r\n console.log('v3 not alive');\r\n\r\n if (type === 'modal') {\r\n console.log('modal start v3');\r\n await startV3();\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const launchV3 = async () => {\r\n loadV3();\r\n\r\n return await checkV3Status('loader');\r\n};\r\n","import React, { createContext, useContext, useEffect, useState } from 'react';\r\n\r\nimport { loadScript } from './utils/load-script';\r\nimport { launchV3 } from './v3';\r\n\r\ninterface V3ContextType {\r\n isLoaded: boolean;\r\n launch: () => void;\r\n}\r\n\r\nconst V3Context = createContext<V3ContextType | undefined>(undefined);\r\n\r\nconst AhnlabV3JsUrl = 'https://mpl.ahnlab.com/js/mpl_webview_cm.js';\r\n\r\nexport const V3Provider = ({ children }: { children: React.ReactNode }) => {\r\n const [isLoaded, setIsLoaded] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n const initialize = async () => {\r\n await loadScript(AhnlabV3JsUrl);\r\n setIsLoaded(true);\r\n };\r\n\r\n initialize();\r\n }, []);\r\n\r\n return <V3Context.Provider value={{ isLoaded, launch: launchV3 }}>{children}</V3Context.Provider>;\r\n};\r\n\r\nexport const useV3 = () => {\r\n const context = useContext(V3Context);\r\n\r\n if (!context) {\r\n throw new Error('V3Provider를 정의해주세요.');\r\n }\r\n\r\n return context;\r\n};\r\n","import { isClient } from 'sales-frontend-utils';\r\n\r\nimport { KeypadActionType } from '../types/keypad-action.type';\r\nimport { loadScript } from '../utils/load-script';\r\n\r\ntype ENV = 'dev' | 'stg' | 'prod';\r\n\r\nconst getPath = (service: string, env: ENV) =>\r\n `https://nxl-${env !== 'prod' ? `${service}-${env}` : service}.hanwhalife.com`;\r\n\r\nconst getEnv: () => ENV = () => {\r\n const host = window.location.hostname;\r\n\r\n // if (host.includes('-dev.') || host.includes('localhost')) {\r\n // return 'dev';\r\n // } else if (host.includes('-stg.')) {\r\n // return 'stg';\r\n // } else {\r\n // return 'prod';\r\n // }\r\n\r\n return 'stg';\r\n};\r\n\r\ninterface KeypadConfig {\r\n version: string;\r\n server: string;\r\n contextRoot: string;\r\n cssPath: string;\r\n logoImgPath: string;\r\n inputObjectBackgroundColor: string;\r\n inputObjectBorderStyle: string;\r\n invalidSessionErrorMessage: string;\r\n invalidSessionAutoRefresh: boolean;\r\n enableAccessibility: boolean;\r\n useCustomAlert: boolean;\r\n functionKeyButtonStyle: string;\r\n maxInputSize: number;\r\n textInputView: number;\r\n touchOption: number;\r\n}\r\n\r\nexport const XKeyboardMobileInstance = (() => {\r\n if (!isClient()) {\r\n return null;\r\n }\r\n\r\n const env = getEnv();\r\n\r\n const keypadServicePath = `${getPath('xkp', env)}/xkp/xkscriptservice`;\r\n const keypadContentsPath = `${getPath('nlc', env)}/cnts-files/xkeyboard`;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (window as any).XKConfigMobile = {\r\n version: '1.0.5.1',\r\n server: keypadServicePath,\r\n contextRoot: `${keypadContentsPath}/js`,\r\n cssPath: `${keypadContentsPath}/css/xkp_mobile.css`,\r\n logoImgPath: `${keypadContentsPath}/img/logo.png`,\r\n inputObjectBackgroundColor: '#E4E4E4',\r\n inputObjectBorderStyle: '1px solid #9E9E9E',\r\n invalidSessionErrorMessage: \"보안세션이 만료되었습니다.\\n'확인'을 누르면 키패드가 갱신 됩니다.\",\r\n invalidSessionAutoRefresh: true,\r\n enableAccessibility: true,\r\n useCustomAlert: false,\r\n functionKeyButtonStyle: 'text',\r\n maxInputSize: 56,\r\n textInputView: 0,\r\n touchOption: 0\r\n } as KeypadConfig;\r\n\r\n document.oncontextmenu = () => false;\r\n document.ondragstart = () => false;\r\n document.onselectstart = () => false;\r\n\r\n const headTag = document.head;\r\n const scriptsToLoad = ['xkeypad_mobile.js'];\r\n\r\n const urls = scriptsToLoad.map(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (x) => `${(window as any).XKConfigMobile.contextRoot}/${x}`\r\n );\r\n\r\n Promise.all(urls.map((x) => loadScript(x))).then(() => {\r\n const existingLink = document.getElementById('xkStyle');\r\n\r\n if (existingLink?.parentNode) {\r\n existingLink.parentNode.removeChild(existingLink);\r\n }\r\n\r\n const linkElement = document.createElement('link');\r\n linkElement.id = 'xkStyle';\r\n linkElement.rel = 'stylesheet';\r\n linkElement.type = 'text/css';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n linkElement.href = (window as any).XKConfigMobile.cssPath;\r\n\r\n headTag.appendChild(linkElement);\r\n });\r\n\r\n const keypads: { [key: string]: KeypadActionType | undefined } = {};\r\n\r\n const getKeypad = (name: string) => keypads[name];\r\n\r\n const setKeypad = (name: string, keypad: KeypadActionType) => {\r\n keypads[name] = keypad;\r\n\r\n return keypad;\r\n };\r\n\r\n const removeKeypad = (name: string) => {\r\n delete keypads[name];\r\n };\r\n\r\n const closeAll = () => {\r\n Object.keys(keypads).forEach((id) => {\r\n const keypad = keypads[id];\r\n if (keypad && keypad.isOpen()) {\r\n keypad.close();\r\n }\r\n });\r\n };\r\n\r\n const newKeypad = (name: string) => {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return setKeypad(name, new (window as any).XKModule());\r\n };\r\n\r\n return {\r\n keypads,\r\n getKeypad,\r\n setKeypad,\r\n newKeypad,\r\n removeKeypad,\r\n closeAll\r\n };\r\n})();\r\n","enum KeypadMessageTypeEnum {\r\n NotSupportDevice = -1,\r\n Already = -2\r\n}\r\n\r\nexport default KeypadMessageTypeEnum;\r\n","enum KeypadModeEnum {\r\n QWERTY_SMART = 'qwertysmart',\r\n NUMBER = 'number'\r\n}\r\n\r\nexport default KeypadModeEnum;","export const uuidv4 = (): string => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 || 0,\r\n v = c === 'x' ? r : (r && 0x3) || 0x8;\r\n\r\n return v.toString(16);\r\n });\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { XKeyboardMobileInstance } from '../libs/xkeyboard';\r\nimport KeypadMessageTypeEnum from '../types/keypad-message.enum';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport { uuidv4 } from '../utils/uuid';\r\n\r\nexport default function useKeypad() {\r\n const [isShow, setIsShow] = useState<boolean>(false);\r\n\r\n const show = useCallback(\r\n (\r\n inputRef: HTMLInputElement,\r\n onInputChange: (length: number) => void,\r\n onKeypadClose: (res: KeypadResponseType) => void,\r\n keyType: KeypadModeEnum = KeypadModeEnum.QWERTY_SMART,\r\n maxLength: number,\r\n numberKeyRowCount: number\r\n ) => {\r\n const name = uuidv4();\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n let keypad = XKeyboardMobileInstance.getKeypad(name);\r\n if (!keypad) {\r\n keypad = XKeyboardMobileInstance.newKeypad(name);\r\n } else {\r\n keypad.refresh();\r\n }\r\n\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(0);\r\n }\r\n\r\n const keyPadParam = {\r\n name: `xk-pad-${name}`,\r\n editBox: inputRef,\r\n keyType,\r\n width: 100,\r\n position: { top: 10, left: null },\r\n viewType: 'half',\r\n closeDelay: 0,\r\n autoKeyResize: true,\r\n isE2E: true,\r\n onlyMobile: false,\r\n hasPressEffect: true,\r\n maxLength,\r\n numberKeyRowCount,\r\n onInputChange: (newLength: number) => {\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(newLength);\r\n }\r\n\r\n // 키패드가 존재하지 않을 경우, 종료\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n //키패드 입력 길이가 최대 입력 길이가 됐을 때 키패드 닫기\r\n if (\r\n keyPadParam.maxLength &&\r\n keyPadParam.maxLength > 0 &&\r\n newLength >= keyPadParam.maxLength &&\r\n keypad.isOpend()\r\n ) {\r\n keypad.close();\r\n setIsShow(false);\r\n\r\n return;\r\n }\r\n },\r\n onKeypadClose: () => {\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (onKeypadClose && typeof onKeypadClose === 'function') {\r\n const sessionInfo = keypad.get_sessionInfo();\r\n let length = 0;\r\n if (sessionInfo.input && sessionInfo.input.indexOf(',') >= 0) {\r\n length = sessionInfo.input.split(',').length;\r\n }\r\n\r\n const res = {\r\n length,\r\n element: inputRef,\r\n sessionInfo: {\r\n input: sessionInfo.input,\r\n sessionId: sessionInfo.sessionId,\r\n secToken: sessionInfo.secToken\r\n },\r\n keyType,\r\n name\r\n };\r\n\r\n setIsShow(false);\r\n onKeypadClose(res);\r\n }\r\n\r\n XKeyboardMobileInstance.removeKeypad(name);\r\n\r\n if (!onKeypadClose) {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n\r\n if (typeof onKeypadClose !== 'function') {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n }\r\n };\r\n\r\n const aRet = keypad.initialize(keyPadParam);\r\n\r\n if (aRet === KeypadMessageTypeEnum.NotSupportDevice) {\r\n // 안내 메세지 세팅\r\n alert('지원하지 않는 기기 입니다.');\r\n\r\n return;\r\n } else if (aRet === KeypadMessageTypeEnum.Already) {\r\n // alert('이미 키패드가 실행 중입니다.');\r\n return;\r\n }\r\n\r\n setIsShow(true);\r\n },\r\n []\r\n );\r\n\r\n const getValue = (name: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const targetKeypad = XKeyboardMobileInstance.keypads[name];\r\n\r\n if (!targetKeypad) {\r\n return null;\r\n }\r\n\r\n return targetKeypad.get_sessionInfo();\r\n };\r\n\r\n /**\r\n * 활성화 되어있는 키패드 찾는다\r\n * @returns\r\n */\r\n const find = (name?: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (name) {\r\n return XKeyboardMobileInstance.keypads[name];\r\n } else {\r\n // 키패드가 출력되어있으면, 확인하여 키패드를 닫는다.\r\n const keypadIds = Object.keys(XKeyboardMobileInstance.keypads);\r\n\r\n for (const keypadId of keypadIds) {\r\n const targetKeypad = XKeyboardMobileInstance.keypads[keypadId];\r\n\r\n if (targetKeypad && targetKeypad.isOpen()) {\r\n return targetKeypad;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isOpen = (name?: string) => {\r\n const targetKeypad = find(name);\r\n\r\n return !!targetKeypad;\r\n };\r\n\r\n const close = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.close();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const clear = (name?: string) => {\r\n const _xkmodule = find(name);\r\n if (_xkmodule) {\r\n _xkmodule.clear();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const refresh = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.refresh();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleMouseDown = (event: MouseEvent) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const keypadAlertDivTag = document.querySelector('#xkalert');\r\n\r\n const keypadDivTag = keypadAlertDivTag?.parentElement;\r\n if (keypadDivTag && !keypadDivTag.contains(event.target as Node)) {\r\n XKeyboardMobileInstance.closeAll();\r\n setIsShow(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleMouseDown);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleMouseDown);\r\n };\r\n }, []);\r\n\r\n return {\r\n show,\r\n close,\r\n clear,\r\n refresh,\r\n getValue,\r\n isOpen,\r\n find,\r\n isShow\r\n };\r\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\r\n\r\nimport useXKeypad from '../hooks/use-keypad';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport KeypadSessionType from '../types/keypad-session.type';\r\nimport KeypadType from '../types/keypad.type';\r\n\r\ntype Props = {\r\n value: KeypadSessionType | null;\r\n inputElement: KeypadType;\r\n mode: KeypadModeEnum;\r\n onChange: (value: KeypadSessionType | null) => void;\r\n maxLength: number;\r\n};\r\n\r\nexport default function Keypad({ value, onChange, mode, maxLength, inputElement }: Props) {\r\n const { show, isShow } = useXKeypad();\r\n\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const [maskedValue, setMaskedValue] = useState<string>('');\r\n\r\n const onCloseBack = useCallback(\r\n (res: KeypadResponseType) => {\r\n onChange(res.sessionInfo);\r\n },\r\n [onChange]\r\n );\r\n\r\n const onChangeBack = useCallback(\r\n (length: number) => {\r\n if (length === 0) {\r\n onChange(null);\r\n }\r\n setMaskedValue(''.padStart(length, '*'));\r\n },\r\n [onChange, setMaskedValue]\r\n );\r\n\r\n const handleKeypad = useCallback(() => {\r\n show(inputRef.current as HTMLInputElement, onChangeBack, onCloseBack, mode, maxLength, 3);\r\n }, [show, inputRef, onChangeBack, onCloseBack, mode, maxLength]);\r\n\r\n const enhancedOnClick = (existingClickHandler: () => void, newClickHandler: () => void) => {\r\n return () => {\r\n if (existingClickHandler) {\r\n existingClickHandler();\r\n }\r\n newClickHandler();\r\n };\r\n };\r\n\r\n const cloneElement = React.cloneElement(inputElement, {\r\n ref: inputRef,\r\n value: maskedValue,\r\n onClick: enhancedOnClick(inputElement.props.onClick, handleKeypad)\r\n // iskeypadactive: isShow\r\n });\r\n\r\n useEffect(() => {\r\n const length = value?.input && value.input.length > 0 ? value.input.split(',').length : 0;\r\n setMaskedValue(''.padStart(length, '*'));\r\n }, [value]);\r\n\r\n useEffect(() => {\r\n if (inputRef.current && !(inputRef.current instanceof HTMLInputElement)) {\r\n throw new Error('Input 태그가 정의되지 않았습니다.');\r\n }\r\n }, []);\r\n\r\n return <>{cloneElement}</>;\r\n}\r\n","import { useCallback, useEffect } from 'react';\r\nexport type NxlOneProps = {\r\n bizCode: string;\r\n tmplCode: string;\r\n ncsrInfoUuid?: string;\r\n nlcCtfnId?: string;\r\n // TYPE\r\n t?: string;\r\n env?: 'dev' | 'stg' | 'prod';\r\n};\r\n\r\nexport type NxlOneResponse = {\r\n action?: 'error' | 'close' | 'complete';\r\n redirectUrl?: string;\r\n nlcCtfnId?: string;\r\n};\r\n\r\nconst url = (() => {\r\n const url = typeof window !== 'undefined' ? window.location.href : '';\r\n\r\n if (url.includes('localhost') || url.includes('dev')) {\r\n return 'https://nxl-nlc-dev.hanwhalife.com';\r\n } else if (url.includes('stg')) {\r\n return 'https://nxl-nlc-stg.hanwhalife.com';\r\n } else {\r\n return 'https://nxl-nlc.hanwhalife.com';\r\n }\r\n})();\r\n\r\ntype OpenOptionType = {\r\n popupWidth?: number;\r\n popupHeight?: number;\r\n popupLeft?: number;\r\n popupTop?: number;\r\n windowName?: string;\r\n};\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }: NxlOneProps) {\r\n const baseUrl =\r\n env === 'prod'\r\n ? 'https://nxl-nlc.hanwhalife.com'\r\n : env === 'stg'\r\n ? 'https://nxl-nlc-stg.hanwhalife.com'\r\n : env === 'dev'\r\n ? 'https://nxl-nlc-dev.hanwhalife.com'\r\n : undefined;\r\n\r\n const buildUrl = useCallback(() => {\r\n const targetUrl = new URL('/auth/v1', baseUrl || url);\r\n targetUrl.searchParams.set('bizCode', bizCode);\r\n targetUrl.searchParams.set('tmplCode', tmplCode);\r\n\r\n if (nlcCtfnId) {\r\n targetUrl.searchParams.set('nlcCtfnId', nlcCtfnId);\r\n }\r\n\r\n if (t) {\r\n targetUrl.searchParams.set('t', t);\r\n }\r\n\r\n if (ncsrInfoUuid) {\r\n targetUrl.searchParams.set('ncsrInfoUuid', ncsrInfoUuid);\r\n }\r\n\r\n return targetUrl.toString();\r\n }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId, baseUrl]);\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지로 이동합니다.\r\n * 인증이 완료 후, 관리자 페이지에서 정의한 프로세스 완료 URL로 이동합니다.\r\n */\r\n const redirect = () => {\r\n const targetUrl = buildUrl();\r\n\r\n location.href = targetUrl;\r\n };\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지를 팝업으로 엽니다.\r\n * @param options 팝업의 크기, 위치, 창 이름을 정의합니다.\r\n * @returns 완료 URL에 인증 ID가 Query String 이 함께 정의된 형태로 반환됩니다.\r\n *\r\n * @example\r\n * const { open } = useNxlOne();\r\n *\r\n * const handleClick = async () => {\r\n * try {\r\n * const result = await open({ popupWidth: 500, popupHeight: 500 });\r\n * console.log('이동 시킬 URL : ' + result);\r\n * } catch (e) {\r\n * console.error('팝업 프로세스 실패');\r\n * }\r\n * }\r\n *\r\n * @note 팝업은 반드시 사용자 이벤트 핸들러 내에서 직접 호출해야 브라우저 차단을 피할 수 있습니다.\r\n */\r\n const open = async (options?: OpenOptionType) => {\r\n return new Promise<NxlOneResponse>((resolve, reject) => {\r\n const targetUrl = buildUrl();\r\n\r\n const width = (options && options.popupWidth) || 744;\r\n const height = (options && options.popupHeight) || 720;\r\n\r\n const left = (options && options.popupLeft) || window.screenX + (window.outerWidth - width) / 2;\r\n const top = (options && options.popupTop) || window.screenX + (window.outerWidth - width) / 2;\r\n\r\n const popupFeatures = `width=${width},height=${height},left=${left},top=${top}`;\r\n const popup = window.open(targetUrl, (options && options.windowName) || 'self_cert', popupFeatures);\r\n\r\n if (!popup) {\r\n reject(new Error('차단되거나 열리지 않았습니다.'));\r\n\r\n return;\r\n }\r\n\r\n let isSettled = false;\r\n\r\n const handleMessage = (event: MessageEvent) => {\r\n if (event.origin !== new URL(targetUrl).origin) {\r\n return;\r\n }\r\n\r\n if (!isSettled) {\r\n isSettled = true;\r\n\r\n if (event.data) {\r\n resolve(event.data);\r\n } else {\r\n reject('인증이 취소되거나 실패했습니다.');\r\n }\r\n\r\n popup?.close();\r\n window.removeEventListener('message', handleMessage);\r\n }\r\n };\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n };\r\n\r\n const Iframe = function ({\r\n height = 720,\r\n className,\r\n style,\r\n allow,\r\n sandbox = 'allow-scripts allow-forms allow-same-origin',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n strictOrigin = true\r\n }: {\r\n height?: number | string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n allow?: string;\r\n sandbox?: string;\r\n onSuccess?: (response: NxlOneResponse) => void;\r\n onError?: (response: NxlOneResponse) => void;\r\n onClose: (response: NxlOneResponse) => void;\r\n strictOrigin?: boolean;\r\n }) {\r\n const targetUrl = buildUrl();\r\n\r\n useEffect(() => {\r\n if (!onSuccess && !onError) {\r\n return;\r\n }\r\n\r\n const handler = (e: MessageEvent) => {\r\n if (strictOrigin && e.origin !== url) {\r\n return;\r\n }\r\n\r\n const d = e.data as NxlOneResponse;\r\n if (d) {\r\n if (d.action === 'close') {\r\n onClose(d);\r\n\r\n return;\r\n } else if (onError && d.action === 'error') {\r\n onError(d);\r\n\r\n return;\r\n } else if (onSuccess && d.action === 'complete') {\r\n onSuccess(d);\r\n\r\n return;\r\n }\r\n } else if (onError) {\r\n onError({\r\n action: 'error',\r\n nlcCtfnId: '',\r\n redirectUrl: ''\r\n });\r\n }\r\n };\r\n\r\n window.addEventListener('message', handler as EventListener);\r\n\r\n return () => window.removeEventListener('message', handler as EventListener);\r\n }, [onClose, onError, onSuccess, strictOrigin]);\r\n\r\n return (\r\n <iframe\r\n src={targetUrl}\r\n width=\"100%\"\r\n height={typeof height === 'number' ? `${height}px` : height}\r\n style={{ border: 0, ...style }}\r\n className={className}\r\n sandbox={sandbox}\r\n {...(allow ? { allow } : {})}\r\n />\r\n );\r\n };\r\n\r\n return { redirect, open, Iframe };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/utils/load-script.ts","../src/api/endpoint.ts","../src/v3.ts","../src/v3-provider.tsx","../src/libs/xkeyboard.ts","../src/types/keypad-message.enum.ts","../src/types/keypad-mode.enum.ts","../src/utils/uuid.ts","../src/hooks/use-keypad.ts","../src/components/Keypad.tsx","../src/hooks/use-nxl-one.tsx"],"names":["isClient","getEnvironmentFromHostname","getServicePath","createContext","useState","useEffect","jsx","useContext","KeypadMessageTypeEnum","KeypadModeEnum","useCallback","useRef","React","Fragment","getNlcHostFromEnvironment"],"mappings":";;;;;;;;;;;;;AAAA,eAAsB,WAAW,GAAa,EAAA;AAC5C,EAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACrC,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAM,GAAA,GAAA;AACb,IAAA,MAAA,CAAO,KAAQ,GAAA,IAAA;AACf,IAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,MAAM;AACpC,MAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,IAAM,EAAA,KAAA,EAAO,OAAO,CAAA;AAAA,KACvC,CAAA;AAED,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAO,MAAA,CAAA;AAAA,QACL,MAAQ,EAAA,KAAA;AAAA,QACR,KAAO,EAAA,IAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACV,CAAA;AAAA,KACF,CAAA;AAED,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,GACjC,CAAA;AACH;ACjBO,IAAM,aAAA,GAAgB,CAAC,WAAwB,KAAA;AACpD,EAAI,IAAA,CAACA,6BAAY,EAAA;AACf,IAAO,OAAA,EAAA;AAAA;AAGT,EAAM,MAAA,GAAA,GAAMC,6CAA2B,CAAA,QAAA,CAAS,QAAQ,CAAA;AAExD,EAAA,QAAQ,GAAK;AAAA,IACX,KAAK,OAAA;AACH,MAAA,OAAO,CAAG,EAAAC,iCAAA,EAAgB,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAA;AAAA,IAC/C,KAAK,KAAA;AACH,MAAA,OAAO,eAAe,WAAW,CAAA,uBAAA,CAAA;AAAA,IACnC,KAAK,KAAA;AACH,MAAA,OAAO,eAAe,WAAW,CAAA,uBAAA,CAAA;AAAA,IACnC,KAAK,KAAA;AACH,MAAA,OAAO,eAAe,WAAW,CAAA,mBAAA,CAAA;AAAA,IACnC;AACE,MAAO,OAAA,CAAA,CAAA;AAAA;AAIb,CAAA;CAE6B;AAAA,EAc3B,kBAAoB,EAAA,CAAA,EAAG,aAAc,CAAA,KAAK,CAAC,CAAA,8BAAA;AAC7C;;;AChBA,IAAM,YAAY,MAAe;AAC/B,EAAO,OAAA,UAAA,CAAW,KAAK,SAAU,CAAA,SAAS,KAAK,CAAC,OAAA,CAAQ,IAAK,CAAA,SAAA,CAAU,SAAS,CAAA;AAClF,CAAA;AAoCA,IAAM,SAAS,MAAM;AACnB,EAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,EAAA,MAAM,MAAM,cAAe,CAAA,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,SAAY,IAAA;AAChE,EAAA,MAAM,MAAM,cAAe,CAAA,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,aAAgB,IAAA;AAEpE,EAAA,IAAI,OAAO,GAAO,IAAA,MAAA,CAAO,YAAY,GAAQ,KAAA,WAAA,IAAe,QAAQ,WAAa,EAAA;AAC/E,IAAO,MAAA,CAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA;AAE5B,CAAA;AAEA,IAAM,aAAA,GAAgB,OAAO,IAAiB,KAAA;AAC5C,EAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,EAAA,MAAM,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAAS,GAAG,CAAC,CAAA;AAEvD,EAAA,IAAI,CAAC,SAAA,EAAe,IAAA,CAAC,OAAO,UAAY,EAAA;AACtC,IAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAE1C,IAAO,OAAA,IAAA;AAAA;AAGT,EAAI,IAAA,MAAA,CAAO,UAAW,EAAA,KAAM,OAAS,EAAA;AACnC,IAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,IAAO,MAAA,EAAA;AAEP,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAS1B,EAAO,OAAA,KAAA;AACT,CAAA;AAEO,IAAM,WAAW,YAAY;AAClC,EAAO,MAAA,EAAA;AAEP,EAAO,OAAA,MAAM,cAAsB,CAAA;AACrC,CAAA;AC/FA,IAAM,SAAA,GAAYC,qBAAyC,MAAS,CAAA;AAEpE,IAAM,aAAgB,GAAA,6CAAA;AAEf,IAAM,UAAa,GAAA,CAAC,EAAE,QAAA,EAA8C,KAAA;AACzE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,gBAAkB,KAAK,CAAA;AAEvD,EAAAC,gBAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAa,YAAY;AAC7B,MAAA,MAAM,WAAW,aAAa,CAAA;AAC9B,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,KAClB;AAEA,IAAW,UAAA,EAAA;AAAA,GACb,EAAG,EAAE,CAAA;AAEL,EAAO,uBAAAC,cAAA,CAAC,SAAU,CAAA,QAAA,EAAV,EAAmB,KAAA,EAAO,EAAE,QAAU,EAAA,MAAA,EAAQ,QAAS,EAAA,EAAI,QAAS,EAAA,CAAA;AAC9E;AAEO,IAAM,QAAQ,MAAM;AACzB,EAAM,MAAA,OAAA,GAAUC,kBAAW,SAAS,CAAA;AAEpC,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAM,MAAA,IAAI,MAAM,wDAAqB,CAAA;AAAA;AAGvC,EAAO,OAAA,OAAA;AACT;AC9BA,IAAM,OAAU,GAAA,CAAC,OAAiB,EAAA,GAAA,KAChC,CAAe,YAAA,EAAiB,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAY,CAAA,eAAA,CAAA;AAE/D,IAAM,SAAoB,MAAM;AAW9B,EAAO,OAAA,KAAA;AACT,CAAA;AAoBO,IAAM,2BAA2B,MAAM;AAC5C,EAAI,IAAA,CAACP,6BAAY,EAAA;AACf,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,MAAM,MAAO,EAAA;AAEnB,EAAA,MAAM,iBAAoB,GAAA,CAAA,EAAG,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAC,CAAA,oBAAA,CAAA;AAChD,EAAA,MAAM,kBAAqB,GAAA,CAAA,EAAG,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAC,CAAA,qBAAA,CAAA;AAGjD,EAAC,OAAe,cAAiB,GAAA;AAAA,IAC/B,OAAS,EAAA,SAAA;AAAA,IACT,MAAQ,EAAA,iBAAA;AAAA,IACR,WAAA,EAAa,GAAG,kBAAkB,CAAA,GAAA,CAAA;AAAA,IAClC,OAAA,EAAS,GAAG,kBAAkB,CAAA,mBAAA,CAAA;AAAA,IAC9B,WAAA,EAAa,GAAG,kBAAkB,CAAA,aAAA,CAAA;AAAA,IAClC,0BAA4B,EAAA,SAAA;AAAA,IAC5B,sBAAwB,EAAA,mBAAA;AAAA,IACxB,0BAA4B,EAAA,+KAAA;AAAA,IAC5B,yBAA2B,EAAA,IAAA;AAAA,IAC3B,mBAAqB,EAAA,IAAA;AAAA,IACrB,cAAgB,EAAA,KAAA;AAAA,IAChB,sBAAwB,EAAA,MAAA;AAAA,IACxB,YAAc,EAAA,EAAA;AAAA,IACd,aAAe,EAAA,CAAA;AAAA,IACf,WAAa,EAAA;AAAA,GACf;AAEA,EAAA,QAAA,CAAS,gBAAgB,MAAM,KAAA;AAC/B,EAAA,QAAA,CAAS,cAAc,MAAM,KAAA;AAC7B,EAAA,QAAA,CAAS,gBAAgB,MAAM,KAAA;AAE/B,EAAA,MAAM,UAAU,QAAS,CAAA,IAAA;AACzB,EAAM,MAAA,aAAA,GAAgB,CAAC,mBAAmB,CAAA;AAE1C,EAAA,MAAM,OAAO,aAAc,CAAA,GAAA;AAAA;AAAA,IAEzB,CAAC,CAAM,KAAA,CAAA,EAAI,OAAe,cAAe,CAAA,WAAW,IAAI,CAAC,CAAA;AAAA,GAC3D;AAEA,EAAQ,OAAA,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,UAAW,CAAA,CAAC,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,MAAM;AACrD,IAAM,MAAA,YAAA,GAAe,QAAS,CAAA,cAAA,CAAe,SAAS,CAAA;AAEtD,IAAA,IAAI,cAAc,UAAY,EAAA;AAC5B,MAAa,YAAA,CAAA,UAAA,CAAW,YAAY,YAAY,CAAA;AAAA;AAGlD,IAAM,MAAA,WAAA,GAAc,QAAS,CAAA,aAAA,CAAc,MAAM,CAAA;AACjD,IAAA,WAAA,CAAY,EAAK,GAAA,SAAA;AACjB,IAAA,WAAA,CAAY,GAAM,GAAA,YAAA;AAClB,IAAA,WAAA,CAAY,IAAO,GAAA,UAAA;AAEnB,IAAY,WAAA,CAAA,IAAA,GAAQ,OAAe,cAAe,CAAA,OAAA;AAElD,IAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAAA,GAChC,CAAA;AAED,EAAA,MAAM,UAA2D,EAAC;AAElE,EAAA,MAAM,SAAY,GAAA,CAAC,IAAiB,KAAA,OAAA,CAAQ,IAAI,CAAA;AAEhD,EAAM,MAAA,SAAA,GAAY,CAAC,IAAA,EAAc,MAA6B,KAAA;AAC5D,IAAA,OAAA,CAAQ,IAAI,CAAI,GAAA,MAAA;AAEhB,IAAO,OAAA,MAAA;AAAA,GACT;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,IAAiB,KAAA;AACrC,IAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,GACrB;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAA,CAAO,IAAK,CAAA,OAAO,CAAE,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACnC,MAAM,MAAA,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,MAAI,IAAA,MAAA,IAAU,MAAO,CAAA,MAAA,EAAU,EAAA;AAC7B,QAAA,MAAA,CAAO,KAAM,EAAA;AAAA;AACf,KACD,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,SAAA,GAAY,CAAC,IAAiB,KAAA;AAElC,IAAA,OAAO,SAAU,CAAA,IAAA,EAAM,IAAK,MAAA,CAAe,UAAU,CAAA;AAAA,GACvD;AAEA,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF,CAAG,GAAA;;;ACxIH,IAAK,qBAAA,qBAAAQ,sBAAL,KAAA;AACE,EAAAA,sBAAAA,CAAAA,sBAAAA,CAAA,sBAAmB,EAAnB,CAAA,GAAA,kBAAA;AACA,EAAAA,sBAAAA,CAAAA,sBAAAA,CAAA,aAAU,EAAV,CAAA,GAAA,SAAA;AAFG,EAAAA,OAAAA,sBAAAA;AAAA,CAAA,EAAA,qBAAA,IAAA,EAAA,CAAA;AAKL,IAAO,2BAAQ,GAAA,qBAAA;;;ACLf,IAAK,cAAA,qBAAAC,eAAL,KAAA;AACE,EAAAA,gBAAA,cAAe,CAAA,GAAA,aAAA;AACf,EAAAA,gBAAA,QAAS,CAAA,GAAA,QAAA;AAFN,EAAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA,CAAA;AAKL,IAAO,wBAAQ,GAAA;;;ACLR,IAAM,SAAS,MAAc;AAClC,EAAA,OAAO,sCAAuC,CAAA,OAAA,CAAQ,OAAS,EAAA,CAAC,CAAM,KAAA;AACpE,IAAM,MAAA,CAAA,GAAI,IAAK,CAAA,MAAA,EAAW,GAAA,EAAA,IAAM,CAC9B,EAAA,CAAA,GAAI,CAAM,KAAA,GAAA,GAAM,CAAK,GAAA,CAAA,IAAK,CAAQ,IAAA,CAAA;AAEpC,IAAO,OAAA,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,GACrB,CAAA;AACH,CAAA;;;ACCe,SAAR,SAA6B,GAAA;AAClC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIL,gBAAkB,KAAK,CAAA;AAEnD,EAAA,MAAM,IAAO,GAAAM,kBAAA;AAAA,IACX,CACE,UACA,aACA,EAAA,aAAA,EACA,UAA0B,wBAAe,CAAA,YAAA,EACzC,WACA,iBACG,KAAA;AACH,MAAA,MAAM,OAAO,MAAO,EAAA;AAEpB,MAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,QAAA;AAAA;AAGF,MAAI,IAAA,MAAA,GAAS,uBAAwB,CAAA,SAAA,CAAU,IAAI,CAAA;AACnD,MAAA,IAAI,CAAC,MAAQ,EAAA;AACX,QAAS,MAAA,GAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA;AAAA,OAC1C,MAAA;AACL,QAAA,MAAA,CAAO,OAAQ,EAAA;AAAA;AAGjB,MAAI,IAAA,aAAA,IAAiB,OAAO,aAAA,KAAkB,UAAY,EAAA;AACxD,QAAA,aAAA,CAAc,CAAC,CAAA;AAAA;AAGjB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,IAAA,EAAM,UAAU,IAAI,CAAA,CAAA;AAAA,QACpB,OAAS,EAAA,QAAA;AAAA,QACT,OAAA;AAAA,QACA,KAAO,EAAA,GAAA;AAAA,QACP,QAAU,EAAA,EAAE,GAAK,EAAA,EAAA,EAAI,MAAM,IAAK,EAAA;AAAA,QAChC,QAAU,EAAA,MAAA;AAAA,QACV,UAAY,EAAA,CAAA;AAAA,QACZ,aAAe,EAAA,IAAA;AAAA,QACf,KAAO,EAAA,IAAA;AAAA,QACP,UAAY,EAAA,KAAA;AAAA,QACZ,cAAgB,EAAA,IAAA;AAAA,QAChB,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,aAAA,EAAe,CAAC,SAAsB,KAAA;AACpC,UAAI,IAAA,aAAA,IAAiB,OAAO,aAAA,KAAkB,UAAY,EAAA;AACxD,YAAA,aAAA,CAAc,SAAS,CAAA;AAAA;AAIzB,UAAA,IAAI,CAAC,MAAQ,EAAA;AACX,YAAA;AAAA;AAIF,UACE,IAAA,WAAA,CAAY,SACZ,IAAA,WAAA,CAAY,SAAY,GAAA,CAAA,IACxB,aAAa,WAAY,CAAA,SAAA,IACzB,MAAO,CAAA,OAAA,EACP,EAAA;AACA,YAAA,MAAA,CAAO,KAAM,EAAA;AACb,YAAA,SAAA,CAAU,KAAK,CAAA;AAEf,YAAA;AAAA;AACF,SACF;AAAA,QACA,eAAe,MAAM;AACnB,UAAA,IAAI,CAAC,MAAQ,EAAA;AACX,YAAA;AAAA;AAGF,UAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,YAAA;AAAA;AAGF,UAAI,IAAA,aAAA,IAAiB,OAAO,aAAA,KAAkB,UAAY,EAAA;AACxD,YAAM,MAAA,WAAA,GAAc,OAAO,eAAgB,EAAA;AAC3C,YAAA,IAAI,MAAS,GAAA,CAAA;AACb,YAAA,IAAI,YAAY,KAAS,IAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,GAAG,KAAK,CAAG,EAAA;AAC5D,cAAA,MAAA,GAAS,WAAY,CAAA,KAAA,CAAM,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA;AAAA;AAGxC,YAAA,MAAM,GAAM,GAAA;AAAA,cACV,MAAA;AAAA,cACA,OAAS,EAAA,QAAA;AAAA,cACT,WAAa,EAAA;AAAA,gBACX,OAAO,WAAY,CAAA,KAAA;AAAA,gBACnB,WAAW,WAAY,CAAA,SAAA;AAAA,gBACvB,UAAU,WAAY,CAAA;AAAA,eACxB;AAAA,cACA,OAAA;AAAA,cACA;AAAA,aACF;AAEA,YAAA,SAAA,CAAU,KAAK,CAAA;AACf,YAAA,aAAA,CAAc,GAAG,CAAA;AAAA;AAGnB,UAAA,uBAAA,CAAwB,aAAa,IAAI,CAAA;AAEzC,UAAA,IAAI,CAAC,aAAe,EAAA;AAClB,YAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAG3C,UAAI,IAAA,OAAO,kBAAkB,UAAY,EAAA;AACvC,YAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAC3C;AACF,OACF;AAEA,MAAM,MAAA,IAAA,GAAO,MAAO,CAAA,UAAA,CAAW,WAAW,CAAA;AAE1C,MAAI,IAAA,IAAA,KAAS,4BAAsB,gBAAkB,EAAA;AAEnD,QAAA,KAAA,CAAM,wEAAiB,CAAA;AAEvB,QAAA;AAAA,OACF,MAAA,IAAW,IAAS,KAAA,2BAAA,CAAsB,OAAS,EAAA;AAEjD,QAAA;AAAA;AAGF,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,KAChB;AAAA,IACA;AAAC,GACH;AAEA,EAAM,MAAA,QAAA,GAAW,CAAC,IAAiB,KAAA;AACjC,IAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,MAAA;AAAA;AAGF,IAAM,MAAA,YAAA,GAAe,uBAAwB,CAAA,OAAA,CAAQ,IAAI,CAAA;AAEzD,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,OAAO,aAAa,eAAgB,EAAA;AAAA,GACtC;AAMA,EAAM,MAAA,IAAA,GAAO,CAAC,IAAkB,KAAA;AAC9B,IAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,MAAA;AAAA;AAGF,IAAA,IAAI,IAAM,EAAA;AACR,MAAO,OAAA,uBAAA,CAAwB,QAAQ,IAAI,CAAA;AAAA,KACtC,MAAA;AAEL,MAAA,MAAM,SAAY,GAAA,MAAA,CAAO,IAAK,CAAA,uBAAA,CAAwB,OAAO,CAAA;AAE7D,MAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAChC,QAAM,MAAA,YAAA,GAAe,uBAAwB,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAE7D,QAAI,IAAA,YAAA,IAAgB,YAAa,CAAA,MAAA,EAAU,EAAA;AACzC,UAAO,OAAA,YAAA;AAAA;AACT;AACF;AACF,GACF;AAEA,EAAM,MAAA,MAAA,GAAS,CAAC,IAAkB,KAAA;AAChC,IAAM,MAAA,YAAA,GAAe,KAAK,IAAI,CAAA;AAE9B,IAAA,OAAO,CAAC,CAAC,YAAA;AAAA,GACX;AAEA,EAAM,MAAA,KAAA,GAAQ,CAAC,IAAkB,KAAA;AAC/B,IAAM,MAAA,YAAA,GAAe,KAAK,IAAI,CAAA;AAC9B,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,YAAA,CAAa,KAAM,EAAA;AACnB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAM,MAAA,KAAA,GAAQ,CAAC,IAAkB,KAAA;AAC/B,IAAM,MAAA,SAAA,GAAY,KAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,SAAA,CAAU,KAAM,EAAA;AAChB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAM,MAAA,OAAA,GAAU,CAAC,IAAkB,KAAA;AACjC,IAAM,MAAA,YAAA,GAAe,KAAK,IAAI,CAAA;AAC9B,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,YAAA,CAAa,OAAQ,EAAA;AAAA;AACvB,GACF;AAEA,EAAAL,iBAAU,MAAM;AACd,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAsB,KAAA;AAC7C,MAAA,IAAI,CAAC,uBAAyB,EAAA;AAC5B,QAAA;AAAA;AAGF,MAAM,MAAA,iBAAA,GAAoB,QAAS,CAAA,aAAA,CAAc,UAAU,CAAA;AAE3D,MAAA,MAAM,eAAe,iBAAmB,EAAA,aAAA;AACxC,MAAA,IAAI,gBAAgB,CAAC,YAAA,CAAa,QAAS,CAAA,KAAA,CAAM,MAAc,CAAG,EAAA;AAChE,QAAA,uBAAA,CAAwB,QAAS,EAAA;AACjC,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,KACF;AACA,IAAS,QAAA,CAAA,gBAAA,CAAiB,aAAa,eAAe,CAAA;AAEtD,IAAA,OAAO,MAAM;AACX,MAAS,QAAA,CAAA,mBAAA,CAAoB,aAAa,eAAe,CAAA;AAAA,KAC3D;AAAA,GACF,EAAG,EAAE,CAAA;AAEL,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AC1Ne,SAAR,OAAwB,EAAE,KAAA,EAAO,UAAU,IAAM,EAAA,SAAA,EAAW,cAAuB,EAAA;AACxF,EAAA,MAAM,EAAE,IAAa,CAAA,GAAI,SAAW,EAAA;AAEpC,EAAM,MAAA,QAAA,GAAWM,cAAyB,IAAI,CAAA;AAE9C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIP,gBAAiB,EAAE,CAAA;AAEzD,EAAA,MAAM,WAAcM,GAAAA,kBAAAA;AAAA,IAClB,CAAC,GAA4B,KAAA;AAC3B,MAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,YAAeA,GAAAA,kBAAAA;AAAA,IACnB,CAAC,MAAmB,KAAA;AAClB,MAAA,IAAI,WAAW,CAAG,EAAA;AAChB,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA;AAEf,MAAA,cAAA,CAAe,EAAG,CAAA,QAAA,CAAS,MAAQ,EAAA,GAAG,CAAC,CAAA;AAAA,KACzC;AAAA,IACA,CAAC,UAAU,cAAc;AAAA,GAC3B;AAEA,EAAM,MAAA,YAAA,GAAeA,mBAAY,MAAM;AACrC,IAAA,IAAA,CAAK,SAAS,OAA6B,EAAA,YAAA,EAAc,WAAa,EAAA,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,GAC1F,EAAG,CAAC,IAAM,EAAA,QAAA,EAAU,cAAc,WAAa,EAAA,IAAA,EAAM,SAAS,CAAC,CAAA;AAE/D,EAAM,MAAA,eAAA,GAAkB,CAAC,oBAAA,EAAkC,eAAgC,KAAA;AACzF,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,oBAAsB,EAAA;AACxB,QAAqB,oBAAA,EAAA;AAAA;AAEvB,MAAgB,eAAA,EAAA;AAAA,KAClB;AAAA,GACF;AAEA,EAAM,MAAA,YAAA,GAAeE,uBAAM,CAAA,YAAA,CAAa,YAAc,EAAA;AAAA,IACpD,GAAK,EAAA,QAAA;AAAA,IACL,KAAO,EAAA,WAAA;AAAA,IACP,OAAS,EAAA,eAAA,CAAgB,YAAa,CAAA,KAAA,CAAM,SAAS,YAAY;AAAA;AAAA,GAElE,CAAA;AAED,EAAAP,iBAAU,MAAM;AACd,IAAA,MAAM,MAAS,GAAA,KAAA,EAAO,KAAS,IAAA,KAAA,CAAM,KAAM,CAAA,MAAA,GAAS,CAAI,GAAA,KAAA,CAAM,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,MAAS,GAAA,CAAA;AACxF,IAAA,cAAA,CAAe,EAAG,CAAA,QAAA,CAAS,MAAQ,EAAA,GAAG,CAAC,CAAA;AAAA,GACzC,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,QAAS,CAAA,OAAA,IAAW,EAAE,QAAA,CAAS,mBAAmB,gBAAmB,CAAA,EAAA;AACvE,MAAM,MAAA,IAAI,MAAM,mFAAuB,CAAA;AAAA;AACzC,GACF,EAAG,EAAE,CAAA;AAEL,EAAO,uBAAAC,cAAA,CAAAO,mBAAA,EAAA,EAAG,QAAa,EAAA,YAAA,EAAA,CAAA;AACzB;AC5CA,IAAM,UAAUC,4CAA0B,EAAA;AAE3B,SAAR,UAA2B,EAAE,OAAA,EAAS,UAAU,YAAc,EAAA,SAAA,EAAW,GAAkB,EAAA;AAEhG,EAAM,MAAA,QAAA,GAAWJ,mBAAY,MAAM;AACjC,IAAA,MAAM,SAAY,GAAA,IAAI,GAAI,CAAA,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,SAAA,EAAW,OAAO,CAAA;AAC7C,IAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,UAAA,EAAY,QAAQ,CAAA;AAE/C,IAAA,IAAI,SAAW,EAAA;AACb,MAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,WAAA,EAAa,SAAS,CAAA;AAAA;AAGnD,IAAA,IAAI,CAAG,EAAA;AACL,MAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,GAAA,EAAK,CAAC,CAAA;AAAA;AAGnC,IAAA,IAAI,YAAc,EAAA;AAChB,MAAU,SAAA,CAAA,YAAA,CAAa,GAAI,CAAA,cAAA,EAAgB,YAAY,CAAA;AAAA;AAGzD,IAAA,OAAO,UAAU,QAAS,EAAA;AAAA,GAC5B,EAAG,CAAC,OAAS,EAAA,QAAA,EAAU,GAAG,YAAc,EAAA,SAAA,EAAW,OAAO,CAAC,CAAA;AAM3D,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,YAAY,QAAS,EAAA;AAE3B,IAAA,QAAA,CAAS,IAAO,GAAA,SAAA;AAAA,GAClB;AAqBA,EAAM,MAAA,IAAA,GAAO,OAAO,OAA6B,KAAA;AAC/C,IAAA,OAAO,IAAI,OAAA,CAAwB,CAAC,OAAA,EAAS,MAAW,KAAA;AACtD,MAAA,MAAM,YAAY,QAAS,EAAA;AAE3B,MAAM,MAAA,KAAA,GAAS,OAAW,IAAA,OAAA,CAAQ,UAAe,IAAA,GAAA;AACjD,MAAM,MAAA,MAAA,GAAU,OAAW,IAAA,OAAA,CAAQ,WAAgB,IAAA,GAAA;AAEnD,MAAM,MAAA,IAAA,GAAQ,WAAW,OAAQ,CAAA,SAAA,IAAc,OAAO,OAAW,GAAA,CAAA,MAAA,CAAO,aAAa,KAAS,IAAA,CAAA;AAC9F,MAAM,MAAA,GAAA,GAAO,WAAW,OAAQ,CAAA,QAAA,IAAa,OAAO,OAAW,GAAA,CAAA,MAAA,CAAO,aAAa,KAAS,IAAA,CAAA;AAE5F,MAAM,MAAA,aAAA,GAAgB,SAAS,KAAK,CAAA,QAAA,EAAW,MAAM,CAAS,MAAA,EAAA,IAAI,QAAQ,GAAG,CAAA,CAAA;AAC7E,MAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAA,SAAA,EAAY,WAAW,OAAQ,CAAA,UAAA,IAAe,aAAa,aAAa,CAAA;AAElG,MAAA,IAAI,CAAC,KAAO,EAAA;AACV,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,mFAAkB,CAAC,CAAA;AAEpC,QAAA;AAAA;AAGF,MAAA,IAAI,SAAY,GAAA,KAAA;AAEhB,MAAM,MAAA,aAAA,GAAgB,CAAC,KAAwB,KAAA;AAC7C,QAAA,IAAI,MAAM,MAAW,KAAA,IAAI,GAAI,CAAA,SAAS,EAAE,MAAQ,EAAA;AAC9C,UAAA;AAAA;AAGF,QAAA,IAAI,CAAC,SAAW,EAAA;AACd,UAAY,SAAA,GAAA,IAAA;AAEZ,UAAA,IAAI,MAAM,IAAM,EAAA;AACd,YAAA,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,WACb,MAAA;AACL,YAAA,MAAA,CAAO,yFAAmB,CAAA;AAAA;AAG5B,UAAA,KAAA,EAAO,KAAM,EAAA;AACb,UAAO,MAAA,CAAA,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA;AACrD,OACF;AAEA,MAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,KACjD,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,SAAS,SAAU;AAAA,IACvB,MAAS,GAAA,GAAA;AAAA,IACT,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAU,GAAA,6CAAA;AAAA,IACV,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAe,GAAA;AAAA,GAWd,EAAA;AACD,IAAA,MAAM,YAAY,QAAS,EAAA;AAE3B,IAAAL,iBAAU,MAAM;AACd,MAAI,IAAA,CAAC,SAAa,IAAA,CAAC,OAAS,EAAA;AAC1B,QAAA;AAAA;AAGF,MAAM,MAAA,OAAA,GAAU,CAAC,CAAoB,KAAA;AACnC,QAAI,IAAA,YAAA,IAAgB,CAAE,CAAA,MAAA,KAAW,OAAS,EAAA;AACxC,UAAA;AAAA;AAGF,QAAA,MAAM,IAAI,CAAE,CAAA,IAAA;AACZ,QAAA,IAAI,CAAG,EAAA;AACL,UAAI,IAAA,CAAA,CAAE,WAAW,OAAS,EAAA;AACxB,YAAA,OAAA,CAAQ,CAAC,CAAA;AAET,YAAA;AAAA,WACS,MAAA,IAAA,OAAA,IAAW,CAAE,CAAA,MAAA,KAAW,OAAS,EAAA;AAC1C,YAAA,OAAA,CAAQ,CAAC,CAAA;AAET,YAAA;AAAA,WACS,MAAA,IAAA,SAAA,IAAa,CAAE,CAAA,MAAA,KAAW,UAAY,EAAA;AAC/C,YAAA,SAAA,CAAU,CAAC,CAAA;AAEX,YAAA;AAAA;AACF,mBACS,OAAS,EAAA;AAClB,UAAQ,OAAA,CAAA;AAAA,YACN,MAAQ,EAAA,OAAA;AAAA,YACR,SAAW,EAAA,EAAA;AAAA,YACX,WAAa,EAAA;AAAA,WACd,CAAA;AAAA;AACH,OACF;AAEA,MAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,OAAwB,CAAA;AAE3D,MAAA,OAAO,MAAM,MAAA,CAAO,mBAAoB,CAAA,SAAA,EAAW,OAAwB,CAAA;AAAA,OAC1E,CAAC,OAAA,EAAS,OAAS,EAAA,SAAA,EAAW,YAAY,CAAC,CAAA;AAE9C,IAAA,uBACEC,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,SAAA;AAAA,QACL,KAAM,EAAA,MAAA;AAAA,QACN,QAAQ,OAAO,MAAA,KAAW,QAAW,GAAA,CAAA,EAAG,MAAM,CAAO,EAAA,CAAA,GAAA,MAAA;AAAA,QACrD,KAAO,EAAA,EAAE,MAAQ,EAAA,CAAA,EAAG,GAAG,KAAM,EAAA;AAAA,QAC7B,SAAA;AAAA,QACA,OAAA;AAAA,QACC,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC;AAAA,KAC5B;AAAA,GAEJ;AAEA,EAAO,OAAA,EAAE,QAAU,EAAA,IAAA,EAAM,MAAO,EAAA;AAClC","file":"index.cjs","sourcesContent":["export async function loadScript(url: string) {\r\n await new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n script.addEventListener('load', () => {\r\n resolve({ loaded: true, error: false });\r\n });\r\n\r\n script.addEventListener('error', () => {\r\n reject({\r\n loaded: false,\r\n error: true,\r\n message: '파일 로드에 실패하였습니다.'\r\n });\r\n });\r\n\r\n document.body.appendChild(script);\r\n });\r\n}\r\n","import { getEnvironmentFromHostname, getServicePath, isClient } from 'sales-frontend-utils';\n\nexport const getServiceUrl = (serviceName: string) => {\n if (!isClient()) {\n return '';\n }\n\n const env = getEnvironmentFromHostname(location.hostname);\n\n switch (env) {\n case 'local':\n return `${getServicePath()}/api/${serviceName}`;\n case 'dev':\n return `https://nxl-${serviceName}-dev.hanwhalife.com/api`;\n case 'stg':\n return `https://nxl-${serviceName}-stg.hanwhalife.com/api`;\n case 'prd':\n return `https://nxl-${serviceName}.hanwhalife.com/api`;\n default:\n return ``;\n }\n\n // return `https://nxl-${env !== 'prd' ? `${serviceName}-${env}` : serviceName}.hanwhalife.com`;\n};\n\nexport const API_ENDPOINTS = {\n GET_NXL_CODES: (codeId: string) => `${getServiceUrl('nlc')}/code/code-list/get?codeId=${codeId}&intgYn=N`,\n GET_NOTICE_SYSTEM: (code: string) => `${getServiceUrl('nlc')}/notice/system/${code}/get`,\n GET_NOTICE_INTEGRATED: (code: string) => `${getServiceUrl('nlc')}/notice/integrated/${code}/get`,\n GET_V3_LICENSE: (date: Date) => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const dateStr = `${year}-${month}-${day} ${hours}:${minutes}`;\n\n return `${getServiceUrl('nlm')}/v3/init?time=${dateStr}`;\n },\n INPUT_PREFILL_USER: `${getServiceUrl('nlc')}/user-ctfn/ncsr-info-inpt/post`\n} as const;\n","// import { getV3License } from '@nxl-kit/api';\r\nimport { getV3License } from './api/get-v3-license';\r\n\r\ndeclare global {\r\n interface Window {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n mpl_start?: (license?: any, time?: any, cryptoKeyVersion?: any, RootCheckTimeOut?: any) => void;\r\n\r\n /**\r\n * MPL의 상태를 반환하는 API\r\n * @returns\r\n * INITIAL - 동작중이지 않음\r\n * ALIVE - 동작중임\r\n * Undefined 네트워크 연결 문제\r\n */\r\n mpl_status?: () => 'INITAL' | 'ALIVE' | 'Undefined';\r\n\r\n mpl_load?: (tk?: string, cd?: string) => void;\r\n mpl_token?: () => string;\r\n mpl_enc_param?: () => string;\r\n mpl_stop?: () => void;\r\n }\r\n}\r\n\r\nconst isAndroid = (): boolean => {\r\n return /android/i.test(navigator.userAgent) && !/edge/i.test(navigator.userAgent);\r\n};\r\n\r\nconst startV3 = async () => {\r\n console.log('start v3');\r\n if (!isAndroid() || !window.mpl_start) {\r\n return;\r\n }\r\n\r\n window.mpl_stop?.();\r\n sessionStorage.removeItem('mtk');\r\n sessionStorage.removeItem('mcd');\r\n\r\n const v3Response = await getV3License({\r\n date: new Date()\r\n });\r\n\r\n console.log('getV3 License', v3Response);\r\n if (!v3Response) {\r\n return;\r\n }\r\n\r\n window.mpl_start(v3Response.data?.encLicense, v3Response.data?.time);\r\n\r\n setTimeout(() => {\r\n const mtk = window.mpl_token?.();\r\n const mcd = window.mpl_enc_param?.();\r\n\r\n if (mtk) {\r\n sessionStorage.setItem('mtk', mtk);\r\n }\r\n if (mcd) {\r\n sessionStorage.setItem('mcd', mcd);\r\n }\r\n }, 500);\r\n};\r\n\r\nconst loadV3 = () => {\r\n console.log('load v3');\r\n const mtk = sessionStorage.getItem('mtk') || window.mpl_token?.();\r\n const mcd = sessionStorage.getItem('mcd') || window.mpl_enc_param?.();\r\n\r\n if (mtk && mcd && window.mpl_load && mtk !== 'undefined' && mcd !== 'undefined') {\r\n window.mpl_load(mtk, mcd);\r\n }\r\n};\r\n\r\nconst checkV3Status = async (type: string) => {\r\n console.log('check v3 status');\r\n await new Promise((resolve) => setTimeout(resolve, 500));\r\n\r\n if (!isAndroid() || !window.mpl_status) {\r\n console.log('not android or no mpl_status');\r\n\r\n return true;\r\n }\r\n\r\n if (window.mpl_status() === 'ALIVE') {\r\n console.log('mpl status is alive');\r\n loadV3();\r\n\r\n return true;\r\n }\r\n\r\n console.log('v3 not alive');\r\n\r\n if (type === 'modal') {\r\n console.log('modal start v3');\r\n await startV3();\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const launchV3 = async () => {\r\n loadV3();\r\n\r\n return await checkV3Status('loader');\r\n};\r\n","import React, { createContext, useContext, useEffect, useState } from 'react';\r\n\r\nimport { loadScript } from './utils/load-script';\r\nimport { launchV3 } from './v3';\r\n\r\ninterface V3ContextType {\r\n isLoaded: boolean;\r\n launch: () => void;\r\n}\r\n\r\nconst V3Context = createContext<V3ContextType | undefined>(undefined);\r\n\r\nconst AhnlabV3JsUrl = 'https://mpl.ahnlab.com/js/mpl_webview_cm.js';\r\n\r\nexport const V3Provider = ({ children }: { children: React.ReactNode }) => {\r\n const [isLoaded, setIsLoaded] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n const initialize = async () => {\r\n await loadScript(AhnlabV3JsUrl);\r\n setIsLoaded(true);\r\n };\r\n\r\n initialize();\r\n }, []);\r\n\r\n return <V3Context.Provider value={{ isLoaded, launch: launchV3 }}>{children}</V3Context.Provider>;\r\n};\r\n\r\nexport const useV3 = () => {\r\n const context = useContext(V3Context);\r\n\r\n if (!context) {\r\n throw new Error('V3Provider를 정의해주세요.');\r\n }\r\n\r\n return context;\r\n};\r\n","import { isClient } from 'sales-frontend-utils';\r\n\r\nimport { KeypadActionType } from '../types/keypad-action.type';\r\nimport { loadScript } from '../utils/load-script';\r\n\r\ntype ENV = 'dev' | 'stg' | 'prod';\r\n\r\nconst getPath = (service: string, env: ENV) =>\r\n `https://nxl-${env !== 'prod' ? `${service}-${env}` : service}.hanwhalife.com`;\r\n\r\nconst getEnv: () => ENV = () => {\r\n const host = window.location.hostname;\r\n\r\n // if (host.includes('-dev.') || host.includes('localhost')) {\r\n // return 'dev';\r\n // } else if (host.includes('-stg.')) {\r\n // return 'stg';\r\n // } else {\r\n // return 'prod';\r\n // }\r\n\r\n return 'stg';\r\n};\r\n\r\ninterface KeypadConfig {\r\n version: string;\r\n server: string;\r\n contextRoot: string;\r\n cssPath: string;\r\n logoImgPath: string;\r\n inputObjectBackgroundColor: string;\r\n inputObjectBorderStyle: string;\r\n invalidSessionErrorMessage: string;\r\n invalidSessionAutoRefresh: boolean;\r\n enableAccessibility: boolean;\r\n useCustomAlert: boolean;\r\n functionKeyButtonStyle: string;\r\n maxInputSize: number;\r\n textInputView: number;\r\n touchOption: number;\r\n}\r\n\r\nexport const XKeyboardMobileInstance = (() => {\r\n if (!isClient()) {\r\n return null;\r\n }\r\n\r\n const env = getEnv();\r\n\r\n const keypadServicePath = `${getPath('xkp', env)}/xkp/xkscriptservice`;\r\n const keypadContentsPath = `${getPath('nlc', env)}/cnts-files/xkeyboard`;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (window as any).XKConfigMobile = {\r\n version: '1.0.5.1',\r\n server: keypadServicePath,\r\n contextRoot: `${keypadContentsPath}/js`,\r\n cssPath: `${keypadContentsPath}/css/xkp_mobile.css`,\r\n logoImgPath: `${keypadContentsPath}/img/logo.png`,\r\n inputObjectBackgroundColor: '#E4E4E4',\r\n inputObjectBorderStyle: '1px solid #9E9E9E',\r\n invalidSessionErrorMessage: \"보안세션이 만료되었습니다.\\n'확인'을 누르면 키패드가 갱신 됩니다.\",\r\n invalidSessionAutoRefresh: true,\r\n enableAccessibility: true,\r\n useCustomAlert: false,\r\n functionKeyButtonStyle: 'text',\r\n maxInputSize: 56,\r\n textInputView: 0,\r\n touchOption: 0\r\n } as KeypadConfig;\r\n\r\n document.oncontextmenu = () => false;\r\n document.ondragstart = () => false;\r\n document.onselectstart = () => false;\r\n\r\n const headTag = document.head;\r\n const scriptsToLoad = ['xkeypad_mobile.js'];\r\n\r\n const urls = scriptsToLoad.map(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (x) => `${(window as any).XKConfigMobile.contextRoot}/${x}`\r\n );\r\n\r\n Promise.all(urls.map((x) => loadScript(x))).then(() => {\r\n const existingLink = document.getElementById('xkStyle');\r\n\r\n if (existingLink?.parentNode) {\r\n existingLink.parentNode.removeChild(existingLink);\r\n }\r\n\r\n const linkElement = document.createElement('link');\r\n linkElement.id = 'xkStyle';\r\n linkElement.rel = 'stylesheet';\r\n linkElement.type = 'text/css';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n linkElement.href = (window as any).XKConfigMobile.cssPath;\r\n\r\n headTag.appendChild(linkElement);\r\n });\r\n\r\n const keypads: { [key: string]: KeypadActionType | undefined } = {};\r\n\r\n const getKeypad = (name: string) => keypads[name];\r\n\r\n const setKeypad = (name: string, keypad: KeypadActionType) => {\r\n keypads[name] = keypad;\r\n\r\n return keypad;\r\n };\r\n\r\n const removeKeypad = (name: string) => {\r\n delete keypads[name];\r\n };\r\n\r\n const closeAll = () => {\r\n Object.keys(keypads).forEach((id) => {\r\n const keypad = keypads[id];\r\n if (keypad && keypad.isOpen()) {\r\n keypad.close();\r\n }\r\n });\r\n };\r\n\r\n const newKeypad = (name: string) => {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return setKeypad(name, new (window as any).XKModule());\r\n };\r\n\r\n return {\r\n keypads,\r\n getKeypad,\r\n setKeypad,\r\n newKeypad,\r\n removeKeypad,\r\n closeAll\r\n };\r\n})();\r\n","enum KeypadMessageTypeEnum {\r\n NotSupportDevice = -1,\r\n Already = -2\r\n}\r\n\r\nexport default KeypadMessageTypeEnum;\r\n","enum KeypadModeEnum {\r\n QWERTY_SMART = 'qwertysmart',\r\n NUMBER = 'number'\r\n}\r\n\r\nexport default KeypadModeEnum;","export const uuidv4 = (): string => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 || 0,\r\n v = c === 'x' ? r : (r && 0x3) || 0x8;\r\n\r\n return v.toString(16);\r\n });\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { XKeyboardMobileInstance } from '../libs/xkeyboard';\r\nimport KeypadMessageTypeEnum from '../types/keypad-message.enum';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport { uuidv4 } from '../utils/uuid';\r\n\r\nexport default function useKeypad() {\r\n const [isShow, setIsShow] = useState<boolean>(false);\r\n\r\n const show = useCallback(\r\n (\r\n inputRef: HTMLInputElement,\r\n onInputChange: (length: number) => void,\r\n onKeypadClose: (res: KeypadResponseType) => void,\r\n keyType: KeypadModeEnum = KeypadModeEnum.QWERTY_SMART,\r\n maxLength: number,\r\n numberKeyRowCount: number\r\n ) => {\r\n const name = uuidv4();\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n let keypad = XKeyboardMobileInstance.getKeypad(name);\r\n if (!keypad) {\r\n keypad = XKeyboardMobileInstance.newKeypad(name);\r\n } else {\r\n keypad.refresh();\r\n }\r\n\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(0);\r\n }\r\n\r\n const keyPadParam = {\r\n name: `xk-pad-${name}`,\r\n editBox: inputRef,\r\n keyType,\r\n width: 100,\r\n position: { top: 10, left: null },\r\n viewType: 'half',\r\n closeDelay: 0,\r\n autoKeyResize: true,\r\n isE2E: true,\r\n onlyMobile: false,\r\n hasPressEffect: true,\r\n maxLength,\r\n numberKeyRowCount,\r\n onInputChange: (newLength: number) => {\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(newLength);\r\n }\r\n\r\n // 키패드가 존재하지 않을 경우, 종료\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n //키패드 입력 길이가 최대 입력 길이가 됐을 때 키패드 닫기\r\n if (\r\n keyPadParam.maxLength &&\r\n keyPadParam.maxLength > 0 &&\r\n newLength >= keyPadParam.maxLength &&\r\n keypad.isOpend()\r\n ) {\r\n keypad.close();\r\n setIsShow(false);\r\n\r\n return;\r\n }\r\n },\r\n onKeypadClose: () => {\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (onKeypadClose && typeof onKeypadClose === 'function') {\r\n const sessionInfo = keypad.get_sessionInfo();\r\n let length = 0;\r\n if (sessionInfo.input && sessionInfo.input.indexOf(',') >= 0) {\r\n length = sessionInfo.input.split(',').length;\r\n }\r\n\r\n const res = {\r\n length,\r\n element: inputRef,\r\n sessionInfo: {\r\n input: sessionInfo.input,\r\n sessionId: sessionInfo.sessionId,\r\n secToken: sessionInfo.secToken\r\n },\r\n keyType,\r\n name\r\n };\r\n\r\n setIsShow(false);\r\n onKeypadClose(res);\r\n }\r\n\r\n XKeyboardMobileInstance.removeKeypad(name);\r\n\r\n if (!onKeypadClose) {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n\r\n if (typeof onKeypadClose !== 'function') {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n }\r\n };\r\n\r\n const aRet = keypad.initialize(keyPadParam);\r\n\r\n if (aRet === KeypadMessageTypeEnum.NotSupportDevice) {\r\n // 안내 메세지 세팅\r\n alert('지원하지 않는 기기 입니다.');\r\n\r\n return;\r\n } else if (aRet === KeypadMessageTypeEnum.Already) {\r\n // alert('이미 키패드가 실행 중입니다.');\r\n return;\r\n }\r\n\r\n setIsShow(true);\r\n },\r\n []\r\n );\r\n\r\n const getValue = (name: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const targetKeypad = XKeyboardMobileInstance.keypads[name];\r\n\r\n if (!targetKeypad) {\r\n return null;\r\n }\r\n\r\n return targetKeypad.get_sessionInfo();\r\n };\r\n\r\n /**\r\n * 활성화 되어있는 키패드 찾는다\r\n * @returns\r\n */\r\n const find = (name?: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (name) {\r\n return XKeyboardMobileInstance.keypads[name];\r\n } else {\r\n // 키패드가 출력되어있으면, 확인하여 키패드를 닫는다.\r\n const keypadIds = Object.keys(XKeyboardMobileInstance.keypads);\r\n\r\n for (const keypadId of keypadIds) {\r\n const targetKeypad = XKeyboardMobileInstance.keypads[keypadId];\r\n\r\n if (targetKeypad && targetKeypad.isOpen()) {\r\n return targetKeypad;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isOpen = (name?: string) => {\r\n const targetKeypad = find(name);\r\n\r\n return !!targetKeypad;\r\n };\r\n\r\n const close = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.close();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const clear = (name?: string) => {\r\n const _xkmodule = find(name);\r\n if (_xkmodule) {\r\n _xkmodule.clear();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const refresh = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.refresh();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleMouseDown = (event: MouseEvent) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const keypadAlertDivTag = document.querySelector('#xkalert');\r\n\r\n const keypadDivTag = keypadAlertDivTag?.parentElement;\r\n if (keypadDivTag && !keypadDivTag.contains(event.target as Node)) {\r\n XKeyboardMobileInstance.closeAll();\r\n setIsShow(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleMouseDown);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleMouseDown);\r\n };\r\n }, []);\r\n\r\n return {\r\n show,\r\n close,\r\n clear,\r\n refresh,\r\n getValue,\r\n isOpen,\r\n find,\r\n isShow\r\n };\r\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\r\n\r\nimport useXKeypad from '../hooks/use-keypad';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport KeypadSessionType from '../types/keypad-session.type';\r\nimport KeypadType from '../types/keypad.type';\r\n\r\ntype Props = {\r\n value: KeypadSessionType | null;\r\n inputElement: KeypadType;\r\n mode: KeypadModeEnum;\r\n onChange: (value: KeypadSessionType | null) => void;\r\n maxLength: number;\r\n};\r\n\r\nexport default function Keypad({ value, onChange, mode, maxLength, inputElement }: Props) {\r\n const { show, isShow } = useXKeypad();\r\n\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const [maskedValue, setMaskedValue] = useState<string>('');\r\n\r\n const onCloseBack = useCallback(\r\n (res: KeypadResponseType) => {\r\n onChange(res.sessionInfo);\r\n },\r\n [onChange]\r\n );\r\n\r\n const onChangeBack = useCallback(\r\n (length: number) => {\r\n if (length === 0) {\r\n onChange(null);\r\n }\r\n setMaskedValue(''.padStart(length, '*'));\r\n },\r\n [onChange, setMaskedValue]\r\n );\r\n\r\n const handleKeypad = useCallback(() => {\r\n show(inputRef.current as HTMLInputElement, onChangeBack, onCloseBack, mode, maxLength, 3);\r\n }, [show, inputRef, onChangeBack, onCloseBack, mode, maxLength]);\r\n\r\n const enhancedOnClick = (existingClickHandler: () => void, newClickHandler: () => void) => {\r\n return () => {\r\n if (existingClickHandler) {\r\n existingClickHandler();\r\n }\r\n newClickHandler();\r\n };\r\n };\r\n\r\n const cloneElement = React.cloneElement(inputElement, {\r\n ref: inputRef,\r\n value: maskedValue,\r\n onClick: enhancedOnClick(inputElement.props.onClick, handleKeypad)\r\n // iskeypadactive: isShow\r\n });\r\n\r\n useEffect(() => {\r\n const length = value?.input && value.input.length > 0 ? value.input.split(',').length : 0;\r\n setMaskedValue(''.padStart(length, '*'));\r\n }, [value]);\r\n\r\n useEffect(() => {\r\n if (inputRef.current && !(inputRef.current instanceof HTMLInputElement)) {\r\n throw new Error('Input 태그가 정의되지 않았습니다.');\r\n }\r\n }, []);\r\n\r\n return <>{cloneElement}</>;\r\n}\r\n","import { useCallback, useEffect } from 'react';\r\n\r\nimport { getNlcHostFromEnvironment } from 'sales-frontend-utils';\r\nexport type NxlOneProps = {\r\n bizCode: string;\r\n tmplCode: string;\r\n ncsrInfoUuid?: string;\r\n nlcCtfnId?: string;\r\n // TYPE\r\n t?: string;\r\n env?: 'dev' | 'stg' | 'prod';\r\n};\r\n\r\nexport type NxlOneResponse = {\r\n action?: 'error' | 'close' | 'complete';\r\n redirectUrl?: string;\r\n nlcCtfnId?: string;\r\n};\r\n\r\n\r\n\r\ntype OpenOptionType = {\r\n popupWidth?: number;\r\n popupHeight?: number;\r\n popupLeft?: number;\r\n popupTop?: number;\r\n windowName?: string;\r\n};\r\nconst baseUrl = getNlcHostFromEnvironment();\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps) {\r\n\r\n const buildUrl = useCallback(() => {\r\n const targetUrl = new URL('/auth/v1', baseUrl);\r\n targetUrl.searchParams.set('bizCode', bizCode);\r\n targetUrl.searchParams.set('tmplCode', tmplCode);\r\n\r\n if (nlcCtfnId) {\r\n targetUrl.searchParams.set('nlcCtfnId', nlcCtfnId);\r\n }\r\n\r\n if (t) {\r\n targetUrl.searchParams.set('t', t);\r\n }\r\n\r\n if (ncsrInfoUuid) {\r\n targetUrl.searchParams.set('ncsrInfoUuid', ncsrInfoUuid);\r\n }\r\n\r\n return targetUrl.toString();\r\n }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId, baseUrl]);\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지로 이동합니다.\r\n * 인증이 완료 후, 관리자 페이지에서 정의한 프로세스 완료 URL로 이동합니다.\r\n */\r\n const redirect = () => {\r\n const targetUrl = buildUrl();\r\n\r\n location.href = targetUrl;\r\n };\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지를 팝업으로 엽니다.\r\n * @param options 팝업의 크기, 위치, 창 이름을 정의합니다.\r\n * @returns 완료 URL에 인증 ID가 Query String 이 함께 정의된 형태로 반환됩니다.\r\n *\r\n * @example\r\n * const { open } = useNxlOne();\r\n *\r\n * const handleClick = async () => {\r\n * try {\r\n * const result = await open({ popupWidth: 500, popupHeight: 500 });\r\n * console.log('이동 시킬 URL : ' + result);\r\n * } catch (e) {\r\n * console.error('팝업 프로세스 실패');\r\n * }\r\n * }\r\n *\r\n * @note 팝업은 반드시 사용자 이벤트 핸들러 내에서 직접 호출해야 브라우저 차단을 피할 수 있습니다.\r\n */\r\n const open = async (options?: OpenOptionType) => {\r\n return new Promise<NxlOneResponse>((resolve, reject) => {\r\n const targetUrl = buildUrl();\r\n\r\n const width = (options && options.popupWidth) || 744;\r\n const height = (options && options.popupHeight) || 720;\r\n\r\n const left = (options && options.popupLeft) || window.screenX + (window.outerWidth - width) / 2;\r\n const top = (options && options.popupTop) || window.screenX + (window.outerWidth - width) / 2;\r\n\r\n const popupFeatures = `width=${width},height=${height},left=${left},top=${top}`;\r\n const popup = window.open(targetUrl, (options && options.windowName) || 'self_cert', popupFeatures);\r\n\r\n if (!popup) {\r\n reject(new Error('차단되거나 열리지 않았습니다.'));\r\n\r\n return;\r\n }\r\n\r\n let isSettled = false;\r\n\r\n const handleMessage = (event: MessageEvent) => {\r\n if (event.origin !== new URL(targetUrl).origin) {\r\n return;\r\n }\r\n\r\n if (!isSettled) {\r\n isSettled = true;\r\n\r\n if (event.data) {\r\n resolve(event.data);\r\n } else {\r\n reject('인증이 취소되거나 실패했습니다.');\r\n }\r\n\r\n popup?.close();\r\n window.removeEventListener('message', handleMessage);\r\n }\r\n };\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n };\r\n\r\n const Iframe = function ({\r\n height = 720,\r\n className,\r\n style,\r\n allow,\r\n sandbox = 'allow-scripts allow-forms allow-same-origin',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n strictOrigin = true\r\n }: {\r\n height?: number | string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n allow?: string;\r\n sandbox?: string;\r\n onSuccess?: (response: NxlOneResponse) => void;\r\n onError?: (response: NxlOneResponse) => void;\r\n onClose: (response: NxlOneResponse) => void;\r\n strictOrigin?: boolean;\r\n }) {\r\n const targetUrl = buildUrl();\r\n\r\n useEffect(() => {\r\n if (!onSuccess && !onError) {\r\n return;\r\n }\r\n\r\n const handler = (e: MessageEvent) => {\r\n if (strictOrigin && e.origin !== baseUrl) {\r\n return;\r\n }\r\n\r\n const d = e.data as NxlOneResponse;\r\n if (d) {\r\n if (d.action === 'close') {\r\n onClose(d);\r\n\r\n return;\r\n } else if (onError && d.action === 'error') {\r\n onError(d);\r\n\r\n return;\r\n } else if (onSuccess && d.action === 'complete') {\r\n onSuccess(d);\r\n\r\n return;\r\n }\r\n } else if (onError) {\r\n onError({\r\n action: 'error',\r\n nlcCtfnId: '',\r\n redirectUrl: ''\r\n });\r\n }\r\n };\r\n\r\n window.addEventListener('message', handler as EventListener);\r\n\r\n return () => window.removeEventListener('message', handler as EventListener);\r\n }, [onClose, onError, onSuccess, strictOrigin]);\r\n\r\n return (\r\n <iframe\r\n src={targetUrl}\r\n width=\"100%\"\r\n height={typeof height === 'number' ? `${height}px` : height}\r\n style={{ border: 0, ...style }}\r\n className={className}\r\n sandbox={sandbox}\r\n {...(allow ? { allow } : {})}\r\n />\r\n );\r\n };\r\n\r\n return { redirect, open, Iframe };\r\n}\r\n"]}
package/dist/index.d.cts CHANGED
@@ -67,7 +67,7 @@ type OpenOptionType = {
67
67
  popupTop?: number;
68
68
  windowName?: string;
69
69
  };
70
- declare function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }: NxlOneProps): {
70
+ declare function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps): {
71
71
  redirect: () => void;
72
72
  open: (options?: OpenOptionType) => Promise<NxlOneResponse>;
73
73
  Iframe: ({ height, className, style, allow, sandbox, onSuccess, onError, onClose, strictOrigin }: {
package/dist/index.d.ts CHANGED
@@ -67,7 +67,7 @@ type OpenOptionType = {
67
67
  popupTop?: number;
68
68
  windowName?: string;
69
69
  };
70
- declare function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }: NxlOneProps): {
70
+ declare function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps): {
71
71
  redirect: () => void;
72
72
  open: (options?: OpenOptionType) => Promise<NxlOneResponse>;
73
73
  Iframe: ({ height, className, style, allow, sandbox, onSuccess, onError, onClose, strictOrigin }: {
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import React2, { createContext, useState, useEffect, useContext, useRef, useCallback } from 'react';
2
- import { isClient, getEnvironmentFromHostname, getServicePath } from 'sales-frontend-utils';
2
+ import { isClient, getNlcHostFromEnvironment, getEnvironmentFromHostname, getServicePath } from 'sales-frontend-utils';
3
3
  import { jsx, Fragment } from 'react/jsx-runtime';
4
4
 
5
5
  // src/v3-provider.tsx
6
6
 
7
7
  // src/utils/load-script.ts
8
- async function loadScript(url2) {
8
+ async function loadScript(url) {
9
9
  await new Promise((resolve, reject) => {
10
10
  const script = document.createElement("script");
11
- script.src = url2;
11
+ script.src = url;
12
12
  script.async = true;
13
13
  script.addEventListener("load", () => {
14
14
  resolve({ loaded: true, error: false });
@@ -416,20 +416,10 @@ function Keypad({ value, onChange, mode, maxLength, inputElement }) {
416
416
  }, []);
417
417
  return /* @__PURE__ */ jsx(Fragment, { children: cloneElement });
418
418
  }
419
- var url = (() => {
420
- const url2 = typeof window !== "undefined" ? window.location.href : "";
421
- if (url2.includes("localhost") || url2.includes("dev")) {
422
- return "https://nxl-nlc-dev.hanwhalife.com";
423
- } else if (url2.includes("stg")) {
424
- return "https://nxl-nlc-stg.hanwhalife.com";
425
- } else {
426
- return "https://nxl-nlc.hanwhalife.com";
427
- }
428
- })();
429
- function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }) {
430
- const baseUrl = env === "prod" ? "https://nxl-nlc.hanwhalife.com" : env === "stg" ? "https://nxl-nlc-stg.hanwhalife.com" : env === "dev" ? "https://nxl-nlc-dev.hanwhalife.com" : void 0;
419
+ var baseUrl = getNlcHostFromEnvironment();
420
+ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }) {
431
421
  const buildUrl = useCallback(() => {
432
- const targetUrl = new URL("/auth/v1", baseUrl || url);
422
+ const targetUrl = new URL("/auth/v1", baseUrl);
433
423
  targetUrl.searchParams.set("bizCode", bizCode);
434
424
  targetUrl.searchParams.set("tmplCode", tmplCode);
435
425
  if (nlcCtfnId) {
@@ -496,7 +486,7 @@ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }) {
496
486
  return;
497
487
  }
498
488
  const handler = (e) => {
499
- if (strictOrigin && e.origin !== url) {
489
+ if (strictOrigin && e.origin !== baseUrl) {
500
490
  return;
501
491
  }
502
492
  const d = e.data;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/load-script.ts","../src/api/endpoint.ts","../src/v3.ts","../src/v3-provider.tsx","../src/libs/xkeyboard.ts","../src/types/keypad-message.enum.ts","../src/types/keypad-mode.enum.ts","../src/utils/uuid.ts","../src/hooks/use-keypad.ts","../src/components/Keypad.tsx","../src/hooks/use-nxl-one.tsx"],"names":["url","isClient","KeypadMessageTypeEnum","KeypadModeEnum","useState","useEffect","useCallback","React","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export async function loadScript(url: string) {\r\n await new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n script.addEventListener('load', () => {\r\n resolve({ loaded: true, error: false });\r\n });\r\n\r\n script.addEventListener('error', () => {\r\n reject({\r\n loaded: false,\r\n error: true,\r\n message: '파일 로드에 실패하였습니다.'\r\n });\r\n });\r\n\r\n document.body.appendChild(script);\r\n });\r\n}\r\n","import { getEnvironmentFromHostname, getServicePath, isClient } from 'sales-frontend-utils';\n\nexport const getServiceUrl = (serviceName: string) => {\n if (!isClient()) {\n return '';\n }\n\n const env = getEnvironmentFromHostname(location.hostname);\n\n switch (env) {\n case 'local':\n return `${getServicePath()}/api/${serviceName}`;\n case 'dev':\n return `https://nxl-${serviceName}-dev.hanwhalife.com/api`;\n case 'stg':\n return `https://nxl-${serviceName}-stg.hanwhalife.com/api`;\n case 'prd':\n return `https://nxl-${serviceName}.hanwhalife.com/api`;\n default:\n return ``;\n }\n\n // return `https://nxl-${env !== 'prd' ? `${serviceName}-${env}` : serviceName}.hanwhalife.com`;\n};\n\nexport const API_ENDPOINTS = {\n GET_NXL_CODES: (codeId: string) => `${getServiceUrl('nlc')}/code/code-list/get?codeId=${codeId}&intgYn=N`,\n GET_NOTICE_SYSTEM: (code: string) => `${getServiceUrl('nlc')}/notice/system/${code}/get`,\n GET_NOTICE_INTEGRATED: (code: string) => `${getServiceUrl('nlc')}/notice/integrated/${code}/get`,\n GET_V3_LICENSE: (date: Date) => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const dateStr = `${year}-${month}-${day} ${hours}:${minutes}`;\n\n return `${getServiceUrl('nlm')}/v3/init?time=${dateStr}`;\n },\n INPUT_PREFILL_USER: `${getServiceUrl('nlc')}/user-ctfn/ncsr-info-inpt/post`\n} as const;\n","// import { getV3License } from '@nxl-kit/api';\r\nimport { getV3License } from './api/get-v3-license';\r\n\r\ndeclare global {\r\n interface Window {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n mpl_start?: (license?: any, time?: any, cryptoKeyVersion?: any, RootCheckTimeOut?: any) => void;\r\n\r\n /**\r\n * MPL의 상태를 반환하는 API\r\n * @returns\r\n * INITIAL - 동작중이지 않음\r\n * ALIVE - 동작중임\r\n * Undefined 네트워크 연결 문제\r\n */\r\n mpl_status?: () => 'INITAL' | 'ALIVE' | 'Undefined';\r\n\r\n mpl_load?: (tk?: string, cd?: string) => void;\r\n mpl_token?: () => string;\r\n mpl_enc_param?: () => string;\r\n mpl_stop?: () => void;\r\n }\r\n}\r\n\r\nconst isAndroid = (): boolean => {\r\n return /android/i.test(navigator.userAgent) && !/edge/i.test(navigator.userAgent);\r\n};\r\n\r\nconst startV3 = async () => {\r\n console.log('start v3');\r\n if (!isAndroid() || !window.mpl_start) {\r\n return;\r\n }\r\n\r\n window.mpl_stop?.();\r\n sessionStorage.removeItem('mtk');\r\n sessionStorage.removeItem('mcd');\r\n\r\n const v3Response = await getV3License({\r\n date: new Date()\r\n });\r\n\r\n console.log('getV3 License', v3Response);\r\n if (!v3Response) {\r\n return;\r\n }\r\n\r\n window.mpl_start(v3Response.data?.encLicense, v3Response.data?.time);\r\n\r\n setTimeout(() => {\r\n const mtk = window.mpl_token?.();\r\n const mcd = window.mpl_enc_param?.();\r\n\r\n if (mtk) {\r\n sessionStorage.setItem('mtk', mtk);\r\n }\r\n if (mcd) {\r\n sessionStorage.setItem('mcd', mcd);\r\n }\r\n }, 500);\r\n};\r\n\r\nconst loadV3 = () => {\r\n console.log('load v3');\r\n const mtk = sessionStorage.getItem('mtk') || window.mpl_token?.();\r\n const mcd = sessionStorage.getItem('mcd') || window.mpl_enc_param?.();\r\n\r\n if (mtk && mcd && window.mpl_load && mtk !== 'undefined' && mcd !== 'undefined') {\r\n window.mpl_load(mtk, mcd);\r\n }\r\n};\r\n\r\nconst checkV3Status = async (type: string) => {\r\n console.log('check v3 status');\r\n await new Promise((resolve) => setTimeout(resolve, 500));\r\n\r\n if (!isAndroid() || !window.mpl_status) {\r\n console.log('not android or no mpl_status');\r\n\r\n return true;\r\n }\r\n\r\n if (window.mpl_status() === 'ALIVE') {\r\n console.log('mpl status is alive');\r\n loadV3();\r\n\r\n return true;\r\n }\r\n\r\n console.log('v3 not alive');\r\n\r\n if (type === 'modal') {\r\n console.log('modal start v3');\r\n await startV3();\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const launchV3 = async () => {\r\n loadV3();\r\n\r\n return await checkV3Status('loader');\r\n};\r\n","import React, { createContext, useContext, useEffect, useState } from 'react';\r\n\r\nimport { loadScript } from './utils/load-script';\r\nimport { launchV3 } from './v3';\r\n\r\ninterface V3ContextType {\r\n isLoaded: boolean;\r\n launch: () => void;\r\n}\r\n\r\nconst V3Context = createContext<V3ContextType | undefined>(undefined);\r\n\r\nconst AhnlabV3JsUrl = 'https://mpl.ahnlab.com/js/mpl_webview_cm.js';\r\n\r\nexport const V3Provider = ({ children }: { children: React.ReactNode }) => {\r\n const [isLoaded, setIsLoaded] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n const initialize = async () => {\r\n await loadScript(AhnlabV3JsUrl);\r\n setIsLoaded(true);\r\n };\r\n\r\n initialize();\r\n }, []);\r\n\r\n return <V3Context.Provider value={{ isLoaded, launch: launchV3 }}>{children}</V3Context.Provider>;\r\n};\r\n\r\nexport const useV3 = () => {\r\n const context = useContext(V3Context);\r\n\r\n if (!context) {\r\n throw new Error('V3Provider를 정의해주세요.');\r\n }\r\n\r\n return context;\r\n};\r\n","import { isClient } from 'sales-frontend-utils';\r\n\r\nimport { KeypadActionType } from '../types/keypad-action.type';\r\nimport { loadScript } from '../utils/load-script';\r\n\r\ntype ENV = 'dev' | 'stg' | 'prod';\r\n\r\nconst getPath = (service: string, env: ENV) =>\r\n `https://nxl-${env !== 'prod' ? `${service}-${env}` : service}.hanwhalife.com`;\r\n\r\nconst getEnv: () => ENV = () => {\r\n const host = window.location.hostname;\r\n\r\n // if (host.includes('-dev.') || host.includes('localhost')) {\r\n // return 'dev';\r\n // } else if (host.includes('-stg.')) {\r\n // return 'stg';\r\n // } else {\r\n // return 'prod';\r\n // }\r\n\r\n return 'stg';\r\n};\r\n\r\ninterface KeypadConfig {\r\n version: string;\r\n server: string;\r\n contextRoot: string;\r\n cssPath: string;\r\n logoImgPath: string;\r\n inputObjectBackgroundColor: string;\r\n inputObjectBorderStyle: string;\r\n invalidSessionErrorMessage: string;\r\n invalidSessionAutoRefresh: boolean;\r\n enableAccessibility: boolean;\r\n useCustomAlert: boolean;\r\n functionKeyButtonStyle: string;\r\n maxInputSize: number;\r\n textInputView: number;\r\n touchOption: number;\r\n}\r\n\r\nexport const XKeyboardMobileInstance = (() => {\r\n if (!isClient()) {\r\n return null;\r\n }\r\n\r\n const env = getEnv();\r\n\r\n const keypadServicePath = `${getPath('xkp', env)}/xkp/xkscriptservice`;\r\n const keypadContentsPath = `${getPath('nlc', env)}/cnts-files/xkeyboard`;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (window as any).XKConfigMobile = {\r\n version: '1.0.5.1',\r\n server: keypadServicePath,\r\n contextRoot: `${keypadContentsPath}/js`,\r\n cssPath: `${keypadContentsPath}/css/xkp_mobile.css`,\r\n logoImgPath: `${keypadContentsPath}/img/logo.png`,\r\n inputObjectBackgroundColor: '#E4E4E4',\r\n inputObjectBorderStyle: '1px solid #9E9E9E',\r\n invalidSessionErrorMessage: \"보안세션이 만료되었습니다.\\n'확인'을 누르면 키패드가 갱신 됩니다.\",\r\n invalidSessionAutoRefresh: true,\r\n enableAccessibility: true,\r\n useCustomAlert: false,\r\n functionKeyButtonStyle: 'text',\r\n maxInputSize: 56,\r\n textInputView: 0,\r\n touchOption: 0\r\n } as KeypadConfig;\r\n\r\n document.oncontextmenu = () => false;\r\n document.ondragstart = () => false;\r\n document.onselectstart = () => false;\r\n\r\n const headTag = document.head;\r\n const scriptsToLoad = ['xkeypad_mobile.js'];\r\n\r\n const urls = scriptsToLoad.map(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (x) => `${(window as any).XKConfigMobile.contextRoot}/${x}`\r\n );\r\n\r\n Promise.all(urls.map((x) => loadScript(x))).then(() => {\r\n const existingLink = document.getElementById('xkStyle');\r\n\r\n if (existingLink?.parentNode) {\r\n existingLink.parentNode.removeChild(existingLink);\r\n }\r\n\r\n const linkElement = document.createElement('link');\r\n linkElement.id = 'xkStyle';\r\n linkElement.rel = 'stylesheet';\r\n linkElement.type = 'text/css';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n linkElement.href = (window as any).XKConfigMobile.cssPath;\r\n\r\n headTag.appendChild(linkElement);\r\n });\r\n\r\n const keypads: { [key: string]: KeypadActionType | undefined } = {};\r\n\r\n const getKeypad = (name: string) => keypads[name];\r\n\r\n const setKeypad = (name: string, keypad: KeypadActionType) => {\r\n keypads[name] = keypad;\r\n\r\n return keypad;\r\n };\r\n\r\n const removeKeypad = (name: string) => {\r\n delete keypads[name];\r\n };\r\n\r\n const closeAll = () => {\r\n Object.keys(keypads).forEach((id) => {\r\n const keypad = keypads[id];\r\n if (keypad && keypad.isOpen()) {\r\n keypad.close();\r\n }\r\n });\r\n };\r\n\r\n const newKeypad = (name: string) => {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return setKeypad(name, new (window as any).XKModule());\r\n };\r\n\r\n return {\r\n keypads,\r\n getKeypad,\r\n setKeypad,\r\n newKeypad,\r\n removeKeypad,\r\n closeAll\r\n };\r\n})();\r\n","enum KeypadMessageTypeEnum {\r\n NotSupportDevice = -1,\r\n Already = -2\r\n}\r\n\r\nexport default KeypadMessageTypeEnum;\r\n","enum KeypadModeEnum {\r\n QWERTY_SMART = 'qwertysmart',\r\n NUMBER = 'number'\r\n}\r\n\r\nexport default KeypadModeEnum;","export const uuidv4 = (): string => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 || 0,\r\n v = c === 'x' ? r : (r && 0x3) || 0x8;\r\n\r\n return v.toString(16);\r\n });\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { XKeyboardMobileInstance } from '../libs/xkeyboard';\r\nimport KeypadMessageTypeEnum from '../types/keypad-message.enum';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport { uuidv4 } from '../utils/uuid';\r\n\r\nexport default function useKeypad() {\r\n const [isShow, setIsShow] = useState<boolean>(false);\r\n\r\n const show = useCallback(\r\n (\r\n inputRef: HTMLInputElement,\r\n onInputChange: (length: number) => void,\r\n onKeypadClose: (res: KeypadResponseType) => void,\r\n keyType: KeypadModeEnum = KeypadModeEnum.QWERTY_SMART,\r\n maxLength: number,\r\n numberKeyRowCount: number\r\n ) => {\r\n const name = uuidv4();\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n let keypad = XKeyboardMobileInstance.getKeypad(name);\r\n if (!keypad) {\r\n keypad = XKeyboardMobileInstance.newKeypad(name);\r\n } else {\r\n keypad.refresh();\r\n }\r\n\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(0);\r\n }\r\n\r\n const keyPadParam = {\r\n name: `xk-pad-${name}`,\r\n editBox: inputRef,\r\n keyType,\r\n width: 100,\r\n position: { top: 10, left: null },\r\n viewType: 'half',\r\n closeDelay: 0,\r\n autoKeyResize: true,\r\n isE2E: true,\r\n onlyMobile: false,\r\n hasPressEffect: true,\r\n maxLength,\r\n numberKeyRowCount,\r\n onInputChange: (newLength: number) => {\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(newLength);\r\n }\r\n\r\n // 키패드가 존재하지 않을 경우, 종료\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n //키패드 입력 길이가 최대 입력 길이가 됐을 때 키패드 닫기\r\n if (\r\n keyPadParam.maxLength &&\r\n keyPadParam.maxLength > 0 &&\r\n newLength >= keyPadParam.maxLength &&\r\n keypad.isOpend()\r\n ) {\r\n keypad.close();\r\n setIsShow(false);\r\n\r\n return;\r\n }\r\n },\r\n onKeypadClose: () => {\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (onKeypadClose && typeof onKeypadClose === 'function') {\r\n const sessionInfo = keypad.get_sessionInfo();\r\n let length = 0;\r\n if (sessionInfo.input && sessionInfo.input.indexOf(',') >= 0) {\r\n length = sessionInfo.input.split(',').length;\r\n }\r\n\r\n const res = {\r\n length,\r\n element: inputRef,\r\n sessionInfo: {\r\n input: sessionInfo.input,\r\n sessionId: sessionInfo.sessionId,\r\n secToken: sessionInfo.secToken\r\n },\r\n keyType,\r\n name\r\n };\r\n\r\n setIsShow(false);\r\n onKeypadClose(res);\r\n }\r\n\r\n XKeyboardMobileInstance.removeKeypad(name);\r\n\r\n if (!onKeypadClose) {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n\r\n if (typeof onKeypadClose !== 'function') {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n }\r\n };\r\n\r\n const aRet = keypad.initialize(keyPadParam);\r\n\r\n if (aRet === KeypadMessageTypeEnum.NotSupportDevice) {\r\n // 안내 메세지 세팅\r\n alert('지원하지 않는 기기 입니다.');\r\n\r\n return;\r\n } else if (aRet === KeypadMessageTypeEnum.Already) {\r\n // alert('이미 키패드가 실행 중입니다.');\r\n return;\r\n }\r\n\r\n setIsShow(true);\r\n },\r\n []\r\n );\r\n\r\n const getValue = (name: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const targetKeypad = XKeyboardMobileInstance.keypads[name];\r\n\r\n if (!targetKeypad) {\r\n return null;\r\n }\r\n\r\n return targetKeypad.get_sessionInfo();\r\n };\r\n\r\n /**\r\n * 활성화 되어있는 키패드 찾는다\r\n * @returns\r\n */\r\n const find = (name?: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (name) {\r\n return XKeyboardMobileInstance.keypads[name];\r\n } else {\r\n // 키패드가 출력되어있으면, 확인하여 키패드를 닫는다.\r\n const keypadIds = Object.keys(XKeyboardMobileInstance.keypads);\r\n\r\n for (const keypadId of keypadIds) {\r\n const targetKeypad = XKeyboardMobileInstance.keypads[keypadId];\r\n\r\n if (targetKeypad && targetKeypad.isOpen()) {\r\n return targetKeypad;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isOpen = (name?: string) => {\r\n const targetKeypad = find(name);\r\n\r\n return !!targetKeypad;\r\n };\r\n\r\n const close = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.close();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const clear = (name?: string) => {\r\n const _xkmodule = find(name);\r\n if (_xkmodule) {\r\n _xkmodule.clear();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const refresh = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.refresh();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleMouseDown = (event: MouseEvent) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const keypadAlertDivTag = document.querySelector('#xkalert');\r\n\r\n const keypadDivTag = keypadAlertDivTag?.parentElement;\r\n if (keypadDivTag && !keypadDivTag.contains(event.target as Node)) {\r\n XKeyboardMobileInstance.closeAll();\r\n setIsShow(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleMouseDown);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleMouseDown);\r\n };\r\n }, []);\r\n\r\n return {\r\n show,\r\n close,\r\n clear,\r\n refresh,\r\n getValue,\r\n isOpen,\r\n find,\r\n isShow\r\n };\r\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\r\n\r\nimport useXKeypad from '../hooks/use-keypad';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport KeypadSessionType from '../types/keypad-session.type';\r\nimport KeypadType from '../types/keypad.type';\r\n\r\ntype Props = {\r\n value: KeypadSessionType | null;\r\n inputElement: KeypadType;\r\n mode: KeypadModeEnum;\r\n onChange: (value: KeypadSessionType | null) => void;\r\n maxLength: number;\r\n};\r\n\r\nexport default function Keypad({ value, onChange, mode, maxLength, inputElement }: Props) {\r\n const { show, isShow } = useXKeypad();\r\n\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const [maskedValue, setMaskedValue] = useState<string>('');\r\n\r\n const onCloseBack = useCallback(\r\n (res: KeypadResponseType) => {\r\n onChange(res.sessionInfo);\r\n },\r\n [onChange]\r\n );\r\n\r\n const onChangeBack = useCallback(\r\n (length: number) => {\r\n if (length === 0) {\r\n onChange(null);\r\n }\r\n setMaskedValue(''.padStart(length, '*'));\r\n },\r\n [onChange, setMaskedValue]\r\n );\r\n\r\n const handleKeypad = useCallback(() => {\r\n show(inputRef.current as HTMLInputElement, onChangeBack, onCloseBack, mode, maxLength, 3);\r\n }, [show, inputRef, onChangeBack, onCloseBack, mode, maxLength]);\r\n\r\n const enhancedOnClick = (existingClickHandler: () => void, newClickHandler: () => void) => {\r\n return () => {\r\n if (existingClickHandler) {\r\n existingClickHandler();\r\n }\r\n newClickHandler();\r\n };\r\n };\r\n\r\n const cloneElement = React.cloneElement(inputElement, {\r\n ref: inputRef,\r\n value: maskedValue,\r\n onClick: enhancedOnClick(inputElement.props.onClick, handleKeypad)\r\n // iskeypadactive: isShow\r\n });\r\n\r\n useEffect(() => {\r\n const length = value?.input && value.input.length > 0 ? value.input.split(',').length : 0;\r\n setMaskedValue(''.padStart(length, '*'));\r\n }, [value]);\r\n\r\n useEffect(() => {\r\n if (inputRef.current && !(inputRef.current instanceof HTMLInputElement)) {\r\n throw new Error('Input 태그가 정의되지 않았습니다.');\r\n }\r\n }, []);\r\n\r\n return <>{cloneElement}</>;\r\n}\r\n","import { useCallback, useEffect } from 'react';\r\nexport type NxlOneProps = {\r\n bizCode: string;\r\n tmplCode: string;\r\n ncsrInfoUuid?: string;\r\n nlcCtfnId?: string;\r\n // TYPE\r\n t?: string;\r\n env?: 'dev' | 'stg' | 'prod';\r\n};\r\n\r\nexport type NxlOneResponse = {\r\n action?: 'error' | 'close' | 'complete';\r\n redirectUrl?: string;\r\n nlcCtfnId?: string;\r\n};\r\n\r\nconst url = (() => {\r\n const url = typeof window !== 'undefined' ? window.location.href : '';\r\n\r\n if (url.includes('localhost') || url.includes('dev')) {\r\n return 'https://nxl-nlc-dev.hanwhalife.com';\r\n } else if (url.includes('stg')) {\r\n return 'https://nxl-nlc-stg.hanwhalife.com';\r\n } else {\r\n return 'https://nxl-nlc.hanwhalife.com';\r\n }\r\n})();\r\n\r\ntype OpenOptionType = {\r\n popupWidth?: number;\r\n popupHeight?: number;\r\n popupLeft?: number;\r\n popupTop?: number;\r\n windowName?: string;\r\n};\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t, env }: NxlOneProps) {\r\n const baseUrl =\r\n env === 'prod'\r\n ? 'https://nxl-nlc.hanwhalife.com'\r\n : env === 'stg'\r\n ? 'https://nxl-nlc-stg.hanwhalife.com'\r\n : env === 'dev'\r\n ? 'https://nxl-nlc-dev.hanwhalife.com'\r\n : undefined;\r\n\r\n const buildUrl = useCallback(() => {\r\n const targetUrl = new URL('/auth/v1', baseUrl || url);\r\n targetUrl.searchParams.set('bizCode', bizCode);\r\n targetUrl.searchParams.set('tmplCode', tmplCode);\r\n\r\n if (nlcCtfnId) {\r\n targetUrl.searchParams.set('nlcCtfnId', nlcCtfnId);\r\n }\r\n\r\n if (t) {\r\n targetUrl.searchParams.set('t', t);\r\n }\r\n\r\n if (ncsrInfoUuid) {\r\n targetUrl.searchParams.set('ncsrInfoUuid', ncsrInfoUuid);\r\n }\r\n\r\n return targetUrl.toString();\r\n }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId, baseUrl]);\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지로 이동합니다.\r\n * 인증이 완료 후, 관리자 페이지에서 정의한 프로세스 완료 URL로 이동합니다.\r\n */\r\n const redirect = () => {\r\n const targetUrl = buildUrl();\r\n\r\n location.href = targetUrl;\r\n };\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지를 팝업으로 엽니다.\r\n * @param options 팝업의 크기, 위치, 창 이름을 정의합니다.\r\n * @returns 완료 URL에 인증 ID가 Query String 이 함께 정의된 형태로 반환됩니다.\r\n *\r\n * @example\r\n * const { open } = useNxlOne();\r\n *\r\n * const handleClick = async () => {\r\n * try {\r\n * const result = await open({ popupWidth: 500, popupHeight: 500 });\r\n * console.log('이동 시킬 URL : ' + result);\r\n * } catch (e) {\r\n * console.error('팝업 프로세스 실패');\r\n * }\r\n * }\r\n *\r\n * @note 팝업은 반드시 사용자 이벤트 핸들러 내에서 직접 호출해야 브라우저 차단을 피할 수 있습니다.\r\n */\r\n const open = async (options?: OpenOptionType) => {\r\n return new Promise<NxlOneResponse>((resolve, reject) => {\r\n const targetUrl = buildUrl();\r\n\r\n const width = (options && options.popupWidth) || 744;\r\n const height = (options && options.popupHeight) || 720;\r\n\r\n const left = (options && options.popupLeft) || window.screenX + (window.outerWidth - width) / 2;\r\n const top = (options && options.popupTop) || window.screenX + (window.outerWidth - width) / 2;\r\n\r\n const popupFeatures = `width=${width},height=${height},left=${left},top=${top}`;\r\n const popup = window.open(targetUrl, (options && options.windowName) || 'self_cert', popupFeatures);\r\n\r\n if (!popup) {\r\n reject(new Error('차단되거나 열리지 않았습니다.'));\r\n\r\n return;\r\n }\r\n\r\n let isSettled = false;\r\n\r\n const handleMessage = (event: MessageEvent) => {\r\n if (event.origin !== new URL(targetUrl).origin) {\r\n return;\r\n }\r\n\r\n if (!isSettled) {\r\n isSettled = true;\r\n\r\n if (event.data) {\r\n resolve(event.data);\r\n } else {\r\n reject('인증이 취소되거나 실패했습니다.');\r\n }\r\n\r\n popup?.close();\r\n window.removeEventListener('message', handleMessage);\r\n }\r\n };\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n };\r\n\r\n const Iframe = function ({\r\n height = 720,\r\n className,\r\n style,\r\n allow,\r\n sandbox = 'allow-scripts allow-forms allow-same-origin',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n strictOrigin = true\r\n }: {\r\n height?: number | string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n allow?: string;\r\n sandbox?: string;\r\n onSuccess?: (response: NxlOneResponse) => void;\r\n onError?: (response: NxlOneResponse) => void;\r\n onClose: (response: NxlOneResponse) => void;\r\n strictOrigin?: boolean;\r\n }) {\r\n const targetUrl = buildUrl();\r\n\r\n useEffect(() => {\r\n if (!onSuccess && !onError) {\r\n return;\r\n }\r\n\r\n const handler = (e: MessageEvent) => {\r\n if (strictOrigin && e.origin !== url) {\r\n return;\r\n }\r\n\r\n const d = e.data as NxlOneResponse;\r\n if (d) {\r\n if (d.action === 'close') {\r\n onClose(d);\r\n\r\n return;\r\n } else if (onError && d.action === 'error') {\r\n onError(d);\r\n\r\n return;\r\n } else if (onSuccess && d.action === 'complete') {\r\n onSuccess(d);\r\n\r\n return;\r\n }\r\n } else if (onError) {\r\n onError({\r\n action: 'error',\r\n nlcCtfnId: '',\r\n redirectUrl: ''\r\n });\r\n }\r\n };\r\n\r\n window.addEventListener('message', handler as EventListener);\r\n\r\n return () => window.removeEventListener('message', handler as EventListener);\r\n }, [onClose, onError, onSuccess, strictOrigin]);\r\n\r\n return (\r\n <iframe\r\n src={targetUrl}\r\n width=\"100%\"\r\n height={typeof height === 'number' ? `${height}px` : height}\r\n style={{ border: 0, ...style }}\r\n className={className}\r\n sandbox={sandbox}\r\n {...(allow ? { allow } : {})}\r\n />\r\n );\r\n };\r\n\r\n return { redirect, open, Iframe };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/utils/load-script.ts","../src/api/endpoint.ts","../src/v3.ts","../src/v3-provider.tsx","../src/libs/xkeyboard.ts","../src/types/keypad-message.enum.ts","../src/types/keypad-mode.enum.ts","../src/utils/uuid.ts","../src/hooks/use-keypad.ts","../src/components/Keypad.tsx","../src/hooks/use-nxl-one.tsx"],"names":["isClient","KeypadMessageTypeEnum","KeypadModeEnum","useState","useEffect","useCallback","React","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export async function loadScript(url: string) {\r\n await new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n script.addEventListener('load', () => {\r\n resolve({ loaded: true, error: false });\r\n });\r\n\r\n script.addEventListener('error', () => {\r\n reject({\r\n loaded: false,\r\n error: true,\r\n message: '파일 로드에 실패하였습니다.'\r\n });\r\n });\r\n\r\n document.body.appendChild(script);\r\n });\r\n}\r\n","import { getEnvironmentFromHostname, getServicePath, isClient } from 'sales-frontend-utils';\n\nexport const getServiceUrl = (serviceName: string) => {\n if (!isClient()) {\n return '';\n }\n\n const env = getEnvironmentFromHostname(location.hostname);\n\n switch (env) {\n case 'local':\n return `${getServicePath()}/api/${serviceName}`;\n case 'dev':\n return `https://nxl-${serviceName}-dev.hanwhalife.com/api`;\n case 'stg':\n return `https://nxl-${serviceName}-stg.hanwhalife.com/api`;\n case 'prd':\n return `https://nxl-${serviceName}.hanwhalife.com/api`;\n default:\n return ``;\n }\n\n // return `https://nxl-${env !== 'prd' ? `${serviceName}-${env}` : serviceName}.hanwhalife.com`;\n};\n\nexport const API_ENDPOINTS = {\n GET_NXL_CODES: (codeId: string) => `${getServiceUrl('nlc')}/code/code-list/get?codeId=${codeId}&intgYn=N`,\n GET_NOTICE_SYSTEM: (code: string) => `${getServiceUrl('nlc')}/notice/system/${code}/get`,\n GET_NOTICE_INTEGRATED: (code: string) => `${getServiceUrl('nlc')}/notice/integrated/${code}/get`,\n GET_V3_LICENSE: (date: Date) => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const dateStr = `${year}-${month}-${day} ${hours}:${minutes}`;\n\n return `${getServiceUrl('nlm')}/v3/init?time=${dateStr}`;\n },\n INPUT_PREFILL_USER: `${getServiceUrl('nlc')}/user-ctfn/ncsr-info-inpt/post`\n} as const;\n","// import { getV3License } from '@nxl-kit/api';\r\nimport { getV3License } from './api/get-v3-license';\r\n\r\ndeclare global {\r\n interface Window {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n mpl_start?: (license?: any, time?: any, cryptoKeyVersion?: any, RootCheckTimeOut?: any) => void;\r\n\r\n /**\r\n * MPL의 상태를 반환하는 API\r\n * @returns\r\n * INITIAL - 동작중이지 않음\r\n * ALIVE - 동작중임\r\n * Undefined 네트워크 연결 문제\r\n */\r\n mpl_status?: () => 'INITAL' | 'ALIVE' | 'Undefined';\r\n\r\n mpl_load?: (tk?: string, cd?: string) => void;\r\n mpl_token?: () => string;\r\n mpl_enc_param?: () => string;\r\n mpl_stop?: () => void;\r\n }\r\n}\r\n\r\nconst isAndroid = (): boolean => {\r\n return /android/i.test(navigator.userAgent) && !/edge/i.test(navigator.userAgent);\r\n};\r\n\r\nconst startV3 = async () => {\r\n console.log('start v3');\r\n if (!isAndroid() || !window.mpl_start) {\r\n return;\r\n }\r\n\r\n window.mpl_stop?.();\r\n sessionStorage.removeItem('mtk');\r\n sessionStorage.removeItem('mcd');\r\n\r\n const v3Response = await getV3License({\r\n date: new Date()\r\n });\r\n\r\n console.log('getV3 License', v3Response);\r\n if (!v3Response) {\r\n return;\r\n }\r\n\r\n window.mpl_start(v3Response.data?.encLicense, v3Response.data?.time);\r\n\r\n setTimeout(() => {\r\n const mtk = window.mpl_token?.();\r\n const mcd = window.mpl_enc_param?.();\r\n\r\n if (mtk) {\r\n sessionStorage.setItem('mtk', mtk);\r\n }\r\n if (mcd) {\r\n sessionStorage.setItem('mcd', mcd);\r\n }\r\n }, 500);\r\n};\r\n\r\nconst loadV3 = () => {\r\n console.log('load v3');\r\n const mtk = sessionStorage.getItem('mtk') || window.mpl_token?.();\r\n const mcd = sessionStorage.getItem('mcd') || window.mpl_enc_param?.();\r\n\r\n if (mtk && mcd && window.mpl_load && mtk !== 'undefined' && mcd !== 'undefined') {\r\n window.mpl_load(mtk, mcd);\r\n }\r\n};\r\n\r\nconst checkV3Status = async (type: string) => {\r\n console.log('check v3 status');\r\n await new Promise((resolve) => setTimeout(resolve, 500));\r\n\r\n if (!isAndroid() || !window.mpl_status) {\r\n console.log('not android or no mpl_status');\r\n\r\n return true;\r\n }\r\n\r\n if (window.mpl_status() === 'ALIVE') {\r\n console.log('mpl status is alive');\r\n loadV3();\r\n\r\n return true;\r\n }\r\n\r\n console.log('v3 not alive');\r\n\r\n if (type === 'modal') {\r\n console.log('modal start v3');\r\n await startV3();\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const launchV3 = async () => {\r\n loadV3();\r\n\r\n return await checkV3Status('loader');\r\n};\r\n","import React, { createContext, useContext, useEffect, useState } from 'react';\r\n\r\nimport { loadScript } from './utils/load-script';\r\nimport { launchV3 } from './v3';\r\n\r\ninterface V3ContextType {\r\n isLoaded: boolean;\r\n launch: () => void;\r\n}\r\n\r\nconst V3Context = createContext<V3ContextType | undefined>(undefined);\r\n\r\nconst AhnlabV3JsUrl = 'https://mpl.ahnlab.com/js/mpl_webview_cm.js';\r\n\r\nexport const V3Provider = ({ children }: { children: React.ReactNode }) => {\r\n const [isLoaded, setIsLoaded] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n const initialize = async () => {\r\n await loadScript(AhnlabV3JsUrl);\r\n setIsLoaded(true);\r\n };\r\n\r\n initialize();\r\n }, []);\r\n\r\n return <V3Context.Provider value={{ isLoaded, launch: launchV3 }}>{children}</V3Context.Provider>;\r\n};\r\n\r\nexport const useV3 = () => {\r\n const context = useContext(V3Context);\r\n\r\n if (!context) {\r\n throw new Error('V3Provider를 정의해주세요.');\r\n }\r\n\r\n return context;\r\n};\r\n","import { isClient } from 'sales-frontend-utils';\r\n\r\nimport { KeypadActionType } from '../types/keypad-action.type';\r\nimport { loadScript } from '../utils/load-script';\r\n\r\ntype ENV = 'dev' | 'stg' | 'prod';\r\n\r\nconst getPath = (service: string, env: ENV) =>\r\n `https://nxl-${env !== 'prod' ? `${service}-${env}` : service}.hanwhalife.com`;\r\n\r\nconst getEnv: () => ENV = () => {\r\n const host = window.location.hostname;\r\n\r\n // if (host.includes('-dev.') || host.includes('localhost')) {\r\n // return 'dev';\r\n // } else if (host.includes('-stg.')) {\r\n // return 'stg';\r\n // } else {\r\n // return 'prod';\r\n // }\r\n\r\n return 'stg';\r\n};\r\n\r\ninterface KeypadConfig {\r\n version: string;\r\n server: string;\r\n contextRoot: string;\r\n cssPath: string;\r\n logoImgPath: string;\r\n inputObjectBackgroundColor: string;\r\n inputObjectBorderStyle: string;\r\n invalidSessionErrorMessage: string;\r\n invalidSessionAutoRefresh: boolean;\r\n enableAccessibility: boolean;\r\n useCustomAlert: boolean;\r\n functionKeyButtonStyle: string;\r\n maxInputSize: number;\r\n textInputView: number;\r\n touchOption: number;\r\n}\r\n\r\nexport const XKeyboardMobileInstance = (() => {\r\n if (!isClient()) {\r\n return null;\r\n }\r\n\r\n const env = getEnv();\r\n\r\n const keypadServicePath = `${getPath('xkp', env)}/xkp/xkscriptservice`;\r\n const keypadContentsPath = `${getPath('nlc', env)}/cnts-files/xkeyboard`;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (window as any).XKConfigMobile = {\r\n version: '1.0.5.1',\r\n server: keypadServicePath,\r\n contextRoot: `${keypadContentsPath}/js`,\r\n cssPath: `${keypadContentsPath}/css/xkp_mobile.css`,\r\n logoImgPath: `${keypadContentsPath}/img/logo.png`,\r\n inputObjectBackgroundColor: '#E4E4E4',\r\n inputObjectBorderStyle: '1px solid #9E9E9E',\r\n invalidSessionErrorMessage: \"보안세션이 만료되었습니다.\\n'확인'을 누르면 키패드가 갱신 됩니다.\",\r\n invalidSessionAutoRefresh: true,\r\n enableAccessibility: true,\r\n useCustomAlert: false,\r\n functionKeyButtonStyle: 'text',\r\n maxInputSize: 56,\r\n textInputView: 0,\r\n touchOption: 0\r\n } as KeypadConfig;\r\n\r\n document.oncontextmenu = () => false;\r\n document.ondragstart = () => false;\r\n document.onselectstart = () => false;\r\n\r\n const headTag = document.head;\r\n const scriptsToLoad = ['xkeypad_mobile.js'];\r\n\r\n const urls = scriptsToLoad.map(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (x) => `${(window as any).XKConfigMobile.contextRoot}/${x}`\r\n );\r\n\r\n Promise.all(urls.map((x) => loadScript(x))).then(() => {\r\n const existingLink = document.getElementById('xkStyle');\r\n\r\n if (existingLink?.parentNode) {\r\n existingLink.parentNode.removeChild(existingLink);\r\n }\r\n\r\n const linkElement = document.createElement('link');\r\n linkElement.id = 'xkStyle';\r\n linkElement.rel = 'stylesheet';\r\n linkElement.type = 'text/css';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n linkElement.href = (window as any).XKConfigMobile.cssPath;\r\n\r\n headTag.appendChild(linkElement);\r\n });\r\n\r\n const keypads: { [key: string]: KeypadActionType | undefined } = {};\r\n\r\n const getKeypad = (name: string) => keypads[name];\r\n\r\n const setKeypad = (name: string, keypad: KeypadActionType) => {\r\n keypads[name] = keypad;\r\n\r\n return keypad;\r\n };\r\n\r\n const removeKeypad = (name: string) => {\r\n delete keypads[name];\r\n };\r\n\r\n const closeAll = () => {\r\n Object.keys(keypads).forEach((id) => {\r\n const keypad = keypads[id];\r\n if (keypad && keypad.isOpen()) {\r\n keypad.close();\r\n }\r\n });\r\n };\r\n\r\n const newKeypad = (name: string) => {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return setKeypad(name, new (window as any).XKModule());\r\n };\r\n\r\n return {\r\n keypads,\r\n getKeypad,\r\n setKeypad,\r\n newKeypad,\r\n removeKeypad,\r\n closeAll\r\n };\r\n})();\r\n","enum KeypadMessageTypeEnum {\r\n NotSupportDevice = -1,\r\n Already = -2\r\n}\r\n\r\nexport default KeypadMessageTypeEnum;\r\n","enum KeypadModeEnum {\r\n QWERTY_SMART = 'qwertysmart',\r\n NUMBER = 'number'\r\n}\r\n\r\nexport default KeypadModeEnum;","export const uuidv4 = (): string => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 || 0,\r\n v = c === 'x' ? r : (r && 0x3) || 0x8;\r\n\r\n return v.toString(16);\r\n });\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { XKeyboardMobileInstance } from '../libs/xkeyboard';\r\nimport KeypadMessageTypeEnum from '../types/keypad-message.enum';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport { uuidv4 } from '../utils/uuid';\r\n\r\nexport default function useKeypad() {\r\n const [isShow, setIsShow] = useState<boolean>(false);\r\n\r\n const show = useCallback(\r\n (\r\n inputRef: HTMLInputElement,\r\n onInputChange: (length: number) => void,\r\n onKeypadClose: (res: KeypadResponseType) => void,\r\n keyType: KeypadModeEnum = KeypadModeEnum.QWERTY_SMART,\r\n maxLength: number,\r\n numberKeyRowCount: number\r\n ) => {\r\n const name = uuidv4();\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n let keypad = XKeyboardMobileInstance.getKeypad(name);\r\n if (!keypad) {\r\n keypad = XKeyboardMobileInstance.newKeypad(name);\r\n } else {\r\n keypad.refresh();\r\n }\r\n\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(0);\r\n }\r\n\r\n const keyPadParam = {\r\n name: `xk-pad-${name}`,\r\n editBox: inputRef,\r\n keyType,\r\n width: 100,\r\n position: { top: 10, left: null },\r\n viewType: 'half',\r\n closeDelay: 0,\r\n autoKeyResize: true,\r\n isE2E: true,\r\n onlyMobile: false,\r\n hasPressEffect: true,\r\n maxLength,\r\n numberKeyRowCount,\r\n onInputChange: (newLength: number) => {\r\n if (onInputChange && typeof onInputChange === 'function') {\r\n onInputChange(newLength);\r\n }\r\n\r\n // 키패드가 존재하지 않을 경우, 종료\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n //키패드 입력 길이가 최대 입력 길이가 됐을 때 키패드 닫기\r\n if (\r\n keyPadParam.maxLength &&\r\n keyPadParam.maxLength > 0 &&\r\n newLength >= keyPadParam.maxLength &&\r\n keypad.isOpend()\r\n ) {\r\n keypad.close();\r\n setIsShow(false);\r\n\r\n return;\r\n }\r\n },\r\n onKeypadClose: () => {\r\n if (!keypad) {\r\n return;\r\n }\r\n\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (onKeypadClose && typeof onKeypadClose === 'function') {\r\n const sessionInfo = keypad.get_sessionInfo();\r\n let length = 0;\r\n if (sessionInfo.input && sessionInfo.input.indexOf(',') >= 0) {\r\n length = sessionInfo.input.split(',').length;\r\n }\r\n\r\n const res = {\r\n length,\r\n element: inputRef,\r\n sessionInfo: {\r\n input: sessionInfo.input,\r\n sessionId: sessionInfo.sessionId,\r\n secToken: sessionInfo.secToken\r\n },\r\n keyType,\r\n name\r\n };\r\n\r\n setIsShow(false);\r\n onKeypadClose(res);\r\n }\r\n\r\n XKeyboardMobileInstance.removeKeypad(name);\r\n\r\n if (!onKeypadClose) {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n\r\n if (typeof onKeypadClose !== 'function') {\r\n throw new Error('not found onKeypadClose');\r\n }\r\n }\r\n };\r\n\r\n const aRet = keypad.initialize(keyPadParam);\r\n\r\n if (aRet === KeypadMessageTypeEnum.NotSupportDevice) {\r\n // 안내 메세지 세팅\r\n alert('지원하지 않는 기기 입니다.');\r\n\r\n return;\r\n } else if (aRet === KeypadMessageTypeEnum.Already) {\r\n // alert('이미 키패드가 실행 중입니다.');\r\n return;\r\n }\r\n\r\n setIsShow(true);\r\n },\r\n []\r\n );\r\n\r\n const getValue = (name: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const targetKeypad = XKeyboardMobileInstance.keypads[name];\r\n\r\n if (!targetKeypad) {\r\n return null;\r\n }\r\n\r\n return targetKeypad.get_sessionInfo();\r\n };\r\n\r\n /**\r\n * 활성화 되어있는 키패드 찾는다\r\n * @returns\r\n */\r\n const find = (name?: string) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n if (name) {\r\n return XKeyboardMobileInstance.keypads[name];\r\n } else {\r\n // 키패드가 출력되어있으면, 확인하여 키패드를 닫는다.\r\n const keypadIds = Object.keys(XKeyboardMobileInstance.keypads);\r\n\r\n for (const keypadId of keypadIds) {\r\n const targetKeypad = XKeyboardMobileInstance.keypads[keypadId];\r\n\r\n if (targetKeypad && targetKeypad.isOpen()) {\r\n return targetKeypad;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isOpen = (name?: string) => {\r\n const targetKeypad = find(name);\r\n\r\n return !!targetKeypad;\r\n };\r\n\r\n const close = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.close();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const clear = (name?: string) => {\r\n const _xkmodule = find(name);\r\n if (_xkmodule) {\r\n _xkmodule.clear();\r\n setIsShow(false);\r\n }\r\n };\r\n\r\n const refresh = (name?: string) => {\r\n const targetKeypad = find(name);\r\n if (targetKeypad) {\r\n targetKeypad.refresh();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleMouseDown = (event: MouseEvent) => {\r\n if (!XKeyboardMobileInstance) {\r\n return;\r\n }\r\n\r\n const keypadAlertDivTag = document.querySelector('#xkalert');\r\n\r\n const keypadDivTag = keypadAlertDivTag?.parentElement;\r\n if (keypadDivTag && !keypadDivTag.contains(event.target as Node)) {\r\n XKeyboardMobileInstance.closeAll();\r\n setIsShow(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleMouseDown);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleMouseDown);\r\n };\r\n }, []);\r\n\r\n return {\r\n show,\r\n close,\r\n clear,\r\n refresh,\r\n getValue,\r\n isOpen,\r\n find,\r\n isShow\r\n };\r\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\r\n\r\nimport useXKeypad from '../hooks/use-keypad';\r\nimport KeypadModeEnum from '../types/keypad-mode.enum';\r\nimport KeypadResponseType from '../types/keypad-response.type';\r\nimport KeypadSessionType from '../types/keypad-session.type';\r\nimport KeypadType from '../types/keypad.type';\r\n\r\ntype Props = {\r\n value: KeypadSessionType | null;\r\n inputElement: KeypadType;\r\n mode: KeypadModeEnum;\r\n onChange: (value: KeypadSessionType | null) => void;\r\n maxLength: number;\r\n};\r\n\r\nexport default function Keypad({ value, onChange, mode, maxLength, inputElement }: Props) {\r\n const { show, isShow } = useXKeypad();\r\n\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const [maskedValue, setMaskedValue] = useState<string>('');\r\n\r\n const onCloseBack = useCallback(\r\n (res: KeypadResponseType) => {\r\n onChange(res.sessionInfo);\r\n },\r\n [onChange]\r\n );\r\n\r\n const onChangeBack = useCallback(\r\n (length: number) => {\r\n if (length === 0) {\r\n onChange(null);\r\n }\r\n setMaskedValue(''.padStart(length, '*'));\r\n },\r\n [onChange, setMaskedValue]\r\n );\r\n\r\n const handleKeypad = useCallback(() => {\r\n show(inputRef.current as HTMLInputElement, onChangeBack, onCloseBack, mode, maxLength, 3);\r\n }, [show, inputRef, onChangeBack, onCloseBack, mode, maxLength]);\r\n\r\n const enhancedOnClick = (existingClickHandler: () => void, newClickHandler: () => void) => {\r\n return () => {\r\n if (existingClickHandler) {\r\n existingClickHandler();\r\n }\r\n newClickHandler();\r\n };\r\n };\r\n\r\n const cloneElement = React.cloneElement(inputElement, {\r\n ref: inputRef,\r\n value: maskedValue,\r\n onClick: enhancedOnClick(inputElement.props.onClick, handleKeypad)\r\n // iskeypadactive: isShow\r\n });\r\n\r\n useEffect(() => {\r\n const length = value?.input && value.input.length > 0 ? value.input.split(',').length : 0;\r\n setMaskedValue(''.padStart(length, '*'));\r\n }, [value]);\r\n\r\n useEffect(() => {\r\n if (inputRef.current && !(inputRef.current instanceof HTMLInputElement)) {\r\n throw new Error('Input 태그가 정의되지 않았습니다.');\r\n }\r\n }, []);\r\n\r\n return <>{cloneElement}</>;\r\n}\r\n","import { useCallback, useEffect } from 'react';\r\n\r\nimport { getNlcHostFromEnvironment } from 'sales-frontend-utils';\r\nexport type NxlOneProps = {\r\n bizCode: string;\r\n tmplCode: string;\r\n ncsrInfoUuid?: string;\r\n nlcCtfnId?: string;\r\n // TYPE\r\n t?: string;\r\n env?: 'dev' | 'stg' | 'prod';\r\n};\r\n\r\nexport type NxlOneResponse = {\r\n action?: 'error' | 'close' | 'complete';\r\n redirectUrl?: string;\r\n nlcCtfnId?: string;\r\n};\r\n\r\n\r\n\r\ntype OpenOptionType = {\r\n popupWidth?: number;\r\n popupHeight?: number;\r\n popupLeft?: number;\r\n popupTop?: number;\r\n windowName?: string;\r\n};\r\nconst baseUrl = getNlcHostFromEnvironment();\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps) {\r\n\r\n const buildUrl = useCallback(() => {\r\n const targetUrl = new URL('/auth/v1', baseUrl);\r\n targetUrl.searchParams.set('bizCode', bizCode);\r\n targetUrl.searchParams.set('tmplCode', tmplCode);\r\n\r\n if (nlcCtfnId) {\r\n targetUrl.searchParams.set('nlcCtfnId', nlcCtfnId);\r\n }\r\n\r\n if (t) {\r\n targetUrl.searchParams.set('t', t);\r\n }\r\n\r\n if (ncsrInfoUuid) {\r\n targetUrl.searchParams.set('ncsrInfoUuid', ncsrInfoUuid);\r\n }\r\n\r\n return targetUrl.toString();\r\n }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId, baseUrl]);\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지로 이동합니다.\r\n * 인증이 완료 후, 관리자 페이지에서 정의한 프로세스 완료 URL로 이동합니다.\r\n */\r\n const redirect = () => {\r\n const targetUrl = buildUrl();\r\n\r\n location.href = targetUrl;\r\n };\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지를 팝업으로 엽니다.\r\n * @param options 팝업의 크기, 위치, 창 이름을 정의합니다.\r\n * @returns 완료 URL에 인증 ID가 Query String 이 함께 정의된 형태로 반환됩니다.\r\n *\r\n * @example\r\n * const { open } = useNxlOne();\r\n *\r\n * const handleClick = async () => {\r\n * try {\r\n * const result = await open({ popupWidth: 500, popupHeight: 500 });\r\n * console.log('이동 시킬 URL : ' + result);\r\n * } catch (e) {\r\n * console.error('팝업 프로세스 실패');\r\n * }\r\n * }\r\n *\r\n * @note 팝업은 반드시 사용자 이벤트 핸들러 내에서 직접 호출해야 브라우저 차단을 피할 수 있습니다.\r\n */\r\n const open = async (options?: OpenOptionType) => {\r\n return new Promise<NxlOneResponse>((resolve, reject) => {\r\n const targetUrl = buildUrl();\r\n\r\n const width = (options && options.popupWidth) || 744;\r\n const height = (options && options.popupHeight) || 720;\r\n\r\n const left = (options && options.popupLeft) || window.screenX + (window.outerWidth - width) / 2;\r\n const top = (options && options.popupTop) || window.screenX + (window.outerWidth - width) / 2;\r\n\r\n const popupFeatures = `width=${width},height=${height},left=${left},top=${top}`;\r\n const popup = window.open(targetUrl, (options && options.windowName) || 'self_cert', popupFeatures);\r\n\r\n if (!popup) {\r\n reject(new Error('차단되거나 열리지 않았습니다.'));\r\n\r\n return;\r\n }\r\n\r\n let isSettled = false;\r\n\r\n const handleMessage = (event: MessageEvent) => {\r\n if (event.origin !== new URL(targetUrl).origin) {\r\n return;\r\n }\r\n\r\n if (!isSettled) {\r\n isSettled = true;\r\n\r\n if (event.data) {\r\n resolve(event.data);\r\n } else {\r\n reject('인증이 취소되거나 실패했습니다.');\r\n }\r\n\r\n popup?.close();\r\n window.removeEventListener('message', handleMessage);\r\n }\r\n };\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n };\r\n\r\n const Iframe = function ({\r\n height = 720,\r\n className,\r\n style,\r\n allow,\r\n sandbox = 'allow-scripts allow-forms allow-same-origin',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n strictOrigin = true\r\n }: {\r\n height?: number | string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n allow?: string;\r\n sandbox?: string;\r\n onSuccess?: (response: NxlOneResponse) => void;\r\n onError?: (response: NxlOneResponse) => void;\r\n onClose: (response: NxlOneResponse) => void;\r\n strictOrigin?: boolean;\r\n }) {\r\n const targetUrl = buildUrl();\r\n\r\n useEffect(() => {\r\n if (!onSuccess && !onError) {\r\n return;\r\n }\r\n\r\n const handler = (e: MessageEvent) => {\r\n if (strictOrigin && e.origin !== baseUrl) {\r\n return;\r\n }\r\n\r\n const d = e.data as NxlOneResponse;\r\n if (d) {\r\n if (d.action === 'close') {\r\n onClose(d);\r\n\r\n return;\r\n } else if (onError && d.action === 'error') {\r\n onError(d);\r\n\r\n return;\r\n } else if (onSuccess && d.action === 'complete') {\r\n onSuccess(d);\r\n\r\n return;\r\n }\r\n } else if (onError) {\r\n onError({\r\n action: 'error',\r\n nlcCtfnId: '',\r\n redirectUrl: ''\r\n });\r\n }\r\n };\r\n\r\n window.addEventListener('message', handler as EventListener);\r\n\r\n return () => window.removeEventListener('message', handler as EventListener);\r\n }, [onClose, onError, onSuccess, strictOrigin]);\r\n\r\n return (\r\n <iframe\r\n src={targetUrl}\r\n width=\"100%\"\r\n height={typeof height === 'number' ? `${height}px` : height}\r\n style={{ border: 0, ...style }}\r\n className={className}\r\n sandbox={sandbox}\r\n {...(allow ? { allow } : {})}\r\n />\r\n );\r\n };\r\n\r\n return { redirect, open, Iframe };\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sales-frontend-solution",
3
- "version": "0.0.19",
3
+ "version": "0.0.20",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "react-dom": ">=18.0.0"
26
26
  },
27
27
  "dependencies": {
28
- "sales-frontend-utils": "0.0.36"
28
+ "sales-frontend-utils": "0.0.37"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^22.14.0",