💻 My corner on the internet kacaii.dev/
lustre evergarden wisp-place gleam atproto
0

Configure Feed

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

blog: pass the showcases as an argument

author
kacaii.dev
date (Jul 22, 2026, 5:38 PM -0300) commit 7e3c095c parent 77dba282 change-id yrwsymtw
+51 -17
+27 -8
src/blog.gleam
··· 28 28 page: Page, 29 29 /// AT Protocol Data 30 30 atproto: atproto.AtProto, 31 + /// Showcases to be displayed at the home page 32 + showcases: List(home.Showcase), 31 33 ) 32 34 } 33 35 ··· 39 41 } 40 42 41 43 pub fn main() -> Nil { 42 - let assert Ok(uri) = modem.initial_uri() 44 + let assert Ok(initial_uri) = modem.initial_uri() 45 + let showcases = list.shuffle(home.all_showcases) 43 46 let app = lustre.application(init:, update:, view:) 44 - let assert Ok(_) = lustre.start(app, "#app", uri) 47 + 48 + let opts = Init(initial_uri:, showcases:) 49 + let assert Ok(_) = lustre.start(app, "#app", opts) 45 50 46 51 Nil 52 + } 53 + 54 + pub type Init { 55 + Init(initial_uri: uri.Uri, showcases: List(home.Showcase)) 47 56 } 48 57 49 58 pub type Message { ··· 86 95 87 96 // UPDATE ---------------------------------------------------------------------- 88 97 89 - pub fn init(at uri: uri.Uri) -> #(Model, effect.Effect(Message)) { 90 - let route = route.parse(uri) 98 + pub fn init(opts: Init) -> #(Model, effect.Effect(Message)) { 99 + let route = route.parse(opts.initial_uri) 91 100 let atproto = atproto.init() 92 - let #(page, page_effect) = init_page(route, atproto) 101 + let #(page, page_effect) = init_page(route, atproto, opts.showcases) 93 102 94 103 let init_modem = { 95 104 use uri <- modem.init() ··· 106 115 atproto.fetch_bluesky_profile(atproto) |> effect.map(AtProtoMessage), 107 116 ]) 108 117 109 - #(Model(title: "kacaii.dev", route:, page:, atproto:), effect) 118 + #( 119 + Model( 120 + title: "kacaii.dev", 121 + route:, 122 + page:, 123 + atproto:, 124 + showcases: home.all_showcases, 125 + ), 126 + effect, 127 + ) 110 128 } 111 129 112 130 /// Initialize the current page Model 113 131 pub fn init_page( 114 132 route: route.Route, 115 133 atproto: atproto.AtProto, 134 + showcases: List(home.Showcase), 116 135 ) -> #(Page, effect.Effect(Message)) { 117 136 case route { 118 137 route.About -> { ··· 121 140 } 122 141 123 142 route.Home -> { 124 - let #(model, effect) = home.init() 143 + let #(model, effect) = home.init(showcases) 125 144 let page_effect = effect.map(effect, HomeMessage) 126 145 127 146 let title_effect = case atproto.bluesky_profile { ··· 230 249 route: route.Route, 231 250 ) -> #(Model, effect.Effect(Message)) { 232 251 use <- bool.guard(model.route == route, continue(model)) 233 - let #(page, effect) = init_page(route, model.atproto) 252 + let #(page, effect) = init_page(route, model.atproto, model.showcases) 234 253 235 254 let effect = 236 255 effect.batch([
+3 -2
src/blog/page/home.gleam
··· 21 21 Model(showcases: List(Showcase)) 22 22 } 23 23 24 - pub fn init() -> #(Model, effect.Effect(Message)) { 25 - let showcases = list.shuffle(all_showcases) 24 + pub fn init( 25 + with showcases: List(Showcase), 26 + ) -> #(Model, effect.Effect(Message)) { 26 27 #(Model(showcases:), effect.none()) 27 28 } 28 29
+9 -4
test/blog_test.gleam
··· 1 1 import blog 2 + import blog/page/home 2 3 import blog/route 3 4 import gleam/uri 4 5 import gleeunit ··· 9 10 } 10 11 11 12 pub fn simulation( 12 - uri: uri.Uri, 13 + opts: blog.Init, 13 14 ) -> simulate.Simulation(blog.Model, blog.Message) { 14 15 simulate.application(blog.init, blog.update, blog.view) 15 - |> simulate.start(uri) 16 + |> simulate.start(opts) 16 17 } 17 18 18 19 /// Provides an initial uri for the Model to be initialized 19 - pub fn init(on route: route.Route) -> uri.Uri { 20 + pub fn init( 21 + on route: route.Route, 22 + with showcases: List(home.Showcase), 23 + ) -> blog.Init { 20 24 let assert Ok(uri) = uri.parse("https://localhost:1234") 21 25 let path = route.path(route) 22 26 23 - uri.Uri(..uri, path:) 27 + let initial_uri = uri.Uri(..uri, path:) 28 + blog.Init(initial_uri:, showcases:) 24 29 }
+3 -1
test/blog_test/navbar_test.gleam
··· 1 1 import blog 2 + import blog/page/home 2 3 import blog/route 3 4 import blog_test 5 + import gleam/list 4 6 import lustre/dev/query 5 7 import lustre/dev/simulate 6 8 7 9 pub fn update_title_test() -> Nil { 8 - let init = blog_test.init(route.Home) 10 + let init = blog_test.init(route.Home, list.shuffle(home.all_showcases)) 9 11 let title = "wibble" 10 12 let msg = blog.NavbarTitleUpdated(new: title) 11 13
+9 -2
test/blog_test/navigation_test.gleam
··· 1 1 import blog 2 + import blog/atproto 3 + import blog/page/home 2 4 import blog/route 3 5 import blog_test 4 6 import gleam/list ··· 10 12 11 13 pub fn navigation_test() -> Nil { 12 14 let simulation = 13 - route.Home 14 - |> blog_test.init 15 + blog_test.init(on: route.Home, with: list.shuffle(home.all_showcases)) 15 16 |> blog_test.simulation 16 17 18 + let showcases = simulate.model(simulation).showcases 19 + 17 20 let sequence = [ 18 21 route.About, 19 22 route.Home, 23 + route.Writing, 20 24 ] 21 25 22 26 // visiting each link ··· 41 45 ) 42 46 43 47 let model = simulate.model(simulation) 48 + let #(page, _) = blog.init_page(route, atproto.init(), showcases) 49 + 44 50 assert model.route == route as "route updated" 51 + assert model.page == page as "page updated" 45 52 46 53 simulation 47 54 })