* Use StateStoreViewModelV2 in AnalyticsPromptScreen.
* Use StateStoreViewModelV2 in UserProfileScreen.
* Use StateStoreViewModelV2 in MediaUploadPreviewScreen.
* Use StateStoreViewModelV2 in the Roles & Permissions screens.
* Add the asyncStream variant of deferFailure.
* Use StateStoreViewModelV2 in BlockedUsersScreen.
* Use StateStoreViewModelV2 in ManageRoomMemberSheet.
* Use StateStoreViewModelV2 in ResolveVerifiedUserSendFailureScreen.
* Use StateStoreViewModelV2 in ReportContentScreen.
* Use StateStoreViewModelV2 in ReportRoomScreen.
* Use StateStoreViewModelV2 in StaticLocationScreen.
* Use StateStoreViewModelV2 in EmojiPickerScreen.
* Use StateStoreViewModelV2 in PollFormScreen.
* Use StateStoreViewModelV2 in DeclineAndBlockScreen.
* Use StateStoreViewModelV2 in RoomDetailsScreen.
* Fix a random compilation error that just popped up 🤷♂️
* Fix expectation message.
47 lines
2.2 KiB
Swift
47 lines
2.2 KiB
Swift
//
|
|
// 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<StaticLocationScreenViewState, StaticLocationScreenViewAction>
|
|
|
|
class StaticLocationScreenViewModel: StaticLocationScreenViewModelType, StaticLocationScreenViewModelProtocol {
|
|
private let actionsSubject: PassthroughSubject<StaticLocationScreenViewModelAction, Never> = .init()
|
|
|
|
var actions: AnyPublisher<StaticLocationScreenViewModelAction, Never> {
|
|
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))
|
|
}
|
|
}
|
|
}
|
|
}
|