// // SeriesMainByGenreView.swift // SodaLive // // Created by klaus on 11/14/25. // import SwiftUI struct SeriesMainByGenreView: View { @StateObject var viewModel = SeriesMainByGenreViewModel() @State private var isInitialized = false var body: some View { ZStack { VStack(spacing: 16) { if !viewModel.genreList.isEmpty { SeriesMainGenreView( genreList: viewModel.genreList, selectGenre: viewModel.onTapGenre, selectedGenre: $viewModel.selectedGenre ) } ScrollView(.vertical, showsIndicators: false) { let horizontalPadding: CGFloat = 24 let gridSpacing: CGFloat = 16 let width = (screenSize().width - (horizontalPadding * 2) - gridSpacing) / 2 LazyVGrid( columns: Array( repeating: GridItem( .flexible(), spacing: gridSpacing, alignment: .topLeading ), count: 2 ), alignment: .leading, spacing: gridSpacing ) { ForEach(viewModel.seriesList.indices, id: \.self) { index in let item = viewModel.seriesList[index] SeriesMainItemView(item: item, width: width, height: width * 227 / 160) .contentShape(Rectangle()) .onAppear { if index == viewModel.seriesList.count - 1 { viewModel.getSeriesListByGenre() } } .onTapGesture { AppState.shared.setAppStep(step: .seriesDetail(seriesId: item.seriesId)) } } } .padding(.horizontal, horizontalPadding) } } .sodaToast(isPresented: $viewModel.isShowPopup, message: viewModel.errorMessage, autohideIn: 2) .onAppear { if !isInitialized { viewModel.getGenreList() isInitialized = true } } if viewModel.isLoading { LoadingView() } } } } #Preview { SeriesMainByGenreView() }