fix
This commit is contained in:
parent
6b477486c2
commit
070f928d88
@ -58,11 +58,13 @@ struct API {
|
||||
do {
|
||||
let result = try JSONDecoder().decode(APISuccessResponse<T>.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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -9,12 +9,4 @@
|
||||
|
||||
|
||||
// 日期弹出层
|
||||
struct DateModel: Codable {
|
||||
struct Month: Codable {
|
||||
let name: String
|
||||
let disabled: Bool
|
||||
}
|
||||
|
||||
let year: String
|
||||
let months: [Month]
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -32,26 +32,37 @@ final class IndexModel {
|
||||
let episodes: [Episode]
|
||||
}
|
||||
|
||||
struct UpdateDramaItem: Codable {
|
||||
struct UpdateDramaGroup: Codable {
|
||||
struct Item: Codable {
|
||||
let id: Int
|
||||
let name: String
|
||||
let thumb: String
|
||||
let desc: String
|
||||
let datetime: 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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user