@@ -3,10 +3,11 @@ module Lumi.Components.Examples.Upload where
3
3
import Prelude
4
4
5
5
import Control.Coroutine.Aff (close , emit , produceAff )
6
- import Data.Array ( head )
6
+ import Data.Array as Array
7
7
import Data.Foldable (foldMap )
8
8
import Data.Int as Int
9
9
import Data.Maybe (Maybe (..), fromMaybe , maybe )
10
+ import Data.Traversable (traverse_ )
10
11
import Effect (Effect )
11
12
import Effect.Aff (Milliseconds (..), delay , launchAff_ )
12
13
import Effect.Aff.AVar (AVar )
@@ -17,11 +18,11 @@ import Effect.Random (randomRange)
17
18
import Effect.Uncurried (runEffectFn2 )
18
19
import Lumi.Components.Button (button , primary ) as Button
19
20
import Lumi.Components.Column (column , column_ )
21
+ import Lumi.Components.Example (example )
20
22
import Lumi.Components.Input as Input
21
23
import Lumi.Components.LabeledField (labeledField , RequiredField (..))
22
24
import Lumi.Components.Text (h2_ )
23
25
import Lumi.Components.Upload (FileId (..), FileName (..), UploadVariant (..), defaults , upload )
24
- import Lumi.Components.Example (example )
25
26
import React.Basic (Component , JSX , createComponent , make )
26
27
import React.Basic.DOM as R
27
28
import React.Basic.DOM.Events (targetChecked )
@@ -35,9 +36,12 @@ component = createComponent "UploadExample"
35
36
data Action
36
37
= NoOp
37
38
| SetReadonly Boolean
38
- | ImageEx (Array FileId )
39
- | FileEx (Array FileId )
40
- | AvatarEx (Maybe FileId )
39
+ | NewImages (Array FileId )
40
+ | RemoveImage FileId
41
+ | NewFiles (Array FileId )
42
+ | RemoveFile FileId
43
+ | NewAvatar FileId
44
+ | RemoveAvatar
41
45
| StartUpload
42
46
| InitializeUploadBuffer (AVar Unit )
43
47
@@ -61,21 +65,34 @@ docs = unit # make component { initialState, didMount, render }
61
65
SetReadonly readonly ->
62
66
self.setState _ { readonly = readonly }
63
67
64
- ImageEx value ->
68
+ NewImages value ->
69
+ self.setStateThen
70
+ (\s -> s { images = Array .nub (s.images <> value) })
71
+ $ debug " value:" value
72
+
73
+ RemoveImage value ->
65
74
self.setStateThen
66
- (_ { images = value })
75
+ (\s -> s { images = Array .delete value s.images })
67
76
$ debug " value:" value
68
77
69
- FileEx value ->
78
+ NewFiles value ->
70
79
self.setStateThen
71
- (_ { files = value })
80
+ (\s -> s { files = Array .nub (s.files <> value) })
72
81
$ debug " value:" value
73
82
74
- AvatarEx value ->
83
+ RemoveFile value ->
75
84
self.setStateThen
76
- (_ { avatar = value })
85
+ (\s -> s { files = Array .delete value s.files })
77
86
$ debug " value:" value
78
87
88
+ NewAvatar value ->
89
+ self.setStateThen
90
+ (_ { avatar = Just value })
91
+ $ debug " value:" value
92
+
93
+ RemoveAvatar ->
94
+ self.setState _{ avatar = Nothing }
95
+
79
96
StartUpload -> do
80
97
launchAff_ do
81
98
maybe
@@ -113,7 +130,8 @@ docs = unit # make component { initialState, didMount, render }
113
130
[ upload defaults
114
131
{ value = self.state.images
115
132
, variant = Images
116
- , onChange = send self <<< ImageEx
133
+ , onUpload = send self <<< NewImages
134
+ , onRemove = Just <<< send self <<< RemoveImage
117
135
, readonly = self.state.readonly
118
136
, backend =
119
137
{ fetch: \id@(FileId name) ->
@@ -133,7 +151,9 @@ docs = unit # make component { initialState, didMount, render }
133
151
[ upload defaults
134
152
{ value = self.state.files
135
153
, variant = Files
136
- , onChange = send self <<< FileEx
154
+ , onUpload = send self <<< NewFiles
155
+ , onRemove = Just <<< send self <<< RemoveFile
156
+ , onClick = \(FileId id) -> Just $ log id
137
157
, readonly = self.state.readonly
138
158
, backend =
139
159
{ fetch: \id@(FileId name) ->
@@ -159,7 +179,8 @@ docs = unit # make component { initialState, didMount, render }
159
179
[ upload defaults
160
180
{ value = maybe [] pure self.state.avatar
161
181
, variant = Avatar
162
- , onChange = send self <<< AvatarEx <<< head
182
+ , onUpload = traverse_ (send self <<< NewAvatar ) <<< Array .head
183
+ , onRemove = \_ -> Just $ send self RemoveAvatar
163
184
, readonly = self.state.readonly
164
185
, backend =
165
186
{ fetch: \id@(FileId name) -> do
@@ -178,7 +199,8 @@ docs = unit # make component { initialState, didMount, render }
178
199
[ upload defaults
179
200
{ value = maybe [] pure self.state.avatar
180
201
, variant = Logo
181
- , onChange = send self <<< AvatarEx <<< head
202
+ , onUpload = traverse_ (send self <<< NewAvatar ) <<< Array .head
203
+ , onRemove = \_ -> Just $ send self RemoveAvatar
182
204
, readonly = self.state.readonly
183
205
, backend =
184
206
{ fetch: \id@(FileId name) -> do
0 commit comments