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())
 | |
| }
 |