aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Views/ServerView.swift
blob: 98fd515ead3677f6d1c92fb71eeaa04a8a356167 (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import SwiftUI

struct ServerView: View {
  @Environment(HotlineState.self) private var appState
  @Environment(HotlineClient.self) private var hotline
  @Environment(HotlineTrackerClient.self) private var tracker
  
  let server: HotlineServer
  
  func connectionStatusTitle(status: HotlineClientStatus) -> String {
    switch(status) {
    case .disconnected:
      return "Disconnected"
    case .connecting:
      return "Connecting"
    case .connected:
      return "Connected"
    case .loggingIn:
      return "Logging In"
    case .loggedIn:
      return "Logged In"
    }
  }
  
  func connectionProgress(status: HotlineClientStatus) -> Double {
    return Double(status.rawValue) / Double(HotlineClientStatus.loggedIn.rawValue)
  }
  
  var body: some View {
    @Bindable var config = appState
    
    NavigationStack {
      if hotline.connectionStatus != .loggedIn {
        VStack {
          Spacer()
          VStack(alignment: .center) {
            Text("🌎").font(.largeTitle)
            Text(server.name!).font(.title3).fontWeight(.medium)
            Text(server.description!).opacity(0.6).font(.title3)
            Text(server.address).opacity(0.6).font(.title3)
          }
          Spacer()
          HStack(alignment: .center) {
            if hotline.connectionStatus == .disconnected {
              ProgressView(connectionStatusTitle(status: hotline.connectionStatus), value: connectionProgress(status: hotline.connectionStatus))
              Button("Connect") {
                hotline.connect(to: server)
  //              config.dismissTracker()
              }
              .bold()
              .padding(EdgeInsets(top: 16, leading: 24, bottom: 16, trailing: 24))
              .frame(maxWidth: .infinity)
              .foregroundColor(.black)
              .background(LinearGradient(gradient: Gradient(colors: [Color(white: 0.95), Color(white: 0.91)]), startPoint: .top, endPoint: .bottom))
              .overlay(
                RoundedRectangle(cornerRadius: 10.0).stroke(.black, lineWidth: 3).opacity(0.4)
              )
              .cornerRadius(10.0)
            }
            else {
              ProgressView("", value: Double(hotline.connectionStatus.rawValue / HotlineClientStatus.loggedIn.rawValue))
            }
          }
        }
        .padding()
      }
      else {
        TabView {
          ChatView()
            .navigationTitle(hotline.server?.name ?? "Hotline")
            .navigationBarTitleDisplayMode(.inline)
            .navigationBarItems(
              leading: Button(action: {
                appState.presentTracker()
              }) {
                Image(systemName: "globe.americas.fill") // Hamburger icon or similar
                  .imageScale(.large)
              }
            )
          //          .toolbarBackground(.visible, for: .navigationBar)
          //          .toolbarBackground(.red, for: .navigationBar)
            .tabItem {
              Image(systemName: "message")
            }
          
          UserListView()
            .navigationTitle("User List")
            .navigationBarTitleDisplayMode(.inline)
            .tabItem {
              Image(systemName: "person.fill")
            }
          
          Text("News")
            .tabItem {
              Image(systemName: "newspaper")
            }
          
          MessageBoardView()
            .navigationTitle("Message Board")
            .navigationBarTitleDisplayMode(.inline)
            .tabItem {
              Image(systemName: "pin")
            }
          
          FilesView()
            .navigationTitle("Files")
            .navigationBarTitleDisplayMode(.inline)
            .tabItem {
              Image(systemName: "folder")
            }
        }
      }
      
      //      .sheet(isPresented: Binding(get: { hotline.connectionStatus != .loggedIn }, set: { _ in })) {
      //        TrackerView()
      //      }
    }
  }
}

#Preview {
  ServerView(server: HotlineServer(address: "192.168.1.1", port: 5050, users: 5, name: "Ye Olde Server", description: "This is a server"))
    .environment(HotlineClient())
    .environment(HotlineTrackerClient(tracker: HotlineTracker("hltracker.com")))
    .environment(HotlineState())
}