fix
This commit is contained in:
parent
f2c5133e79
commit
fb74a686e1
@ -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
|
||||
}
|
||||
|
||||
|
||||
17
dimensionhub/Core/DataModels.swift
Normal file
17
dimensionhub/Core/DataModels.swift
Normal file
@ -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]
|
||||
}
|
||||
@ -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()
|
||||
//}
|
||||
|
||||
@ -107,7 +107,7 @@ struct IndexView: View {
|
||||
}
|
||||
}
|
||||
.popover(isPresented: $showDateNavPopover) {
|
||||
DateNavView(dateModels: [])
|
||||
DateNavView(showDateNavPopover: $showDateNavPopover)
|
||||
}
|
||||
}
|
||||
.task {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user