AzureCommunicationUI/sdk/AzureCommunicationUIChat/Sources/Presentation/Factories/CompositeViewModelFactory.swift (70 lines of code) (raw):

// // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // import Foundation protocol CompositeViewModelFactoryProtocol { // MARK: CompositeViewModels func getChatViewModel() -> ChatViewModel // MARK: ComponentViewModels func makeIconButtonViewModel(iconName: CompositeIcon, buttonType: IconButtonViewModel.ButtonType, isDisabled: Bool, action: @escaping (() -> Void)) -> IconButtonViewModel // MARK: ChatViewModels func makeTopBarViewModel(dispatch: @escaping ActionDispatch, participantsState: ParticipantsState) -> TopBarViewModel func makeMessageListViewModel(dispatch: @escaping ActionDispatch) -> MessageListViewModel func makeBottomBarViewModel(dispatch: @escaping ActionDispatch) -> BottomBarViewModel func makeTypingParticipantsViewModel() -> TypingParticipantsViewModel } class CompositeViewModelFactory: CompositeViewModelFactoryProtocol { private let logger: Logger private let localizationProvider: LocalizationProviderProtocol private let messageRepositoryManager: MessageRepositoryManagerProtocol private let store: Store<ChatAppState, Action> private weak var chatViewModel: ChatViewModel? // unit test needed // - only skeleton code to show view, class not finalized yet init(logger: Logger, localizationProvider: LocalizationProviderProtocol, messageRepositoryManager: MessageRepositoryManagerProtocol, store: Store<ChatAppState, Action>) { self.logger = logger self.localizationProvider = localizationProvider self.messageRepositoryManager = messageRepositoryManager self.store = store } // MARK: CompositeViewModels func getChatViewModel() -> ChatViewModel { guard let viewModel = self.chatViewModel else { let viewModel = ChatViewModel(compositeViewModelFactory: self, logger: logger, store: store) self.chatViewModel = viewModel return viewModel } return viewModel } // MARK: ComponentViewModels func makeIconButtonViewModel(iconName: CompositeIcon, buttonType: IconButtonViewModel.ButtonType = .controlButton, isDisabled: Bool, action: @escaping (() -> Void)) -> IconButtonViewModel { IconButtonViewModel(iconName: iconName, buttonType: buttonType, isDisabled: isDisabled, action: action) } // MARK: ChatViewModels func makeTopBarViewModel(dispatch: @escaping ActionDispatch, participantsState: ParticipantsState) -> TopBarViewModel { TopBarViewModel(compositeViewModelFactory: self, localizationProvider: localizationProvider, dispatch: dispatch, participantsState: participantsState) } func makeMessageListViewModel(dispatch: @escaping ActionDispatch) -> MessageListViewModel { MessageListViewModel(compositeViewModelFactory: self, messageRepositoryManager: messageRepositoryManager, logger: logger, dispatch: store.dispatch) } func makeBottomBarViewModel(dispatch: @escaping ActionDispatch) -> BottomBarViewModel { BottomBarViewModel(compositeViewModelFactory: self, logger: logger, dispatch: dispatch) } func makeTypingParticipantsViewModel() -> TypingParticipantsViewModel { TypingParticipantsViewModel(logger: logger, localizationProvider: localizationProvider) } }