add DetailView

This commit is contained in:
anlicheng 2025-02-21 22:43:19 +08:00
parent db894b88e5
commit e5f155dfce
3 changed files with 102 additions and 1 deletions

View File

@ -47,6 +47,12 @@ struct API {
return await doRequest(request: request, as: T.self)
}
static func getDramaDetail<T: Codable>(as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: url + "detail")!)
return await doRequest(request: request, as: T.self)
}
// http
private static func doRequest<T: Codable>(request: URLRequest, as: T.Type) async -> APIResponse<T> {
do {

View File

@ -0,0 +1,94 @@
//
// ListView.swift
// dimensionhub
//
// Created by on 2025/2/21.
//
import SwiftUI
import Observation
@Observable
final class DetailModel {
struct VoiceActor: Codable {
let actor_id: Int
let name: String
}
struct Episode: Codable {
let id: Int32
let name: String
let thumb: String
let numName: String
enum CodingKeys: String, CodingKey {
case id = "id"
case name = "name"
case thumb = "thumb"
case numName = "num_name"
}
}
//
struct Channel: Codable {
let name: String
let episodes: [Episode]
}
struct DramaDetailResponse: Codable {
let name: String
let voice_actors: [VoiceActor]
let status: Int
let channels: [Channel]
}
var name: String = ""
var voiceActors: [VoiceActor] = []
var status: Int = 0
var channels: [Channel] = []
@MainActor
func loadData(dramaId: Int) async {
let response = await API.getDramaDetail(as: DramaDetailResponse.self)
switch response {
case .error(let code, let message):
print(code)
print(message)
case .result(let detail):
self.name = detail.name
self.voiceActors = detail.voice_actors
self.status = detail.status
self.channels = detail.channels
}
}
}
struct DetailView: View {
@State var detailModel = DetailModel()
var body: some View {
VStack {
VStack(alignment: .leading, spacing: 15) {
Text(detailModel.name)
.font(.system(size: 20))
.fontWeight(.bold)
HStack(alignment: .center, spacing: 0) {
ForEach(detailModel.voiceActors, id: \.actor_id) { actor in
Text(actor.name)
.font(.system(size: 16))
}
Text("")
}
}
}
.task {
await detailModel.loadData(dramaId: 124)
}
}
}
#Preview {
DetailView()
}

View File

@ -25,7 +25,8 @@ struct dimensionhubApp: App {
var body: some Scene {
WindowGroup {
IndexView()
//IndexView()
DetailView()
}
.modelContainer(sharedModelContainer)
}