// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import Foundation
import SwiftUI
extension View {
func crContainerBackground(_ backgroundView: some View) -> some View {
#if swift(>=5.9)
if #available(iOS 17.0, *) {
return containerBackground(for: .widget) {
backgroundView
}
}
#endif
return background(backgroundView)
}
}
extension WidgetConfiguration {
func crDisfavoredLocations() -> some WidgetConfiguration {
#if swift(>=5.9)
if #available(iOS 17.0, *) {
return disfavoredLocations(
[.iPhoneWidgetsOnMac], for: [.systemSmall, .systemMedium, .accessoryCircular])
}
#endif
return self
}
func crContentMarginsDisabled() -> some WidgetConfiguration {
#if swift(>=5.9)
if #available(iOS 17.0, *) {
return contentMarginsDisabled()
}
#endif
return self
}
func crContainerBackgroundRemovable(_ remove: Bool) -> some WidgetConfiguration {
#if swift(>=5.9)
if #available(iOS 17.0, *) {
return containerBackgroundRemovable(remove)
}
#endif
return self
}
}
#if swift(>=5.9)
@available(iOS 17.0, *)
struct CompatBackgroundView<Content: View>: View {
@Environment(\.showsWidgetContainerBackground) var showsWidgetBackground
@ViewBuilder let content: (Bool) -> Content
var body: some View {
content(showsWidgetBackground)
}
}
#endif
extension View {
// Hides the modified view on iOS17+ if the environment value
// `\.showsWidgetContainerBackground` is false
// Note: the property crashes on iOS17 beta 6, so this is not used for now.
// But keep the wrapper to be used if needed once this is fixed.
func applyShowWidgetContainerBackground() -> some View {
#if swift(>=5.9)
if #available(iOS 17.0, *) {
return
CompatBackgroundView { show in
if show {
self
}
}
}
#endif
return self
}
}