70 lines
2.1 KiB
Swift
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 { }
|
|
}
|
|
}
|
|
}
|