Skip to content

Commit 98646bd

Browse files
committed
better login flow
1 parent 5587862 commit 98646bd

File tree

1 file changed

+69
-36
lines changed

1 file changed

+69
-36
lines changed

Django Files/Views/SessionEditor.swift

Lines changed: 69 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ struct SessionEditor: View {
1414
@Query private var items: [DjangoFilesSession]
1515

1616
@State private var showLoginSheet: Bool = false
17-
@State private var newSession: DjangoFilesSession?
17+
@State private var tempSession: DjangoFilesSession?
1818

1919
let session: DjangoFilesSession?
2020
var onSessionCreated: ((DjangoFilesSession) -> Void)?
@@ -25,32 +25,50 @@ struct SessionEditor: View {
2525

2626
@State private var showDuplicateAlert = false
2727

28-
private func checkURLAuthAndSave() {
29-
if let session {
30-
session.url = url?.absoluteString ?? ""
31-
session.token = token
32-
session.auth = false
33-
} else {
34-
if items.contains(where: { $0.url == url?.absoluteString }) {
35-
showDuplicateAlert = true
36-
return
37-
}
38-
newSession = DjangoFilesSession()
39-
newSession!.url = url?.absoluteString ?? ""
40-
newSession!.token = token
41-
newSession!.auth = false
42-
modelContext.insert(newSession!)
43-
showLoginSheet = true
44-
}
45-
}
46-
4728
@State private var url: URL? = nil
4829
@State private var token: String = ""
49-
@State private var badURL = false
50-
@State private var insecureURL = false
30+
@State private var badURL: Bool = false
31+
@State private var insecureURL: Bool = false
32+
@State private var isCheckingServer: Bool = false
33+
@State private var serverError: String? = nil
5134

5235
@FocusState private var isURLFieldFocused: Bool
5336

37+
private func checkURLAuthAndSave() {
38+
Task {
39+
isCheckingServer = true
40+
serverError = nil
41+
42+
// Create a temporary DFAPI instance to check auth methods
43+
let api = DFAPI(url: url!, token: "")
44+
if let authResponse = await api.getAuthMethods() {
45+
isCheckingServer = false
46+
47+
// Server is valid, proceed with login
48+
if let session {
49+
// For editing, update the URL and clear auth
50+
session.url = url?.absoluteString ?? ""
51+
session.token = token
52+
session.auth = false
53+
showLoginSheet = true
54+
} else {
55+
if items.contains(where: { $0.url == url?.absoluteString }) {
56+
showDuplicateAlert = true
57+
return
58+
}
59+
// Create temporary session but don't save it yet
60+
tempSession = DjangoFilesSession()
61+
tempSession!.url = url?.absoluteString ?? ""
62+
tempSession!.token = token
63+
tempSession!.auth = false
64+
showLoginSheet = true
65+
}
66+
} else {
67+
isCheckingServer = false
68+
serverError = "Could not connect to server or server is not a Django Files instance"
69+
}
70+
}
71+
}
5472

5573
var body: some View {
5674
NavigationStack {
@@ -68,6 +86,7 @@ struct SessionEditor: View {
6886
if temp?.scheme != nil && temp?.scheme != ""{
6987
url = temp
7088
insecureURL = (url?.scheme?.lowercased()) == ("http")
89+
serverError = nil
7190
}
7291
}
7392
), prompt: Text(verbatim: "https://df.example.com"))
@@ -86,11 +105,23 @@ struct SessionEditor: View {
86105
let warningMessage = "⚠️ HTTPS strongly recommend."
87106
TextField("", text: Binding(
88107
get: { warningMessage },
89-
set: { _ in } // Prevents user from modifying the text
108+
set: { _ in }
90109
))
91-
.disabled(true) // Prevents user input
110+
.disabled(true)
111+
.foregroundColor(.red)
112+
}
113+
if let error = serverError {
114+
Text("" + error)
115+
.disabled(true)
92116
.foregroundColor(.red)
93117
}
118+
if isCheckingServer {
119+
HStack {
120+
ProgressView()
121+
.progressViewStyle(.circular)
122+
Text("Checking server...")
123+
}
124+
}
94125
}
95126
.padding(.top, -40)
96127
.toolbar {
@@ -117,6 +148,7 @@ struct SessionEditor: View {
117148
Text("Save")
118149
}
119150
.accessibilityIdentifier("serverSubmitButton")
151+
.disabled(isCheckingServer)
120152
.alert(isPresented: $badURL){
121153
Alert(title: Text("Invalid URL"), message: Text("Invalid URL format or scheme (http or https).\nExample: https://df.myserver.com"))
122154
}
@@ -131,7 +163,6 @@ struct SessionEditor: View {
131163
}
132164
.onAppear {
133165
if let session {
134-
// Edit the incoming animal.
135166
url = URL(string: session.url)
136167
}
137168
}
@@ -143,24 +174,26 @@ struct SessionEditor: View {
143174
)
144175
}
145176
.sheet(isPresented: $showLoginSheet, onDismiss: {
146-
if let newSession = newSession, newSession.auth {
147-
do {
148-
try modelContext.save()
149-
onSessionCreated?(newSession)
177+
if let session = session {
178+
if session.auth {
179+
try? modelContext.save()
150180
dismiss()
151-
} catch {
152-
print("Error saving session: \(error)")
153181
}
182+
} else if let tempSession = tempSession, tempSession.auth {
183+
modelContext.insert(tempSession)
184+
try? modelContext.save()
185+
onSessionCreated?(tempSession)
186+
dismiss()
154187
}
155188
}) {
156-
if let newSession = newSession {
157-
LoginView(selectedServer: newSession, onLoginSuccess: {
158-
newSession.auth = true
159-
})
160-
} else if let session = session {
189+
if let session = session {
161190
LoginView(selectedServer: session, onLoginSuccess: {
162191
session.auth = true
163192
})
193+
} else if let tempSession = tempSession {
194+
LoginView(selectedServer: tempSession, onLoginSuccess: {
195+
tempSession.auth = true
196+
})
164197
}
165198
}
166199
}

0 commit comments

Comments
 (0)