conversations-classic-ios/ConversationsClassic/View/Screens/Conversation/ConversationMessageContainer.swift
2024-07-11 17:46:57 +02:00

124 lines
4 KiB
Swift

import MapKit
import SwiftUI
struct ConversationMessageContainer: View {
let message: Message
let isOutgoing: Bool
var body: some View {
if let msgText = message.body, msgText.isLocation {
EmbededMapView(location: msgText.getLatLon)
} else if let attachmentId = message.attachmentId {
AttachmentView(attachmentId: attachmentId)
} else {
Text(message.body ?? "...")
.font(.body2)
.foregroundColor(.Material.Text.main)
.multilineTextAlignment(.leading)
.padding(10)
}
}
}
struct MessageAttr: View {
let message: Message
var body: some View {
VStack(alignment: .leading, spacing: 0) {
Text(message.date, style: .time)
.font(.sub2)
.foregroundColor(.Material.Shape.separator)
Spacer()
if message.sentError {
Image(systemName: "exclamationmark.circle")
.font(.body3)
.foregroundColor(.Rainbow.red500)
} else if message.pending {
Image(systemName: "clock")
.font(.body3)
.foregroundColor(.Material.Shape.separator)
}
}
}
}
private struct EmbededMapView: View {
let location: CLLocationCoordinate2D
var body: some View {
Map(
coordinateRegion: .constant(MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))),
interactionModes: [],
showsUserLocation: false,
userTrackingMode: .none,
annotationItems: [location],
annotationContent: { _ in
MapMarker(coordinate: location, tint: .blue)
}
)
.frame(width: Const.mapPreviewSize, height: Const.mapPreviewSize)
.onTapGesture {
let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: location))
mapItem.name = "Location"
mapItem.openInMaps(launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
}
}
}
private struct AttachmentView: View {
@EnvironmentObject var store: AppStore
let attachmentId: String
var body: some View {
if let attachment = store.state.conversationsState.currentAttachments.first(where: { $0.id == attachmentId }) {
if let localPath = attachment.localPath {
Image(systemName: "questionmark.square")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: Const.attachmentPreviewSize, height: Const.attachmentPreviewSize)
.cornerRadius(10)
} else {
AttachmentPlaceholderView(placeholderImageName: progressImageName(attachment.type))
}
} else {
AttachmentPlaceholderView(placeholderImageName: nil)
}
}
private func progressImageName(_ type: AttachmentType) -> String {
switch type {
case .image:
return "photo"
case .audio:
return "music.note"
case .movie:
return "film"
case .file:
return "doc"
}
}
}
private struct AttachmentPlaceholderView: View {
let placeholderImageName: String?
var body: some View {
Rectangle()
.foregroundColor(.Material.Background.dark)
.frame(width: Const.attachmentPreviewSize, height: Const.attachmentPreviewSize)
.overlay {
ZStack {
ProgressView()
.scaleEffect(1.5)
.progressViewStyle(CircularProgressViewStyle(tint: .Material.Elements.active))
if let imageName = placeholderImageName {
Image(systemName: imageName)
.font(.body1)
.foregroundColor(.Material.Elements.active)
}
}
}
}
}