add DetailView
This commit is contained in:
parent
db894b88e5
commit
e5f155dfce
@ -47,6 +47,12 @@ struct API {
|
|||||||
return await doRequest(request: request, as: T.self)
|
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请求
|
// 执行http请求
|
||||||
private static func doRequest<T: Codable>(request: URLRequest, as: T.Type) async -> APIResponse<T> {
|
private static func doRequest<T: Codable>(request: URLRequest, as: T.Type) async -> APIResponse<T> {
|
||||||
do {
|
do {
|
||||||
|
|||||||
94
dimensionhub/Views/DetailView.swift
Normal file
94
dimensionhub/Views/DetailView.swift
Normal 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()
|
||||||
|
}
|
||||||
@ -25,7 +25,8 @@ struct dimensionhubApp: App {
|
|||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup {
|
||||||
IndexView()
|
//IndexView()
|
||||||
|
DetailView()
|
||||||
}
|
}
|
||||||
.modelContainer(sharedModelContainer)
|
.modelContainer(sharedModelContainer)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user