fix
This commit is contained in:
parent
f2c5133e79
commit
fb74a686e1
@ -9,13 +9,13 @@ actor DataCache {
|
|||||||
|
|
||||||
public static let shared = 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
|
self.dateModelCache = models
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDateModelCache() -> [DateNavView.DateModel] {
|
func getDateModelCache() -> [DateModel] {
|
||||||
return self.dateModelCache
|
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 Foundation
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import Observation
|
||||||
|
|
||||||
struct DateNavView: View {
|
struct DateNavView: View {
|
||||||
|
//@AppStorage("selectedDate") var selectedDate: String = ""
|
||||||
|
|
||||||
// 处理数据模型
|
@State var navData = DateNavData(dateCells: [])
|
||||||
struct DateModel: Codable {
|
@Binding var showDateNavPopover: Bool
|
||||||
struct Month: Codable {
|
|
||||||
let name: String
|
|
||||||
let disabled: Bool
|
|
||||||
}
|
|
||||||
|
|
||||||
let year: String
|
|
||||||
let months: [Month]
|
|
||||||
}
|
|
||||||
|
|
||||||
@State var dateModels: [DateModel] = []
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
let _ = Self._printChanges()
|
||||||
VStack(alignment: .center) {
|
VStack(alignment: .center) {
|
||||||
ForEach(dateModels, id: \.year) { item in
|
ForEach(navData.dateCells, id: \.year) { cell in
|
||||||
VStack(alignment: .leading, spacing: 10) {
|
VStack(alignment: .leading, spacing: 10) {
|
||||||
Text(item.year)
|
Text(cell.year)
|
||||||
HStack {
|
HStack {
|
||||||
ForEach(item.months, id: \.name) { month in
|
ForEach(cell.items, id: \.id) { item in
|
||||||
if month.disabled {
|
if item.disabled {
|
||||||
DateDisabledItemView(datetime: month.name)
|
DateDisabledItemView(datetime: item.name)
|
||||||
} else {
|
} else {
|
||||||
DateItemView(datetime: month.name, selected: false)
|
DateItemView(datetime: item.name, selected: false, showDateNavPopover: $showDateNavPopover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,30 +34,36 @@ struct DateNavView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.task {
|
.task {
|
||||||
|
await self.navData.loadDateCells()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func getDateModelData() async -> [DateModel] {
|
||||||
let models = await DataCache.shared.getDateModelCache()
|
let models = await DataCache.shared.getDateModelCache()
|
||||||
if models.count > 0 {
|
if models.count > 0 {
|
||||||
self.dateModels = models
|
return models
|
||||||
} else {
|
} else {
|
||||||
let response = await API.getDateIndex(as: [DateNavView.DateModel].self)
|
let response = await API.getDateIndex(as: [DateModel].self)
|
||||||
switch response {
|
switch response {
|
||||||
case .error(let code, let message):
|
case .error(let code, let message):
|
||||||
print(code)
|
print(code)
|
||||||
print(message)
|
print(message)
|
||||||
case .result(let result):
|
return []
|
||||||
print(result)
|
case .result(let models):
|
||||||
self.dateModels = result
|
await DataCache.shared.setDateModelCache(models)
|
||||||
await DataCache.shared.setDateModelCache(result)
|
return models
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension DateNavView {
|
extension DateNavView {
|
||||||
|
|
||||||
struct DateItemView: View {
|
struct DateItemView: View {
|
||||||
let datetime: String
|
let datetime: String
|
||||||
let selected: Bool
|
@State var selected: Bool
|
||||||
|
@Binding var showDateNavPopover: Bool
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Rectangle()
|
Rectangle()
|
||||||
@ -80,6 +78,10 @@ extension DateNavView {
|
|||||||
.font(.system(size: 20, weight: .regular))
|
.font(.system(size: 20, weight: .regular))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
.onTapGesture {
|
||||||
|
self.selected = true
|
||||||
|
self.showDateNavPopover = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,6 +106,62 @@ extension DateNavView {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#Preview {
|
@Observable
|
||||||
DateNavView()
|
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) {
|
.popover(isPresented: $showDateNavPopover) {
|
||||||
DateNavView(dateModels: [])
|
DateNavView(showDateNavPopover: $showDateNavPopover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.task {
|
.task {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user