@bwg-ui/core 1.1.24 → 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-BQ3gHLbr.cjs.map +1 -0
- package/dist/chunks/{AuthContext-Ei2P-z4d.js → AuthContext-CVizgYxY.js} +14 -10
- package/dist/chunks/AuthContext-CVizgYxY.js.map +1 -0
- 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-B79pseQM.js → BwgSwitch-DdHo4gYR.js} +66 -66
- package/dist/chunks/BwgSwitch-DdHo4gYR.js.map +1 -0
- package/dist/chunks/{BwgUploader-BcVlE61B.js → BwgUploader-BUmFmeuS.js} +639 -639
- package/dist/chunks/BwgUploader-BUmFmeuS.js.map +1 -0
- package/dist/chunks/BwgUploader-Djhl4lIt.cjs +3 -0
- package/dist/chunks/BwgUploader-Djhl4lIt.cjs.map +1 -0
- package/dist/chunks/LoadingOverlay-Uf6xy04v.js +19 -0
- package/dist/chunks/LoadingOverlay-Uf6xy04v.js.map +1 -0
- package/dist/chunks/LoadingOverlay-jdMzdB-z.cjs +2 -0
- package/dist/chunks/LoadingOverlay-jdMzdB-z.cjs.map +1 -0
- package/dist/chunks/{SSOHandler-CkPcSHIm.js → SSOHandler-CR0nR3rJ.js} +8132 -8085
- package/dist/chunks/SSOHandler-CR0nR3rJ.js.map +1 -0
- package/dist/chunks/{SSOHandler-DiW4Ft9i.cjs → SSOHandler-DQG0Jp4V.cjs} +53 -53
- package/dist/chunks/SSOHandler-DQG0Jp4V.cjs.map +1 -0
- package/dist/chunks/ScreenProtectContext-BMsPPcTX.js +154 -0
- package/dist/chunks/ScreenProtectContext-BMsPPcTX.js.map +1 -0
- package/dist/chunks/ScreenProtectContext-DrCGlcTs.cjs +2 -0
- package/dist/chunks/ScreenProtectContext-DrCGlcTs.cjs.map +1 -0
- package/dist/chunks/SearchBoxContext-DY6lES-W.cjs +2 -0
- package/dist/chunks/SearchBoxContext-DY6lES-W.cjs.map +1 -0
- package/dist/chunks/{SearchBoxContext-BCvEYyFk.js → SearchBoxContext-Dtzo_rJd.js} +25 -27
- package/dist/chunks/SearchBoxContext-Dtzo_rJd.js.map +1 -0
- package/dist/chunks/ViewContainer-BfiTFvLP.cjs +36 -0
- package/dist/chunks/ViewContainer-BfiTFvLP.cjs.map +1 -0
- package/dist/chunks/{ViewContainer-CjpJqoGG.js → ViewContainer-CTl3_56W.js} +128 -116
- package/dist/chunks/ViewContainer-CTl3_56W.js.map +1 -0
- package/dist/chunks/apiUtils-D9Vn1gwZ.cjs +3 -0
- package/dist/chunks/apiUtils-D9Vn1gwZ.cjs.map +1 -0
- package/dist/chunks/{apiUtils-DxzLqPhU.js → apiUtils-DPUgfmKk.js} +57 -48
- package/dist/chunks/apiUtils-DPUgfmKk.js.map +1 -0
- package/dist/chunks/{codeStore-CfI4Wh5M.js → codeStore-BrCfe9K3.js} +2 -2
- package/dist/chunks/{codeStore-CfI4Wh5M.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-bHd8azE6.js → core-BBMCFpHx.js} +2 -2
- package/dist/chunks/{core-bHd8azE6.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-BQYwLKgk.js → enc-base64-DAsYWbA2.js} +3 -3
- package/dist/chunks/{enc-base64-BQYwLKgk.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-Cemc-26t.js → favoriteStore-SyAjqLG8.js} +2 -2
- package/dist/chunks/{favoriteStore-Cemc-26t.js.map → favoriteStore-SyAjqLG8.js.map} +1 -1
- package/dist/chunks/{popupStore-Bi6o78lP.js → popupStore-BrKcPw7K.js} +2 -2
- package/dist/chunks/{popupStore-Bi6o78lP.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-BZfJs28k.js → sha256-D80RpYO2.js} +3 -3
- package/dist/chunks/{sha256-BZfJs28k.js.map → sha256-D80RpYO2.js.map} +1 -1
- package/dist/chunks/{usePopup-BSqsnSz7.js → usePopup-DnfKRiYs.js} +27 -27
- package/dist/chunks/usePopup-DnfKRiYs.js.map +1 -0
- package/dist/chunks/usePopup-Domnpg55.cjs +2 -0
- package/dist/chunks/usePopup-Domnpg55.cjs.map +1 -0
- package/dist/components/common/BookmarkMngModal.d.ts +1 -1
- package/dist/components/common/BookmarkMngModal.d.ts.map +1 -1
- package/dist/components/common/BookmarkPopver.d.ts +2 -2
- package/dist/components/common/BookmarkPopver.d.ts.map +1 -1
- package/dist/components/common/BwgButtonGroup.d.ts +5 -5
- package/dist/components/common/BwgButtonGroup.d.ts.map +1 -1
- package/dist/components/common/BwgCmptArea.d.ts +7 -7
- package/dist/components/common/BwgCmptArea.d.ts.map +1 -1
- package/dist/components/common/BwgCol.d.ts +2 -1
- package/dist/components/common/BwgCol.d.ts.map +1 -1
- package/dist/components/common/BwgConfigProvider.d.ts +2 -2
- package/dist/components/common/BwgConfigProvider.d.ts.map +1 -1
- package/dist/components/common/BwgDetail.d.ts +2 -1
- package/dist/components/common/BwgDetail.d.ts.map +1 -1
- package/dist/components/common/BwgDraggable.d.ts +5 -5
- package/dist/components/common/BwgDraggable.d.ts.map +1 -1
- package/dist/components/common/BwgDrawer.d.ts +2 -1
- package/dist/components/common/BwgDrawer.d.ts.map +1 -1
- package/dist/components/common/BwgEditor.d.ts +5 -5
- package/dist/components/common/BwgEditor.d.ts.map +1 -1
- package/dist/components/common/BwgGrid.d.ts +8 -8
- package/dist/components/common/BwgGrid.d.ts.map +1 -1
- package/dist/components/common/BwgInfoArea.d.ts +4 -4
- package/dist/components/common/BwgInfoArea.d.ts.map +1 -1
- package/dist/components/common/BwgPopup.d.ts +3 -3
- package/dist/components/common/BwgPopup.d.ts.map +1 -1
- package/dist/components/common/BwgRow.d.ts +2 -1
- package/dist/components/common/BwgRow.d.ts.map +1 -1
- package/dist/components/common/BwgTitleBox.d.ts +5 -4
- package/dist/components/common/BwgTitleBox.d.ts.map +1 -1
- package/dist/components/common/BwgView.d.ts +4 -4
- package/dist/components/common/BwgView.d.ts.map +1 -1
- package/dist/components/common/ContentBox.d.ts +3 -3
- package/dist/components/common/ContentBox.d.ts.map +1 -1
- package/dist/components/common/ContentLayOut.d.ts +6 -5
- package/dist/components/common/ContentLayOut.d.ts.map +1 -1
- package/dist/components/common/GlobalConfigProvider.d.ts +2 -2
- package/dist/components/common/GlobalConfigProvider.d.ts.map +1 -1
- package/dist/components/common/QuickServiceToggle.d.ts +4 -4
- package/dist/components/common/QuickServiceToggle.d.ts.map +1 -1
- package/dist/components/common/SSOHandler.d.ts +2 -1
- package/dist/components/common/SSOHandler.d.ts.map +1 -1
- package/dist/components/common/SearchBox.d.ts +5 -4
- package/dist/components/common/SearchBox.d.ts.map +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.js +2 -2
- package/dist/components/core/BwgButton.d.ts +3 -2
- package/dist/components/core/BwgButton.d.ts.map +1 -1
- package/dist/components/core/BwgDatePicker.d.ts +3 -3
- package/dist/components/core/BwgDatePicker.d.ts.map +1 -1
- package/dist/components/core/BwgDownload.d.ts +2 -2
- package/dist/components/core/BwgDownload.d.ts.map +1 -1
- package/dist/components/core/BwgForm.d.ts +2 -1
- package/dist/components/core/BwgForm.d.ts.map +1 -1
- package/dist/components/core/BwgFormItem.d.ts +4 -4
- package/dist/components/core/BwgFormItem.d.ts.map +1 -1
- package/dist/components/core/BwgInput.d.ts +2 -2
- package/dist/components/core/BwgInput.d.ts.map +1 -1
- package/dist/components/core/BwgLargeUploader.d.ts +2 -2
- package/dist/components/core/BwgLargeUploader.d.ts.map +1 -1
- package/dist/components/core/BwgMaskedInput.d.ts +2 -2
- package/dist/components/core/BwgMaskedInput.d.ts.map +1 -1
- package/dist/components/core/BwgMaskedPicker.d.ts +2 -2
- package/dist/components/core/BwgMaskedPicker.d.ts.map +1 -1
- package/dist/components/core/BwgRangePicker.d.ts +3 -3
- package/dist/components/core/BwgRangePicker.d.ts.map +1 -1
- package/dist/components/core/BwgSearch.d.ts +1 -1
- package/dist/components/core/BwgSearch.d.ts.map +1 -1
- package/dist/components/core/BwgUploader.d.ts +2 -2
- package/dist/components/core/BwgUploader.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/ErrorBound.d.ts +3 -3
- package/dist/components/layout/ErrorBound.d.ts.map +1 -1
- package/dist/components/layout/LoadingOverlay.d.ts +3 -2
- package/dist/components/layout/LoadingOverlay.d.ts.map +1 -1
- package/dist/components/layout/PrivateProtectedOverlay.d.ts +3 -2
- package/dist/components/layout/PrivateProtectedOverlay.d.ts.map +1 -1
- package/dist/components/layout/ProgressOverlay.d.ts +2 -2
- package/dist/components/layout/ProgressOverlay.d.ts.map +1 -1
- package/dist/components/layout/ViewContainer.d.ts +3 -3
- package/dist/components/layout/ViewContainer.d.ts.map +1 -1
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +2 -2
- package/dist/components/popup/MenuReport.d.ts +2 -2
- package/dist/components/popup/MenuReport.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +14 -14
- package/dist/provider/contexts/AuthContext.d.ts +3 -2
- package/dist/provider/contexts/AuthContext.d.ts.map +1 -1
- package/dist/provider/contexts/CommonCodeContext.d.ts +2 -2
- package/dist/provider/contexts/CommonCodeContext.d.ts.map +1 -1
- package/dist/provider/contexts/ScreenProtectContext.d.ts +5 -5
- package/dist/provider/contexts/ScreenProtectContext.d.ts.map +1 -1
- package/dist/provider/contexts/SearchBoxContext.d.ts +3 -3
- package/dist/provider/contexts/SearchBoxContext.d.ts.map +1 -1
- package/dist/provider/contexts/ServiceCodeContext.d.ts +2 -2
- package/dist/provider/contexts/ServiceCodeContext.d.ts.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/stores/index.js +6 -6
- package/dist/stores/menuViewStore.d.ts +6 -5
- package/dist/stores/menuViewStore.d.ts.map +1 -1
- 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/AuthContext-CXng9fj0.cjs.map +0 -1
- package/dist/chunks/AuthContext-Ei2P-z4d.js.map +0 -1
- package/dist/chunks/BwgSpace-b0hmM1Ht.cjs +0 -2
- package/dist/chunks/BwgSwitch-B79pseQM.js.map +0 -1
- package/dist/chunks/BwgSwitch-CAI-kEaM.cjs +0 -2
- package/dist/chunks/BwgSwitch-CAI-kEaM.cjs.map +0 -1
- package/dist/chunks/BwgUploader-BcVlE61B.js.map +0 -1
- package/dist/chunks/BwgUploader-DaNV2URT.cjs +0 -3
- package/dist/chunks/BwgUploader-DaNV2URT.cjs.map +0 -1
- package/dist/chunks/LoadingOverlay-DAZJF5wg.js +0 -19
- package/dist/chunks/LoadingOverlay-DAZJF5wg.js.map +0 -1
- package/dist/chunks/LoadingOverlay-DcmKvoZA.cjs +0 -2
- package/dist/chunks/LoadingOverlay-DcmKvoZA.cjs.map +0 -1
- package/dist/chunks/SSOHandler-CkPcSHIm.js.map +0 -1
- package/dist/chunks/SSOHandler-DiW4Ft9i.cjs.map +0 -1
- package/dist/chunks/ScreenProtectContext-3my4PHFa.js +0 -154
- package/dist/chunks/ScreenProtectContext-3my4PHFa.js.map +0 -1
- package/dist/chunks/ScreenProtectContext-CVuXrJm6.cjs +0 -2
- package/dist/chunks/ScreenProtectContext-CVuXrJm6.cjs.map +0 -1
- package/dist/chunks/SearchBoxContext-BCvEYyFk.js.map +0 -1
- package/dist/chunks/SearchBoxContext-DwFDOyYG.cjs +0 -2
- package/dist/chunks/SearchBoxContext-DwFDOyYG.cjs.map +0 -1
- package/dist/chunks/ViewContainer-Bhq22_B3.cjs +0 -36
- package/dist/chunks/ViewContainer-Bhq22_B3.cjs.map +0 -1
- package/dist/chunks/ViewContainer-CjpJqoGG.js.map +0 -1
- package/dist/chunks/apiUtils-BZ6s0_NI.cjs +0 -3
- package/dist/chunks/apiUtils-BZ6s0_NI.cjs.map +0 -1
- package/dist/chunks/apiUtils-DxzLqPhU.js.map +0 -1
- 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-BSqsnSz7.js.map +0 -1
- package/dist/chunks/usePopup-D2JEuDrO.cjs +0 -2
- package/dist/chunks/usePopup-D2JEuDrO.cjs.map +0 -1
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { j as t } from "./jsx-runtime-Dpn_P65e.js";
|
|
2
|
-
import { Input as F } from "antd";
|
|
3
|
-
import { useContext as R, createContext as T, useState as v, useRef as D, useEffect as E, useMemo as M } from "react";
|
|
4
|
-
const L = T(null), V = () => {
|
|
5
|
-
const i = R(L);
|
|
6
|
-
if (!i)
|
|
7
|
-
throw new Error("useLock must be used within ScreenProtectProvider");
|
|
8
|
-
return i;
|
|
9
|
-
}, W = ({
|
|
10
|
-
children: i,
|
|
11
|
-
idleMs: x = 1e4,
|
|
12
|
-
onUnlock: m,
|
|
13
|
-
persistLocked: n = !0,
|
|
14
|
-
storageKey: s = "inactivityLocked",
|
|
15
|
-
eventTarget: a,
|
|
16
|
-
overlayScope: f = "global",
|
|
17
|
-
overlayId: r = "lock-overlay-root",
|
|
18
|
-
overlayPosition: b = "fixed"
|
|
19
|
-
}) => {
|
|
20
|
-
const I = n && typeof window < "u" && window.localStorage.getItem(s) === "1", [o, k] = v(I), [p, P] = v(x), h = Number.isFinite(p) && p > 0, l = D(null), S = () => {
|
|
21
|
-
try {
|
|
22
|
-
n && window.localStorage.setItem(s, "1");
|
|
23
|
-
} catch {
|
|
24
|
-
}
|
|
25
|
-
k(!0);
|
|
26
|
-
}, g = async (c) => {
|
|
27
|
-
if (!(m && !await m(c))) {
|
|
28
|
-
try {
|
|
29
|
-
n && window.localStorage.removeItem(s);
|
|
30
|
-
} catch {
|
|
31
|
-
}
|
|
32
|
-
k(!1), h && y();
|
|
33
|
-
}
|
|
34
|
-
}, N = () => {
|
|
35
|
-
try {
|
|
36
|
-
n && window.localStorage.setItem(s, "1");
|
|
37
|
-
} catch {
|
|
38
|
-
}
|
|
39
|
-
k(!0);
|
|
40
|
-
}, y = () => {
|
|
41
|
-
h && (l.current && window.clearTimeout(l.current), l.current = window.setTimeout(() => {
|
|
42
|
-
N();
|
|
43
|
-
}, p));
|
|
44
|
-
};
|
|
45
|
-
E(() => {
|
|
46
|
-
if (!h) return;
|
|
47
|
-
const c = () => {
|
|
48
|
-
o || y();
|
|
49
|
-
}, d = { passive: !0 }, u = [
|
|
50
|
-
"pointermove",
|
|
51
|
-
"pointerdown",
|
|
52
|
-
"keydown",
|
|
53
|
-
"wheel",
|
|
54
|
-
"touchstart"
|
|
55
|
-
], w = a ?? window;
|
|
56
|
-
return u.forEach((e) => w.addEventListener(e, c, d)), y(), () => {
|
|
57
|
-
l.current && window.clearTimeout(l.current), u.forEach((e) => w.removeEventListener(e, c));
|
|
58
|
-
};
|
|
59
|
-
}, [p, o, a, h]), E(() => {
|
|
60
|
-
if (!o) return;
|
|
61
|
-
const c = (e) => {
|
|
62
|
-
const j = document.getElementById(r);
|
|
63
|
-
j && j.contains(e.target) || (e.stopPropagation(), e.preventDefault());
|
|
64
|
-
}, d = { capture: !0 }, u = [
|
|
65
|
-
"pointerdown",
|
|
66
|
-
"pointerup",
|
|
67
|
-
"pointermove",
|
|
68
|
-
"click",
|
|
69
|
-
"wheel",
|
|
70
|
-
"keydown",
|
|
71
|
-
"keyup",
|
|
72
|
-
"touchstart",
|
|
73
|
-
"touchmove"
|
|
74
|
-
], w = f === "scoped" ? a ?? window : window;
|
|
75
|
-
return u.forEach((e) => w.addEventListener(e, c, d)), () => u.forEach((e) => w.removeEventListener(e, c, d));
|
|
76
|
-
}, [o, f, r, a]);
|
|
77
|
-
const C = M(
|
|
78
|
-
() => ({ locked: o, lock: S, unlock: g, setIdleMs: P }),
|
|
79
|
-
[o]
|
|
80
|
-
);
|
|
81
|
-
return /* @__PURE__ */ t.jsxs(L.Provider, { value: C, children: [
|
|
82
|
-
/* @__PURE__ */ t.jsx(
|
|
83
|
-
"div",
|
|
84
|
-
{
|
|
85
|
-
style: { width: "100%", height: "100%" },
|
|
86
|
-
...o ? { inert: "" } : {},
|
|
87
|
-
...o ? { "aria-hidden": !0 } : {},
|
|
88
|
-
children: i
|
|
89
|
-
}
|
|
90
|
-
),
|
|
91
|
-
o && /* @__PURE__ */ t.jsx(
|
|
92
|
-
O,
|
|
93
|
-
{
|
|
94
|
-
onUnlock: g,
|
|
95
|
-
overlayId: r,
|
|
96
|
-
overlayPosition: b
|
|
97
|
-
}
|
|
98
|
-
)
|
|
99
|
-
] });
|
|
100
|
-
}, O = ({
|
|
101
|
-
onUnlock: i,
|
|
102
|
-
overlayId: x = "lock-overlay-root",
|
|
103
|
-
overlayPosition: m = "fixed"
|
|
104
|
-
}) => {
|
|
105
|
-
const [n] = v(4), [s, a] = v("");
|
|
106
|
-
return /* @__PURE__ */ t.jsx(
|
|
107
|
-
"div",
|
|
108
|
-
{
|
|
109
|
-
id: x,
|
|
110
|
-
"aria-modal": "true",
|
|
111
|
-
role: "dialog",
|
|
112
|
-
"aria-label": "Locked screen",
|
|
113
|
-
style: {
|
|
114
|
-
position: m,
|
|
115
|
-
inset: 0,
|
|
116
|
-
background: "rgba(12, 14, 18, 0.85)",
|
|
117
|
-
backdropFilter: "blur(4px)",
|
|
118
|
-
display: "grid",
|
|
119
|
-
placeItems: "center",
|
|
120
|
-
zIndex: 9999
|
|
121
|
-
},
|
|
122
|
-
children: /* @__PURE__ */ t.jsxs("div", { className: "lockscreen-form", style: { width: 420, maxWidth: "92vw" }, children: [
|
|
123
|
-
/* @__PURE__ */ t.jsx("div", { className: "lock-icon-wrap", children: /* @__PURE__ */ t.jsx("span", { className: "lock-icon-box" }) }),
|
|
124
|
-
/* @__PURE__ */ t.jsx("h2", { children: "잠금됨" }),
|
|
125
|
-
/* @__PURE__ */ t.jsx("p", { children: "PIN 번호를 입력하세요" }),
|
|
126
|
-
/* @__PURE__ */ t.jsx(
|
|
127
|
-
"div",
|
|
128
|
-
{
|
|
129
|
-
className: "lock-ipt-wrap",
|
|
130
|
-
style: { display: "flex", justifyContent: "center" },
|
|
131
|
-
children: /* @__PURE__ */ t.jsx(
|
|
132
|
-
F.OTP,
|
|
133
|
-
{
|
|
134
|
-
mask: "*",
|
|
135
|
-
autoFocus: !0,
|
|
136
|
-
length: n,
|
|
137
|
-
value: s,
|
|
138
|
-
onChange: (f) => {
|
|
139
|
-
const r = (f ?? "").replace(/\D/g, "").slice(0, n);
|
|
140
|
-
a(r), r.length === n && i(r);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
)
|
|
144
|
-
}
|
|
145
|
-
)
|
|
146
|
-
] })
|
|
147
|
-
}
|
|
148
|
-
);
|
|
149
|
-
};
|
|
150
|
-
export {
|
|
151
|
-
W as S,
|
|
152
|
-
V as u
|
|
153
|
-
};
|
|
154
|
-
//# sourceMappingURL=ScreenProtectContext-3my4PHFa.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenProtectContext-3my4PHFa.js","sources":["../../src/provider/contexts/ScreenProtectContext.tsx"],"sourcesContent":["import { Input } from \"antd\";\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\n/**\r\n * ScreenProtectProvider\r\n * - 전역용(기본값): window 활동감지 + fixed 전체 오버레이\r\n * - 탭스코프용(옵션): eventTarget 활동감지 + absolute 탭 영역 오버레이\r\n */\r\n\r\n// ===================== Lock Context =====================\r\ntype LockContextValue = {\r\n locked: boolean;\r\n lock: () => void;\r\n unlock: (pin?: string) => Promise<void> | void;\r\n setIdleMs: (ms: number) => void;\r\n};\r\n\r\nconst LockContext = createContext<LockContextValue | null>(null);\r\n\r\nexport const useLock = () => {\r\n const ctx = useContext(LockContext);\r\n if (!ctx)\r\n throw new Error(\"useLock must be used within ScreenProtectProvider\");\r\n return ctx;\r\n};\r\n\r\n// ===================== Provider =====================\r\nexport const ScreenProtectProvider: React.FC<{\r\n children: React.ReactNode;\r\n idleMs?: number;\r\n onUnlock?: (pin?: string) => Promise<boolean> | boolean;\r\n persistLocked?: boolean;\r\n storageKey?: string;\r\n\r\n /** ▼ 탭 스코프용 확장 옵션 */\r\n eventTarget?: EventTarget | null; // 활동 감지/가드 대상 (기본: window)\r\n overlayScope?: \"global\" | \"scoped\"; // 캡처가드 범위\r\n overlayId?: string; // 오버레이 DOM id\r\n overlayPosition?: \"fixed\" | \"absolute\"; // 오버레이 위치 (전역: fixed, 탭: absolute)\r\n}> = ({\r\n children,\r\n idleMs = 10_000,\r\n onUnlock,\r\n persistLocked = true,\r\n storageKey = \"inactivityLocked\",\r\n eventTarget,\r\n overlayScope = \"global\",\r\n overlayId = \"lock-overlay-root\",\r\n overlayPosition = \"fixed\",\r\n}) => {\r\n const initialLocked =\r\n persistLocked &&\r\n typeof window !== \"undefined\" &&\r\n window.localStorage.getItem(storageKey) === \"1\";\r\n\r\n const [locked, setLocked] = useState(initialLocked);\r\n const [idle, setIdle] = useState(idleMs);\r\n const isIdleEnabled = Number.isFinite(idle) && idle > 0;\r\n const timerRef = useRef<number | null>(null);\r\n\r\n const lock = () => {\r\n try {\r\n if (persistLocked) window.localStorage.setItem(storageKey, \"1\");\r\n } catch {}\r\n setLocked(true);\r\n };\r\n\r\n const unlock = async (pin?: string) => {\r\n if (onUnlock) {\r\n const ok = await onUnlock(pin);\r\n if (!ok) return;\r\n }\r\n try {\r\n if (persistLocked) window.localStorage.removeItem(storageKey);\r\n } catch {}\r\n setLocked(false);\r\n if (isIdleEnabled) resetTimer();\r\n };\r\n\r\n const doLock = () => {\r\n try {\r\n if (persistLocked) window.localStorage.setItem(storageKey, \"1\");\r\n } catch {}\r\n setLocked(true);\r\n };\r\n\r\n const resetTimer = () => {\r\n if (!isIdleEnabled) return;\r\n if (timerRef.current) window.clearTimeout(timerRef.current);\r\n timerRef.current = window.setTimeout(() => {\r\n doLock();\r\n }, idle);\r\n };\r\n\r\n // 활동 감지: window → target(옵션)으로 스코프 전환 가능\r\n useEffect(() => {\r\n if (!isIdleEnabled) return;\r\n const onActivity = () => {\r\n if (!locked) resetTimer();\r\n };\r\n const opts = { passive: true } as AddEventListenerOptions;\r\n const evts = [\r\n \"pointermove\",\r\n \"pointerdown\",\r\n \"keydown\",\r\n \"wheel\",\r\n \"touchstart\",\r\n ];\r\n\r\n const target = (eventTarget ?? window) as any;\r\n evts.forEach((e) => target.addEventListener(e, onActivity, opts));\r\n resetTimer();\r\n\r\n return () => {\r\n if (timerRef.current) window.clearTimeout(timerRef.current);\r\n evts.forEach((e) => target.removeEventListener(e, onActivity as any));\r\n };\r\n }, [idle, locked, eventTarget, isIdleEnabled]);\r\n\r\n // 잠금 중 캡처가드: 전역(global) 또는 스코프(scoped)로 범위 선택\r\n useEffect(() => {\r\n if (!locked) return;\r\n\r\n const stop = (e: Event) => {\r\n const overlay = document.getElementById(overlayId);\r\n if (overlay && overlay.contains(e.target as Node)) return; // 오버레이 내부는 통과\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n const opts = { capture: true } as AddEventListenerOptions;\r\n const evs = [\r\n \"pointerdown\",\r\n \"pointerup\",\r\n \"pointermove\",\r\n \"click\",\r\n \"wheel\",\r\n \"keydown\",\r\n \"keyup\",\r\n \"touchstart\",\r\n \"touchmove\",\r\n ];\r\n\r\n // 전역이면 window, 스코프면 eventTarget(없으면 window)\r\n const guardTarget = (\r\n overlayScope === \"scoped\" ? eventTarget ?? window : window\r\n ) as any;\r\n evs.forEach((t) => guardTarget.addEventListener(t, stop, opts));\r\n return () =>\r\n evs.forEach((t) => guardTarget.removeEventListener(t, stop as any, opts));\r\n }, [locked, overlayScope, overlayId, eventTarget]);\r\n\r\n const value = useMemo(\r\n () => ({ locked, lock, unlock, setIdleMs: setIdle }),\r\n [locked]\r\n );\r\n\r\n return (\r\n <LockContext.Provider value={value}>\r\n <div\r\n style={{ width: \"100%\", height: \"100%\" }}\r\n {...(locked ? ({ inert: \"\" } as any) : {})}\r\n {...(locked ? { \"aria-hidden\": true } : {})}\r\n >\r\n {children}\r\n </div>\r\n {locked && (\r\n <LockOverlay\r\n onUnlock={unlock}\r\n overlayId={overlayId}\r\n overlayPosition={overlayPosition}\r\n />\r\n )}\r\n </LockContext.Provider>\r\n );\r\n};\r\n\r\nconst LockOverlay: React.FC<{\r\n onUnlock: (pin?: string) => void;\r\n overlayId?: string;\r\n overlayPosition?: \"fixed\" | \"absolute\";\r\n}> = ({\r\n onUnlock,\r\n overlayId = \"lock-overlay-root\",\r\n overlayPosition = \"fixed\",\r\n}) => {\r\n const [pinLen] = useState(4);\r\n const [val, setVal] = useState(\"\");\r\n\r\n return (\r\n <div\r\n id={overlayId}\r\n aria-modal=\"true\"\r\n role=\"dialog\"\r\n aria-label=\"Locked screen\"\r\n style={{\r\n position: overlayPosition,\r\n inset: 0,\r\n background: \"rgba(12, 14, 18, 0.85)\",\r\n backdropFilter: \"blur(4px)\",\r\n display: \"grid\",\r\n placeItems: \"center\",\r\n zIndex: 9999,\r\n }}\r\n >\r\n <div className=\"lockscreen-form\" style={{ width: 420, maxWidth: \"92vw\" }}>\r\n <div className=\"lock-icon-wrap\">\r\n <span className=\"lock-icon-box\"></span>\r\n </div>\r\n <h2>잠금됨</h2>\r\n <p>PIN 번호를 입력하세요</p>\r\n <div\r\n className=\"lock-ipt-wrap\"\r\n style={{ display: \"flex\", justifyContent: \"center\" }}\r\n >\r\n <Input.OTP\r\n mask={\"*\"}\r\n autoFocus\r\n length={pinLen}\r\n value={val}\r\n onChange={(v) => {\r\n const next = (v ?? \"\").replace(/\\D/g, \"\").slice(0, pinLen);\r\n setVal(next);\r\n if (next.length === pinLen) onUnlock(next);\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["LockContext","createContext","useLock","ctx","useContext","ScreenProtectProvider","children","idleMs","onUnlock","persistLocked","storageKey","eventTarget","overlayScope","overlayId","overlayPosition","initialLocked","locked","setLocked","useState","idle","setIdle","isIdleEnabled","timerRef","useRef","lock","unlock","pin","resetTimer","doLock","useEffect","onActivity","opts","evts","target","stop","overlay","evs","guardTarget","t","value","useMemo","jsxs","jsx","LockOverlay","pinLen","val","setVal","Input","v","next"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("./jsx-runtime-CeSfJrVB.cjs"),N=require("antd"),o=require("react"),g=o.createContext(null),C=()=>{const c=o.useContext(g);if(!c)throw new Error("useLock must be used within ScreenProtectProvider");return c},q=({children:c,idleMs:v=1e4,onUnlock:p,persistLocked:r=!0,storageKey:u="inactivityLocked",eventTarget:a,overlayScope:w="global",overlayId:s="lock-overlay-root",overlayPosition:R="fixed"})=>{const L=r&&typeof window<"u"&&window.localStorage.getItem(u)==="1",[n,k]=o.useState(L),[f,b]=o.useState(v),h=Number.isFinite(f)&&f>0,l=o.useRef(null),I=()=>{try{r&&window.localStorage.setItem(u,"1")}catch{}k(!0)},E=async i=>{if(!(p&&!await p(i))){try{r&&window.localStorage.removeItem(u)}catch{}k(!1),h&&j()}},P=()=>{try{r&&window.localStorage.setItem(u,"1")}catch{}k(!0)},j=()=>{h&&(l.current&&window.clearTimeout(l.current),l.current=window.setTimeout(()=>{P()},f))};o.useEffect(()=>{if(!h)return;const i=()=>{n||j()},d={passive:!0},x=["pointermove","pointerdown","keydown","wheel","touchstart"],m=a??window;return x.forEach(e=>m.addEventListener(e,i,d)),j(),()=>{l.current&&window.clearTimeout(l.current),x.forEach(e=>m.removeEventListener(e,i))}},[f,n,a,h]),o.useEffect(()=>{if(!n)return;const i=e=>{const y=document.getElementById(s);y&&y.contains(e.target)||(e.stopPropagation(),e.preventDefault())},d={capture:!0},x=["pointerdown","pointerup","pointermove","click","wheel","keydown","keyup","touchstart","touchmove"],m=w==="scoped"?a??window:window;return x.forEach(e=>m.addEventListener(e,i,d)),()=>x.forEach(e=>m.removeEventListener(e,i,d))},[n,w,s,a]);const S=o.useMemo(()=>({locked:n,lock:I,unlock:E,setIdleMs:b}),[n]);return t.jsxRuntimeExports.jsxs(g.Provider,{value:S,children:[t.jsxRuntimeExports.jsx("div",{style:{width:"100%",height:"100%"},...n?{inert:""}:{},...n?{"aria-hidden":!0}:{},children:c}),n&&t.jsxRuntimeExports.jsx(F,{onUnlock:E,overlayId:s,overlayPosition:R})]})},F=({onUnlock:c,overlayId:v="lock-overlay-root",overlayPosition:p="fixed"})=>{const[r]=o.useState(4),[u,a]=o.useState("");return t.jsxRuntimeExports.jsx("div",{id:v,"aria-modal":"true",role:"dialog","aria-label":"Locked screen",style:{position:p,inset:0,background:"rgba(12, 14, 18, 0.85)",backdropFilter:"blur(4px)",display:"grid",placeItems:"center",zIndex:9999},children:t.jsxRuntimeExports.jsxs("div",{className:"lockscreen-form",style:{width:420,maxWidth:"92vw"},children:[t.jsxRuntimeExports.jsx("div",{className:"lock-icon-wrap",children:t.jsxRuntimeExports.jsx("span",{className:"lock-icon-box"})}),t.jsxRuntimeExports.jsx("h2",{children:"잠금됨"}),t.jsxRuntimeExports.jsx("p",{children:"PIN 번호를 입력하세요"}),t.jsxRuntimeExports.jsx("div",{className:"lock-ipt-wrap",style:{display:"flex",justifyContent:"center"},children:t.jsxRuntimeExports.jsx(N.Input.OTP,{mask:"*",autoFocus:!0,length:r,value:u,onChange:w=>{const s=(w??"").replace(/\D/g,"").slice(0,r);a(s),s.length===r&&c(s)}})})]})})};exports.ScreenProtectProvider=q;exports.useLock=C;
|
|
2
|
-
//# sourceMappingURL=ScreenProtectContext-CVuXrJm6.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenProtectContext-CVuXrJm6.cjs","sources":["../../src/provider/contexts/ScreenProtectContext.tsx"],"sourcesContent":["import { Input } from \"antd\";\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\n/**\r\n * ScreenProtectProvider\r\n * - 전역용(기본값): window 활동감지 + fixed 전체 오버레이\r\n * - 탭스코프용(옵션): eventTarget 활동감지 + absolute 탭 영역 오버레이\r\n */\r\n\r\n// ===================== Lock Context =====================\r\ntype LockContextValue = {\r\n locked: boolean;\r\n lock: () => void;\r\n unlock: (pin?: string) => Promise<void> | void;\r\n setIdleMs: (ms: number) => void;\r\n};\r\n\r\nconst LockContext = createContext<LockContextValue | null>(null);\r\n\r\nexport const useLock = () => {\r\n const ctx = useContext(LockContext);\r\n if (!ctx)\r\n throw new Error(\"useLock must be used within ScreenProtectProvider\");\r\n return ctx;\r\n};\r\n\r\n// ===================== Provider =====================\r\nexport const ScreenProtectProvider: React.FC<{\r\n children: React.ReactNode;\r\n idleMs?: number;\r\n onUnlock?: (pin?: string) => Promise<boolean> | boolean;\r\n persistLocked?: boolean;\r\n storageKey?: string;\r\n\r\n /** ▼ 탭 스코프용 확장 옵션 */\r\n eventTarget?: EventTarget | null; // 활동 감지/가드 대상 (기본: window)\r\n overlayScope?: \"global\" | \"scoped\"; // 캡처가드 범위\r\n overlayId?: string; // 오버레이 DOM id\r\n overlayPosition?: \"fixed\" | \"absolute\"; // 오버레이 위치 (전역: fixed, 탭: absolute)\r\n}> = ({\r\n children,\r\n idleMs = 10_000,\r\n onUnlock,\r\n persistLocked = true,\r\n storageKey = \"inactivityLocked\",\r\n eventTarget,\r\n overlayScope = \"global\",\r\n overlayId = \"lock-overlay-root\",\r\n overlayPosition = \"fixed\",\r\n}) => {\r\n const initialLocked =\r\n persistLocked &&\r\n typeof window !== \"undefined\" &&\r\n window.localStorage.getItem(storageKey) === \"1\";\r\n\r\n const [locked, setLocked] = useState(initialLocked);\r\n const [idle, setIdle] = useState(idleMs);\r\n const isIdleEnabled = Number.isFinite(idle) && idle > 0;\r\n const timerRef = useRef<number | null>(null);\r\n\r\n const lock = () => {\r\n try {\r\n if (persistLocked) window.localStorage.setItem(storageKey, \"1\");\r\n } catch {}\r\n setLocked(true);\r\n };\r\n\r\n const unlock = async (pin?: string) => {\r\n if (onUnlock) {\r\n const ok = await onUnlock(pin);\r\n if (!ok) return;\r\n }\r\n try {\r\n if (persistLocked) window.localStorage.removeItem(storageKey);\r\n } catch {}\r\n setLocked(false);\r\n if (isIdleEnabled) resetTimer();\r\n };\r\n\r\n const doLock = () => {\r\n try {\r\n if (persistLocked) window.localStorage.setItem(storageKey, \"1\");\r\n } catch {}\r\n setLocked(true);\r\n };\r\n\r\n const resetTimer = () => {\r\n if (!isIdleEnabled) return;\r\n if (timerRef.current) window.clearTimeout(timerRef.current);\r\n timerRef.current = window.setTimeout(() => {\r\n doLock();\r\n }, idle);\r\n };\r\n\r\n // 활동 감지: window → target(옵션)으로 스코프 전환 가능\r\n useEffect(() => {\r\n if (!isIdleEnabled) return;\r\n const onActivity = () => {\r\n if (!locked) resetTimer();\r\n };\r\n const opts = { passive: true } as AddEventListenerOptions;\r\n const evts = [\r\n \"pointermove\",\r\n \"pointerdown\",\r\n \"keydown\",\r\n \"wheel\",\r\n \"touchstart\",\r\n ];\r\n\r\n const target = (eventTarget ?? window) as any;\r\n evts.forEach((e) => target.addEventListener(e, onActivity, opts));\r\n resetTimer();\r\n\r\n return () => {\r\n if (timerRef.current) window.clearTimeout(timerRef.current);\r\n evts.forEach((e) => target.removeEventListener(e, onActivity as any));\r\n };\r\n }, [idle, locked, eventTarget, isIdleEnabled]);\r\n\r\n // 잠금 중 캡처가드: 전역(global) 또는 스코프(scoped)로 범위 선택\r\n useEffect(() => {\r\n if (!locked) return;\r\n\r\n const stop = (e: Event) => {\r\n const overlay = document.getElementById(overlayId);\r\n if (overlay && overlay.contains(e.target as Node)) return; // 오버레이 내부는 통과\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n const opts = { capture: true } as AddEventListenerOptions;\r\n const evs = [\r\n \"pointerdown\",\r\n \"pointerup\",\r\n \"pointermove\",\r\n \"click\",\r\n \"wheel\",\r\n \"keydown\",\r\n \"keyup\",\r\n \"touchstart\",\r\n \"touchmove\",\r\n ];\r\n\r\n // 전역이면 window, 스코프면 eventTarget(없으면 window)\r\n const guardTarget = (\r\n overlayScope === \"scoped\" ? eventTarget ?? window : window\r\n ) as any;\r\n evs.forEach((t) => guardTarget.addEventListener(t, stop, opts));\r\n return () =>\r\n evs.forEach((t) => guardTarget.removeEventListener(t, stop as any, opts));\r\n }, [locked, overlayScope, overlayId, eventTarget]);\r\n\r\n const value = useMemo(\r\n () => ({ locked, lock, unlock, setIdleMs: setIdle }),\r\n [locked]\r\n );\r\n\r\n return (\r\n <LockContext.Provider value={value}>\r\n <div\r\n style={{ width: \"100%\", height: \"100%\" }}\r\n {...(locked ? ({ inert: \"\" } as any) : {})}\r\n {...(locked ? { \"aria-hidden\": true } : {})}\r\n >\r\n {children}\r\n </div>\r\n {locked && (\r\n <LockOverlay\r\n onUnlock={unlock}\r\n overlayId={overlayId}\r\n overlayPosition={overlayPosition}\r\n />\r\n )}\r\n </LockContext.Provider>\r\n );\r\n};\r\n\r\nconst LockOverlay: React.FC<{\r\n onUnlock: (pin?: string) => void;\r\n overlayId?: string;\r\n overlayPosition?: \"fixed\" | \"absolute\";\r\n}> = ({\r\n onUnlock,\r\n overlayId = \"lock-overlay-root\",\r\n overlayPosition = \"fixed\",\r\n}) => {\r\n const [pinLen] = useState(4);\r\n const [val, setVal] = useState(\"\");\r\n\r\n return (\r\n <div\r\n id={overlayId}\r\n aria-modal=\"true\"\r\n role=\"dialog\"\r\n aria-label=\"Locked screen\"\r\n style={{\r\n position: overlayPosition,\r\n inset: 0,\r\n background: \"rgba(12, 14, 18, 0.85)\",\r\n backdropFilter: \"blur(4px)\",\r\n display: \"grid\",\r\n placeItems: \"center\",\r\n zIndex: 9999,\r\n }}\r\n >\r\n <div className=\"lockscreen-form\" style={{ width: 420, maxWidth: \"92vw\" }}>\r\n <div className=\"lock-icon-wrap\">\r\n <span className=\"lock-icon-box\"></span>\r\n </div>\r\n <h2>잠금됨</h2>\r\n <p>PIN 번호를 입력하세요</p>\r\n <div\r\n className=\"lock-ipt-wrap\"\r\n style={{ display: \"flex\", justifyContent: \"center\" }}\r\n >\r\n <Input.OTP\r\n mask={\"*\"}\r\n autoFocus\r\n length={pinLen}\r\n value={val}\r\n onChange={(v) => {\r\n const next = (v ?? \"\").replace(/\\D/g, \"\").slice(0, pinLen);\r\n setVal(next);\r\n if (next.length === pinLen) onUnlock(next);\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["LockContext","createContext","useLock","ctx","useContext","ScreenProtectProvider","children","idleMs","onUnlock","persistLocked","storageKey","eventTarget","overlayScope","overlayId","overlayPosition","initialLocked","locked","setLocked","useState","idle","setIdle","isIdleEnabled","timerRef","useRef","lock","unlock","pin","resetTimer","doLock","useEffect","onActivity","opts","evts","target","stop","overlay","evs","guardTarget","t","value","useMemo","jsxs","jsx","LockOverlay","pinLen","val","setVal","Input","v","next"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBoxContext-BCvEYyFk.js","sources":["../../src/provider/contexts/ServiceCodeContext.tsx","../../src/provider/contexts/SearchBoxContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect } from 'react';\r\nimport { ServiceCodeKey, setServiceCodeOverrides } from '../../utils/serviceConfig';\r\n\r\n// 서비스코드 설정을 위한 Context 타입\r\ninterface ServiceCodeContextType {\r\n serviceCodes: Partial<Record<ServiceCodeKey, string>>;\r\n getServiceCode: (key: ServiceCodeKey) => string;\r\n}\r\n\r\n// 기본 서비스코드 정의\r\nconst DEFAULT_SERVICE_CODES = {\r\n // 권한 관련\r\n AUTH_BTNS: 'SCMSIGN00202', // 버튼 권한 조회\r\n AUTH_MENU: 'SCMSIGN00201', // 메뉴 권한 조회\r\n SRCH_CODE: 'SCMSIGN00301', // 코드 조회\r\n \r\n // 팝업 관련\r\n SRCH_POPU: 'SCMPOPU00101', // 팝업 조회\r\n \r\n // 즐겨찾기 관련\r\n AUTH_BMRK: 'SCMBMRK00101', // 즐겨찾기 관리\r\n} as const;\r\n\r\n// Context 생성\r\nconst ServiceCodeContext = createContext<ServiceCodeContextType | null>(null);\r\n\r\n// Provider Props 타입\r\ninterface ServiceCodeProviderProps {\r\n children: ReactNode;\r\n /**\r\n * 서비스코드 오버라이드 설정\r\n * 외부 프로젝트에서 기본 서비스코드를 재정의할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * SRCH_CODE: 'CUSTOM_SRCH_CODE',\r\n * SRCH_POPU: 'CUSTOM_SRCH_POPU_CODE',\r\n * AUTH_BMRK: 'CUSTOM_AUTH_BMRK_CODE',\r\n * }}\r\n * >\r\n * {children}\r\n * </ServiceCodeProvider>\r\n * ```\r\n * \r\n * @description\r\n * - AUTH_BTNS: 버튼 권한 조회 서비스코드\r\n * - AUTH_MENU: 메뉴 권한 조회 서비스코드 \r\n * - SRCH_CODE: 코드 조회 서비스코드\r\n * - SRCH_POPU: 팝업 조회 서비스코드\r\n * - AUTH_BMRK: 즐겨찾기 관리 서비스코드\r\n * \r\n * 설정하지 않은 서비스코드는 기본값을 사용합니다.\r\n */\r\n serviceCodes?: Partial<Record<ServiceCodeKey, string>>;\r\n}\r\n\r\n/**\r\n * 서비스코드 Provider 컴포넌트\r\n * 외부 프로젝트에서 서비스코드를 설정할 수 있도록 함\r\n * \r\n * @example\r\n * ```tsx\r\n * import { ServiceCodeProvider } from '@bwg/core/provider';\r\n * \r\n * function App() {\r\n * return (\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * }}\r\n * >\r\n * <YourApp />\r\n * </ServiceCodeProvider>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport const ServiceCodeProvider: React.FC<ServiceCodeProviderProps> = ({\r\n children,\r\n serviceCodes = {},\r\n}) => {\r\n // serviceCodes가 변경될 때마다 serviceConfig.ts의 오버라이드를 업데이트\r\n useEffect(() => {\r\n setServiceCodeOverrides(serviceCodes);\r\n }, [serviceCodes]);\r\n\r\n // 서비스코드 가져오기 함수\r\n const getServiceCode = (key: ServiceCodeKey): string => {\r\n // 1. Provider에서 설정된 값 우선 확인\r\n if (serviceCodes[key] && serviceCodes[key]!.trim() !== '') {\r\n console.log(`🔧 Provider 설정 사용: ${key} = ${serviceCodes[key]}`);\r\n return serviceCodes[key]!;\r\n }\r\n\r\n // 2. 기본값 사용\r\n const defaultValue = DEFAULT_SERVICE_CODES[key];\r\n console.log(`🔧 기본값 사용: ${key} = ${defaultValue}`);\r\n return defaultValue;\r\n };\r\n\r\n const contextValue: ServiceCodeContextType = {\r\n serviceCodes,\r\n getServiceCode,\r\n };\r\n\r\n return (\r\n <ServiceCodeContext.Provider value={contextValue}>\r\n {children}\r\n </ServiceCodeContext.Provider>\r\n );\r\n};\r\n\r\n/**\r\n * 서비스코드 Context를 사용하는 Hook\r\n * \r\n * @example\r\n * ```tsx\r\n * const { getServiceCode, serviceCodes } = useServiceCode();\r\n * const authBtnsCode = getServiceCode('AUTH_BTNS');\r\n * ```\r\n */\r\nexport const useServiceCode = (): ServiceCodeContextType => {\r\n const context = useContext(ServiceCodeContext);\r\n if (!context) {\r\n throw new Error('useServiceCode must be used within a ServiceCodeProvider');\r\n }\r\n return context;\r\n};\r\n\r\n/**\r\n * 특정 서비스코드를 가져오는 Hook\r\n * \r\n * @param key - 서비스코드 키\r\n * @returns 실제 서비스코드 값\r\n * \r\n * @example\r\n * ```tsx\r\n * const authBtnsCode = useServiceCodeValue('AUTH_BTNS');\r\n * const authMenuCode = useServiceCodeValue('AUTH_MENU');\r\n * ```\r\n */\r\nexport const useServiceCodeValue = (key: ServiceCodeKey): string => {\r\n const { getServiceCode } = useServiceCode();\r\n return getServiceCode(key);\r\n};\r\n\r\n/**\r\n * 모든 서비스코드를 가져오는 Hook\r\n * \r\n * @returns 모든 서비스코드 객체\r\n * \r\n * @example\r\n * ```tsx\r\n * const allServiceCodes = useAllServiceCodes();\r\n * console.log(allServiceCodes.AUTH_BTNS); // 'SCMSIGN00202' 또는 커스텀 값\r\n * ```\r\n */\r\nexport const useAllServiceCodes = (): Record<ServiceCodeKey, string> => {\r\n const { getServiceCode } = useServiceCode();\r\n const result = {} as Record<ServiceCodeKey, string>;\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n result[key] = getServiceCode(key);\r\n }\r\n \r\n return result;\r\n};\r\n\r\n/**\r\n * 서비스코드 설정을 로그로 출력하는 Hook\r\n * 개발 시 현재 설정된 서비스코드를 확인할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * useLogServiceCodeConfig();\r\n * // 콘솔에 현재 설정된 모든 서비스코드가 출력됩니다.\r\n * ```\r\n */\r\nexport const useLogServiceCodeConfig = (): void => {\r\n const { getServiceCode } = useServiceCode();\r\n \r\n console.log('🔧 bwg-core 서비스코드 설정:');\r\n console.log('📋 Provider 설정 > 기본값 순서로 확인');\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n const value = getServiceCode(key);\r\n console.log(` ${key}: ${value}`);\r\n }\r\n};\r\n\r\n// 타입 내보내기\r\nexport type { ServiceCodeKey };\r\n","import React, { createContext, useContext, useRef, ReactNode } from 'react';\r\nimport { SearchBoxRef } from '../../components/common/SearchBox';\r\n\r\n// SearchBox Context 타입\r\ninterface SearchBoxContextType {\r\n searchBoxRef: React.RefObject<SearchBoxRef> | null;\r\n getFormData: () => any;\r\n setFormData: (data: any) => void;\r\n resetForm: () => void;\r\n validateForm: () => Promise<any>;\r\n}\r\n\r\n// Context 생성\r\nconst SearchBoxContext = createContext<SearchBoxContextType | null>(null);\r\n\r\n// Provider Props\r\ninterface SearchBoxProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\n// Provider 컴포넌트\r\nexport const SearchBoxProvider: React.FC<SearchBoxProviderProps> = ({\r\n children,\r\n}) => {\r\n const searchBoxRef = useRef<SearchBoxRef>(null);\r\n\r\n const getFormData = () => {\r\n return searchBoxRef.current?.getFormData() || {};\r\n };\r\n\r\n const setFormData = (data: any) => {\r\n searchBoxRef.current?.setFormData(data);\r\n };\r\n\r\n const resetForm = () => {\r\n searchBoxRef.current?.resetForm();\r\n };\r\n\r\n const validateForm = async () => {\r\n return (\r\n (await searchBoxRef.current?.validateForm()) || {\r\n success: false,\r\n error: null,\r\n }\r\n );\r\n };\r\n\r\n const value: SearchBoxContextType = {\r\n searchBoxRef,\r\n getFormData,\r\n setFormData,\r\n resetForm,\r\n validateForm,\r\n };\r\n\r\n return (\r\n <SearchBoxContext.Provider value={value}>\r\n {children}\r\n </SearchBoxContext.Provider>\r\n );\r\n};\r\n\r\n// Hook\r\nexport const useSearchBox = () => {\r\n const context = useContext(SearchBoxContext);\r\n if (!context) {\r\n throw new Error('useSearchBox must be used within a SearchBoxProvider');\r\n }\r\n return context;\r\n};\r\n"],"names":["DEFAULT_SERVICE_CODES","ServiceCodeContext","createContext","ServiceCodeProvider","children","serviceCodes","useEffect","setServiceCodeOverrides","contextValue","key","defaultValue","useServiceCode","context","useContext","useServiceCodeValue","getServiceCode","useAllServiceCodes","result","useLogServiceCodeConfig","value","SearchBoxContext","SearchBoxProvider","searchBoxRef","useRef","data","jsx","useSearchBox"],"mappings":";;;AAUA,MAAMA,IAAwB;AAAA;AAAA,EAE5B,WAAW;AAAA;AAAA,EACX,WAAW;AAAA;AAAA,EACX,WAAW;AAAA;AAAA;AAAA,EAGX,WAAW;AAAA;AAAA;AAAA,EAGX,WAAW;AAAA;AACb,GAGMC,IAAqBC,EAA6C,IAAI,GA0D/DC,IAA0D,CAAC;AAAA,EACtE,UAAAC;AAAA,EACA,cAAAC,IAAe,CAAA;AACjB,MAAM;AAEJ,EAAAC,EAAU,MAAM;AACd,IAAAC,EAAwBF,CAAY;AAAA,EACtC,GAAG,CAACA,CAAY,CAAC;AAgBjB,QAAMG,IAAuC;AAAA,IAC3C,cAAAH;AAAA,IACA,gBAfqB,CAACI,MAAgC;AAEtD,UAAIJ,EAAaI,CAAG,KAAKJ,EAAaI,CAAG,EAAG,KAAA,MAAW;AACrD,uBAAQ,IAAI,sBAAsBA,CAAG,MAAMJ,EAAaI,CAAG,CAAC,EAAE,GACvDJ,EAAaI,CAAG;AAIzB,YAAMC,IAAeV,EAAsBS,CAAG;AAC9C,qBAAQ,IAAI,cAAcA,CAAG,MAAMC,CAAY,EAAE,GAC1CA;AAAA,IACT;AAAA,EAIE;AAGF,+BACGT,EAAmB,UAAnB,EAA4B,OAAOO,GACjC,UAAAJ,GACH;AAEJ,GAWaO,IAAiB,MAA8B;AAC1D,QAAMC,IAAUC,EAAWZ,CAAkB;AAC7C,MAAI,CAACW;AACH,UAAM,IAAI,MAAM,0DAA0D;AAE5E,SAAOA;AACT,GAcaE,IAAsB,CAACL,MAAgC;AAClE,QAAM,EAAE,gBAAAM,EAAA,IAAmBJ,EAAA;AAC3B,SAAOI,EAAeN,CAAG;AAC3B,GAaaO,IAAqB,MAAsC;AACtE,QAAM,EAAE,gBAAAD,EAAA,IAAmBJ,EAAA,GACrBM,IAAS,CAAA;AAEf,aAAWR,KAAO,OAAO,KAAKT,CAAqB;AACjD,IAAAiB,EAAOR,CAAG,IAAIM,EAAeN,CAAG;AAGlC,SAAOQ;AACT,GAYaC,IAA0B,MAAY;AACjD,QAAM,EAAE,gBAAAH,EAAA,IAAmBJ,EAAA;AAE3B,UAAQ,IAAI,uBAAuB,GACnC,QAAQ,IAAI,6BAA6B;AAEzC,aAAWF,KAAO,OAAO,KAAKT,CAAqB,GAAuB;AACxE,UAAMmB,IAAQJ,EAAeN,CAAG;AAChC,YAAQ,IAAI,KAAKA,CAAG,KAAKU,CAAK,EAAE;AAAA,EAClC;AACF,GCpLMC,IAAmBlB,EAA2C,IAAI,GAQ3DmB,IAAsD,CAAC;AAAA,EAClE,UAAAjB;AACF,MAAM;AACJ,QAAMkB,IAAeC,EAAqB,IAAI,GAuBxCJ,IAA8B;AAAA,IAClC,cAAAG;AAAA,IACA,aAvBkB,MACXA,EAAa,SAAS,YAAA,KAAiB,CAAA;AAAA,IAuB9C,aApBkB,CAACE,MAAc;AACjC,MAAAF,EAAa,SAAS,YAAYE,CAAI;AAAA,IACxC;AAAA,IAmBE,WAjBgB,MAAM;AACtB,MAAAF,EAAa,SAAS,UAAA;AAAA,IACxB;AAAA,IAgBE,cAdmB,YAEhB,MAAMA,EAAa,SAAS,kBAAmB;AAAA,MAC9C,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAUX;AAGF,SACEG,gBAAAA,EAAAA,IAACL,EAAiB,UAAjB,EAA0B,OAAAD,GACxB,UAAAf,EAAA,CACH;AAEJ,GAGasB,IAAe,MAAM;AAChC,QAAMd,IAAUC,EAAWO,CAAgB;AAC3C,MAAI,CAACR;AACH,UAAM,IAAI,MAAM,sDAAsD;AAExE,SAAOA;AACT;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const a=require("./jsx-runtime-CeSfJrVB.cjs"),c=require("react"),v=require("./apiUtils-BZ6s0_NI.cjs"),u={AUTH_BTNS:"SCMSIGN00202",AUTH_MENU:"SCMSIGN00201",SRCH_CODE:"SCMSIGN00301",SRCH_POPU:"SCMPOPU00101",AUTH_BMRK:"SCMBMRK00101"},S=c.createContext(null),x=({children:o,serviceCodes:e={}})=>{c.useEffect(()=>{v.setServiceCodeOverrides(e)},[e]);const i={serviceCodes:e,getServiceCode:r=>{if(e[r]&&e[r].trim()!=="")return console.log(`🔧 Provider 설정 사용: ${r} = ${e[r]}`),e[r];const s=u[r];return console.log(`🔧 기본값 사용: ${r} = ${s}`),s}};return a.jsxRuntimeExports.jsx(S.Provider,{value:i,children:o})},n=()=>{const o=c.useContext(S);if(!o)throw new Error("useServiceCode must be used within a ServiceCodeProvider");return o},g=o=>{const{getServiceCode:e}=n();return e(o)},m=()=>{const{getServiceCode:o}=n(),e={};for(const t of Object.keys(u))e[t]=o(t);return e},f=()=>{const{getServiceCode:o}=n();console.log("🔧 bwg-core 서비스코드 설정:"),console.log("📋 Provider 설정 > 기본값 순서로 확인");for(const e of Object.keys(u)){const t=o(e);console.log(` ${e}: ${t}`)}},l=c.createContext(null),P=({children:o})=>{const e=c.useRef(null),C={searchBoxRef:e,getFormData:()=>e.current?.getFormData()||{},setFormData:d=>{e.current?.setFormData(d)},resetForm:()=>{e.current?.resetForm()},validateForm:async()=>await e.current?.validateForm()||{success:!1,error:null}};return a.jsxRuntimeExports.jsx(l.Provider,{value:C,children:o})},F=()=>{const o=c.useContext(l);if(!o)throw new Error("useSearchBox must be used within a SearchBoxProvider");return o};exports.SearchBoxProvider=P;exports.ServiceCodeProvider=x;exports.useAllServiceCodes=m;exports.useLogServiceCodeConfig=f;exports.useSearchBox=F;exports.useServiceCode=n;exports.useServiceCodeValue=g;
|
|
2
|
-
//# sourceMappingURL=SearchBoxContext-DwFDOyYG.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBoxContext-DwFDOyYG.cjs","sources":["../../src/provider/contexts/ServiceCodeContext.tsx","../../src/provider/contexts/SearchBoxContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect } from 'react';\r\nimport { ServiceCodeKey, setServiceCodeOverrides } from '../../utils/serviceConfig';\r\n\r\n// 서비스코드 설정을 위한 Context 타입\r\ninterface ServiceCodeContextType {\r\n serviceCodes: Partial<Record<ServiceCodeKey, string>>;\r\n getServiceCode: (key: ServiceCodeKey) => string;\r\n}\r\n\r\n// 기본 서비스코드 정의\r\nconst DEFAULT_SERVICE_CODES = {\r\n // 권한 관련\r\n AUTH_BTNS: 'SCMSIGN00202', // 버튼 권한 조회\r\n AUTH_MENU: 'SCMSIGN00201', // 메뉴 권한 조회\r\n SRCH_CODE: 'SCMSIGN00301', // 코드 조회\r\n \r\n // 팝업 관련\r\n SRCH_POPU: 'SCMPOPU00101', // 팝업 조회\r\n \r\n // 즐겨찾기 관련\r\n AUTH_BMRK: 'SCMBMRK00101', // 즐겨찾기 관리\r\n} as const;\r\n\r\n// Context 생성\r\nconst ServiceCodeContext = createContext<ServiceCodeContextType | null>(null);\r\n\r\n// Provider Props 타입\r\ninterface ServiceCodeProviderProps {\r\n children: ReactNode;\r\n /**\r\n * 서비스코드 오버라이드 설정\r\n * 외부 프로젝트에서 기본 서비스코드를 재정의할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * SRCH_CODE: 'CUSTOM_SRCH_CODE',\r\n * SRCH_POPU: 'CUSTOM_SRCH_POPU_CODE',\r\n * AUTH_BMRK: 'CUSTOM_AUTH_BMRK_CODE',\r\n * }}\r\n * >\r\n * {children}\r\n * </ServiceCodeProvider>\r\n * ```\r\n * \r\n * @description\r\n * - AUTH_BTNS: 버튼 권한 조회 서비스코드\r\n * - AUTH_MENU: 메뉴 권한 조회 서비스코드 \r\n * - SRCH_CODE: 코드 조회 서비스코드\r\n * - SRCH_POPU: 팝업 조회 서비스코드\r\n * - AUTH_BMRK: 즐겨찾기 관리 서비스코드\r\n * \r\n * 설정하지 않은 서비스코드는 기본값을 사용합니다.\r\n */\r\n serviceCodes?: Partial<Record<ServiceCodeKey, string>>;\r\n}\r\n\r\n/**\r\n * 서비스코드 Provider 컴포넌트\r\n * 외부 프로젝트에서 서비스코드를 설정할 수 있도록 함\r\n * \r\n * @example\r\n * ```tsx\r\n * import { ServiceCodeProvider } from '@bwg/core/provider';\r\n * \r\n * function App() {\r\n * return (\r\n * <ServiceCodeProvider\r\n * serviceCodes={{\r\n * AUTH_BTNS: 'CUSTOM_AUTH_BTNS_CODE',\r\n * AUTH_MENU: 'CUSTOM_AUTH_MENU_CODE',\r\n * }}\r\n * >\r\n * <YourApp />\r\n * </ServiceCodeProvider>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport const ServiceCodeProvider: React.FC<ServiceCodeProviderProps> = ({\r\n children,\r\n serviceCodes = {},\r\n}) => {\r\n // serviceCodes가 변경될 때마다 serviceConfig.ts의 오버라이드를 업데이트\r\n useEffect(() => {\r\n setServiceCodeOverrides(serviceCodes);\r\n }, [serviceCodes]);\r\n\r\n // 서비스코드 가져오기 함수\r\n const getServiceCode = (key: ServiceCodeKey): string => {\r\n // 1. Provider에서 설정된 값 우선 확인\r\n if (serviceCodes[key] && serviceCodes[key]!.trim() !== '') {\r\n console.log(`🔧 Provider 설정 사용: ${key} = ${serviceCodes[key]}`);\r\n return serviceCodes[key]!;\r\n }\r\n\r\n // 2. 기본값 사용\r\n const defaultValue = DEFAULT_SERVICE_CODES[key];\r\n console.log(`🔧 기본값 사용: ${key} = ${defaultValue}`);\r\n return defaultValue;\r\n };\r\n\r\n const contextValue: ServiceCodeContextType = {\r\n serviceCodes,\r\n getServiceCode,\r\n };\r\n\r\n return (\r\n <ServiceCodeContext.Provider value={contextValue}>\r\n {children}\r\n </ServiceCodeContext.Provider>\r\n );\r\n};\r\n\r\n/**\r\n * 서비스코드 Context를 사용하는 Hook\r\n * \r\n * @example\r\n * ```tsx\r\n * const { getServiceCode, serviceCodes } = useServiceCode();\r\n * const authBtnsCode = getServiceCode('AUTH_BTNS');\r\n * ```\r\n */\r\nexport const useServiceCode = (): ServiceCodeContextType => {\r\n const context = useContext(ServiceCodeContext);\r\n if (!context) {\r\n throw new Error('useServiceCode must be used within a ServiceCodeProvider');\r\n }\r\n return context;\r\n};\r\n\r\n/**\r\n * 특정 서비스코드를 가져오는 Hook\r\n * \r\n * @param key - 서비스코드 키\r\n * @returns 실제 서비스코드 값\r\n * \r\n * @example\r\n * ```tsx\r\n * const authBtnsCode = useServiceCodeValue('AUTH_BTNS');\r\n * const authMenuCode = useServiceCodeValue('AUTH_MENU');\r\n * ```\r\n */\r\nexport const useServiceCodeValue = (key: ServiceCodeKey): string => {\r\n const { getServiceCode } = useServiceCode();\r\n return getServiceCode(key);\r\n};\r\n\r\n/**\r\n * 모든 서비스코드를 가져오는 Hook\r\n * \r\n * @returns 모든 서비스코드 객체\r\n * \r\n * @example\r\n * ```tsx\r\n * const allServiceCodes = useAllServiceCodes();\r\n * console.log(allServiceCodes.AUTH_BTNS); // 'SCMSIGN00202' 또는 커스텀 값\r\n * ```\r\n */\r\nexport const useAllServiceCodes = (): Record<ServiceCodeKey, string> => {\r\n const { getServiceCode } = useServiceCode();\r\n const result = {} as Record<ServiceCodeKey, string>;\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n result[key] = getServiceCode(key);\r\n }\r\n \r\n return result;\r\n};\r\n\r\n/**\r\n * 서비스코드 설정을 로그로 출력하는 Hook\r\n * 개발 시 현재 설정된 서비스코드를 확인할 수 있습니다.\r\n * \r\n * @example\r\n * ```tsx\r\n * useLogServiceCodeConfig();\r\n * // 콘솔에 현재 설정된 모든 서비스코드가 출력됩니다.\r\n * ```\r\n */\r\nexport const useLogServiceCodeConfig = (): void => {\r\n const { getServiceCode } = useServiceCode();\r\n \r\n console.log('🔧 bwg-core 서비스코드 설정:');\r\n console.log('📋 Provider 설정 > 기본값 순서로 확인');\r\n \r\n for (const key of Object.keys(DEFAULT_SERVICE_CODES) as ServiceCodeKey[]) {\r\n const value = getServiceCode(key);\r\n console.log(` ${key}: ${value}`);\r\n }\r\n};\r\n\r\n// 타입 내보내기\r\nexport type { ServiceCodeKey };\r\n","import React, { createContext, useContext, useRef, ReactNode } from 'react';\r\nimport { SearchBoxRef } from '../../components/common/SearchBox';\r\n\r\n// SearchBox Context 타입\r\ninterface SearchBoxContextType {\r\n searchBoxRef: React.RefObject<SearchBoxRef> | null;\r\n getFormData: () => any;\r\n setFormData: (data: any) => void;\r\n resetForm: () => void;\r\n validateForm: () => Promise<any>;\r\n}\r\n\r\n// Context 생성\r\nconst SearchBoxContext = createContext<SearchBoxContextType | null>(null);\r\n\r\n// Provider Props\r\ninterface SearchBoxProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\n// Provider 컴포넌트\r\nexport const SearchBoxProvider: React.FC<SearchBoxProviderProps> = ({\r\n children,\r\n}) => {\r\n const searchBoxRef = useRef<SearchBoxRef>(null);\r\n\r\n const getFormData = () => {\r\n return searchBoxRef.current?.getFormData() || {};\r\n };\r\n\r\n const setFormData = (data: any) => {\r\n searchBoxRef.current?.setFormData(data);\r\n };\r\n\r\n const resetForm = () => {\r\n searchBoxRef.current?.resetForm();\r\n };\r\n\r\n const validateForm = async () => {\r\n return (\r\n (await searchBoxRef.current?.validateForm()) || {\r\n success: false,\r\n error: null,\r\n }\r\n );\r\n };\r\n\r\n const value: SearchBoxContextType = {\r\n searchBoxRef,\r\n getFormData,\r\n setFormData,\r\n resetForm,\r\n validateForm,\r\n };\r\n\r\n return (\r\n <SearchBoxContext.Provider value={value}>\r\n {children}\r\n </SearchBoxContext.Provider>\r\n );\r\n};\r\n\r\n// Hook\r\nexport const useSearchBox = () => {\r\n const context = useContext(SearchBoxContext);\r\n if (!context) {\r\n throw new Error('useSearchBox must be used within a SearchBoxProvider');\r\n }\r\n return context;\r\n};\r\n"],"names":["DEFAULT_SERVICE_CODES","ServiceCodeContext","createContext","ServiceCodeProvider","children","serviceCodes","useEffect","setServiceCodeOverrides","contextValue","key","defaultValue","useServiceCode","context","useContext","useServiceCodeValue","getServiceCode","useAllServiceCodes","result","useLogServiceCodeConfig","value","SearchBoxContext","SearchBoxProvider","searchBoxRef","useRef","data","jsx","useSearchBox"],"mappings":"mHAUMA,EAAwB,CAE5B,UAAW,eACX,UAAW,eACX,UAAW,eAGX,UAAW,eAGX,UAAW,cACb,EAGMC,EAAqBC,EAAAA,cAA6C,IAAI,EA0D/DC,EAA0D,CAAC,CACtE,SAAAC,EACA,aAAAC,EAAe,CAAA,CACjB,IAAM,CAEJC,EAAAA,UAAU,IAAM,CACdC,EAAAA,wBAAwBF,CAAY,CACtC,EAAG,CAACA,CAAY,CAAC,EAgBjB,MAAMG,EAAuC,CAC3C,aAAAH,EACA,eAfsBI,GAAgC,CAEtD,GAAIJ,EAAaI,CAAG,GAAKJ,EAAaI,CAAG,EAAG,KAAA,IAAW,GACrD,eAAQ,IAAI,sBAAsBA,CAAG,MAAMJ,EAAaI,CAAG,CAAC,EAAE,EACvDJ,EAAaI,CAAG,EAIzB,MAAMC,EAAeV,EAAsBS,CAAG,EAC9C,eAAQ,IAAI,cAAcA,CAAG,MAAMC,CAAY,EAAE,EAC1CA,CACT,CAIE,EAGF,+BACGT,EAAmB,SAAnB,CAA4B,MAAOO,EACjC,SAAAJ,EACH,CAEJ,EAWaO,EAAiB,IAA8B,CAC1D,MAAMC,EAAUC,EAAAA,WAAWZ,CAAkB,EAC7C,GAAI,CAACW,EACH,MAAM,IAAI,MAAM,0DAA0D,EAE5E,OAAOA,CACT,EAcaE,EAAuBL,GAAgC,CAClE,KAAM,CAAE,eAAAM,CAAA,EAAmBJ,EAAA,EAC3B,OAAOI,EAAeN,CAAG,CAC3B,EAaaO,EAAqB,IAAsC,CACtE,KAAM,CAAE,eAAAD,CAAA,EAAmBJ,EAAA,EACrBM,EAAS,CAAA,EAEf,UAAWR,KAAO,OAAO,KAAKT,CAAqB,EACjDiB,EAAOR,CAAG,EAAIM,EAAeN,CAAG,EAGlC,OAAOQ,CACT,EAYaC,EAA0B,IAAY,CACjD,KAAM,CAAE,eAAAH,CAAA,EAAmBJ,EAAA,EAE3B,QAAQ,IAAI,uBAAuB,EACnC,QAAQ,IAAI,6BAA6B,EAEzC,UAAWF,KAAO,OAAO,KAAKT,CAAqB,EAAuB,CACxE,MAAMmB,EAAQJ,EAAeN,CAAG,EAChC,QAAQ,IAAI,KAAKA,CAAG,KAAKU,CAAK,EAAE,CAClC,CACF,ECpLMC,EAAmBlB,EAAAA,cAA2C,IAAI,EAQ3DmB,EAAsD,CAAC,CAClE,SAAAjB,CACF,IAAM,CACJ,MAAMkB,EAAeC,EAAAA,OAAqB,IAAI,EAuBxCJ,EAA8B,CAClC,aAAAG,EACA,YAvBkB,IACXA,EAAa,SAAS,YAAA,GAAiB,CAAA,EAuB9C,YApBmBE,GAAc,CACjCF,EAAa,SAAS,YAAYE,CAAI,CACxC,EAmBE,UAjBgB,IAAM,CACtBF,EAAa,SAAS,UAAA,CACxB,EAgBE,aAdmB,SAEhB,MAAMA,EAAa,SAAS,gBAAmB,CAC9C,QAAS,GACT,MAAO,IAAA,CAUX,EAGF,OACEG,EAAAA,kBAAAA,IAACL,EAAiB,SAAjB,CAA0B,MAAAD,EACxB,SAAAf,CAAA,CACH,CAEJ,EAGasB,EAAe,IAAM,CAChC,MAAMd,EAAUC,EAAAA,WAAWO,CAAgB,EAC3C,GAAI,CAACR,EACH,MAAM,IAAI,MAAM,sDAAsD,EAExE,OAAOA,CACT"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("./jsx-runtime-CeSfJrVB.cjs"),g=require("./ScreenProtectContext-CVuXrJm6.cjs"),n=require("react"),b=require("./AuthContext-CXng9fj0.cjs"),E=require("./apiUtils-BZ6s0_NI.cjs"),o=require("antd"),R=require("react-router-dom"),h=require("@ant-design/icons");class w extends n.Component{constructor(r){super(r),this.resetError=()=>{this.setState({hasError:!1,error:void 0,errorInfo:void 0})},this.state={hasError:!1}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}componentDidCatch(r,s){console.error("ErrorBound caught an error:",r,s),this.setState({error:r,errorInfo:s})}render(){return this.state.hasError?this.props.fallback?this.props.fallback:e.jsxRuntimeExports.jsxs("div",{style:{padding:"40px 20px",textAlign:"center",backgroundColor:"#fafafa",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"},children:[e.jsxRuntimeExports.jsx(o.Result,{status:"error",title:"컴포넌트 로딩 중 오류가 발생했습니다",subTitle:this.state.error?`오류 내용: ${this.state.error.message}`:"알 수 없는 오류가 발생했습니다",extra:[e.jsxRuntimeExports.jsx(o.Button,{type:"primary",icon:e.jsxRuntimeExports.jsx(h.ReloadOutlined,{}),onClick:this.resetError,style:{marginRight:8},children:"다시 시도"},"retry")]}),this.state.error&&e.jsxRuntimeExports.jsxs("details",{style:{marginTop:"20px",textAlign:"left",maxWidth:"600px",backgroundColor:"#fff",padding:"16px",borderRadius:"6px",border:"1px solid #d9d9d9"},children:[e.jsxRuntimeExports.jsx("summary",{style:{cursor:"pointer",fontWeight:"bold"},children:"오류 상세 정보"}),e.jsxRuntimeExports.jsx("pre",{style:{marginTop:"8px",fontSize:"12px",color:"#666",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:this.state.error.stack})]})]}):this.props.children}}const v=t=>({position:"absolute",inset:0,visibility:t?"visible":"hidden",opacity:t?1:0,transition:"opacity 0.2s ease-in-out",pointerEvents:t?"auto":"none"}),C=({once:t=!0})=>{const{lock:r}=g.useLock(),s=n.useRef(!1);return n.useEffect(()=>{t&&s.current||(s.current=!0,r())},[t,r]),null},S=({isActive:t,flagged:r,tabKey:s,onUnlock:i,children:l})=>{const a=n.useRef(null),[x,d]=n.useState(!1),c=n.useCallback(u=>{a.current=u,d(!!u)},[]),m=v(t);return e.jsxRuntimeExports.jsx("div",{ref:c,style:m,children:x?e.jsxRuntimeExports.jsxs(g.ScreenProtectProvider,{idleMs:Number.POSITIVE_INFINITY,persistLocked:!1,overlayScope:"scoped",overlayPosition:"absolute",eventTarget:a.current,overlayId:`tab-overlay-${s}`,onUnlock:async()=>(i(),!0),children:[t&&r?e.jsxRuntimeExports.jsx(C,{once:!0}):null,l]}):l})},j="bwg-dot-line-wave-v4";function k(){if(typeof document>"u"||document.getElementById(j))return;const t=document.createElement("style");t.id=j,t.textContent=`
|
|
2
|
-
.bwg-dotline {
|
|
3
|
-
display: inline-flex;
|
|
4
|
-
align-items: center;
|
|
5
|
-
gap: var(--bwg-gap, 12px);
|
|
6
|
-
height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));
|
|
7
|
-
line-height: 0;
|
|
8
|
-
}
|
|
9
|
-
.bwg-dotline .dot {
|
|
10
|
-
width: var(--bwg-size, 12px);
|
|
11
|
-
height: var(--bwg-size, 12px);
|
|
12
|
-
border-radius: 50%;
|
|
13
|
-
background: currentColor;
|
|
14
|
-
will-change: transform, opacity;
|
|
15
|
-
filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));
|
|
16
|
-
animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */
|
|
20
|
-
@keyframes bwg-dotline-sine {
|
|
21
|
-
0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
22
|
-
12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
23
|
-
25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }
|
|
24
|
-
37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
25
|
-
50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
26
|
-
62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
27
|
-
75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }
|
|
28
|
-
87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
29
|
-
100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@media (prefers-reduced-motion: reduce) {
|
|
33
|
-
.bwg-dotline .dot { animation: none; }
|
|
34
|
-
}
|
|
35
|
-
`,document.head.appendChild(t)}const P=({colors:t=["#DAD3FF","#B3A6FF","#9380FF","#816BFA"],count:r,size:s=12,gap:i=10,amp:l=16,speedMs:a=900,direction:x="ltr",phase:d=.7})=>{n.useEffect(()=>{k()},[]);const c=r??t.length,m=Array.from({length:c}),u={"--bwg-size":`${s}px`,"--bwg-gap":`${i}px`,"--bwg-amp":`${l}px`,"--bwg-speed":`${a}ms`},f=a/c*d;return e.jsxRuntimeExports.jsx("span",{className:"bwg-dotline",role:"img","aria-label":"loading",style:u,children:m.map((B,p)=>e.jsxRuntimeExports.jsx("span",{className:"dot",style:{backgroundColor:t[p%t.length],animationDelay:x==="ltr"?`${p*f}ms`:`${(c-1-p)*f}ms`}},p))})},y=({spin:t=null,text:r="인증중..."})=>{const{busy:s}=b.useAuth();return t??s?e.jsxRuntimeExports.jsxs("div",{style:{position:"fixed",height:"100vh",left:0,right:0,top:0,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",gap:8,padding:"8px 12px",background:"rgba(0,0,0,0.6)",color:"#fff",zIndex:1e4},"aria-live":"polite","aria-busy":"true",role:"status",children:[e.jsxRuntimeExports.jsx(o.Spin,{indicator:e.jsxRuntimeExports.jsx(P,{colors:["#DAD3FF","#B3A6FF","#9380FF","#816BFA"],size:12,gap:10,amp:16,speedMs:900,phase:.75,direction:"ltr"})}),e.jsxRuntimeExports.jsx("span",{className:"bwg-spin-txt",style:{marginTop:"15px"},children:r})]}):null},I=()=>{const{reauthWithPin:t}=b.useAuth();return e.jsxRuntimeExports.jsx(g.ScreenProtectProvider,{idleMs:30*6e4,onUnlock:async r=>E.isLocal?!0:!!r&&await t(r),children:e.jsxRuntimeExports.jsx(o.ConfigProvider,{getPopupContainer:()=>document.getElementById("app-shell")||document.body,children:e.jsxRuntimeExports.jsxs("div",{id:"app-shell",children:[e.jsxRuntimeExports.jsx(y,{}),e.jsxRuntimeExports.jsx(R.Outlet,{})]})})})},T=()=>e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx(y,{}),e.jsxRuntimeExports.jsx(R.Outlet,{})]}),D=({isActive:t,instance:r,params:s})=>{const{activeMenuId:i,closeTab:l}=E.useMenuViewStore(),a=()=>{i&&l(i)};return r?e.jsxRuntimeExports.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",visibility:t?"visible":"hidden",opacity:t?1:0,transition:"opacity 0.2s ease-in-out",pointerEvents:t?"auto":"none"},children:e.jsxRuntimeExports.jsx(w,{children:e.jsxRuntimeExports.jsx(n.Suspense,{fallback:null,children:r&&n.createElement(r,{params:s})})})}):e.jsxRuntimeExports.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",display:"flex",justifyContent:"center",alignItems:"center",visibility:t?"visible":"hidden",opacity:t?1:0,transition:"opacity 0.2s ease-in-out",pointerEvents:t?"auto":"none"},children:e.jsxRuntimeExports.jsx("div",{style:{width:500,maxWidth:"90%",background:"#fff",borderRadius:16,boxShadow:"0 8px 30px rgba(0,0,0,0.05)",padding:24},children:e.jsxRuntimeExports.jsx(o.Result,{icon:e.jsxRuntimeExports.jsx(h.ExclamationCircleTwoTone,{twoToneColor:"#69b1ff"}),status:"warning",title:"등록된 메뉴 정보가 없거나 유효한 메뉴가 아닙니다.",subTitle:e.jsxRuntimeExports.jsx(o.Typography.Text,{type:"secondary",children:"자세한 내용은 관리자에게 문의바랍니다."}),extra:e.jsxRuntimeExports.jsx(o.Space,{children:e.jsxRuntimeExports.jsx(o.Button,{icon:e.jsxRuntimeExports.jsx(h.CloseOutlined,{}),onClick:a,children:"탭 닫기"})})})})})},F=n.memo(D);exports.ErrorBound=w;exports.PrivateProtectedOverlay=S;exports.ProgressOverlay=y;exports.ProtectedLayout=I;exports.PublicLayout=T;exports.ViewContainer=F;
|
|
36
|
-
//# sourceMappingURL=ViewContainer-Bhq22_B3.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
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 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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ViewContainer-CjpJqoGG.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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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";const ce=require("axios"),L=require("dayjs"),x=require("antd"),R=require("zustand");var Vt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function V(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Zt(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var r=e.default;if(typeof r=="function"){var t=function n(){var o=!1;try{o=this instanceof n}catch{}return o?Reflect.construct(r,arguments,this.constructor):r.apply(this,arguments)};t.prototype=r.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:function(){return e[n]}})}),t}const be={AUTH_BTNS:"SCMSIGN00202",AUTH_MENU:"SCMSIGN00201",SRCH_CODE:"SCMSIGN00301",SRCH_POPU:"SCMPOPU00101",AUTH_BMRK:"SCMBMRK00101"};let Y={};function De(e){Y=e,console.log("🔧 Provider 서비스코드 오버라이드 설정:",e)}function Z(e){return Y[e]&&Y[e].trim()!==""?Y[e]:be[e]}function ue(){const e={};for(const r of Object.keys(be))e[r]=Z(r);return e}function xe(){console.log("🔧 bwg-core 서비스코드 설정:"),console.log("📋 Provider 설정 > 기본값 순서로 확인");const e=ue();for(const[r,t]of Object.entries(e)){const n=Y[r]?"Provider 설정":"기본값";console.log(` ${r}: ${t} (${n})`)}}const Qt=Object.freeze(Object.defineProperty({__proto__:null,getAllServiceCodes:ue,getServiceCode:Z,logServiceCodeConfig:xe,setServiceCodeOverrides:De},Symbol.toStringTag,{value:"Module"}));(void 0).DEV;function er(e,r){let t;try{t=e()}catch{return}return{getItem:o=>{var a;const i=d=>d===null?null:JSON.parse(d,void 0),g=(a=t.getItem(o))!=null?a:null;return g instanceof Promise?g.then(i):i(g)},setItem:(o,a)=>t.setItem(o,JSON.stringify(a,void 0)),removeItem:o=>t.removeItem(o)}}const ae=e=>r=>{try{const t=e(r);return t instanceof Promise?t:{then(n){return ae(n)(t)},catch(n){return this}}}catch(t){return{then(n){return this},catch(n){return ae(n)(t)}}}},tr=(e,r)=>(t,n,o)=>{let a={storage:er(()=>localStorage),partialize:s=>s,version:0,merge:(s,f)=>({...f,...s}),...r},i=!1;const g=new Set,d=new Set;let v=a.storage;if(!v)return e((...s)=>{console.warn(`[zustand persist middleware] Unable to update item '${a.name}', the given storage is currently unavailable.`),t(...s)},n,o);const h=()=>{const s=a.partialize({...n()});return v.setItem(a.name,{state:s,version:a.version})},p=o.setState;o.setState=(s,f)=>(p(s,f),h());const c=e((...s)=>(t(...s),h()),n,o);o.getInitialState=()=>c;let u;const l=()=>{var s,f;if(!v)return;i=!1,g.forEach(m=>{var S;return m((S=n())!=null?S:c)});const y=((f=a.onRehydrateStorage)==null?void 0:f.call(a,(s=n())!=null?s:c))||void 0;return ae(v.getItem.bind(v))(a.name).then(m=>{if(m)if(typeof m.version=="number"&&m.version!==a.version){if(a.migrate){const S=a.migrate(m.state,m.version);return S instanceof Promise?S.then(C=>[!0,C]):[!0,S]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,m.state];return[!1,void 0]}).then(m=>{var S;const[C,M]=m;if(u=a.merge(M,(S=n())!=null?S:c),t(u,!0),C)return h()}).then(()=>{y?.(u,void 0),u=n(),i=!0,d.forEach(m=>m(u))}).catch(m=>{y?.(void 0,m)})};return o.persist={setOptions:s=>{a={...a,...s},s.storage&&(v=s.storage)},clearStorage:()=>{v?.removeItem(a.name)},getOptions:()=>a,rehydrate:()=>l(),hasHydrated:()=>i,onHydrate:s=>(g.add(s),()=>{g.delete(s)}),onFinishHydration:s=>(d.add(s),()=>{d.delete(s)})},a.skipHydration||l(),u||c},Pe=tr,b=R.create()(Pe((e,r)=>({user:null,isLoggedIn:!1,login:t=>{e({user:t,isLoggedIn:!0}),console.log("사용자 로그인:",t)},logout:()=>{e({user:null,isLoggedIn:!1}),console.log("사용자 로그아웃")},updateUser:t=>{const n=r().user;n&&e({user:{...n,...t}})}}),{name:"user-storage",partialize:e=>({user:e.user,isLoggedIn:e.isLoggedIn})})),Ee=()=>b.getState().user?.crprCd||null,le=()=>b.getState().user?.userId||null,de=()=>b.getState().user?.userNm||null,Oe=()=>b.getState().user?.userDvsn||null,Ne=()=>b.getState().user?.emplNo||null,fe=()=>b.getState().user?.dprtCd||null,me=()=>b.getState().user?.dprtNm||null,j=()=>b.getState().user?.roleList||null,Le=e=>{const r=j();return r?r.includes(e):!1},Ue=e=>{const r=j();return r?e.some(t=>r.includes(t)):!1},$e=e=>{const r=j();return r?e.every(t=>r.includes(t)):!1},Ae=()=>b.getState().isLoggedIn,k=()=>b.getState().user,ke=()=>k()!==null,Ye=()=>{const e=de(),r=le();return e||r||null},Fe=()=>{const e=me(),r=fe();return e||(r?String(r):null)},rr=Object.freeze(Object.defineProperty({__proto__:null,getCrprCd:Ee,getDepartmentInfo:Fe,getDisplayName:Ye,getDprtCd:fe,getDprtNm:me,getEmplNo:Ne,getRoleList:j,getUserDvsn:Oe,getUserId:le,getUserInfo:k,getUserNm:de,hasAllRoles:$e,hasAnyRole:Ue,hasRole:Le,hasUserInfo:ke,isLoggedIn:Ae},Symbol.toStringTag,{value:"Module"})),ie={DEFAULT_PRNT_GBCD:1},nr=e=>e&&typeof e=="object"&&typeof e.menuId=="string"&&typeof e.menuNm=="string",Me=e=>Array.isArray(e)&&e.every(nr);let oe=[],Ce=[];const or=e=>{if(e&&typeof e=="object"){const r=e;if(r.menus&&Me(r.menus))return r.menus;if(Me(e))return e}return console.warn("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."),[]},sr=(e,r)=>!!r&&e.crprCd===r.crprCd&&e.userId===r.userId&&(e.prntGbcd??ie.DEFAULT_PRNT_GBCD)===(r.prntGbcd??ie.DEFAULT_PRNT_GBCD),ar=e=>{if(oe.length===e.length&&oe.every((a,i)=>a.menuId===e[i]?.menuId&&a.menuPrntId===e[i]?.menuPrntId))return Ce;if(!e.length)return[];const r=new Map,t=[];e.forEach(a=>a?.menuId&&r.set(a.menuId,{...a,children:[]})),e.forEach(a=>{const i=r.get(a.menuId);i&&(a.menuPrntId&&a.menuPrntId!==""&&a.menuPrntId!=="-"?r.get(a.menuPrntId)?.children?.push(i):t.push(i))});const n=a=>a.sort((i,g)=>(i?.menuNo??0)-(g?.menuNo??0)).map(i=>({...i,children:i.children&&i.children.length?n(i.children):void 0})),o=n(t);return oe=[...e],Ce=o,o},Re=R.create((e,r)=>({menuList:[],flatMenuList:[],isLoading:!1,error:null,_lastFetchParams:null,fetchMenu:async({crprCd:t,userId:n,prntGbcd:o})=>{const a={crprCd:t,userId:n,prntGbcd:o??ie.DEFAULT_PRNT_GBCD};if(sr(a,r()._lastFetchParams)){console.log("✅ 중복 fetch 차단",a);return}e({isLoading:!0,error:null,_lastFetchParams:a});try{const i=await N(Z("AUTH_MENU"),a),g=or(i),d=ar(g);e({flatMenuList:g,menuList:d,isLoading:!1,error:null})}catch(i){e({isLoading:!1,error:i?.message??"메뉴 로드 실패"})}},clearMenu:()=>{e({menuList:[],flatMenuList:[],error:null,_lastFetchParams:null})},findMenuById:t=>{const{flatMenuList:n}=r();return n.find(o=>o.menuId===t)??null}})),se={MAX_TABS:15},ge=R.create((e,r)=>({activeMenuId:null,activeMenuItem:null,activeDetailItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:se.MAX_TABS,tabProtectFlag:{},tabParams:{},componentLabelMap:{},openTabFromMenu:(t,n)=>{const{tabs:o,activeMenuId:a}=r(),i=o.find(d=>d.key===t.menuId),g=o.find(d=>d.key===t.menuId);if(i)g!=null?(e({activeMenuId:t.menuId,activeMenuItem:t}),r().setTabParams(t.menuId,n||{}),t?.prsnInfoYn==="Y"&&r().setProtectFlagForKey(t.menuId)):x.message.warning("유효하지 않은 메뉴정보입니다.");else{if(o.length>se.MAX_TABS){console.warn("❌ 최대 탭 개수를 초과했습니다."),x.message.warning(`최대 ${se.MAX_TABS}개의 탭만 열 수 있습니다.
|
|
2
|
-
기존 탭을 닫고 다시 시도해주세요.`);return}const d={key:t.menuId,label:t.menuNm,gubun:"M",menuItem:t,closable:!0};e({tabs:[...o,d],activeMenuId:t.menuId,activeMenuItem:t}),r().setTabParams(t.menuId,n||{}),t?.prsnInfoYn==="Y"&&r().setProtectFlagForKey(t.menuId)}},openTabByMenuId:(t,n)=>{const o=Re.getState().findMenuById(t);o?r().openTabFromMenu(o,n):x.message.warning("메뉴 ID를 찾을 수 없습니다.")},openDetailView:(t,n,o)=>{const{tabs:a,activeMenuId:i}=r();if(a.find(d=>d.key===t.viewId))r().focusTab(t.viewId);else{const d={key:t.viewId,label:t.viewLabel,gubun:"C",componentItem:{scrnPath:n,prsnInfoYn:o,prntInfo:t.prntInfo},closable:!0};e({tabs:[...a,d],activeMenuId:t.viewId,activeDetailItem:t}),r().setTabParams(t.viewId,t.viewParams||{})}},closeTab:t=>{const{tabs:n,activeMenuId:o}=r();n.find(g=>g.key===t);const a=n.filter(g=>g.key!==t);let i=o;if(o===t){const g=n.findIndex(d=>d.key===t);i=a.length?a[Math.min(g,a.length-1)]?.key??null:null}e({tabs:a}),i&&r().focusTab(i)},focusTab:t=>{const{tabs:n}=r(),o=n.find(a=>a.key===t);if(o){const a=o.gubun==="C"?{viewId:o.key,viewLabel:o.label,prntInfo:o.componentItem?.prntInfo}:null;o.menuItem?.prsnInfoYn==="Y"?(e({activeMenuId:t,activeMenuItem:o.menuItem,activeDetailItem:a}),console.log("✅ 탭 포커스 (개인정보) - activeMenuItem:",o.menuItem),r().setProtectFlagForKey(t)):(e({activeMenuId:t,activeMenuItem:o.menuItem,activeDetailItem:a}),r().clearProtectFlagForKey(t))}else e({activeMenuId:t,activeMenuItem:null,activeDetailItem:null}),console.warn("❌ 탭을 찾을 수 없음:",t)},closeAllTabs:()=>e({tabs:[],activeMenuId:null,activeMenuItem:null,activeDetailItem:null}),toggleSidebar:()=>e(t=>({sidebarCollapsed:!t.sidebarCollapsed})),reorderTabs:t=>e(n=>{const o=new Map(n.tabs.map(a=>[a.key,a]));return{tabs:t.map(a=>o.get(a)).filter(Boolean)}}),setProtectFlagForKey:t=>e(n=>({tabProtectFlag:{...n.tabProtectFlag,[t]:!0}})),clearProtectFlagForKey:t=>e(n=>{const o={...n.tabProtectFlag};return delete o[t],{tabProtectFlag:o}}),setTabParams:(t,n)=>e(o=>{const a=o.tabParams[t]||{},i={...n||{}};return Object.keys(a).length===Object.keys(i).length&&Object.keys(i).every(d=>a[d]===i[d])?o:{tabParams:{...o.tabParams,[t]:i}}}),setComponentLabelMap:(t,n)=>e({componentLabelMap:t})})),K=R.create(e=>({requestCount:0,loading:!1,showLoading:()=>e(r=>{const t=r.requestCount+1;return{requestCount:t,loading:t>0}}),hideLoading:()=>e(r=>{const t=Math.max(0,r.requestCount-1);return{requestCount:t,loading:t>0}})})),J=R.create(e=>({requestCount:0,loading:!1,showLoading:()=>e(r=>{const t=r.requestCount+1;return{requestCount:t,loading:t>0}}),hideLoading:()=>e(r=>{const t=Math.max(0,r.requestCount-1);return{requestCount:t,loading:t>0}})}));var z={exports:{}},ir=z.exports,Te;function cr(){return Te||(Te=1,(function(e,r){(function(t,n){e.exports=n(L)})(ir,(function(t){function n(i){return i&&typeof i=="object"&&"default"in i?i:{default:i}}var o=n(t),a={name:"ko",weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),ordinal:function(i){return i+"일"},formats:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},meridiem:function(i){return i<12?"오전":"오후"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"}};return o.default.locale(a,null,!0),a}))})(z)),z.exports}cr();var B={exports:{}},ur=B.exports,we;function lr(){return we||(we=1,(function(e,r){(function(t,n){e.exports=n()})(ur,(function(){return function(t,n,o){t=t||{};var a=n.prototype,i={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function g(v,h,p,c){return a.fromToBase(v,h,p,c)}o.en.relativeTime=i,a.fromToBase=function(v,h,p,c,u){for(var l,s,f,y=p.$locale().relativeTime||i,m=t.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],S=m.length,C=0;C<S;C+=1){var M=m[C];M.d&&(l=c?o(v).diff(p,M.d,!0):p.diff(v,M.d,!0));var w=(t.rounding||Math.round)(Math.abs(l));if(f=l>0,w<=M.r||!M.r){w<=1&&C>0&&(M=m[C-1]);var I=y[M.l];u&&(w=u(""+w)),s=typeof I=="string"?I.replace("%d",w):I(w,h,M.l,f);break}}if(h)return s;var _=f?y.future:y.past;return typeof _=="function"?_(s):_.replace("%s",s)},a.to=function(v,h){return g(v,h,this,!0)},a.from=function(v,h){return g(v,h,this)};var d=function(v){return v.$u?o.utc():o()};a.toNow=function(v){return this.to(d(this),v)},a.fromNow=function(v){return this.from(d(this),v)}}}))})(B)),B.exports}var dr=lr();const fr=V(dr);var G={exports:{}},mr=G.exports,Ie;function gr(){return Ie||(Ie=1,(function(e,r){(function(t,n){e.exports=n()})(mr,(function(){var t={year:0,month:1,day:2,hour:3,minute:4,second:5},n={};return function(o,a,i){var g,d=function(c,u,l){l===void 0&&(l={});var s=new Date(c),f=(function(y,m){m===void 0&&(m={});var S=m.timeZoneName||"short",C=y+"|"+S,M=n[C];return M||(M=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:y,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:S}),n[C]=M),M})(u,l);return f.formatToParts(s)},v=function(c,u){for(var l=d(c,u),s=[],f=0;f<l.length;f+=1){var y=l[f],m=y.type,S=y.value,C=t[m];C>=0&&(s[C]=parseInt(S,10))}var M=s[3],w=M===24?0:M,I=s[0]+"-"+s[1]+"-"+s[2]+" "+w+":"+s[4]+":"+s[5]+":000",_=+c;return(i.utc(I).valueOf()-(_-=_%1e3))/6e4},h=a.prototype;h.tz=function(c,u){c===void 0&&(c=g);var l,s=this.utcOffset(),f=this.toDate(),y=f.toLocaleString("en-US",{timeZone:c}),m=Math.round((f-new Date(y))/1e3/60),S=15*-Math.round(f.getTimezoneOffset()/15)-m;if(!Number(S))l=this.utcOffset(0,u);else if(l=i(y,{locale:this.$L}).$set("millisecond",this.$ms).utcOffset(S,!0),u){var C=l.utcOffset();l=l.add(s-C,"minute")}return l.$x.$timezone=c,l},h.offsetName=function(c){var u=this.$x.$timezone||i.tz.guess(),l=d(this.valueOf(),u,{timeZoneName:c}).find((function(s){return s.type.toLowerCase()==="timezonename"}));return l&&l.value};var p=h.startOf;h.startOf=function(c,u){if(!this.$x||!this.$x.$timezone)return p.call(this,c,u);var l=i(this.format("YYYY-MM-DD HH:mm:ss:SSS"),{locale:this.$L});return p.call(l,c,u).tz(this.$x.$timezone,!0)},i.tz=function(c,u,l){var s=l&&u,f=l||u||g,y=v(+i(),f);if(typeof c!="string")return i(c).tz(f);var m=(function(w,I,_){var O=w-60*I*1e3,U=v(O,_);if(I===U)return[O,I];var ne=v(O-=60*(U-I)*1e3,_);return U===ne?[O,U]:[w-60*Math.min(U,ne)*1e3,Math.max(U,ne)]})(i.utc(c,s).valueOf(),y,f),S=m[0],C=m[1],M=i(S).utcOffset(C);return M.$x.$timezone=f,M},i.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},i.tz.setDefault=function(c){g=c}}}))})(G)),G.exports}var hr=gr();const pr=V(hr);var W={exports:{}},vr=W.exports,_e;function yr(){return _e||(_e=1,(function(e,r){(function(t,n){e.exports=n()})(vr,(function(){var t="minute",n=/[+-]\d\d(?::?\d\d)?/g,o=/([+-]|\d\d)/g;return function(a,i,g){var d=i.prototype;g.utc=function(s){var f={date:s,utc:!0,args:arguments};return new i(f)},d.utc=function(s){var f=g(this.toDate(),{locale:this.$L,utc:!0});return s?f.add(this.utcOffset(),t):f},d.local=function(){return g(this.toDate(),{locale:this.$L,utc:!1})};var v=d.parse;d.parse=function(s){s.utc&&(this.$u=!0),this.$utils().u(s.$offset)||(this.$offset=s.$offset),v.call(this,s)};var h=d.init;d.init=function(){if(this.$u){var s=this.$d;this.$y=s.getUTCFullYear(),this.$M=s.getUTCMonth(),this.$D=s.getUTCDate(),this.$W=s.getUTCDay(),this.$H=s.getUTCHours(),this.$m=s.getUTCMinutes(),this.$s=s.getUTCSeconds(),this.$ms=s.getUTCMilliseconds()}else h.call(this)};var p=d.utcOffset;d.utcOffset=function(s,f){var y=this.$utils().u;if(y(s))return this.$u?0:y(this.$offset)?p.call(this):this.$offset;if(typeof s=="string"&&(s=(function(M){M===void 0&&(M="");var w=M.match(n);if(!w)return null;var I=(""+w[0]).match(o)||["-",0,0],_=I[0],O=60*+I[1]+ +I[2];return O===0?0:_==="+"?O:-O})(s),s===null))return this;var m=Math.abs(s)<=16?60*s:s;if(m===0)return this.utc(f);var S=this.clone();if(f)return S.$offset=m,S.$u=!1,S;var C=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(S=this.local().add(m+C,t)).$offset=m,S.$x.$localOffset=C,S};var c=d.format;d.format=function(s){var f=s||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return c.call(this,f)},d.valueOf=function(){var s=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*s},d.isUTC=function(){return!!this.$u},d.toISOString=function(){return this.toDate().toISOString()},d.toString=function(){return this.toDate().toUTCString()};var u=d.toDate;d.toDate=function(s){return s==="s"&&this.$offset?g(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():u.call(this)};var l=d.diff;d.diff=function(s,f,y){if(s&&this.$u===s.$u)return l.call(this,s,f,y);var m=this.local(),S=g(s).local();return l.call(m,S,f,y)}}}))})(W)),W.exports}var Sr=yr();const Mr=V(Sr),je="ui_theme",qe=e=>typeof e=="string",He=e=>typeof e=="number"&&!isNaN(e),ze=e=>typeof e=="boolean",Be=e=>typeof e=="function",Ge=e=>e!==null&&typeof e=="object",We=e=>Array.isArray(e),Ke=e=>e===null,Je=e=>e===void 0,Xe=e=>e==null,Ve=(e,r)=>{let t=0;return(...n)=>{const o=Date.now();o-t>=r&&(t=o,e(...n))}},Ze=(e,r)=>{let t;return(...n)=>{clearTimeout(t),t=setTimeout(()=>e(...n),r)}},Qe=async e=>{try{return await navigator.clipboard.writeText(e),!0}catch(r){return console.error("Error copying to clipboard:",r),!1}},q=()=>{const e=window.innerWidth;return e<768?"mobile":e<1024?"tablet":"desktop"},et=()=>q()==="mobile",tt=()=>q()==="tablet",rt=()=>q()==="desktop",nt=()=>"#"+Math.floor(Math.random()*16777215).toString(16),H=e=>!e||e.length===0,ot=e=>[...new Set(e)],st=e=>{if(!H(e))return Math.max(...e)},at=e=>{if(!H(e))return Math.min(...e)},it=e=>{if(!H(e))return e.reduce((r,t)=>r+t,0)/e.length},ct=e=>e.reduce((r,t)=>r+t,0),ut=(e,r)=>e.filter(r).length,lt=e=>[...e].reverse(),dt=e=>{const r=new Set,t=new Set;return e.forEach(n=>{r.has(n)?t.add(n):r.add(n)}),Array.from(t)},ft=(e,r)=>Math.random()*(r-e)+e,mt=(e,r,t)=>Math.min(Math.max(e,r),t),gt=(e,r=0)=>Math.round(e*Math.pow(10,r))/Math.pow(10,r),ht=(e,r)=>{try{sessionStorage.setItem(e,JSON.stringify(r))}catch(t){console.error("Error saving to sessionStorage:",t)}},pt=(e,r)=>{try{const t=sessionStorage.getItem(e);return t?JSON.parse(t):r||null}catch(t){return console.error("Error reading from sessionStorage:",t),r||null}},vt=e=>{try{sessionStorage.removeItem(e)}catch(r){console.error("Error removing from sessionStorage:",r)}},yt=()=>{try{sessionStorage.clear()}catch(e){console.error("Error clearing sessionStorage:",e)}},St=(e,r,t=30)=>{const n=new Date;n.setTime(n.getTime()+t*24*60*60*1e3),document.cookie=`${e}=${r};expires=${n.toUTCString()};path=/`},Mt=e=>{const r=e+"=",t=document.cookie.split(";");for(let n=0;n<t.length;n++){let o=t[n];for(;o.charAt(0)===" ";)o=o.substring(1,o.length);if(o.indexOf(r)===0)return o.substring(r.length,o.length)}return null},Ct=e=>{document.cookie=`${e}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`},he=e=>typeof e!="string"?!e:e.trim().length===0,Tt=(e,r)=>he(e)?r:e||"",wt=e=>e.replace(/-([a-z])/g,r=>r[1].toUpperCase()),It=e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e),_t=e=>{try{return new URL(e),!0}catch{return!1}},bt=(e,r,t=" ")=>e.padStart(r,t),Dt=(e,r,t=" ")=>e.padEnd(r,t),pe=(e,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")=>{let t="";for(let n=0;n<e;n++)t+=r.charAt(Math.floor(Math.random()*r.length));return t},Cr=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const r=Math.random()*16|0;return(e==="x"?r:r&3|8).toString(16)}),ve=(e=32)=>{const t=Cr().replace(/-/g,"");return e>=32?t+pe(e-32,"0123456789abcdef"):t.substring(0,e)};async function xt(e){const[{default:r},{default:t}]=await Promise.all([Promise.resolve().then(()=>require("./sha256-DiIRoCQ8.cjs")).then(n=>n.sha256),Promise.resolve().then(()=>require("./enc-base64-BkBtNBQV.cjs")).then(n=>n.encBase64)]);return r(e).toString(t)}L.extend(fr);L.extend(Mr);L.extend(pr);L.locale("ko");const Pt=()=>L(),Et=(e="YYYY-MM-DD")=>L().format(e),Tr=Object.freeze(Object.defineProperty({__proto__:null,THEME_COOKIE_NAME:je,arrAverage:it,arrCount:ut,arrMax:st,arrMin:at,arrReverse:lt,arrSum:ct,arrUnique:ot,clamp:mt,clearSessionStorage:yt,copyToClipboard:Qe,debounce:Ze,deleteCookie:Ct,duplicates:dt,encryptSha256:xt,generateRandomColor:nt,generateRandomString:pe,generateUID:ve,getCookie:Mt,getCurrentDate:Pt,getCurrentDateString:Et,getDeviceType:q,getSessionStorage:pt,isArray:We,isBoolean:ze,isDesktop:rt,isEmpty:he,isEmptyArray:H,isFunction:Be,isMobile:et,isNull:Ke,isNullOrUndefined:Xe,isNumber:He,isObject:Ge,isSafeEmpty:Tt,isString:qe,isTablet:tt,isUndefined:Je,isValidEmail:It,isValidUrl:_t,padLeft:bt,padRight:Dt,random:ft,removeSessionStorage:vt,round:gt,setCookie:St,setSessionStorage:ht,throttle:Ve,toCamelCase:wt},Symbol.toStringTag,{value:"Module"})),A=(()=>{try{if((void 0).DEV)return!0}catch{}return!1})();let Ot=[],Nt=[];function Lt(e){e.devHosts&&(Ot=e.devHosts),e.prodHosts&&(Nt=e.prodHosts)}function Ut(){if(typeof window<"u"&&window.location)return window.location.hostname}const ye=(()=>{const e=Ut();return!!(e&&Ot.includes(e))})(),Se=(()=>{const e=Ut();return!!(e&&Nt.includes(e))})();function $t(){return A?"X":ye?"D":Se?"P":"X"}const wr=Object.freeze(Object.defineProperty({__proto__:null,configureEnvUtils:Lt,getEnvCode:$t,isDev:ye,isLocal:A,isProd:Se},Symbol.toStringTag,{value:"Module"})),D={duration:4.5,placement:"topRight"};class ${constructor(){}static getInstance(){return $.instance||($.instance=new $),$.instance}showBwgError(r){const{message:t,description:n,duration:o=D.duration,placement:a=D.placement}=r;x.notification.error({message:`${t}`,description:n||"오류가 발생했습니다. 다시 시도해주세요.",duration:o,placement:a,style:{borderLeft:"4px solid #ff4d4f",backgroundColor:"#fff2f0"}})}showSuccess(r,t,n){x.notification.success({message:`${r}`,description:t,duration:n||D.duration,placement:D.placement})}showInfo(r,t,n){x.notification.info({message:`${r}`,description:t,duration:n||D.duration,placement:D.placement})}showWarning(r,t,n){x.notification.warning({message:`${r}`,description:t,duration:n||D.duration,placement:D.placement})}showError(r,t,n){x.notification.error({message:`${r}`,description:t,duration:n||D.duration,placement:D.placement})}destroy(){x.notification.destroy()}close(r){x.notification.destroy()}}const E=$.getInstance(),Q=e=>{E.showBwgError(e)},At=(e,r,t)=>{E.showSuccess(e,r,t)},ee=(e,r,t)=>{E.showInfo(e,r,t)},te=(e,r,t)=>{E.showWarning(e,r,t)},kt=(e,r,t)=>{E.showError(e,r,t)},Yt=()=>{E.destroy()},Ft=e=>{E.close(e)},Ir=Object.freeze(Object.defineProperty({__proto__:null,closeNotification:Ft,destroyNotifications:Yt,notiBwgError:Q,notiError:kt,notiInfo:ee,notiSuccess:At,notiWarning:te,notificationService:E},Symbol.toStringTag,{value:"Module"}));let P=null;const re=async e=>{if(P===null)if(e===void 0)try{let t=(await ce.get("/api/ip")).data.trim();t=t.replace(/\s+/g,""),P=t}catch(r){console.warn("IP 가져오기 실패:",r),P="unknown"}else P=e},Rt=()=>P,jt=async()=>(console.log("IP 검증 비활성화됨 (성능 최적화)"),P||"unknown");class T extends Error{constructor(r,t,n,o,a){super(r),this.name="ApiError",this.detailMsg=t,this.response=n,this.msgCd=o,this.errorType=a,Error.captureStackTrace&&Error.captureStackTrace(this,T)}}const X={method:"POST",timeout:3e4,withCredentials:!0,showLoading:!0,isPopup:!1,showError:!0,retryCount:0,retryDelay:1e3},F=ce.create({timeout:X.timeout,withCredentials:X.withCredentials,headers:{"Content-Type":"application/json; charset=utf-8",Accept:"application/json; charset=utf-8","Apm-Guid":ve()}});F.interceptors.request.use(e=>{e.showLoading&&!e.isPopup&&K.getState().showLoading(),e.showLoading&&e.isPopup&&J.getState().showLoading();let r="UNKNOWN";new Date().getTime();try{e.data&&e.data.header?r=e.data.header.trxCd||"UNKNOWN":e.params&&e.params.header&&(r=e.params.header.trxCd||"UNKNOWN")}catch(n){console.warn("trxCd/guid 추출 실패:",n)}e.trxCd=r,e.requestStartTime=Date.now(),console.log(`🚀 API 요청 시작 [거래코드: ${r} / 서비스요청자: ${k()?.userId}]`);const t=localStorage.getItem("accessToken");return t&&(e.headers.Authorization=`Bearer ${t}`),e.headers["Content-Type"]="application/json; charset=UTF-8",e.headers.Accept="application/json; charset=UTF-8",e},e=>(console.error("❌ 요청 인터셉터 에러:",e),Promise.reject(e)));F.interceptors.response.use(e=>{e.config.showLoading&&!e.config.isPopup&&K.getState().hideLoading(),e.config.isPopup&&J.getState().hideLoading();let r="UNKNOWN",t="UNKNOWN";const n=new Date().getTime();try{e.config.trxCd&&(r=e.config.trxCd),e.config.guid?t=e.config.guid:e.data&&e.data.header&&e.data.header.trxCd?(r=e.data.header.trxCd,t=e.data.header.guid||"UNKNOWN"):e.config.data&&e.config.data.header?(r=e.config.data.header.trxCd||"UNKNOWN",t=e.config.data.header.guid||"UNKNOWN"):e.config.params&&e.config.params.header&&(r=e.config.params.header.trxCd||"UNKNOWN",t=e.config.params.header.guid||"UNKNOWN")}catch(a){console.warn("trxCd/guid 추출 실패:",a)}let o=0;return e.config.requestStartTime&&(o=n-e.config.requestStartTime),console.log(`✅ API 응답 성공 [거래코드: ${r} / GUID : ${t}] - (소요시간: ${o}ms)`),e},async e=>{if(e.config&&e.config.showLoading&&!e.config.isPopup&&K.getState().hideLoading(),e.config&&e.config.isPopup&&J.getState().hideLoading(),console.error("❌ API 응답 에러:",e),A&&console.error("🚨 Error Details:",{message:e.message,status:e.response?.status,statusText:e.response?.statusText,data:e.response?.data,config:{url:e.config?.url,method:e.config?.method,baseURL:e.config?.baseURL}}),e.response?.status===401){const r=localStorage.getItem("refreshToken");if(r)try{const t=await ce.post("/auth/refresh",{refreshToken:r});if(t.data.accessToken){localStorage.setItem("accessToken",t.data.accessToken);const n=e.config;if(n)return n.headers.Authorization=`Bearer ${t.data.accessToken}`,F(n)}}catch{localStorage.removeItem("accessToken"),localStorage.removeItem("refreshToken"),window.location.href="/login"}}return Promise.reject(e)});const N=async(e,r,t)=>{try{const n={...X,...t},{activeMenuId:o}=ge.getState();if(P===null){const p=Date.now();await re();const c=Date.now();console.log(`[INFO] IP 조회 소요시간: ${c-p}ms`)}const a={method:n.method,url:"/api/service",timeout:n.timeout,withCredentials:n.withCredentials,showLoading:n.showLoading,isPopup:n.isPopup};n.headers&&(a.headers=n.headers);const i=P||"unknown",g=__APP_CD__,d=__SYS_CD__,v={header:{trxCd:e,userInfo:k(),clientIp:i,domainId:"DEFAULT",appCd:g,sysCd:d,screenId:o},data:r};n.method==="GET"?a.params=v||n.params:(a.data=v||n.data,n.params&&(a.params=n.params));let h;for(let p=0;p<=(n.retryCount||0);p++)try{const c=await F(a);if(c.data.header?.resCd==0){for(const u in c.data)if(u!=="header")return c.data[u];return{}}else{const u=c.data.header,l=u?.msgs?.basicMsg||"요청 처리 중 오류가 발생했습니다.",s=u?.msgs?.detailMsgs||l,f=u?.msgCd,y=u?.msgs?.type;throw new T(l,s,c,f,y)}}catch(c){if(c.isAxiosError&&c.response){const u=c,l=u.response,s=l.data,f=s?.header?.msgs?.basicMsg||u.message||"서버에서 오류가 발생했습니다.",y=s?.header?.msgs?.detailMsgs||(typeof l.data=="string"?l.data:JSON.stringify(l.data))||f,m=s?.header?.msgCd,S=s?.header?.msgs?.type;h=new T(f,y,l,m,S)}else h=c;if(c.isAxiosError&&Ht(c)&&p<(n.retryCount||0)){await zt(n.retryDelay||1e3);continue}break}if(h){if(n.showError){const p=h instanceof T?h.message:"요청 처리 중 오류가 발생했습니다.",c=h instanceof T?h.msgCd:"요청 처리 중 오류가 발생했습니다.",u=h instanceof T?h.detailMsg:h.message,l=h instanceof T?h.errorType:"";c?.startsWith("BXM")?Q({message:p,description:u,duration:5}):l=="I"?ee(p,u,5):te(p,u,5)}throw h}throw new Error("알 수 없는 API 오류가 발생했습니다.")}catch(n){throw console.error("callService 최종 에러:",n),n}},qt=async(e,r,t,n)=>{try{const o={...X,...n},{activeMenuId:a}=ge.getState();if(P===null){const c=Date.now();await re();const u=Date.now();console.log(`[INFO] IP 조회 소요시간: ${u-c}ms`)}const i={method:o.method,url:"/api/"+e+"/service",timeout:o.timeout,withCredentials:o.withCredentials,showLoading:o.showLoading,isPopup:o.isPopup};o.headers&&(i.headers=o.headers);const g=P||"unknown",d=__APP_CD__,v=__SYS_CD__,h={header:{trxCd:r,userInfo:k(),clientIp:g,domainId:"DEFAULT",appCd:d,sysCd:v,screenId:a},data:t};A&&console.log("__BWG_LOCAL__ 테스트 입니다. ",A),o.method==="GET"?i.params=h||o.params:(i.data=h||o.data,o.params&&(i.params=o.params));let p;for(let c=0;c<=(o.retryCount||0);c++)try{const u=await F(i);if(u.data.header?.resCd==0){for(const l in u.data)if(l!=="header")return u.data[l];return{}}else{const l=u.data.header,s=l?.msgs?.basicMsg||"요청 처리 중 오류가 발생했습니다.",f=l?.msgs?.detailMsgs||s,y=l?.msgCd,m=l?.msgs?.type;throw new T(s,f,u,y,m)}}catch(u){if(u.isAxiosError&&u.response){const l=u,s=l.response,f=s.data,y=f?.header?.msgs?.basicMsg||l.message||"서버에서 오류가 발생했습니다.",m=f?.header?.msgs?.detailMsgs||(typeof s.data=="string"?s.data:JSON.stringify(s.data))||y,S=f?.header?.msgCd,C=f?.header?.msgs?.type;p=new T(y,m,s,S,C)}else p=u;if(u.isAxiosError&&Ht(u)&&c<(o.retryCount||0)){await zt(o.retryDelay||1e3);continue}break}if(p){if(o.showError){const c=p instanceof T?p.message:"요청 처리 중 오류가 발생했습니다.",u=p instanceof T?p.msgCd:"요청 처리 중 오류가 발생했습니다.",l=p instanceof T?p.detailMsg:p.message,s=p instanceof T?p.errorType:"";u?.startsWith("BXM")?Q({message:c,description:l,duration:5}):s=="I"?ee(c,l,5):te(c,l,5)}throw p}throw new Error("알 수 없는 API 오류가 발생했습니다.")}catch(o){throw console.error("callService 최종 에러:",o),o}},Ht=e=>!e.response||e.response.status>=500&&e.response.status<600,zt=e=>new Promise(r=>setTimeout(r,e)),Bt=(e,r,t)=>N(e,r,{...t,method:"GET"}),Gt=(e,r,t)=>N(e,r,{...t,method:"POST"}),Wt=(e,r,t)=>N(e,r,{...t,method:"PUT"}),Kt=(e,r,t)=>N(e,r,{...t,method:"DELETE"}),Jt=(e,r,t)=>N(e,r,{...t,method:"PATCH"}),Xt=async(e,r,t)=>{try{const n=await fetch("/api/permissions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({userId:e,menuId:r,popupId:t})});if(!n.ok)throw new Error(`권한 확인 실패: ${n.status}`);return await n.json()}catch(n){throw console.error("권한 확인 서비스 오류:",n),n}},_r=Object.freeze(Object.defineProperty({__proto__:null,ApiError:T,apiDelete:Kt,apiGet:Bt,apiPatch:Jt,apiPost:Gt,apiPut:Wt,callService:N,callService_SYSCD:qt,getClientIp:Rt,getPermissionService:Xt,setClientIp:re,verifyClientIp:jt},Symbol.toStringTag,{value:"Module"}));exports.ApiError=T;exports.THEME_COOKIE_NAME=je;exports.apiDelete=Kt;exports.apiGet=Bt;exports.apiPatch=Jt;exports.apiPost=Gt;exports.apiPut=Wt;exports.apiUtilsModule=_r;exports.arrAverage=it;exports.arrCount=ut;exports.arrMax=st;exports.arrMin=at;exports.arrReverse=lt;exports.arrSum=ct;exports.arrUnique=ot;exports.callService=N;exports.callService_SYSCD=qt;exports.clamp=mt;exports.clearSessionStorage=yt;exports.closeNotification=Ft;exports.commonUtilsModule=Tr;exports.commonjsGlobal=Vt;exports.configureEnvUtils=Lt;exports.copyToClipboard=Qe;exports.debounce=Ze;exports.deleteCookie=Ct;exports.destroyNotifications=Yt;exports.duplicates=dt;exports.encryptSha256=xt;exports.envUtilsModule=wr;exports.generateRandomColor=nt;exports.generateRandomString=pe;exports.generateUID=ve;exports.getAllServiceCodes=ue;exports.getAugmentedNamespace=Zt;exports.getClientIp=Rt;exports.getCookie=Mt;exports.getCrprCd=Ee;exports.getCurrentDate=Pt;exports.getCurrentDateString=Et;exports.getDefaultExportFromCjs=V;exports.getDepartmentInfo=Fe;exports.getDeviceType=q;exports.getDisplayName=Ye;exports.getDprtCd=fe;exports.getDprtNm=me;exports.getEmplNo=Ne;exports.getEnvCode=$t;exports.getPermissionService=Xt;exports.getRoleList=j;exports.getServiceCode=Z;exports.getSessionStorage=pt;exports.getUserDvsn=Oe;exports.getUserId=le;exports.getUserInfo=k;exports.getUserNm=de;exports.hasAllRoles=$e;exports.hasAnyRole=Ue;exports.hasRole=Le;exports.hasUserInfo=ke;exports.isArray=We;exports.isBoolean=ze;exports.isDesktop=rt;exports.isDev=ye;exports.isEmpty=he;exports.isEmptyArray=H;exports.isFunction=Be;exports.isLocal=A;exports.isLoggedIn=Ae;exports.isMobile=et;exports.isNull=Ke;exports.isNullOrUndefined=Xe;exports.isNumber=He;exports.isObject=Ge;exports.isProd=Se;exports.isSafeEmpty=Tt;exports.isString=qe;exports.isTablet=tt;exports.isUndefined=Je;exports.isValidEmail=It;exports.isValidUrl=_t;exports.logServiceCodeConfig=xe;exports.notiBwgError=Q;exports.notiError=kt;exports.notiInfo=ee;exports.notiSuccess=At;exports.notiWarning=te;exports.notificationService=E;exports.notificationUtilsModule=Ir;exports.padLeft=bt;exports.padRight=Dt;exports.persist=Pe;exports.random=ft;exports.removeSessionStorage=vt;exports.round=gt;exports.serviceConfigModule=Qt;exports.setClientIp=re;exports.setCookie=St;exports.setServiceCodeOverrides=De;exports.setSessionStorage=ht;exports.throttle=Ve;exports.toCamelCase=wt;exports.useLoadingStore=K;exports.useMenuModelStore=Re;exports.useMenuViewStore=ge;exports.usePopupLoadingStore=J;exports.useUserStore=b;exports.userUtilsModule=rr;exports.verifyClientIp=jt;
|
|
3
|
-
//# sourceMappingURL=apiUtils-BZ6s0_NI.cjs.map
|