Skip to content

Commit ec5f30e

Browse files
authored
fix a few ipad bugs and cleanup (#15)
* fix a few ipad bugs and cleanup * fix a bunch of sidebar wierdness on ipad and cleanup
1 parent 70b5bce commit ec5f30e

File tree

3 files changed

+38
-48
lines changed

3 files changed

+38
-48
lines changed

Django Files/Views/Auth.swift

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,9 @@ class AuthController: NSObject, WKNavigationDelegate, UIScrollViewDelegate {
2929

3030
public var isLoaded: Bool = false
3131
private var reloadState: Bool = false
32-
private var authError: String? = nil
33-
34-
private var safeAreaInsets: EdgeInsets = EdgeInsets()
35-
36-
public func getAuthErrorMessage() -> String? {
37-
return authError
38-
}
3932

4033
public var schemeURL: String?
4134

42-
var onAuthAction: (() -> Void)?
4335
var onLoadedAction: (() -> Void)?
4436
var onCancelledAction: (() -> Void)?
4537
var onStartedLoadingAction: (() -> Void)?
@@ -63,7 +55,6 @@ class AuthController: NSObject, WKNavigationDelegate, UIScrollViewDelegate {
6355

6456
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping @MainActor @Sendable (WKNavigationResponsePolicy) -> Void){
6557
webView.isHidden = false
66-
webView.scrollView.contentInsetAdjustmentBehavior = .never
6758
onLoadedAction?()
6859
decisionHandler(.allow)
6960
return
@@ -79,14 +70,16 @@ class AuthController: NSObject, WKNavigationDelegate, UIScrollViewDelegate {
7970
}
8071

8172
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction) async -> WKNavigationActionPolicy{
82-
webView.scrollView.zoomScale = 0
73+
webView.scrollView.zoomScale = 1
74+
webView.scrollView.minimumZoomScale = 1.0
75+
webView.scrollView.maximumZoomScale = 1.0
8376

8477
if navigationAction.request.url?.scheme == "djangofiles"{
8578
var schemeRemove = URLComponents(url: navigationAction.request.url!, resolvingAgainstBaseURL: true)!
8679
schemeRemove.scheme = nil
8780
schemeURL = schemeRemove.url!.absoluteString.trimmingCharacters(in: ["/", "\\"])
8881
onSchemeRedirectAction?()
89-
if navigationAction.request.url!.host! != "logout" {
82+
if navigationAction.request.url!.host! != "logout" && navigationAction.request.url!.host! != "serverlist" {
9083
loadHomepage()
9184
}
9285
return .cancel
@@ -97,20 +90,15 @@ class AuthController: NSObject, WKNavigationDelegate, UIScrollViewDelegate {
9790
else if url?.scheme == "https" && navigationAction.request.url?.scheme != "https" {
9891
onCancelledAction?()
9992
reset()
100-
authError = "Blocked attempt to navigate to non-HTTPS URL while using HTTPS."
93+
print("Blocked attempt to navigate to non-HTTPS URL while using HTTPS.")
10194
return .cancel
10295
}
10396
else{
10497
return .allow
10598
}
10699
}
107100

108-
public func setSafeAreaInsets(_ insets: EdgeInsets){
109-
safeAreaInsets = insets
110-
}
111-
112101
public func reset(){
113-
authError = nil
114102
isLoaded = false
115103
loadHomepage()
116104
}

Django Files/Views/ContentView.swift

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ struct ContentView: View {
1313
@Environment(\.dismiss) private var dismiss
1414

1515
@Query private var items: [DjangoFilesSession]
16+
@State private var showSidebarButton: Bool = false
1617
@State private var showingEditor = false
17-
@State private var showingLogin = false
18-
@State private var runningSession = false
1918
@State private var columnVisibility = NavigationSplitViewVisibility.detailOnly
2019
@State private var selectedServer: DjangoFilesSession?
2120
@State private var selectedSession: DjangoFilesSession? // Track session for settings
2221
@State private var showingSelector = false // Show SessionSelector
2322
@State private var needsRefresh = false // Added to handle refresh after adding server
2423

24+
2525
@State private var token: String?
2626

2727
@State private var viewingSettings: Bool = false
@@ -30,7 +30,7 @@ struct ContentView: View {
3030
var body: some View {
3131
NavigationSplitView(columnVisibility: $columnVisibility) {
3232
List(selection: $selectedServer) {
33-
ForEach(items) { item in
33+
ForEach(items, id: \.self) { item in
3434
NavigationLink(value: item) {
3535
Text(item.url)
3636
.swipeActions() {
@@ -60,17 +60,35 @@ struct ContentView: View {
6060
}
6161
}
6262
}
63+
.toolbar(removing: !showSidebarButton ? .sidebarToggle : nil)
6364
} detail: {
6465
if let server = selectedServer {
6566
if server.auth {
66-
AuthViewContainer(viewingSettings: $viewingSettings, selectedServer: server, columnVisibility: $columnVisibility, showingEditor: $showingEditor, needsRefresh: $needsRefresh)
67+
AuthViewContainer(
68+
viewingSettings: $viewingSettings,
69+
selectedServer: server,
70+
columnVisibility: $columnVisibility,
71+
showingEditor: $showingEditor,
72+
needsRefresh: $needsRefresh,
73+
showSidebarButton: $showSidebarButton
74+
)
75+
.id(server.url)
76+
.onAppear {
77+
showSidebarButton = false
78+
columnVisibility = .detailOnly
79+
}
6780
} else {
6881
LoginView(
6982
selectedServer: server,
7083
onLoginSuccess: {
7184
needsRefresh = true
7285
}
7386
)
87+
.id(server.url)
88+
.onAppear {
89+
showSidebarButton = true
90+
columnVisibility = .detailOnly
91+
}
7492
}
7593
}
7694
}
@@ -134,26 +152,21 @@ public struct AuthViewContainer: View {
134152
var columnVisibility: Binding<NavigationSplitViewVisibility>
135153
var showingEditor: Binding<Bool>
136154
var needsRefresh: Binding<Bool>
155+
var showSidebarButton: Binding<Bool>
137156

138-
@State private var toolbarHidden: Bool = false
139-
@State private var authError: Bool = false
140157
@State private var authController: AuthController = AuthController()
141158

142159
var backButton : some View { Button(action: {
143160
self.presentationMode.wrappedValue.dismiss()
144161
}) {
145162
HStack {
146163
if !UIDevice.current.localizedModel.contains("iPad") {
147-
// Image("backImage")
148-
// .aspectRatio(contentMode: .fit)
149-
// .foregroundColor(.white)
150164
Text("Server List")
151165
}
152166
}
153167
}
154168
}
155169
public var body: some View {
156-
GeometryReader { geometry in
157170
if viewingSettings.wrappedValue{
158171
SessionSelector(session: selectedServer, viewingSelect: viewingSettings)
159172
.onAppear(){
@@ -171,30 +184,23 @@ public struct AuthViewContainer: View {
171184
session: selectedServer
172185
)
173186
.onStartedLoading {
174-
toolbarHidden = false
175187
}
176188
.onCancelled {
177189
dismiss()
178-
toolbarHidden = false
179-
authError = true
180190
}
181191
.onAppear(){
182-
toolbarHidden = true
183-
authController.setSafeAreaInsets(geometry.safeAreaInsets)
184-
columnVisibility.wrappedValue = .automatic
192+
showSidebarButton.wrappedValue = false
193+
columnVisibility.wrappedValue = .detailOnly
185194
if needsRefresh.wrappedValue {
186195
authController.reset()
187196
needsRefresh.wrappedValue = false
188197
}
189198

190199
authController.onStartedLoadingAction = {
191-
toolbarHidden = true
192200
}
193201

194202
authController.onCancelledAction = {
195203
dismiss()
196-
toolbarHidden = false
197-
authError = true
198204
}
199205

200206
authController.onSchemeRedirectAction = {
@@ -203,42 +209,38 @@ public struct AuthViewContainer: View {
203209
}
204210
switch resolve{
205211
case "serverlist":
206-
self.presentationMode.wrappedValue.dismiss()
212+
if UIDevice.current.userInterfaceIdiom == .phone{
213+
self.presentationMode.wrappedValue.dismiss()
214+
}
215+
showSidebarButton.wrappedValue = true
216+
columnVisibility.wrappedValue = .automatic
207217
break
208218
case "serversettings":
209219
viewingSettings.wrappedValue = true
210220
break
211221
case "logout":
212222
selectedServer.auth = false
213-
toolbarHidden = false
223+
showSidebarButton.wrappedValue = true
224+
columnVisibility.wrappedValue = .automatic
214225
self.presentationMode.wrappedValue.dismiss()
215226
break
216227
default:
217228
return
218229
}
219230
}
220231
}
221-
.onChange(of: geometry.safeAreaInsets){
222-
authController.setSafeAreaInsets(geometry.safeAreaInsets)
223-
}
224232
}
225233
.frame(maxWidth: .infinity, maxHeight: .infinity)
226234
.edgesIgnoringSafeArea(.all)
227-
.toolbar(toolbarHidden && UIDevice.current.userInterfaceIdiom == .phone ? .hidden : .visible)
228235
.navigationTitle(Text(""))
229236
.navigationBarBackButtonHidden(true)
230-
.navigationBarItems(leading: backButton)
231-
.alert(isPresented: $authError){
232-
Alert(title: Text("Error"), message: Text(authController.getAuthErrorMessage() ?? "Unknown Error"))
233-
}
234237
}
235238
else {
236239
Text("Loading...")
237240
.onAppear(){
238241
columnVisibility.wrappedValue = .automatic
239242
}
240243
}
241-
}
242244
}
243245

244246
private func setDefaultServer(){

Django Files/Views/LoginView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ struct LoginView: View {
249249
if showErrorBanner {
250250
VStack {
251251
Spacer()
252-
Text("Authetication Failed" + (oauthError ?? ""))
252+
Text("Authentication Failed" + (oauthError ?? ""))
253253
.foregroundColor(.white)
254254
.padding()
255255
.background(Color.red.opacity(0.8))

0 commit comments

Comments
 (0)