mirror of
https://github.com/jeremysrand/ListenerApp.git
synced 2024-10-11 11:23:46 +00:00
115 lines
4.0 KiB
Swift
115 lines
4.0 KiB
Swift
//
|
|
// GSView.swift
|
|
// ListenerGS
|
|
//
|
|
// Created by Jeremy Rand on 2021-12-21.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct GSButtonStyle : ButtonStyle {
|
|
func makeBody(configuration: Self.Configuration) -> some View {
|
|
GSButtonStyleView(configuration: configuration)
|
|
}
|
|
}
|
|
|
|
private extension GSButtonStyle {
|
|
struct GSButtonStyleView: View {
|
|
// tracks if the button is enabled or not
|
|
@Environment(\.isEnabled) var isEnabled
|
|
@Environment(\.colorScheme) var colorScheme
|
|
// tracks the pressed state
|
|
let configuration: GSButtonStyle.Configuration
|
|
|
|
var body: some View {
|
|
return configuration.label
|
|
.lineLimit(nil)
|
|
.padding()
|
|
.frame(maxWidth: .infinity)
|
|
.background(isEnabled ? Color("ButtonColor") : Color("InactiveButtonColor"))
|
|
.foregroundColor(isEnabled ? Color("ButtonTextColor") : Color("InactiveButtonTextColor"))
|
|
.font(.subheadline)
|
|
.clipShape(Capsule())
|
|
.opacity(configuration.isPressed ? 0.8 : 1.0)
|
|
.scaleEffect(configuration.isPressed ? 0.98 : 1.0)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct GSView: View {
|
|
private let ipAddress : String
|
|
@StateObject private var connection = GSConnection()
|
|
|
|
var body: some View {
|
|
VStack {
|
|
VStack {
|
|
switch (connection.state) {
|
|
case .disconnected:
|
|
Button("\(Image(systemName: "desktopcomputer.and.arrow.down")) Connect to \(ipAddress)") {
|
|
connection.connect(destination: ipAddress)
|
|
}
|
|
.buttonStyle(GSButtonStyle())
|
|
|
|
case .connecting:
|
|
Button("\(Image(systemName: "desktopcomputer.and.arrow.down")) Connecting to \(ipAddress)") {
|
|
}
|
|
.disabled(true)
|
|
.buttonStyle(GSButtonStyle())
|
|
|
|
case .connected, .listening, .stoplistening, .deleting:
|
|
Button("\(Image(systemName: "desktopcomputer.trianglebadge.exclamationmark")) Disconnect from \(ipAddress)") {
|
|
connection.disconnect()
|
|
}
|
|
.disabled(connection.state != .connected)
|
|
.buttonStyle(GSButtonStyle())
|
|
}
|
|
|
|
switch (connection.state)
|
|
{
|
|
case .disconnected, .stoplistening, .connecting, .deleting:
|
|
Button("\(Image(systemName: "ear.and.waveform")) Listen and Send Text") {
|
|
}
|
|
.disabled(true)
|
|
.buttonStyle(GSButtonStyle())
|
|
|
|
case .connected:
|
|
Button("\(Image(systemName: "ear.and.waveform")) Listen and Send Text") {
|
|
connection.listen(speechForwarder: SpeechForwarder())
|
|
}
|
|
.buttonStyle(GSButtonStyle())
|
|
|
|
case .listening:
|
|
Button("\(Image(systemName: "ear.trianglebadge.exclamationmark")) Stop Listening") {
|
|
connection.stopListening()
|
|
}
|
|
.buttonStyle(GSButtonStyle())
|
|
}
|
|
}
|
|
.fixedSize(horizontal: true, vertical: false)
|
|
.navigationBarTitle(ipAddress)
|
|
}
|
|
.alert(item: $connection.errorMessage) { errorMessage in
|
|
Alert(title:Text(errorMessage.title), message: Text(errorMessage.message))
|
|
}.onDisappear {
|
|
connection.disconnect()
|
|
}
|
|
|
|
Text(connection.textHeard)
|
|
.truncationMode(.head)
|
|
.lineLimit(15)
|
|
.padding()
|
|
|
|
Spacer()
|
|
}
|
|
|
|
init(ipAddress : String) {
|
|
self.ipAddress = ipAddress
|
|
}
|
|
}
|
|
|
|
struct GSView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
GSView(ipAddress: "192.168.1.1")
|
|
}
|
|
}
|