Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 13 additions & 10 deletions app/MeetingTranscriber/Sources/MeetingTranscriberApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,12 @@ struct MeetingTranscriberApp: App {
} icon: {
Image(nsImage: MenuBarIcon.image(
badge: currentBadge,
animationFrame: currentBadge.isAnimated ? iconAnimationFrame : 0,
animationFrame: iconAnimationFrame,
))
}
.onReceive(iconTimer) { _ in
guard currentBadge.isAnimated else { return }
// Always tick so currentBadge is re-read every 0.4s.
// Non-animated badges ignore animationFrame (cached frame 0).
iconAnimationFrame = (iconAnimationFrame + 1) % MenuBarIcon.frameCount
}
.onReceive(NotificationCenter.default.publisher(for: .autoWatchStart)) { _ in
Expand Down Expand Up @@ -172,22 +173,24 @@ struct MeetingTranscriberApp: App {
}

private var currentBadge: BadgeKind {
// Manual / auto recording via WatchLoop
if let loop = watchLoop, loop.isActive {
if loop.state == .recording { return .recording }
if let activeJob = pipelineQueue.activeJobs.first {
switch activeJob.state {
case .transcribing: return .transcribing
case .diarizing: return .diarizing
default: return .processing
}
}
switch loop.transcriberState {
case .waitingForSpeakerCount, .waitingForSpeakerNames: return .userAction
case .protocolReady: return .done
case .error: return .error
case .transcribing, .recordingDone: return .transcribing
case .generatingProtocol: return .processing
default: return .inactive
default: break
}
}
// Pipeline queue (file processing or post-recording pipeline)
if let activeJob = pipelineQueue.activeJobs.first {
switch activeJob.state {
case .transcribing: return .transcribing
case .diarizing: return .diarizing
default: return .processing
}
}
if updateChecker.availableUpdate != nil { return .updateAvailable }
Expand Down
21 changes: 21 additions & 0 deletions app/MeetingTranscriber/Tests/PipelineQueueTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,27 @@ final class PipelineQueueTests: XCTestCase {
XCTAssertEqual(queue.activeJobs[0].meetingTitle, "Active")
}

func testActiveJobsIncludesDiarizingAndGeneratingProtocol() {
var j1 = makeJob(title: "Diarizing")
j1.state = .diarizing
var j2 = makeJob(title: "Protocol")
j2.state = .generatingProtocol
queue.enqueue(j1)
queue.enqueue(j2)
XCTAssertEqual(queue.activeJobs.count, 2)
}

func testActiveJobsExcludesTerminalStates() {
var done = makeJob(title: "Done")
done.state = .done
var err = makeJob(title: "Error")
err.state = .error
queue.enqueue(done)
queue.enqueue(err)
queue.enqueue(makeJob(title: "Waiting"))
XCTAssertTrue(queue.activeJobs.isEmpty)
}

func testPendingJobs() {
queue.enqueue(makeJob(title: "Waiting 1"))
queue.enqueue(makeJob(title: "Waiting 2"))
Expand Down
Loading