FollowingListViewModel.swift 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // FollowingListViewModel.swift
  3. // Mastodon
  4. //
  5. // Created by Cirno MainasuK on 2021-11-2.
  6. //
  7. import Foundation
  8. import Combine
  9. import CoreData
  10. import CoreDataStack
  11. import GameplayKit
  12. import MastodonCore
  13. import MastodonSDK
  14. final class FollowingListViewModel {
  15. var disposeBag = Set<AnyCancellable>()
  16. // input
  17. let context: AppContext
  18. let authContext: AuthContext
  19. let userFetchedResultsController: UserFetchedResultsController
  20. let listBatchFetchViewModel = ListBatchFetchViewModel()
  21. @Published var domain: String?
  22. @Published var userID: String?
  23. // output
  24. var diffableDataSource: UITableViewDiffableDataSource<UserSection, UserItem>?
  25. private(set) lazy var stateMachine: GKStateMachine = {
  26. let stateMachine = GKStateMachine(states: [
  27. State.Initial(viewModel: self),
  28. State.Reloading(viewModel: self),
  29. State.Fail(viewModel: self),
  30. State.Idle(viewModel: self),
  31. State.Loading(viewModel: self),
  32. State.NoMore(viewModel: self),
  33. ])
  34. stateMachine.enter(State.Initial.self)
  35. return stateMachine
  36. }()
  37. init(
  38. context: AppContext,
  39. authContext: AuthContext,
  40. domain: String?,
  41. userID: String?
  42. ) {
  43. self.context = context
  44. self.authContext = authContext
  45. self.userFetchedResultsController = UserFetchedResultsController(
  46. managedObjectContext: context.managedObjectContext,
  47. domain: domain,
  48. additionalPredicate: nil
  49. )
  50. self.domain = domain
  51. self.userID = userID
  52. // super.init()
  53. }
  54. }