vOOice/VoiceInk/Whisper/WhisperState+UI.swift
2025-07-11 09:05:51 +05:45

123 lines
3.7 KiB
Swift

import Foundation
import SwiftUI
import os
// MARK: - UI Management Extension
extension WhisperState {
// MARK: - Recorder Panel Management
func showRecorderPanel() {
logger.notice("📱 Showing \(self.recorderType) recorder")
if recorderType == "notch" {
if notchWindowManager == nil {
notchWindowManager = NotchWindowManager(whisperState: self, recorder: recorder)
logger.info("Created new notch window manager")
}
notchWindowManager?.show()
} else {
if miniWindowManager == nil {
miniWindowManager = MiniWindowManager(whisperState: self, recorder: recorder)
logger.info("Created new mini window manager")
}
miniWindowManager?.show()
}
}
func hideRecorderPanel() {
if recorderType == "notch" {
notchWindowManager?.hide()
} else {
miniWindowManager?.hide()
}
}
// MARK: - Mini Recorder Management
func toggleMiniRecorder() async {
if isMiniRecorderVisible {
if recordingState == .recording {
await toggleRecord()
} else {
await cancelRecording()
}
} else {
SoundManager.shared.playStartSound()
await toggleRecord()
await MainActor.run {
isMiniRecorderVisible = true // This will call showRecorderPanel() via didSet
}
}
}
func dismissMiniRecorder() async {
if recordingState == .busy { return }
let wasRecording = recordingState == .recording
logger.notice("📱 Dismissing \(self.recorderType) recorder")
await MainActor.run {
self.recordingState = .busy
NotificationManager.shared.dismissNotification()
}
if wasRecording {
await recorder.stopRecording()
}
hideRecorderPanel()
await MainActor.run {
isMiniRecorderVisible = false
}
await cleanupModelResources()
await MainActor.run {
recordingState = .idle
}
}
func cancelRecording() async {
SoundManager.shared.playEscSound()
shouldCancelRecording = true
await dismissMiniRecorder()
}
// MARK: - Notification Handling
func setupNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(handleToggleMiniRecorder), name: .toggleMiniRecorder, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleLicenseStatusChanged), name: .licenseStatusChanged, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handlePromptChange), name: .promptDidChange, object: nil)
}
@objc public func handleToggleMiniRecorder() {
Task {
await toggleMiniRecorder()
}
}
@objc func handleLicenseStatusChanged() {
self.licenseViewModel = LicenseViewModel()
}
@objc func handlePromptChange() {
// Update the whisper context with the new prompt
Task {
await updateContextPrompt()
}
}
private func updateContextPrompt() async {
// Always reload the prompt from UserDefaults to ensure we have the latest
let currentPrompt = UserDefaults.standard.string(forKey: "TranscriptionPrompt") ?? whisperPrompt.transcriptionPrompt
if let context = whisperContext {
await context.setPrompt(currentPrompt)
}
}
}