@bwg-ui/core 1.1.17 → 1.1.18
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-CBwGaHh6.js → BwgLargeUploader-D6plJv5D.js} +123 -123
- package/dist/chunks/BwgLargeUploader-D6plJv5D.js.map +1 -0
- package/dist/chunks/BwgLargeUploader-LMj6KXhK.cjs +3 -0
- package/dist/chunks/BwgLargeUploader-LMj6KXhK.cjs.map +1 -0
- package/dist/chunks/{SSOHandler-DoidypM2.cjs → SSOHandler-DXnV_f_M.cjs} +29 -29
- package/dist/chunks/{SSOHandler-DoidypM2.cjs.map → SSOHandler-DXnV_f_M.cjs.map} +1 -1
- package/dist/chunks/{SSOHandler-BfRH51hZ.js → SSOHandler-yNjxYbHn.js} +53 -54
- package/dist/chunks/{SSOHandler-BfRH51hZ.js.map → SSOHandler-yNjxYbHn.js.map} +1 -1
- package/dist/chunks/{SearchBoxContext-CjdCL1e9.js → SearchBoxContext-CO1AyqH4.js} +5 -5
- package/dist/chunks/{SearchBoxContext-CjdCL1e9.js.map → SearchBoxContext-CO1AyqH4.js.map} +1 -1
- package/dist/chunks/{SearchBoxContext-CNoEc4uu.cjs → SearchBoxContext-Cinu3U4b.cjs} +2 -2
- package/dist/chunks/{SearchBoxContext-CNoEc4uu.cjs.map → SearchBoxContext-Cinu3U4b.cjs.map} +1 -1
- package/dist/chunks/{ViewContainer-DUjKBgcl.cjs → ViewContainer-BH7t9T4d.cjs} +3 -3
- package/dist/chunks/{ViewContainer-DUjKBgcl.cjs.map → ViewContainer-BH7t9T4d.cjs.map} +1 -1
- package/dist/chunks/{ViewContainer-Du3IzFYo.js → ViewContainer-CMbN_tYW.js} +121 -81
- package/dist/chunks/{ViewContainer-Du3IzFYo.js.map → ViewContainer-CMbN_tYW.js.map} +1 -1
- package/dist/chunks/{apiUtils-IzgDPO-1.js → apiUtils-BJRcT3Tm.js} +431 -393
- package/dist/chunks/apiUtils-BJRcT3Tm.js.map +1 -0
- package/dist/chunks/apiUtils-DEnQeWNI.cjs +3 -0
- package/dist/chunks/apiUtils-DEnQeWNI.cjs.map +1 -0
- package/dist/chunks/{codeStore-Dsjc4uXs.js → codeStore-C0f5xZ_m.js} +2 -2
- package/dist/chunks/{codeStore-Dsjc4uXs.js.map → codeStore-C0f5xZ_m.js.map} +1 -1
- package/dist/chunks/{codeStore-HfLmmkAL.cjs → codeStore-DTtOQhfW.cjs} +2 -2
- package/dist/chunks/{codeStore-HfLmmkAL.cjs.map → codeStore-DTtOQhfW.cjs.map} +1 -1
- package/dist/chunks/{favoriteStore-C0o6Sj55.js → favoriteStore-Drhx0843.js} +2 -3
- package/dist/chunks/{favoriteStore-C0o6Sj55.js.map → favoriteStore-Drhx0843.js.map} +1 -1
- package/dist/chunks/favoriteStore-Dyp89Kew.cjs +2 -0
- package/dist/chunks/{favoriteStore-DOz2rAJu.cjs.map → favoriteStore-Dyp89Kew.cjs.map} +1 -1
- package/dist/chunks/{popupStore-D6b6b5-T.js → popupStore-D1rxKTyJ.js} +5 -5
- package/dist/chunks/{popupStore-D6b6b5-T.js.map → popupStore-D1rxKTyJ.js.map} +1 -1
- package/dist/chunks/{popupStore-Cm5utmtA.cjs → popupStore-DGMxbQ--.cjs} +2 -2
- package/dist/chunks/{popupStore-Cm5utmtA.cjs.map → popupStore-DGMxbQ--.cjs.map} +1 -1
- package/dist/chunks/{usePopup-Dm-UyUbV.js → usePopup-C1h8V04_.js} +3 -3
- package/dist/chunks/{usePopup-Dm-UyUbV.js.map → usePopup-C1h8V04_.js.map} +1 -1
- package/dist/chunks/{usePopup-BG24CocH.cjs → usePopup-CdpFYf3m.cjs} +2 -2
- package/dist/chunks/{usePopup-BG24CocH.cjs.map → usePopup-CdpFYf3m.cjs.map} +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/core/BwgDatePicker.d.ts +2 -2
- package/dist/components/core/BwgDatePicker.d.ts.map +1 -1
- package/dist/components/core/BwgRangePicker.d.ts +2 -2
- package/dist/components/core/BwgRangePicker.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/ViewContainer.d.ts.map +1 -1
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +127 -128
- package/dist/index.js.map +1 -1
- package/dist/provider/index.cjs +1 -1
- package/dist/provider/index.js +2 -2
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.js +9 -9
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.js +104 -106
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/BwgLargeUploader-CBwGaHh6.js.map +0 -1
- package/dist/chunks/BwgLargeUploader-CVdp_rxx.cjs +0 -3
- package/dist/chunks/BwgLargeUploader-CVdp_rxx.cjs.map +0 -1
- package/dist/chunks/apiUtils-DlsnkCO4.cjs +0 -3
- package/dist/chunks/apiUtils-DlsnkCO4.cjs.map +0 -1
- package/dist/chunks/apiUtils-IzgDPO-1.js.map +0 -1
- package/dist/chunks/envUtils-C4Yv5Nfg.cjs +0 -2
- package/dist/chunks/envUtils-C4Yv5Nfg.cjs.map +0 -1
- package/dist/chunks/envUtils-Ck_DT0s_.js +0 -43
- package/dist/chunks/envUtils-Ck_DT0s_.js.map +0 -1
- package/dist/chunks/favoriteStore-DOz2rAJu.cjs +0 -2
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { j as e } from "./jsx-runtime-Dpn_P65e.js";
|
|
2
|
-
import { S as
|
|
3
|
-
import
|
|
2
|
+
import { S as m, u as E } from "./ScreenProtectContext-3my4PHFa.js";
|
|
3
|
+
import k, { Component as C, useRef as f, useState as S, useCallback as T, useEffect as g, memo as F, Suspense as I } from "react";
|
|
4
4
|
import { u as y } from "./AuthContext-Ei2P-z4d.js";
|
|
5
|
-
import {
|
|
6
|
-
import { Result as
|
|
7
|
-
import { Outlet as
|
|
8
|
-
import { ReloadOutlined as
|
|
9
|
-
class
|
|
5
|
+
import { a7 as D, aG as P } from "./apiUtils-BJRcT3Tm.js";
|
|
6
|
+
import { Result as b, Button as w, Spin as R, ConfigProvider as B, Space as L, Typography as $ } from "antd";
|
|
7
|
+
import { Outlet as j } from "react-router-dom";
|
|
8
|
+
import { ReloadOutlined as z, CloseOutlined as N, ExclamationCircleTwoTone as O } from "@ant-design/icons";
|
|
9
|
+
class V extends C {
|
|
10
10
|
constructor(r) {
|
|
11
11
|
super(r), this.resetError = () => {
|
|
12
12
|
this.setState({ hasError: !1, error: void 0, errorInfo: void 0 });
|
|
@@ -36,17 +36,17 @@ class T extends E {
|
|
|
36
36
|
},
|
|
37
37
|
children: [
|
|
38
38
|
/* @__PURE__ */ e.jsx(
|
|
39
|
-
|
|
39
|
+
b,
|
|
40
40
|
{
|
|
41
41
|
status: "error",
|
|
42
42
|
title: "컴포넌트 로딩 중 오류가 발생했습니다",
|
|
43
43
|
subTitle: this.state.error ? `오류 내용: ${this.state.error.message}` : "알 수 없는 오류가 발생했습니다",
|
|
44
44
|
extra: [
|
|
45
45
|
/* @__PURE__ */ e.jsx(
|
|
46
|
-
|
|
46
|
+
w,
|
|
47
47
|
{
|
|
48
48
|
type: "primary",
|
|
49
|
-
icon: /* @__PURE__ */ e.jsx(
|
|
49
|
+
icon: /* @__PURE__ */ e.jsx(z, {}),
|
|
50
50
|
onClick: this.resetError,
|
|
51
51
|
style: { marginRight: 8 },
|
|
52
52
|
children: "다시 시도"
|
|
@@ -91,43 +91,43 @@ class T extends E {
|
|
|
91
91
|
) : this.props.children;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
|
-
const
|
|
94
|
+
const _ = (t) => ({
|
|
95
95
|
position: "absolute",
|
|
96
96
|
inset: 0,
|
|
97
97
|
visibility: t ? "visible" : "hidden",
|
|
98
98
|
opacity: t ? 1 : 0,
|
|
99
99
|
transition: "opacity 0.2s ease-in-out",
|
|
100
100
|
pointerEvents: t ? "auto" : "none"
|
|
101
|
-
}),
|
|
102
|
-
const { lock: r } =
|
|
103
|
-
return
|
|
101
|
+
}), W = ({ once: t = !0 }) => {
|
|
102
|
+
const { lock: r } = E(), s = f(!1);
|
|
103
|
+
return g(() => {
|
|
104
104
|
t && s.current || (s.current = !0, r());
|
|
105
105
|
}, [t, r]), null;
|
|
106
|
-
},
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
}, []), u =
|
|
110
|
-
return /* @__PURE__ */ e.jsx("div", { ref:
|
|
111
|
-
|
|
106
|
+
}, ee = ({ isActive: t, flagged: r, tabKey: s, onUnlock: a, children: o }) => {
|
|
107
|
+
const n = f(null), [d, p] = S(!1), i = T((l) => {
|
|
108
|
+
n.current = l, p(!!l);
|
|
109
|
+
}, []), u = _(t);
|
|
110
|
+
return /* @__PURE__ */ e.jsx("div", { ref: i, style: u, children: d ? /* @__PURE__ */ e.jsxs(
|
|
111
|
+
m,
|
|
112
112
|
{
|
|
113
113
|
idleMs: Number.POSITIVE_INFINITY,
|
|
114
114
|
persistLocked: !1,
|
|
115
115
|
overlayScope: "scoped",
|
|
116
116
|
overlayPosition: "absolute",
|
|
117
|
-
eventTarget:
|
|
117
|
+
eventTarget: n.current,
|
|
118
118
|
overlayId: `tab-overlay-${s}`,
|
|
119
|
-
onUnlock: async () => (
|
|
119
|
+
onUnlock: async () => (a(), !0),
|
|
120
120
|
children: [
|
|
121
|
-
t && r ? /* @__PURE__ */ e.jsx(
|
|
122
|
-
|
|
121
|
+
t && r ? /* @__PURE__ */ e.jsx(W, { once: !0 }) : null,
|
|
122
|
+
o
|
|
123
123
|
]
|
|
124
124
|
}
|
|
125
|
-
) :
|
|
126
|
-
},
|
|
127
|
-
function
|
|
128
|
-
if (typeof document > "u" || document.getElementById(
|
|
125
|
+
) : o });
|
|
126
|
+
}, x = "bwg-dot-line-wave-v4";
|
|
127
|
+
function M() {
|
|
128
|
+
if (typeof document > "u" || document.getElementById(x)) return;
|
|
129
129
|
const t = document.createElement("style");
|
|
130
|
-
t.id =
|
|
130
|
+
t.id = x, t.textContent = `
|
|
131
131
|
.bwg-dotline {
|
|
132
132
|
display: inline-flex;
|
|
133
133
|
align-items: center;
|
|
@@ -167,33 +167,33 @@ const A = ({
|
|
|
167
167
|
colors: t = ["#DAD3FF", "#B3A6FF", "#9380FF", "#816BFA"],
|
|
168
168
|
count: r,
|
|
169
169
|
size: s = 12,
|
|
170
|
-
gap:
|
|
171
|
-
amp:
|
|
172
|
-
speedMs:
|
|
170
|
+
gap: a = 10,
|
|
171
|
+
amp: o = 16,
|
|
172
|
+
speedMs: n = 900,
|
|
173
173
|
direction: d = "ltr",
|
|
174
174
|
phase: p = 0.7
|
|
175
175
|
}) => {
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
g(() => {
|
|
177
|
+
M();
|
|
178
178
|
}, []);
|
|
179
|
-
const
|
|
179
|
+
const i = r ?? t.length, u = Array.from({ length: i }), l = {
|
|
180
180
|
"--bwg-size": `${s}px`,
|
|
181
|
-
"--bwg-gap": `${
|
|
182
|
-
"--bwg-amp": `${
|
|
183
|
-
"--bwg-speed": `${
|
|
184
|
-
},
|
|
185
|
-
return /* @__PURE__ */ e.jsx("span", { className: "bwg-dotline", role: "img", "aria-label": "loading", style: l, children: u.map((
|
|
181
|
+
"--bwg-gap": `${a}px`,
|
|
182
|
+
"--bwg-amp": `${o}px`,
|
|
183
|
+
"--bwg-speed": `${n}ms`
|
|
184
|
+
}, h = n / i * p;
|
|
185
|
+
return /* @__PURE__ */ e.jsx("span", { className: "bwg-dotline", role: "img", "aria-label": "loading", style: l, children: u.map((Y, c) => /* @__PURE__ */ e.jsx(
|
|
186
186
|
"span",
|
|
187
187
|
{
|
|
188
188
|
className: "dot",
|
|
189
189
|
style: {
|
|
190
190
|
backgroundColor: t[c % t.length],
|
|
191
|
-
animationDelay: d === "ltr" ? `${c *
|
|
191
|
+
animationDelay: d === "ltr" ? `${c * h}ms` : `${(i - 1 - c) * h}ms`
|
|
192
192
|
}
|
|
193
193
|
},
|
|
194
194
|
c
|
|
195
195
|
)) });
|
|
196
|
-
},
|
|
196
|
+
}, v = ({ spin: t = null, text: r = "인증중..." }) => {
|
|
197
197
|
const { busy: s } = y();
|
|
198
198
|
return t ?? s ? /* @__PURE__ */ e.jsxs(
|
|
199
199
|
"div",
|
|
@@ -219,7 +219,7 @@ const A = ({
|
|
|
219
219
|
role: "status",
|
|
220
220
|
children: [
|
|
221
221
|
/* @__PURE__ */ e.jsx(
|
|
222
|
-
|
|
222
|
+
R,
|
|
223
223
|
{
|
|
224
224
|
indicator: /* @__PURE__ */ e.jsx(
|
|
225
225
|
A,
|
|
@@ -239,48 +239,88 @@ const A = ({
|
|
|
239
239
|
]
|
|
240
240
|
}
|
|
241
241
|
) : null;
|
|
242
|
-
},
|
|
242
|
+
}, te = () => {
|
|
243
243
|
const { reauthWithPin: t } = y();
|
|
244
|
-
return /* @__PURE__ */ e.jsx(
|
|
245
|
-
/* @__PURE__ */ e.jsx(
|
|
246
|
-
/* @__PURE__ */ e.jsx(
|
|
244
|
+
return /* @__PURE__ */ e.jsx(m, { idleMs: 30 * 6e4, onUnlock: async (r) => D ? !0 : !!r && await t(r), children: /* @__PURE__ */ e.jsx(B, { getPopupContainer: () => document.getElementById("app-shell") || document.body, children: /* @__PURE__ */ e.jsxs("div", { id: "app-shell", children: [
|
|
245
|
+
/* @__PURE__ */ e.jsx(v, {}),
|
|
246
|
+
/* @__PURE__ */ e.jsx(j, {})
|
|
247
247
|
] }) }) });
|
|
248
|
-
},
|
|
249
|
-
/* @__PURE__ */ e.jsx(
|
|
250
|
-
/* @__PURE__ */ e.jsx(
|
|
251
|
-
] }),
|
|
248
|
+
}, re = () => /* @__PURE__ */ e.jsxs("div", { children: [
|
|
249
|
+
/* @__PURE__ */ e.jsx(v, {}),
|
|
250
|
+
/* @__PURE__ */ e.jsx(j, {})
|
|
251
|
+
] }), U = ({
|
|
252
252
|
isActive: t,
|
|
253
253
|
instance: r,
|
|
254
254
|
params: s
|
|
255
|
-
}) =>
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
255
|
+
}) => {
|
|
256
|
+
const { activeMenuId: a, closeTab: o } = P(), n = () => {
|
|
257
|
+
a && o(a);
|
|
258
|
+
};
|
|
259
|
+
return r ? /* @__PURE__ */ e.jsx(
|
|
260
|
+
"div",
|
|
261
|
+
{
|
|
262
|
+
style: {
|
|
263
|
+
position: "absolute",
|
|
264
|
+
top: 0,
|
|
265
|
+
left: 0,
|
|
266
|
+
width: "100%",
|
|
267
|
+
height: "100%",
|
|
268
|
+
visibility: t ? "visible" : "hidden",
|
|
269
|
+
opacity: t ? 1 : 0,
|
|
270
|
+
transition: "opacity 0.2s ease-in-out",
|
|
271
|
+
pointerEvents: t ? "auto" : "none"
|
|
272
|
+
},
|
|
273
|
+
children: /* @__PURE__ */ e.jsx(V, { children: /* @__PURE__ */ e.jsx(I, { fallback: null, children: r && k.createElement(r, { params: s }) }) })
|
|
274
|
+
}
|
|
275
|
+
) : /* @__PURE__ */ e.jsx(
|
|
276
|
+
"div",
|
|
277
|
+
{
|
|
278
|
+
style: {
|
|
279
|
+
position: "absolute",
|
|
280
|
+
top: 0,
|
|
281
|
+
left: 0,
|
|
282
|
+
width: "100%",
|
|
283
|
+
height: "100%",
|
|
284
|
+
display: "flex",
|
|
285
|
+
justifyContent: "center",
|
|
286
|
+
alignItems: "center",
|
|
287
|
+
visibility: t ? "visible" : "hidden",
|
|
288
|
+
opacity: t ? 1 : 0,
|
|
289
|
+
transition: "opacity 0.2s ease-in-out",
|
|
290
|
+
pointerEvents: t ? "auto" : "none"
|
|
291
|
+
},
|
|
292
|
+
children: /* @__PURE__ */ e.jsx(
|
|
293
|
+
"div",
|
|
294
|
+
{
|
|
295
|
+
style: {
|
|
296
|
+
width: 500,
|
|
297
|
+
maxWidth: "90%",
|
|
298
|
+
background: "#fff",
|
|
299
|
+
borderRadius: 16,
|
|
300
|
+
boxShadow: "0 8px 30px rgba(0,0,0,0.05)",
|
|
301
|
+
padding: 24
|
|
302
|
+
},
|
|
303
|
+
children: /* @__PURE__ */ e.jsx(
|
|
304
|
+
b,
|
|
305
|
+
{
|
|
306
|
+
icon: /* @__PURE__ */ e.jsx(O, { twoToneColor: "#69b1ff" }),
|
|
307
|
+
status: "warning",
|
|
308
|
+
title: "등록된 메뉴 정보가 없거나 유효한 메뉴가 아닙니다.",
|
|
309
|
+
subTitle: /* @__PURE__ */ e.jsx($.Text, { type: "secondary", children: "자세한 내용은 관리자에게 문의바랍니다." }),
|
|
310
|
+
extra: /* @__PURE__ */ e.jsx(L, { children: /* @__PURE__ */ e.jsx(w, { icon: /* @__PURE__ */ e.jsx(N, {}), onClick: n, children: "탭 닫기" }) })
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
}
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
}, se = F(U);
|
|
278
318
|
export {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
319
|
+
V as E,
|
|
320
|
+
ee as P,
|
|
321
|
+
se as V,
|
|
322
|
+
v as a,
|
|
323
|
+
te as b,
|
|
324
|
+
re as c
|
|
285
325
|
};
|
|
286
|
-
//# sourceMappingURL=ViewContainer-
|
|
326
|
+
//# sourceMappingURL=ViewContainer-CMbN_tYW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewContainer-Du3IzFYo.js","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 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 { ScreenProtectProvider, useLock } from \"@/provider/contexts/ScreenProtectContext\";\r\nimport { useCallback, useEffect, useRef, useState } 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: React.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: React.FC<{\r\n isActive: boolean;\r\n flagged: boolean;\r\n tabKey: string;\r\n onUnlock: () => void;\r\n children: React.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 React.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\n export default PrivateProtectedOverlay;","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/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 React, { memo, Suspense } from \"react\";\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?: 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(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","dots","baseStyle","perDotDelay","i","ProgressOverlay","spin","text","busy","useAuth","Spin","ProtectedLayout","reauthWithPin","pin","isLocal","ConfigProvider","Outlet","PublicLayout","ViewContainer","instance","params","Suspense","React","ViewContainer$1","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ViewContainer-CMbN_tYW.js","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 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 { ScreenProtectProvider, useLock } from \"@/provider/contexts/ScreenProtectContext\";\r\nimport { useCallback, useEffect, useRef, useState } 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: React.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: React.FC<{\r\n isActive: boolean;\r\n flagged: boolean;\r\n tabKey: string;\r\n onUnlock: () => void;\r\n children: React.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 React.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\n export default PrivateProtectedOverlay;","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/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 React, { 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?: React.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 && React.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","React","ExclamationCircleTwoTone","Typography","Space","CloseOutlined","ViewContainer$1","memo"],"mappings":"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"}
|