// // Copyright 2021-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 SwiftUI struct StaticLocationView: View { // MARK: - Properties // MARK: Private @Environment(\.theme) private var theme @Environment(\.openURL) var openURL @Environment(\.safeAreaInsets) private var safeAreaInsets // MARK: Public @ObservedObject var viewModel: StaticLocationViewingViewModel.Context // MARK: Views var mapView: LocationSharingMapView { LocationSharingMapView(tileServerMapURL: viewModel.viewState.mapStyleURL, annotations: [viewModel.viewState.sharedAnnotation], highlightedAnnotation: viewModel.viewState.sharedAnnotation, userAvatarData: nil, showsUserLocationMode: viewModel.viewState.showsUserLocationMode, userLocation: Binding.constant(nil), mapCenterCoordinate: Binding.constant(nil), errorSubject: viewModel.viewState.errorSubject, attributionsChanged: { attribution in viewModel.send(viewAction: .showMapCredit(mapAttribution: attribution)) }) } var body: some View { NavigationView { ZStack(alignment: .bottom) { LocationSharingMapView(tileServerMapURL: viewModel.viewState.mapStyleURL, annotations: [viewModel.viewState.sharedAnnotation], highlightedAnnotation: viewModel.viewState.sharedAnnotation, userAvatarData: viewModel.viewState.userAvatarData, showsUserLocationMode: ShowUserLocationMode.hide, userLocation: Binding.constant(nil), mapCenterCoordinate: Binding.constant(nil), errorSubject: viewModel.viewState.errorSubject, attributionsChanged: { attribution in viewModel.send(viewAction: .showMapCredit(mapAttribution: attribution)) }) MapCreditsView(attributions: viewModel.viewState.attribution, action: { viewModel.send(viewAction: .mapCreditsDidTap) }) .padding(.bottom, 10.0 + safeAreaInsets.bottom) .actionSheet(isPresented: $viewModel.showMapCreditsSheet) { MapCreditsActionSheet(attribution:viewModel.viewState.attribution, openURL: { url in UIApplication.shared.vc_open(url, completionHandler: nil) }).sheet } } .overlay(CenterToUserLocationButton(action: { viewModel.send(viewAction: .showUserLocation) }).offset(x: -11.0, y: 52), alignment: .topTrailing) .ignoresSafeArea(.all, edges: [.bottom]) .toolbar { ToolbarItem(placement: .navigationBarLeading) { Button { viewModel.send(viewAction: .close) } label: { Text(VectorL10n.cancel) .foregroundColor(Color(ThemeService.shared().theme.tintColor)) } } ToolbarItem(placement: .principal) { Text(VectorL10n.locationSharingTitle) .font(.headline) .foregroundColor(theme.colors.primaryContent) } ToolbarItem(placement: .navigationBarTrailing) { Button { viewModel.send(viewAction: .share) } label: { Image(uiImage: Asset.Images.locationShareIcon.image) .foregroundColor(Color(ThemeService.shared().theme.tintColor)) } .disabled(!viewModel.viewState.shareButtonEnabled) .accessibilityIdentifier("shareButton") .opacity(BWIBuildSettings.shared.bwiLocationShareButtonVisible ? 1.0 : 0.0) } } .navigationBarTitleDisplayMode(.inline) // bwi release 2.20.0 disable location share button // .introspectNavigationController { navigationController in // ThemeService.shared().theme.applyStyle(onNavigationBar: navigationController.navigationBar) .alert(item: $viewModel.alertInfo) { info in info.alert } } .accentColor(theme.colors.accent) .activityIndicator(show: viewModel.viewState.showLoadingIndicator) .navigationViewStyle(StackNavigationViewStyle()) } @ViewBuilder private var activityIndicator: some View { if viewModel.viewState.showLoadingIndicator { ActivityIndicator() } } } // MARK: - Previews struct StaticLocationSharingViewer_Previews: PreviewProvider { static let stateRenderer = MockStaticLocationViewingScreenState.stateRenderer static var previews: some View { stateRenderer.screenGroup() } }