This commit is contained in:
anlicheng 2025-02-20 22:00:33 +08:00
parent f2c5133e79
commit fb74a686e1
4 changed files with 115 additions and 40 deletions

View File

@ -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
}

View File

@ -0,0 +1,17 @@
//
// DataModels.swift
// dimensionhub
// jsonmodel
// Created by on 2025/2/20.
//
//
struct DateModel: Codable {
struct Month: Codable {
let name: String
let disabled: Bool
}
let year: String
let months: [Month]
}

View File

@ -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()
//}

View File

@ -107,7 +107,7 @@ struct IndexView: View {
}
}
.popover(isPresented: $showDateNavPopover) {
DateNavView(dateModels: [])
DateNavView(showDateNavPopover: $showDateNavPopover)
}
}
.task {