// // HomeTabView.swift // SodaLive // // Created by klaus on 7/10/25. // import SwiftUI import Bootpay import BootpayUI struct HomeTabView: View { @StateObject var viewModel = HomeTabViewModel() @StateObject var liveViewModel = LiveViewModel() @AppStorage("token") private var token: String = UserDefaults.string(forKey: UserDefaultsKey.token) @AppStorage("role") private var role: String = UserDefaults.string(forKey: UserDefaultsKey.role) @AppStorage("auth") private var auth: Bool = UserDefaults.bool(forKey: UserDefaultsKey.auth) @State private var isShowAuthView: Bool = false @State private var isShowAuthConfirmView: Bool = false @State private var pendingAction: (() -> Void)? = nil @State private var payload = Payload() var onTapPopularCharacterAllView: (() -> Void)? = nil // CharacterView에서 전달받는 단일 진입 함수 private func handleCharacterSelection(_ characterId: Int) { let trimmed = token.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { AppState.shared.setAppStep(step: .login) return } if auth == false { pendingAction = { AppState.shared .setAppStep(step: .characterDetail(characterId: characterId)) } isShowAuthConfirmView = true return } AppState.shared.setAppStep(step: .characterDetail(characterId: characterId)) } var body: some View { BaseView(isLoading: $viewModel.isLoading) { ZStack(alignment: .bottomTrailing) { 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: {})) } Image("ic_storage") .onTapGesture { AppState .shared .setAppStep(step: .myBox(currentTab: .orderlist)) } } } .padding(.horizontal, 24) .padding(.vertical, 20) ScrollView(.vertical, showsIndicators: false) { VStack(alignment: .leading, spacing: 48) { if !viewModel.liveList.isEmpty { VStack(alignment: .leading, spacing: 16) { HStack(spacing: 0) { Text("지금") .font(.custom(Font.preBold.rawValue, size: 24)) .foregroundColor(.button) Text(" 라이브중") .font(.custom(Font.preBold.rawValue, size: 24)) .foregroundColor(.white) } .padding(.horizontal, 24) ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 16) { ForEach(0..