Start implementing repo view on home page

Changed files
+32 -1
src
+1
gleam.toml
··· 8 modem = ">= 1.1.0 and < 2.0.0" 9 lustre_ui = ">= 0.6.0 and < 1.0.0" 10 birl = ">= 1.7.0 and < 2.0.0" 11 12 [dev-dependencies] 13 gleeunit = ">= 1.0.0 and < 2.0.0"
··· 8 modem = ">= 1.1.0 and < 2.0.0" 9 lustre_ui = ">= 0.6.0 and < 1.0.0" 10 birl = ">= 1.7.0 and < 2.0.0" 11 + lustre_http = ">= 0.5.2 and < 1.0.0" 12 13 [dev-dependencies] 14 gleeunit = ">= 1.0.0 and < 2.0.0"
+5 -1
manifest.toml
··· 11 { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, 12 { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, 13 { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, 14 { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, 15 { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, 16 { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, 17 { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, 18 { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, ··· 26 { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, 27 { name = "lustre", version = "4.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "258F876CD7AB12C2C773F1A30F76DFC0A0ED989B720070DF32FC0717A6A0E60C" }, 28 { name = "lustre_dev_tools", version = "1.3.2", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "CC8F46BCE51C1349862C5F6BA0075B0C68096B866ED1C520B60358FAAB398B60" }, 29 { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, 30 { name = "marceau", version = "1.1.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "1AAD727A30BE0F95562C3403BB9B27C823797AD90037714255EEBF617B1CDA81" }, 31 { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, ··· 42 ] 43 44 [requirements] 45 - birl = { version = ">= 1.7.0 and < 2.0.0"} 46 gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } 47 gleeunit = { version = ">= 1.0.0 and < 2.0.0" } 48 lustre = { version = ">= 4.2.0 and < 5.0.0" } 49 lustre_dev_tools = { version = ">= 1.3.2 and < 2.0.0" } 50 lustre_ui = { version = ">= 0.6.0 and < 1.0.0" } 51 modem = { version = ">= 1.1.0 and < 2.0.0" }
··· 11 { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, 12 { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, 13 { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, 14 + { name = "gleam_fetch", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "gleam_fetch", source = "hex", outer_checksum = "7446410A44A1D1328F5BC1FF4FC9CBD1570479EA69349237B3F82E34521CCC10" }, 15 { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, 16 { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, 17 + { name = "gleam_javascript", version = "0.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "14D5B7E1A70681E0776BF0A0357F575B822167960C844D3D3FA114D3A75F05A8" }, 18 { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, 19 { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, 20 { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, ··· 28 { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, 29 { name = "lustre", version = "4.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "258F876CD7AB12C2C773F1A30F76DFC0A0ED989B720070DF32FC0717A6A0E60C" }, 30 { name = "lustre_dev_tools", version = "1.3.2", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "CC8F46BCE51C1349862C5F6BA0075B0C68096B866ED1C520B60358FAAB398B60" }, 31 + { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, 32 { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, 33 { name = "marceau", version = "1.1.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "1AAD727A30BE0F95562C3403BB9B27C823797AD90037714255EEBF617B1CDA81" }, 34 { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, ··· 45 ] 46 47 [requirements] 48 + birl = { version = ">= 1.7.0 and < 2.0.0" } 49 gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } 50 gleeunit = { version = ">= 1.0.0 and < 2.0.0" } 51 lustre = { version = ">= 4.2.0 and < 5.0.0" } 52 lustre_dev_tools = { version = ">= 1.3.2 and < 2.0.0" } 53 + lustre_http = { version = ">= 0.5.2 and < 1.0.0"} 54 lustre_ui = { version = ">= 0.6.0 and < 1.0.0" } 55 modem = { version = ">= 1.1.0 and < 2.0.0" }
+26
src/website.gleam
··· 13 import website/common 14 import website/posts 15 import website/projects 16 17 // Main 18 ··· 30 current_route: Route, 31 posts: List(posts.Post(Msg)), 32 projects: List(projects.Project(Msg)), 33 ) 34 } 35 ··· 53 @external(javascript, "./ffi.mjs", "switch_theme") 54 fn do_switch_theme() -> Nil 55 56 fn switch_theme() -> Effect(Msg) { 57 effect.from(fn(disp) { 58 do_switch_theme() ··· 101 OnRouteChange(Route) 102 ChangeDarkMode 103 DoneChangeDarkMode 104 } 105 106 fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { ··· 111 ) 112 ChangeDarkMode -> #(model, switch_theme()) 113 DoneChangeDarkMode -> #(model, effect.none()) 114 } 115 } 116
··· 13 import website/common 14 import website/posts 15 import website/projects 16 + import gleam/dynamic 17 + import lustre_http 18 19 // Main 20 ··· 32 current_route: Route, 33 posts: List(posts.Post(Msg)), 34 projects: List(projects.Project(Msg)), 35 + repositories: List(Repository) 36 ) 37 } 38 ··· 56 @external(javascript, "./ffi.mjs", "switch_theme") 57 fn do_switch_theme() -> Nil 58 59 + type Repository { 60 + Repository( 61 + avatar_url: String, 62 + description: String, 63 + name: String, 64 + stars_count: Int, 65 + ) 66 + } 67 + 68 + fn get_repositories() -> Effect(Msg) { 69 + let url = "https://codeberg.org/api/v1/users/naomi/repos" 70 + let decoder = dynamic.list(of: dynamic.decode4( 71 + Repository, 72 + dynamic.field("avatar_url", dynamic.string), 73 + dynamic.field("description", dynamic.string), 74 + dynamic.field("name", dynamic.string), 75 + dynamic.field("stars_count", dynamic.int) 76 + )) 77 + lustre_http.get(url, lustre_http.expect_json(decoder, ApiGotRepositories)) 78 + } 79 + 80 fn switch_theme() -> Effect(Msg) { 81 effect.from(fn(disp) { 82 do_switch_theme() ··· 125 OnRouteChange(Route) 126 ChangeDarkMode 127 DoneChangeDarkMode 128 + ApiGotRepositories(Result(List(Repository), lustre_http.HttpError)) 129 } 130 131 fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { ··· 136 ) 137 ChangeDarkMode -> #(model, switch_theme()) 138 DoneChangeDarkMode -> #(model, effect.none()) 139 + ApiGotRepositories -> #(model, effect.none()) 140 } 141 } 142