this repo has no description
lustre frontent oat-ui gleam
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

:bulb: explain how navigation works

+22 -16
+21 -16
client/src/client.gleam
··· 58 58 } 59 59 60 60 pub type Msg { 61 + /// Handle internal links navigation 61 62 UserNavigatedTo(to: route.Route) 63 + /// User sent a request to the Server during startup to verify if the current 64 + /// token is still valid. 62 65 UserRestoredSession(result: Result(session.Session, rsvp.Error)) 66 + /// Server removed the token from the Client, ending their session. 67 + ServerRemovedToken(result: Result(response.Response(String), rsvp.Error)) 63 68 69 + // PAGES --- 64 70 LoginMsg(msg: login.Msg) 65 71 HomeMsg(msg: home.Msg) 66 - 67 - ServerRemovedToken(return: Result(response.Response(String), rsvp.Error)) 68 72 } 69 73 70 74 // INIT ------------------------------------------------------------------------ ··· 84 88 } 85 89 86 90 let url = 87 - uri.Uri(..opts.api, path: "/api/whoami") 91 + uri.Uri(..opts.api, path: "/whoami") 88 92 |> uri.to_string 89 93 90 94 // 󱡯 Send a request to the Server to verify if the current ··· 134 138 layout(home.view(session), HomeMsg) 135 139 136 140 // LOGIN PAGE -------------------------------------------------------------- 137 - Model(session:, route: route.Login, page: page.Login(page_model), ..) -> 138 - layout(login.view(session, page_model), LoginMsg) 141 + Model(session:, route: route.Login, page: page.Login(page), ..) -> 142 + layout(login.view(session, page), LoginMsg) 139 143 140 144 _ -> not_found.view() 141 145 } ··· 179 183 // PAGES ------------------------------------------------------------------- 180 184 // 181 185 // LOGIN 182 - Model(route: route.Login, page: page.Login(page_model), ..), 183 - LoginMsg(page_msg) 184 - -> handle_login_step(model, page_model, page_msg) 186 + Model(route: route.Login, page: page.Login(page), ..), LoginMsg(page_msg) -> 187 + handle_login_step(model, page, page_msg) 185 188 186 189 // FALLBACK 187 190 // ··· 193 196 model: Model, 194 197 route: route.Route, 195 198 ) -> #(Model, Effect(Msg)) { 199 + // Do nothing the route doesnt change 196 200 use <- bool.guard(model.route == route, #(model, effect.none())) 197 201 let protected = route.is_protected(route) 198 202 199 203 let route = case model.session, route { 204 + // If the route require the User to be authenticated, 205 + // redirect them to the Login page. 200 206 session.None, _ | session.Pending(_, _), _ if protected -> route.Login 207 + // If the User is *already* authenticated but navigating to 208 + // the Login page, redirect them to Home instead. 201 209 session.Authenticated(_), route.Login -> route.Home 202 210 203 211 _, _ -> route ··· 209 217 210 218 fn handle_login_step( 211 219 model: Model, 212 - page_model: login.Model, 220 + page: login.Model, 213 221 msg: login.Msg, 214 222 ) -> #(Model, Effect(Msg)) { 215 - case login.update(page_model, msg, model.api) { 216 - // Continue execution 217 - login.Continue(page_model, effect) -> #( 218 - Model(..model, page: page.Login(page_model)), 223 + case login.update(page, msg, model.api) { 224 + login.Continue(page, effect) -> #( 225 + Model(..model, page: page.Login(page)), 219 226 effect.map(effect, LoginMsg), 220 227 ) 221 228 222 - // Authentication was sucessful 223 229 login.ServerAuthenticatedUser(session) -> #( 224 230 Model(..model, session:), 225 231 route.Home ··· 227 233 |> modem.push(option.None, option.None), 228 234 ) 229 235 230 - // Authentication failed 231 236 login.ServerFailedToAuthenticate(reason) -> { 232 237 let message = case reason { 233 238 rsvp.HttpError(resp) -> resp.body ··· 237 242 } 238 243 239 244 let page = 240 - login.Model(..page_model, loading: False, message:) 245 + login.Model(..page, loading: False, message:) 241 246 |> page.Login 242 247 243 248 #(Model(..model, page:), effect.none())
+1
shared/src/shared/route.gleam
··· 19 19 } 20 20 } 21 21 22 + /// Some routes might require authentication 22 23 pub fn is_protected(route: Route) -> Bool { 23 24 case route { 24 25 Login | NotFound -> False