// // ContentMainTabFreeView.swift // SodaLive // // Created by klaus on 2/22/25. // import SwiftUI struct ContentMainTabFreeView: View { @StateObject var viewModel = ContentMainTabFreeViewModel() var body: some View { BaseView(isLoading: $viewModel.isLoading) { ScrollView(.vertical, showsIndicators: false) { VStack(spacing: 0) { if !viewModel.bannerList.isEmpty { ContentMainBannerViewV2(bannerList: viewModel.bannerList) .padding(.horizontal, 13.3) } if let introduceCreator = viewModel.introduceCreator { ContentMainNewContentViewV2( title: introduceCreator.title, onClickMore: { AppState.shared .setAppStep(step: .introduceCreatorAll) }, themeList: [], contentList: introduceCreator.items ) { _ in } .padding(.top, 30) } if !viewModel.recommendSeriesList.isEmpty { ContentMainNewOrRecommendSeriesView( title: "추천 무료 시리즈", recommendSeriesList: viewModel.recommendSeriesList ) .padding(.top, 30) } if !viewModel.themeList.isEmpty { ContentMainNewContentViewV2( title: "새로운 무료 콘텐츠", onClickMore: { AppState.shared .setAppStep(step: .newContentAll(isFree: true)) }, themeList: viewModel.themeList, contentList: viewModel.newFreeContentList ) { viewModel.getNewContentOfTheme(theme: $0) } .padding(.top, 30) } if !viewModel.creatorList.isEmpty { ContentByChannelView( title: "채널별 추천 무료 콘텐츠", creatorList: viewModel.creatorList, contentList: viewModel.playCountRankContentList, onClickCreator: { viewModel.getPopularContentByCreator(creatorId: $0) } ) .padding(.top, 30) } if !viewModel.curationList.isEmpty { ContentMainCurationViewV2(curationList: viewModel.curationList) .padding(.top, 30) } } .onAppear { viewModel.fetchData() } } } .popup(isPresented: $viewModel.isShowPopup, type: .toast, position: .bottom, autohideIn: 2) { HStack { Spacer() Text(viewModel.errorMessage) .padding(.vertical, 13.3) .frame(width: screenSize().width - 66.7, alignment: .center) .font(.custom(Font.medium.rawValue, size: 12)) .background(Color.button) .foregroundColor(Color.white) .multilineTextAlignment(.leading) .cornerRadius(20) .padding(.bottom, 66.7) Spacer() } } } } #Preview { ContentMainTabFreeView() }