commit 2508919f97bcc5a1a959e13516636599a077d4f8 Author: slds1 Date: Tue Sep 24 15:39:39 2024 +0300 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0023a53 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..eda4867 --- /dev/null +++ b/Package.swift @@ -0,0 +1,23 @@ +// swift-tools-version: 5.7 + +import PackageDescription + +let package = Package( + name: "FeedbackKit", + platforms: [ + .iOS(.v15), + ], + products: [ + .library( + name: "FeedbackKit", + targets: ["FeedbackKit"]), + ], + targets: [ + .target( + name: "FeedbackKit", + dependencies: [], + path: "Sources" + ), + ], + swiftLanguageVersions: [.v5] +) diff --git a/Sources/FeedbackKit/FeedbackKit.swift b/Sources/FeedbackKit/FeedbackKit.swift new file mode 100644 index 0000000..9a489be --- /dev/null +++ b/Sources/FeedbackKit/FeedbackKit.swift @@ -0,0 +1,67 @@ +// The Swift Programming Language +// https://docs.swift.org/swift-book + +import UIKit +import SwiftUI + +enum FeedbackType { + case light + case medium + case hard + case custom(Int) +} + +struct FeedbackModifier: ViewModifier { + @Binding var trigger: Bool + var type: FeedbackType + var hapticValue: Int? + + func body(content: Content) -> some View { + content + .onChange(of: trigger) { newValue in + if newValue { + provideFeedback(for: type, hapticValue: hapticValue) + trigger = false + } + } + } + + private func provideFeedback(for type: FeedbackType, hapticValue: Int?) { + let generator: UIImpactFeedbackGenerator + + switch type { + case .light: + generator = UIImpactFeedbackGenerator(style: .light) + case .medium: + generator = UIImpactFeedbackGenerator(style: .medium) + case .hard: + generator = UIImpactFeedbackGenerator(style: .heavy) + case .custom(let intensity): + if let hapticValue = hapticValue { + let customGenerator = UIImpactFeedbackGenerator(style: intensityForValue(hapticValue)) + customGenerator.impactOccurred() + } + return + } + + generator.impactOccurred() + } + + private func intensityForValue(_ value: Int) -> UIImpactFeedbackGenerator.FeedbackStyle { + switch value { + case 1: + return .light + case 2: + return .medium + default: + return .heavy + } + } +} + +extension View { + func feedback(trigger: Binding, type: FeedbackType = .hard, haptic: Int? = nil) -> some View { + self.modifier(FeedbackModifier(trigger: trigger, type: type, hapticValue: haptic)) + } +} +