import Combine final class ConversationMiddleware { static let shared = ConversationMiddleware() func middleware(state: AppState, action: AppAction) -> AnyPublisher { switch action { case .chatsAction(.chatStarted(let chat)): return Future { promise in let roster = state.rostersState.rosters .first { $0.bareJid == chat.account && $0.contactBareJid == chat.participant } promise(.success(.conversationAction(.makeConversationActive(chat: chat, roster: roster)))) } .eraseToAnyPublisher() case .conversationAction(.makeConversationActive): return Just(AppAction.changeFlow(.conversation)).eraseToAnyPublisher() default: return Empty().eraseToAnyPublisher() } } }