fix follow list

This commit is contained in:
anlicheng 2025-03-18 16:04:09 +08:00
parent 605062c7a8
commit 66ee40c1a6
3 changed files with 41 additions and 74 deletions

View File

@ -51,8 +51,8 @@ struct API {
} }
// //
static func getFavorData<T: Codable>(userId: String, id: Int, as: T.Type) async -> APIResponse<T> { static func getUserFollowList<T: Codable>(userId: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/favor?user_id=\(userId)&id=\(id)")!) let request = URLRequest(url: URL(string: baseUrl + "/api/follow_list?user_id=\(userId)")!)
return await doRequest(request: request, as: T.self) return await doRequest(request: request, as: T.self)
} }

View File

@ -10,7 +10,7 @@ import SwiftUI
import Observation import Observation
@Observable @Observable
final class FavorModel { final class FollowListModel {
struct DramaItem: Codable { struct DramaItem: Codable {
struct Episode: Codable, Identifiable { struct Episode: Codable, Identifiable {
@ -32,55 +32,31 @@ final class FavorModel {
struct FavorResponse: Codable { struct FavorResponse: Codable {
let dramas: [DramaItem] let dramas: [DramaItem]
let has_more: Bool
} }
var dramas: [DramaItem] var dramas: [DramaItem]
//
@ObservationIgnored
private var hasMore: Bool
init() { init() {
self.dramas = [] self.dramas = []
self.hasMore = true
} }
@MainActor @MainActor
func loadData(userId: String) async { func loadData(userId: String) async {
let response = await API.getFavorData(userId: userId, id: 0, as: FavorResponse.self) let response = await API.getUserFollowList(userId: userId, as: FavorResponse.self)
switch response { switch response {
case .error(let code, let message): case .error(let code, let message):
print("index load data get error_code: \(code), message: \(message)") print("index load data get error_code: \(code), message: \(message)")
case .result(let result): case .result(let result):
self.dramas = result.dramas self.dramas = result.dramas
self.hasMore = result.has_more
}
}
@MainActor
func loadMoreFavorDramas(userId: String) async {
guard self.hasMore else {
return
}
let lastId = self.dramas.last?.id ?? 0
let response = await API.getFavorData(userId: userId, id: lastId, as: FavorResponse.self)
switch response {
case .result(let result):
self.dramas.append(contentsOf: result.dramas)
self.hasMore = result.has_more
case .error(let code, let string):
print("load more favor get error code: \(code), message: \(string)")
} }
} }
} }
struct FavorView: View { struct FollowListView: View {
@AppStorage("userId") private var userId: String = Utils.defaultUserId() @AppStorage("userId") private var userId: String = Utils.defaultUserId()
@Environment(\.dismiss) private var dismiss @Environment(\.dismiss) private var dismiss
@State var favorModel = FavorModel() @State var followModel = FollowListModel()
@State var isMoreLoading: Bool = false @State var isMoreLoading: Bool = false
var body: some View { var body: some View {
@ -89,11 +65,14 @@ struct FavorView: View {
HStack(alignment: .center) { HStack(alignment: .center) {
Color.clear Color.clear
.overlay(alignment: .leading) { .overlay(alignment: .leading) {
Text("< 番剧补完计划") HStack(alignment: .center, spacing: 3) {
Image(systemName: "chevron.left")
.border(Color.yellow)
Text("番剧补完计划")
.font(.system(size: 16)) .font(.system(size: 16))
.foregroundColor(Color(hex: "#999999")) .foregroundColor(Color(hex: "#333333"))
.padding([.top, .bottom], 5) }
.padding([.leading], 15)
.onTapGesture { .onTapGesture {
dismiss() dismiss()
} }
@ -102,60 +81,39 @@ struct FavorView: View {
.frame(height: 50) .frame(height: 50)
.background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top) .background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top)
if favorModel.dramas.count > 0 { if followModel.dramas.count > 0 {
VStack(alignment: .center) {
ScrollView(.vertical, showsIndicators: false) { ScrollView(.vertical, showsIndicators: false) {
ForEach(favorModel.dramas, id: \.id) { drama in LazyVStack(alignment: .center) {
ForEach(followModel.dramas, id: \.id) { drama in
DramaCellView(dramaItem: drama) DramaCellView(dramaItem: drama)
} }
Rectangle()
.frame(height: 0)
.background(GeometryReader {
geometry in
Color.clear.onChange(of: geometry.frame(in: .global).minY) {_, offset in
let frame = geometry.frame(in: .global)
let screenBounds = UIScreen.main.bounds
let contextFrame = geometry.frame(in: .named("indexScrollView"))
if screenBounds.height - frame.minY > 50 && contextFrame.minY > 0 && !isMoreLoading {
Task {
self.isMoreLoading = true
await self.favorModel.loadMoreFavorDramas(userId: userId)
self.isMoreLoading = false
} }
} }
}
})
if self.isMoreLoading {
ProgressView()
}
}
.coordinateSpace(name: "indexScrollView")
}
.frame(width: 370) .frame(width: 370)
} else { } else {
VStack { VStack {
Text("你还没有") Spacer()
Text("这里什么都没有")
.font(.system(size: 16))
.foregroundColor(.black)
Spacer() Spacer()
} }
.frame(width: 370)
} }
} }
.ignoresSafeArea(edges: .bottom) .ignoresSafeArea(edges: .bottom)
.navigationBarBackButtonHidden() .navigationBarBackButtonHidden()
.task { .task {
await self.favorModel.loadData(userId: self.userId) await self.followModel.loadData(userId: self.userId)
} }
} }
} }
extension FavorView { extension FollowListView {
// //
struct DramaCellView: View { struct DramaCellView: View {
let dramaItem: FavorModel.DramaItem let dramaItem: FollowListModel.DramaItem
var body: some View { var body: some View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
@ -164,6 +122,7 @@ extension FavorView {
Text(dramaItem.title) Text(dramaItem.title)
.font(.system(size: 20)) .font(.system(size: 20))
.foregroundColor(Color(hex: "#333333")) .foregroundColor(Color(hex: "#333333"))
.lineLimit(1)
} }
ScrollView(.horizontal, showsIndicators: false) { ScrollView(.horizontal, showsIndicators: false) {
@ -229,3 +188,7 @@ extension FavorView {
} }
} }
} }
#Preview {
FollowListView()
}

View File

@ -47,12 +47,14 @@ final class IndexModel {
struct IndexResponse: Codable { struct IndexResponse: Codable {
let update_dramas: [UpdateDramaGroup] let update_dramas: [UpdateDramaGroup]
let follow_num: Int
} }
var selectedDate: String var selectedDate: String
// //
var updateDramaGroups: [UpdateDramaGroup] = [] var updateDramaGroups: [UpdateDramaGroup] = []
var follow_num: String = "0"
@ObservationIgnored @ObservationIgnored
private var isLoaded = false private var isLoaded = false
@ -73,6 +75,7 @@ final class IndexModel {
print("index load data get error_code: \(code), message: \(message)") print("index load data get error_code: \(code), message: \(message)")
case .result(let result): case .result(let result):
self.updateDramaGroups = result.update_dramas self.updateDramaGroups = result.update_dramas
self.follow_num = result.follow_num >= 100 ? "99+" : "\(result.follow_num)"
} }
self.isLoaded = true self.isLoaded = true
} }
@ -292,10 +295,11 @@ extension IndexView {
.padding([.top, .bottom], 5) .padding([.top, .bottom], 5)
Spacer() Spacer()
NavigationLink(destination: FavorView()) { NavigationLink(destination: FollowListView()) {
HStack { HStack {
Text("12") Text("\(indexModel.follow_num)")
.font(.system(size: 16)) .font(.system(size: 16))
.foregroundColor(.black)
.padding([.top, .bottom], 5) .padding([.top, .bottom], 5)
} }
} }
@ -317,7 +321,7 @@ extension IndexView {
} }
// //
VStack(alignment: .center, spacing: 10) { LazyVStack(alignment: .center, spacing: 10) {
ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in
DramaGroupView(group: group) { DramaGroupView(group: group) {
selectGroupId = group.group_id selectGroupId = group.group_id