[Auth-Screen]: Fix: Anisette servers list wasn't ready before signin attempt causing "No valid Servers Found"

This commit is contained in:
Magesh K
2024-12-14 06:51:08 +05:30
parent f542a52bda
commit 5058658b66
2 changed files with 45 additions and 22 deletions

View File

@@ -31,6 +31,15 @@ final class AuthenticationViewController: UIViewController
{ {
super.viewDidLoad() super.viewDidLoad()
// fetch anisette servers asap when loading Auth Screen (if list is empty
if(UserDefaults.standard.menuAnisetteServersList.isEmpty){
Task{
await AnisetteViewModel.getListOfServers(
serverSource: UserDefaults.standard.menuAnisetteList
)
}
}
self.signInButton.activityIndicatorView.style = .medium self.signInButton.activityIndicatorView.style = .medium
self.signInButton.activityIndicatorView.color = .white self.signInButton.activityIndicatorView.color = .white

View File

@@ -36,32 +36,46 @@ class AnisetteViewModel: ObservableObject {
} }
} }
func getListOfServers() { func getDefaultListOfServers() {
guard let url = URL(string: source) else { return } // initiate fetch but do not wait in blocking manner
Task{
self.servers = await AnisetteViewModel.getListOfServers(serverSource: self.source)
}
}
static func getListOfServers(serverSource: String) async -> [Server] {
var aniServers: [Server] = []
guard let url = URL(string: serverSource) else {
return aniServers
}
// DO NOT use local cache when fetching anisette servers // DO NOT use local cache when fetching anisette servers
var request = URLRequest(url: url) var request = URLRequest(url: url)
request.cachePolicy = .reloadIgnoringLocalCacheData request.cachePolicy = .reloadIgnoringLocalCacheData
URLSession.shared.dataTask(with: request) { data, response, error in return await withCheckedContinuation{(continuation: CheckedContinuation<[Server], Never>) in
if let error = error { // perform async operation with callback
return URLSession.shared.dataTask(with: request) { data, response, error in
} if error == nil, let data = data {
if let data = data { do {
do { let decoder = Foundation.JSONDecoder()
let decoder = Foundation.JSONDecoder() let servers = try decoder.decode(AnisetteServerData.self, from: data)
let servers = try decoder.decode(AnisetteServerData.self, from: data) DispatchQueue.main.async {
DispatchQueue.main.async { aniServers.append(contentsOf: servers.servers)
self.servers = servers.servers // store server addresses as list
// store server addresses as list UserDefaults.standard.menuAnisetteServersList = aniServers.map(\.self.address)
UserDefaults.standard.menuAnisetteServersList = servers.servers.map(\.self.address) }
} catch {
// Handle decoding error
print("Failed to decode JSON: \(error)")
} }
} catch {
// Handle decoding error
print("Failed to decode JSON: \(error)")
} }
}
}.resume() //unblock the continuation
continuation.resume(returning: aniServers)
}.resume()
}
} }
} }
@@ -77,7 +91,7 @@ struct AnisetteServers: View {
Color(UIColor.systemBackground) Color(UIColor.systemBackground)
.ignoresSafeArea() .ignoresSafeArea()
.onAppear { .onAppear {
viewModel.getListOfServers() viewModel.getDefaultListOfServers()
} }
VStack { VStack {
if #available(iOS 16.0, *) { if #available(iOS 16.0, *) {
@@ -144,7 +158,7 @@ struct AnisetteServers: View {
.shadow(color: Color.black.opacity(0.2), radius: 5, x: 0, y: 5) .shadow(color: Color.black.opacity(0.2), radius: 5, x: 0, y: 5)
.onChange(of: viewModel.source) { newValue in .onChange(of: viewModel.source) { newValue in
UserDefaults.standard.menuAnisetteList = newValue UserDefaults.standard.menuAnisetteList = newValue
viewModel.getListOfServers() viewModel.getDefaultListOfServers()
} }
HStack(spacing: 16) { HStack(spacing: 16) {
@@ -166,7 +180,7 @@ struct AnisetteServers: View {
.shadow(color: Color.accentColor.opacity(0.4), radius: 10, x: 0, y: 5) .shadow(color: Color.accentColor.opacity(0.4), radius: 10, x: 0, y: 5)
SUIButton(action: { SUIButton(action: {
viewModel.getListOfServers() viewModel.getDefaultListOfServers()
}) { }) {
HStack{ HStack{
Spacer() Spacer()