Files
letro-ios/compound-ios/Sources/Compound/Buttons/SendButton.swift
2025-09-29 10:41:01 +01:00

70 lines
2.1 KiB
Swift

//
// Copyright 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
/// The button component for sending messages and media.
public struct SendButton: View {
@Environment(\.isEnabled) private var isEnabled
@Environment(\.colorScheme) private var colorScheme
/// The action to perform when the user triggers the button.
public let action: () -> Void
private var iconColor: Color {
guard isEnabled else { return .compound.iconQuaternary }
return colorScheme == .light ? .compound.iconOnSolidPrimary : .compound.iconPrimary
}
private var gradient: Gradient { isEnabled ? .compound.action : .init(colors: [.clear]) }
/// Creates a send button that performs the provided action.
public init(action: @escaping () -> Void) {
self.action = action
}
public var body: some View {
Button(action: action) {
CompoundIcon(\.sendSolid, size: .medium, relativeTo: .compound.headingLG)
.foregroundStyle(iconColor)
.scaledPadding(6, relativeTo: .compound.headingLG)
.background { buttonShape }
.compositingGroup()
}
}
var buttonShape: some View {
Circle()
.fill(LinearGradient(gradient: gradient, startPoint: .top, endPoint: .bottom))
}
}
// MARK: - Previews
public struct SendButton_Previews: PreviewProvider, TestablePreview {
public static var previews: some View {
VStack(spacing: 0) {
states
.padding(20)
.background(.compound.bgCanvasDefault)
states
.padding(20)
.background(.compound.bgCanvasDefault)
.environment(\.colorScheme, .dark)
}
.cornerRadius(20)
}
public static var states: some View {
HStack(spacing: 30) {
SendButton { }
.disabled(true)
SendButton { }
}
}
}