// /* * SwiftFin is subject to the terms of the Mozilla Public * License, v2.0. If a copy of the MPL was not distributed with this * file, you can obtain one at https://mozilla.org/MPL/2.0/. * * Copyright 2021 Aiden Vigue & Jellyfin Contributors */ import Combine import Foundation import JellyfinAPI import Stinsen import SwiftUICollection final class TVLibrariesViewModel: ViewModel { @Published var rows = [LibraryRow]() @Published var totalPages = 0 @Published var currentPage = 0 @Published var hasNextPage = false @Published var hasPreviousPage = false private var libraries = [BaseItemDto]() private let columns: Int @RouterObject var router: TVLibrariesCoordinator.Router? init( columns: Int = 7 ) { self.columns = columns super.init() requestLibraries() } func requestLibraries() { UserViewsAPI.getUserViews( userId: SessionManager.main.currentLogin.user.id) .trackActivity(loading) .sink(receiveCompletion: { completion in self.handleAPIRequestError(completion: completion) }, receiveValue: { response in if let responseItems = response.items { self.libraries = [] for library in responseItems { if library.collectionType == "tvshows" { self.libraries.append(library) } } self.rows = self.calculateRows() if self.libraries.count == 1, let library = self.libraries.first { // show library self.router?.route(to: \.library, library) } } }) .store(in: &cancellables) } private func calculateRows() -> [LibraryRow] { guard libraries.count > 0 else { return [] } let rowCount = libraries.count / columns var calculatedRows = [LibraryRow]() for i in (0...rowCount) { let firstItemIndex = i * columns var lastItemIndex = firstItemIndex + columns if lastItemIndex > libraries.count { lastItemIndex = libraries.count } var rowCells = [LibraryRowCell]() for item in libraries[firstItemIndex..