ConferenceMainViewStore.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // ConferenceMainViewStore.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2024/9/3.
  6. //
  7. import Foundation
  8. import Combine
  9. protocol ConferenceMainViewStore {
  10. var isInternalCreation: Bool { get }
  11. func updateInternalCreation(isInternalCreation: Bool)
  12. func dispatch(action: Action)
  13. func select<Value: Equatable>(_ selector: Selector<ConferenceMainViewState, Value>) -> AnyPublisher<Value, Never>
  14. func selectCurrent<Value>(_ selector: Selector<ConferenceMainViewState, Value>) -> Value
  15. }
  16. class ConferenceMainViewStoreProvider {
  17. static let updateInternalCreation = ActionTemplate(id: "updateInternalCreation", payloadType: Bool.self)
  18. private(set) lazy var store: Store<ConferenceMainViewState, Void> = Store(initialState: ConferenceMainViewState())
  19. private let conferenceMainViewReducer = Reducer<ConferenceMainViewState>(
  20. ReduceOn(updateInternalCreation) { state,action in
  21. state.isInternalCreation = action.payload
  22. }
  23. )
  24. init() {
  25. initStore()
  26. }
  27. deinit {
  28. store.unregister(reducer: conferenceMainViewReducer)
  29. }
  30. private func initStore() {
  31. store.register(reducer: conferenceMainViewReducer)
  32. }
  33. }
  34. extension ConferenceMainViewStoreProvider: ConferenceMainViewStore {
  35. var isInternalCreation: Bool {
  36. return store.state.isInternalCreation
  37. }
  38. func updateInternalCreation(isInternalCreation: Bool) {
  39. store.dispatch(action: ConferenceMainViewStoreProvider.updateInternalCreation(payload: isInternalCreation))
  40. }
  41. func dispatch(action: Action) {
  42. store.dispatch(action: action)
  43. }
  44. func select<Value>(_ selector: Selector<ConferenceMainViewState, Value>) -> AnyPublisher<Value, Never> where Value : Equatable {
  45. return store.select(selector)
  46. .removeDuplicates()
  47. .eraseToAnyPublisher()
  48. }
  49. func selectCurrent<Value>(_ selector: Selector<ConferenceMainViewState, Value>) -> Value {
  50. return store.selectCurrent(selector)
  51. }
  52. }