๐Ÿ‘ฉโ€๐Ÿš’ Firefighters API written in Gleam!
lustre gleam

:construction: handle input messages

kacaii.dev a606cf2c 17540924

verified
+32 -6
+8 -4
client/src/client.gleam
··· 107 107 LoginMsg(page_msg) 108 108 -> handle_login_msg(model, page_model, page_msg) 109 109 110 + // SIGNUP 110 111 Model(session: _, route: route.Signup, page: page.Signup(page_model), ..), 111 112 SignupMsg(page_msg) 112 113 -> handle_signup_msg(model, page_model, page_msg) ··· 289 290 290 291 fn handle_signup_msg( 291 292 model: Model, 292 - _page_model: signup.Model, 293 - _page_msg: signup.Msg, 293 + page_model: signup.Model, 294 + page_msg: signup.Msg, 294 295 ) -> #(Model, effect.Effect(Msg)) { 295 - // TODO: 296 - #(model, effect.none()) 296 + let #(page_model, effect) = signup.update(page_model, page_msg) 297 + let page = page.Signup(page_model) 298 + let effect = effect.map(effect, SignupMsg) 299 + 300 + #(Model(..model, page:), effect) 297 301 }
+24 -2
client/src/client/page/signup.gleam
··· 2 2 import client/ui/nerd_font 3 3 import gleam/http/response 4 4 import gleam/list 5 + import gleam/string 5 6 import lustre/attribute.{class} as attr 6 7 import lustre/effect 7 8 import lustre/element ··· 19 20 user_confirm_password: "", 20 21 user_is_active: False, 21 22 loading: False, 23 + text_message: "", 22 24 ) 23 25 24 26 pub type Model { ··· 30 32 user_confirm_password: String, 31 33 user_is_active: Bool, 32 34 loading: Bool, 35 + text_message: String, 33 36 ) 34 37 } 35 38 ··· 95 98 class("rounded-md border border-surface"), 96 99 ] 97 100 98 - html.div(attributes, [fieldset(model), button(model)]) 101 + html.div(attributes, [fieldset(model), button(model), text_message(model)]) 102 + } 103 + 104 + fn text_message(model: Model) -> element.Element(Msg) { 105 + case model.text_message { 106 + "" -> element.none() 107 + text -> html.p([], [html.text(text)]) 108 + } 99 109 } 100 110 101 111 fn button(model: Model) -> element.Element(Msg) { 112 + let required_fields = [ 113 + model.user_name, 114 + model.user_email, 115 + model.user_password, 116 + model.user_confirm_password, 117 + ] 118 + 119 + let disabled = 120 + model.loading 121 + || model.user_password != model.user_confirm_password 122 + || list.any(required_fields, string.is_empty) 123 + 102 124 let icon = case model.loading { 103 125 True -> nerd_font.icon([class("animate-spin")], "extra-progress_spinner_1") 104 126 False -> nerd_font.icon([], "fa-user_plus") ··· 111 133 class("diabled:text-primary disabled:bg-surface"), 112 134 113 135 event.on_click(UserSentRequest), 114 - attr.disabled(model.loading), 136 + attr.disabled(disabled), 115 137 ] 116 138 117 139 html.button(attributes, [icon, html.text("Register")])