This commit is contained in:
anlicheng 2025-02-21 00:04:12 +08:00
parent 6b477486c2
commit 070f928d88
5 changed files with 65 additions and 92 deletions

View File

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

View File

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

View File

@ -9,12 +9,4 @@
//
struct DateModel: Codable {
struct Month: Codable {
let name: String
let disabled: Bool
}
let year: String
let months: [Month]
}

View File

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

View File

@ -32,26 +32,37 @@ final class IndexModel {
let episodes: [Episode]
}
struct UpdateDramaItem: Codable {
let id: Int
let name: String
let thumb: String
let desc: String
let datetime: String
struct UpdateDramaGroup: Codable {
struct Item: Codable {
let id: Int
let name: String
let thumb: String
let desc: 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()