@@ -28,7 +28,7 @@ class ShareViewController: UIViewController, UITextFieldDelegate, URLSessionTask
28
28
@IBOutlet weak var cancelButton : UIButton !
29
29
@IBOutlet weak var progressBar : UIProgressView !
30
30
@IBOutlet weak var imageView : UIImageView !
31
- @IBOutlet weak var serverLabel : UILabel !
31
+ @IBOutlet weak var availableServers : UIButton !
32
32
@IBOutlet weak var activityIndicator : UIActivityIndicatorView !
33
33
@IBOutlet weak var shortTextLabel : UILabel !
34
34
@IBOutlet weak var shortText : UITextField !
@@ -53,28 +53,16 @@ class ShareViewController: UIViewController, UITextFieldDelegate, URLSessionTask
53
53
self . showMessageAndDismiss ( message: " Nothing to share. " )
54
54
return
55
55
}
56
- guard let server = getDefaultServer ( ) else {
57
- self . showMessageAndDismiss ( message: " No servers configured. " )
58
- return
59
- }
60
- session = server
61
56
62
- if URL ( string: server. url) == nil {
63
- self . showMessageAndDismiss ( message: " Server ' \( server. url) ' is invalid. " )
64
- return
65
- }
66
- if URL ( string: server. url) ? . scheme == nil {
67
- self . showMessageAndDismiss ( message: " Server ' \( server. url) ' scheme (http or https) is invalid. " )
68
- return
69
- }
57
+ getAvailableServers ( )
70
58
71
59
self . progressBar. isHidden = true
72
60
var loaded : Bool = false
73
61
for extensionItem in extensionItems {
74
62
for ele in extensionItem. attachments! {
75
63
let itemProvider = ele
76
64
77
- if itemProvider. hasItemConformingToTypeIdentifier ( " public.image " ) {
65
+ if itemProvider. hasItemConformingToTypeIdentifier ( " public.image " ) {
78
66
itemProvider. loadItem ( forTypeIdentifier: " public.image " , options: nil , completionHandler: { ( item, error) in
79
67
DispatchQueue . main. async {
80
68
self . shortText. isHidden = true
@@ -107,6 +95,19 @@ class ShareViewController: UIViewController, UITextFieldDelegate, URLSessionTask
107
95
loaded = true
108
96
break
109
97
}
98
+ else if itemProvider. hasItemConformingToTypeIdentifier ( " public.file-url " ) {
99
+ itemProvider. loadItem ( forTypeIdentifier: " public.file-url " , options: nil , completionHandler: { ( item, error) in
100
+ DispatchQueue . main. async {
101
+ self . shortText. isHidden = true
102
+ self . shareLabel. text = " Upload File "
103
+ self . shareURL = item as? URL
104
+ self . activityIndicator. stopAnimating ( )
105
+ self . shareButton. isEnabled = true
106
+ }
107
+ } )
108
+ loaded = true
109
+ break
110
+ }
110
111
else if itemProvider. hasItemConformingToTypeIdentifier ( " public.url " ) {
111
112
itemProvider. loadItem ( forTypeIdentifier: " public.url " , options: nil , completionHandler: { ( item, error) in
112
113
DispatchQueue . main. async {
@@ -143,7 +144,46 @@ class ShareViewController: UIViewController, UITextFieldDelegate, URLSessionTask
143
144
}
144
145
}
145
146
146
- serverLabel. text = session. url
147
+ }
148
+
149
+ func getAvailableServers( ) {
150
+ let context = sharedModelContainer. mainContext
151
+
152
+ do {
153
+ let descriptor = FetchDescriptor < DjangoFilesSession > (
154
+ predicate: #Predicate { $0. auth == true } ,
155
+ sortBy: [ SortDescriptor ( \. url) ]
156
+ )
157
+ let sessions = try context. fetch ( descriptor)
158
+
159
+ guard !sessions. isEmpty else {
160
+ availableServers. setTitle ( " No servers available " , for: . normal)
161
+ return
162
+ }
163
+
164
+ // Pick the default session, or fallback to the first one
165
+ let defaultSession = sessions. first ( where: { $0. defaultSession } ) ?? sessions. first!
166
+
167
+ // Build menu actions
168
+ let actions = sessions. map { session in
169
+ UIAction ( title: session. url) { _ in
170
+ self . session = session
171
+ self . availableServers. setTitle ( session. url, for: . normal)
172
+ }
173
+ }
174
+
175
+ let menu = UIMenu ( title: " Select a Server " , options: . displayInline, children: actions)
176
+ availableServers. menu = menu
177
+ availableServers. showsMenuAsPrimaryAction = true
178
+
179
+ // Set the default selected title and session
180
+ availableServers. setTitle ( defaultSession. url, for: . normal)
181
+ session = defaultSession
182
+
183
+ } catch {
184
+ self . showMessageAndDismiss ( message: error. localizedDescription)
185
+ availableServers. setTitle ( " Error loading servers " , for: . normal)
186
+ }
147
187
}
148
188
149
189
func textFieldShouldReturn( _ textField: UITextField ) -> Bool {
@@ -165,7 +205,7 @@ class ShareViewController: UIViewController, UITextFieldDelegate, URLSessionTask
165
205
}
166
206
}
167
207
catch {
168
- print ( error)
208
+ self . showMessageAndDismiss ( message : error. localizedDescription )
169
209
}
170
210
return selectedServer
171
211
}
0 commit comments