Show public users when logging in

This commit is contained in:
Aiden Vigue 2021-05-23 14:46:06 -04:00
parent 841f75d80f
commit 1307194e4e
2 changed files with 184 additions and 85 deletions

View File

@ -13,6 +13,14 @@ import CoreData
import KeychainSwift import KeychainSwift
import Introspect import Introspect
import Sentry import Sentry
import SDWebImageSwiftUI
class publicUser: ObservableObject {
@Published var username: String = "";
@Published var hasPassword: Bool = true;
@Published var primaryImageTag: String = "";
@Published var id: String = "";
}
struct ConnectToServerView: View { struct ConnectToServerView: View {
@Environment(\.managedObjectContext) private var viewContext @Environment(\.managedObjectContext) private var viewContext
@ -25,6 +33,7 @@ struct ConnectToServerView: View {
@State private var isSignInErrored = false; @State private var isSignInErrored = false;
@State private var isConnected = false; @State private var isConnected = false;
@State private var serverName = ""; @State private var serverName = "";
@State private var publicUsers: [publicUser] = [];
@Binding var rootIsActive : Bool @Binding var rootIsActive : Bool
let userUUID = UUID(); let userUUID = UUID();
@ -52,64 +61,46 @@ struct ConnectToServerView: View {
func start() { func start() {
if(skip_server_bool) { if(skip_server_bool) {
_uri.wrappedValue = skip_server_obj?.baseURI ?? ""
let request = RestRequest(method: .get, url: uri + "/users/public")
request.responseData() { (result: Result<RestResponse<Data>, RestError>) in
switch result {
case .success(let response):
do {
let body = response.body;
let json = try JSON(data: body);
for (_,publicUserDto):(String, JSON) in json {
let newPublicUser = publicUser()
newPublicUser.username = publicUserDto["Name"].string ?? ""
newPublicUser.hasPassword = publicUserDto["HasPassword"].bool ?? true
newPublicUser.primaryImageTag = publicUserDto["PrimaryImageTag"].string ?? ""
newPublicUser.id = publicUserDto["Id"].string ?? ""
_publicUsers.wrappedValue.append(newPublicUser)
}
} catch(_) {
}
_serverSkipped.wrappedValue = true; _serverSkipped.wrappedValue = true;
_serverSkippedAlert.wrappedValue = true; _serverSkippedAlert.wrappedValue = true;
_server_id.wrappedValue = skip_server_obj?.server_id ?? "" _server_id.wrappedValue = skip_server_obj?.server_id ?? ""
_serverName.wrappedValue = skip_server_obj?.name ?? "" _serverName.wrappedValue = skip_server_obj?.name ?? ""
_uri.wrappedValue = skip_server_obj?.baseURI ?? ""
_isConnected.wrappedValue = true; _isConnected.wrappedValue = true;
break
case .failure(_):
_serverSkipped.wrappedValue = true;
_serverSkippedAlert.wrappedValue = true;
_server_id.wrappedValue = skip_server_obj?.server_id ?? ""
_serverName.wrappedValue = skip_server_obj?.name ?? ""
_isConnected.wrappedValue = true;
break
}
}
} }
} }
var body: some View { func doLogin() {
Form {
if(!isConnected) {
Section(header: Text("Server Information")) {
TextField("Server URL", text: $uri)
.disableAutocorrection(true)
.autocapitalization(.none)
Button {
_isWorking.wrappedValue = true;
if(!_uri.wrappedValue.contains("http")) {
_uri.wrappedValue = "http://" + _uri.wrappedValue;
}
if(_uri.wrappedValue.last == "/") {
_uri.wrappedValue = String(_uri.wrappedValue.dropLast())
}
let request = RestRequest(method: .get, url: uri + "/System/Info/Public")
request.responseObject() { (result: Result<RestResponse<ServerPublicInfoResponse>, RestError>) in
switch result {
case .success(let response):
let server = response.body
_serverName.wrappedValue = server.ServerName
_server_id.wrappedValue = server.Id
if(server.StartupWizardCompleted) {
_isConnected.wrappedValue = true;
}
case .failure(_):
_isErrored.wrappedValue = true;
}
_isWorking.wrappedValue = false;
}
} label: {
HStack {
Text("Connect")
Spacer()
ProgressView().isHidden(!isWorking)
}
}.disabled(isWorking || uri.isEmpty)
}.alert(isPresented: $isErrored) {
Alert(title: Text("Error"), message: Text("Couldn't connect to server"), dismissButton: .default(Text("Try again")))
}
} else {
Section(header: Text("\(serverSkipped ? "re" : "")Authenticate to \"\(serverName)\"")) {
TextField("Username", text: $username)
.disableAutocorrection(true)
.autocapitalization(.none)
SecureField("Password (optional)", text: $password)
.disableAutocorrection(true)
.autocapitalization(.none)
Button {
_isWorking.wrappedValue = true _isWorking.wrappedValue = true
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String; let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String;
let authHeader = "MediaBrowser Client=\"SwiftFin\", Device=\"\(UIDevice.current.name)\", DeviceId=\"\(serverSkipped ? reauthDeviceID : userUUID.uuidString)\", Version=\"\(appVersion ?? "0.0.1")\""; let authHeader = "MediaBrowser Client=\"SwiftFin\", Device=\"\(UIDevice.current.name)\", DeviceId=\"\(serverSkipped ? reauthDeviceID : userUUID.uuidString)\", Version=\"\(appVersion ?? "0.0.1")\"";
@ -175,6 +166,84 @@ struct ConnectToServerView: View {
} }
_isWorking.wrappedValue = false; _isWorking.wrappedValue = false;
} }
}
var body: some View {
Form {
if(!isConnected) {
Section(header: Text("Server Information")) {
TextField("Server URL", text: $uri)
.disableAutocorrection(true)
.autocapitalization(.none)
Button {
_isWorking.wrappedValue = true;
if(!_uri.wrappedValue.contains("http")) {
_uri.wrappedValue = "http://" + _uri.wrappedValue;
}
if(_uri.wrappedValue.last == "/") {
_uri.wrappedValue = String(_uri.wrappedValue.dropLast())
}
let request = RestRequest(method: .get, url: uri + "/System/Info/Public")
request.responseObject() { (result: Result<RestResponse<ServerPublicInfoResponse>, RestError>) in
switch result {
case .success(let response):
let server = response.body
_serverName.wrappedValue = server.ServerName
_server_id.wrappedValue = server.Id
if(server.StartupWizardCompleted) {
_isConnected.wrappedValue = true;
}
case .failure(_):
_isErrored.wrappedValue = true;
}
_isWorking.wrappedValue = false;
}
let request2 = RestRequest(method: .get, url: uri + "/users/public")
request2.responseData() { (result: Result<RestResponse<Data>, RestError>) in
switch result {
case .success(let response):
do {
let body = response.body;
let json = try JSON(data: body);
for (_,publicUserDto):(String, JSON) in json {
let newPublicUser = publicUser()
newPublicUser.username = publicUserDto["Name"].string ?? ""
newPublicUser.hasPassword = publicUserDto["HasPassword"].bool ?? true
newPublicUser.primaryImageTag = publicUserDto["PrimaryImageTag"].string ?? ""
newPublicUser.id = publicUserDto["Id"].string ?? ""
_publicUsers.wrappedValue.append(newPublicUser)
}
} catch(_) {
}
break
case .failure(_):
break
}
}
} label: {
HStack {
Text("Connect")
Spacer()
ProgressView().isHidden(!isWorking)
}
}.disabled(isWorking || uri.isEmpty)
}.alert(isPresented: $isErrored) {
Alert(title: Text("Error"), message: Text("Couldn't connect to server"), dismissButton: .default(Text("Try again")))
}
} else {
if(_publicUsers.wrappedValue.count == 0) {
Section(header: Text("\(serverSkipped ? "re" : "")Authenticate to \"\(serverName)\"")) {
TextField("Username", text: $username)
.disableAutocorrection(true)
.autocapitalization(.none)
SecureField("Password", text: $password)
.disableAutocorrection(true)
.autocapitalization(.none)
Button {
doLogin()
} label: { } label: {
HStack { HStack {
Text("Login") Text("Login")
@ -186,6 +255,36 @@ struct ConnectToServerView: View {
Alert(title: Text("Error"), message: Text("Invalid credentials"), dismissButton: .default(Text("Back"))) Alert(title: Text("Error"), message: Text("Invalid credentials"), dismissButton: .default(Text("Back")))
} }
} }
} else {
Section(header: Text("\(serverSkipped ? "re" : "")Authenticate to \"\(serverName)\"")) {
ForEach(publicUsers, id: \.id) { pubuser in
HStack() {
Button() {
if(pubuser.hasPassword) {
_username.wrappedValue = pubuser.username
_publicUsers.wrappedValue = []
} else {
_publicUsers.wrappedValue = []
_password.wrappedValue = "";
_username.wrappedValue = pubuser.username
doLogin()
}
} label: {
HStack() {
Text(pubuser.username).font(.subheadline).fontWeight(.semibold)
Spacer()
WebImage(url: URL(string: "\(uri)/Users/\(pubuser.id)/Images/Primary?width=200&quality=80&tag=\(pubuser.primaryImageTag)")!)
.resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size
.aspectRatio(contentMode: .fill)
.shadow(radius: 5)
.frame(width: 60, height: 60)
.cornerRadius(30.0)
}
}
}
}
}
}
} }
}.navigationTitle("Connect to Server") }.navigationTitle("Connect to Server")
.alert(isPresented: $serverSkippedAlert) { .alert(isPresented: $serverSkippedAlert) {

View File

@ -72,7 +72,7 @@ class PlayerUIView: UIView, VLCMediaPlayerDelegate {
DispatchQueue.global(qos: .utility).async { [weak self] in DispatchQueue.global(qos: .utility).async { [weak self] in
if(self?.url.wrappedValue.videoType ?? .hls == .hls) { if(self?.url.wrappedValue.videoType ?? .hls == .hls) {
sleep(5) usleep(75000000)
} }
self?.mediaPlayer.wrappedValue.play() self?.mediaPlayer.wrappedValue.play()
if(self?.startTime != 0) { if(self?.startTime != 0) {