// // Copyright 2023, 2024 New Vector Ltd. // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial // Please see LICENSE files in the repository root for full details. // import Combine import Foundation typealias StaticLocationScreenViewModelType = StateStoreViewModelV2 class StaticLocationScreenViewModel: StaticLocationScreenViewModelType, StaticLocationScreenViewModelProtocol { private let actionsSubject: PassthroughSubject = .init() var actions: AnyPublisher { actionsSubject.eraseToAnyPublisher() } init(interactionMode: StaticLocationInteractionMode, mapURLBuilder: MapTilerURLBuilderProtocol) { super.init(initialViewState: .init(interactionMode: interactionMode, mapURLBuilder: mapURLBuilder)) } override func process(viewAction: StaticLocationScreenViewAction) { switch viewAction { case .close: actionsSubject.send(.close) case .selectLocation: guard let coordinate = state.bindings.mapCenterLocation else { return } let uncertainty = state.isSharingUserLocation ? context.geolocationUncertainty : nil actionsSubject.send(.sendLocation(.init(coordinate: coordinate, uncertainty: uncertainty), isUserLocation: state.isSharingUserLocation)) case .userDidPan: state.bindings.showsUserLocationMode = .show case .centerToUser: switch state.bindings.isLocationAuthorized { case .some(true), .none: state.bindings.showsUserLocationMode = .showAndFollow case .some(false): let action: () -> Void = { [weak self] in self?.actionsSubject.send(.openSystemSettings) } state.bindings.alertInfo = .init(locationSharingViewError: .missingAuthorization, primaryButton: .init(title: L10n.actionNotNow, role: .cancel, action: nil), secondaryButton: .init(title: L10n.commonSettings, action: action)) } } } }