maplestory/frontend/src/features/registry.js
caadiq b885f464c3 보스 결정 관리 개선
- 최대 인원수를 보스 단위로 통합 (난이도별 → 보스 공통)
- 가격 입력 시 쉼표 자동 표시 (text + inputMode=numeric)
- registry 캐싱으로 sub-route 변경 시 화면 갱신 안되던 버그 수정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:01:04 +09:00

60 lines
1.7 KiB
JavaScript

/**
* 기능 자동 등록 시스템
*
* - features/{kebab-case}/{PascalCase}.jsx : 사용자 페이지
* - features/{kebab-case}/{PascalCase}Admin.jsx : 관리자 페이지
*
* 예시:
* /boss-crystal → features/boss-crystal/BossCrystal.jsx
* /admin/boss-crystal → features/boss-crystal/BossCrystalAdmin.jsx
*/
import { lazy } from 'react'
// Vite의 import.meta.glob으로 features 폴더 전체를 스캔
const userPages = import.meta.glob('./*/*.jsx')
function slugToPascal(slug) {
return slug
.split('-')
.map((s) => s.charAt(0).toUpperCase() + s.slice(1))
.join('')
}
// 컴포넌트 캐시 - 동일 slug에 대해 항상 같은 컴포넌트 인스턴스 반환
// (매 렌더마다 새 lazy() 생성하면 React가 unmount/remount하면서 화면 갱신이 깨짐)
const userCache = new Map()
const adminCache = new Map()
function loadCached(cache, slug, suffix) {
if (cache.has(slug)) return cache.get(slug)
const pascal = slugToPascal(slug)
const path = `./${slug}/${pascal}${suffix}.jsx`
const loader = userPages[path]
const component = loader ? lazy(loader) : null
cache.set(slug, component)
return component
}
/**
* slug에 해당하는 사용자 페이지 컴포넌트 반환
*/
export function getUserComponent(slug) {
return loadCached(userCache, slug, '')
}
/**
* slug에 해당하는 관리자 페이지 컴포넌트 반환
*/
export function getAdminComponent(slug) {
return loadCached(adminCache, slug, 'Admin')
}
/**
* slug에 해당하는 관리자 페이지가 존재하는지
*/
export function hasAdminPage(slug) {
if (!slug) return false
const cleaned = slug.replace(/^\/+/, '').split('/')[0]
return getAdminComponent(cleaned) !== null
}