@nine-lab/nine-mu 0.1.382 β†’ 0.1.384

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nine-lab/nine-mu",
3
- "version": "0.1.382",
3
+ "version": "0.1.384",
4
4
  "description": "AI-Driven Full-Stack Code Fabrication Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/nine-mu.umd.js",
@@ -205,40 +205,52 @@ class NineExceptionHook extends React.Component {
205
205
  // ==========================================
206
206
  // 🎯 3. 핡심: μ™ΈλΆ€ μ£Όμž…ν˜• 404 λΌμš°νŒ… κΈ°λŠ₯ νƒ‘μž¬
207
207
  // ==========================================
208
- export function NineHook({ menuUrl, views, error404, onCatch, fallback, styles, containerStyle }) {
208
+ // ==========================================
209
+ // 🎯 3. μ΅œμ’… μ™„κ²°: μžμ‹ μ»΄ν¬λ„ŒνŠΈ(children)λ₯Ό μˆ˜μš©ν•˜λŠ” ꡬ쑰둜 λ³€κ²½
210
+ // ==========================================
211
+ export function NineHook({ children, menuUrl, views, error404, onCatch, fallback, styles, containerStyle }) {
209
212
  const [menuData, setMenuData] = useState([]);
210
213
 
211
- // 🎯 AIκ°€ νŒŒμΌμ„ μˆ˜μ •ν•˜λ©΄ λŸ°νƒ€μž„μ— μ‹€μ‹œκ°„ λ°˜μ˜λ˜λ„λ‘ 동적 fetch 처리
212
- useEffect(() => {
214
+ const fetchRoutes = async () => {
213
215
  if (!menuUrl) return;
214
-
215
- const fetchRoutes = async () => {
216
- try {
217
- // μΊμ‹œ λ²„μŠ€νŒ…(?t=...)을 μΆ”κ°€ν•˜λ©΄ AIκ°€ μˆ˜μ •ν–ˆμ„ λ•Œ λΈŒλΌμš°μ € μΊμ‹œλ₯Ό 타지 μ•Šκ³  μ¦‰μ‹œ λ°˜μ˜λ©λ‹ˆλ‹€.
218
- const response = await fetch(`${menuUrl}?t=${Date.now()}`);
219
- if (response.ok) {
220
- const data = await response.json();
221
- setMenuData(data);
222
- }
223
- } catch (e) {
224
- console.error("[Nine-Library] λŸ°νƒ€μž„ 메뉴 동기화 μ‹€νŒ¨:", e);
216
+ try {
217
+ const response = await fetch(`${menuUrl}?t=${Date.now()}`);
218
+ if (response.ok) {
219
+ const data = await response.json();
220
+ setMenuData((prev) => {
221
+ if (JSON.stringify(prev) === JSON.stringify(data)) return prev;
222
+ console.log("πŸ”₯ [Nine-Library] routes.json λ³€κ²½ 감지 -> 전체 μ‹œμŠ€ν…œ 동기화");
223
+ return data;
224
+ });
225
225
  }
226
- };
226
+ } catch (e) {
227
+ console.error("[Nine-Library] λŸ°νƒ€μž„ 메뉴 동기화 μ‹€νŒ¨:", e);
228
+ }
229
+ };
227
230
 
231
+ useEffect(() => {
228
232
  fetchRoutes();
233
+ window.addEventListener('popstate', fetchRoutes);
234
+ document.addEventListener('click', fetchRoutes, true);
235
+ const intervalId = setInterval(fetchRoutes, 3000);
229
236
 
230
- // ν•„μš”μ‹œ: μ£Όμ†Œμ°½ popstateλ‚˜ νŠΉμ • 볡ꡬ 이벀트 μ‹œμ μ— μž¬ν˜ΈμΆœν•˜λ„λ‘ 트리거 연동 κ°€λŠ₯
237
+ return () => {
238
+ window.removeEventListener('popstate', fetchRoutes);
239
+ document.removeEventListener('click', fetchRoutes, true);
240
+ clearInterval(intervalId);
241
+ };
231
242
  }, [menuUrl]);
232
243
 
233
- // 데이터가 λ‘œλ“œλ˜κΈ° μ „μ—λŠ” κ°€λ³κ²Œ λ‘œλ”© μƒνƒœλ₯Ό 보여주고, μ™„λ£Œλ˜λ©΄ λΌμš°ν„° ꡬ좕
234
244
  const dynamicRoutes = createDynamicRoutes(menuData, views, error404);
235
245
 
236
246
  return React.createElement(
237
247
  ScreenProvider,
238
- { menuData },
248
+ { menuData }, // 🎯 이 μ „μ—­ μ»¨ν…μŠ€νŠΈ κ³΅κΈ‰μžκ°€ κ°μ‹ΈλŠ” λ²”μœ„λ₯Ό λŒ€ν­ λ„“νž™λ‹ˆλ‹€.
239
249
  React.createElement(
240
250
  NineExceptionHook,
241
251
  { onCatch, fallback, styles, containerStyle },
252
+ // πŸ’‘ [λ ˆμ΄μ•„μ›ƒ μœ μ—°μ„± 확보]: Routes λ°”κΉ₯의 μ»΄ν¬λ„ŒνŠΈ(예: LeftMenu)κ°€ μžˆλ‹€λ©΄ 여기에 λ¨Όμ € λΏŒλ €μ€λ‹ˆλ‹€.
253
+ children,
242
254
  React.createElement(
243
255
  Suspense,
244
256
  { fallback: React.createElement('div', { style: { padding: '25px', color: '#666', fontFamily: 'monospace' } }, '>> Loading component matrix...') },