element-ios/RiotSwiftUI/Modules/Room/TimelinePoll/Coordinator/TimelinePollProvider.swift

68 lines
2.3 KiB
Swift

//
// Copyright 2021-2024 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only
// Please see LICENSE in the repository root for full details.
//
import Foundation
import SwiftUI
@objcMembers
class TimelinePollProvider: NSObject {
static let shared = TimelinePollProvider()
var session: MXSession? {
willSet {
guard let currentSession = self.session else { return }
if currentSession != newValue {
// Clear all stored coordinators on new session
coordinatorsForEventIdentifiers.removeAll()
}
}
}
var coordinatorsForEventIdentifiers = [String: TimelinePollCoordinator]()
/// Create or retrieve the poll timeline coordinator for this event and return
/// a view to be displayed in the timeline
func buildTimelinePollVCForEvent(_ event: MXEvent) -> UIViewController? {
guard let session = session, let room = session.room(withRoomId: event.roomId) else {
return nil
}
if let coordinator = coordinatorsForEventIdentifiers[event.eventId] {
return coordinator.toPresentable()
}
let parameters = TimelinePollCoordinatorParameters(session: session, room: room, pollEvent: event)
guard let coordinator = try? TimelinePollCoordinator(parameters: parameters) else {
return messageViewController(for: event)
}
coordinatorsForEventIdentifiers[event.eventId] = coordinator
return coordinator.toPresentable()
}
/// Retrieve the poll timeline coordinator for the given event or nil if it hasn't been created yet
func timelinePollCoordinatorForEventIdentifier(_ eventIdentifier: String) -> TimelinePollCoordinator? {
coordinatorsForEventIdentifiers[eventIdentifier]
}
func reset() {
coordinatorsForEventIdentifiers.removeAll()
}
}
private extension TimelinePollProvider {
func messageViewController(for event: MXEvent) -> UIViewController? {
switch event.eventType {
case .pollEnd:
return VectorHostingController(rootView: TimelinePollMessageView(message: VectorL10n.pollTimelineReplyEndedPoll))
default:
return nil
}
}
}