2026-04-13 15:27:04 +09:00
|
|
|
/**
|
|
|
|
|
* 기능 자동 등록 시스템
|
|
|
|
|
*
|
2026-04-19 11:26:12 +09:00
|
|
|
* - features/{kebab-case}/pc/{PascalCase}.jsx : PC 사용자 페이지
|
|
|
|
|
* - features/{kebab-case}/pc/{PascalCase}Admin.jsx : PC 관리자 페이지
|
|
|
|
|
* - features/{kebab-case}/mobile/{PascalCase}.jsx : 모바일 사용자 페이지
|
2026-04-13 15:27:04 +09:00
|
|
|
*
|
|
|
|
|
* 예시:
|
2026-04-19 11:26:12 +09:00
|
|
|
* /boss-crystal → features/boss-crystal/pc/BossCrystal.jsx
|
|
|
|
|
* /admin/boss-crystal → features/boss-crystal/pc/BossCrystalAdmin.jsx
|
2026-04-13 15:27:04 +09:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { lazy } from 'react'
|
|
|
|
|
|
2026-04-19 11:26:12 +09:00
|
|
|
const pages = import.meta.glob('./*/{pc,mobile}/*.jsx')
|
2026-04-13 15:27:04 +09:00
|
|
|
|
|
|
|
|
function slugToPascal(slug) {
|
|
|
|
|
return slug
|
|
|
|
|
.split('-')
|
|
|
|
|
.map((s) => s.charAt(0).toUpperCase() + s.slice(1))
|
|
|
|
|
.join('')
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-19 11:26:12 +09:00
|
|
|
const userPcCache = new Map()
|
|
|
|
|
const adminPcCache = new Map()
|
|
|
|
|
const userMobileCache = new Map()
|
2026-04-13 16:01:04 +09:00
|
|
|
|
2026-04-19 11:26:12 +09:00
|
|
|
function loadCached(cache, slug, device, suffix) {
|
2026-04-13 16:01:04 +09:00
|
|
|
if (cache.has(slug)) return cache.get(slug)
|
|
|
|
|
const pascal = slugToPascal(slug)
|
2026-04-19 11:26:12 +09:00
|
|
|
const path = `./${slug}/${device}/${pascal}${suffix}.jsx`
|
|
|
|
|
const loader = pages[path]
|
2026-04-13 16:01:04 +09:00
|
|
|
const component = loader ? lazy(loader) : null
|
|
|
|
|
cache.set(slug, component)
|
|
|
|
|
return component
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-13 15:27:04 +09:00
|
|
|
/**
|
2026-04-19 11:26:12 +09:00
|
|
|
* slug에 해당하는 PC 사용자 페이지 컴포넌트 반환
|
2026-04-13 15:27:04 +09:00
|
|
|
*/
|
|
|
|
|
export function getUserComponent(slug) {
|
2026-04-19 11:26:12 +09:00
|
|
|
return loadCached(userPcCache, slug, 'pc', '')
|
2026-04-13 15:27:04 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2026-04-19 11:26:12 +09:00
|
|
|
* slug에 해당하는 관리자 페이지 컴포넌트 반환 (PC 전용)
|
2026-04-13 15:27:04 +09:00
|
|
|
*/
|
|
|
|
|
export function getAdminComponent(slug) {
|
2026-04-19 11:26:12 +09:00
|
|
|
return loadCached(adminPcCache, slug, 'pc', 'Admin')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* slug에 해당하는 모바일 사용자 페이지 컴포넌트 반환
|
|
|
|
|
*/
|
|
|
|
|
export function getMobileComponent(slug) {
|
|
|
|
|
return loadCached(userMobileCache, slug, 'mobile', '')
|
2026-04-13 15:27:04 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* slug에 해당하는 관리자 페이지가 존재하는지
|
|
|
|
|
*/
|
|
|
|
|
export function hasAdminPage(slug) {
|
|
|
|
|
if (!slug) return false
|
|
|
|
|
const cleaned = slug.replace(/^\/+/, '').split('/')[0]
|
2026-04-13 16:01:04 +09:00
|
|
|
return getAdminComponent(cleaned) !== null
|
2026-04-13 15:27:04 +09:00
|
|
|
}
|