100 lines
3.3 KiB
Swift
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")
|
|
}
|
|
}
|