zioinfo-mail/workspace/guardia-messenger/app/(tabs)/_layout.tsx
DESKTOP-TKLFCPR\ython 0ebac500f5
Some checks are pending
GUARDiA CI / Python Lint & Import Test (push) Waiting to run
GUARDiA CI / Validate Install Scripts (push) Waiting to run
GUARDiA CI / PR Validation Summary (push) Blocked by required conditions
feat(enhance-v4): APK QR 배포 / 배치SSH / 자산QR / 스마트알림 / 웹메일 주소록+서명
- ITSM: app_deploy.py (APK 업로드·QR 생성·랜딩 페이지)
- ITSM: batch_ssh.py (다중 서버 동시 SSH 실행)
- ITSM: asset_qr.py (자산 QR 태그·체크인·라벨 인쇄)
- ITSM: smart_notify.py (조건 기반 알림 규칙 엔진)
- ITSM: models.py (AppVersion/BatchSSHJob/AssetQRToken/SmartNotifyRule 등 7개 모델)
- ITSM: main.py (4개 신규 라우터 등록)
- ITSM: static/app.js (앱배포·배치SSH·자산QR·알림규칙 4개 뷰)
- ITSM: static/index.html (신규 사이드바 메뉴 4개)
- Manager: AppDistribution.tsx (APK 업로드 UI·QR 표시·버전 관리)
- Manager: NotificationRules.tsx (알림 규칙 편집기)
- Manager: App.tsx + Sidebar.tsx (신규 라우트 등록)
- Mail: contacts.py (주소록 CRUD·자동완성)
- Mail: signature.py (HTML 서명 관리)
- Mail: Contacts.tsx + SignatureEditor.tsx (프론트엔드 컴포넌트)
- Messenger: scan.tsx (자산 QR 스캔 탭)
- Messenger: _layout.tsx (QR 탭 추가)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 19:49:00 +09:00

111 lines
3.3 KiB
TypeScript

import { Tabs } from 'expo-router'
import { View, Text, StyleSheet } from 'react-native'
import { COLORS } from '../../constants/Config'
function TabIcon({ icon, label, focused }: { icon: string; label: string; focused: boolean }) {
return (
<View style={[tab.wrap, focused && tab.active]}>
<Text style={tab.icon}>{icon}</Text>
<Text style={[tab.label, focused && tab.labelActive]}>{label}</Text>
</View>
)
}
const tab = StyleSheet.create({
wrap: { alignItems: 'center', paddingTop: 4, paddingHorizontal: 2 },
active: {},
icon: { fontSize: 21 },
label: { fontSize: 10, color: COLORS.muted, marginTop: 2, letterSpacing: 0.2 },
labelActive: { color: COLORS.accent, fontWeight: '700' },
})
export default function TabLayout() {
return (
<Tabs
screenOptions={{
headerStyle: { backgroundColor: COLORS.gnbBg },
headerTintColor: '#fff',
headerTitleStyle: { fontWeight: '800', fontSize: 16, letterSpacing: -0.3 },
tabBarStyle: {
backgroundColor: '#fff',
borderTopColor: COLORS.border,
borderTopWidth: 1,
height: 62,
elevation: 8,
shadowColor: '#003366',
shadowOffset: { width: 0, height: -2 },
shadowOpacity: 0.08,
shadowRadius: 8,
},
tabBarActiveTintColor: COLORS.accent,
tabBarInactiveTintColor: COLORS.muted,
tabBarShowLabel: false,
}}
>
<Tabs.Screen
name="index"
options={{
title: '대시보드',
tabBarIcon: ({ focused }) => <TabIcon icon="📊" label="대시보드" focused={focused} />,
}}
/>
<Tabs.Screen
name="sr"
options={{
title: '서비스 요청',
tabBarIcon: ({ focused }) => <TabIcon icon="📋" label="SR" focused={focused} />,
}}
/>
<Tabs.Screen
name="chat"
options={{
title: 'AI 챗봇',
tabBarIcon: ({ focused }) => <TabIcon icon="🤖" label="AI" focused={focused} />,
}}
/>
<Tabs.Screen
name="notifications"
options={{
title: '알림',
tabBarIcon: ({ focused }) => <TabIcon icon="🔔" label="알림" focused={focused} />,
}}
/>
<Tabs.Screen
name="dr"
options={{
title: 'DR 관제',
tabBarIcon: ({ focused }) => <TabIcon icon="🛡️" label="DR" focused={focused} />,
}}
/>
<Tabs.Screen
name="network"
options={{
title: '네트워크',
tabBarIcon: ({ focused }) => <TabIcon icon="🔀" label="네트워크" focused={focused} />,
}}
/>
<Tabs.Screen
name="insights"
options={{
title: 'AI 인사이트',
tabBarIcon: ({ focused }) => <TabIcon icon="🧠" label="AI" focused={focused} />,
}}
/>
<Tabs.Screen
name="scan"
options={{
title: 'QR 스캔',
tabBarIcon: ({ focused }) => <TabIcon icon="📷" label="QR" focused={focused} />,
}}
/>
<Tabs.Screen
name="settings"
options={{
title: '설정',
tabBarIcon: ({ focused }) => <TabIcon icon="⚙️" label="설정" focused={focused} />,
}}
/>
</Tabs>
)
}