@sonhoseong/mfa-lib 1.3.7 → 1.3.10

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.
Files changed (162) hide show
  1. package/dist/components/button/ScrollTopButton.js +5 -3
  2. package/dist/components/error/ErrorBoundary.js +14 -4
  3. package/dist/components/error/NotFound.d.ts +20 -0
  4. package/dist/components/error/NotFound.d.ts.map +1 -0
  5. package/dist/components/error/NotFound.js +84 -0
  6. package/dist/components/error/index.d.ts +2 -0
  7. package/dist/components/error/index.d.ts.map +1 -1
  8. package/dist/components/error/index.js +1 -0
  9. package/dist/components/icons/Icons.d.ts +51 -0
  10. package/dist/components/icons/Icons.d.ts.map +1 -0
  11. package/dist/components/icons/Icons.js +100 -0
  12. package/dist/components/icons/index.d.ts +5 -0
  13. package/dist/components/icons/index.d.ts.map +1 -0
  14. package/dist/components/icons/index.js +4 -0
  15. package/dist/components/index.d.ts +3 -0
  16. package/dist/components/index.d.ts.map +1 -1
  17. package/dist/components/index.js +6 -0
  18. package/dist/components/layout/Container.js +7 -2
  19. package/dist/components/loading/DeferredComponent.d.ts +19 -0
  20. package/dist/components/loading/DeferredComponent.d.ts.map +1 -0
  21. package/dist/components/loading/DeferredComponent.js +32 -0
  22. package/dist/components/loading/GlobalLoading.js +14 -3
  23. package/dist/components/loading/index.d.ts +1 -0
  24. package/dist/components/loading/index.d.ts.map +1 -1
  25. package/dist/components/loading/index.js +1 -0
  26. package/dist/components/logo/Logo.d.ts +2 -0
  27. package/dist/components/logo/Logo.d.ts.map +1 -1
  28. package/dist/components/logo/Logo.js +13 -4
  29. package/dist/components/modal/ModalContainer.js +17 -8
  30. package/dist/components/modal/ModalContext.js +2 -3
  31. package/dist/components/navigation/AppNavbar.js +21 -9
  32. package/dist/components/navigation/AppSidebar.css +58 -3
  33. package/dist/components/navigation/AppSidebar.d.ts +1 -1
  34. package/dist/components/navigation/AppSidebar.d.ts.map +1 -1
  35. package/dist/components/navigation/AppSidebar.js +58 -15
  36. package/dist/components/navigation/Footer.d.ts +15 -0
  37. package/dist/components/navigation/Footer.d.ts.map +1 -0
  38. package/dist/components/navigation/Footer.js +12 -0
  39. package/dist/components/navigation/Header.d.ts.map +1 -1
  40. package/dist/components/navigation/Header.js +17 -4
  41. package/dist/components/navigation/Lnb.d.ts +2 -7
  42. package/dist/components/navigation/Lnb.d.ts.map +1 -1
  43. package/dist/components/navigation/Lnb.js +34 -6
  44. package/dist/components/navigation/StickyNav.js +19 -11
  45. package/dist/components/navigation/index.d.ts +1 -0
  46. package/dist/components/navigation/index.d.ts.map +1 -1
  47. package/dist/components/navigation/index.js +1 -0
  48. package/dist/components/page/LoginPage.d.ts +4 -1
  49. package/dist/components/page/LoginPage.d.ts.map +1 -1
  50. package/dist/components/page/LoginPage.js +146 -21
  51. package/dist/components/remote/RemoteErrorBoundary.d.ts +28 -0
  52. package/dist/components/remote/RemoteErrorBoundary.d.ts.map +1 -0
  53. package/dist/components/remote/RemoteErrorBoundary.js +44 -0
  54. package/dist/components/remote/RemoteErrorFallback.d.ts +16 -0
  55. package/dist/components/remote/RemoteErrorFallback.d.ts.map +1 -0
  56. package/dist/components/remote/RemoteErrorFallback.js +76 -0
  57. package/dist/components/remote/index.d.ts +8 -0
  58. package/dist/components/remote/index.d.ts.map +1 -0
  59. package/dist/components/remote/index.js +5 -0
  60. package/dist/components/router/BrowserRouter.d.ts +13 -0
  61. package/dist/components/router/BrowserRouter.d.ts.map +1 -0
  62. package/dist/components/router/BrowserRouter.js +17 -0
  63. package/dist/components/router/RouteGuard.d.ts +79 -0
  64. package/dist/components/router/RouteGuard.d.ts.map +1 -0
  65. package/dist/components/router/RouteGuard.js +86 -0
  66. package/dist/components/router/index.d.ts +4 -0
  67. package/dist/components/router/index.d.ts.map +1 -0
  68. package/dist/components/router/index.js +2 -0
  69. package/dist/components/toast/ToastContainer.js +17 -6
  70. package/dist/components/toast/ToastContext.js +2 -3
  71. package/dist/hooks/index.d.ts +9 -1
  72. package/dist/hooks/index.d.ts.map +1 -1
  73. package/dist/hooks/index.js +15 -1
  74. package/dist/hooks/use-auth.d.ts +2 -1
  75. package/dist/hooks/use-auth.d.ts.map +1 -1
  76. package/dist/hooks/use-auth.js +19 -18
  77. package/dist/hooks/use-debounce.d.ts +56 -0
  78. package/dist/hooks/use-debounce.d.ts.map +1 -0
  79. package/dist/hooks/use-debounce.js +140 -0
  80. package/dist/hooks/use-effect-once.d.ts +77 -0
  81. package/dist/hooks/use-effect-once.d.ts.map +1 -0
  82. package/dist/hooks/use-effect-once.js +124 -0
  83. package/dist/hooks/use-error-notification.d.ts +1 -1
  84. package/dist/hooks/use-error-notification.js +1 -1
  85. package/dist/hooks/use-global-loading.d.ts +1 -1
  86. package/dist/hooks/use-global-loading.js +1 -1
  87. package/dist/hooks/use-initialize.d.ts +8 -1
  88. package/dist/hooks/use-initialize.d.ts.map +1 -1
  89. package/dist/hooks/use-initialize.js +126 -23
  90. package/dist/hooks/use-modal.d.ts +21 -5
  91. package/dist/hooks/use-modal.d.ts.map +1 -1
  92. package/dist/hooks/use-modal.js +57 -17
  93. package/dist/hooks/use-navigate.d.ts +1 -1
  94. package/dist/hooks/use-navigate.js +1 -1
  95. package/dist/hooks/use-network-status.d.ts +15 -0
  96. package/dist/hooks/use-network-status.d.ts.map +1 -0
  97. package/dist/hooks/use-network-status.js +49 -0
  98. package/dist/hooks/use-permission.d.ts +22 -0
  99. package/dist/hooks/use-permission.d.ts.map +1 -0
  100. package/dist/hooks/use-permission.js +73 -0
  101. package/dist/hooks/use-recent-menu.d.ts +46 -0
  102. package/dist/hooks/use-recent-menu.d.ts.map +1 -0
  103. package/dist/hooks/use-recent-menu.js +169 -0
  104. package/dist/hooks/use-scroll-restoration.d.ts +51 -0
  105. package/dist/hooks/use-scroll-restoration.d.ts.map +1 -0
  106. package/dist/hooks/use-scroll-restoration.js +143 -0
  107. package/dist/hooks/use-supabase-auth.d.ts +49 -0
  108. package/dist/hooks/use-supabase-auth.d.ts.map +1 -0
  109. package/dist/hooks/use-supabase-auth.js +229 -0
  110. package/dist/hooks/use-track-history.d.ts +2 -1
  111. package/dist/hooks/use-track-history.d.ts.map +1 -1
  112. package/dist/hooks/use-track-history.js +14 -2
  113. package/dist/index.d.ts +1 -1
  114. package/dist/index.js +1 -1
  115. package/dist/network/axios-factory.d.ts +30 -1
  116. package/dist/network/axios-factory.d.ts.map +1 -1
  117. package/dist/network/axios-factory.js +192 -24
  118. package/dist/network/index.d.ts +3 -1
  119. package/dist/network/index.d.ts.map +1 -1
  120. package/dist/network/index.js +5 -1
  121. package/dist/network/supabase-client.d.ts +28 -0
  122. package/dist/network/supabase-client.d.ts.map +1 -0
  123. package/dist/network/supabase-client.js +46 -0
  124. package/dist/store/app-store.d.ts +222 -12
  125. package/dist/store/app-store.d.ts.map +1 -1
  126. package/dist/store/app-store.js +46 -29
  127. package/dist/store/index.d.ts +2 -0
  128. package/dist/store/index.d.ts.map +1 -1
  129. package/dist/store/index.js +3 -0
  130. package/dist/store/menu-slice.d.ts +96 -0
  131. package/dist/store/menu-slice.d.ts.map +1 -0
  132. package/dist/store/menu-slice.js +98 -0
  133. package/dist/store/recent-menu-slice.d.ts +209 -0
  134. package/dist/store/recent-menu-slice.d.ts.map +1 -0
  135. package/dist/store/recent-menu-slice.js +110 -0
  136. package/dist/store/store-access.d.ts +1 -1
  137. package/dist/store/store-access.js +1 -1
  138. package/dist/types/index.d.ts +74 -17
  139. package/dist/types/index.d.ts.map +1 -1
  140. package/dist/types/service.d.ts +1 -1
  141. package/dist/types/service.js +1 -1
  142. package/dist/utils/classnames.d.ts +65 -0
  143. package/dist/utils/classnames.d.ts.map +1 -0
  144. package/dist/utils/classnames.js +98 -0
  145. package/dist/utils/formatter.d.ts +78 -0
  146. package/dist/utils/formatter.d.ts.map +1 -0
  147. package/dist/utils/formatter.js +216 -0
  148. package/dist/utils/index.d.ts +5 -0
  149. package/dist/utils/index.d.ts.map +1 -1
  150. package/dist/utils/index.js +5 -0
  151. package/dist/utils/permission.d.ts +33 -0
  152. package/dist/utils/permission.d.ts.map +1 -0
  153. package/dist/utils/permission.js +132 -0
  154. package/dist/utils/query-string.d.ts +67 -0
  155. package/dist/utils/query-string.d.ts.map +1 -0
  156. package/dist/utils/query-string.js +136 -0
  157. package/dist/utils/storage.d.ts +1 -1
  158. package/dist/utils/storage.js +1 -1
  159. package/dist/utils/validation.d.ts +98 -0
  160. package/dist/utils/validation.d.ts.map +1 -0
  161. package/dist/utils/validation.js +260 -0
  162. package/package.json +5 -3
@@ -1,5 +1,5 @@
1
1
  /**
2
- * App Store - KOMCA 패턴
2
+ * App Store
3
3
  *
4
4
  * Host/Remote 모두에서 사용할 수 있는 Store 설정
5
5
  * - Host: 자체 store 생성 후 window.__REDUX_STORE__에 노출
@@ -7,7 +7,7 @@
7
7
  * - Remote (in Host): window.__REDUX_STORE__ 사용
8
8
  */
9
9
  import { configureStore, PayloadAction, Reducer } from '@reduxjs/toolkit';
10
- import { User, AppState } from '../types';
10
+ import { User, AppState, HostStore } from '../types';
11
11
  export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
12
12
  setAccessToken: (state: {
13
13
  accessToken: string;
@@ -15,7 +15,12 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
15
15
  id: string;
16
16
  name: string;
17
17
  email: string;
18
- role?: "admin" | "user" | undefined;
18
+ role?: (import("../types").UserRole | string) | undefined;
19
+ avatar?: string | undefined;
20
+ permissions?: {
21
+ code: string;
22
+ actions: import("../types").PermissionAction[];
23
+ }[] | undefined;
19
24
  } | null;
20
25
  isLoading: boolean;
21
26
  globalLoadingTitle: string;
@@ -28,7 +33,12 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
28
33
  id: string;
29
34
  name: string;
30
35
  email: string;
31
- role?: "admin" | "user" | undefined;
36
+ role?: (import("../types").UserRole | string) | undefined;
37
+ avatar?: string | undefined;
38
+ permissions?: {
39
+ code: string;
40
+ actions: import("../types").PermissionAction[];
41
+ }[] | undefined;
32
42
  } | null;
33
43
  isLoading: boolean;
34
44
  globalLoadingTitle: string;
@@ -41,7 +51,12 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
41
51
  id: string;
42
52
  name: string;
43
53
  email: string;
44
- role?: "admin" | "user" | undefined;
54
+ role?: (import("../types").UserRole | string) | undefined;
55
+ avatar?: string | undefined;
56
+ permissions?: {
57
+ code: string;
58
+ actions: import("../types").PermissionAction[];
59
+ }[] | undefined;
45
60
  } | null;
46
61
  isLoading: boolean;
47
62
  globalLoadingTitle: string;
@@ -54,7 +69,12 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
54
69
  id: string;
55
70
  name: string;
56
71
  email: string;
57
- role?: "admin" | "user" | undefined;
72
+ role?: (import("../types").UserRole | string) | undefined;
73
+ avatar?: string | undefined;
74
+ permissions?: {
75
+ code: string;
76
+ actions: import("../types").PermissionAction[];
77
+ }[] | undefined;
58
78
  } | null;
59
79
  isLoading: boolean;
60
80
  globalLoadingTitle: string;
@@ -67,7 +87,12 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
67
87
  id: string;
68
88
  name: string;
69
89
  email: string;
70
- role?: "admin" | "user" | undefined;
90
+ role?: (import("../types").UserRole | string) | undefined;
91
+ avatar?: string | undefined;
92
+ permissions?: {
93
+ code: string;
94
+ actions: import("../types").PermissionAction[];
95
+ }[] | undefined;
71
96
  } | null;
72
97
  isLoading: boolean;
73
98
  globalLoadingTitle: string;
@@ -80,7 +105,12 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
80
105
  id: string;
81
106
  name: string;
82
107
  email: string;
83
- role?: "admin" | "user" | undefined;
108
+ role?: (import("../types").UserRole | string) | undefined;
109
+ avatar?: string | undefined;
110
+ permissions?: {
111
+ code: string;
112
+ actions: import("../types").PermissionAction[];
113
+ }[] | undefined;
84
114
  } | null;
85
115
  isLoading: boolean;
86
116
  globalLoadingTitle: string;
@@ -93,7 +123,12 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
93
123
  id: string;
94
124
  name: string;
95
125
  email: string;
96
- role?: "admin" | "user" | undefined;
126
+ role?: (import("../types").UserRole | string) | undefined;
127
+ avatar?: string | undefined;
128
+ permissions?: {
129
+ code: string;
130
+ actions: import("../types").PermissionAction[];
131
+ }[] | undefined;
97
132
  } | null;
98
133
  isLoading: boolean;
99
134
  globalLoadingTitle: string;
@@ -102,6 +137,9 @@ export declare const appSlice: import("@reduxjs/toolkit").Slice<AppState, {
102
137
  }) => void;
103
138
  }, "app", "app", import("@reduxjs/toolkit").SliceSelectors<AppState>>;
104
139
  export declare const setAccessToken: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "app/setAccessToken">, setUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<User | null, "app/setUser">, setLoading: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "app/setLoading">, setGlobalLoadingTitle: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "app/setGlobalLoadingTitle">, setService: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "app/setService">, setSelectedGnb: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "app/setSelectedGnb">, logout: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"app/logout">;
140
+ export declare const selectAppState: (state: {
141
+ app: AppState;
142
+ }) => AppState;
105
143
  export declare const selectAccessToken: (state: {
106
144
  app: AppState;
107
145
  }) => string;
@@ -111,18 +149,190 @@ export declare const selectUser: (state: {
111
149
  export declare const selectIsLoading: (state: {
112
150
  app: AppState;
113
151
  }) => boolean;
114
- export declare const selectIsAuthenticated: (state: {
152
+ export declare const selectGlobalLoadingTitle: (state: {
115
153
  app: AppState;
116
- }) => boolean;
154
+ }) => string;
155
+ export declare const selectService: (state: {
156
+ app: AppState;
157
+ }) => string;
158
+ export declare const selectAppSelectedGnb: (state: {
159
+ app: AppState;
160
+ }) => string;
161
+ /** 인증 여부 (메모이제이션) */
162
+ export declare const selectIsAuthenticated: ((state: {
163
+ app: AppState;
164
+ }) => boolean) & {
165
+ clearCache: () => void;
166
+ resultsCount: () => number;
167
+ resetResultsCount: () => void;
168
+ } & {
169
+ resultFunc: (resultFuncArgs_0: string) => boolean;
170
+ memoizedResultFunc: ((resultFuncArgs_0: string) => boolean) & {
171
+ clearCache: () => void;
172
+ resultsCount: () => number;
173
+ resetResultsCount: () => void;
174
+ };
175
+ lastResult: () => boolean;
176
+ dependencies: [(state: {
177
+ app: AppState;
178
+ }) => string];
179
+ recomputations: () => number;
180
+ resetRecomputations: () => void;
181
+ dependencyRecomputations: () => number;
182
+ resetDependencyRecomputations: () => void;
183
+ } & {
184
+ memoize: typeof import("reselect").weakMapMemoize;
185
+ argsMemoize: typeof import("reselect").weakMapMemoize;
186
+ };
187
+ /** 사용자 역할 */
188
+ export declare const selectUserRole: ((state: {
189
+ app: AppState;
190
+ }) => string) & {
191
+ clearCache: () => void;
192
+ resultsCount: () => number;
193
+ resetResultsCount: () => void;
194
+ } & {
195
+ resultFunc: (resultFuncArgs_0: User | null) => string;
196
+ memoizedResultFunc: ((resultFuncArgs_0: User | null) => string) & {
197
+ clearCache: () => void;
198
+ resultsCount: () => number;
199
+ resetResultsCount: () => void;
200
+ };
201
+ lastResult: () => string;
202
+ dependencies: [(state: {
203
+ app: AppState;
204
+ }) => User | null];
205
+ recomputations: () => number;
206
+ resetRecomputations: () => void;
207
+ dependencyRecomputations: () => number;
208
+ resetDependencyRecomputations: () => void;
209
+ } & {
210
+ memoize: typeof import("reselect").weakMapMemoize;
211
+ argsMemoize: typeof import("reselect").weakMapMemoize;
212
+ };
213
+ /** 관리자 여부 */
214
+ export declare const selectIsAdmin: ((state: {
215
+ app: AppState;
216
+ }) => boolean) & {
217
+ clearCache: () => void;
218
+ resultsCount: () => number;
219
+ resetResultsCount: () => void;
220
+ } & {
221
+ resultFunc: (resultFuncArgs_0: User | null) => boolean;
222
+ memoizedResultFunc: ((resultFuncArgs_0: User | null) => boolean) & {
223
+ clearCache: () => void;
224
+ resultsCount: () => number;
225
+ resetResultsCount: () => void;
226
+ };
227
+ lastResult: () => boolean;
228
+ dependencies: [(state: {
229
+ app: AppState;
230
+ }) => User | null];
231
+ recomputations: () => number;
232
+ resetRecomputations: () => void;
233
+ dependencyRecomputations: () => number;
234
+ resetDependencyRecomputations: () => void;
235
+ } & {
236
+ memoize: typeof import("reselect").weakMapMemoize;
237
+ argsMemoize: typeof import("reselect").weakMapMemoize;
238
+ };
239
+ /** 사용자 권한 목록 */
240
+ export declare const selectUserPermissions: ((state: {
241
+ app: AppState;
242
+ }) => import("../types").Permission[]) & {
243
+ clearCache: () => void;
244
+ resultsCount: () => number;
245
+ resetResultsCount: () => void;
246
+ } & {
247
+ resultFunc: (resultFuncArgs_0: User | null) => import("../types").Permission[];
248
+ memoizedResultFunc: ((resultFuncArgs_0: User | null) => import("../types").Permission[]) & {
249
+ clearCache: () => void;
250
+ resultsCount: () => number;
251
+ resetResultsCount: () => void;
252
+ };
253
+ lastResult: () => import("../types").Permission[];
254
+ dependencies: [(state: {
255
+ app: AppState;
256
+ }) => User | null];
257
+ recomputations: () => number;
258
+ resetRecomputations: () => void;
259
+ dependencyRecomputations: () => number;
260
+ resetDependencyRecomputations: () => void;
261
+ } & {
262
+ memoize: typeof import("reselect").weakMapMemoize;
263
+ argsMemoize: typeof import("reselect").weakMapMemoize;
264
+ };
265
+ /** 로딩 상태 (제목 포함) */
266
+ export declare const selectLoadingState: ((state: {
267
+ app: AppState;
268
+ } & {
269
+ app: AppState;
270
+ }) => {
271
+ isLoading: boolean;
272
+ title: string;
273
+ }) & {
274
+ clearCache: () => void;
275
+ resultsCount: () => number;
276
+ resetResultsCount: () => void;
277
+ } & {
278
+ resultFunc: (resultFuncArgs_0: boolean, resultFuncArgs_1: string) => {
279
+ isLoading: boolean;
280
+ title: string;
281
+ };
282
+ memoizedResultFunc: ((resultFuncArgs_0: boolean, resultFuncArgs_1: string) => {
283
+ isLoading: boolean;
284
+ title: string;
285
+ }) & {
286
+ clearCache: () => void;
287
+ resultsCount: () => number;
288
+ resetResultsCount: () => void;
289
+ };
290
+ lastResult: () => {
291
+ isLoading: boolean;
292
+ title: string;
293
+ };
294
+ dependencies: [(state: {
295
+ app: AppState;
296
+ }) => boolean, (state: {
297
+ app: AppState;
298
+ }) => string];
299
+ recomputations: () => number;
300
+ resetRecomputations: () => void;
301
+ dependencyRecomputations: () => number;
302
+ resetDependencyRecomputations: () => void;
303
+ } & {
304
+ memoize: typeof import("reselect").weakMapMemoize;
305
+ argsMemoize: typeof import("reselect").weakMapMemoize;
306
+ };
307
+ /**
308
+ * Store 인스턴스 - KOMCA 패턴
309
+ * 앱 전체에서 하나의 store 사용
310
+ */
311
+ export declare const store: import("@reduxjs/toolkit").EnhancedStore<{
312
+ app: AppState;
313
+ menu: import("./menu-slice").MenuState;
314
+ recentMenu: import("./recent-menu-slice").RecentMenuState;
315
+ }, import("redux").UnknownAction, import("@reduxjs/toolkit").Tuple<[import("redux").StoreEnhancer<{
316
+ dispatch: import("redux-thunk").ThunkDispatch<{
317
+ app: AppState;
318
+ menu: import("./menu-slice").MenuState;
319
+ recentMenu: import("./recent-menu-slice").RecentMenuState;
320
+ }, undefined, import("redux").UnknownAction>;
321
+ }>, import("redux").StoreEnhancer]>>;
117
322
  /**
118
323
  * App Store 생성
119
324
  * Host 또는 Remote 단독 실행 시 호출
325
+ * @deprecated store 인스턴스를 직접 사용하세요
120
326
  */
121
327
  export declare const createAppStore: () => import("@reduxjs/toolkit").EnhancedStore<{
122
328
  app: AppState;
329
+ menu: import("./menu-slice").MenuState;
330
+ recentMenu: import("./recent-menu-slice").RecentMenuState;
123
331
  }, import("redux").UnknownAction, import("@reduxjs/toolkit").Tuple<[import("redux").StoreEnhancer<{
124
332
  dispatch: import("redux-thunk").ThunkDispatch<{
125
333
  app: AppState;
334
+ menu: import("./menu-slice").MenuState;
335
+ recentMenu: import("./recent-menu-slice").RecentMenuState;
126
336
  }, undefined, import("redux").UnknownAction>;
127
337
  }>, import("redux").StoreEnhancer]>>;
128
338
  /**
@@ -131,7 +341,7 @@ export declare const createAppStore: () => import("@reduxjs/toolkit").EnhancedSt
131
341
  * - Remote (standalone): 자신의 store 반환
132
342
  * - Remote (in Host): window.__REDUX_STORE__ 반환
133
343
  */
134
- export declare const getStore: () => import("../types").HostStore | import("redux").Store<unknown, import("redux").Action, unknown>;
344
+ export declare const getStore: () => HostStore | import("redux").Store<unknown, import("redux").Action, unknown>;
135
345
  /**
136
346
  * 동적 Reducer 주입
137
347
  */
@@ -1 +1 @@
1
- {"version":3,"file":"app-store.d.ts","sourceRoot":"","sources":["../../src/store/app-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAgC,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAExG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAe1C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;eAImB,aAAa,CAAC,MAAM,CAAC;;;;;;;;;;;;;eAK5B,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;;;;;;;;eAKvB,aAAa,CAAC,OAAO,CAAC;;;;;;;;;;;;;eAGX,aAAa,CAAC,MAAM,CAAC;;;;;;;;;;;;;eAGhC,aAAa,CAAC,MAAM,CAAC;;;;;;;;;;;;;eAGjB,aAAa,CAAC,MAAM,CAAC;;;;;;;;;;;;;;qEAS3D,CAAC;AAEH,eAAO,MACH,cAAc,qFACd,OAAO,mFACP,UAAU,kFACV,qBAAqB,4FACrB,UAAU,iFACV,cAAc,qFACd,MAAM,sEACU,CAAC;AAGrB,eAAO,MAAM,iBAAiB,GAAI,OAAO;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,WAA0B,CAAC;AACrF,eAAO,MAAM,UAAU,GAAI,OAAO;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,gBAAmB,CAAC;AACvE,eAAO,MAAM,eAAe,GAAI,OAAO;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,YAAwB,CAAC;AACjF,eAAO,MAAM,qBAAqB,GAAI,OAAO;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,YAA4B,CAAC;AAuB3F;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;oCAmB1B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,sGAkBpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,SAAS,OAAO,SAU1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,UAAU,CAAC,OAAO,cAAc,CAAC,SAGnE,CAAC;AAGF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"app-store.d.ts","sourceRoot":"","sources":["../../src/store/app-store.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,15 @@
1
1
  /**
2
- * App Store - KOMCA 패턴
2
+ * App Store
3
3
  *
4
4
  * Host/Remote 모두에서 사용할 수 있는 Store 설정
5
5
  * - Host: 자체 store 생성 후 window.__REDUX_STORE__에 노출
6
6
  * - Remote (standalone): 자체 store 생성
7
7
  * - Remote (in Host): window.__REDUX_STORE__ 사용
8
8
  */
9
- import { configureStore, combineReducers, createSlice } from '@reduxjs/toolkit';
9
+ import { configureStore, combineReducers, createSlice, createSelector } from '@reduxjs/toolkit';
10
10
  import { storage } from '../utils/storage';
11
+ import menuReducer from './menu-slice';
12
+ import recentMenuReducer from './recent-menu-slice';
11
13
  // ============================================
12
14
  // App Slice (인증 상태 관리)
13
15
  // ============================================
@@ -23,15 +25,14 @@ export const appSlice = createSlice({
23
25
  name: 'app',
24
26
  initialState: initialAppState,
25
27
  reducers: {
28
+ // Access Token은 메모리(Redux)에만 저장
29
+ // 새로고침 시 Refresh Token(HttpOnly Cookie)으로 재발급
26
30
  setAccessToken: (state, action) => {
27
31
  state.accessToken = action.payload;
28
- // localStorage에도 저장
29
- storage.setAccessToken(action.payload);
30
32
  },
33
+ // User 정보도 메모리(Redux)에만 저장
31
34
  setUser: (state, action) => {
32
35
  state.user = action.payload;
33
- // localStorage에도 저장
34
- storage.setUser(action.payload);
35
36
  },
36
37
  setLoading: (state, action) => {
37
38
  state.isLoading = action.payload;
@@ -53,47 +54,63 @@ export const appSlice = createSlice({
53
54
  },
54
55
  });
55
56
  export const { setAccessToken, setUser, setLoading, setGlobalLoadingTitle, setService, setSelectedGnb, logout, } = appSlice.actions;
56
- // Selectors
57
+ // ============================================
58
+ // Selectors (기본)
59
+ // ============================================
60
+ export const selectAppState = (state) => state.app;
57
61
  export const selectAccessToken = (state) => state.app.accessToken;
58
62
  export const selectUser = (state) => state.app.user;
59
63
  export const selectIsLoading = (state) => state.app.isLoading;
60
- export const selectIsAuthenticated = (state) => !!state.app.accessToken;
64
+ export const selectGlobalLoadingTitle = (state) => state.app.globalLoadingTitle;
65
+ export const selectService = (state) => state.app.service;
66
+ export const selectAppSelectedGnb = (state) => state.app.selectedGnb;
67
+ // ============================================
68
+ // Selectors (파생 - createSelector 활용)
69
+ // ============================================
70
+ /** 인증 여부 (메모이제이션) */
71
+ export const selectIsAuthenticated = createSelector([selectAccessToken], (token) => !!token);
72
+ /** 사용자 역할 */
73
+ export const selectUserRole = createSelector([selectUser], (user) => user?.role || 'guest');
74
+ /** 관리자 여부 */
75
+ export const selectIsAdmin = createSelector([selectUser], (user) => user?.role === 'admin');
76
+ /** 사용자 권한 목록 */
77
+ export const selectUserPermissions = createSelector([selectUser], (user) => user?.permissions || []);
78
+ /** 로딩 상태 (제목 포함) */
79
+ export const selectLoadingState = createSelector([selectIsLoading, selectGlobalLoadingTitle], (isLoading, title) => ({ isLoading, title }));
61
80
  // ============================================
62
81
  // Store 생성
63
82
  // ============================================
64
83
  // 동적 Reducer 저장소
65
84
  let dynamicReducers = {};
66
- // 기본 Reducer
85
+ // 기본 Reducer (KOMCA 패턴 - 관심사 분리)
67
86
  const staticReducers = {
68
87
  app: appSlice.reducer,
88
+ menu: menuReducer,
89
+ recentMenu: recentMenuReducer,
69
90
  };
70
91
  // Root Reducer 생성
71
92
  const createRootReducer = () => combineReducers({
72
93
  ...staticReducers,
73
94
  ...dynamicReducers,
74
95
  });
75
- // Store 인스턴스 (단독 실행용)
76
- let storeInstance = null;
96
+ /**
97
+ * Store 인스턴스 - KOMCA 패턴
98
+ * 앱 전체에서 하나의 store 사용
99
+ */
100
+ export const store = configureStore({
101
+ reducer: createRootReducer(),
102
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware({
103
+ serializableCheck: false,
104
+ }),
105
+ });
106
+ // Store 인스턴스 (단독 실행용) - 호환성 유지
107
+ let storeInstance = store;
77
108
  /**
78
109
  * App Store 생성
79
110
  * Host 또는 Remote 단독 실행 시 호출
111
+ * @deprecated store 인스턴스를 직접 사용하세요
80
112
  */
81
113
  export const createAppStore = () => {
82
- const store = configureStore({
83
- reducer: createRootReducer(),
84
- middleware: (getDefaultMiddleware) => getDefaultMiddleware({
85
- serializableCheck: false,
86
- }),
87
- // localStorage에서 초기 상태 복원
88
- preloadedState: {
89
- app: {
90
- ...initialAppState,
91
- accessToken: storage.getAccessToken(),
92
- user: storage.getUser(),
93
- },
94
- },
95
- });
96
- storeInstance = store;
97
114
  return store;
98
115
  };
99
116
  /**
@@ -126,9 +143,9 @@ export const injectReducer = (key, reducer) => {
126
143
  return;
127
144
  }
128
145
  dynamicReducers[key] = reducer;
129
- const store = getStore();
130
- if (store && 'replaceReducer' in store) {
131
- store.replaceReducer(createRootReducer());
146
+ const currentStore = getStore();
147
+ if (currentStore && 'replaceReducer' in currentStore) {
148
+ currentStore.replaceReducer(createRootReducer());
132
149
  }
133
150
  };
134
151
  /**
@@ -1,3 +1,5 @@
1
1
  export * from './store-access';
2
2
  export * from './app-store';
3
+ export * from './menu-slice';
4
+ export * from './recent-menu-slice';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAG5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
@@ -1,2 +1,5 @@
1
1
  export * from './store-access';
2
2
  export * from './app-store';
3
+ // 분리된 Slices (KOMCA 패턴)
4
+ export * from './menu-slice';
5
+ export * from './recent-menu-slice';
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Menu Slice
3
+ * 메뉴 상태 관리 (GNB, LNB, 선택 상태)
4
+ */
5
+ import { MenuItem } from '../types';
6
+ export interface MenuState {
7
+ /** GNB 메뉴 목록 */
8
+ gnbItems: MenuItem[];
9
+ /** LNB 메뉴 목록 */
10
+ lnbItems: MenuItem[];
11
+ /** 선택된 GNB ID */
12
+ selectedGnbId: string;
13
+ /** 선택된 LNB ID */
14
+ selectedLnbId: string;
15
+ /** 펼쳐진 메뉴 ID 목록 */
16
+ expandedIds: string[];
17
+ /** 메뉴 로딩 여부 */
18
+ isLoading: boolean;
19
+ }
20
+ export declare const setGnbItems: import("@reduxjs/toolkit").ActionCreatorWithPayload<import("../types").LnbMenuItem[], "menu/setGnbItems">, setLnbItems: import("@reduxjs/toolkit").ActionCreatorWithPayload<import("../types").LnbMenuItem[], "menu/setLnbItems">, setSelectedGnbId: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "menu/setSelectedGnbId">, setSelectedLnbId: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "menu/setSelectedLnbId">, setExpandedIds: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "menu/setExpandedIds">, toggleExpanded: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "menu/toggleExpanded">, setMenuLoading: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "menu/setMenuLoading">, resetMenu: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"menu/resetMenu">;
21
+ interface RootStateWithMenu {
22
+ menu: MenuState;
23
+ }
24
+ export declare const selectMenuState: (state: RootStateWithMenu) => MenuState;
25
+ export declare const selectGnbItems: (state: RootStateWithMenu) => import("../types").LnbMenuItem[];
26
+ export declare const selectLnbItems: (state: RootStateWithMenu) => import("../types").LnbMenuItem[];
27
+ export declare const selectSelectedGnbId: (state: RootStateWithMenu) => string;
28
+ export declare const selectSelectedLnbId: (state: RootStateWithMenu) => string;
29
+ export declare const selectExpandedIds: (state: RootStateWithMenu) => string[];
30
+ export declare const selectMenuLoading: (state: RootStateWithMenu) => boolean;
31
+ export declare const selectSelectedGnb: ((state: RootStateWithMenu) => import("../types").LnbMenuItem | null) & {
32
+ clearCache: () => void;
33
+ resultsCount: () => number;
34
+ resetResultsCount: () => void;
35
+ } & {
36
+ resultFunc: (resultFuncArgs_0: import("../types").LnbMenuItem[], resultFuncArgs_1: string) => import("../types").LnbMenuItem | null;
37
+ memoizedResultFunc: ((resultFuncArgs_0: import("../types").LnbMenuItem[], resultFuncArgs_1: string) => import("../types").LnbMenuItem | null) & {
38
+ clearCache: () => void;
39
+ resultsCount: () => number;
40
+ resetResultsCount: () => void;
41
+ };
42
+ lastResult: () => import("../types").LnbMenuItem | null;
43
+ dependencies: [(state: RootStateWithMenu) => import("../types").LnbMenuItem[], (state: RootStateWithMenu) => string];
44
+ recomputations: () => number;
45
+ resetRecomputations: () => void;
46
+ dependencyRecomputations: () => number;
47
+ resetDependencyRecomputations: () => void;
48
+ } & {
49
+ memoize: typeof import("reselect").weakMapMemoize;
50
+ argsMemoize: typeof import("reselect").weakMapMemoize;
51
+ };
52
+ export declare const selectSelectedLnb: ((state: RootStateWithMenu) => import("../types").LnbMenuItem | null) & {
53
+ clearCache: () => void;
54
+ resultsCount: () => number;
55
+ resetResultsCount: () => void;
56
+ } & {
57
+ resultFunc: (resultFuncArgs_0: import("../types").LnbMenuItem[], resultFuncArgs_1: string) => import("../types").LnbMenuItem | null;
58
+ memoizedResultFunc: ((resultFuncArgs_0: import("../types").LnbMenuItem[], resultFuncArgs_1: string) => import("../types").LnbMenuItem | null) & {
59
+ clearCache: () => void;
60
+ resultsCount: () => number;
61
+ resetResultsCount: () => void;
62
+ };
63
+ lastResult: () => import("../types").LnbMenuItem | null;
64
+ dependencies: [(state: RootStateWithMenu) => import("../types").LnbMenuItem[], (state: RootStateWithMenu) => string];
65
+ recomputations: () => number;
66
+ resetRecomputations: () => void;
67
+ dependencyRecomputations: () => number;
68
+ resetDependencyRecomputations: () => void;
69
+ } & {
70
+ memoize: typeof import("reselect").weakMapMemoize;
71
+ argsMemoize: typeof import("reselect").weakMapMemoize;
72
+ };
73
+ export declare const selectBreadcrumb: ((state: RootStateWithMenu) => import("../types").LnbMenuItem[]) & {
74
+ clearCache: () => void;
75
+ resultsCount: () => number;
76
+ resetResultsCount: () => void;
77
+ } & {
78
+ resultFunc: (resultFuncArgs_0: import("../types").LnbMenuItem[], resultFuncArgs_1: string) => import("../types").LnbMenuItem[];
79
+ memoizedResultFunc: ((resultFuncArgs_0: import("../types").LnbMenuItem[], resultFuncArgs_1: string) => import("../types").LnbMenuItem[]) & {
80
+ clearCache: () => void;
81
+ resultsCount: () => number;
82
+ resetResultsCount: () => void;
83
+ };
84
+ lastResult: () => import("../types").LnbMenuItem[];
85
+ dependencies: [(state: RootStateWithMenu) => import("../types").LnbMenuItem[], (state: RootStateWithMenu) => string];
86
+ recomputations: () => number;
87
+ resetRecomputations: () => void;
88
+ dependencyRecomputations: () => number;
89
+ resetDependencyRecomputations: () => void;
90
+ } & {
91
+ memoize: typeof import("reselect").weakMapMemoize;
92
+ argsMemoize: typeof import("reselect").weakMapMemoize;
93
+ };
94
+ declare const _default: import("redux").Reducer<MenuState>;
95
+ export default _default;
96
+ //# sourceMappingURL=menu-slice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-slice.d.ts","sourceRoot":"","sources":["../../src/store/menu-slice.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMpC,MAAM,WAAW,SAAS;IACxB,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,iBAAiB;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAkDD,eAAO,MACL,WAAW,6GACX,WAAW,6GACX,gBAAgB,wFAChB,gBAAgB,wFAChB,cAAc,wFACd,cAAc,sFACd,cAAc,uFACd,SAAS,0EACU,CAAC;AAMtB,UAAU,iBAAiB;IACzB,IAAI,EAAE,SAAS,CAAC;CACjB;AAGD,eAAO,MAAM,eAAe,GAAI,OAAO,iBAAiB,cAAe,CAAC;AACxE,eAAO,MAAM,cAAc,GAAI,OAAO,iBAAiB,qCAAwB,CAAC;AAChF,eAAO,MAAM,cAAc,GAAI,OAAO,iBAAiB,qCAAwB,CAAC;AAChF,eAAO,MAAM,mBAAmB,GAAI,OAAO,iBAAiB,WAA6B,CAAC;AAC1F,eAAO,MAAM,mBAAmB,GAAI,OAAO,iBAAiB,WAA6B,CAAC;AAC1F,eAAO,MAAM,iBAAiB,GAAI,OAAO,iBAAiB,aAA2B,CAAC;AACtF,eAAO,MAAM,iBAAiB,GAAI,OAAO,iBAAiB,YAAyB,CAAC;AAGpF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;2BARQ,iBAAiB,+CAEZ,iBAAiB;;;;;;;;CAS3D,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;2BAZQ,iBAAiB,+CAEZ,iBAAiB;;;;;;;;CA0B3D,CAAC;AAGF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;2BA/BS,iBAAiB,+CAEZ,iBAAiB;;;;;;;;CAmD3D,CAAC;;AAEF,wBAAiC"}