31f5937a7f
Reduce extension memory pressure and delivery races while adding richer candidates, tactile feedback, and safer two-level creative polishing.
40 lines
1.2 KiB
Swift
40 lines
1.2 KiB
Swift
// MicVoiceAvailability.swift
|
|
// OSGKeyboard · Shared
|
|
//
|
|
// Single source of truth for keyboard mic color, hint text, and tap behavior.
|
|
|
|
import Foundation
|
|
|
|
/// Whether the keyboard mic can start a Flow utterance right now.
|
|
public enum MicVoiceAvailability: Equatable, Sendable {
|
|
/// Green — tap records immediately without opening the host app.
|
|
case ready
|
|
/// Orange — voice input blocked; see `Reason` for hint copy.
|
|
case unavailable(Reason)
|
|
/// Red — user is actively recording.
|
|
case recording
|
|
/// White — waiting for ASR / cloud polish after stop.
|
|
case processing
|
|
|
|
public enum Reason: Equatable, Sendable {
|
|
case missingAPIKey
|
|
case hostNotReady
|
|
case noFullAccess
|
|
case appGroupUnavailable
|
|
/// User tapped mic; host app jump in progress, awaiting ready contract.
|
|
case preparingSession
|
|
/// Host-app first-run setup not finished — voice gated until complete.
|
|
case onboardingIncomplete
|
|
}
|
|
|
|
public var isReady: Bool {
|
|
if case .ready = self { return true }
|
|
return false
|
|
}
|
|
|
|
public var isUnavailable: Bool {
|
|
if case .unavailable = self { return true }
|
|
return false
|
|
}
|
|
}
|