AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Presentation/SwiftUI/Calling/CallingViewComponent/InfoHeaderView.swift (99 lines of code) (raw):
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//
import SwiftUI
import FluentUI
struct InfoHeaderView: View {
@ObservedObject var viewModel: InfoHeaderViewModel
@Environment(\.sizeCategory) var sizeCategory: ContentSizeCategory
@State var participantsListButtonSourceView = UIView()
@State var participantMenuSourceView = UIView()
@State var customButton1SourceView = UIView()
@State var customButton2SourceView = UIView()
@AccessibilityFocusState var focusedOnParticipantList: Bool
@AccessibilityFocusState var focusedOnCustomButton1: Bool
@AccessibilityFocusState var focusedOnCustomButton2: Bool
let avatarViewManager: AvatarViewManagerProtocol
private enum Constants {
static let shapeCornerRadius: CGFloat = 5
static let infoLabelHorizontalPadding: CGFloat = 16.0
static let hStackHorizontalPadding: CGFloat = 20.0
static let hStackBottomPadding: CGFloat = 10.0
static let hSpace: CGFloat = 4
static let foregroundColor: Color = .white
// MARK: Font Minimum Scale Factor
// Under accessibility mode, the largest size is 35
// so the scale factor would be 9/35 or 0.2
static let accessibilityFontScale: CGFloat = 0.2
// UI guideline suggested min font size should be 9.
// Since Fonts.caption1 has font size of 12,
// so min scale factor should be 9/12 or 0.75 as default.
static let defaultFontScale: CGFloat = 0.75
}
var body: some View {
ZStack(
alignment: .leading
) {
if viewModel.isInfoHeaderDisplayed {
infoHeader
} else {
EmptyView()
}
}
.onAppear(perform: {
viewModel.isPad = UIDevice.current.userInterfaceIdiom == .pad
})
/*
.modifier(PopupModalView(isPresented:
viewModel.isParticipantsListDisplayed || viewModel.isParticipantMenuDisplayed) {
if viewModel.isParticipantsListDisplayed {
participantsListView
.accessibilityElement(children: .contain)
.accessibilityAddTraits(.isModal)
}
if viewModel.isParticipantMenuDisplayed {
participantMenuView
.accessibilityElement(children: .contain)
.accessibilityAddTraits(.isModal)
}
}) */
.accessibilityElement(children: .contain)
}
var infoHeader: some View {
HStack {
// correct dismissButtonAccessibilityID
if viewModel.enableMultitasking {
IconButton(viewModel: viewModel.dismissButtonViewModel)
.flipsForRightToLeftLayoutDirection(true)
.accessibilityIdentifier(AccessibilityIdentifier.dismissButtonAccessibilityID.rawValue)
}
VStack(alignment: .leading) {
Text(viewModel.title)
.alignmentGuide(.leading) { d in d[.leading] }
.foregroundColor(Constants.foregroundColor)
.lineLimit(1)
.font(Fonts.caption1.font)
.accessibilityLabel(Text(viewModel.accessibilityLabelTitle))
.accessibilitySortPriority(1)
.scaledToFit()
.minimumScaleFactor(sizeCategory.isAccessibilityCategory ?
Constants.accessibilityFontScale :
Constants.defaultFontScale)
if !viewModel.subtitle!.isEmpty {
Text(viewModel.subtitle!.trimmingCharacters(in: .whitespacesAndNewlines))
.alignmentGuide(.leading) { d in d[.leading] }
.foregroundColor(Constants.foregroundColor)
.lineLimit(1)
.font(Fonts.caption1.font)
.accessibilityLabel(Text(viewModel.accessibilityLabelSubtitle))
.accessibilitySortPriority(2)
.scaledToFit()
.minimumScaleFactor(sizeCategory.isAccessibilityCategory ?
Constants.accessibilityFontScale :
Constants.defaultFontScale)
}
}
Spacer()
if let customButton1ViewModel = viewModel.customButton1ViewModel {
IconButton(viewModel: customButton1ViewModel)
.background(SourceViewSpace(sourceView: customButton1SourceView))
.accessibilityFocused($focusedOnCustomButton1, equals: true)
}
if let customButton2ViewModel = viewModel.customButton2ViewModel {
IconButton(viewModel: customButton2ViewModel)
.background(SourceViewSpace(sourceView: customButton2SourceView))
.accessibilityFocused($focusedOnCustomButton2, equals: true)
}
participantListButton
}
.padding(EdgeInsets(top: 0,
leading: Constants.hStackHorizontalPadding / 2.0,
bottom: 0,
trailing: 0))
.background(Color(StyleProvider.color.surfaceDarkColor))
.clipShape(RoundedRectangle(cornerRadius: Constants.shapeCornerRadius))
.padding(.bottom, Constants.hStackBottomPadding)
.accessibilityElement(children: .contain)
}
var participantListButton: some View {
IconButton(viewModel: viewModel.participantListButtonViewModel)
.background(SourceViewSpace(sourceView: participantsListButtonSourceView))
.accessibilityFocused($focusedOnParticipantList, equals: true)
}
}