diff --git a/dimensionhub/Core/DataCache.swift b/dimensionhub/Core/DataCache.swift index 4634746..a70aad0 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: [DateNavView.DateModel] = [] + private var dateModelCache: [DateModel] = [] - func setDateModelCache(_ models: [DateNavView.DateModel]) { + func setDateModelCache(_ models: [DateModel]) { self.dateModelCache = models } - func getDateModelCache() -> [DateNavView.DateModel] { + func getDateModelCache() -> [DateModel] { return self.dateModelCache } diff --git a/dimensionhub/Core/DataModels.swift b/dimensionhub/Core/DataModels.swift new file mode 100644 index 0000000..59430cf --- /dev/null +++ b/dimensionhub/Core/DataModels.swift @@ -0,0 +1,17 @@ +// +// DataModels.swift +// dimensionhub +// 定义json处理的model信息 +// Created by 安礼成 on 2025/2/20. +// + +// 处理数据模型 +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 70ce1b9..c441894 100644 --- a/dimensionhub/Views/DateNavView.swift +++ b/dimensionhub/Views/DateNavView.swift @@ -7,34 +7,26 @@ import Foundation import SwiftUI +import Observation struct DateNavView: View { + //@AppStorage("selectedDate") var selectedDate: String = "" - // 处理数据模型 - struct DateModel: Codable { - struct Month: Codable { - let name: String - let disabled: Bool - } - - let year: String - let months: [Month] - } - - @State var dateModels: [DateModel] = [] + @State var navData = DateNavData(dateCells: []) + @Binding var showDateNavPopover: Bool var body: some View { - + let _ = Self._printChanges() VStack(alignment: .center) { - ForEach(dateModels, id: \.year) { item in + ForEach(navData.dateCells, id: \.year) { cell in VStack(alignment: .leading, spacing: 10) { - Text(item.year) + Text(cell.year) HStack { - ForEach(item.months, id: \.name) { month in - if month.disabled { - DateDisabledItemView(datetime: month.name) + ForEach(cell.items, id: \.id) { item in + if item.disabled { + DateDisabledItemView(datetime: item.name) } else { - DateItemView(datetime: month.name, selected: false) + DateItemView(datetime: item.name, selected: false, showDateNavPopover: $showDateNavPopover) } } } @@ -42,30 +34,36 @@ struct DateNavView: View { } } .task { - let models = await DataCache.shared.getDateModelCache() - if models.count > 0 { - self.dateModels = models - } else { - let response = await API.getDateIndex(as: [DateNavView.DateModel].self) - switch response { - case .error(let code, let message): - print(code) - print(message) - case .result(let result): - print(result) - self.dateModels = result - await DataCache.shared.setDateModelCache(result) - } + 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 } } } + } extension DateNavView { struct DateItemView: View { let datetime: String - let selected: Bool + @State var selected: Bool + @Binding var showDateNavPopover: Bool var body: some View { Rectangle() @@ -80,6 +78,10 @@ extension DateNavView { .font(.system(size: 20, weight: .regular)) } + .onTapGesture { + self.selected = true + self.showDateNavPopover = false + } } } @@ -104,6 +106,62 @@ extension DateNavView { } -#Preview { - DateNavView() +@Observable +final class DateNavData { + var dateCells: [DateCell] = [] + + struct DateCell { + struct Item: Identifiable { + let id: String + let name: String + let disabled: Bool + let selected: Bool + } + + let year: String + let items: [Item] + } + + init(dateCells: [DateCell]) { + self.dateCells = dateCells + } + + @MainActor + func loadDateCells() async { + let models = await getDateModelData() + + var cells: [DateCell] = [] + for model in models { + let items = model.months.map { month in + DateCell.Item(id: "\(model.year)-\(month.name)", name: month.name, disabled: month.disabled, selected: false) + } + cells.append(DateCell(year: model.year, items: items)) + } + + self.dateCells = cells + print(self.dateCells) + } + + 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 + } + } + } + } + +//#Preview { +// DateNavView() +//} diff --git a/dimensionhub/Views/IndexView.swift b/dimensionhub/Views/IndexView.swift index 3b1bce2..5c562aa 100644 --- a/dimensionhub/Views/IndexView.swift +++ b/dimensionhub/Views/IndexView.swift @@ -107,7 +107,7 @@ struct IndexView: View { } } .popover(isPresented: $showDateNavPopover) { - DateNavView(dateModels: []) + DateNavView(showDateNavPopover: $showDateNavPopover) } } .task {