@bwg-ui/core 1.1.25 → 1.1.26
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/AuthContext-BQ3gHLbr.cjs +2 -0
- package/dist/chunks/{AuthContext-CXng9fj0.cjs.map → AuthContext-BQ3gHLbr.cjs.map} +1 -1
- package/dist/chunks/{AuthContext-DrEpBrpB.js → AuthContext-CVizgYxY.js} +9 -9
- package/dist/chunks/{AuthContext-DrEpBrpB.js.map → AuthContext-CVizgYxY.js.map} +1 -1
- package/dist/chunks/{BwgSpace-CnLM4qcg.js → BwgSpace-BPJARdOc.js} +4 -4
- package/dist/chunks/{BwgSpace-CnLM4qcg.js.map → BwgSpace-BPJARdOc.js.map} +1 -1
- package/dist/chunks/BwgSpace-Cw27d-XU.cjs +2 -0
- package/dist/chunks/{BwgSpace-b0hmM1Ht.cjs.map → BwgSpace-Cw27d-XU.cjs.map} +1 -1
- package/dist/chunks/BwgSwitch-BLtVdW44.cjs +2 -0
- package/dist/chunks/BwgSwitch-BLtVdW44.cjs.map +1 -0
- package/dist/chunks/{BwgSwitch-D_scwi9_.js → BwgSwitch-DdHo4gYR.js} +57 -57
- package/dist/chunks/BwgSwitch-DdHo4gYR.js.map +1 -0
- package/dist/chunks/{BwgUploader-DBFF9BPF.js → BwgUploader-BUmFmeuS.js} +801 -801
- package/dist/chunks/{BwgUploader-DBFF9BPF.js.map → BwgUploader-BUmFmeuS.js.map} +1 -1
- package/dist/chunks/BwgUploader-Djhl4lIt.cjs +3 -0
- package/dist/chunks/{BwgUploader-CkXwkcUL.cjs.map → BwgUploader-Djhl4lIt.cjs.map} +1 -1
- package/dist/chunks/LoadingOverlay-Uf6xy04v.js +19 -0
- package/dist/chunks/{LoadingOverlay-DAZJF5wg.js.map → LoadingOverlay-Uf6xy04v.js.map} +1 -1
- package/dist/chunks/LoadingOverlay-jdMzdB-z.cjs +2 -0
- package/dist/chunks/{LoadingOverlay-DcmKvoZA.cjs.map → LoadingOverlay-jdMzdB-z.cjs.map} +1 -1
- package/dist/chunks/{SSOHandler-CxvxEBaH.js → SSOHandler-CR0nR3rJ.js} +8252 -8252
- package/dist/chunks/{SSOHandler-CxvxEBaH.js.map → SSOHandler-CR0nR3rJ.js.map} +1 -1
- package/dist/chunks/{SSOHandler-BY6LXMLc.cjs → SSOHandler-DQG0Jp4V.cjs} +53 -53
- package/dist/chunks/{SSOHandler-BY6LXMLc.cjs.map → SSOHandler-DQG0Jp4V.cjs.map} +1 -1
- package/dist/chunks/ScreenProtectContext-BMsPPcTX.js +154 -0
- package/dist/chunks/{ScreenProtectContext-3my4PHFa.js.map → ScreenProtectContext-BMsPPcTX.js.map} +1 -1
- package/dist/chunks/ScreenProtectContext-DrCGlcTs.cjs +2 -0
- package/dist/chunks/{ScreenProtectContext-CVuXrJm6.cjs.map → ScreenProtectContext-DrCGlcTs.cjs.map} +1 -1
- package/dist/chunks/SearchBoxContext-DY6lES-W.cjs +2 -0
- package/dist/chunks/{SearchBoxContext-DwFDOyYG.cjs.map → SearchBoxContext-DY6lES-W.cjs.map} +1 -1
- package/dist/chunks/{SearchBoxContext-gWM7FHIw.js → SearchBoxContext-Dtzo_rJd.js} +24 -24
- package/dist/chunks/{SearchBoxContext-gWM7FHIw.js.map → SearchBoxContext-Dtzo_rJd.js.map} +1 -1
- package/dist/chunks/ViewContainer-BfiTFvLP.cjs +36 -0
- package/dist/chunks/{ViewContainer-Bhq22_B3.cjs.map → ViewContainer-BfiTFvLP.cjs.map} +1 -1
- package/dist/chunks/{ViewContainer-D9SKBnrn.js → ViewContainer-CTl3_56W.js} +115 -115
- package/dist/chunks/{ViewContainer-D9SKBnrn.js.map → ViewContainer-CTl3_56W.js.map} +1 -1
- package/dist/chunks/apiUtils-D9Vn1gwZ.cjs +3 -0
- package/dist/chunks/{apiUtils-BZ6s0_NI.cjs.map → apiUtils-D9Vn1gwZ.cjs.map} +1 -1
- package/dist/chunks/{apiUtils-DSwE62oG.js → apiUtils-DPUgfmKk.js} +46 -46
- package/dist/chunks/{apiUtils-DSwE62oG.js.map → apiUtils-DPUgfmKk.js.map} +1 -1
- package/dist/chunks/{codeStore-vPj4Y0TK.js → codeStore-BrCfe9K3.js} +2 -2
- package/dist/chunks/{codeStore-vPj4Y0TK.js.map → codeStore-BrCfe9K3.js.map} +1 -1
- package/dist/chunks/{codeStore-il4-kZPe.cjs → codeStore-_b2fDZtD.cjs} +2 -2
- package/dist/chunks/{codeStore-il4-kZPe.cjs.map → codeStore-_b2fDZtD.cjs.map} +1 -1
- package/dist/chunks/{core-Dl0PdDdT.js → core-BBMCFpHx.js} +2 -2
- package/dist/chunks/{core-Dl0PdDdT.js.map → core-BBMCFpHx.js.map} +1 -1
- package/dist/chunks/{core-BHejg5iS.cjs → core-CM9MsJRf.cjs} +2 -2
- package/dist/chunks/{core-BHejg5iS.cjs.map → core-CM9MsJRf.cjs.map} +1 -1
- package/dist/chunks/{enc-base64-D7t4BoUA.js → enc-base64-DAsYWbA2.js} +3 -3
- package/dist/chunks/{enc-base64-D7t4BoUA.js.map → enc-base64-DAsYWbA2.js.map} +1 -1
- package/dist/chunks/{enc-base64-BkBtNBQV.cjs → enc-base64-DbK5VBfD.cjs} +2 -2
- package/dist/chunks/{enc-base64-BkBtNBQV.cjs.map → enc-base64-DbK5VBfD.cjs.map} +1 -1
- package/dist/chunks/{favoriteStore-CcKg_nEH.cjs → favoriteStore-BnQ2u-sa.cjs} +2 -2
- package/dist/chunks/{favoriteStore-CcKg_nEH.cjs.map → favoriteStore-BnQ2u-sa.cjs.map} +1 -1
- package/dist/chunks/{favoriteStore-Bh1FuZm9.js → favoriteStore-SyAjqLG8.js} +2 -2
- package/dist/chunks/{favoriteStore-Bh1FuZm9.js.map → favoriteStore-SyAjqLG8.js.map} +1 -1
- package/dist/chunks/{popupStore-BRRmB4zH.js → popupStore-BrKcPw7K.js} +2 -2
- package/dist/chunks/{popupStore-BRRmB4zH.js.map → popupStore-BrKcPw7K.js.map} +1 -1
- package/dist/chunks/{popupStore-DUApUBF2.cjs → popupStore-ChbYTqy1.cjs} +2 -2
- package/dist/chunks/{popupStore-DUApUBF2.cjs.map → popupStore-ChbYTqy1.cjs.map} +1 -1
- package/dist/chunks/{sha256-DiIRoCQ8.cjs → sha256-BnWVPP1K.cjs} +2 -2
- package/dist/chunks/{sha256-DiIRoCQ8.cjs.map → sha256-BnWVPP1K.cjs.map} +1 -1
- package/dist/chunks/{sha256-C2-s1oZe.js → sha256-D80RpYO2.js} +3 -3
- package/dist/chunks/{sha256-C2-s1oZe.js.map → sha256-D80RpYO2.js.map} +1 -1
- package/dist/chunks/{usePopup-DarKTbRC.js → usePopup-DnfKRiYs.js} +27 -27
- package/dist/chunks/{usePopup-DarKTbRC.js.map → usePopup-DnfKRiYs.js.map} +1 -1
- package/dist/chunks/usePopup-Domnpg55.cjs +2 -0
- package/dist/chunks/{usePopup-D2JEuDrO.cjs.map → usePopup-Domnpg55.cjs.map} +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.js +2 -2
- package/dist/components/core/BwgFormItem.d.ts +2 -2
- package/dist/components/core/BwgFormItem.d.ts.map +1 -1
- package/dist/components/core/BwgInput.d.ts.map +1 -1
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +2 -2
- package/dist/components/guide/index.cjs +1 -1
- package/dist/components/guide/index.cjs.map +1 -1
- package/dist/components/guide/index.js +3 -3
- package/dist/components/guide/index.js.map +1 -1
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +14 -14
- package/dist/provider/index.cjs +1 -1
- package/dist/provider/index.js +4 -4
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.js +6 -6
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.js +2 -2
- package/package.json +2 -3
- package/dist/chunks/AuthContext-CXng9fj0.cjs +0 -2
- package/dist/chunks/BwgSpace-b0hmM1Ht.cjs +0 -2
- package/dist/chunks/BwgSwitch-DOlc57wi.cjs +0 -2
- package/dist/chunks/BwgSwitch-DOlc57wi.cjs.map +0 -1
- package/dist/chunks/BwgSwitch-D_scwi9_.js.map +0 -1
- package/dist/chunks/BwgUploader-CkXwkcUL.cjs +0 -3
- package/dist/chunks/LoadingOverlay-DAZJF5wg.js +0 -19
- package/dist/chunks/LoadingOverlay-DcmKvoZA.cjs +0 -2
- package/dist/chunks/ScreenProtectContext-3my4PHFa.js +0 -154
- package/dist/chunks/ScreenProtectContext-CVuXrJm6.cjs +0 -2
- package/dist/chunks/SearchBoxContext-DwFDOyYG.cjs +0 -2
- package/dist/chunks/ViewContainer-Bhq22_B3.cjs +0 -36
- package/dist/chunks/apiUtils-BZ6s0_NI.cjs +0 -3
- package/dist/chunks/jsx-runtime-CeSfJrVB.cjs +0 -31
- package/dist/chunks/jsx-runtime-CeSfJrVB.cjs.map +0 -1
- package/dist/chunks/jsx-runtime-Dpn_P65e.js +0 -634
- package/dist/chunks/jsx-runtime-Dpn_P65e.js.map +0 -1
- package/dist/chunks/usePopup-D2JEuDrO.cjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewContainer-Bhq22_B3.cjs","sources":["../../src/components/layout/ErrorBound.tsx","../../src/components/layout/PrivateProtectedOverlay.tsx","../../src/components/layout/ProgressOverlay.tsx","../../src/components/layout/ProtectLayout.tsx","../../src/components/layout/PublicLayout.tsx","../../src/components/layout/ViewContainer.tsx"],"sourcesContent":["import { HomeOutlined, ReloadOutlined } from '@ant-design/icons';\r\nimport { Button, Result } from 'antd';\r\nimport {\r\n Component,\r\n ErrorInfo,\r\n FC,\r\n ReactNode,\r\n useCallback,\r\n useState,\r\n} from 'react';\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: 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] = useState<Error | null>(null);\r\n\r\n const handleError = useCallback((error: Error) => {\r\n console.error('useErrorHandler caught an error:', error);\r\n setError(error);\r\n }, []);\r\n\r\n const resetError = useCallback(() => {\r\n setError(null);\r\n }, []);\r\n\r\n return { error, handleError, resetError };\r\n};\r\n","import {\r\n ScreenProtectProvider,\r\n useLock,\r\n} from '@/provider/contexts/ScreenProtectContext';\r\nimport {\r\n FC,\r\n MutableRefObject,\r\n ReactNode,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from 'react';\r\n\r\n// ──────────────────────────────────────────────\r\n// 공통 스타일 유틸\r\n// ──────────────────────────────────────────────\r\nconst createTabStyle = (isActive: boolean) => ({\r\n position: 'absolute' as const,\r\n inset: 0,\r\n visibility: isActive ? ('visible' as const) : ('hidden' as const),\r\n opacity: isActive ? 1 : 0,\r\n transition: 'opacity 0.2s ease-in-out',\r\n pointerEvents: isActive ? ('auto' as const) : ('none' as const),\r\n});\r\n\r\n// ──────────────────────────────────────────────\r\n// AutoLock (활성 탭일 때 잠금 트리거)\r\n// ──────────────────────────────────────────────\r\nconst AutoLock: FC<{ once?: boolean }> = ({ once = true }) => {\r\n const { lock } = useLock();\r\n const called = useRef(false);\r\n useEffect(() => {\r\n if (once && called.current) return;\r\n called.current = true;\r\n lock();\r\n }, [once, lock]);\r\n return null;\r\n};\r\n\r\n// ──────────────────────────────────────────────\r\n// PrivateProtectedOverlay (개인정보 포함 화면 보호레이어)\r\n// ──────────────────────────────────────────────\r\nconst PrivateProtectedOverlay: FC<{\r\n isActive: boolean;\r\n flagged: boolean;\r\n tabKey: string;\r\n onUnlock: () => void;\r\n children: ReactNode;\r\n}> = ({ isActive, flagged, tabKey, onUnlock, children }) => {\r\n const shellRef = useRef<HTMLDivElement>(null);\r\n const [ready, setReady] = useState(false);\r\n\r\n const setShellRef = useCallback((el: HTMLDivElement | null) => {\r\n (shellRef as MutableRefObject<HTMLDivElement | null>).current = el;\r\n setReady(!!el);\r\n }, []);\r\n\r\n const shellStyle = createTabStyle(isActive);\r\n\r\n return (\r\n <div ref={setShellRef} style={shellStyle}>\r\n {ready ? (\r\n <ScreenProtectProvider\r\n idleMs={Number.POSITIVE_INFINITY}\r\n persistLocked={false}\r\n overlayScope='scoped'\r\n overlayPosition='absolute'\r\n eventTarget={shellRef.current!}\r\n overlayId={`tab-overlay-${tabKey}`}\r\n onUnlock={async () => {\r\n onUnlock();\r\n return true;\r\n }}\r\n >\r\n {isActive && flagged ? <AutoLock once /> : null}\r\n {children}\r\n </ScreenProtectProvider>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PrivateProtectedOverlay;\r\n","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { Spin } from \"antd\";\r\nimport { CSSProperties, FC, 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: 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(() => {\r\n ensureDotLineWaveStylesV4();\r\n }, []);\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 CSSProperties;\r\n\r\n const perDotDelay = (speedMs / n) * phase;\r\n\r\n return (\r\n <span\r\n className='bwg-dotline'\r\n role='img'\r\n aria-label='loading'\r\n style={baseStyle}\r\n >\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 * @returns ProgressOverlay\r\n */\r\nconst ProgressOverlay: FC<{ spin?: boolean | null; text?: string }> = ({\r\n spin = null,\r\n text = '인증중...',\r\n}) => {\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' }}>\r\n {text}\r\n </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/envUtils\";\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 { CloseOutlined, ExclamationCircleTwoTone } from \"@ant-design/icons\";\r\nimport { Button, Result, Space, Typography } from \"antd\";\r\nimport { ComponentType, createElement, memo, Suspense } from 'react';\r\nimport { useMenuViewStore } from '../../stores/menuViewStore';\r\nimport { ErrorBound } from './ErrorBound';\r\n\r\nconst ViewContainer = ({\r\n isActive,\r\n instance,\r\n params,\r\n}: {\r\n isActive: boolean;\r\n instance?: ComponentType;\r\n params?: Record<string, any>;\r\n}) => {\r\n const { activeMenuId, closeTab } = useMenuViewStore();\r\n\r\n // 현재 활성 탭 닫기 핸들러\r\n const onClose = () => {\r\n if (activeMenuId) {\r\n closeTab(activeMenuId);\r\n }\r\n };\r\n\r\n if (instance) {\r\n return (\r\n <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 fallback={null}>\r\n {instance && createElement(instance, { params } as any)}\r\n </Suspense>\r\n </ErrorBound>\r\n </div>\r\n );\r\n } else {\r\n return (\r\n <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 display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\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 <div\r\n style={{\r\n width: 500,\r\n maxWidth: '90%',\r\n background: '#fff',\r\n borderRadius: 16,\r\n boxShadow: '0 8px 30px rgba(0,0,0,0.05)',\r\n padding: 24,\r\n }}\r\n >\r\n <Result\r\n icon={<ExclamationCircleTwoTone twoToneColor='#69b1ff' />}\r\n status='warning'\r\n title='등록된 메뉴 정보가 없거나 유효한 메뉴가 아닙니다.'\r\n subTitle={\r\n <Typography.Text type='secondary'>\r\n 자세한 내용은 관리자에게 문의바랍니다.\r\n </Typography.Text>\r\n }\r\n extra={\r\n <Space>\r\n <Button icon={<CloseOutlined />} onClick={onClose}>\r\n 탭 닫기\r\n </Button>\r\n </Space>\r\n }\r\n />\r\n </div>\r\n </div>\r\n );\r\n }\r\n};\r\n\r\nexport default memo(ViewContainer);"],"names":["ErrorBound","Component","props","error","errorInfo","jsxs","jsx","Result","Button","ReloadOutlined","createTabStyle","isActive","AutoLock","once","lock","useLock","called","useRef","useEffect","PrivateProtectedOverlay","flagged","tabKey","onUnlock","children","shellRef","ready","setReady","useState","setShellRef","useCallback","el","shellStyle","ScreenProtectProvider","DOTLINE_STYLE_ID","ensureDotLineWaveStylesV4","style","DotLineSmoothIndicator","colors","count","size","gap","amp","speedMs","direction","phase","n","dots","baseStyle","perDotDelay","_","i","ProgressOverlay","spin","text","busy","useAuth","Spin","ProtectedLayout","reauthWithPin","pin","isLocal","ConfigProvider","Outlet","PublicLayout","ViewContainer","instance","params","activeMenuId","closeTab","useMenuViewStore","onClose","Suspense","createElement","ExclamationCircleTwoTone","Typography","Space","CloseOutlined","ViewContainer$1","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ViewContainer-BfiTFvLP.cjs","sources":["../../src/components/layout/ErrorBound.tsx","../../src/components/layout/PrivateProtectedOverlay.tsx","../../src/components/layout/ProgressOverlay.tsx","../../src/components/layout/ProtectLayout.tsx","../../src/components/layout/PublicLayout.tsx","../../src/components/layout/ViewContainer.tsx"],"sourcesContent":["import { HomeOutlined, ReloadOutlined } from '@ant-design/icons';\r\nimport { Button, Result } from 'antd';\r\nimport {\r\n Component,\r\n ErrorInfo,\r\n FC,\r\n ReactNode,\r\n useCallback,\r\n useState,\r\n} from 'react';\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: 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] = useState<Error | null>(null);\r\n\r\n const handleError = useCallback((error: Error) => {\r\n console.error('useErrorHandler caught an error:', error);\r\n setError(error);\r\n }, []);\r\n\r\n const resetError = useCallback(() => {\r\n setError(null);\r\n }, []);\r\n\r\n return { error, handleError, resetError };\r\n};\r\n","import {\r\n ScreenProtectProvider,\r\n useLock,\r\n} from '@/provider/contexts/ScreenProtectContext';\r\nimport {\r\n FC,\r\n MutableRefObject,\r\n ReactNode,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from 'react';\r\n\r\n// ──────────────────────────────────────────────\r\n// 공통 스타일 유틸\r\n// ──────────────────────────────────────────────\r\nconst createTabStyle = (isActive: boolean) => ({\r\n position: 'absolute' as const,\r\n inset: 0,\r\n visibility: isActive ? ('visible' as const) : ('hidden' as const),\r\n opacity: isActive ? 1 : 0,\r\n transition: 'opacity 0.2s ease-in-out',\r\n pointerEvents: isActive ? ('auto' as const) : ('none' as const),\r\n});\r\n\r\n// ──────────────────────────────────────────────\r\n// AutoLock (활성 탭일 때 잠금 트리거)\r\n// ──────────────────────────────────────────────\r\nconst AutoLock: FC<{ once?: boolean }> = ({ once = true }) => {\r\n const { lock } = useLock();\r\n const called = useRef(false);\r\n useEffect(() => {\r\n if (once && called.current) return;\r\n called.current = true;\r\n lock();\r\n }, [once, lock]);\r\n return null;\r\n};\r\n\r\n// ──────────────────────────────────────────────\r\n// PrivateProtectedOverlay (개인정보 포함 화면 보호레이어)\r\n// ──────────────────────────────────────────────\r\nconst PrivateProtectedOverlay: FC<{\r\n isActive: boolean;\r\n flagged: boolean;\r\n tabKey: string;\r\n onUnlock: () => void;\r\n children: ReactNode;\r\n}> = ({ isActive, flagged, tabKey, onUnlock, children }) => {\r\n const shellRef = useRef<HTMLDivElement>(null);\r\n const [ready, setReady] = useState(false);\r\n\r\n const setShellRef = useCallback((el: HTMLDivElement | null) => {\r\n (shellRef as MutableRefObject<HTMLDivElement | null>).current = el;\r\n setReady(!!el);\r\n }, []);\r\n\r\n const shellStyle = createTabStyle(isActive);\r\n\r\n return (\r\n <div ref={setShellRef} style={shellStyle}>\r\n {ready ? (\r\n <ScreenProtectProvider\r\n idleMs={Number.POSITIVE_INFINITY}\r\n persistLocked={false}\r\n overlayScope='scoped'\r\n overlayPosition='absolute'\r\n eventTarget={shellRef.current!}\r\n overlayId={`tab-overlay-${tabKey}`}\r\n onUnlock={async () => {\r\n onUnlock();\r\n return true;\r\n }}\r\n >\r\n {isActive && flagged ? <AutoLock once /> : null}\r\n {children}\r\n </ScreenProtectProvider>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PrivateProtectedOverlay;\r\n","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { Spin } from \"antd\";\r\nimport { CSSProperties, FC, 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: 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(() => {\r\n ensureDotLineWaveStylesV4();\r\n }, []);\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 CSSProperties;\r\n\r\n const perDotDelay = (speedMs / n) * phase;\r\n\r\n return (\r\n <span\r\n className='bwg-dotline'\r\n role='img'\r\n aria-label='loading'\r\n style={baseStyle}\r\n >\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 * @returns ProgressOverlay\r\n */\r\nconst ProgressOverlay: FC<{ spin?: boolean | null; text?: string }> = ({\r\n spin = null,\r\n text = '인증중...',\r\n}) => {\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' }}>\r\n {text}\r\n </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/envUtils\";\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 { CloseOutlined, ExclamationCircleTwoTone } from \"@ant-design/icons\";\r\nimport { Button, Result, Space, Typography } from \"antd\";\r\nimport { ComponentType, createElement, memo, Suspense } from 'react';\r\nimport { useMenuViewStore } from '../../stores/menuViewStore';\r\nimport { ErrorBound } from './ErrorBound';\r\n\r\nconst ViewContainer = ({\r\n isActive,\r\n instance,\r\n params,\r\n}: {\r\n isActive: boolean;\r\n instance?: ComponentType;\r\n params?: Record<string, any>;\r\n}) => {\r\n const { activeMenuId, closeTab } = useMenuViewStore();\r\n\r\n // 현재 활성 탭 닫기 핸들러\r\n const onClose = () => {\r\n if (activeMenuId) {\r\n closeTab(activeMenuId);\r\n }\r\n };\r\n\r\n if (instance) {\r\n return (\r\n <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 fallback={null}>\r\n {instance && createElement(instance, { params } as any)}\r\n </Suspense>\r\n </ErrorBound>\r\n </div>\r\n );\r\n } else {\r\n return (\r\n <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 display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\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 <div\r\n style={{\r\n width: 500,\r\n maxWidth: '90%',\r\n background: '#fff',\r\n borderRadius: 16,\r\n boxShadow: '0 8px 30px rgba(0,0,0,0.05)',\r\n padding: 24,\r\n }}\r\n >\r\n <Result\r\n icon={<ExclamationCircleTwoTone twoToneColor='#69b1ff' />}\r\n status='warning'\r\n title='등록된 메뉴 정보가 없거나 유효한 메뉴가 아닙니다.'\r\n subTitle={\r\n <Typography.Text type='secondary'>\r\n 자세한 내용은 관리자에게 문의바랍니다.\r\n </Typography.Text>\r\n }\r\n extra={\r\n <Space>\r\n <Button icon={<CloseOutlined />} onClick={onClose}>\r\n 탭 닫기\r\n </Button>\r\n </Space>\r\n }\r\n />\r\n </div>\r\n </div>\r\n );\r\n }\r\n};\r\n\r\nexport default memo(ViewContainer);"],"names":["ErrorBound","Component","props","error","errorInfo","jsxs","jsx","Result","Button","ReloadOutlined","createTabStyle","isActive","AutoLock","once","lock","useLock","called","useRef","useEffect","PrivateProtectedOverlay","flagged","tabKey","onUnlock","children","shellRef","ready","setReady","useState","setShellRef","useCallback","el","shellStyle","ScreenProtectProvider","DOTLINE_STYLE_ID","ensureDotLineWaveStylesV4","style","DotLineSmoothIndicator","colors","count","size","gap","amp","speedMs","direction","phase","n","dots","baseStyle","perDotDelay","_","i","ProgressOverlay","spin","text","busy","useAuth","Spin","ProtectedLayout","reauthWithPin","pin","isLocal","ConfigProvider","Outlet","PublicLayout","ViewContainer","instance","params","activeMenuId","closeTab","useMenuViewStore","onClose","Suspense","createElement","ExclamationCircleTwoTone","Typography","Space","CloseOutlined","ViewContainer$1","memo"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { S as
|
|
3
|
-
import { Component as
|
|
4
|
-
import { u as
|
|
5
|
-
import { a7 as
|
|
6
|
-
import { Result as
|
|
7
|
-
import { Outlet as
|
|
8
|
-
import { ReloadOutlined as
|
|
9
|
-
class
|
|
1
|
+
import { jsxs as s, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { S as g, u as E } from "./ScreenProtectContext-BMsPPcTX.js";
|
|
3
|
+
import { Component as S, useRef as y, useState as T, useCallback as F, useEffect as b, memo as I, Suspense as D, createElement as P } from "react";
|
|
4
|
+
import { u as x } from "./AuthContext-CVizgYxY.js";
|
|
5
|
+
import { a7 as B, aH as L } from "./apiUtils-DPUgfmKk.js";
|
|
6
|
+
import { Result as w, Button as v, Spin as R, ConfigProvider as $, Space as z, Typography as N } from "antd";
|
|
7
|
+
import { Outlet as k } from "react-router-dom";
|
|
8
|
+
import { ReloadOutlined as O, CloseOutlined as V, ExclamationCircleTwoTone as j } from "@ant-design/icons";
|
|
9
|
+
class W extends S {
|
|
10
10
|
constructor(r) {
|
|
11
11
|
super(r), this.resetError = () => {
|
|
12
12
|
this.setState({ hasError: !1, error: void 0, errorInfo: void 0 });
|
|
@@ -15,14 +15,14 @@ class V extends k {
|
|
|
15
15
|
static getDerivedStateFromError(r) {
|
|
16
16
|
return { hasError: !0, error: r };
|
|
17
17
|
}
|
|
18
|
-
componentDidCatch(r,
|
|
19
|
-
console.error("ErrorBound caught an error:", r,
|
|
18
|
+
componentDidCatch(r, a) {
|
|
19
|
+
console.error("ErrorBound caught an error:", r, a), this.setState({
|
|
20
20
|
error: r,
|
|
21
|
-
errorInfo:
|
|
21
|
+
errorInfo: a
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
render() {
|
|
25
|
-
return this.state.hasError ? this.props.fallback ? this.props.fallback : /* @__PURE__ */
|
|
25
|
+
return this.state.hasError ? this.props.fallback ? this.props.fallback : /* @__PURE__ */ s(
|
|
26
26
|
"div",
|
|
27
27
|
{
|
|
28
28
|
style: {
|
|
@@ -35,18 +35,18 @@ class V extends k {
|
|
|
35
35
|
alignItems: "center"
|
|
36
36
|
},
|
|
37
37
|
children: [
|
|
38
|
-
/* @__PURE__ */
|
|
39
|
-
|
|
38
|
+
/* @__PURE__ */ t(
|
|
39
|
+
w,
|
|
40
40
|
{
|
|
41
41
|
status: "error",
|
|
42
42
|
title: "컴포넌트 로딩 중 오류가 발생했습니다",
|
|
43
43
|
subTitle: this.state.error ? `오류 내용: ${this.state.error.message}` : "알 수 없는 오류가 발생했습니다",
|
|
44
44
|
extra: [
|
|
45
|
-
/* @__PURE__ */
|
|
46
|
-
|
|
45
|
+
/* @__PURE__ */ t(
|
|
46
|
+
v,
|
|
47
47
|
{
|
|
48
48
|
type: "primary",
|
|
49
|
-
icon: /* @__PURE__ */
|
|
49
|
+
icon: /* @__PURE__ */ t(O, {}),
|
|
50
50
|
onClick: this.resetError,
|
|
51
51
|
style: { marginRight: 8 },
|
|
52
52
|
children: "다시 시도"
|
|
@@ -56,7 +56,7 @@ class V extends k {
|
|
|
56
56
|
]
|
|
57
57
|
}
|
|
58
58
|
),
|
|
59
|
-
this.state.error && /* @__PURE__ */
|
|
59
|
+
this.state.error && /* @__PURE__ */ s(
|
|
60
60
|
"details",
|
|
61
61
|
{
|
|
62
62
|
style: {
|
|
@@ -69,8 +69,8 @@ class V extends k {
|
|
|
69
69
|
border: "1px solid #d9d9d9"
|
|
70
70
|
},
|
|
71
71
|
children: [
|
|
72
|
-
/* @__PURE__ */
|
|
73
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ t("summary", { style: { cursor: "pointer", fontWeight: "bold" }, children: "오류 상세 정보" }),
|
|
73
|
+
/* @__PURE__ */ t(
|
|
74
74
|
"pre",
|
|
75
75
|
{
|
|
76
76
|
style: {
|
|
@@ -91,43 +91,43 @@ class V extends k {
|
|
|
91
91
|
) : this.props.children;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
|
-
const
|
|
94
|
+
const M = (e) => ({
|
|
95
95
|
position: "absolute",
|
|
96
96
|
inset: 0,
|
|
97
|
-
visibility:
|
|
98
|
-
opacity:
|
|
97
|
+
visibility: e ? "visible" : "hidden",
|
|
98
|
+
opacity: e ? 1 : 0,
|
|
99
99
|
transition: "opacity 0.2s ease-in-out",
|
|
100
|
-
pointerEvents:
|
|
101
|
-
}),
|
|
102
|
-
const { lock: r } = E(),
|
|
103
|
-
return
|
|
104
|
-
|
|
105
|
-
}, [
|
|
106
|
-
},
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
}, []),
|
|
110
|
-
return /* @__PURE__ */
|
|
111
|
-
|
|
100
|
+
pointerEvents: e ? "auto" : "none"
|
|
101
|
+
}), _ = ({ once: e = !0 }) => {
|
|
102
|
+
const { lock: r } = E(), a = y(!1);
|
|
103
|
+
return b(() => {
|
|
104
|
+
e && a.current || (a.current = !0, r());
|
|
105
|
+
}, [e, r]), null;
|
|
106
|
+
}, te = ({ isActive: e, flagged: r, tabKey: a, onUnlock: n, children: i }) => {
|
|
107
|
+
const o = y(null), [p, u] = T(!1), l = F((c) => {
|
|
108
|
+
o.current = c, u(!!c);
|
|
109
|
+
}, []), h = M(e);
|
|
110
|
+
return /* @__PURE__ */ t("div", { ref: l, style: h, children: p ? /* @__PURE__ */ s(
|
|
111
|
+
g,
|
|
112
112
|
{
|
|
113
113
|
idleMs: Number.POSITIVE_INFINITY,
|
|
114
114
|
persistLocked: !1,
|
|
115
115
|
overlayScope: "scoped",
|
|
116
116
|
overlayPosition: "absolute",
|
|
117
|
-
eventTarget:
|
|
118
|
-
overlayId: `tab-overlay-${
|
|
119
|
-
onUnlock: async () => (
|
|
117
|
+
eventTarget: o.current,
|
|
118
|
+
overlayId: `tab-overlay-${a}`,
|
|
119
|
+
onUnlock: async () => (n(), !0),
|
|
120
120
|
children: [
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
e && r ? /* @__PURE__ */ t(_, { once: !0 }) : null,
|
|
122
|
+
i
|
|
123
123
|
]
|
|
124
124
|
}
|
|
125
|
-
) :
|
|
126
|
-
},
|
|
127
|
-
function
|
|
128
|
-
if (typeof document > "u" || document.getElementById(
|
|
129
|
-
const
|
|
130
|
-
|
|
125
|
+
) : i });
|
|
126
|
+
}, f = "bwg-dot-line-wave-v4";
|
|
127
|
+
function A() {
|
|
128
|
+
if (typeof document > "u" || document.getElementById(f)) return;
|
|
129
|
+
const e = document.createElement("style");
|
|
130
|
+
e.id = f, e.textContent = `
|
|
131
131
|
.bwg-dotline {
|
|
132
132
|
display: inline-flex;
|
|
133
133
|
align-items: center;
|
|
@@ -161,53 +161,53 @@ function _() {
|
|
|
161
161
|
@media (prefers-reduced-motion: reduce) {
|
|
162
162
|
.bwg-dotline .dot { animation: none; }
|
|
163
163
|
}
|
|
164
|
-
`, document.head.appendChild(
|
|
164
|
+
`, document.head.appendChild(e);
|
|
165
165
|
}
|
|
166
|
-
const
|
|
167
|
-
colors:
|
|
166
|
+
const U = ({
|
|
167
|
+
colors: e = ["#DAD3FF", "#B3A6FF", "#9380FF", "#816BFA"],
|
|
168
168
|
count: r,
|
|
169
|
-
size:
|
|
170
|
-
gap:
|
|
171
|
-
amp:
|
|
172
|
-
speedMs:
|
|
173
|
-
direction:
|
|
174
|
-
phase:
|
|
169
|
+
size: a = 12,
|
|
170
|
+
gap: n = 10,
|
|
171
|
+
amp: i = 16,
|
|
172
|
+
speedMs: o = 900,
|
|
173
|
+
direction: p = "ltr",
|
|
174
|
+
phase: u = 0.7
|
|
175
175
|
}) => {
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
b(() => {
|
|
177
|
+
A();
|
|
178
178
|
}, []);
|
|
179
|
-
const
|
|
180
|
-
"--bwg-size": `${
|
|
181
|
-
"--bwg-gap": `${
|
|
182
|
-
"--bwg-amp": `${
|
|
183
|
-
"--bwg-speed": `${
|
|
184
|
-
},
|
|
185
|
-
return /* @__PURE__ */
|
|
179
|
+
const l = r ?? e.length, h = Array.from({ length: l }), c = {
|
|
180
|
+
"--bwg-size": `${a}px`,
|
|
181
|
+
"--bwg-gap": `${n}px`,
|
|
182
|
+
"--bwg-amp": `${i}px`,
|
|
183
|
+
"--bwg-speed": `${o}ms`
|
|
184
|
+
}, m = o / l * u;
|
|
185
|
+
return /* @__PURE__ */ t(
|
|
186
186
|
"span",
|
|
187
187
|
{
|
|
188
188
|
className: "bwg-dotline",
|
|
189
189
|
role: "img",
|
|
190
190
|
"aria-label": "loading",
|
|
191
|
-
style:
|
|
192
|
-
children:
|
|
191
|
+
style: c,
|
|
192
|
+
children: h.map((H, d) => /* @__PURE__ */ t(
|
|
193
193
|
"span",
|
|
194
194
|
{
|
|
195
195
|
className: "dot",
|
|
196
196
|
style: {
|
|
197
|
-
backgroundColor:
|
|
198
|
-
animationDelay:
|
|
197
|
+
backgroundColor: e[d % e.length],
|
|
198
|
+
animationDelay: p === "ltr" ? `${d * m}ms` : `${(l - 1 - d) * m}ms`
|
|
199
199
|
}
|
|
200
200
|
},
|
|
201
|
-
|
|
201
|
+
d
|
|
202
202
|
))
|
|
203
203
|
}
|
|
204
204
|
);
|
|
205
|
-
},
|
|
206
|
-
spin:
|
|
205
|
+
}, C = ({
|
|
206
|
+
spin: e = null,
|
|
207
207
|
text: r = "인증중..."
|
|
208
208
|
}) => {
|
|
209
|
-
const { busy:
|
|
210
|
-
return
|
|
209
|
+
const { busy: a } = x();
|
|
210
|
+
return e ?? a ? /* @__PURE__ */ s(
|
|
211
211
|
"div",
|
|
212
212
|
{
|
|
213
213
|
style: {
|
|
@@ -230,11 +230,11 @@ const A = ({
|
|
|
230
230
|
"aria-busy": "true",
|
|
231
231
|
role: "status",
|
|
232
232
|
children: [
|
|
233
|
-
/* @__PURE__ */
|
|
234
|
-
|
|
233
|
+
/* @__PURE__ */ t(
|
|
234
|
+
R,
|
|
235
235
|
{
|
|
236
|
-
indicator: /* @__PURE__ */
|
|
237
|
-
|
|
236
|
+
indicator: /* @__PURE__ */ t(
|
|
237
|
+
U,
|
|
238
238
|
{
|
|
239
239
|
colors: ["#DAD3FF", "#B3A6FF", "#9380FF", "#816BFA"],
|
|
240
240
|
size: 12,
|
|
@@ -247,28 +247,28 @@ const A = ({
|
|
|
247
247
|
)
|
|
248
248
|
}
|
|
249
249
|
),
|
|
250
|
-
/* @__PURE__ */
|
|
250
|
+
/* @__PURE__ */ t("span", { className: "bwg-spin-txt", style: { marginTop: "15px" }, children: r })
|
|
251
251
|
]
|
|
252
252
|
}
|
|
253
253
|
) : null;
|
|
254
|
-
},
|
|
255
|
-
const { reauthWithPin:
|
|
256
|
-
return /* @__PURE__ */
|
|
257
|
-
/* @__PURE__ */
|
|
258
|
-
/* @__PURE__ */
|
|
254
|
+
}, re = () => {
|
|
255
|
+
const { reauthWithPin: e } = x();
|
|
256
|
+
return /* @__PURE__ */ t(g, { idleMs: 30 * 6e4, onUnlock: async (r) => B ? !0 : !!r && await e(r), children: /* @__PURE__ */ t($, { getPopupContainer: () => document.getElementById("app-shell") || document.body, children: /* @__PURE__ */ s("div", { id: "app-shell", children: [
|
|
257
|
+
/* @__PURE__ */ t(C, {}),
|
|
258
|
+
/* @__PURE__ */ t(k, {})
|
|
259
259
|
] }) }) });
|
|
260
|
-
},
|
|
261
|
-
/* @__PURE__ */
|
|
262
|
-
/* @__PURE__ */
|
|
263
|
-
] }),
|
|
264
|
-
isActive:
|
|
260
|
+
}, ae = () => /* @__PURE__ */ s("div", { children: [
|
|
261
|
+
/* @__PURE__ */ t(C, {}),
|
|
262
|
+
/* @__PURE__ */ t(k, {})
|
|
263
|
+
] }), Y = ({
|
|
264
|
+
isActive: e,
|
|
265
265
|
instance: r,
|
|
266
|
-
params:
|
|
266
|
+
params: a
|
|
267
267
|
}) => {
|
|
268
|
-
const { activeMenuId:
|
|
269
|
-
|
|
268
|
+
const { activeMenuId: n, closeTab: i } = L(), o = () => {
|
|
269
|
+
n && i(n);
|
|
270
270
|
};
|
|
271
|
-
return r ? /* @__PURE__ */
|
|
271
|
+
return r ? /* @__PURE__ */ t(
|
|
272
272
|
"div",
|
|
273
273
|
{
|
|
274
274
|
style: {
|
|
@@ -277,14 +277,14 @@ const A = ({
|
|
|
277
277
|
left: 0,
|
|
278
278
|
width: "100%",
|
|
279
279
|
height: "100%",
|
|
280
|
-
visibility:
|
|
281
|
-
opacity:
|
|
280
|
+
visibility: e ? "visible" : "hidden",
|
|
281
|
+
opacity: e ? 1 : 0,
|
|
282
282
|
transition: "opacity 0.2s ease-in-out",
|
|
283
|
-
pointerEvents:
|
|
283
|
+
pointerEvents: e ? "auto" : "none"
|
|
284
284
|
},
|
|
285
|
-
children: /* @__PURE__ */
|
|
285
|
+
children: /* @__PURE__ */ t(W, { children: /* @__PURE__ */ t(D, { fallback: null, children: r && P(r, { params: a }) }) })
|
|
286
286
|
}
|
|
287
|
-
) : /* @__PURE__ */
|
|
287
|
+
) : /* @__PURE__ */ t(
|
|
288
288
|
"div",
|
|
289
289
|
{
|
|
290
290
|
style: {
|
|
@@ -296,12 +296,12 @@ const A = ({
|
|
|
296
296
|
display: "flex",
|
|
297
297
|
justifyContent: "center",
|
|
298
298
|
alignItems: "center",
|
|
299
|
-
visibility:
|
|
300
|
-
opacity:
|
|
299
|
+
visibility: e ? "visible" : "hidden",
|
|
300
|
+
opacity: e ? 1 : 0,
|
|
301
301
|
transition: "opacity 0.2s ease-in-out",
|
|
302
|
-
pointerEvents:
|
|
302
|
+
pointerEvents: e ? "auto" : "none"
|
|
303
303
|
},
|
|
304
|
-
children: /* @__PURE__ */
|
|
304
|
+
children: /* @__PURE__ */ t(
|
|
305
305
|
"div",
|
|
306
306
|
{
|
|
307
307
|
style: {
|
|
@@ -312,27 +312,27 @@ const A = ({
|
|
|
312
312
|
boxShadow: "0 8px 30px rgba(0,0,0,0.05)",
|
|
313
313
|
padding: 24
|
|
314
314
|
},
|
|
315
|
-
children: /* @__PURE__ */
|
|
316
|
-
|
|
315
|
+
children: /* @__PURE__ */ t(
|
|
316
|
+
w,
|
|
317
317
|
{
|
|
318
|
-
icon: /* @__PURE__ */
|
|
318
|
+
icon: /* @__PURE__ */ t(j, { twoToneColor: "#69b1ff" }),
|
|
319
319
|
status: "warning",
|
|
320
320
|
title: "등록된 메뉴 정보가 없거나 유효한 메뉴가 아닙니다.",
|
|
321
|
-
subTitle: /* @__PURE__ */
|
|
322
|
-
extra: /* @__PURE__ */
|
|
321
|
+
subTitle: /* @__PURE__ */ t(N.Text, { type: "secondary", children: "자세한 내용은 관리자에게 문의바랍니다." }),
|
|
322
|
+
extra: /* @__PURE__ */ t(z, { children: /* @__PURE__ */ t(v, { icon: /* @__PURE__ */ t(V, {}), onClick: o, children: "탭 닫기" }) })
|
|
323
323
|
}
|
|
324
324
|
)
|
|
325
325
|
}
|
|
326
326
|
)
|
|
327
327
|
}
|
|
328
328
|
);
|
|
329
|
-
},
|
|
329
|
+
}, ne = I(Y);
|
|
330
330
|
export {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
331
|
+
W as E,
|
|
332
|
+
te as P,
|
|
333
|
+
ne as V,
|
|
334
|
+
C as a,
|
|
335
|
+
re as b,
|
|
336
|
+
ae as c
|
|
337
337
|
};
|
|
338
|
-
//# sourceMappingURL=ViewContainer-
|
|
338
|
+
//# sourceMappingURL=ViewContainer-CTl3_56W.js.map
|