133 lines
4.2 KiB
Swift
133 lines
4.2 KiB
Swift
//
|
|
// StatusCreationView.swift
|
|
// WatchRunner Watch App
|
|
//
|
|
// Created by LittleSheep on 2025/10/30.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct StatusCreationView: View {
|
|
@EnvironmentObject var appState: AppState
|
|
@Environment(\.dismiss) var dismiss
|
|
|
|
let initialStatus: SnAccountStatus?
|
|
|
|
@State private var attitude: Int
|
|
@State private var isInvisible: Bool
|
|
@State private var isNotDisturb: Bool
|
|
@State private var label: String
|
|
@State private var isSubmitting: Bool = false
|
|
@State private var error: Error? = nil
|
|
|
|
private let networkService = NetworkService()
|
|
|
|
init(initialStatus: SnAccountStatus? = nil) {
|
|
self.initialStatus = initialStatus
|
|
_attitude = State(initialValue: initialStatus?.attitude ?? 1)
|
|
_isInvisible = State(initialValue: initialStatus?.isInvisible ?? false)
|
|
_isNotDisturb = State(initialValue: initialStatus?.isNotDisturb ?? false)
|
|
_label = State(initialValue: initialStatus?.label ?? "")
|
|
}
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
VStack(spacing: 16) {
|
|
// Title
|
|
Text("Set Status")
|
|
.font(.headline)
|
|
.padding(.top)
|
|
|
|
// Label TextField
|
|
TextField("Status label", text: $label)
|
|
.textFieldStyle(.automatic)
|
|
.padding(.horizontal)
|
|
|
|
// Attitude Picker
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text("Mood")
|
|
.font(.subheadline)
|
|
.foregroundColor(.secondary)
|
|
|
|
Picker("Attitude", selection: $attitude) {
|
|
Text("😊 Positive").tag(0)
|
|
Text("😐 Neutral").tag(1)
|
|
Text("😢 Negative").tag(2)
|
|
}
|
|
.pickerStyle(.wheel)
|
|
.frame(height: 80)
|
|
}
|
|
.padding(.horizontal)
|
|
|
|
// Toggles
|
|
VStack(spacing: 12) {
|
|
Toggle("Invisible", isOn: $isInvisible)
|
|
.padding(.horizontal)
|
|
|
|
Toggle("Do Not Disturb", isOn: $isNotDisturb)
|
|
.padding(.horizontal)
|
|
}
|
|
|
|
// Error message
|
|
if let error = error {
|
|
Text("Error: \(error.localizedDescription)")
|
|
.foregroundColor(.red)
|
|
.font(.caption)
|
|
.padding(.horizontal)
|
|
}
|
|
|
|
// Buttons
|
|
HStack(spacing: 12) {
|
|
Button("Cancel") {
|
|
dismiss()
|
|
}
|
|
.buttonStyle(.glass)
|
|
|
|
Button(isSubmitting ? "Saving..." : "Save") {
|
|
Task {
|
|
await submitStatus()
|
|
}
|
|
}
|
|
.buttonStyle(.glassProminent)
|
|
.disabled(isSubmitting)
|
|
}
|
|
.padding(.horizontal)
|
|
.padding(.bottom)
|
|
}
|
|
}
|
|
.navigationTitle("Status")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
}
|
|
|
|
private func submitStatus() async {
|
|
guard let token = appState.token, let serverUrl = appState.serverUrl else {
|
|
error = NSError(domain: "StatusCreationView", code: 1, userInfo: [NSLocalizedDescriptionKey: "Authentication not available"])
|
|
return
|
|
}
|
|
|
|
isSubmitting = true
|
|
error = nil
|
|
|
|
do {
|
|
_ = try await networkService.createOrUpdateStatus(
|
|
attitude: attitude,
|
|
isInvisible: isInvisible,
|
|
isNotDisturb: isNotDisturb,
|
|
label: label.isEmpty ? nil : label,
|
|
token: token,
|
|
serverUrl: serverUrl
|
|
)
|
|
dismiss()
|
|
} catch {
|
|
self.error = error
|
|
}
|
|
|
|
isSubmitting = false
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
StatusCreationView()
|
|
.environmentObject(AppState())
|
|
}
|