74 lines
2.6 KiB
Swift
74 lines
2.6 KiB
Swift
import Foundation
|
|
import Combine
|
|
|
|
final class MainHomeFollowingViewModel: ObservableObject {
|
|
private let repository = MainHomeFollowingRepository()
|
|
private var subscription = Set<AnyCancellable>()
|
|
|
|
@Published var isLoading = false
|
|
@Published var response: HomeFollowingTabResponse?
|
|
@Published var isLoginRequired = false
|
|
@Published var message = ""
|
|
@Published var hasLoaded = false
|
|
|
|
func fetchFollowing() {
|
|
isLoading = true
|
|
message = ""
|
|
|
|
repository.getFollowing()
|
|
.sink { [weak self] result in
|
|
guard let self else { return }
|
|
|
|
switch result {
|
|
case .finished:
|
|
DEBUG_LOG("finish")
|
|
case .failure(let error):
|
|
ERROR_LOG(error.localizedDescription)
|
|
self.response = nil
|
|
self.isLoginRequired = false
|
|
self.message = I18n.HomeFollowing.loadFailedMessage
|
|
self.hasLoaded = true
|
|
self.isLoading = false
|
|
}
|
|
} receiveValue: { [weak self] response in
|
|
guard let self else { return }
|
|
|
|
let responseData = response.data
|
|
|
|
do {
|
|
let jsonDecoder = JSONDecoder()
|
|
let decoded = try jsonDecoder.decode(ApiResponse<HomeFollowingTabResponse>.self, from: responseData)
|
|
|
|
if let data = decoded.data, decoded.success {
|
|
self.isLoginRequired = data.isLoginRequired
|
|
self.response = data.isLoginRequired ? nil : data
|
|
self.message = data.isLoginRequired || data.hasContent ? "" : I18n.HomeFollowing.emptyStateMessage
|
|
} else {
|
|
self.response = nil
|
|
self.isLoginRequired = false
|
|
self.message = I18n.HomeFollowing.loadFailedMessage
|
|
}
|
|
} catch {
|
|
ERROR_LOG(error.localizedDescription)
|
|
self.response = nil
|
|
self.isLoginRequired = false
|
|
self.message = I18n.HomeFollowing.loadFailedMessage
|
|
}
|
|
|
|
self.hasLoaded = true
|
|
self.isLoading = false
|
|
}
|
|
.store(in: &subscription)
|
|
}
|
|
}
|
|
|
|
private extension HomeFollowingTabResponse {
|
|
var hasContent: Bool {
|
|
!followingCreators.isEmpty ||
|
|
!onAirLives.isEmpty ||
|
|
!recentChats.isEmpty ||
|
|
!monthlySchedules.isEmpty ||
|
|
!recentNews.isEmpty
|
|
}
|
|
}
|