// // ContentMainTabHomeView.swift // SodaLive // // Created by klaus on 2/20/25. // import SwiftUI struct ContentMainTabHomeView: View { @StateObject var viewModel = ContentMainTabHomeViewModel() var body: some View { BaseView(isLoading: $viewModel.isLoading) { ScrollView(.vertical, showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { HStack(spacing: 0) { Text("콘텐츠 마켓") .font(.custom(Font.bold.rawValue, size: 21.3)) .foregroundColor(Color.button) Spacer() Image("ic_content_keep") .onTapGesture { AppState.shared.setAppStep(step: .myBox(currentTab: .orderlist)) } } .padding(.horizontal, 13.3) if let notice = viewModel.noticeItem { ContentMainTabHomeNoticeView(notice: notice) { AppState.shared .setAppStep(step: .noticeDetail(notice: $0)) } .padding(.top, 15) .padding(.horizontal, 13.3) } if viewModel.bannerList.count > 0 { ContentMainBannerViewV2(bannerList: viewModel.bannerList) .padding(.top, 30) .padding(.horizontal, 13.3) } HStack(spacing: 0) { Image("ic_title_search_black") Text("채널명을 입력해 보세요") .font(.custom(Font.medium.rawValue, size: 13.3)) .foregroundColor(Color.gray55) .keyboardType(.default) .padding(.horizontal, 13.3) Spacer() } .padding(.horizontal, 21.3) .frame(height: 50) .frame(maxWidth: .infinity) .background(Color.gray22) .overlay( RoundedRectangle(cornerRadius: 6.7) .strokeBorder(lineWidth: 1) .foregroundColor(Color.graybb) ) .padding(.top, 30) .padding(.horizontal, 13.3) .onTapGesture { UserDefaults.set("", forKey: .searchChannel) AppState.shared.setAppStep(step: .searchChannel) } VStack(spacing: 13.3) { HStack(spacing: 0) { ContentMainTabCategoryView( imageName: "ic_category_series", title: "시리즈", onClick: { AppState.shared .setAppStep( step: .contentMain( startTab: .SERIES ) ) } ) .frame(maxWidth: .infinity) ContentMainTabCategoryView( imageName: "ic_category_content", title: "단편", onClick: { AppState.shared .setAppStep( step: .contentMain( startTab: .CONTENT ) ) } ) .frame(maxWidth: .infinity) ContentMainTabCategoryView( imageName: "ic_category_audio_book", title: "오디오북", onClick: { viewModel.errorMessage = "준비중입니다." viewModel.isShowPopup = true } ) .frame(maxWidth: .infinity) ContentMainTabCategoryView( imageName: "ic_category_alarm", title: "모닝콜", onClick: { AppState.shared .setAppStep( step: .contentMain( startTab: .ALARM ) ) } ) .frame(maxWidth: .infinity) } HStack(spacing: 0) { ContentMainTabCategoryView( imageName: "ic_category_asmr", title: "ASMR", onClick: { AppState.shared .setAppStep( step: .contentMain( startTab: .ASMR ) ) } ) .frame(maxWidth: .infinity) ContentMainTabCategoryView( imageName: "ic_category_replay", title: "다시듣기", onClick: { AppState.shared .setAppStep( step: .contentMain( startTab: .REPLAY ) ) } ) .frame(maxWidth: .infinity) ContentMainTabCategoryView( imageName: "ic_category_audio_toon", title: "오디오툰", onClick: { viewModel.errorMessage = "준비중입니다." viewModel.isShowPopup = true } ) .frame(maxWidth: .infinity) ContentMainTabCategoryView( imageName: "ic_category_free", title: "무료", onClick: { AppState.shared .setAppStep( step: .contentMain( startTab: .FREE ) ) } ) .frame(maxWidth: .infinity) } } .padding(.vertical, 13.3) .background(Color.gray22) .cornerRadius(5.3) .padding(.top, 30) .padding(.horizontal, 13.3) if let response = viewModel.rankCreatorResponse { ContentMainTabHomeRankCreatorView(response: response) .padding(.top, 30) .padding(.horizontal, 13.3) } if !viewModel.rankSeriesList.isEmpty { ContentMainTabHomeRankSeriesView(seriesList: viewModel.rankSeriesList) .padding(.top, 30) .padding(.horizontal, 13.3) } if !viewModel.rankSortTypeList.isEmpty { ContentMainTabRankContentView( title: "인기 단편", isMore: true, onClickMore: { AppState.shared.setAppStep(step: .contentRankingAll) }, sortList: !viewModel.rankSortTypeList.isEmpty ? viewModel.rankSortTypeList : [], onClickSort: { viewModel.getContentRanking(sort: $0) }, contentList: viewModel.rankContentList ) .padding(.top, 30) .padding(.horizontal, 13.3) } if viewModel.eventBannerList.count > 0 { SectionEventBannerView(items: viewModel.eventBannerList) .frame( width: viewModel.eventBannerList.count > 0 ? screenSize().width : 0, height: viewModel.eventBannerList.count > 0 ? screenSize().width * 300 / 1000 : 0, alignment: .center ) .padding(.top, 30) } if !viewModel.contentRankCreatorList.isEmpty { ContentByChannelView( title: "채널별 인기 콘텐츠", creatorList: viewModel.contentRankCreatorList, contentList: viewModel.salesCountRankContentList, onClickCreator: { viewModel.getPopularContentByCreator(creatorId: $0) } ) .padding(.top, 30) .padding(.horizontal, 13.3) } Text(""" - 회사명 : 주식회사 소다라이브 - 대표자 : 이재형 - 주소 : 경기도 성남시 분당구 황새울로335번길 10, 5층 563A호 - 사업자등록번호 : 870-81-03220 - 통신판매업신고 : 제2024-성남분당B-1012호 - 고객센터 : 02.2055.1477 (이용시간 10:00~19:00) - 대표 이메일 : sodalive.official@gmail.com """) .font(.custom(Font.medium.rawValue, size: 11)) .foregroundColor(Color.gray77) .padding(.top, 30) .padding(.horizontal, 13.3) } .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 { ContentMainTabHomeView() }