Show public users when logging in
This commit is contained in:
parent
841f75d80f
commit
1307194e4e
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue