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

:safety_vest: only display password error message if not empty

kacaii.dev 96d597f1 3447f787

verified
+45 -36
+1
.dockerignore
··· 26 26 server/dev 27 27 server/test 28 28 server/justfile 29 + server/priv/static/ 29 30 30 31 # shared 31 32 shared/build
+1 -1
.env.example
··· 6 6 7 7 # ๎ฎ KEY 8 8 export SECRET_KEY="" 9 - export RUN_BACKEND_LOCALLY="true" 9 + export RUN_SERVER_LOCALLY="true"
+9 -9
client/src/client/page/login.gleam
··· 19 19 } 20 20 21 21 pub type Msg { 22 - UserUpdatedLoginField(value: String) 22 + UserUpdatedEmailField(value: String) 23 23 UserUpdatedPasswordField(value: String) 24 24 25 25 UserSentRequest ··· 37 37 38 38 pub fn update(model: Model, msg: Msg) -> LoginStep { 39 39 case msg { 40 - UserUpdatedLoginField(value:) -> { 41 - let value = 40 + UserUpdatedEmailField(value:) -> { 41 + let email = 42 42 string.trim(value) 43 43 |> string.lowercase() 44 44 45 - let new = Model(..model, email: value) 45 + let new = Model(..model, email:) 46 46 Continue(new, effect.none()) 47 47 } 48 48 49 49 UserUpdatedPasswordField(value:) -> { 50 - let value = string.trim(value) 50 + let password = string.trim(value) 51 51 52 - let new = Model(..model, password: value) 52 + let new = Model(..model, password:) 53 53 Continue(new, effect.none()) 54 54 } 55 55 ··· 90 90 html.section(attributes, [ 91 91 html.div(container_attr, [ 92 92 view_fieldset(model), 93 - view_login_button(model), 93 + view_send_button(model), 94 94 view_message_text(model), 95 95 ]), 96 96 ]), ··· 99 99 element.fragment(content) 100 100 } 101 101 102 - fn view_login_button(model: Model) -> element.Element(Msg) { 102 + fn view_send_button(model: Model) -> element.Element(Msg) { 103 103 let attributes = [ 104 104 class("flex gap-2 justify-center items-center"), 105 105 class("p-2 text-white rounded-md bg-secondary"), ··· 144 144 value: model.email, 145 145 icon: "md-email", 146 146 disabled: False, 147 - on_input: UserUpdatedLoginField, 147 + on_input: UserUpdatedEmailField, 148 148 input_type: "email", 149 149 ), 150 150
+19 -11
client/src/client/page/signup.gleam
··· 51 51 } 52 52 53 53 pub type Msg { 54 + // Field updates 54 55 UserUpdatedNameField(String) 55 56 UserUpdatedEmailField(String) 56 57 UserUpdatedPhoneField(String) ··· 58 59 UserUpdatedConfirmPasswordField(String) 59 60 UserSelectedRole(String) 60 61 62 + // Auth related messages 61 63 UserSentRequest 62 - 63 64 ServerSentResponse(Result(user.User, rsvp.Error)) 64 65 } 65 66 ··· 90 91 #(Model(..model, user_role:), effect.none()) 91 92 } 92 93 93 - UserUpdatedPasswordField(user_password) -> { 94 - let text_message = case user_password == model.user_confirm_password { 95 - True -> "" 96 - False -> "Passwords must match" 94 + UserUpdatedPasswordField(value) -> { 95 + let match_not_empty = model.user_confirm_password != "" 96 + 97 + let text_message = case value == model.user_confirm_password { 98 + False if match_not_empty -> "Passwords must match" 99 + _ -> "" 97 100 } 98 101 99 - #(Model(..model, text_message:, user_password:), effect.none()) 102 + #(Model(..model, text_message:, user_password: value), effect.none()) 100 103 } 101 104 102 - UserUpdatedConfirmPasswordField(user_confirm_password) -> { 103 - let text_message = case user_confirm_password == model.user_password { 104 - True -> "" 105 - False -> "Passwords must match" 105 + UserUpdatedConfirmPasswordField(value) -> { 106 + let match_not_empty = model.user_password != "" 107 + 108 + let text_message = case value == model.user_password { 109 + False if match_not_empty -> "Passwords must match" 110 + _ -> "" 106 111 } 107 112 108 - #(Model(..model, text_message:, user_confirm_password:), effect.none()) 113 + #( 114 + Model(..model, text_message:, user_confirm_password: value), 115 + effect.none(), 116 + ) 109 117 } 110 118 111 119 UserSentRequest -> {
+15 -15
justfile
··· 16 16 pg_health_conf := "--health-interval 10s --health-retries 3 --health-timeout 5s" 17 17 pg_health_start_period := "--health-start-period 30s" 18 18 19 - # backend 20 - run_backend_locally := env("RUN_BACKEND_LOCALLY", "false") 21 - backend_port := if run_backend_locally == "false" { "-p 8000:8000" } else { "" } 19 + # server 20 + run_server_locally := env("RUN_SERVER_LOCALLY", "false") 21 + server_port := if run_server_locally == "false" { "-p 8000:8000" } else { "" } 22 22 23 23 # List available recipes 24 24 @_default: ··· 58 58 # ------------------------------------------------------------------------------ 59 59 60 60 # ๓ฐ– Create pod 61 - # Behavior can be changed using the `run_backend_locally` recipe variable 61 + # Behavior can be changed using the `run_server_locally` recipe variable 62 62 [group("podman")] 63 63 @create-pod: 64 64 podman pod exists {{ pod_name }} || \ 65 65 podman pod create \ 66 66 --name {{ pod_name }} \ 67 - {{ backend_port }} \ 67 + {{ server_port }} \ 68 68 -p 5432:5432 69 69 70 - # ๓ฐ– Build the backend container image 70 + # ๓ฐ– Build the server container image 71 71 [group("podman")] 72 - build-backend: 73 - @podman build -t sigo-fullstack . 72 + build-server: 73 + @podman build -t sigo-server . 74 74 75 75 # ๎ฎ Starts the PostgreSQL database inside the pod 76 76 [group("podman")] 77 77 @init-database: create-pod 78 78 podman run -d \ 79 79 --pod {{ pod_name }} \ 80 - --name postgres-database \ 80 + --name db \ 81 81 {{ pg_env }} \ 82 82 {{ pg_health_cmd }} {{ pg_health_conf }} {{ pg_health_start_period }} \ 83 83 {{ pg_volume }} \ 84 84 {{ pg_image }} 85 85 86 - # ๏’ท Starts the backend application 86 + # ๏’ท Starts the server 87 87 [group("podman")] 88 - @init-backend: create-pod build-backend 88 + @init-server: create-pod build-server 89 89 podman run -d \ 90 90 --pod {{ pod_name }} \ 91 - --name backend \ 91 + --name server \ 92 92 -e DATABASE_URL -e SECRET_KEY \ 93 - sigo-fullstack 93 + sigo-server 94 94 95 95 96 - # ๎ญป Starts the full stack 96 + # ๎ญป Starts the server and database 97 97 [group("podman")] 98 - up: init-database init-backend 98 + up: init-database init-server 99 99 @echo {{ GREEN }}"Listening on http://0.0.0.0:8000"{{ NORMAL }} 100 100 101 101 # ๎ฎ Starts only the database