From 070f928d88b3f6e104bd2ea15c66f560e12978a1 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Fri, 21 Feb 2025 00:04:12 +0800 Subject: [PATCH] fix --- dimensionhub/Core/API.swift | 4 +- dimensionhub/Core/DataCache.swift | 6 +-- dimensionhub/Core/DataModels.swift | 10 +--- dimensionhub/Views/DateNavView.swift | 71 ++++++++-------------------- dimensionhub/Views/IndexView.swift | 66 +++++++++++++++----------- 5 files changed, 65 insertions(+), 92 deletions(-) diff --git a/dimensionhub/Core/API.swift b/dimensionhub/Core/API.swift index 8e76236..9de5fa3 100644 --- a/dimensionhub/Core/API.swift +++ b/dimensionhub/Core/API.swift @@ -58,11 +58,13 @@ struct API { do { let result = try JSONDecoder().decode(APISuccessResponse.self, from: data) return .result(result.result) - } catch { + } catch let err { + print(err) let apiError = try JSONDecoder().decode(APIErrorResponse.self, from: data) return .error(apiError.error.code, apiError.error.message) } } catch let err { + print(err) return .error(-1, err.localizedDescription) } } diff --git a/dimensionhub/Core/DataCache.swift b/dimensionhub/Core/DataCache.swift index a70aad0..5f886f9 100644 --- a/dimensionhub/Core/DataCache.swift +++ b/dimensionhub/Core/DataCache.swift @@ -9,13 +9,13 @@ actor DataCache { public static let shared = DataCache() - private var dateModelCache: [DateModel] = [] + private var dateModelCache: [DateNavModel.DateModel] = [] - func setDateModelCache(_ models: [DateModel]) { + func setDateModelCache(_ models: [DateNavModel.DateModel]) { self.dateModelCache = models } - func getDateModelCache() -> [DateModel] { + func getDateModelCache() -> [DateNavModel.DateModel] { return self.dateModelCache } diff --git a/dimensionhub/Core/DataModels.swift b/dimensionhub/Core/DataModels.swift index 3c7f115..7fe7f82 100644 --- a/dimensionhub/Core/DataModels.swift +++ b/dimensionhub/Core/DataModels.swift @@ -9,12 +9,4 @@ // 日期弹出层 -struct DateModel: Codable { - struct Month: Codable { - let name: String - let disabled: Bool - } - - let year: String - let months: [Month] -} + diff --git a/dimensionhub/Views/DateNavView.swift b/dimensionhub/Views/DateNavView.swift index 1e9dd76..6e2bb7b 100644 --- a/dimensionhub/Views/DateNavView.swift +++ b/dimensionhub/Views/DateNavView.swift @@ -10,23 +10,22 @@ import SwiftUI import Observation struct DateNavView: View { - @AppStorage("selectedDate") var selectedDate: String = "" + @State var navModel = DateNavModel() - @State var navData = DateNavData(dateCells: []) + let selectGroupId: String @Binding var showDateNavPopover: Bool var body: some View { - //let _ = Self._printChanges() VStack(alignment: .center) { - ForEach(navData.dateCells, id: \.year) { cell in + ForEach(navModel.dateModels, id: \.year) { model in VStack(alignment: .leading, spacing: 10) { - Text(cell.year) + Text(model.year) HStack { - ForEach(cell.items, id: \.id) { item in - if item.disabled { - DateDisabledItemView(datetime: item.name) + ForEach(model.months, id: \.id) { month in + if month.disabled { + DateDisabledItemView(datetime: month.name) } else { - DateItemView(id: item.id, datetime: item.name, selected: false, showDateNavPopover: $showDateNavPopover) + DateItemView(datetime: month.name, selected: month.id == selectGroupId, showDateNavPopover: $showDateNavPopover) } } } @@ -34,25 +33,7 @@ struct DateNavView: View { } } .task { - await self.navData.loadDateCells() - } - } - - private func getDateModelData() async -> [DateModel] { - let models = await DataCache.shared.getDateModelCache() - if models.count > 0 { - return models - } else { - let response = await API.getDateIndex(as: [DateModel].self) - switch response { - case .error(let code, let message): - print(code) - print(message) - return [] - case .result(let models): - await DataCache.shared.setDateModelCache(models) - return models - } + await self.navModel.loadDateCells() } } @@ -61,7 +42,6 @@ struct DateNavView: View { extension DateNavView { struct DateItemView: View { - let id: String let datetime: String @State var selected: Bool @Binding var showDateNavPopover: Bool @@ -82,7 +62,6 @@ extension DateNavView { .onTapGesture { self.selected = true self.showDateNavPopover = false - UserDefaults.standard.set(id, forKey: "navSelectedDate") } } } @@ -109,40 +88,28 @@ extension DateNavView { } @Observable -final class DateNavData { - var dateCells: [DateCell] = [] +final class DateNavModel { - struct DateCell { - struct Item: Identifiable { + struct DateModel: Codable { + struct Month: Codable { let id: String let name: String let disabled: Bool - let selected: Bool } let year: String - let items: [Item] + let months: [Month] } - init(dateCells: [DateCell]) { - self.dateCells = dateCells + var dateModels: [DateModel] + + init() { + self.dateModels = [] } @MainActor func loadDateCells() async { - let selectedDate = UserDefaults.standard.value(forKey: "navSelectedDate") as? String ?? "" - - let models = await getDateModelData() - var cells: [DateCell] = [] - for model in models { - let items = model.months.map { month in - let id = "\(model.year)-\(month.name)" - return DateCell.Item(id: id, name: month.name, disabled: month.disabled, selected: id == selectedDate ? true : false) - } - cells.append(DateCell(year: model.year, items: items)) - } - - self.dateCells = cells + self.dateModels = await getDateModelData() } private func getDateModelData() async -> [DateModel] { @@ -151,12 +118,14 @@ final class DateNavData { return models } else { let response = await API.getDateIndex(as: [DateModel].self) + print(response) switch response { case .error(let code, let message): print(code) print(message) return [] case .result(let models): + print(models) await DataCache.shared.setDateModelCache(models) return models } diff --git a/dimensionhub/Views/IndexView.swift b/dimensionhub/Views/IndexView.swift index ebae460..7956df8 100644 --- a/dimensionhub/Views/IndexView.swift +++ b/dimensionhub/Views/IndexView.swift @@ -32,26 +32,37 @@ final class IndexModel { let episodes: [Episode] } - struct UpdateDramaItem: Codable { - let id: Int - let name: String - let thumb: String - let desc: String - let datetime: String + struct UpdateDramaGroup: Codable { + struct Item: Codable { + let id: Int + let name: String + let thumb: String + let desc: String + } + + let groupId: String + let groupName: String + let items: [Item] + + enum CodingKeys: String, CodingKey { + case groupId = "group_id" + case groupName = "group_name" + case items + } } struct IndexResponse: Codable { - let updateDramas: [UpdateDramaItem] + let updateDramas: [UpdateDramaGroup] let dramas: [DramaItem] } - struct UpdateDramaShowItem: Identifiable { + struct UpdateDramaShowItem { enum Element { - case lable(String) - case item(UpdateDramaItem) + case group(UpdateDramaGroup) + case item(UpdateDramaGroup.Item) } - let id = UUID() + let id = UUID().uuidString let element: Element init(element: Element) { @@ -75,27 +86,25 @@ final class IndexModel { print(code) print(message) case .result(let result): - print(result) self.dramas = result.dramas - self.showUpdateDramas = groupUpdateDramas(updateDramas: result.updateDramas) + self.showUpdateDramas = groupUpdateDramas(updateDramaGroups: result.updateDramas) } } @MainActor func loadMoreUpdateDramas() async { - let response = await API.loadMoreUpdateDramas(as: [UpdateDramaItem].self) - if case let .result(items) = response { - let showItems = groupUpdateDramas(updateDramas: items) + let response = await API.loadMoreUpdateDramas(as: [UpdateDramaGroup].self) + if case let .result(groups) = response { + let showItems = groupUpdateDramas(updateDramaGroups: groups) self.showUpdateDramas.append(contentsOf: showItems) } } - private func groupUpdateDramas(updateDramas: [UpdateDramaItem]) -> [UpdateDramaShowItem] { - let groups = Dictionary(grouping: updateDramas) {$0.datetime} + private func groupUpdateDramas(updateDramaGroups: [UpdateDramaGroup]) -> [UpdateDramaShowItem] { var updateItems: [UpdateDramaShowItem] = [] - groups.forEach { (key, items) in - updateItems.append(.init(element: .lable(key))) - items.forEach { item in + updateDramaGroups.forEach { group in + updateItems.append(.init(element: .group(group))) + group.items.forEach { item in updateItems.append(.init(element: .item(item))) } } @@ -112,6 +121,7 @@ struct IndexView: View { @State var isLoading: Bool = false // 是否显示日期弹出层 + @State private var selectGroupId: String = "" @State private var showDateNavPopover: Bool = false var body: some View { @@ -141,10 +151,11 @@ struct IndexView: View { LazyVStack { ForEach(indexModel.showUpdateDramas, id: \.id) { drama in switch drama.element { - case .lable(let name): - Text(name) + case .group(let group): + Text(group.groupName) .onTapGesture { showDateNavPopover = true + selectGroupId = group.groupId } case .item(let item): VStack(alignment: .center) { @@ -192,7 +203,7 @@ struct IndexView: View { } } .popover(isPresented: $showDateNavPopover) { - DateNavView(showDateNavPopover: $showDateNavPopover) + DateNavView(selectGroupId: self.selectGroupId, showDateNavPopover: $showDateNavPopover) } } .task { @@ -256,7 +267,6 @@ extension IndexView { } -/* extension IndexView { struct UpdateDramaCellView: View { @@ -265,8 +275,8 @@ extension IndexView { var body: some View { switch showItem.element { - case .lable(let name): - Text(name) + case .group(let group): + Text(group.groupName) .onTapGesture { showDateNavPopover = true } @@ -293,7 +303,7 @@ extension IndexView { } } -}*/ +} #Preview { IndexView()