@@ -3,13 +3,13 @@ module Demo.DragDropFiles (dropZoneDemo, filePickerDemo) where
33import Prelude
44
55import Data.String (joinWith)
6−import Demo.Shared (DemoProps, card, desc, getFieldJSON, label, scrollWrap, sectionTitle)
6+import Demo.Shared (DemoProps, card, desc, label, scrollWrap, sectionTitle)
77import React.Basic (JSX)
8−import React.Basic.Events (handler, handler_, unsafeEventFn)
98import React.Basic.Hooks (useState', (/\))
109import React.Basic.Hooks as React
1110import Yoga.React (component)
12−import Yoga.React.Native (nativeEvent, text, tw, view)
11+import Yoga.React.Native (text, tw, view)
12+import Yoga.React.Native.MacOS.DropZone (nativeDropZone)
1313import Yoga.React.Native.MacOS.FilePicker (nativeFilePicker)
1414import Yoga.React.Native.MacOS.Types as T
1515import Yoga.React.Native.Style as Style
@@ -24,18 +24,23 @@ dropZoneDemo = component "DropZoneDemo" \dp -> React.do
2424 scrollWrap dp
2525 [ sectionTitle dp.fg "Drop Zone"
2626 , desc dp "Drag files from Finder into the area below"
27− , view
28− { draggedTypes: [ "NSFilenamesPboardType" ]
29− , onDrop: handler
30− (nativeEvent >>> unsafeEventFn \e -> getFieldJSON "dataTransfer" e)
31− \r -> do
32− setDropped r
33− setStatus "Drop files here"
34− setDragging false
35− , onDragEnter: handler_ do
27+ , nativeDropZone
28+ { onFileDrop: \d -> do
29+ let fileNames = joinWith ", " (map _.name d.files)
30+ let stringItems = joinWith ", " d.strings
31+ let
32+ info = case fileNames, stringItems of
33+ "", "" -> "Empty drop"
34+ fs, "" -> "Files: " <> fs
35+ "", ss -> "Strings: " <> ss
36+ fs, ss -> "Files: " <> fs <> " | Strings: " <> ss
37+ setDropped info
38+ setStatus "Drop files here"
39+ setDragging false
40+ , onFilesDragEnter: do
3641 setStatus "Release to drop!"
3742 setDragging true
38− , onDragLeave: handler_ do
43+ , onFilesDragExit: do
3944 setStatus "Drop files here"
4045 setDragging false
4146 , style: tw "rounded-lg items-center justify-center mb-2"
@@ -49,7 +54,7 @@ dropZoneDemo = component "DropZoneDemo" \dp -> React.do
4954 [ text { style: tw "text-sm" <> Style.style { color: dp.fg } } status
5055 , if dropped == "" then mempty
5156 else text { style: tw "text-xs mt-2 px-4" <> Style.style { color: dp.dimFg } }
52− ("Dropped: " <> dropped)
57+ dropped
5358 ]
5459 ]
5560