aboutsummaryrefslogtreecommitdiff
path: root/Hotline/macOS/BroadcastMessageSheet.swift
blob: b3bd7eab62230b24ee8887a4000fdb43d457bb1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import SwiftUI

fileprivate let CHARACTER_LIMIT: Int = 255

struct BroadcastMessageSheet: View {
  @Environment(HotlineState.self) private var model: HotlineState
  @Environment(\.dismiss) private var dismiss
  
  @State private var sending: Bool = false
  
  private var message: String {
    self.model.broadcastMessage.trimmingCharacters(in: .whitespacesAndNewlines)
  }
  
  var body: some View {
    @Bindable var model = self.model
    
    VStack {
      TextField("Write a message...", text: $model.broadcastMessage, axis: .vertical)
        .textFieldStyle(.plain)
        .lineLimit(5, reservesSpace: true)
    }
    .padding(.leading, 32)
    .padding(.top, 2)
    .overlay(alignment: .topLeading) {
      Image("Server Message")
    }
    .padding(16)
    .frame(width: 400)
    .toolbar {
      if self.sending {
        ToolbarItem {
          ProgressView()
            .controlSize(.small)
        }
      }
      
      ToolbarItem(placement: .cancellationAction) {
        Button("Cancel") {
          self.dismiss()
        }
      }
      
      ToolbarItem(placement: .confirmationAction) {
        Button("Broadcast") {
          let message = self.message
          model.broadcastMessage = ""
          
          guard !message.isBlank else {
            return
          }
          
          Task {
            self.sending = true
            defer { self.sending = false }
            
            try await model.sendBroadcast(message)
            
            self.dismiss()
          }
        }
        .disabled(self.message.isEmpty)
      }
    }
  }
}