Files
WhisperLive/Audio-Transcription-iOS/ContentView.swift
T

100 lines
3.3 KiB
Swift

//
// ContentView.swift
// WhisperLive_iOS_Client
//
// Created by ParkMazorika on 6/17/25.
//
import SwiftUI
/// A standalone view for recording and real-time transcription display.
struct RecordingView: View {
var onDismiss: () -> Void
@StateObject private var recordingViewModel = AudioViewModel()
@State private var showSubmitView = false
var body: some View {
VStack(spacing: 0) {
// Stop button (only visible when recording)
HStack {
Spacer()
if recordingViewModel.isRecording {
Button("Stop Recording") {
recordingViewModel.stopRecording()
recordingViewModel.finalizeTranscription()
showSubmitView = true
}
.font(.headline)
.padding()
.foregroundColor(.gray)
}
}
// Transcription display
ScrollView {
VStack(spacing: 8) {
ForEach(recordingViewModel.transcriptionList.indices, id: \.self) { index in
Text(recordingViewModel.transcriptionList[index])
.padding()
.frame(maxWidth: .infinity, alignment: .leading)
.background(Color.gray.opacity(0.1))
.cornerRadius(8)
.font(.system(size: 14, weight: .semibold))
}
}
.padding(.horizontal)
}
Divider().padding(.top, 8)
// Timer and Record/Pause/Resume button
VStack(spacing: 16) {
Text(recordingViewModel.timeLabel)
.font(.system(size: 40))
Button(action: {
if recordingViewModel.isRecording {
recordingViewModel.isPaused
? recordingViewModel.resumeRecording()
: recordingViewModel.pauseRecording()
} else {
recordingViewModel.startRecording()
}
}) {
Image(systemName: recordingViewModel.isRecording
? (recordingViewModel.isPaused ? "play.circle.fill" : "pause.circle.fill")
: "mic.circle.fill")
.font(.system(size: 50))
.foregroundStyle(.black)
}
}
.padding(.bottom, 40)
}
.padding(.top)
.background(Color(.systemBackground))
.overlay(
Group {
if recordingViewModel.isLoading {
ZStack {
Color.black.opacity(0.4).ignoresSafeArea()
ProgressView("Processing...")
.padding()
.background(Color.white)
.cornerRadius(10)
}
}
}
)
.sheet(isPresented: $showSubmitView) {
//anotherView
}
}
}
#Preview("Recording View") {
RecordingView {
// Dummy dismiss handler
print("RecordingView dismissed")
}
}