import SwiftUI struct MainHomeRankingView: View { let onTapCreator: (Int) -> Void @StateObject private var viewModel = MainHomeRankingViewModel() init(onTapCreator: @escaping (Int) -> Void = { _ in }) { self.onTapCreator = onTapCreator } var body: some View { ZStack { Color.black .ignoresSafeArea() if viewModel.isLoading && !viewModel.hasLoaded { ProgressView() .progressViewStyle(CircularProgressViewStyle(tint: .white)) } else if viewModel.items.isEmpty { MainHomeRankingEmptyStateView() } else { rankingContent } } .onAppear { if !viewModel.hasLoaded { viewModel.fetchRankings() } } } private var rankingContent: some View { ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: SodaSpacing.s8) { ForEach(firstRankItems) { item in MainHomeRankingCard( item: item, showRankChange: viewModel.showRankChange, columnsPerRow: 1, onTapCreator: onTapCreator ) } if !secondToSeventhRankItems.isEmpty { LazyVGrid(columns: twoColumns, alignment: .center, spacing: SodaSpacing.s8) { ForEach(secondToSeventhRankItems) { item in MainHomeRankingCard( item: item, showRankChange: viewModel.showRankChange, columnsPerRow: 2, onTapCreator: onTapCreator ) } } } if !eighthToTenthRankItems.isEmpty { LazyVGrid(columns: threeColumns, alignment: .center, spacing: SodaSpacing.s8) { ForEach(eighthToTenthRankItems) { item in MainHomeRankingCard( item: item, showRankChange: viewModel.showRankChange, columnsPerRow: 3, onTapCreator: onTapCreator ) } } } if !rowRankItems.isEmpty { VStack(spacing: SodaSpacing.s8) { ForEach(rowRankItems) { item in MainHomeRankingRow( item: item, showRankChange: viewModel.showRankChange, onTapCreator: onTapCreator ) } } } } .padding(.horizontal, SodaSpacing.s8) .padding(.vertical, SodaSpacing.s20) } } private var twoColumns: [GridItem] { [GridItem(.flexible()), GridItem(.flexible())] } private var threeColumns: [GridItem] { [GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())] } private var firstRankItems: [MainHomeCreatorRankingItem] { viewModel.items.filter { $0.rank == 1 } } private var secondToSeventhRankItems: [MainHomeCreatorRankingItem] { viewModel.items.filter { 2...7 ~= $0.rank } } private var eighthToTenthRankItems: [MainHomeCreatorRankingItem] { viewModel.items.filter { 8...10 ~= $0.rank } } private var rowRankItems: [MainHomeCreatorRankingItem] { viewModel.items.filter { $0.rank >= 11 } } } struct MainHomeRankingView_Previews: PreviewProvider { static var previews: some View { MainHomeRankingView() } }