-
Notifications
You must be signed in to change notification settings - Fork 1
/
Curator.purs
88 lines (74 loc) · 2.46 KB
/
Curator.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module Component.Admin.Curator where
import Data.Lens (Lens', lens, (%~), (^.))
import Control.Monad.Aff.Console (log)
import DOM.Event.Event (preventDefault)
import DOM.Event.Types as DOM
import Data.Argonaut.Generic.Aeson (encodeJson, decodeJson)
import Halogen as H
import Halogen.HTML hiding (map)
import Helper
import Import hiding (div)
import Network.HTTP.Affjax as AX
import Text.Email.Validate (emailAddress)
import Data.String
import Top.Monad (Top)
import Message as Msg
import WForm as Form
import Req (handleCreateResponse)
import App.Form
import App.Crud
data Slot = Slot
derive instance eqSlot :: Eq Slot
derive instance ordSlot :: Ord Slot
-- | The state of the application
type State =
{ form :: CuratorForm
, sending :: Boolean
}
_form :: Lens' State CuratorForm
_form = lens _.form _ { form = _}
initialForm :: CuratorForm
initialForm = CuratorForm { cf_invitee: "" }
initialState :: State
initialState = { sending: false
, form: initialForm }
-- | Inputs to the state machine
data Input a
= NewCurator (Form.FormInput CuratorForm) a
| PreventDefault DOM.Event a
| NoAction a
ui :: H.Component HTML Input Unit Void Top
ui =
H.component
{ initialState: const initialState
, render
, eval
, receiver: const Nothing
}
where
eval :: Input ~> H.ComponentDSL State Input Void Top
eval (NoAction next) = pure next
eval (PreventDefault e next) = H.liftEff (preventDefault e) $> next
eval (NewCurator ev next) = handleNewCurator ev $> next
where
handleNewCurator (Form.Submit) = do
state <- H.get
let email = state ^. (_form <<< _cf_invitee)
case emailAddress email of
Nothing -> H.liftAff $ log $ "invalid email"
Just e -> do
H.modify (_ { sending = true })
response <- H.liftAff $ AX.post (apiUrl <> "/admin/curators") (encodeJson state.form)
H.modify (_ { sending = false })
let Tuple typ msg = handleCreateResponse "admin.curator" response
H.liftEff $ flashMessage typ msg
handleNewCurator (Form.Edit f) = do
H.modify (_form %~ f)
render :: State -> H.ComponentHTML Input
render state =
div [ styleClass "admin--form centered"] [
h3 [] [ text "Invite" ]
, p_ [ text "Send an email inviting your coolest curator" ]
, div_ $ Form.renderForm state.form NewCurator do
Form.textField "email" "Email" (_cf_invitee) (Form.nonBlank <=< Form.emailValidator)
]