mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
71ce598355
Co-authored-by: Levitating Pineapple <noreply@levitatingpineapple.com>
69 lines
1.9 KiB
Swift
69 lines
1.9 KiB
Swift
//
|
|
// ChatItemClipShape.swift
|
|
// SimpleX (iOS)
|
|
//
|
|
// Created by Levitating Pineapple on 04/07/2024.
|
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
import SimpleXChat
|
|
|
|
/// Modifier, which provides clipping mask for ``ChatItemWithMenu`` view
|
|
/// and it's previews: (drag interaction, context menu, etc.)
|
|
/// Supports [Dynamic Type](https://developer.apple.com/documentation/uikit/uifont/scaling_fonts_automatically)
|
|
/// by retaining pill shape, even when ``ChatItem``'s height is less that twice its corner radius
|
|
struct ChatItemClipped: ViewModifier {
|
|
struct ClipShape: Shape {
|
|
let maxCornerRadius: Double
|
|
|
|
func path(in rect: CGRect) -> Path {
|
|
Path(
|
|
roundedRect: rect,
|
|
cornerRadius: min((rect.height / 2), maxCornerRadius),
|
|
style: .circular
|
|
)
|
|
}
|
|
}
|
|
|
|
init() {
|
|
clipShape = ClipShape(
|
|
maxCornerRadius: 18
|
|
)
|
|
}
|
|
|
|
init(_ chatItem: ChatItem) {
|
|
clipShape = ClipShape(
|
|
maxCornerRadius: {
|
|
switch chatItem.content {
|
|
case
|
|
.sndMsgContent,
|
|
.rcvMsgContent,
|
|
.rcvDecryptionError,
|
|
.rcvGroupInvitation,
|
|
.sndGroupInvitation,
|
|
.sndDeleted,
|
|
.rcvDeleted,
|
|
.rcvIntegrityError,
|
|
.sndModerated,
|
|
.rcvModerated,
|
|
.rcvBlocked,
|
|
.invalidJSON: 18
|
|
default: 8
|
|
}
|
|
}()
|
|
)
|
|
}
|
|
|
|
private let clipShape: ClipShape
|
|
|
|
func body(content: Content) -> some View {
|
|
content
|
|
.contentShape(.dragPreview, clipShape)
|
|
.contentShape(.contextMenuPreview, clipShape)
|
|
.clipShape(clipShape)
|
|
}
|
|
}
|
|
|
|
|