1+ import { useState , useEffect } from "react" ;
12import "../styles/home.css" ;
23
34import { Button , EmptyState } from "@fieldstack/controls" ;
45
5- import type { NavigationItem } from "../loader" ;
6-
7- const MOCK_INSTALLED_MODULES : NavigationItem [ ] = [ ] ;
8-
96const MODULE_ICONS : Record < string , string > = {
107 ledger : "💰" ,
118 subscription : "📅" ,
@@ -19,16 +16,41 @@ const MOCK_RECENT_ACTIVITY = [
1916 { id : 3 , text : "관리자 권한 상태 확인" , time : "7분 전" , dot : "warn" as const } ,
2017] ;
2118
19+ interface InstalledModule {
20+ name : string ;
21+ basePath : string ;
22+ enabled : boolean ;
23+ }
24+
2225interface HomeViewProps {
2326 isAdmin : boolean ;
27+ installMode : "normal" | "bypass" ;
2428 isFirstVisit : boolean ;
2529 onDismissFirstVisit : ( ) => void ;
2630 onOpenSettings : ( ) => void ;
2731 onNavigateAdmin : ( ) => void ;
2832}
2933
30- export function HomeView ( { isAdmin, isFirstVisit, onDismissFirstVisit, onOpenSettings, onNavigateAdmin } : HomeViewProps ) {
31- const hasModules = MOCK_INSTALLED_MODULES . length > 0 ;
34+ export function HomeView ( { isAdmin, installMode, isFirstVisit, onDismissFirstVisit, onOpenSettings, onNavigateAdmin } : HomeViewProps ) {
35+ const [ installedModules , setInstalledModules ] = useState < InstalledModule [ ] > ( [ ] ) ;
36+
37+ // 로그인 후 GET /core/modules/me 로 활성 모듈 목록 조회
38+ useEffect ( ( ) => {
39+ if ( installMode === "bypass" ) return ;
40+ const token = sessionStorage . getItem ( "fs_token" ) ?? "" ;
41+ if ( ! token ) return ;
42+
43+ fetch ( "/core/modules/me" , { headers : { Authorization : `Bearer ${ token } ` } } )
44+ . then ( ( r ) => r . json ( ) )
45+ . then ( ( json : { success : boolean ; data ?: { modules : InstalledModule [ ] } } ) => {
46+ if ( json . success ) {
47+ setInstalledModules ( ( json . data ?. modules ?? [ ] ) . filter ( ( m ) => m . enabled ) ) ;
48+ }
49+ } )
50+ . catch ( ( ) => { /* 모듈 로드 실패는 무음 처리 */ } ) ;
51+ } , [ installMode ] ) ;
52+
53+ const hasModules = installedModules . length > 0 ;
3254
3355 return (
3456 < section className = "panel home-root" aria-labelledby = "home-title" >
@@ -88,7 +110,7 @@ export function HomeView({ isAdmin, isFirstVisit, onDismissFirstVisit, onOpenSet
88110 </ div >
89111 < div className = "home-admin-card" >
90112 < p className = "home-admin-card-label" > 설치된 모듈</ p >
91- < p className = "home-admin-card-value" > { MOCK_INSTALLED_MODULES . length } </ p >
113+ < p className = "home-admin-card-value" > { installedModules . length } </ p >
92114 </ div >
93115 < div className = "home-admin-card" >
94116 < p className = "home-admin-card-label" > 시스템 상태</ p >
@@ -102,7 +124,7 @@ export function HomeView({ isAdmin, isFirstVisit, onDismissFirstVisit, onOpenSet
102124 < div className = "home-stat-grid" >
103125 < article className = "home-stat-card" >
104126 < p className = "home-stat-label" > Installed Modules</ p >
105- < p className = "home-stat-value" > { MOCK_INSTALLED_MODULES . length } </ p >
127+ < p className = "home-stat-value" > { installedModules . length } </ p >
106128 </ article >
107129 < article className = "home-stat-card" >
108130 < p className = "home-stat-label" > Pending Alerts</ p >
@@ -159,15 +181,15 @@ export function HomeView({ isAdmin, isFirstVisit, onDismissFirstVisit, onOpenSet
159181
160182 { hasModules ? (
161183 < div className = "home-modules-grid" >
162- { MOCK_INSTALLED_MODULES . map ( ( mod ) => (
184+ { installedModules . map ( ( mod ) => (
163185 < button
164- key = { mod . id }
186+ key = { mod . name }
165187 className = "module-card"
166188 type = "button"
167- onClick = { ( ) => { window . location . hash = mod . path ; } }
189+ onClick = { ( ) => { window . location . hash = mod . name ; } }
168190 >
169- < p className = "module-card-icon" > { MODULE_ICONS [ mod . id ] ?? "🧩" } </ p >
170- < p className = "module-card-name" > { mod . label } </ p >
191+ < p className = "module-card-icon" > { MODULE_ICONS [ mod . name ] ?? "🧩" } </ p >
192+ < p className = "module-card-name" > { mod . name } </ p >
171193 < p className = "module-card-desc" > Open module workspace</ p >
172194 </ button >
173195 ) ) }
0 commit comments