diff --git a/ElementX/Sources/Other/MapLibre/MapLibreStaticMapView.swift b/ElementX/Sources/Other/MapLibre/MapLibreStaticMapView.swift index 2f44c5dfe..d67c86767 100644 --- a/ElementX/Sources/Other/MapLibre/MapLibreStaticMapView.swift +++ b/ElementX/Sources/Other/MapLibre/MapLibreStaticMapView.swift @@ -24,48 +24,51 @@ struct MapLibreStaticMapView: View { private let mapTilerAttributionPlacement: MapTilerAttributionPlacement private let pinAnnotationView: PinAnnotation @Environment(\.colorScheme) private var colorScheme - private let imageSize: CGSize @State private var fetchAttempt = 0 init(coordinates: CLLocationCoordinate2D, zoomLevel: Double, - imageSize: CGSize, attributionPlacement: MapTilerAttributionPlacement, mapTilerStatic: MapTilerStaticMapProtocol, @ViewBuilder pinAnnotationView: () -> PinAnnotation) { self.coordinates = coordinates self.zoomLevel = zoomLevel self.mapTilerStatic = mapTilerStatic - self.imageSize = imageSize mapTilerAttributionPlacement = attributionPlacement self.pinAnnotationView = pinAnnotationView() } var body: some View { - if let url = mapTilerStatic.staticMapURL(for: colorScheme.mapStyle, coordinates: coordinates, zoomLevel: zoomLevel, size: imageSize, attribution: mapTilerAttributionPlacement) { - AsyncImage(url: url) { phase in - switch phase { - case .empty: - Image("mapBlurred") - .resizable() - .aspectRatio(contentMode: .fill) - case .success(let image): - ZStack { - image + GeometryReader { geometry in + if let url = mapTilerStatic.staticMapURL(for: colorScheme.mapStyle, + coordinates: coordinates, + zoomLevel: zoomLevel, + size: geometry.size, + attribution: mapTilerAttributionPlacement) { + AsyncImage(url: url) { phase in + switch phase { + case .empty: + Image("mapBlurred") .resizable() .aspectRatio(contentMode: .fill) - pinAnnotationView + case .success(let image): + ZStack { + image + .resizable() + .aspectRatio(contentMode: .fill) + pinAnnotationView + } + case .failure: + errorView + @unknown default: + EmptyView() } - case .failure: - errorView - @unknown default: - EmptyView() } + .id(fetchAttempt) + .clipped() + } else { + Image("mapBlurred") } - .id(fetchAttempt) - .clipped() - } else { - Image("mapBlurred") } } @@ -101,7 +104,6 @@ struct MapLibreStaticMapView_Previews: PreviewProvider { static var previews: some View { MapLibreStaticMapView(coordinates: CLLocationCoordinate2D(), zoomLevel: 15, - imageSize: .init(width: 300, height: 200), attributionPlacement: .bottomLeft, mapTilerStatic: MapTilerStaticMapMock()) { Image(systemName: "mappin.circle.fill") diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift index a2c653358..6f3434054 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift @@ -23,11 +23,11 @@ struct LocationRoomTimelineView: View { var body: some View { TimelineStyler(timelineItem: timelineItem) { if let geoURI = timelineItem.content.geoURI { - let mapSize: CGSize = .init(width: 292, height: 188) - MapLibreStaticMapView(geoURI: geoURI, size: mapSize) { + MapLibreStaticMapView(geoURI: geoURI) { LocationMarkerView() } - .frame(width: mapSize.width, height: mapSize.height) + .frame(maxHeight: 300) + .aspectRatio(3 / 2, contentMode: .fit) } else { FormattedBodyText(text: timelineItem.body) } @@ -36,10 +36,9 @@ struct LocationRoomTimelineView: View { } private extension MapLibreStaticMapView { - init(geoURI: GeoURI, size: CGSize, @ViewBuilder pinAnnotationView: () -> PinAnnotation) { + init(geoURI: GeoURI, @ViewBuilder pinAnnotationView: () -> PinAnnotation) { self.init(coordinates: .init(latitude: geoURI.latitude, longitude: geoURI.longitude), zoomLevel: 15, - imageSize: size, attributionPlacement: .bottomLeft, mapTilerStatic: MapTilerStaticMap(key: ServiceLocator.shared.settings.mapTilerApiKey, lightURL: ServiceLocator.shared.settings.lightTileMapStyleURL,