Files
letro-ios/ElementX/Sources/Other/SwiftUI/Views/JoinCallButton.swift
2026-04-21 09:11:52 +00:00

87 lines
2.6 KiB
Swift
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// Copyright 2025 Element Creations Ltd.
// Copyright 2023-2025 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 Compound
import SwiftUI
struct JoinCallButton: View {
let isVoiceCall: Bool
let action: () -> Void
var body: some View {
if #available(iOS 26, *) {
glassButton
} else {
customButton
}
}
var glassButton: some View {
Button(action: action) {
// Use an HStack on iOS 26 as .labelStyle(.titleAndIcon) doesn't
// seem to have any effect on a label in the navigation bar 🤷
HStack(spacing: 6) {
CompoundIcon(isVoiceCall ? \.voiceCallSolid : \.videoCallSolid)
Text(L10n.actionJoin)
.padding(.trailing, 4)
}
.font(.compound.bodyLG.weight(.medium))
.foregroundStyle(.compound.textOnSolidPrimary)
}
.tint(.compound.bgActionPrimaryRest)
.backportButtonStyleGlassProminent()
.accessibilityLabel(L10n.a11yJoinCall)
}
var customButton: some View {
Button(action: action) {
Label(L10n.actionJoin, icon: \.videoCallSolid)
.labelStyle(.titleAndIcon)
}
.buttonStyle(CustomStyle())
.accessibilityLabel(L10n.a11yJoinCall)
}
struct CustomStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.padding(.horizontal, 16.0)
.padding(.vertical, 4.0)
.foregroundColor(.compound.bgCanvasDefault)
.background(Color.compound.iconAccentTertiary)
.clipShape(Capsule())
}
}
}
// MARK: - Previews
struct JoinCallButton_Previews: PreviewProvider {
static var previews: some View {
ElementNavigationStack {
Color.clear
.toolbar {
ToolbarItem(placement: .confirmationAction) {
JoinCallButton(isVoiceCall: false) { }
}
}
}
.previewDisplayName("Join Video Call")
ElementNavigationStack {
Color.clear
.toolbar {
ToolbarItem(placement: .confirmationAction) {
JoinCallButton(isVoiceCall: true) { }
}
}
}
.previewDisplayName("Join Audio Call")
}
}