app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 6903c8287e8032165a56ad991e8cbb509169200e
parent 3821b4ff14060740ad3ddcade961c17a1b8301ea
Author: triesap <tyson@radroots.org>
Date:   Wed, 28 Jan 2026 13:53:47 +0000

app: Add setup profile step stub

- Add Profile step and transition rules
- Update setup step unit tests for new flow
- Render placeholder profile view in SetupPage
- Keep setup navigation wiring intact

Diffstat:
Mapp/src/app.rs | 10++++++++++
Mapp/src/setup.rs | 22+++++++++++++++++-----
2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/app/src/app.rs b/app/src/app.rs @@ -376,6 +376,16 @@ fn SetupPage() -> impl IntoView { </div> </section> }.into_any(), + RadrootsAppSetupStep::Profile => view! { + <section + id="app-setup-profile" + class="app-view app-view-enter flex flex-col w-full px-6 pt-10 pb-16 justify-center items-center" + > + <p class="font-sans font-[600] text-ly0-gl text-2xl"> + "Add Profile" + </p> + </section> + }.into_any(), }} <footer id="app-setup-actions" diff --git a/app/src/setup.rs b/app/src/setup.rs @@ -46,13 +46,15 @@ pub fn app_setup_state_new(active_key: String, eula_date: String) -> RadrootsApp pub enum RadrootsAppSetupStep { Intro, KeyChoice, + Profile, } impl RadrootsAppSetupStep { pub const fn next(self) -> Self { match self { RadrootsAppSetupStep::Intro => RadrootsAppSetupStep::KeyChoice, - RadrootsAppSetupStep::KeyChoice => RadrootsAppSetupStep::KeyChoice, + RadrootsAppSetupStep::KeyChoice => RadrootsAppSetupStep::Profile, + RadrootsAppSetupStep::Profile => RadrootsAppSetupStep::Profile, } } @@ -60,11 +62,12 @@ impl RadrootsAppSetupStep { match self { RadrootsAppSetupStep::Intro => RadrootsAppSetupStep::Intro, RadrootsAppSetupStep::KeyChoice => RadrootsAppSetupStep::Intro, + RadrootsAppSetupStep::Profile => RadrootsAppSetupStep::KeyChoice, } } pub const fn is_terminal(self) -> bool { - matches!(self, RadrootsAppSetupStep::KeyChoice) + matches!(self, RadrootsAppSetupStep::Profile) } } @@ -319,7 +322,11 @@ mod tests { ); assert_eq!( RadrootsAppSetupStep::KeyChoice.next(), - RadrootsAppSetupStep::KeyChoice + RadrootsAppSetupStep::Profile + ); + assert_eq!( + RadrootsAppSetupStep::Profile.next(), + RadrootsAppSetupStep::Profile ); } @@ -333,12 +340,17 @@ mod tests { RadrootsAppSetupStep::KeyChoice.prev(), RadrootsAppSetupStep::Intro ); + assert_eq!( + RadrootsAppSetupStep::Profile.prev(), + RadrootsAppSetupStep::KeyChoice + ); } #[test] - fn setup_step_terminal_matches_key_choice() { + fn setup_step_terminal_matches_profile() { assert!(!RadrootsAppSetupStep::Intro.is_terminal()); - assert!(RadrootsAppSetupStep::KeyChoice.is_terminal()); + assert!(!RadrootsAppSetupStep::KeyChoice.is_terminal()); + assert!(RadrootsAppSetupStep::Profile.is_terminal()); } #[test]