sales-frontend-solution 0.0.22 → 0.0.23

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
@@ -437,21 +437,24 @@ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }) {
437
437
  if (ncsrInfoUuid) {
438
438
  targetUrl.searchParams.set("ncsrInfoUuid", ncsrInfoUuid);
439
439
  }
440
- return targetUrl.toString();
440
+ return targetUrl;
441
441
  }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId]);
442
442
  const redirect = () => {
443
443
  const targetUrl = buildUrl();
444
- location.href = targetUrl;
444
+ targetUrl.searchParams.set("m", "redirect");
445
+ location.href = targetUrl.toString();
445
446
  };
446
447
  const open = async (options) => {
447
448
  return new Promise((resolve, reject) => {
448
- const targetUrl = buildUrl();
449
+ const targetUrlBuild = buildUrl();
450
+ targetUrlBuild.searchParams.set("m", "popup");
451
+ const targetUrl = targetUrlBuild.toString();
449
452
  const width = options && options.popupWidth || 744;
450
453
  const height = options && options.popupHeight || 720;
451
454
  const left = options && options.popupLeft || window.screenX + (window.outerWidth - width) / 2;
452
455
  const top = options && options.popupTop || window.screenX + (window.outerWidth - width) / 2;
453
456
  const popupFeatures = `width=${width},height=${height},left=${left},top=${top}`;
454
- const popup = window.open(targetUrl, options && options.windowName || "self_cert", popupFeatures);
457
+ const popup = window.open(targetUrlBuild.toString(), options && options.windowName || "self_cert", popupFeatures);
455
458
  if (!popup) {
456
459
  reject(new Error("\uCC28\uB2E8\uB418\uAC70\uB098 \uC5F4\uB9AC\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."));
457
460
  return;
@@ -486,7 +489,9 @@ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }) {
486
489
  onClose,
487
490
  strictOrigin = true
488
491
  }) {
489
- const targetUrl = buildUrl();
492
+ const targetUrlBuild = buildUrl();
493
+ targetUrlBuild.searchParams.set("m", "iframe");
494
+ const targetUrl = targetUrlBuild.toString();
490
495
  React2.useEffect(() => {
491
496
  if (!onSuccess && !onError) {
492
497
  return;
@@ -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":["isClient","getEnvironmentFromHostname","getServicePath","createContext","useState","useEffect","jsx","useContext","KeypadMessageTypeEnum","KeypadModeEnum","useCallback","useRef","React","Fragment","getNlcHostFromEnvironment"],"mappings":"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","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\n\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps) {\r\n\r\n const buildUrl = useCallback(() => {\r\n const baseUrl = getNlcHostFromEnvironment();\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]);\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 const baseUrl = getNlcHostFromEnvironment();\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"]}
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":"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","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\n\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps) {\r\n\r\n const buildUrl = useCallback(() => {\r\n const baseUrl = getNlcHostFromEnvironment();\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;\r\n }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId]);\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지로 이동합니다.\r\n * 인증이 완료 후, 관리자 페이지에서 정의한 프로세스 완료 URL로 이동합니다.\r\n */\r\n const redirect = () => {\r\n const targetUrl = buildUrl();\r\n targetUrl.searchParams.set('m', 'redirect');\r\n\r\n location.href = targetUrl.toString();\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 targetUrlBuild = buildUrl();\r\n targetUrlBuild.searchParams.set('m', 'popup');\r\n const targetUrl = targetUrlBuild.toString();\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(targetUrlBuild.toString(), (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 targetUrlBuild = buildUrl();\r\n targetUrlBuild.searchParams.set('m', 'iframe');\r\n const targetUrl = targetUrlBuild.toString();\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 const baseUrl = getNlcHostFromEnvironment();\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.js CHANGED
@@ -431,21 +431,24 @@ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }) {
431
431
  if (ncsrInfoUuid) {
432
432
  targetUrl.searchParams.set("ncsrInfoUuid", ncsrInfoUuid);
433
433
  }
434
- return targetUrl.toString();
434
+ return targetUrl;
435
435
  }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId]);
436
436
  const redirect = () => {
437
437
  const targetUrl = buildUrl();
438
- location.href = targetUrl;
438
+ targetUrl.searchParams.set("m", "redirect");
439
+ location.href = targetUrl.toString();
439
440
  };
440
441
  const open = async (options) => {
441
442
  return new Promise((resolve, reject) => {
442
- const targetUrl = buildUrl();
443
+ const targetUrlBuild = buildUrl();
444
+ targetUrlBuild.searchParams.set("m", "popup");
445
+ const targetUrl = targetUrlBuild.toString();
443
446
  const width = options && options.popupWidth || 744;
444
447
  const height = options && options.popupHeight || 720;
445
448
  const left = options && options.popupLeft || window.screenX + (window.outerWidth - width) / 2;
446
449
  const top = options && options.popupTop || window.screenX + (window.outerWidth - width) / 2;
447
450
  const popupFeatures = `width=${width},height=${height},left=${left},top=${top}`;
448
- const popup = window.open(targetUrl, options && options.windowName || "self_cert", popupFeatures);
451
+ const popup = window.open(targetUrlBuild.toString(), options && options.windowName || "self_cert", popupFeatures);
449
452
  if (!popup) {
450
453
  reject(new Error("\uCC28\uB2E8\uB418\uAC70\uB098 \uC5F4\uB9AC\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."));
451
454
  return;
@@ -480,7 +483,9 @@ function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }) {
480
483
  onClose,
481
484
  strictOrigin = true
482
485
  }) {
483
- const targetUrl = buildUrl();
486
+ const targetUrlBuild = buildUrl();
487
+ targetUrlBuild.searchParams.set("m", "iframe");
488
+ const targetUrl = targetUrlBuild.toString();
484
489
  useEffect(() => {
485
490
  if (!onSuccess && !onError) {
486
491
  return;
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":["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\n\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps) {\r\n\r\n const buildUrl = useCallback(() => {\r\n const baseUrl = getNlcHostFromEnvironment();\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]);\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 const baseUrl = getNlcHostFromEnvironment();\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"]}
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\n\r\n\r\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, t }: NxlOneProps) {\r\n\r\n const buildUrl = useCallback(() => {\r\n const baseUrl = getNlcHostFromEnvironment();\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;\r\n }, [bizCode, tmplCode, t, ncsrInfoUuid, nlcCtfnId]);\r\n\r\n /**\r\n * NEXTLAB ONE 인증 페이지로 이동합니다.\r\n * 인증이 완료 후, 관리자 페이지에서 정의한 프로세스 완료 URL로 이동합니다.\r\n */\r\n const redirect = () => {\r\n const targetUrl = buildUrl();\r\n targetUrl.searchParams.set('m', 'redirect');\r\n\r\n location.href = targetUrl.toString();\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 targetUrlBuild = buildUrl();\r\n targetUrlBuild.searchParams.set('m', 'popup');\r\n const targetUrl = targetUrlBuild.toString();\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(targetUrlBuild.toString(), (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 targetUrlBuild = buildUrl();\r\n targetUrlBuild.searchParams.set('m', 'iframe');\r\n const targetUrl = targetUrlBuild.toString();\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 const baseUrl = getNlcHostFromEnvironment();\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.22",
3
+ "version": "0.0.23",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,8 +34,8 @@
34
34
  "react": "^19.1.0",
35
35
  "tsup": "^8.4.0",
36
36
  "typescript": "5.8.2",
37
- "eslint-config-sales-frontend-eslint-config-v8": "^0.0.7",
38
- "sales-frontend-typescript-config": "0.0.2"
37
+ "sales-frontend-typescript-config": "0.0.2",
38
+ "eslint-config-sales-frontend-eslint-config-v8": "^0.0.7"
39
39
  },
40
40
  "scripts": {
41
41
  "lint": "eslint . --max-warnings 0",