@bwg-ui/core 1.1.10 → 1.1.12
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/chunks/BwgLargeUploader-CgrJUwFW.cjs +3 -0
- package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs.map +1 -0
- package/dist/chunks/{BwgLargeUploader-B5EtYKUz.js → BwgLargeUploader-Nx2-wiD8.js} +802 -776
- package/dist/chunks/BwgLargeUploader-Nx2-wiD8.js.map +1 -0
- package/dist/chunks/{FileUtils-CaU9Bzu2.js → FileUtils-Bbz3AvQn.js} +2 -2
- package/dist/chunks/{FileUtils-CaU9Bzu2.js.map → FileUtils-Bbz3AvQn.js.map} +1 -1
- package/dist/chunks/FileUtils-D73GVmB8.cjs +2 -0
- package/dist/chunks/{FileUtils-BweAWoJt.cjs.map → FileUtils-D73GVmB8.cjs.map} +1 -1
- package/dist/chunks/SSOHandler-CZHPiuEh.js +25397 -0
- package/dist/chunks/SSOHandler-CZHPiuEh.js.map +1 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs +236 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs.map +1 -0
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js → SearchBoxContext-BxtHF9BO.js} +2 -2
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js.map → SearchBoxContext-BxtHF9BO.js.map} +1 -1
- package/dist/chunks/SearchBoxContext-Cpr9xa1S.cjs +2 -0
- package/dist/chunks/{SearchBoxContext-DDBY44Wr.cjs.map → SearchBoxContext-Cpr9xa1S.cjs.map} +1 -1
- package/dist/chunks/TabContainer-B7-6AQXV.js +254 -0
- package/dist/chunks/TabContainer-B7-6AQXV.js.map +1 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs +36 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs +2 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js +9 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js.map +1 -0
- package/dist/chunks/apiUtils-C45AWfu-.js +957 -0
- package/dist/chunks/apiUtils-C45AWfu-.js.map +1 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs +4 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs.map +1 -0
- package/dist/chunks/codeStore-BGLhSpAM.cjs +2 -0
- package/dist/chunks/{codeStore-KPL92rcv.cjs.map → codeStore-BGLhSpAM.cjs.map} +1 -1
- package/dist/chunks/{codeStore-IIp25egq.js → codeStore-BzT5wSd9.js} +2 -2
- package/dist/chunks/{codeStore-IIp25egq.js.map → codeStore-BzT5wSd9.js.map} +1 -1
- package/dist/chunks/commonUtils-BH6QwGUb.cjs +2 -0
- package/dist/chunks/commonUtils-BH6QwGUb.cjs.map +1 -0
- package/dist/chunks/{commonUtils-Cvx6_eK2.js → commonUtils-Bb16Yqjk.js} +24 -25
- package/dist/chunks/commonUtils-Bb16Yqjk.js.map +1 -0
- package/dist/chunks/envUtils-C9Gf5aek.js.map +1 -1
- package/dist/chunks/envUtils-CduTHoHu.cjs.map +1 -1
- package/dist/chunks/favoriteStore-3YceyayF.cjs +2 -0
- package/dist/chunks/favoriteStore-3YceyayF.cjs.map +1 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js +112 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js.map +1 -0
- package/dist/chunks/{popupStore-D8RI04bU.js → popupStore-DmFbkkjd.js} +19 -18
- package/dist/chunks/popupStore-DmFbkkjd.js.map +1 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs +2 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs.map +1 -0
- package/dist/chunks/usePopup-C8FrbrDD.cjs +2 -0
- package/dist/chunks/{UtilsContext-JSHHfnWl.js.map → usePopup-C8FrbrDD.cjs.map} +1 -1
- package/dist/chunks/{UtilsContext-JSHHfnWl.js → usePopup-pfh-ajfP.js} +82 -82
- package/dist/chunks/usePopup-pfh-ajfP.js.map +1 -0
- package/dist/components/common/BwgDetail.d.ts +5 -0
- package/dist/components/common/BwgDetail.d.ts.map +1 -0
- package/dist/components/common/BwgDrawer.d.ts.map +1 -1
- package/dist/components/common/BwgEditor.d.ts +7 -0
- package/dist/components/common/BwgEditor.d.ts.map +1 -0
- package/dist/components/common/BwgView.d.ts.map +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.d.ts +3 -1
- package/dist/components/common/index.d.ts.map +1 -1
- package/dist/components/common/index.js +27 -25
- package/dist/components/core/BwgDatePicker.d.ts +1 -1
- package/dist/components/core/BwgDatePicker.d.ts.map +1 -1
- package/dist/components/core/BwgRangePicker.d.ts +1 -1
- package/dist/components/core/BwgRangePicker.d.ts.map +1 -1
- package/dist/components/core/BwgUploader.d.ts.map +1 -1
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/layout/ErrorBound.d.ts +29 -0
- package/dist/components/layout/ErrorBound.d.ts.map +1 -0
- package/dist/components/layout/TabContainer.d.ts +9 -0
- package/dist/components/layout/TabContainer.d.ts.map +1 -0
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.d.ts +3 -1
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +6 -4
- package/dist/index.cjs +1 -1
- package/dist/index.js +304 -299
- package/dist/provider/index.cjs +1 -1
- package/dist/provider/index.js +2 -2
- package/dist/stores/favoriteStore.d.ts.map +1 -1
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.cjs.map +1 -1
- package/dist/stores/index.d.ts +3 -1
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +18 -16
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/loadingStore.d.ts +9 -0
- package/dist/stores/loadingStore.d.ts.map +1 -0
- package/dist/stores/menuViewStore.d.ts +28 -3
- package/dist/stores/menuViewStore.d.ts.map +1 -1
- package/dist/stores/popupStore.d.ts.map +1 -1
- package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
- package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
- package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
- package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
- package/dist/utils/apiUtils.d.ts +3 -2
- package/dist/utils/apiUtils.d.ts.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -3
- package/dist/utils/notificationUtils.d.ts +0 -1
- package/dist/utils/notificationUtils.d.ts.map +1 -1
- package/package.json +6 -7
- package/dist/chunks/BwgLargeUploader-B5EtYKUz.js.map +0 -1
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs +0 -3
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs.map +0 -1
- package/dist/chunks/FileUtils-BweAWoJt.cjs +0 -2
- package/dist/chunks/PublicLayout-3v46YZdi.cjs +0 -36
- package/dist/chunks/PublicLayout-3v46YZdi.cjs.map +0 -1
- package/dist/chunks/PublicLayout-B4wGo0ut.js +0 -139
- package/dist/chunks/PublicLayout-B4wGo0ut.js.map +0 -1
- package/dist/chunks/SSOHandler-C72Do3RD.js +0 -15717
- package/dist/chunks/SSOHandler-C72Do3RD.js.map +0 -1
- package/dist/chunks/SSOHandler-ColywAGZ.cjs +0 -184
- package/dist/chunks/SSOHandler-ColywAGZ.cjs.map +0 -1
- package/dist/chunks/SearchBoxContext-DDBY44Wr.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs.map +0 -1
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js +0 -7
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js.map +0 -1
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs +0 -2
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs.map +0 -1
- package/dist/chunks/codeStore-KPL92rcv.cjs +0 -2
- package/dist/chunks/commonUtils-Cvx6_eK2.js.map +0 -1
- package/dist/chunks/commonUtils-DaFg0y7C.cjs +0 -2
- package/dist/chunks/commonUtils-DaFg0y7C.cjs.map +0 -1
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs +0 -3
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs.map +0 -1
- package/dist/chunks/menuViewStore-OKcSQq-s.js +0 -343
- package/dist/chunks/menuViewStore-OKcSQq-s.js.map +0 -1
- package/dist/chunks/popupStore-BEoWGajT.cjs +0 -2
- package/dist/chunks/popupStore-BEoWGajT.cjs.map +0 -1
- package/dist/chunks/popupStore-D8RI04bU.js.map +0 -1
- package/dist/chunks/serviceConfig-9dHegQIK.cjs +0 -3
- package/dist/chunks/serviceConfig-9dHegQIK.cjs.map +0 -1
- package/dist/chunks/serviceConfig-Dhe7neaj.js +0 -709
- package/dist/chunks/serviceConfig-Dhe7neaj.js.map +0 -1
- package/scripts/gen-component-registry.js +0 -138
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { j as u } from "./jsx-runtime-Dpn_P65e.js";
|
|
2
2
|
import { useEffect as m, createContext as i, useContext as S, useRef as x } from "react";
|
|
3
|
-
import { an as f } from "./
|
|
3
|
+
import { an as f } from "./apiUtils-C45AWfu-.js";
|
|
4
4
|
const s = {
|
|
5
5
|
// 권한 관련
|
|
6
6
|
AUTH_BTNS: "SCMSIGN00202",
|
|
@@ -85,4 +85,4 @@ export {
|
|
|
85
85
|
D as e,
|
|
86
86
|
M as u
|
|
87
87
|
};
|
|
88
|
-
//# sourceMappingURL=SearchBoxContext-
|
|
88
|
+
//# sourceMappingURL=SearchBoxContext-BxtHF9BO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBoxContext-
|
|
1
|
+
{"version":3,"file":"SearchBoxContext-BxtHF9BO.js","sources":["../../src/provider/contexts/ServiceCodeContext.tsx","../../src/provider/contexts/SearchBoxContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect } from 'react';\r\nimport { ServiceCodeKey, setServiceCodeOverrides } from '../../utils/serviceConfig';\r\n\r\n// 서비스코드 설정을 위한 Context 타입\r\ninterface ServiceCodeContextType {\r\n serviceCodes: Partial<Record<ServiceCodeKey, string>>;\r\n getServiceCode: (key: ServiceCodeKey) => string;\r\n}\r\n\r\n// 기본 서비스코드 정의\r\nconst DEFAULT_SERVICE_CODES = {\r\n // 권한 관련\r\n AUTH_BTNS: 'SCMSIGN00202', // 버튼 권한 조회\r\n AUTH_MENU: 'SCMSIGN00201', // 메뉴 권한 조회\r\n SRCH_CODE: 'SCMSIGN00301', // 코드 조회\r\n \r\n // 팝업 관련\r\n SRCH_POPU: 'SCMPOPU00101', // 팝업 조회\r\n \r\n // 즐겨찾기 관련\r\n AUTH_BMRK: 'SCMBMRK00101', // 즐겨찾기 관리\r\n} as const;\r\n\r\n// Context 생성\r\nconst ServiceCodeContext = createContext<ServiceCodeContextType | null>(null);\r\n\r\n// Provider Props 타입\r\ninterface ServiceCodeProviderProps {\r\n children: ReactNode;\r\n /**\r\n * 서비스코드 오버라이드 설정\r\n * 외부 프로젝트에서 기본 서비스코드를 재정의할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * SRCH_CODE: 'CUSTOM_SRCH_CODE',\r\n * SRCH_POPU: 'CUSTOM_SRCH_POPU_CODE',\r\n * AUTH_BMRK: 'CUSTOM_AUTH_BMRK_CODE',\r\n * }}\r\n * >\r\n * {children}\r\n * </ServiceCodeProvider>\r\n * ```\r\n * \r\n * @description\r\n * - AUTH_BTNS: 버튼 권한 조회 서비스코드\r\n * - AUTH_MENU: 메뉴 권한 조회 서비스코드 \r\n * - SRCH_CODE: 코드 조회 서비스코드\r\n * - SRCH_POPU: 팝업 조회 서비스코드\r\n * - AUTH_BMRK: 즐겨찾기 관리 서비스코드\r\n * \r\n * 설정하지 않은 서비스코드는 기본값을 사용합니다.\r\n */\r\n serviceCodes?: Partial<Record<ServiceCodeKey, string>>;\r\n}\r\n\r\n/**\r\n * 서비스코드 Provider 컴포넌트\r\n * 외부 프로젝트에서 서비스코드를 설정할 수 있도록 함\r\n * \r\n * @example\r\n * ```tsx\r\n * import { ServiceCodeProvider } from '@bwg/core/provider';\r\n * \r\n * function App() {\r\n * return (\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * }}\r\n * >\r\n * <YourApp />\r\n * </ServiceCodeProvider>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport const ServiceCodeProvider: React.FC<ServiceCodeProviderProps> = ({\r\n children,\r\n serviceCodes = {},\r\n}) => {\r\n // serviceCodes가 변경될 때마다 serviceConfig.ts의 오버라이드를 업데이트\r\n useEffect(() => {\r\n setServiceCodeOverrides(serviceCodes);\r\n }, [serviceCodes]);\r\n\r\n // 서비스코드 가져오기 함수\r\n const getServiceCode = (key: ServiceCodeKey): string => {\r\n // 1. Provider에서 설정된 값 우선 확인\r\n if (serviceCodes[key] && serviceCodes[key]!.trim() !== '') {\r\n console.log(`🔧 Provider 설정 사용: ${key} = ${serviceCodes[key]}`);\r\n return serviceCodes[key]!;\r\n }\r\n\r\n // 2. 기본값 사용\r\n const defaultValue = DEFAULT_SERVICE_CODES[key];\r\n console.log(`🔧 기본값 사용: ${key} = ${defaultValue}`);\r\n return defaultValue;\r\n };\r\n\r\n const contextValue: ServiceCodeContextType = {\r\n serviceCodes,\r\n getServiceCode,\r\n };\r\n\r\n return (\r\n <ServiceCodeContext.Provider value={contextValue}>\r\n {children}\r\n </ServiceCodeContext.Provider>\r\n );\r\n};\r\n\r\n/**\r\n * 서비스코드 Context를 사용하는 Hook\r\n * \r\n * @example\r\n * ```tsx\r\n * const { getServiceCode, serviceCodes } = useServiceCode();\r\n * const authBtnsCode = getServiceCode('AUTH_BTNS');\r\n * ```\r\n */\r\nexport const useServiceCode = (): ServiceCodeContextType => {\r\n const context = useContext(ServiceCodeContext);\r\n if (!context) {\r\n throw new Error('useServiceCode must be used within a ServiceCodeProvider');\r\n }\r\n return context;\r\n};\r\n\r\n/**\r\n * 특정 서비스코드를 가져오는 Hook\r\n * \r\n * @param key - 서비스코드 키\r\n * @returns 실제 서비스코드 값\r\n * \r\n * @example\r\n * ```tsx\r\n * const authBtnsCode = useServiceCodeValue('AUTH_BTNS');\r\n * const authMenuCode = useServiceCodeValue('AUTH_MENU');\r\n * ```\r\n */\r\nexport const useServiceCodeValue = (key: ServiceCodeKey): string => {\r\n const { getServiceCode } = useServiceCode();\r\n return getServiceCode(key);\r\n};\r\n\r\n/**\r\n * 모든 서비스코드를 가져오는 Hook\r\n * \r\n * @returns 모든 서비스코드 객체\r\n * \r\n * @example\r\n * ```tsx\r\n * const allServiceCodes = useAllServiceCodes();\r\n * console.log(allServiceCodes.AUTH_BTNS); // 'SCMSIGN00202' 또는 커스텀 값\r\n * ```\r\n */\r\nexport const useAllServiceCodes = (): Record<ServiceCodeKey, string> => {\r\n const { getServiceCode } = useServiceCode();\r\n const result = {} as Record<ServiceCodeKey, string>;\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n result[key] = getServiceCode(key);\r\n }\r\n \r\n return result;\r\n};\r\n\r\n/**\r\n * 서비스코드 설정을 로그로 출력하는 Hook\r\n * 개발 시 현재 설정된 서비스코드를 확인할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * useLogServiceCodeConfig();\r\n * // 콘솔에 현재 설정된 모든 서비스코드가 출력됩니다.\r\n * ```\r\n */\r\nexport const useLogServiceCodeConfig = (): void => {\r\n const { getServiceCode } = useServiceCode();\r\n \r\n console.log('🔧 bwg-core 서비스코드 설정:');\r\n console.log('📋 Provider 설정 > 기본값 순서로 확인');\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n const value = getServiceCode(key);\r\n console.log(` ${key}: ${value}`);\r\n }\r\n};\r\n\r\n// 타입 내보내기\r\nexport type { ServiceCodeKey };\r\n","import React, { createContext, useContext, useRef, ReactNode } from 'react';\r\nimport { SearchBoxRef } from '../../components/common/SearchBox';\r\n\r\n// SearchBox Context 타입\r\ninterface SearchBoxContextType {\r\n searchBoxRef: React.RefObject<SearchBoxRef> | null;\r\n getFormData: () => any;\r\n setFormData: (data: any) => void;\r\n resetForm: () => void;\r\n validateForm: () => Promise<any>;\r\n}\r\n\r\n// Context 생성\r\nconst SearchBoxContext = createContext<SearchBoxContextType | null>(null);\r\n\r\n// Provider Props\r\ninterface SearchBoxProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\n// Provider 컴포넌트\r\nexport const SearchBoxProvider: React.FC<SearchBoxProviderProps> = ({\r\n children,\r\n}) => {\r\n const searchBoxRef = useRef<SearchBoxRef>(null);\r\n\r\n const getFormData = () => {\r\n return searchBoxRef.current?.getFormData() || {};\r\n };\r\n\r\n const setFormData = (data: any) => {\r\n searchBoxRef.current?.setFormData(data);\r\n };\r\n\r\n const resetForm = () => {\r\n searchBoxRef.current?.resetForm();\r\n };\r\n\r\n const validateForm = async () => {\r\n return (\r\n (await searchBoxRef.current?.validateForm()) || {\r\n success: false,\r\n error: null,\r\n }\r\n );\r\n };\r\n\r\n const value: SearchBoxContextType = {\r\n searchBoxRef,\r\n getFormData,\r\n setFormData,\r\n resetForm,\r\n validateForm,\r\n };\r\n\r\n return (\r\n <SearchBoxContext.Provider value={value}>\r\n {children}\r\n </SearchBoxContext.Provider>\r\n );\r\n};\r\n\r\n// Hook\r\nexport const useSearchBox = () => {\r\n const context = useContext(SearchBoxContext);\r\n if (!context) {\r\n throw new Error('useSearchBox must be used within a SearchBoxProvider');\r\n }\r\n return context;\r\n};\r\n"],"names":["DEFAULT_SERVICE_CODES","ServiceCodeContext","createContext","ServiceCodeProvider","children","serviceCodes","useEffect","setServiceCodeOverrides","contextValue","key","defaultValue","useServiceCode","context","useContext","useServiceCodeValue","getServiceCode","useAllServiceCodes","result","useLogServiceCodeConfig","value","SearchBoxContext","SearchBoxProvider","searchBoxRef","useRef","data","jsx","useSearchBox"],"mappings":";;;AAUA,MAAMA,IAAwB;AAAA;AAAA,EAE5B,WAAW;AAAA;AAAA,EACX,WAAW;AAAA;AAAA,EACX,WAAW;AAAA;AAAA;AAAA,EAGX,WAAW;AAAA;AAAA;AAAA,EAGX,WAAW;AAAA;AACb,GAGMC,IAAqBC,EAA6C,IAAI,GA0D/DC,IAA0D,CAAC;AAAA,EACtE,UAAAC;AAAA,EACA,cAAAC,IAAe,CAAA;AACjB,MAAM;AAEJ,EAAAC,EAAU,MAAM;AACd,IAAAC,EAAwBF,CAAY;AAAA,EACtC,GAAG,CAACA,CAAY,CAAC;AAgBjB,QAAMG,IAAuC;AAAA,IAC3C,cAAAH;AAAA,IACA,gBAfqB,CAACI,MAAgC;AAEtD,UAAIJ,EAAaI,CAAG,KAAKJ,EAAaI,CAAG,EAAG,KAAA,MAAW;AACrD,uBAAQ,IAAI,sBAAsBA,CAAG,MAAMJ,EAAaI,CAAG,CAAC,EAAE,GACvDJ,EAAaI,CAAG;AAIzB,YAAMC,IAAeV,EAAsBS,CAAG;AAC9C,qBAAQ,IAAI,cAAcA,CAAG,MAAMC,CAAY,EAAE,GAC1CA;AAAA,IACT;AAAA,EAIE;AAGF,+BACGT,EAAmB,UAAnB,EAA4B,OAAOO,GACjC,UAAAJ,GACH;AAEJ,GAWaO,IAAiB,MAA8B;AAC1D,QAAMC,IAAUC,EAAWZ,CAAkB;AAC7C,MAAI,CAACW;AACH,UAAM,IAAI,MAAM,0DAA0D;AAE5E,SAAOA;AACT,GAcaE,IAAsB,CAACL,MAAgC;AAClE,QAAM,EAAE,gBAAAM,EAAA,IAAmBJ,EAAA;AAC3B,SAAOI,EAAeN,CAAG;AAC3B,GAaaO,IAAqB,MAAsC;AACtE,QAAM,EAAE,gBAAAD,EAAA,IAAmBJ,EAAA,GACrBM,IAAS,CAAA;AAEf,aAAWR,KAAO,OAAO,KAAKT,CAAqB;AACjD,IAAAiB,EAAOR,CAAG,IAAIM,EAAeN,CAAG;AAGlC,SAAOQ;AACT,GAYaC,IAA0B,MAAY;AACjD,QAAM,EAAE,gBAAAH,EAAA,IAAmBJ,EAAA;AAE3B,UAAQ,IAAI,uBAAuB,GACnC,QAAQ,IAAI,6BAA6B;AAEzC,aAAWF,KAAO,OAAO,KAAKT,CAAqB,GAAuB;AACxE,UAAMmB,IAAQJ,EAAeN,CAAG;AAChC,YAAQ,IAAI,KAAKA,CAAG,KAAKU,CAAK,EAAE;AAAA,EAClC;AACF,GCpLMC,IAAmBlB,EAA2C,IAAI,GAQ3DmB,IAAsD,CAAC;AAAA,EAClE,UAAAjB;AACF,MAAM;AACJ,QAAMkB,IAAeC,EAAqB,IAAI,GAuBxCJ,IAA8B;AAAA,IAClC,cAAAG;AAAA,IACA,aAvBkB,MACXA,EAAa,SAAS,YAAA,KAAiB,CAAA;AAAA,IAuB9C,aApBkB,CAACE,MAAc;AACjC,MAAAF,EAAa,SAAS,YAAYE,CAAI;AAAA,IACxC;AAAA,IAmBE,WAjBgB,MAAM;AACtB,MAAAF,EAAa,SAAS,UAAA;AAAA,IACxB;AAAA,IAgBE,cAdmB,YAEhB,MAAMA,EAAa,SAAS,kBAAmB;AAAA,MAC9C,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAUX;AAGF,SACEG,gBAAAA,EAAAA,IAACL,EAAiB,UAAjB,EAA0B,OAAAD,GACxB,UAAAf,EAAA,CACH;AAEJ,GAGasB,IAAe,MAAM;AAChC,QAAMd,IAAUC,EAAWO,CAAgB;AAC3C,MAAI,CAACR;AACH,UAAM,IAAI,MAAM,sDAAsD;AAExE,SAAOA;AACT;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const a=require("./jsx-runtime-CeSfJrVB.cjs"),c=require("react"),v=require("./apiUtils-Cbg6NQLv.cjs"),u={AUTH_BTNS:"SCMSIGN00202",AUTH_MENU:"SCMSIGN00201",SRCH_CODE:"SCMSIGN00301",SRCH_POPU:"SCMPOPU00101",AUTH_BMRK:"SCMBMRK00101"},S=c.createContext(null),x=({children:o,serviceCodes:e={}})=>{c.useEffect(()=>{v.setServiceCodeOverrides(e)},[e]);const i={serviceCodes:e,getServiceCode:r=>{if(e[r]&&e[r].trim()!=="")return console.log(`🔧 Provider 설정 사용: ${r} = ${e[r]}`),e[r];const s=u[r];return console.log(`🔧 기본값 사용: ${r} = ${s}`),s}};return a.jsxRuntimeExports.jsx(S.Provider,{value:i,children:o})},n=()=>{const o=c.useContext(S);if(!o)throw new Error("useServiceCode must be used within a ServiceCodeProvider");return o},g=o=>{const{getServiceCode:e}=n();return e(o)},m=()=>{const{getServiceCode:o}=n(),e={};for(const t of Object.keys(u))e[t]=o(t);return e},f=()=>{const{getServiceCode:o}=n();console.log("🔧 bwg-core 서비스코드 설정:"),console.log("📋 Provider 설정 > 기본값 순서로 확인");for(const e of Object.keys(u)){const t=o(e);console.log(` ${e}: ${t}`)}},l=c.createContext(null),P=({children:o})=>{const e=c.useRef(null),C={searchBoxRef:e,getFormData:()=>e.current?.getFormData()||{},setFormData:d=>{e.current?.setFormData(d)},resetForm:()=>{e.current?.resetForm()},validateForm:async()=>await e.current?.validateForm()||{success:!1,error:null}};return a.jsxRuntimeExports.jsx(l.Provider,{value:C,children:o})},F=()=>{const o=c.useContext(l);if(!o)throw new Error("useSearchBox must be used within a SearchBoxProvider");return o};exports.SearchBoxProvider=P;exports.ServiceCodeProvider=x;exports.useAllServiceCodes=m;exports.useLogServiceCodeConfig=f;exports.useSearchBox=F;exports.useServiceCode=n;exports.useServiceCodeValue=g;
|
|
2
|
+
//# sourceMappingURL=SearchBoxContext-Cpr9xa1S.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBoxContext-
|
|
1
|
+
{"version":3,"file":"SearchBoxContext-Cpr9xa1S.cjs","sources":["../../src/provider/contexts/ServiceCodeContext.tsx","../../src/provider/contexts/SearchBoxContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect } from 'react';\r\nimport { ServiceCodeKey, setServiceCodeOverrides } from '../../utils/serviceConfig';\r\n\r\n// 서비스코드 설정을 위한 Context 타입\r\ninterface ServiceCodeContextType {\r\n serviceCodes: Partial<Record<ServiceCodeKey, string>>;\r\n getServiceCode: (key: ServiceCodeKey) => string;\r\n}\r\n\r\n// 기본 서비스코드 정의\r\nconst DEFAULT_SERVICE_CODES = {\r\n // 권한 관련\r\n AUTH_BTNS: 'SCMSIGN00202', // 버튼 권한 조회\r\n AUTH_MENU: 'SCMSIGN00201', // 메뉴 권한 조회\r\n SRCH_CODE: 'SCMSIGN00301', // 코드 조회\r\n \r\n // 팝업 관련\r\n SRCH_POPU: 'SCMPOPU00101', // 팝업 조회\r\n \r\n // 즐겨찾기 관련\r\n AUTH_BMRK: 'SCMBMRK00101', // 즐겨찾기 관리\r\n} as const;\r\n\r\n// Context 생성\r\nconst ServiceCodeContext = createContext<ServiceCodeContextType | null>(null);\r\n\r\n// Provider Props 타입\r\ninterface ServiceCodeProviderProps {\r\n children: ReactNode;\r\n /**\r\n * 서비스코드 오버라이드 설정\r\n * 외부 프로젝트에서 기본 서비스코드를 재정의할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * SRCH_CODE: 'CUSTOM_SRCH_CODE',\r\n * SRCH_POPU: 'CUSTOM_SRCH_POPU_CODE',\r\n * AUTH_BMRK: 'CUSTOM_AUTH_BMRK_CODE',\r\n * }}\r\n * >\r\n * {children}\r\n * </ServiceCodeProvider>\r\n * ```\r\n * \r\n * @description\r\n * - AUTH_BTNS: 버튼 권한 조회 서비스코드\r\n * - AUTH_MENU: 메뉴 권한 조회 서비스코드 \r\n * - SRCH_CODE: 코드 조회 서비스코드\r\n * - SRCH_POPU: 팝업 조회 서비스코드\r\n * - AUTH_BMRK: 즐겨찾기 관리 서비스코드\r\n * \r\n * 설정하지 않은 서비스코드는 기본값을 사용합니다.\r\n */\r\n serviceCodes?: Partial<Record<ServiceCodeKey, string>>;\r\n}\r\n\r\n/**\r\n * 서비스코드 Provider 컴포넌트\r\n * 외부 프로젝트에서 서비스코드를 설정할 수 있도록 함\r\n * \r\n * @example\r\n * ```tsx\r\n * import { ServiceCodeProvider } from '@bwg/core/provider';\r\n * \r\n * function App() {\r\n * return (\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * }}\r\n * >\r\n * <YourApp />\r\n * </ServiceCodeProvider>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport const ServiceCodeProvider: React.FC<ServiceCodeProviderProps> = ({\r\n children,\r\n serviceCodes = {},\r\n}) => {\r\n // serviceCodes가 변경될 때마다 serviceConfig.ts의 오버라이드를 업데이트\r\n useEffect(() => {\r\n setServiceCodeOverrides(serviceCodes);\r\n }, [serviceCodes]);\r\n\r\n // 서비스코드 가져오기 함수\r\n const getServiceCode = (key: ServiceCodeKey): string => {\r\n // 1. Provider에서 설정된 값 우선 확인\r\n if (serviceCodes[key] && serviceCodes[key]!.trim() !== '') {\r\n console.log(`🔧 Provider 설정 사용: ${key} = ${serviceCodes[key]}`);\r\n return serviceCodes[key]!;\r\n }\r\n\r\n // 2. 기본값 사용\r\n const defaultValue = DEFAULT_SERVICE_CODES[key];\r\n console.log(`🔧 기본값 사용: ${key} = ${defaultValue}`);\r\n return defaultValue;\r\n };\r\n\r\n const contextValue: ServiceCodeContextType = {\r\n serviceCodes,\r\n getServiceCode,\r\n };\r\n\r\n return (\r\n <ServiceCodeContext.Provider value={contextValue}>\r\n {children}\r\n </ServiceCodeContext.Provider>\r\n );\r\n};\r\n\r\n/**\r\n * 서비스코드 Context를 사용하는 Hook\r\n * \r\n * @example\r\n * ```tsx\r\n * const { getServiceCode, serviceCodes } = useServiceCode();\r\n * const authBtnsCode = getServiceCode('AUTH_BTNS');\r\n * ```\r\n */\r\nexport const useServiceCode = (): ServiceCodeContextType => {\r\n const context = useContext(ServiceCodeContext);\r\n if (!context) {\r\n throw new Error('useServiceCode must be used within a ServiceCodeProvider');\r\n }\r\n return context;\r\n};\r\n\r\n/**\r\n * 특정 서비스코드를 가져오는 Hook\r\n * \r\n * @param key - 서비스코드 키\r\n * @returns 실제 서비스코드 값\r\n * \r\n * @example\r\n * ```tsx\r\n * const authBtnsCode = useServiceCodeValue('AUTH_BTNS');\r\n * const authMenuCode = useServiceCodeValue('AUTH_MENU');\r\n * ```\r\n */\r\nexport const useServiceCodeValue = (key: ServiceCodeKey): string => {\r\n const { getServiceCode } = useServiceCode();\r\n return getServiceCode(key);\r\n};\r\n\r\n/**\r\n * 모든 서비스코드를 가져오는 Hook\r\n * \r\n * @returns 모든 서비스코드 객체\r\n * \r\n * @example\r\n * ```tsx\r\n * const allServiceCodes = useAllServiceCodes();\r\n * console.log(allServiceCodes.AUTH_BTNS); // 'SCMSIGN00202' 또는 커스텀 값\r\n * ```\r\n */\r\nexport const useAllServiceCodes = (): Record<ServiceCodeKey, string> => {\r\n const { getServiceCode } = useServiceCode();\r\n const result = {} as Record<ServiceCodeKey, string>;\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n result[key] = getServiceCode(key);\r\n }\r\n \r\n return result;\r\n};\r\n\r\n/**\r\n * 서비스코드 설정을 로그로 출력하는 Hook\r\n * 개발 시 현재 설정된 서비스코드를 확인할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * useLogServiceCodeConfig();\r\n * // 콘솔에 현재 설정된 모든 서비스코드가 출력됩니다.\r\n * ```\r\n */\r\nexport const useLogServiceCodeConfig = (): void => {\r\n const { getServiceCode } = useServiceCode();\r\n \r\n console.log('🔧 bwg-core 서비스코드 설정:');\r\n console.log('📋 Provider 설정 > 기본값 순서로 확인');\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n const value = getServiceCode(key);\r\n console.log(` ${key}: ${value}`);\r\n }\r\n};\r\n\r\n// 타입 내보내기\r\nexport type { ServiceCodeKey };\r\n","import React, { createContext, useContext, useRef, ReactNode } from 'react';\r\nimport { SearchBoxRef } from '../../components/common/SearchBox';\r\n\r\n// SearchBox Context 타입\r\ninterface SearchBoxContextType {\r\n searchBoxRef: React.RefObject<SearchBoxRef> | null;\r\n getFormData: () => any;\r\n setFormData: (data: any) => void;\r\n resetForm: () => void;\r\n validateForm: () => Promise<any>;\r\n}\r\n\r\n// Context 생성\r\nconst SearchBoxContext = createContext<SearchBoxContextType | null>(null);\r\n\r\n// Provider Props\r\ninterface SearchBoxProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\n// Provider 컴포넌트\r\nexport const SearchBoxProvider: React.FC<SearchBoxProviderProps> = ({\r\n children,\r\n}) => {\r\n const searchBoxRef = useRef<SearchBoxRef>(null);\r\n\r\n const getFormData = () => {\r\n return searchBoxRef.current?.getFormData() || {};\r\n };\r\n\r\n const setFormData = (data: any) => {\r\n searchBoxRef.current?.setFormData(data);\r\n };\r\n\r\n const resetForm = () => {\r\n searchBoxRef.current?.resetForm();\r\n };\r\n\r\n const validateForm = async () => {\r\n return (\r\n (await searchBoxRef.current?.validateForm()) || {\r\n success: false,\r\n error: null,\r\n }\r\n );\r\n };\r\n\r\n const value: SearchBoxContextType = {\r\n searchBoxRef,\r\n getFormData,\r\n setFormData,\r\n resetForm,\r\n validateForm,\r\n };\r\n\r\n return (\r\n <SearchBoxContext.Provider value={value}>\r\n {children}\r\n </SearchBoxContext.Provider>\r\n );\r\n};\r\n\r\n// Hook\r\nexport const useSearchBox = () => {\r\n const context = useContext(SearchBoxContext);\r\n if (!context) {\r\n throw new Error('useSearchBox must be used within a SearchBoxProvider');\r\n }\r\n return context;\r\n};\r\n"],"names":["DEFAULT_SERVICE_CODES","ServiceCodeContext","createContext","ServiceCodeProvider","children","serviceCodes","useEffect","setServiceCodeOverrides","contextValue","key","defaultValue","useServiceCode","context","useContext","useServiceCodeValue","getServiceCode","useAllServiceCodes","result","useLogServiceCodeConfig","value","SearchBoxContext","SearchBoxProvider","searchBoxRef","useRef","data","jsx","useSearchBox"],"mappings":"mHAUMA,EAAwB,CAE5B,UAAW,eACX,UAAW,eACX,UAAW,eAGX,UAAW,eAGX,UAAW,cACb,EAGMC,EAAqBC,EAAAA,cAA6C,IAAI,EA0D/DC,EAA0D,CAAC,CACtE,SAAAC,EACA,aAAAC,EAAe,CAAA,CACjB,IAAM,CAEJC,EAAAA,UAAU,IAAM,CACdC,EAAAA,wBAAwBF,CAAY,CACtC,EAAG,CAACA,CAAY,CAAC,EAgBjB,MAAMG,EAAuC,CAC3C,aAAAH,EACA,eAfsBI,GAAgC,CAEtD,GAAIJ,EAAaI,CAAG,GAAKJ,EAAaI,CAAG,EAAG,KAAA,IAAW,GACrD,eAAQ,IAAI,sBAAsBA,CAAG,MAAMJ,EAAaI,CAAG,CAAC,EAAE,EACvDJ,EAAaI,CAAG,EAIzB,MAAMC,EAAeV,EAAsBS,CAAG,EAC9C,eAAQ,IAAI,cAAcA,CAAG,MAAMC,CAAY,EAAE,EAC1CA,CACT,CAIE,EAGF,+BACGT,EAAmB,SAAnB,CAA4B,MAAOO,EACjC,SAAAJ,EACH,CAEJ,EAWaO,EAAiB,IAA8B,CAC1D,MAAMC,EAAUC,EAAAA,WAAWZ,CAAkB,EAC7C,GAAI,CAACW,EACH,MAAM,IAAI,MAAM,0DAA0D,EAE5E,OAAOA,CACT,EAcaE,EAAuBL,GAAgC,CAClE,KAAM,CAAE,eAAAM,CAAA,EAAmBJ,EAAA,EAC3B,OAAOI,EAAeN,CAAG,CAC3B,EAaaO,EAAqB,IAAsC,CACtE,KAAM,CAAE,eAAAD,CAAA,EAAmBJ,EAAA,EACrBM,EAAS,CAAA,EAEf,UAAWR,KAAO,OAAO,KAAKT,CAAqB,EACjDiB,EAAOR,CAAG,EAAIM,EAAeN,CAAG,EAGlC,OAAOQ,CACT,EAYaC,EAA0B,IAAY,CACjD,KAAM,CAAE,eAAAH,CAAA,EAAmBJ,EAAA,EAE3B,QAAQ,IAAI,uBAAuB,EACnC,QAAQ,IAAI,6BAA6B,EAEzC,UAAWF,KAAO,OAAO,KAAKT,CAAqB,EAAuB,CACxE,MAAMmB,EAAQJ,EAAeN,CAAG,EAChC,QAAQ,IAAI,KAAKA,CAAG,KAAKU,CAAK,EAAE,CAClC,CACF,ECpLMC,EAAmBlB,EAAAA,cAA2C,IAAI,EAQ3DmB,EAAsD,CAAC,CAClE,SAAAjB,CACF,IAAM,CACJ,MAAMkB,EAAeC,EAAAA,OAAqB,IAAI,EAuBxCJ,EAA8B,CAClC,aAAAG,EACA,YAvBkB,IACXA,EAAa,SAAS,YAAA,GAAiB,CAAA,EAuB9C,YApBmBE,GAAc,CACjCF,EAAa,SAAS,YAAYE,CAAI,CACxC,EAmBE,UAjBgB,IAAM,CACtBF,EAAa,SAAS,UAAA,CACxB,EAgBE,aAdmB,SAEhB,MAAMA,EAAa,SAAS,gBAAmB,CAC9C,QAAS,GACT,MAAO,IAAA,CAUX,EAGF,OACEG,EAAAA,kBAAAA,IAACL,EAAiB,SAAjB,CAA0B,MAAAD,EACxB,SAAAf,CAAA,CACH,CAEJ,EAGasB,EAAe,IAAM,CAChC,MAAMd,EAAUC,EAAAA,WAAWO,CAAgB,EAC3C,GAAI,CAACR,EACH,MAAM,IAAI,MAAM,sDAAsD,EAExE,OAAOA,CACT"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { j as e } from "./jsx-runtime-Dpn_P65e.js";
|
|
2
|
+
import { u as d } from "./AuthContext-Ei2P-z4d.js";
|
|
3
|
+
import { S as b } from "./ScreenProtectContext-3my4PHFa.js";
|
|
4
|
+
import { Result as y, Button as w, Spin as v, ConfigProvider as j } from "antd";
|
|
5
|
+
import { Outlet as p } from "react-router-dom";
|
|
6
|
+
import { i as E } from "./envUtils-C9Gf5aek.js";
|
|
7
|
+
import C, { Component as D, useEffect as F, memo as k, Suspense as S } from "react";
|
|
8
|
+
import { ReloadOutlined as B } from "@ant-design/icons";
|
|
9
|
+
class P extends D {
|
|
10
|
+
constructor(t) {
|
|
11
|
+
super(t), this.resetError = () => {
|
|
12
|
+
this.setState({ hasError: !1, error: void 0, errorInfo: void 0 });
|
|
13
|
+
}, this.state = { hasError: !1 };
|
|
14
|
+
}
|
|
15
|
+
static getDerivedStateFromError(t) {
|
|
16
|
+
return { hasError: !0, error: t };
|
|
17
|
+
}
|
|
18
|
+
componentDidCatch(t, a) {
|
|
19
|
+
console.error("ErrorBound caught an error:", t, a), this.setState({
|
|
20
|
+
error: t,
|
|
21
|
+
errorInfo: a
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
render() {
|
|
25
|
+
return this.state.hasError ? this.props.fallback ? this.props.fallback : /* @__PURE__ */ e.jsxs(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
style: {
|
|
29
|
+
padding: "40px 20px",
|
|
30
|
+
textAlign: "center",
|
|
31
|
+
backgroundColor: "#fafafa",
|
|
32
|
+
display: "flex",
|
|
33
|
+
flexDirection: "column",
|
|
34
|
+
justifyContent: "center",
|
|
35
|
+
alignItems: "center"
|
|
36
|
+
},
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ e.jsx(
|
|
39
|
+
y,
|
|
40
|
+
{
|
|
41
|
+
status: "error",
|
|
42
|
+
title: "컴포넌트 로딩 중 오류가 발생했습니다",
|
|
43
|
+
subTitle: this.state.error ? `오류 내용: ${this.state.error.message}` : "알 수 없는 오류가 발생했습니다",
|
|
44
|
+
extra: [
|
|
45
|
+
/* @__PURE__ */ e.jsx(
|
|
46
|
+
w,
|
|
47
|
+
{
|
|
48
|
+
type: "primary",
|
|
49
|
+
icon: /* @__PURE__ */ e.jsx(B, {}),
|
|
50
|
+
onClick: this.resetError,
|
|
51
|
+
style: { marginRight: 8 },
|
|
52
|
+
children: "다시 시도"
|
|
53
|
+
},
|
|
54
|
+
"retry"
|
|
55
|
+
)
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
this.state.error && /* @__PURE__ */ e.jsxs(
|
|
60
|
+
"details",
|
|
61
|
+
{
|
|
62
|
+
style: {
|
|
63
|
+
marginTop: "20px",
|
|
64
|
+
textAlign: "left",
|
|
65
|
+
maxWidth: "600px",
|
|
66
|
+
backgroundColor: "#fff",
|
|
67
|
+
padding: "16px",
|
|
68
|
+
borderRadius: "6px",
|
|
69
|
+
border: "1px solid #d9d9d9"
|
|
70
|
+
},
|
|
71
|
+
children: [
|
|
72
|
+
/* @__PURE__ */ e.jsx("summary", { style: { cursor: "pointer", fontWeight: "bold" }, children: "오류 상세 정보" }),
|
|
73
|
+
/* @__PURE__ */ e.jsx(
|
|
74
|
+
"pre",
|
|
75
|
+
{
|
|
76
|
+
style: {
|
|
77
|
+
marginTop: "8px",
|
|
78
|
+
fontSize: "12px",
|
|
79
|
+
color: "#666",
|
|
80
|
+
whiteSpace: "pre-wrap",
|
|
81
|
+
wordBreak: "break-word"
|
|
82
|
+
},
|
|
83
|
+
children: this.state.error.stack
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
) : this.props.children;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const c = "bwg-dot-line-wave-v4";
|
|
95
|
+
function T() {
|
|
96
|
+
if (typeof document > "u" || document.getElementById(c)) return;
|
|
97
|
+
const r = document.createElement("style");
|
|
98
|
+
r.id = c, r.textContent = `
|
|
99
|
+
.bwg-dotline {
|
|
100
|
+
display: inline-flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
gap: var(--bwg-gap, 12px);
|
|
103
|
+
height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));
|
|
104
|
+
line-height: 0;
|
|
105
|
+
}
|
|
106
|
+
.bwg-dotline .dot {
|
|
107
|
+
width: var(--bwg-size, 12px);
|
|
108
|
+
height: var(--bwg-size, 12px);
|
|
109
|
+
border-radius: 50%;
|
|
110
|
+
background: currentColor;
|
|
111
|
+
will-change: transform, opacity;
|
|
112
|
+
filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));
|
|
113
|
+
animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */
|
|
117
|
+
@keyframes bwg-dotline-sine {
|
|
118
|
+
0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
119
|
+
12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
120
|
+
25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }
|
|
121
|
+
37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
122
|
+
50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
123
|
+
62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
124
|
+
75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }
|
|
125
|
+
87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
126
|
+
100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@media (prefers-reduced-motion: reduce) {
|
|
130
|
+
.bwg-dotline .dot { animation: none; }
|
|
131
|
+
}
|
|
132
|
+
`, document.head.appendChild(r);
|
|
133
|
+
}
|
|
134
|
+
const A = ({
|
|
135
|
+
colors: r = ["#DAD3FF", "#B3A6FF", "#9380FF", "#816BFA"],
|
|
136
|
+
count: t,
|
|
137
|
+
size: a = 12,
|
|
138
|
+
gap: s = 10,
|
|
139
|
+
amp: u = 16,
|
|
140
|
+
speedMs: i = 900,
|
|
141
|
+
direction: g = "ltr",
|
|
142
|
+
phase: h = 0.7
|
|
143
|
+
}) => {
|
|
144
|
+
F(() => {
|
|
145
|
+
T();
|
|
146
|
+
}, []);
|
|
147
|
+
const o = t ?? r.length, x = Array.from({ length: o }), f = {
|
|
148
|
+
"--bwg-size": `${a}px`,
|
|
149
|
+
"--bwg-gap": `${s}px`,
|
|
150
|
+
"--bwg-amp": `${u}px`,
|
|
151
|
+
"--bwg-speed": `${i}ms`
|
|
152
|
+
}, l = i / o * h;
|
|
153
|
+
return /* @__PURE__ */ e.jsx("span", { className: "bwg-dotline", role: "img", "aria-label": "loading", style: f, children: x.map(($, n) => /* @__PURE__ */ e.jsx(
|
|
154
|
+
"span",
|
|
155
|
+
{
|
|
156
|
+
className: "dot",
|
|
157
|
+
style: {
|
|
158
|
+
backgroundColor: r[n % r.length],
|
|
159
|
+
animationDelay: g === "ltr" ? `${n * l}ms` : `${(o - 1 - n) * l}ms`
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
n
|
|
163
|
+
)) });
|
|
164
|
+
}, m = ({ spin: r = null, text: t = "인증중..." }) => {
|
|
165
|
+
const { busy: a } = d();
|
|
166
|
+
return r ?? a ? /* @__PURE__ */ e.jsxs(
|
|
167
|
+
"div",
|
|
168
|
+
{
|
|
169
|
+
style: {
|
|
170
|
+
position: "fixed",
|
|
171
|
+
height: "100vh",
|
|
172
|
+
left: 0,
|
|
173
|
+
right: 0,
|
|
174
|
+
top: 0,
|
|
175
|
+
display: "flex",
|
|
176
|
+
flexDirection: "column",
|
|
177
|
+
justifyContent: "center",
|
|
178
|
+
alignItems: "center",
|
|
179
|
+
gap: 8,
|
|
180
|
+
padding: "8px 12px",
|
|
181
|
+
background: "rgba(0,0,0,0.6)",
|
|
182
|
+
color: "#fff",
|
|
183
|
+
zIndex: 1e4
|
|
184
|
+
},
|
|
185
|
+
"aria-live": "polite",
|
|
186
|
+
"aria-busy": "true",
|
|
187
|
+
role: "status",
|
|
188
|
+
children: [
|
|
189
|
+
/* @__PURE__ */ e.jsx(
|
|
190
|
+
v,
|
|
191
|
+
{
|
|
192
|
+
indicator: /* @__PURE__ */ e.jsx(
|
|
193
|
+
A,
|
|
194
|
+
{
|
|
195
|
+
colors: ["#DAD3FF", "#B3A6FF", "#9380FF", "#816BFA"],
|
|
196
|
+
size: 12,
|
|
197
|
+
gap: 10,
|
|
198
|
+
amp: 16,
|
|
199
|
+
speedMs: 900,
|
|
200
|
+
phase: 0.75,
|
|
201
|
+
direction: "ltr"
|
|
202
|
+
}
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
),
|
|
206
|
+
/* @__PURE__ */ e.jsx("span", { className: "bwg-spin-txt", style: { marginTop: "15px" }, children: t })
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
) : null;
|
|
210
|
+
}, U = () => {
|
|
211
|
+
const { reauthWithPin: r } = d();
|
|
212
|
+
return /* @__PURE__ */ e.jsx(b, { idleMs: 30 * 6e4, onUnlock: async (t) => E ? !0 : !!t && await r(t), children: /* @__PURE__ */ e.jsx(j, { getPopupContainer: () => document.getElementById("app-shell") || document.body, children: /* @__PURE__ */ e.jsxs("div", { id: "app-shell", children: [
|
|
213
|
+
/* @__PURE__ */ e.jsx(m, {}),
|
|
214
|
+
/* @__PURE__ */ e.jsx(p, {})
|
|
215
|
+
] }) }) });
|
|
216
|
+
}, V = () => /* @__PURE__ */ e.jsxs("div", { children: [
|
|
217
|
+
/* @__PURE__ */ e.jsx(m, {}),
|
|
218
|
+
/* @__PURE__ */ e.jsx(p, {})
|
|
219
|
+
] }), I = ({
|
|
220
|
+
tab: r,
|
|
221
|
+
isActive: t,
|
|
222
|
+
instance: a,
|
|
223
|
+
params: s
|
|
224
|
+
}) => /* @__PURE__ */ e.jsx(
|
|
225
|
+
"div",
|
|
226
|
+
{
|
|
227
|
+
style: {
|
|
228
|
+
position: "absolute",
|
|
229
|
+
top: 0,
|
|
230
|
+
left: 0,
|
|
231
|
+
width: "100%",
|
|
232
|
+
height: "100%",
|
|
233
|
+
visibility: t ? "visible" : "hidden",
|
|
234
|
+
opacity: t ? 1 : 0,
|
|
235
|
+
transition: "opacity 0.2s ease-in-out",
|
|
236
|
+
pointerEvents: t ? "auto" : "none"
|
|
237
|
+
},
|
|
238
|
+
children: /* @__PURE__ */ e.jsx(P, { children: /* @__PURE__ */ e.jsx(
|
|
239
|
+
S,
|
|
240
|
+
{
|
|
241
|
+
fallback: null,
|
|
242
|
+
children: a && C.createElement(a, { params: s })
|
|
243
|
+
}
|
|
244
|
+
) })
|
|
245
|
+
}
|
|
246
|
+
), Y = k(I);
|
|
247
|
+
export {
|
|
248
|
+
P as E,
|
|
249
|
+
m as P,
|
|
250
|
+
Y as T,
|
|
251
|
+
U as a,
|
|
252
|
+
V as b
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=TabContainer-B7-6AQXV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabContainer-B7-6AQXV.js","sources":["../../src/components/layout/ErrorBound.tsx","../../src/components/layout/ProgressOverlay.tsx","../../src/components/layout/ProtectLayout.tsx","../../src/components/layout/PublicLayout.tsx","../../src/components/layout/TabContainer.tsx"],"sourcesContent":["import React, { Component, ErrorInfo, ReactNode } from 'react';\r\nimport { Result, Button } from 'antd';\r\nimport { ReloadOutlined, HomeOutlined } from '@ant-design/icons';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n}\r\n\r\ninterface State {\r\n hasError: boolean;\r\n error?: Error;\r\n errorInfo?: ErrorInfo;\r\n}\r\n\r\n// 에러 페이지 컴포넌트\r\nexport const ErrorPage: React.FC<{\r\n error?: Error;\r\n resetError?: () => void;\r\n onGoHome?: () => void;\r\n}> = ({ error, resetError, onGoHome }) => {\r\n const navigate = useNavigate();\r\n\r\n const handleGoHome = () => {\r\n if (onGoHome) {\r\n onGoHome();\r\n } else {\r\n // 기본 홈 이동 로직\r\n navigate('/');\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n padding: '40px 20px',\r\n textAlign: 'center',\r\n backgroundColor: '#fafafa',\r\n minHeight: '400px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Result\r\n status=\"error\"\r\n title=\"컴포넌트 로딩 중 오류가 발생했습니다\"\r\n subTitle={\r\n error\r\n ? `오류 내용: ${error.message}`\r\n : '알 수 없는 오류가 발생했습니다'\r\n }\r\n extra={[\r\n <Button\r\n key=\"retry\"\r\n type=\"primary\"\r\n icon={<ReloadOutlined />}\r\n onClick={resetError}\r\n style={{ marginRight: 8 }}\r\n >\r\n 다시 시도\r\n </Button>,\r\n <Button key=\"home\" icon={<HomeOutlined />} onClick={handleGoHome}>\r\n 홈으로\r\n </Button>,\r\n ]}\r\n />\r\n {error && (\r\n <details\r\n style={{\r\n marginTop: '20px',\r\n textAlign: 'left',\r\n maxWidth: '600px',\r\n backgroundColor: '#fff',\r\n padding: '16px',\r\n borderRadius: '6px',\r\n border: '1px solid #d9d9d9',\r\n }}\r\n >\r\n <summary style={{ cursor: 'pointer', fontWeight: 'bold' }}>\r\n 오류 상세 정보\r\n </summary>\r\n <pre\r\n style={{\r\n marginTop: '8px',\r\n fontSize: '12px',\r\n color: '#666',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {error.stack}\r\n </pre>\r\n </details>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// 에러 경계 클래스 컴포넌트\r\nexport class ErrorBound extends Component<Props, State> {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): State {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n console.error('ErrorBound caught an error:', error, errorInfo);\r\n this.setState({\r\n error,\r\n errorInfo,\r\n });\r\n }\r\n\r\n resetError = () => {\r\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\r\n };\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n if (this.props.fallback) {\r\n return this.props.fallback;\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n padding: '40px 20px',\r\n textAlign: 'center',\r\n backgroundColor: '#fafafa',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Result\r\n status=\"error\"\r\n title=\"컴포넌트 로딩 중 오류가 발생했습니다\"\r\n subTitle={\r\n this.state.error\r\n ? `오류 내용: ${this.state.error.message}`\r\n : '알 수 없는 오류가 발생했습니다'\r\n }\r\n extra={[\r\n <Button\r\n key=\"retry\"\r\n type=\"primary\"\r\n icon={<ReloadOutlined />}\r\n onClick={this.resetError}\r\n style={{ marginRight: 8 }}\r\n >\r\n 다시 시도\r\n </Button>,\r\n ]}\r\n />\r\n {this.state.error && (\r\n <details\r\n style={{\r\n marginTop: '20px',\r\n textAlign: 'left',\r\n maxWidth: '600px',\r\n backgroundColor: '#fff',\r\n padding: '16px',\r\n borderRadius: '6px',\r\n border: '1px solid #d9d9d9',\r\n }}\r\n >\r\n <summary style={{ cursor: 'pointer', fontWeight: 'bold' }}>\r\n 오류 상세 정보\r\n </summary>\r\n <pre\r\n style={{\r\n marginTop: '8px',\r\n fontSize: '12px',\r\n color: '#666',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {this.state.error.stack}\r\n </pre>\r\n </details>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\n// 함수형 컴포넌트용 에러 경계 훅\r\nexport const useErrorHandler = () => {\r\n const [error, setError] = React.useState<Error | null>(null);\r\n\r\n const handleError = React.useCallback((error: Error) => {\r\n console.error('useErrorHandler caught an error:', error);\r\n setError(error);\r\n }, []);\r\n\r\n const resetError = React.useCallback(() => {\r\n setError(null);\r\n }, []);\r\n\r\n return { error, handleError, resetError };\r\n};\r\n","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { Spin } from \"antd\";\r\nimport React, { useEffect } from 'react';\r\n\r\nconst DOTLINE_STYLE_ID = 'bwg-dot-line-wave-v4';\r\nfunction ensureDotLineWaveStylesV4() {\r\n if (typeof document === 'undefined') return;\r\n if (document.getElementById(DOTLINE_STYLE_ID)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = DOTLINE_STYLE_ID;\r\n style.textContent = `\r\n .bwg-dotline {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--bwg-gap, 12px);\r\n height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));\r\n line-height: 0;\r\n }\r\n .bwg-dotline .dot {\r\n width: var(--bwg-size, 12px);\r\n height: var(--bwg-size, 12px);\r\n border-radius: 50%;\r\n background: currentColor;\r\n will-change: transform, opacity;\r\n filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));\r\n animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;\r\n }\r\n\r\n /* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */\r\n @keyframes bwg-dotline-sine {\r\n 0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }\r\n 37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }\r\n 87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .bwg-dotline .dot { animation: none; }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\n/* 직선 도트 파동 인디케이터 */\r\nconst DotLineSmoothIndicator: React.FC<{\r\n colors?: string[]; // 각 점 색\r\n count?: number; // 점 개수 (기본: colors 길이)\r\n size?: number; // 점 지름\r\n gap?: number; // 점 간격\r\n amp?: number; // 진폭(px)\r\n speedMs?: number; // 한 주기(ms)\r\n direction?: 'ltr' | 'rtl'; // 파동 진행 방향\r\n phase?: number; // 점 간 지연 비율(0~1) — 낮출수록 부드러움\r\n}> = ({\r\n colors = ['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA'],\r\n count,\r\n size = 12,\r\n gap = 10,\r\n amp = 16,\r\n speedMs = 900,\r\n direction = 'ltr',\r\n phase = 0.7,\r\n}) => {\r\n useEffect(() => { ensureDotLineWaveStylesV4(); }, []);\r\n\r\n const n = count ?? colors.length;\r\n const dots = Array.from({ length: n });\r\n const baseStyle = {\r\n ['--bwg-size' as any]: `${size}px`,\r\n ['--bwg-gap' as any]: `${gap}px`,\r\n ['--bwg-amp' as any]: `${amp}px`,\r\n ['--bwg-speed' as any]: `${speedMs}ms`,\r\n } as React.CSSProperties;\r\n\r\n const perDotDelay = (speedMs / n) * phase;\r\n\r\n return (\r\n <span className=\"bwg-dotline\" role=\"img\" aria-label=\"loading\" style={baseStyle}>\r\n {dots.map((_, i) => (\r\n <span\r\n key={i}\r\n className=\"dot\"\r\n style={{\r\n backgroundColor: colors[i % colors.length],\r\n animationDelay:\r\n direction === 'ltr'\r\n ? `${(i * perDotDelay)}ms`\r\n : `${((n - 1 - i) * perDotDelay)}ms`,\r\n }}\r\n />\r\n ))}\r\n </span>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * 진행 중 표시\r\n * @returns ProgressOverlay\r\n */\r\nconst ProgressOverlay: React.FC<{spin?: boolean | null; text?: string }> = ({spin = null, text = '인증중...',}) => {\r\n const { busy } = useAuth();\r\n const show = (spin ?? busy);\r\n if (!show) return null;\r\n return (\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n height: \"100vh\",\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n display: \"flex\",\r\n flexDirection:'column',\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n padding: \"8px 12px\",\r\n background: \"rgba(0,0,0,0.6)\",\r\n color: \"#fff\",\r\n zIndex: 10000,\r\n }}\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"status\"\r\n >\r\n <Spin\r\n indicator={\r\n <DotLineSmoothIndicator\r\n colors={['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA']}\r\n size={12}\r\n gap={10}\r\n amp={16}\r\n speedMs={900}\r\n phase={0.75} \r\n direction=\"ltr\"\r\n />\r\n }\r\n />\r\n <span className=\"bwg-spin-txt\" style={{marginTop:\"15px\"}}>{text}</span>\r\n </div>\r\n );\r\n };\r\n\r\nexport default ProgressOverlay;","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { ScreenProtectProvider } from \"@/provider/contexts/ScreenProtectContext\";\r\nimport { isLocal } from \"@/utils\";\r\nimport { ConfigProvider } from \"antd\";\r\nimport { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 보호 레이아웃\r\n * @returns ProtectedLayout\r\n */\r\nconst ProtectedLayout = () => {\r\n const { reauthWithPin } = useAuth();\r\n // NOTE: 인증 여부 체크는 각 페이지(/main)의 스토어 가드에 위임합니다.\r\n // 필요하다면 여기서도 RequireAuth로 감싸세요.\r\n return (\r\n <ScreenProtectProvider idleMs={30 * 60_000} onUnlock={async (pin) => {\r\n if(isLocal) {\r\n // 로컬에서는 항상 true\r\n return true;\r\n }\r\n return !!pin && (await reauthWithPin(pin));\r\n }}>\r\n {/* Ensure AntD portals mount inside protected shell if you need it */}\r\n <ConfigProvider getPopupContainer={() => document.getElementById(\"app-shell\") || document.body}>\r\n <div id=\"app-shell\">\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n </ConfigProvider>\r\n </ScreenProtectProvider>\r\n );\r\n }\r\n\r\n export default ProtectedLayout;","import { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 공개 레이아웃\r\n * @returns PublicLayout\r\n */\r\nconst PublicLayout = () => {\r\n return (\r\n <div>\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n );\r\n}\r\n\r\nexport default PublicLayout;","import React, { memo, Suspense } from \"react\";\r\nimport { ErrorBound } from \"./ErrorBound\";\r\n\r\nconst TabContainer = ({\r\n tab,\r\n isActive,\r\n instance,\r\n params,\r\n }: {\r\n tab: any;\r\n isActive: boolean;\r\n instance?: React.ComponentType;\r\n params?: Record<string, any>;\r\n }) => {\r\n return <div\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n visibility: isActive ? 'visible' : 'hidden',\r\n opacity: isActive ? 1 : 0,\r\n transition: 'opacity 0.2s ease-in-out',\r\n pointerEvents: isActive ? 'auto' : 'none',\r\n }}\r\n>\r\n <ErrorBound>\r\n <Suspense \r\n fallback={null}\r\n >\r\n {instance && React.createElement(instance, { params } as any)}\r\n </Suspense>\r\n </ErrorBound>\r\n</div>;\r\n};\r\n\r\nexport default memo(TabContainer);"],"names":["ErrorBound","Component","props","error","errorInfo","jsxs","jsx","Result","Button","ReloadOutlined","DOTLINE_STYLE_ID","ensureDotLineWaveStylesV4","style","DotLineSmoothIndicator","colors","count","size","gap","amp","speedMs","direction","phase","useEffect","n","dots","baseStyle","perDotDelay","_","i","ProgressOverlay","spin","text","busy","useAuth","Spin","ProtectedLayout","reauthWithPin","ScreenProtectProvider","pin","isLocal","ConfigProvider","Outlet","PublicLayout","TabContainer","tab","isActive","instance","params","Suspense","React","TabContainer$1","memo"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";const t=require("./jsx-runtime-CeSfJrVB.cjs"),u=require("./AuthContext-CXng9fj0.cjs"),E=require("./ScreenProtectContext-CVuXrJm6.cjs"),i=require("antd"),m=require("react-router-dom"),w=require("./envUtils-CduTHoHu.cjs"),n=require("react"),v=require("@ant-design/icons");class g extends n.Component{constructor(e){super(e),this.resetError=()=>{this.setState({hasError:!1,error:void 0,errorInfo:void 0})},this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,s){console.error("ErrorBound caught an error:",e,s),this.setState({error:e,errorInfo:s})}render(){return this.state.hasError?this.props.fallback?this.props.fallback:t.jsxRuntimeExports.jsxs("div",{style:{padding:"40px 20px",textAlign:"center",backgroundColor:"#fafafa",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"},children:[t.jsxRuntimeExports.jsx(i.Result,{status:"error",title:"컴포넌트 로딩 중 오류가 발생했습니다",subTitle:this.state.error?`오류 내용: ${this.state.error.message}`:"알 수 없는 오류가 발생했습니다",extra:[t.jsxRuntimeExports.jsx(i.Button,{type:"primary",icon:t.jsxRuntimeExports.jsx(v.ReloadOutlined,{}),onClick:this.resetError,style:{marginRight:8},children:"다시 시도"},"retry")]}),this.state.error&&t.jsxRuntimeExports.jsxs("details",{style:{marginTop:"20px",textAlign:"left",maxWidth:"600px",backgroundColor:"#fff",padding:"16px",borderRadius:"6px",border:"1px solid #d9d9d9"},children:[t.jsxRuntimeExports.jsx("summary",{style:{cursor:"pointer",fontWeight:"bold"},children:"오류 상세 정보"}),t.jsxRuntimeExports.jsx("pre",{style:{marginTop:"8px",fontSize:"12px",color:"#666",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:this.state.error.stack})]})]}):this.props.children}}const x="bwg-dot-line-wave-v4";function R(){if(typeof document>"u"||document.getElementById(x))return;const r=document.createElement("style");r.id=x,r.textContent=`
|
|
2
|
+
.bwg-dotline {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: var(--bwg-gap, 12px);
|
|
6
|
+
height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));
|
|
7
|
+
line-height: 0;
|
|
8
|
+
}
|
|
9
|
+
.bwg-dotline .dot {
|
|
10
|
+
width: var(--bwg-size, 12px);
|
|
11
|
+
height: var(--bwg-size, 12px);
|
|
12
|
+
border-radius: 50%;
|
|
13
|
+
background: currentColor;
|
|
14
|
+
will-change: transform, opacity;
|
|
15
|
+
filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));
|
|
16
|
+
animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */
|
|
20
|
+
@keyframes bwg-dotline-sine {
|
|
21
|
+
0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
22
|
+
12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
23
|
+
25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }
|
|
24
|
+
37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
25
|
+
50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
26
|
+
62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
27
|
+
75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }
|
|
28
|
+
87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
29
|
+
100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@media (prefers-reduced-motion: reduce) {
|
|
33
|
+
.bwg-dotline .dot { animation: none; }
|
|
34
|
+
}
|
|
35
|
+
`,document.head.appendChild(r)}const C=({colors:r=["#DAD3FF","#B3A6FF","#9380FF","#816BFA"],count:e,size:s=12,gap:o=10,amp:h=16,speedMs:p=900,direction:b="ltr",phase:f=.7})=>{n.useEffect(()=>{R()},[]);const l=e??r.length,y=Array.from({length:l}),j={"--bwg-size":`${s}px`,"--bwg-gap":`${o}px`,"--bwg-amp":`${h}px`,"--bwg-speed":`${p}ms`},d=p/l*f;return t.jsxRuntimeExports.jsx("span",{className:"bwg-dotline",role:"img","aria-label":"loading",style:j,children:y.map((P,a)=>t.jsxRuntimeExports.jsx("span",{className:"dot",style:{backgroundColor:r[a%r.length],animationDelay:b==="ltr"?`${a*d}ms`:`${(l-1-a)*d}ms`}},a))})},c=({spin:r=null,text:e="인증중..."})=>{const{busy:s}=u.useAuth();return r??s?t.jsxRuntimeExports.jsxs("div",{style:{position:"fixed",height:"100vh",left:0,right:0,top:0,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",gap:8,padding:"8px 12px",background:"rgba(0,0,0,0.6)",color:"#fff",zIndex:1e4},"aria-live":"polite","aria-busy":"true",role:"status",children:[t.jsxRuntimeExports.jsx(i.Spin,{indicator:t.jsxRuntimeExports.jsx(C,{colors:["#DAD3FF","#B3A6FF","#9380FF","#816BFA"],size:12,gap:10,amp:16,speedMs:900,phase:.75,direction:"ltr"})}),t.jsxRuntimeExports.jsx("span",{className:"bwg-spin-txt",style:{marginTop:"15px"},children:e})]}):null},D=()=>{const{reauthWithPin:r}=u.useAuth();return t.jsxRuntimeExports.jsx(E.ScreenProtectProvider,{idleMs:30*6e4,onUnlock:async e=>w.isLocal?!0:!!e&&await r(e),children:t.jsxRuntimeExports.jsx(i.ConfigProvider,{getPopupContainer:()=>document.getElementById("app-shell")||document.body,children:t.jsxRuntimeExports.jsxs("div",{id:"app-shell",children:[t.jsxRuntimeExports.jsx(c,{}),t.jsxRuntimeExports.jsx(m.Outlet,{})]})})})},F=()=>t.jsxRuntimeExports.jsxs("div",{children:[t.jsxRuntimeExports.jsx(c,{}),t.jsxRuntimeExports.jsx(m.Outlet,{})]}),k=({tab:r,isActive:e,instance:s,params:o})=>t.jsxRuntimeExports.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",visibility:e?"visible":"hidden",opacity:e?1:0,transition:"opacity 0.2s ease-in-out",pointerEvents:e?"auto":"none"},children:t.jsxRuntimeExports.jsx(g,{children:t.jsxRuntimeExports.jsx(n.Suspense,{fallback:null,children:s&&n.createElement(s,{params:o})})})}),S=n.memo(k);exports.ErrorBound=g;exports.ProgressOverlay=c;exports.ProtectedLayout=D;exports.PublicLayout=F;exports.TabContainer=S;
|
|
36
|
+
//# sourceMappingURL=TabContainer-Dx2PVShz.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabContainer-Dx2PVShz.cjs","sources":["../../src/components/layout/ErrorBound.tsx","../../src/components/layout/ProgressOverlay.tsx","../../src/components/layout/ProtectLayout.tsx","../../src/components/layout/PublicLayout.tsx","../../src/components/layout/TabContainer.tsx"],"sourcesContent":["import React, { Component, ErrorInfo, ReactNode } from 'react';\r\nimport { Result, Button } from 'antd';\r\nimport { ReloadOutlined, HomeOutlined } from '@ant-design/icons';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n}\r\n\r\ninterface State {\r\n hasError: boolean;\r\n error?: Error;\r\n errorInfo?: ErrorInfo;\r\n}\r\n\r\n// 에러 페이지 컴포넌트\r\nexport const ErrorPage: React.FC<{\r\n error?: Error;\r\n resetError?: () => void;\r\n onGoHome?: () => void;\r\n}> = ({ error, resetError, onGoHome }) => {\r\n const navigate = useNavigate();\r\n\r\n const handleGoHome = () => {\r\n if (onGoHome) {\r\n onGoHome();\r\n } else {\r\n // 기본 홈 이동 로직\r\n navigate('/');\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n padding: '40px 20px',\r\n textAlign: 'center',\r\n backgroundColor: '#fafafa',\r\n minHeight: '400px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Result\r\n status=\"error\"\r\n title=\"컴포넌트 로딩 중 오류가 발생했습니다\"\r\n subTitle={\r\n error\r\n ? `오류 내용: ${error.message}`\r\n : '알 수 없는 오류가 발생했습니다'\r\n }\r\n extra={[\r\n <Button\r\n key=\"retry\"\r\n type=\"primary\"\r\n icon={<ReloadOutlined />}\r\n onClick={resetError}\r\n style={{ marginRight: 8 }}\r\n >\r\n 다시 시도\r\n </Button>,\r\n <Button key=\"home\" icon={<HomeOutlined />} onClick={handleGoHome}>\r\n 홈으로\r\n </Button>,\r\n ]}\r\n />\r\n {error && (\r\n <details\r\n style={{\r\n marginTop: '20px',\r\n textAlign: 'left',\r\n maxWidth: '600px',\r\n backgroundColor: '#fff',\r\n padding: '16px',\r\n borderRadius: '6px',\r\n border: '1px solid #d9d9d9',\r\n }}\r\n >\r\n <summary style={{ cursor: 'pointer', fontWeight: 'bold' }}>\r\n 오류 상세 정보\r\n </summary>\r\n <pre\r\n style={{\r\n marginTop: '8px',\r\n fontSize: '12px',\r\n color: '#666',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {error.stack}\r\n </pre>\r\n </details>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// 에러 경계 클래스 컴포넌트\r\nexport class ErrorBound extends Component<Props, State> {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): State {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n console.error('ErrorBound caught an error:', error, errorInfo);\r\n this.setState({\r\n error,\r\n errorInfo,\r\n });\r\n }\r\n\r\n resetError = () => {\r\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\r\n };\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n if (this.props.fallback) {\r\n return this.props.fallback;\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n padding: '40px 20px',\r\n textAlign: 'center',\r\n backgroundColor: '#fafafa',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Result\r\n status=\"error\"\r\n title=\"컴포넌트 로딩 중 오류가 발생했습니다\"\r\n subTitle={\r\n this.state.error\r\n ? `오류 내용: ${this.state.error.message}`\r\n : '알 수 없는 오류가 발생했습니다'\r\n }\r\n extra={[\r\n <Button\r\n key=\"retry\"\r\n type=\"primary\"\r\n icon={<ReloadOutlined />}\r\n onClick={this.resetError}\r\n style={{ marginRight: 8 }}\r\n >\r\n 다시 시도\r\n </Button>,\r\n ]}\r\n />\r\n {this.state.error && (\r\n <details\r\n style={{\r\n marginTop: '20px',\r\n textAlign: 'left',\r\n maxWidth: '600px',\r\n backgroundColor: '#fff',\r\n padding: '16px',\r\n borderRadius: '6px',\r\n border: '1px solid #d9d9d9',\r\n }}\r\n >\r\n <summary style={{ cursor: 'pointer', fontWeight: 'bold' }}>\r\n 오류 상세 정보\r\n </summary>\r\n <pre\r\n style={{\r\n marginTop: '8px',\r\n fontSize: '12px',\r\n color: '#666',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {this.state.error.stack}\r\n </pre>\r\n </details>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\n// 함수형 컴포넌트용 에러 경계 훅\r\nexport const useErrorHandler = () => {\r\n const [error, setError] = React.useState<Error | null>(null);\r\n\r\n const handleError = React.useCallback((error: Error) => {\r\n console.error('useErrorHandler caught an error:', error);\r\n setError(error);\r\n }, []);\r\n\r\n const resetError = React.useCallback(() => {\r\n setError(null);\r\n }, []);\r\n\r\n return { error, handleError, resetError };\r\n};\r\n","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { Spin } from \"antd\";\r\nimport React, { useEffect } from 'react';\r\n\r\nconst DOTLINE_STYLE_ID = 'bwg-dot-line-wave-v4';\r\nfunction ensureDotLineWaveStylesV4() {\r\n if (typeof document === 'undefined') return;\r\n if (document.getElementById(DOTLINE_STYLE_ID)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = DOTLINE_STYLE_ID;\r\n style.textContent = `\r\n .bwg-dotline {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--bwg-gap, 12px);\r\n height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));\r\n line-height: 0;\r\n }\r\n .bwg-dotline .dot {\r\n width: var(--bwg-size, 12px);\r\n height: var(--bwg-size, 12px);\r\n border-radius: 50%;\r\n background: currentColor;\r\n will-change: transform, opacity;\r\n filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));\r\n animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;\r\n }\r\n\r\n /* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */\r\n @keyframes bwg-dotline-sine {\r\n 0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }\r\n 37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }\r\n 87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .bwg-dotline .dot { animation: none; }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\n/* 직선 도트 파동 인디케이터 */\r\nconst DotLineSmoothIndicator: React.FC<{\r\n colors?: string[]; // 각 점 색\r\n count?: number; // 점 개수 (기본: colors 길이)\r\n size?: number; // 점 지름\r\n gap?: number; // 점 간격\r\n amp?: number; // 진폭(px)\r\n speedMs?: number; // 한 주기(ms)\r\n direction?: 'ltr' | 'rtl'; // 파동 진행 방향\r\n phase?: number; // 점 간 지연 비율(0~1) — 낮출수록 부드러움\r\n}> = ({\r\n colors = ['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA'],\r\n count,\r\n size = 12,\r\n gap = 10,\r\n amp = 16,\r\n speedMs = 900,\r\n direction = 'ltr',\r\n phase = 0.7,\r\n}) => {\r\n useEffect(() => { ensureDotLineWaveStylesV4(); }, []);\r\n\r\n const n = count ?? colors.length;\r\n const dots = Array.from({ length: n });\r\n const baseStyle = {\r\n ['--bwg-size' as any]: `${size}px`,\r\n ['--bwg-gap' as any]: `${gap}px`,\r\n ['--bwg-amp' as any]: `${amp}px`,\r\n ['--bwg-speed' as any]: `${speedMs}ms`,\r\n } as React.CSSProperties;\r\n\r\n const perDotDelay = (speedMs / n) * phase;\r\n\r\n return (\r\n <span className=\"bwg-dotline\" role=\"img\" aria-label=\"loading\" style={baseStyle}>\r\n {dots.map((_, i) => (\r\n <span\r\n key={i}\r\n className=\"dot\"\r\n style={{\r\n backgroundColor: colors[i % colors.length],\r\n animationDelay:\r\n direction === 'ltr'\r\n ? `${(i * perDotDelay)}ms`\r\n : `${((n - 1 - i) * perDotDelay)}ms`,\r\n }}\r\n />\r\n ))}\r\n </span>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * 진행 중 표시\r\n * @returns ProgressOverlay\r\n */\r\nconst ProgressOverlay: React.FC<{spin?: boolean | null; text?: string }> = ({spin = null, text = '인증중...',}) => {\r\n const { busy } = useAuth();\r\n const show = (spin ?? busy);\r\n if (!show) return null;\r\n return (\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n height: \"100vh\",\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n display: \"flex\",\r\n flexDirection:'column',\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n padding: \"8px 12px\",\r\n background: \"rgba(0,0,0,0.6)\",\r\n color: \"#fff\",\r\n zIndex: 10000,\r\n }}\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"status\"\r\n >\r\n <Spin\r\n indicator={\r\n <DotLineSmoothIndicator\r\n colors={['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA']}\r\n size={12}\r\n gap={10}\r\n amp={16}\r\n speedMs={900}\r\n phase={0.75} \r\n direction=\"ltr\"\r\n />\r\n }\r\n />\r\n <span className=\"bwg-spin-txt\" style={{marginTop:\"15px\"}}>{text}</span>\r\n </div>\r\n );\r\n };\r\n\r\nexport default ProgressOverlay;","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { ScreenProtectProvider } from \"@/provider/contexts/ScreenProtectContext\";\r\nimport { isLocal } from \"@/utils\";\r\nimport { ConfigProvider } from \"antd\";\r\nimport { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 보호 레이아웃\r\n * @returns ProtectedLayout\r\n */\r\nconst ProtectedLayout = () => {\r\n const { reauthWithPin } = useAuth();\r\n // NOTE: 인증 여부 체크는 각 페이지(/main)의 스토어 가드에 위임합니다.\r\n // 필요하다면 여기서도 RequireAuth로 감싸세요.\r\n return (\r\n <ScreenProtectProvider idleMs={30 * 60_000} onUnlock={async (pin) => {\r\n if(isLocal) {\r\n // 로컬에서는 항상 true\r\n return true;\r\n }\r\n return !!pin && (await reauthWithPin(pin));\r\n }}>\r\n {/* Ensure AntD portals mount inside protected shell if you need it */}\r\n <ConfigProvider getPopupContainer={() => document.getElementById(\"app-shell\") || document.body}>\r\n <div id=\"app-shell\">\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n </ConfigProvider>\r\n </ScreenProtectProvider>\r\n );\r\n }\r\n\r\n export default ProtectedLayout;","import { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 공개 레이아웃\r\n * @returns PublicLayout\r\n */\r\nconst PublicLayout = () => {\r\n return (\r\n <div>\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n );\r\n}\r\n\r\nexport default PublicLayout;","import React, { memo, Suspense } from \"react\";\r\nimport { ErrorBound } from \"./ErrorBound\";\r\n\r\nconst TabContainer = ({\r\n tab,\r\n isActive,\r\n instance,\r\n params,\r\n }: {\r\n tab: any;\r\n isActive: boolean;\r\n instance?: React.ComponentType;\r\n params?: Record<string, any>;\r\n }) => {\r\n return <div\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n visibility: isActive ? 'visible' : 'hidden',\r\n opacity: isActive ? 1 : 0,\r\n transition: 'opacity 0.2s ease-in-out',\r\n pointerEvents: isActive ? 'auto' : 'none',\r\n }}\r\n>\r\n <ErrorBound>\r\n <Suspense \r\n fallback={null}\r\n >\r\n {instance && React.createElement(instance, { params } as any)}\r\n </Suspense>\r\n </ErrorBound>\r\n</div>;\r\n};\r\n\r\nexport default memo(TabContainer);"],"names":["ErrorBound","Component","props","error","errorInfo","jsxs","jsx","Result","Button","ReloadOutlined","DOTLINE_STYLE_ID","ensureDotLineWaveStylesV4","style","DotLineSmoothIndicator","colors","count","size","gap","amp","speedMs","direction","phase","useEffect","n","dots","baseStyle","perDotDelay","_","i","ProgressOverlay","spin","text","busy","useAuth","Spin","ProtectedLayout","reauthWithPin","ScreenProtectProvider","pin","isLocal","ConfigProvider","Outlet","PublicLayout","TabContainer","tab","isActive","instance","params","Suspense","React","TabContainer$1","memo"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var o=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function l(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}exports.commonjsGlobal=o;exports.getDefaultExportFromCjs=l;
|
|
2
|
+
//# sourceMappingURL=_commonjsHelpers-DKOUU3wS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_commonjsHelpers-DKOUU3wS.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var o = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
|
|
2
|
+
function l(e) {
|
|
3
|
+
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
|
4
|
+
}
|
|
5
|
+
export {
|
|
6
|
+
o as c,
|
|
7
|
+
l as g
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=_commonjsHelpers-DaMA6jEr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_commonjsHelpers-DaMA6jEr.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|