You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Apple/Sources/AllInApp/AllIn/Extensions/Extensions.swift

86 lines
2.8 KiB

//
// Extensions.swift
// AllIn
//
// Created by Lucas on 20/09/2023.
//
import Foundation
import SwiftUI
extension Text {
func textStyle(weight: Font.Weight, color: Color, size: CGFloat) -> Text {
return self
.fontWeight(weight)
.foregroundColor(color)
.font(.system(size: size))
}
}
struct RoundedCorner: Shape {
var radius: CGFloat = .infinity
var corners: UIRectCorner = .allCorners
func path(in rect: CGRect) -> Path {
let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
return Path(path.cgPath)
}
}
extension View {
func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View {
clipShape(RoundedCorner(radius: radius, corners: corners) )
}
}
extension View {
func border(width: CGFloat, edges: [Edge], color: Color) -> some View {
overlay(EdgeBorder(width: width, edges: edges).foregroundColor(color))
}
}
struct EdgeBorder: Shape {
var width: CGFloat
var edges: [Edge]
func path(in rect: CGRect) -> Path {
edges.map { edge -> Path in
switch edge {
case .top: return Path(.init(x: rect.minX, y: rect.minY, width: rect.width, height: width))
case .bottom: return Path(.init(x: rect.minX, y: rect.maxY - width, width: rect.width, height: width))
case .leading: return Path(.init(x: rect.minX, y: rect.minY, width: width, height: rect.height))
case .trailing: return Path(.init(x: rect.maxX - width, y: rect.minY, width: width, height: rect.height))
}
}.reduce(into: Path()) { $0.addPath($1) }
}
}
extension View {
func hideKeyboard() {
let resign = #selector(UIResponder.resignFirstResponder)
UIApplication.shared.sendAction(resign, to: nil, from: nil, for: nil)
}
}
extension View {
func allInPopover(isPresented: Binding<Bool>, paddingHorizontal: CGFloat = 15, content: @escaping () -> String, textColor: Color = .white, fontSize: CGFloat = 12, frameWidth: CGFloat = 270) -> some View {
self.onTapGesture {
isPresented.wrappedValue.toggle()
}
.popover(isPresented: isPresented, attachmentAnchor: .point(.top)) {
ZStack {
AllInColors.primaryColor // Couleur de fond
.edgesIgnoringSafeArea(.all)
VStack(alignment: .leading, spacing: 12) {
Text(content())
.textStyle(weight: .regular, color: textColor, size: fontSize)
}
.padding([.leading, .trailing], paddingHorizontal)
.frame(width: frameWidth)
.presentationCompactAdaptation(.popover)
}
}
}
}