// // ChatTabView.swift // SodaLive // // Created by klaus on 8/29/25. // import SwiftUI struct ChatTabView: View { @AppStorage("token") private var token: String = UserDefaults.string(forKey: UserDefaultsKey.token) private enum InnerTab: Int, CaseIterable { case character = 0 case talk = 1 var title: String { switch self { case .character: return "캐릭터" case .talk: return "톡" } } } @State private var selectedTab: InnerTab = .character var body: some View { VStack(alignment: .leading, spacing: 0) { // 앱 바 HStack(spacing: 24) { Image("img_text_logo") Spacer() if !token.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { Image("ic_search_white") .onTapGesture { AppState .shared .setAppStep(step: .search) } Image("ic_can") .onTapGesture { AppState .shared .setAppStep(step: .canCharge(refresh: {})) } } } .padding(.horizontal, 24) .padding(.vertical, 20) // 내부 탭 (캐릭터 / 톡) HStack(spacing: 0) { ChatInnerTab( title: InnerTab.character.title, isSelected: selectedTab == .character, onTap: { if selectedTab != .character { selectedTab = .character } } ) ChatInnerTab( title: InnerTab.talk.title, isSelected: selectedTab == .talk, onTap: { if selectedTab != .talk { selectedTab = .talk } } ) } .padding(.bottom, 12) Group { switch selectedTab { case .character: CharacterView() case .talk: TalkView() } } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) } } } struct ChatInnerTab: View { let title: String let isSelected: Bool let onTap: () -> Void var body: some View { Button(action: onTap) { VStack(spacing: 0) { Spacer() Text(title) .font( .custom( isSelected ? Font.preBold.rawValue : Font.preRegular.rawValue, size: 18 ) ) .foregroundColor(Color(hex: isSelected ? "3bb9f1" : "b0bec5")) .frame(maxWidth: .infinity) Spacer() Rectangle() .frame(maxWidth: .infinity) .frame(height: 4) .foregroundColor(Color(hex: "3bb9f1").opacity(isSelected ? 1 : 0)) } .frame(height: 50) .contentShape(Rectangle()) } .buttonStyle(PlainButtonStyle()) } } #Preview { ChatTabView() }