@@ -218,7 +218,7 @@ class StaplerViewModel: ObservableObject {
218218 return false
219219 }
220220
221- func handleError( _ error: Error ) {
221+ func handleError( _ error: Error ) {
222222 DispatchQueue . main. async {
223223 self . errorMessage = error. localizedDescription
224224 }
@@ -300,29 +300,66 @@ struct ContentView: View {
300300 }
301301 . frame ( minWidth: 300 , minHeight: 200 )
302302 . focused ( $isViewFocused)
303- . onDrop ( of: [ . fileURL] , isTargeted: nil ) { providers in
304- let wasEmpty = viewModel. document. aliases. isEmpty
305- for provider in providers {
306- _ = provider. loadObject ( ofClass: URL . self) { url, error in
307- if let error = error {
308- viewModel. handleError ( error)
309- } else if let url = url {
310- DispatchQueue . main. async {
311- do {
312- let newAlias = try AliasItem ( url: url)
313- viewModel. addAlias ( newAlias)
314- if wasEmpty {
315- updateDocument ( )
316- } else {
317- document. aliases = viewModel. document. aliases
318- }
319- } catch {
320- viewModel. handleError ( error)
321- }
322- }
323- }
324- }
325- }
303+ . onDrop ( of: [ . url, . urlBookmarkData] , isTargeted: nil ) { providers in
304+ let wasEmpty = viewModel. document. aliases. isEmpty
305+ for provider in providers {
306+ _ = provider. loadObject ( ofClass: URL . self) { url, error in
307+ if let error = error {
308+ viewModel. handleError ( error)
309+ } else if let url = url {
310+ DispatchQueue . main. async {
311+ do {
312+ let newAlias = try AliasItem ( url: url)
313+ viewModel. addAlias ( newAlias)
314+ if wasEmpty {
315+ updateDocument ( )
316+ } else {
317+ document. aliases = viewModel. document. aliases
318+ }
319+ } catch {
320+ viewModel. handleError ( error)
321+ }
322+ }
323+ }
324+ }
325+ }
326+ // If there are no items conforming to the specified types, check for file promise receivers in the pasteboard
327+ let pasteboard = NSPasteboard ( name: . drag)
328+ guard let filePromises = pasteboard. readObjects ( forClasses: [ NSFilePromiseReceiver . self] , options: nil ) ,
329+ let receiver = filePromises. first as? NSFilePromiseReceiver else {
330+ return false
331+ }
332+
333+ // Process the first file promise receiver
334+ let queue = OperationQueue ( )
335+ receiver. receivePromisedFiles ( atDestination: FileManager . default. temporaryDirectory, //URL.temporaryDirectory,
336+ operationQueue: queue) { ( url, error) in
337+ if let error = error {
338+ print ( " Error loading dropped item from pasteboard: \( error. localizedDescription) " )
339+ } else {
340+ DispatchQueue . main. async {
341+ // url is a .webloc
342+ let data = try ? Data . init ( contentsOf: url) as Data
343+ // turn webloc contents (xml) into plist dict
344+ let dict = try ! PropertyListSerialization . propertyList ( from: data ?? Data ( ) , options: [ ] , format: nil ) as! [ String : Any ]
345+ let urlString = dict [ " URL " ] as! String
346+ let newUrl = URL ( string: urlString)
347+ do {
348+ let newAlias = try AliasItem ( url: url)
349+ viewModel. addAlias ( newAlias)
350+ if wasEmpty {
351+ updateDocument ( )
352+ } else {
353+ document. aliases = viewModel. document. aliases
354+ }
355+ } catch {
356+ viewModel. handleError ( error)
357+ }
358+
359+ }
360+ }
361+ }
362+
326363 return true
327364 }
328365 . alert ( isPresented: $showingErrorAlert) {
0 commit comments