Files
openclaw/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatHaptics.swift
Peter Steinberger e01d1e85f3 ci(swift): enforce shared OpenClawKit dead-code coverage (#105770)
* ci(swift): enforce shared kit dead-code coverage

* chore(i18n): sync native source inventory

* ci(swift): install pinned iOS scan tools
2026-07-12 17:35:47 -07:00

47 lines
1.3 KiB
Swift

import Foundation
#if canImport(UIKit) && !os(watchOS)
import UIKit
#endif
public struct OpenClawChatHaptics: Sendable {
public enum Event: Sendable, Equatable {
case messageSent
case runCompleted
case runFailed
}
private let performer: @Sendable (Event) -> Void
public init() {
self.performer = Self.defaultPerformer
}
// periphery:ignore - package tests inject a recorder; app consumers use the live performer.
public init(performer: @escaping @Sendable (Event) -> Void) {
self.performer = performer
}
public func perform(_ event: Event) {
self.performer(event)
}
private static let defaultPerformer: @Sendable (Event) -> Void = { event in
#if canImport(UIKit) && !os(watchOS)
Task { @MainActor in
switch event {
case .messageSent:
UIImpactFeedbackGenerator(style: .light).impactOccurred()
case .runCompleted:
UINotificationFeedbackGenerator().notificationOccurred(.success)
case .runFailed:
UINotificationFeedbackGenerator().notificationOccurred(.error)
}
}
#else
// NSHapticFeedbackManager only fires reliably from gesture contexts, so macOS is a no-op.
_ = event
#endif
}
}