sales-frontend-solution 0.0.47 → 0.0.48

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.
@@ -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 { getEnvironmentFromHostname, 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\n\r\nconst getPath = (service: string) => {\r\n if (!isClient()) {\r\n return;\r\n }\r\n const env = getEnvironmentFromHostname(location.hostname);\r\n\r\n /**\r\n * 로컬에서 키패드를 사용하기 위해서는 STG 환경으로 변경\r\n */\r\n const convertedEnv = env === 'local' ? 'stg' : env;\r\n\r\n return `https://nxl-${convertedEnv !== 'prd' ? `${service}-${convertedEnv}` : service}.hanwhalife.com`;\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\r\n const keypadServicePath = `${getPath('xkp')}/xkp/xkscriptservice`;\r\n const keypadContentsPath = `${getPath('nlc')}/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"]}
1
+ {"version":3,"sources":["../src/shared/utils/load-script.ts","../src/api/endpoint.ts","../src/features/v3/v3.ts","../src/features/v3/v3-provider.tsx","../src/features/keypad/constants.ts","../src/features/keypad/libs/constants.ts","../src/features/keypad/libs/environment.ts","../src/features/keypad/libs/config.ts","../src/features/keypad/libs/keypad-manager.ts","../src/features/keypad/libs/script-loader.ts","../src/features/keypad/libs/index.ts","../src/features/keypad/libs/keypad-param.ts","../src/features/keypad/types/keypad-message.enum.ts","../src/features/keypad/types/keypad-mode.enum.ts","../src/features/keypad/hooks/use-keypad.tsx","../src/features/keypad/components/keypad.tsx","../src/features/nxl-one/libs/nxl-one.ts","../src/features/nxl-one/components/nxl-one-iframe.tsx","../src/features/nxl-one/hooks/use-nxl-one.tsx"],"names":["isClient","getEnvironmentFromHostname","getServicePath","createContext","useState","useEffect","jsx","useContext","KeypadMessageTypeEnum","KeypadModeEnum","useCallback","keypadId","useRef","useMemo","React","Fragment","getNlcHostFromEnvironment","onSuccess","onError","onClose"],"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 '../../shared/utils/load-script';\r\n\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","/**\n * 키패드 관련 상수\n */\n\n/** 키패드 기본 설정값 */\nexport const KEYPAD_DEFAULTS = {\n /** 키패드 너비 (%) */\n WIDTH: 100,\n /** 키패드 상단 위치 */\n POSITION_TOP: 10,\n /** 뷰 타입 */\n VIEW_TYPE: 'half',\n /** 닫기 딜레이 */\n CLOSE_DELAY: 0,\n /** 숫자 키 행 수 */\n NUMBER_KEY_ROW_COUNT: 3\n} as const;\n\n/** 키패드 DOM 선택자 */\nexport const KEYPAD_SELECTORS = {\n ALERT: '#xkalert'\n} as const;\n\n/** 키패드 입력 구분자 */\nexport const INPUT_SEPARATOR = ',';\n\n/** 마스킹 문자 */\nexport const MASK_CHAR = '*';\n","/**\n * XKeyboard 관련 상수 정의\n */\n\n/** 환경 타입 */\nexport type XKeyboardEnv = 'local' | 'dev' | 'stg' | 'prd';\n\n/** 키패드 서비스 경로 구성 */\nexport const KEYPAD_SERVICE_PATH = {\n XKP: 'xkp',\n NLC: 'nlc'\n} as const;\n\n/** 스크립트 파일명 */\nexport const KEYPAD_SCRIPTS = {\n MOBILE: 'xkeypad_mobile.js'\n} as const;\n\n/** 키패드 CSS 파일명 */\nexport const KEYPAD_STYLES = {\n MOBILE: 'xkp_mobile.css'\n} as const;\n\n/** 키패드 기본 설정 */\nexport const DEFAULT_KEYPAD_CONFIG = {\n VERSION: '1.0.5.1',\n MAX_INPUT_SIZE: 56,\n TEXT_INPUT_VIEW: 0,\n TOUCH_OPTION: 0,\n INPUT_BACKGROUND_COLOR: '#E4E4E4',\n INPUT_BORDER_STYLE: '1px solid #9E9E9E',\n INVALID_SESSION_MESSAGE: \"보안세션이 만료되었습니다.\\n'확인'을 누르면 키패드가 갱신 됩니다.\",\n INVALID_SESSION_AUTO_REFRESH: true,\n ENABLE_ACCESSIBILITY: true,\n USE_CUSTOM_ALERT: false,\n FUNCTION_KEY_BUTTON_STYLE: 'text'\n} as const;\n","import { isClient } from 'sales-frontend-utils';\n\nimport { type XKeyboardEnv, KEYPAD_SERVICE_PATH } from './constants';\n\n/**\n * 환경에 따른 기본 URL 생성\n * @param service - 서비스 식별자 (예: \"xkp\", \"nlc\")\n * @param env - 환경 (dev, stg, prod)\n * @returns 환경에 맞는 서비스 URL\n */\n// export const getServicePath = (service: string, env: XKeyboardEnv): string => {\n// const baseUrl = 'https://nxl';\n\n// const domain = 'hanwhalife.com';\n\n// if (env === 'prod') {\n// return `${baseUrl}-${service}.${domain}`;\n// }\n\n// return `${baseUrl}-${service}-${env}.${domain}`;\n// };\n\nconst getServicePath = (service: string, env: XKeyboardEnv) => {\n if (!isClient()) {\n return;\n }\n\n /**\n * 로컬에서 키패드를 사용하기 위해서는 STG 환경으로 변경\n */\n const convertedEnv = env === 'local' ? 'stg' : env;\n\n return `https://nxl-${convertedEnv !== 'prd' ? `${service}-${convertedEnv}` : service}.hanwhalife.com`;\n};\n\n// /**\n// * 현재 호스트 기반 환경 감지 -> getEnvironmentFromHostname 로 대체\n// * @returns 감지된 환경 (dev, stg, prod)\n// */\n// export const getEnvironment = (): XKeyboardEnv => {\n// if (!isClient()) {\n// return 'dev';\n// }\n\n// const host = window.location.hostname;\n\n// // 로컬 개발 환경\n// if (host === 'nxl-local.hanwhalife.com' || host === 'localhost') {\n// // 내부망(회사 PC): dev 환경 (기본값)\n// // 외부망: stg 환경 (환경변수로 설정)\n// const isExternalNetwork = checkExternalNetwork();\n\n// return isExternalNetwork ? 'stg' : 'dev';\n// }\n\n// if (host.includes('-dev.')) {\n// return 'dev';\n// }\n\n// if (host.includes('-stg.')) {\n// return 'stg';\n// }\n\n// return 'prd';\n// };\n\n// /**\n// * 외부망 여부 확인\n// * - 환경변수 NEXT_PUBLIC_NETWORK_TYPE=external 설정 시 외부망\n// * - 기본값: 내부망(false) → dev 환경 사용\n// */\n// const checkExternalNetwork = (): boolean => {\n// // 1. 환경변수로 명시적 설정 (외부망에서 작업 시)\n// if (typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_NETWORK_TYPE === 'external') {\n// return true;\n// }\n\n// // 2. 브라우저에서 환경변수 접근 (Next.js)\n// if (typeof window !== 'undefined') {\n// const networkType =\n// window.__NEXT_DATA__?.props?.pageProps?.networkType ||\n// (typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_NETWORK_TYPE);\n\n// if (networkType === 'external') {\n// return true;\n// }\n// }\n\n// // 기본값: 내부망 (dev 사용)\n// return false;\n// };\n\n/**\n * 키패드 서비스 경로 생성\n * @param env - 환경\n * @returns 키패드 서비스 URL\n */\nexport const getKeypadServicePath = (env: XKeyboardEnv): string => {\n return `${getServicePath(KEYPAD_SERVICE_PATH.XKP, env)}/xkp/xkscriptservice`;\n};\n\n/**\n * 키패드 콘텐츠 경로 생성\n * @param env - 환경\n * @param subPath - 서브 경로 (예: \"/js\", \"/css\")\n * @returns 완전한 콘텐츠 URL\n */\nexport const getKeypadContentsPath = (env: XKeyboardEnv, subPath: string = ''): string => {\n const basePath = `${getServicePath(KEYPAD_SERVICE_PATH.NLC, env)}/cnts-files/xkeyboard`;\n\n return `${basePath}${subPath}`;\n};\n","import { getEnvironmentFromHostname, isClient } from 'sales-frontend-utils';\n\nimport { type KeypadConfigType } from '../types/keypad-config.type';\n\nimport { DEFAULT_KEYPAD_CONFIG, KEYPAD_STYLES } from './constants';\nimport { getKeypadContentsPath, getKeypadServicePath } from './environment';\n\n/**\n * XKeyboard 설정 생성\n * @returns KeypadConfigType 설정 객체\n */\nexport const createKeypadConfig = (): KeypadConfigType => {\n const env = getEnvironmentFromHostname(isClient() ? location.hostname : '');\n const keypadServicePath = getKeypadServicePath(env);\n\n return {\n version: DEFAULT_KEYPAD_CONFIG.VERSION,\n server: keypadServicePath,\n contextRoot: getKeypadContentsPath(env, '/js'),\n cssPath: getKeypadContentsPath(env, `/css/${KEYPAD_STYLES.MOBILE}`),\n logoImgPath: getKeypadContentsPath(env, '/img/logo.png'),\n inputObjectBackgroundColor: DEFAULT_KEYPAD_CONFIG.INPUT_BACKGROUND_COLOR,\n inputObjectBorderStyle: DEFAULT_KEYPAD_CONFIG.INPUT_BORDER_STYLE,\n invalidSessionErrorMessage: DEFAULT_KEYPAD_CONFIG.INVALID_SESSION_MESSAGE,\n invalidSessionAutoRefresh: DEFAULT_KEYPAD_CONFIG.INVALID_SESSION_AUTO_REFRESH,\n enableAccessibility: DEFAULT_KEYPAD_CONFIG.ENABLE_ACCESSIBILITY,\n useCustomAlert: DEFAULT_KEYPAD_CONFIG.USE_CUSTOM_ALERT,\n functionKeyButtonStyle: DEFAULT_KEYPAD_CONFIG.FUNCTION_KEY_BUTTON_STYLE,\n maxInputSize: DEFAULT_KEYPAD_CONFIG.MAX_INPUT_SIZE,\n textInputView: DEFAULT_KEYPAD_CONFIG.TEXT_INPUT_VIEW,\n touchOption: DEFAULT_KEYPAD_CONFIG.TOUCH_OPTION\n };\n};\n\n/**\n * 전역 XKConfigMobile 설정 초기화\n */\nexport const initializeGlobalConfig = (): KeypadConfigType | null => {\n if (isClient() === false) {\n return null;\n }\n\n const config = createKeypadConfig();\n\n // 전역 설정 등록 (외부 xkeypad_mobile.js에서 사용)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).XKConfigMobile = config;\n\n return config;\n};\n","import { type KeypadActionType } from '../types/keypad-action.type';\n\n/** 키패드 인스턴스 저장소 */\ntype KeypadStore = Record<string, KeypadActionType | undefined>;\n\n/**\n * 키패드 매니저\n * 키패드 인스턴스의 생성, 조회, 삭제를 관리합니다.\n */\nexport const createKeypadManager = () => {\n const keypads: KeypadStore = {};\n\n /**\n * 키패드 인스턴스 조회\n * @param name - 키패드 이름\n */\n const getKeypad = (name: string): KeypadActionType | undefined => {\n return keypads[name];\n };\n\n /**\n * 키패드 인스턴스 저장\n * @param name - 키패드 이름\n * @param keypad - 키패드 인스턴스\n */\n const setKeypad = (name: string, keypad: KeypadActionType): KeypadActionType => {\n keypads[name] = keypad;\n\n return keypad;\n };\n\n /**\n * 키패드 인스턴스 제거\n * @param name - 키패드 이름\n */\n const removeKeypad = (name: string): void => {\n delete keypads[name];\n };\n\n /**\n * 모든 열린 키패드 닫기\n */\n const closeAll = (): void => {\n Object.keys(keypads).forEach((id) => {\n const keypad = keypads[id];\n\n if (keypad && keypad.isOpen()) {\n keypad.close();\n }\n });\n };\n\n /**\n * 새 키패드 인스턴스 생성\n * @param name - 키패드 이름\n */\n const newKeypad = (name: string): KeypadActionType | undefined => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { XKModule } = window as any;\n\n if (!XKModule) {\n console.error('[XKeyboard] XKModule이 로드되지 않았습니다.');\n\n return undefined;\n }\n\n return setKeypad(name, new XKModule());\n };\n\n return {\n keypads,\n getKeypad,\n setKeypad,\n newKeypad,\n removeKeypad,\n closeAll\n };\n};\n\nexport type KeypadManager = ReturnType<typeof createKeypadManager>;\n","import { loadScript } from '../../../shared/utils/load-script';\nimport { type KeypadConfigType } from '../types/keypad-config.type';\n\nimport { KEYPAD_SCRIPTS } from './constants';\n\n/** 스크립트 로딩 상태 */\nlet isScriptsLoaded = false;\nlet loadingPromise: Promise<void> | null = null;\n\n/**\n * 문서 이벤트 비활성화 (보안 목적)\n */\nconst disableDocumentEvents = (): void => {\n if (typeof document === 'undefined') {\n return;\n }\n\n document.oncontextmenu = () => false;\n document.ondragstart = () => false;\n document.onselectstart = () => false;\n};\n\n/**\n * 키패드 CSS 로드\n * @param cssPath - CSS 파일 경로\n */\nconst loadKeypadStyles = (cssPath: string): void => {\n if (typeof document === 'undefined') {\n return;\n }\n\n const headTag = document.head;\n\n // 기존 스타일 제거\n const existingLink = document.getElementById('xkStyle');\n\n if (existingLink?.parentNode) {\n existingLink.parentNode.removeChild(existingLink);\n }\n\n // 새 스타일 추가\n const linkElement = document.createElement('link');\n linkElement.id = 'xkStyle';\n linkElement.rel = 'stylesheet';\n linkElement.type = 'text/css';\n linkElement.href = cssPath;\n\n headTag.appendChild(linkElement);\n};\n\n/**\n * 키패드 스크립트 로드\n * @param config - 키패드 설정\n */\n\nexport const loadKeypadScripts = async (config: KeypadConfigType): Promise<void> => {\n // 이미 로드 완료된 경우\n if (isScriptsLoaded) {\n return;\n }\n\n // 로딩 중인 경우 기존 Promise 반환\n if (loadingPromise) {\n return loadingPromise;\n }\n\n loadingPromise = (async () => {\n try {\n // 문서 이벤트 비활성화\n disableDocumentEvents();\n\n // 스크립트 URL 구성\n const scriptUrl = `${config.contextRoot}/${KEYPAD_SCRIPTS.MOBILE}`;\n\n console.log('scriptUrl::', scriptUrl);\n\n // 스크립트 로드\n await loadScript(scriptUrl);\n\n // CSS 로드\n loadKeypadStyles(config.cssPath);\n\n isScriptsLoaded = true;\n } catch (error) {\n loadingPromise = null;\n\n throw error;\n }\n })();\n\n return loadingPromise;\n};\n\n/**\n * 스크립트 로드 상태 확인\n */\nexport const isKeypadScriptsLoaded = (): boolean => isScriptsLoaded;\n\n/**\n * 스크립트 로드 상태 리셋 (테스트용)\n */\nexport const resetScriptLoadState = (): void => {\n isScriptsLoaded = false;\n loadingPromise = null;\n};\n","/**\n * XKeyboard Mobile Instance\n *\n * 한화생명 보안 키패드를 위한 인스턴스 관리 모듈입니다.\n * 외부 xkeypad_mobile.js 라이브러리를 래핑하여 사용합니다.\n *\n * @module xkeyboard\n */\n\nimport { isClient } from 'sales-frontend-utils';\n\nimport { initializeGlobalConfig } from './config';\nimport { createKeypadManager, type KeypadManager } from './keypad-manager';\nimport { loadKeypadScripts } from './script-loader';\n\n// Re-exports\nexport type { XKeyboardEnv } from './constants';\n\n//export { getEnvironment } from './environment';\n\n/**\n * XKeyboard 모바일 인스턴스 타입\n */\nexport type XKeyboardMobileInstanceType = KeypadManager | null;\n\n/**\n * XKeyboard 모바일 인스턴스 생성\n *\n * IIFE 패턴으로 싱글톤 인스턴스를 생성합니다.\n * 서버 사이드 렌더링 환경에서는 null을 반환합니다.\n */\nexport const XKeyboardMobileInstance: XKeyboardMobileInstanceType = (() => {\n // SSR 환경 체크\n if (isClient() === false) {\n return null;\n }\n\n // 전역 설정 초기화\n const config = initializeGlobalConfig();\n\n if (!config) {\n console.error('[XKeyboard] 설정 초기화에 실패했습니다.');\n\n return null;\n }\n\n // 스크립트 로드 (비동기)\n loadKeypadScripts(config).catch((error) => {\n console.error('[XKeyboard] 스크립트 로드 실패:', error);\n });\n\n // 키패드 매니저 생성 및 반환\n return createKeypadManager();\n})();\n\nexport default XKeyboardMobileInstance;\n","import { INPUT_SEPARATOR, KEYPAD_DEFAULTS } from '../constants';\n\nimport type { KeypadActionType } from '../types/keypad-action.type';\nimport type KeypadModeEnum from '../types/keypad-mode.enum';\nimport type KeypadResponseType from '../types/keypad-response.type';\n\n/**\n * 키패드 파라미터 생성 옵션\n */\nexport interface CreateKeypadParamOptions {\n name: string;\n inputRef: HTMLInputElement;\n keyType: KeypadModeEnum;\n maxLength: number;\n numberKeyRowCount: number;\n onInputChange: (length: number) => void;\n onKeypadClose: (res: KeypadResponseType) => void;\n keypad: KeypadActionType;\n setIsShow: (isShow: boolean) => void;\n setKeypadId: (id: string | null) => void;\n removeKeypad: (name: string) => void;\n}\n\n/**\n * 키패드 초기화 파라미터 생성\n */\nexport const createKeypadParam = (options: CreateKeypadParamOptions) => {\n const {\n name,\n inputRef,\n keyType,\n maxLength,\n numberKeyRowCount,\n onInputChange,\n onKeypadClose,\n keypad,\n setIsShow,\n setKeypadId,\n removeKeypad\n } = options;\n\n return {\n name: `xk-pad-${name}`,\n editBox: inputRef,\n keyType,\n width: KEYPAD_DEFAULTS.WIDTH,\n position: { top: KEYPAD_DEFAULTS.POSITION_TOP, left: null },\n viewType: KEYPAD_DEFAULTS.VIEW_TYPE,\n closeDelay: KEYPAD_DEFAULTS.CLOSE_DELAY,\n autoKeyResize: true,\n isE2E: true,\n onlyMobile: false,\n hasPressEffect: true,\n maxLength,\n numberKeyRowCount,\n onInputChange: createInputChangeHandler({\n maxLength,\n keypad,\n setIsShow,\n setKeypadId,\n onInputChange\n }),\n onKeypadClose: createCloseHandler({\n name,\n inputRef,\n keyType,\n keypad,\n setIsShow,\n setKeypadId,\n onKeypadClose,\n removeKeypad\n })\n };\n};\n\n/**\n * 입력 변경 핸들러 옵션\n */\ninterface InputChangeHandlerOptions {\n maxLength: number;\n keypad: KeypadActionType;\n setIsShow: (isShow: boolean) => void;\n setKeypadId: (id: string | null) => void;\n onInputChange: (length: number) => void;\n}\n\n/**\n * 입력 변경 핸들러 생성\n */\nconst createInputChangeHandler = (options: InputChangeHandlerOptions) => {\n const { maxLength, keypad, setIsShow, setKeypadId, onInputChange } = options;\n\n return (newLength: number) => {\n // 콜백 호출\n onInputChange(newLength);\n\n // 최대 입력 길이 도달 시 키패드 닫기\n if (maxLength > 0 && newLength >= maxLength && keypad.isOpend()) {\n keypad.close();\n\n setIsShow(false);\n setKeypadId(null);\n }\n };\n};\n\n/**\n * 키패드 닫기 핸들러 옵션\n */\ninterface CloseHandlerOptions {\n name: string;\n inputRef: HTMLInputElement;\n keyType: KeypadModeEnum;\n keypad: KeypadActionType;\n setIsShow: (isShow: boolean) => void;\n setKeypadId: (id: string | null) => void;\n onKeypadClose: (res: KeypadResponseType) => void;\n removeKeypad: (name: string) => void;\n}\n\n/**\n * 키패드 닫기 핸들러 생성\n */\nconst createCloseHandler = (options: CloseHandlerOptions) => {\n const { name, inputRef, keyType, keypad, setIsShow, setKeypadId, onKeypadClose, removeKeypad } = options;\n\n return () => {\n const sessionInfo = keypad.get_sessionInfo();\n\n // 입력 길이 계산\n const length = calculateInputLength(sessionInfo.input);\n\n // 응답 객체 생성\n const response: KeypadResponseType = {\n length,\n element: inputRef,\n sessionInfo: {\n input: sessionInfo.input,\n sessionId: sessionInfo.sessionId,\n secToken: sessionInfo.secToken\n },\n keyType,\n name\n };\n\n setIsShow(false);\n setKeypadId(null);\n onKeypadClose(response);\n\n // 키패드 인스턴스 제거\n\n removeKeypad(name);\n };\n};\n\n/**\n * 입력 길이 계산\n * @param input - 콤마로 구분된 입력 문자열\n */\nexport const calculateInputLength = (input: string | undefined): number => {\n if (!input || input.length === 0) {\n return 0;\n }\n\n if (input.indexOf(INPUT_SEPARATOR) >= 0) {\n return input.split(INPUT_SEPARATOR).length;\n }\n\n return 0;\n};\n","enum KeypadMessageTypeEnum {\n NotSupportDevice = -1,\n Already = -2\n}\n\nexport default KeypadMessageTypeEnum;\n","enum KeypadModeEnum {\n QWERTY_SMART = 'qwertysmart',\n NUMBER = 'number'\n}\n\nexport default KeypadModeEnum;\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { KEYPAD_DEFAULTS, KEYPAD_SELECTORS } from '../constants';\nimport { XKeyboardMobileInstance } from '../libs';\nimport { createKeypadParam } from '../libs/keypad-param';\nimport KeypadMessageTypeEnum from '../types/keypad-message.enum';\nimport KeypadModeEnum from '../types/keypad-mode.enum';\n\nimport type { KeypadActionType } from '../types/keypad-action.type';\nimport type KeypadResponseType from '../types/keypad-response.type';\n\n/** 키패드 ID 카운터 */\nlet keypadCounter = 0;\nconst generateKeypadId = (): string => `kp-${++keypadCounter}`;\n\n/**\n * useKeypad 훅 반환 타입\n */\nexport interface UseKeypadReturn {\n /** 키패드 표시 */\n show: (\n inputRef: HTMLInputElement,\n onInputChange: (length: number) => void,\n onKeypadClose: (res: KeypadResponseType) => void,\n keyType?: KeypadModeEnum,\n maxLength?: number,\n numberKeyRowCount?: number\n ) => void;\n\n /** 키패드 닫기 */\n close: (name?: string) => void;\n /** 키패드 입력 초기화 */\n clear: (name?: string) => void;\n /** 키패드 새로고침 */\n refresh: (name?: string) => void;\n /** 세션 정보 조회 */\n getValue: (name: string) => ReturnType<KeypadActionType['get_sessionInfo']> | null | undefined;\n /** 키패드 열림 상태 확인 */\n isOpen: (name?: string) => boolean;\n /** 키패드 인스턴스 찾기 */\n find: (name?: string) => KeypadActionType | undefined;\n /** 키패드 표시 상태 */\n isShow: boolean;\n /** 현재 키패드 ID (DOM id는 `xk-pad-${keypadId}`) */\n keypadId: string | null;\n}\n\n/**\n * 보안 키패드 훅\n *\n * 한화생명 보안 키패드를 React에서 사용하기 위한 커스텀 훅입니다.\n *\n * @example\n * ```tsx\n * const { show, close, isShow } = useKeypad();\n *\n * const handleClick = () => {\n * show(\n * inputRef.current,\n * (length) => console.log('입력 길이:', length),\n * (res) => console.log('세션 정보:', res.sessionInfo),\n * );\n * };\n * ```\n */\nexport default function useKeypad(): UseKeypadReturn {\n const [isShow, setIsShow] = useState<boolean>(false);\n const [keypadId, setKeypadId] = useState<string | null>(null);\n\n /**\n * 키패드 표시\n */\n const show = useCallback(\n (\n inputRef: HTMLInputElement,\n onInputChange: (length: number) => void,\n onKeypadClose: (res: KeypadResponseType) => void,\n keyType: KeypadModeEnum = KeypadModeEnum.QWERTY_SMART,\n maxLength: number = 0,\n numberKeyRowCount: number = KEYPAD_DEFAULTS.NUMBER_KEY_ROW_COUNT\n ) => {\n if (!XKeyboardMobileInstance) {\n console.warn('[useKeypad] XKeyboardMobileInstance가 초기화되지 않았습니다.');\n\n return;\n }\n\n const name = generateKeypadId();\n const keypad = getOrCreateKeypad(name);\n\n if (!keypad) {\n console.error('[useKeypad] 키패드 인스턴스 생성에 실패했습니다.');\n\n return;\n }\n\n // 초기 콜백 호출\n onInputChange(0);\n\n // 키패드 파라미터 생성\n const keyPadParam = createKeypadParam({\n name,\n inputRef,\n keyType,\n maxLength,\n numberKeyRowCount,\n onInputChange,\n onKeypadClose,\n keypad,\n setIsShow,\n setKeypadId,\n removeKeypad: (n) => XKeyboardMobileInstance?.removeKeypad(n)\n });\n\n // 키패드 초기화\n const result = keypad.initialize(keyPadParam);\n\n if (!handleInitializeResult(result)) {\n console.warn('[useKeypad] 키패드 초기화 실패:', result);\n\n return;\n }\n\n setKeypadId(name);\n setIsShow(true);\n },\n\n []\n );\n\n /**\n * 키패드 인스턴스 조회 또는 생성\n */\n const getOrCreateKeypad = (name: string): KeypadActionType | undefined => {\n if (!XKeyboardMobileInstance) {\n return undefined;\n }\n\n let keypad = XKeyboardMobileInstance.getKeypad(name);\n\n if (!keypad) {\n keypad = XKeyboardMobileInstance.newKeypad(name);\n } else {\n keypad.refresh();\n }\n\n return keypad;\n };\n\n /**\n * 초기화 결과 처리\n * @returns 성공 여부\n */\n const handleInitializeResult = (result: KeypadMessageTypeEnum | undefined): boolean => {\n if (result === KeypadMessageTypeEnum.NotSupportDevice) {\n alert('지원하지 않는 기기 입니다.');\n\n return false;\n }\n\n if (result === KeypadMessageTypeEnum.Already) {\n // 이미 실행 중인 경우 무시\n\n return false;\n }\n\n return true;\n };\n\n /**\n * 세션 정보 조회\n */\n const getValue = useCallback((name: string) => {\n if (!XKeyboardMobileInstance) {\n return undefined;\n }\n\n const targetKeypad = XKeyboardMobileInstance.keypads[name];\n\n return targetKeypad?.get_sessionInfo() ?? null;\n }, []);\n\n /**\n * 활성화된 키패드 찾기\n */\n const find = useCallback((name?: string): KeypadActionType | undefined => {\n if (!XKeyboardMobileInstance) {\n return undefined;\n }\n\n // 이름이 지정된 경우 해당 키패드 반환\n if (name) {\n return XKeyboardMobileInstance.keypads[name];\n }\n\n // 열려있는 키패드 찾기\n const keypadIds = Object.keys(XKeyboardMobileInstance.keypads);\n\n for (const keypadId of keypadIds) {\n const targetKeypad = XKeyboardMobileInstance.keypads[keypadId];\n\n if (targetKeypad?.isOpen()) {\n return targetKeypad;\n }\n }\n\n return undefined;\n }, []);\n\n /**\n * 키패드 열림 상태 확인\n */\n const isOpen = useCallback(\n (name?: string): boolean => {\n return !!find(name);\n },\n\n [find]\n );\n\n /**\n * 키패드 닫기\n */\n const close = useCallback(\n (name?: string) => {\n const targetKeypad = find(name);\n\n if (targetKeypad) {\n targetKeypad.close();\n\n setIsShow(false);\n\n setKeypadId(null);\n }\n },\n\n [find]\n );\n\n /**\n * 키패드 입력 초기화\n */\n const clear = useCallback(\n (name?: string) => {\n const targetKeypad = find(name);\n\n if (targetKeypad) {\n targetKeypad.clear();\n\n setIsShow(false);\n setKeypadId(null);\n }\n },\n\n [find]\n );\n\n /**\n * 키패드 새로고침\n */\n const refresh = useCallback(\n (name?: string) => {\n const targetKeypad = find(name);\n\n targetKeypad?.refresh();\n },\n\n [find]\n );\n\n /**\n * 외부 클릭 시 키패드 닫기\n */\n useEffect(() => {\n const handleMouseDown = (event: MouseEvent) => {\n if (!XKeyboardMobileInstance) {\n return;\n }\n\n const keypadAlertDivTag = document.querySelector(KEYPAD_SELECTORS.ALERT);\n\n const keypadDivTag = keypadAlertDivTag?.parentElement;\n\n if (keypadDivTag && !keypadDivTag.contains(event.target as Node)) {\n XKeyboardMobileInstance.closeAll();\n\n setIsShow(false);\n\n setKeypadId(null);\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, []);\n\n return {\n show,\n close,\n clear,\n refresh,\n getValue,\n isOpen,\n find,\n isShow,\n keypadId\n };\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { INPUT_SEPARATOR, KEYPAD_DEFAULTS, MASK_CHAR } from '../constants';\nimport useKeypad from '../hooks/use-keypad';\n\nimport type KeypadModeEnum from '../types/keypad-mode.enum';\nimport type KeypadResponseType from '../types/keypad-response.type';\nimport type KeypadSessionType from '../types/keypad-session.type';\nimport type KeypadType from '../types/keypad.type';\n\n/**\n * 키패드 영역 정보\n */\nexport interface KeypadRect {\n /** 키패드 높이 */\n height: number;\n /** 키패드 상단 위치 (viewport 기준) */\n top: number;\n /** 키패드 하단 위치 (viewport 기준) */\n bottom: number;\n /** 키패드 너비 */\n width: number;\n /** 키패드 왼쪽 위치 */\n left: number;\n /** 키패드 오른쪽 위치 */\n right: number;\n}\n\n/**\n * onShow 콜백 파라미터\n */\nexport interface KeypadShowEvent {\n /** 키패드 표시 여부 */\n isShow: boolean;\n /** 키패드 DOM 요소 (열림 상태일 때만 존재) */\n keypadElement: HTMLElement | null;\n /** 키패드 영역 정보 (열림 상태일 때만 존재) */\n keypadRect: KeypadRect | null;\n /** 입력 필드 DOM 요소 */\n inputElement: HTMLInputElement;\n}\n\n/**\n * Keypad 컴포넌트 Props\n */\nexport interface KeypadProps {\n /** 키패드 세션 값 */\n value: KeypadSessionType | null;\n /** 입력 엘리먼트 (React Element) */\n inputElement: KeypadType;\n /** 키패드 모드 (QWERTY_SMART, NUMBER) */\n mode: KeypadModeEnum;\n /** 값 변경 콜백 */\n onChange: (value: KeypadSessionType | null) => void;\n /** 최대 입력 길이 */\n maxLength: number;\n /**\n * 키패드 표시 상태 콜백\n * @param event - 키패드 상태 및 영역 정보 (keypadRect로 직접 레이아웃 처리 가능)\n */\n onShow?: (event: KeypadShowEvent) => void;\n /** 숫자 키 행 수 (기본값: 3) */\n numberKeyRowCount?: number;\n /** 키패드가 input을 가릴 때 translateY 처리할 최상위 컨테이너 요소의 ID */\n wrapId?: string;\n}\n\n/**\n * 마스킹 문자열 생성\n */\nconst createMaskedValue = (length: number): string => {\n return ''.padStart(length, MASK_CHAR);\n};\n\n/**\n * 세션 입력 문자열로부터 길이 계산\n */\nconst getInputLength = (input: string | undefined): number => {\n if (!input || input.length === 0) {\n return 0;\n }\n\n return input.split(INPUT_SEPARATOR).length;\n};\n\n/**\n * 키패드 DOM ID prefix\n */\n\nconst KEYPAD_ID_PREFIX = 'xk-pad-';\n\n/**\n * 키패드 DOM 요소를 ID로 찾기\n * @param keypadId - 키패드 고유 ID (useKeypad에서 생성된 UUID)\n */\nconst findKeypadById = (keypadId: string): HTMLElement | null => {\n const fullId = `${KEYPAD_ID_PREFIX}${keypadId}`;\n\n const element = document.getElementById(fullId);\n\n if (element && element.offsetHeight > 0) {\n return element;\n }\n\n return null;\n};\n\n/**\n * 키패드 DOM 요소를 찾을 때까지 대기\n * @param keypadId - 키패드 고유 ID\n */\nconst waitForKeypadElement = (keypadId: string): Promise<HTMLElement | null> => {\n return new Promise((resolve) => {\n // 먼저 즉시 확인\n const existing = findKeypadById(keypadId);\n if (existing) {\n resolve(existing);\n\n return;\n }\n\n const fullId = `${KEYPAD_ID_PREFIX}${keypadId}`;\n\n const observer = new MutationObserver((_mutations, obs) => {\n const keypad = document.getElementById(fullId);\n\n if (keypad && keypad.offsetHeight > 0) {\n obs.disconnect();\n\n resolve(keypad);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n\n // 타임아웃 (3초)\n setTimeout(() => {\n observer.disconnect();\n\n resolve(null);\n }, 3000);\n });\n};\n\n/**\n * DOMRect를 KeypadRect로 변환\n */\nconst toKeypadRect = (rect: DOMRect): KeypadRect => ({\n height: rect.height,\n top: rect.top,\n bottom: rect.bottom,\n width: rect.width,\n left: rect.left,\n right: rect.right\n});\n\n/**\n * 보안 키패드 컴포넌트\n *\n * 한화생명 보안 키패드를 React 컴포넌트로 래핑합니다.\n * 입력 엘리먼트를 받아 키패드 기능을 추가합니다.\n *\n * @example\n * ```tsx\n * <Keypad\n * value={sessionInfo}\n * onChange={setSessionInfo}\n * mode={KeypadModeEnum.NUMBER}\n * maxLength={6}\n * inputElement={<input placeholder=\"비밀번호 입력\" />}\n * onShow={({ isShow, keypadElement, keypadRect }) => {\n * if (isShow && keypadRect) {\n * // 키패드 높이만큼 하단 여백 추가\n * document.body.style.paddingBottom = `${keypadRect.height}px`;\n * } else {\n * document.body.style.paddingBottom = '';\n * }\n * // 또는 keypadElement를 직접 활용\n * console.log('키패드 DOM:', keypadElement);\n * }}\n * />\n * ```\n */\nexport default function Keypad({\n value,\n onChange,\n mode,\n maxLength,\n inputElement,\n onShow,\n numberKeyRowCount = KEYPAD_DEFAULTS.NUMBER_KEY_ROW_COUNT,\n wrapId\n}: KeypadProps) {\n const { show, isShow, keypadId } = useKeypad();\n const inputRef = useRef<HTMLInputElement>(null);\n const [maskedValue, setMaskedValue] = useState<string>('');\n\n /**\n * 키패드 표시 상태 변경 시 콜백 호출\n */\n useEffect(() => {\n const input = inputRef.current;\n\n if (!input) {\n return;\n }\n\n if (isShow && keypadId) {\n waitForKeypadElement(keypadId).then((keypadElement) => {\n if (keypadElement) {\n const rect = keypadElement.getBoundingClientRect();\n\n const wrap = wrapId && document.getElementById(wrapId);\n\n if (wrap) {\n const inputRect = input.getBoundingClientRect();\n\n if (inputRect.bottom > rect.top) {\n const diff = inputRect.bottom - rect.top;\n\n wrap.style.transform = `translateY(-${diff}px)`;\n }\n }\n\n onShow?.({\n isShow: true,\n keypadElement,\n keypadRect: toKeypadRect(rect),\n inputElement: input\n });\n } else {\n onShow?.({ isShow: true, keypadElement: null, keypadRect: null, inputElement: input });\n }\n });\n } else {\n const wrap = wrapId && document.getElementById(wrapId);\n\n if (wrap) {\n wrap.style.transform = '';\n }\n\n onShow?.({ isShow: false, keypadElement: null, keypadRect: null, inputElement: input });\n }\n }, [isShow, keypadId, onShow, wrapId]);\n\n /**\n * 키패드 닫힘 콜백\n */\n const handleKeypadClose = useCallback(\n (res: KeypadResponseType) => {\n onChange(res.sessionInfo);\n },\n\n [onChange]\n );\n\n /**\n * 입력 변경 콜백\n */\n const handleInputChange = useCallback(\n (length: number) => {\n if (length === 0) {\n onChange(null);\n }\n\n setMaskedValue(createMaskedValue(length));\n },\n\n [onChange]\n );\n\n /**\n * 키패드 열기 핸들러\n */\n\n const handleOpenKeypad = useCallback(() => {\n if (!inputRef.current) {\n console.error('[Keypad] inputRef가 연결되지 않았습니다.');\n\n return;\n }\n\n show(inputRef.current, handleInputChange, handleKeypadClose, mode, maxLength, numberKeyRowCount);\n }, [show, handleInputChange, handleKeypadClose, mode, maxLength, numberKeyRowCount]);\n\n /**\n * 기존 onClick과 키패드 열기를 조합\n */\n const combinedOnClick = useCallback(() => {\n inputElement.props.onClick?.();\n\n handleOpenKeypad();\n }, [inputElement.props.onClick, handleOpenKeypad]);\n\n /**\n * value 변경 시 마스킹 값 동기화\n */\n useEffect(() => {\n const length = getInputLength(value?.input);\n\n setMaskedValue(createMaskedValue(length));\n }, [value]);\n\n /**\n * inputRef 타입 검증\n */\n useEffect(() => {\n if (inputRef.current && !(inputRef.current instanceof HTMLInputElement)) {\n throw new Error('[Keypad] inputElement는 HTMLInputElement를 렌더링해야 합니다.');\n }\n }, []);\n\n /**\n * 복제된 입력 엘리먼트\n */\n const clonedElement = useMemo(\n () =>\n React.cloneElement(inputElement, {\n ref: inputRef,\n value: maskedValue,\n onClick: combinedOnClick\n }),\n\n [inputElement, maskedValue, combinedOnClick]\n );\n\n return <>{clonedElement}</>;\n}\n","/* ─────────────────────────────────────────────────────────────\n Constants\n───────────────────────────────────────────────────────────── */\n\nexport const NXL_ONE_ENV_URLS = {\n dev: 'https://nxl-nlc-dev.hanwhalife.com',\n stg: 'https://nxl-nlc-stg.hanwhalife.com',\n //prod: 'https://nxl-nlc.hanwhalife.com',\n prd: 'https://nxl-nlc.hanwhalife.com'\n} as const;\n\nexport const NXL_ONE_AUTH_PATH = '/auth/v1';\n\nexport const NXL_ONE_DEFAULT_POPUP = {\n width: 744,\n height: 720,\n windowName: 'self_cert'\n} as const;\n\nexport const NXL_ONE_DEFAULT_IFRAME = {\n height: 720,\n sandbox: 'allow-scripts allow-forms allow-same-origin'\n} as const;\n\n/* ─────────────────────────────────────────────────────────────\n Types\n───────────────────────────────────────────────────────────── */\n\nexport type NxlOneEnv = keyof typeof NXL_ONE_ENV_URLS;\n\nexport type NxlOneMode = 'redirect' | 'popup' | 'iframe';\n\nexport type NxlOneAction = 'error' | 'close' | 'complete';\n\nexport type NxlOneResponse = {\n action?: NxlOneAction;\n redirectUrl?: string;\n nlcCtfnId?: string;\n};\n\nexport type NxlOneParams = {\n bizCode: string;\n tmplCode: string;\n ncsrInfoUuid?: string;\n nlcCtfnId?: string;\n t?: string;\n};\n\n/* ─────────────────────────────────────────────────────────────\n Utils\n───────────────────────────────────────────────────────────── */\n\n/** 현재 URL 기반으로 환경 자동 감지 */\nexport const detectEnvFromUrl = (): NxlOneEnv => {\n if (typeof window === 'undefined') {\n //return 'prod';\n return 'prd';\n }\n\n const { href } = window.location;\n\n if (href.includes('localhost') || href.includes('dev')) {\n return 'dev';\n }\n\n if (href.includes('stg')) {\n return 'stg';\n }\n\n //return 'prod';\n return 'prd';\n};\n\n/** 환경에 맞는 Base URL 반환 */\n\nexport const getBaseUrl = (env?: NxlOneEnv): string => NXL_ONE_ENV_URLS[env ?? detectEnvFromUrl()];\n\n/** 인증 URL 생성 */\nexport const buildAuthUrl = (baseUrl: string, params: NxlOneParams, mode: NxlOneMode): string => {\n const url = new URL(NXL_ONE_AUTH_PATH, baseUrl);\n\n url.searchParams.set('bizCode', params.bizCode);\n url.searchParams.set('tmplCode', params.tmplCode);\n url.searchParams.set('m', mode);\n\n if (params.nlcCtfnId) {\n url.searchParams.set('nlcCtfnId', params.nlcCtfnId);\n }\n\n if (params.t) {\n url.searchParams.set('t', params.t);\n }\n\n if (params.ncsrInfoUuid) {\n url.searchParams.set('ncsrInfoUuid', params.ncsrInfoUuid);\n }\n\n return url.toString();\n};\n\n/** 팝업 중앙 위치 계산 */\nexport const calcPopupCenter = (width: number, height: number) => ({\n left: window.screenX + (window.outerWidth - width) / 2,\n top: window.screenY + (window.outerHeight - height) / 2\n});\n\n/* ─────────────────────────────────────────────────────────────\n Error\n───────────────────────────────────────────────────────────── */\n\n/** NxlOne 에러 코드 값 */\n\nexport const NXL_ONE_ERROR_CODES = {\n /** 팝업이 브라우저에 의해 차단됨 */\n POPUP_BLOCKED: 'POPUP_BLOCKED',\n\n /** 사용자가 인증을 취소함 */\n AUTH_CANCELLED: 'AUTH_CANCELLED',\n\n /** 인증 실패 */\n AUTH_FAILED: 'AUTH_FAILED',\n\n /** 잘못된 응답 */\n INVALID_RESPONSE: 'INVALID_RESPONSE'\n} as const;\n\n/** NxlOne 에러 코드 타입 */\nexport type NxlOneErrorCode = (typeof NXL_ONE_ERROR_CODES)[keyof typeof NXL_ONE_ERROR_CODES];\n\n/** NxlOne 에러 객체 */\nexport type NxlOneError = {\n /** 에러 코드 */\n code: NxlOneErrorCode;\n\n /** 사용자 친화적 메시지 */\n message: string;\n};\n\n/** 에러 코드별 기본 메시지 */\n\nconst ERROR_MESSAGES: Record<NxlOneErrorCode, string> = {\n POPUP_BLOCKED: '팝업이 차단되었습니다. 팝업 차단을 해제해주세요.',\n AUTH_CANCELLED: '인증이 취소되었습니다.',\n AUTH_FAILED: '인증에 실패했습니다.',\n INVALID_RESPONSE: '잘못된 응답을 받았습니다.'\n};\n\n/** NxlOne 에러 생성 */\n\nexport const createNxlOneError = (code: NxlOneErrorCode, customMessage?: string): NxlOneError => ({\n code,\n message: customMessage ?? ERROR_MESSAGES[code]\n});\n\n/** NxlOneError 타입 가드 */\nexport const isNxlOneError = (value: unknown): value is NxlOneError =>\n typeof value === 'object' &&\n value !== null &&\n 'code' in value &&\n 'message' in value &&\n Object.values(NXL_ONE_ERROR_CODES).includes((value as NxlOneError).code);\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { getNlcHostFromEnvironment } from 'sales-frontend-utils';\n\nimport { buildAuthUrl, getBaseUrl, NXL_ONE_DEFAULT_IFRAME, type NxlOneEnv, type NxlOneResponse } from '../libs/nxl-one';\n\n/* ─────────────────────────────────────────────────────────────\n Types\n───────────────────────────────────────────────────────────── */\n\n/** @deprecated NxlOneResponse를 사용하세요 */\nexport type NxlOneIframeResponse = NxlOneResponse;\n\nexport type NxlOneIframeProps = {\n /** 비즈니스 코드 */\n bizCode: string;\n\n /** 템플릿 코드 */\n tmplCode: string;\n\n /** NCSR 정보 UUID */\n ncsrInfoUuid?: string;\n\n /** NLC 인증 ID */\n nlcCtfnId?: string;\n\n /** 환경 (미지정 시 현재 URL 기반 자동 감지) */\n env?: NxlOneEnv;\n\n /** iframe 너비 (기본: '100%') */\n width?: number | string;\n\n /** iframe 높이 (기본: '100%') */\n height?: number | string;\n\n /** CSS 클래스명 */\n className?: string;\n\n /** 인라인 스타일 */\n style?: React.CSSProperties;\n\n /** iframe allow 속성 */\n allow?: string;\n\n /** iframe sandbox 속성 */\n sandbox?: string;\n\n /** 인증 성공 시 호출 */\n onSuccess?: (response: NxlOneResponse) => void;\n\n /** 에러 발생 시 호출 */\n onError?: (response: NxlOneResponse) => void;\n\n /** 닫기 시 호출 */\n onClose: (response: NxlOneResponse) => void;\n\n /** origin 검증 여부 (기본: true) */\n strictOrigin?: boolean;\n\n /** 콜백 호출 시 자동으로 iframe 숨김 (기본: false) */\n autoHide?: boolean;\n};\n\n/* ─────────────────────────────────────────────────────────────\n Component\n───────────────────────────────────────────────────────────── */\n\n/**\n * NEXTLAB ONE 인증을 위한 Iframe 컴포넌트\n *\n * @example\n * ```tsx\n * <NxlOneIframe\n * bizCode=\"BIZ001\"\n * tmplCode=\"TMPL001\"\n * env=\"dev\"\n * autoHide\n * onSuccess={(res) => console.log(\"성공\", res)}\n * onError={(res) => console.log(\"에러\", res)}\n * onClose={(res) => console.log(\"닫기\", res)}\n * />\n * ```\n */\nexport default function NxlOneIframe({\n bizCode,\n tmplCode,\n ncsrInfoUuid,\n nlcCtfnId,\n env,\n width = '100%',\n height = '100%',\n className,\n style,\n allow,\n sandbox = NXL_ONE_DEFAULT_IFRAME.sandbox,\n onSuccess,\n onError,\n onClose,\n strictOrigin = true,\n autoHide = false\n}: NxlOneIframeProps) {\n const [visible, setVisible] = useState(true);\n\n const callbacksRef = useRef({ onSuccess, onError, onClose });\n\n callbacksRef.current = { onSuccess, onError, onClose };\n\n const baseUrl = env ? getBaseUrl(env) : getNlcHostFromEnvironment();\n\n const targetUrl = useMemo(\n () => buildAuthUrl(baseUrl, { bizCode, tmplCode, nlcCtfnId, ncsrInfoUuid }, 'iframe'),\n\n [baseUrl, bizCode, tmplCode, nlcCtfnId, ncsrInfoUuid]\n );\n\n useEffect(() => {\n const handleMessage = (e: MessageEvent) => {\n if (strictOrigin && e.origin !== baseUrl) {\n return;\n }\n\n const data = e.data as NxlOneResponse;\n\n if (!data?.action) {\n return;\n }\n\n const { onSuccess, onError, onClose } = callbacksRef.current;\n\n // autoHide가 true면 콜백 호출 전에 숨김 처리\n if (autoHide) {\n setVisible(false);\n }\n\n switch (data.action) {\n case 'complete':\n onSuccess?.(data);\n break;\n case 'error':\n onError?.(data);\n break;\n case 'close':\n onClose(data);\n break;\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => window.removeEventListener('message', handleMessage);\n }, [baseUrl, strictOrigin, autoHide]);\n\n if (!visible) {\n return null;\n }\n\n return (\n <iframe\n src={targetUrl}\n width={typeof width === 'number' ? `${width}px` : width}\n height={typeof height === 'number' ? `${height}px` : height}\n className={className}\n style={{ border: 0, ...style }}\n sandbox={sandbox}\n allow={allow}\n />\n );\n}\n","import { useMemo } from 'react';\n\nimport { getNlcHostFromEnvironment } from 'sales-frontend-utils';\n\nimport {\n buildAuthUrl,\n calcPopupCenter,\n createNxlOneError,\n getBaseUrl,\n NXL_ONE_DEFAULT_POPUP,\n NXL_ONE_ERROR_CODES,\n type NxlOneEnv,\n type NxlOneError,\n type NxlOneResponse\n} from '../libs/nxl-one';\n\n/* ─────────────────────────────────────────────────────────────\n Types\n───────────────────────────────────────────────────────────── */\n\nexport type NxlOneProps = {\n /** 비즈니스 코드 */\n bizCode: string;\n\n /** 템플릿 코드 */\n tmplCode: string;\n /** NCSR 정보 UUID */\n ncsrInfoUuid?: string;\n\n /** NLC 인증 ID */\n nlcCtfnId?: string;\n\n /** 환경 (미지정 시 현재 URL 기반 자동 감지) */\n env?: NxlOneEnv;\n};\n\nexport type { NxlOneError, NxlOneResponse };\n\nexport type PopupOptions = {\n /** 팝업 너비 (기본: 744) */\n width?: number;\n\n /** 팝업 높이 (기본: 720) */\n height?: number;\n\n /** 팝업 X 위치 (기본: 화면 중앙) */\n left?: number;\n\n /** 팝업 Y 위치 (기본: 화면 중앙) */\n top?: number;\n\n /** 팝업 창 이름 (기본: \"self_cert\") */\n windowName?: string;\n};\n\n/* ─────────────────────────────────────────────────────────────\n Hook\n───────────────────────────────────────────────────────────── */\n\n/**\n * NEXTLAB ONE 인증을 위한 훅\n *\n * @example\n * ```tsx\n * const { redirect, open } = useNxlOne({\n * bizCode: \"BIZ001\",\n * tmplCode: \"TMPL001\",\n * env: \"dev\",\n * });\n *\n * // 리다이렉트 방식\n * <button onClick={redirect}>인증하기</button>\n *\n * // 팝업 방식\n * <button onClick={() => open().then(console.log)}>팝업으로 인증</button>\n * ```\n */\n\nexport default function useNxlOne({ bizCode, tmplCode, ncsrInfoUuid, nlcCtfnId, env }: NxlOneProps) {\n //const baseUrl = useMemo(() => getBaseUrl(env), [env]);\n const baseUrl = env ? getBaseUrl(env) : getNlcHostFromEnvironment();\n\n const params = useMemo(\n () => ({ bizCode, tmplCode, nlcCtfnId, ncsrInfoUuid }),\n\n [bizCode, tmplCode, nlcCtfnId, ncsrInfoUuid]\n );\n\n /**\n * NEXTLAB ONE 인증 페이지로 리다이렉트합니다.\n * 인증 완료 후 관리자 페이지에서 정의한 프로세스 완료 URL로 이동합니다.\n */\n const redirect = () => {\n location.href = buildAuthUrl(baseUrl, params, 'redirect');\n };\n\n /**\n * NEXTLAB ONE 인증 페이지를 팝업으로 엽니다.\n *\n * @param options - 팝업 옵션 (크기, 위치, 창 이름)\n * @returns 인증 결과를 담은 Promise\n * @rejects {NxlOneError} 팝업이 차단되었거나 인증이 취소/실패한 경우\n *\n * @example\n * ```tsx\n * import { isNxlOneError, NXL_ONE_ERROR_CODES } from \"@nxl-kit/solution\";\n *\n * try {\n * const result = await open();\n * console.log(\"인증 성공:\", result);\n * } catch (error) {\n * if (isNxlOneError(error)) {\n * switch (error.code) {\n * case NXL_ONE_ERROR_CODES.POPUP_BLOCKED:\n * alert(\"팝업을 허용해주세요\");\n * break;\n * case NXL_ONE_ERROR_CODES.AUTH_CANCELLED:\n * console.log(\"사용자가 취소함\");\n * break;\n * }\n * }\n * }\n * ```\n *\n * @note 팝업은 반드시 사용자 이벤트 핸들러 내에서 직접 호출해야 브라우저 차단을 피할 수 있습니다.\n */\n\n const open = (options?: PopupOptions): Promise<NxlOneResponse> => {\n return new Promise((resolve, reject) => {\n const targetUrl = buildAuthUrl(baseUrl, params, 'popup');\n const width = options?.width ?? NXL_ONE_DEFAULT_POPUP.width;\n const height = options?.height ?? NXL_ONE_DEFAULT_POPUP.height;\n const center = calcPopupCenter(width, height);\n\n const left = options?.left ?? center.left;\n const top = options?.top ?? center.top;\n\n const windowName = options?.windowName ?? NXL_ONE_DEFAULT_POPUP.windowName;\n\n const popup = window.open(targetUrl, windowName, `width=${width},height=${height},left=${left},top=${top}`);\n\n if (!popup) {\n reject(createNxlOneError(NXL_ONE_ERROR_CODES.POPUP_BLOCKED));\n\n return;\n }\n\n let isSettled = false;\n let popupChecker: number = 0;\n\n const cleanup = () => {\n window.removeEventListener('message', handleMessage);\n window.clearInterval(popupChecker);\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== baseUrl) {\n return;\n }\n\n if (isSettled) {\n return;\n }\n\n isSettled = true;\n\n cleanup();\n\n popup.close();\n\n if (event.data) {\n resolve(event.data);\n } else {\n reject(createNxlOneError(NXL_ONE_ERROR_CODES.INVALID_RESPONSE));\n }\n };\n\n // 팝업이 닫혔는지 주기적으로 확인 (사용자가 X 버튼으로 닫은 경우)\n popupChecker = window.setInterval(() => {\n if (popup.closed && !isSettled) {\n isSettled = true;\n\n cleanup();\n\n reject(createNxlOneError(NXL_ONE_ERROR_CODES.AUTH_CANCELLED));\n }\n }, 300);\n\n window.addEventListener('message', handleMessage);\n });\n };\n\n return { redirect, open };\n}\n"]}