120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  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: "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()
 | 
						|
}
 |