From 4b45e33cea7134081a36fa9f7df1133b86a2f6a5 Mon Sep 17 00:00:00 2001 From: YK Date: Sat, 13 Sep 2025 16:54:10 +0300 Subject: [PATCH] refactor: extract all sidebar blocks into separate modules/components --- src/components/sidebar.rs | 249 +----------------- src/components/sidebar/about.rs | 42 +++ src/components/sidebar/death_saving_throws.rs | 68 +++++ src/components/sidebar/hit_dice.rs | 60 +++++ src/components/sidebar/hit_points.rs | 49 ++++ src/components/sidebar/image.rs | 15 ++ src/components/sidebar/names.rs | 28 ++ src/components/sidebar/spell_slots.rs | 43 +++ 8 files changed, 318 insertions(+), 236 deletions(-) create mode 100644 src/components/sidebar/about.rs create mode 100644 src/components/sidebar/death_saving_throws.rs create mode 100644 src/components/sidebar/hit_dice.rs create mode 100644 src/components/sidebar/hit_points.rs create mode 100644 src/components/sidebar/image.rs create mode 100644 src/components/sidebar/names.rs create mode 100644 src/components/sidebar/spell_slots.rs diff --git a/src/components/sidebar.rs b/src/components/sidebar.rs index c62160f..328fe4a 100644 --- a/src/components/sidebar.rs +++ b/src/components/sidebar.rs @@ -1,247 +1,24 @@ use crate::prelude::*; use leptos::prelude::*; +mod image; +mod names; +mod about; +mod hit_points; +mod hit_dice; +mod death_saving_throws; +mod spell_slots; #[component] pub fn Sidebar () -> impl IntoView { - let state = expect_context::(); - - let player = state.player(); - let name = player.name(); - - let first = name.first(); - let last = name.last(); - let alias = name.alias(); - - let name_input_class = "header-input header-input-3"; - - let class = player.class(); - let level = player.level(); - let xp = player.xp(); - - let hp = player.hp(); - let max_hp = player.max_hp(); - let temp_hp = player.temp_hp(); - - let image = player.image(); - - let hit_dice = player.hit_dice(); - let dt = player.death_save_throws(); - - let slots = player.spell_slots(); - - let adjust_level = move |adjustment: i8| level.update(|l| { - if let Some(new) = l.checked_add_signed(adjustment) { - *l = new; - } - }); - - let adjust_xp = move |ev: Targeted| { - utils::adjust_checked(ev, xp); - }; - - let adjust_hp = move |ev: Targeted| { - utils::adjust_checked(ev, hp); - }; - - let adjust_max_hp = move |ev: Targeted| { - utils::adjust_checked(ev, max_hp); - }; - - let adjust_temp_hp = move |ev: Targeted| { - utils::adjust_checked(ev, temp_hp); - }; - - - let pc_hp = move |a: u16, b: u16| -> String { - format!("width: {}%", utils::filled_pc(a, b).min(100.)) - }; - - let process_die_click = move |slot_id: u8| { - hit_dice.update(|d| { - if slot_id < d.used { - d.used = slot_id; - } else { - d.used = slot_id + 1; - } - }) - }; - - let process_dt_click = move |success: bool, slot_id: u8| { - dt.update(|d| { - let v = if success { &mut d.succeeded } else { &mut d.failed }; - if slot_id < *v { - *v = slot_id; - } else { - *v = slot_id + 1; - } - - }); - }; - - - let process_spell_slot_click = move |level: usize, slot_id: u8| { - slots.update(|s| { - let l = &mut s.0[level]; - if slot_id < l.used { - l.used = slot_id; - } else { - l.used = slot_id + 1; - } - }) - }; - - - view! { } } diff --git a/src/components/sidebar/about.rs b/src/components/sidebar/about.rs new file mode 100644 index 0000000..4b5e2dc --- /dev/null +++ b/src/components/sidebar/about.rs @@ -0,0 +1,42 @@ +use crate::prelude::*; +use leptos::prelude::*; + +#[component] +pub fn About () -> impl IntoView { + let state = expect_context::(); + let player = state.player(); + + let class = player.class(); + let level = player.level(); + let xp = player.xp(); + + let adjust_level = move |adjustment: i8| level.update(|l| { + if let Some(new) = l.checked_add_signed(adjustment) { + *l = new; + } + }); + + let adjust_xp = move |ev: Targeted| { + utils::adjust_checked(ev, xp); + }; + + view! { +
+
+ +
+
+ {move || level.get()} + уровня +
+
+ + +
+
+ + XP +
+
+ } +} diff --git a/src/components/sidebar/death_saving_throws.rs b/src/components/sidebar/death_saving_throws.rs new file mode 100644 index 0000000..6338035 --- /dev/null +++ b/src/components/sidebar/death_saving_throws.rs @@ -0,0 +1,68 @@ +use crate::prelude::*; +use leptos::prelude::*; + +#[component] +pub fn DeathSavingThrows () -> impl IntoView { + let state = expect_context::(); + let player = state.player(); + + let dt = player.death_save_throws(); + + let process_dt_click = move |success: bool, slot_id: u8| { + dt.update(|d| { + let v = if success { &mut d.succeeded } else { &mut d.failed }; + if slot_id < *v { + *v = slot_id; + } else { + *v = slot_id + 1; + } + + }); + }; + + view! { +
death saving throws/cб от смерти:
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ } +} diff --git a/src/components/sidebar/hit_dice.rs b/src/components/sidebar/hit_dice.rs new file mode 100644 index 0000000..ce33f26 --- /dev/null +++ b/src/components/sidebar/hit_dice.rs @@ -0,0 +1,60 @@ +use crate::prelude::*; +use leptos::prelude::*; + +#[component] +pub fn HitDice () -> impl IntoView { + let state = expect_context::(); + let player = state.player(); + + let hit_dice = player.hit_dice(); + let level = player.level(); + let process_die_click = move |slot_id: u8| { + hit_dice.update(|d| { + if slot_id < d.used { + d.used = slot_id; + } else { + d.used = slot_id + 1; + } + }) + }; + + view! { +
hit dice/кости хитов:
+
+
+ +
+ +
+ {move || hit_dice.get().kind} +
+
+
+ } +} diff --git a/src/components/sidebar/hit_points.rs b/src/components/sidebar/hit_points.rs new file mode 100644 index 0000000..7e23970 --- /dev/null +++ b/src/components/sidebar/hit_points.rs @@ -0,0 +1,49 @@ +use crate::prelude::*; +use leptos::prelude::*; + +#[component] +pub fn HitPoints () -> impl IntoView { + let state = expect_context::(); + let player = state.player(); + + let hp = player.hp(); + let max_hp = player.max_hp(); + let temp_hp = player.temp_hp(); + + let adjust_hp = move |ev: Targeted| { + utils::adjust_checked(ev, hp); + }; + + let adjust_max_hp = move |ev: Targeted| { + utils::adjust_checked(ev, max_hp); + }; + + let adjust_temp_hp = move |ev: Targeted| { + utils::adjust_checked(ev, temp_hp); + }; + + + let pc_hp = move |a: u16, b: u16| -> String { + format!("width: {}%", utils::filled_pc(a, b).min(100.)) + }; + + view! { +
hp/оз:
+
+
+
+
+ + "/" + +
+
+
+
+
+ +
+
+
+ } +} diff --git a/src/components/sidebar/image.rs b/src/components/sidebar/image.rs new file mode 100644 index 0000000..98aff86 --- /dev/null +++ b/src/components/sidebar/image.rs @@ -0,0 +1,15 @@ +use crate::prelude::*; +use leptos::prelude::*; + +#[component] +pub fn Image () -> impl IntoView { + let state = expect_context::(); + let image = state.player().image(); + view! { + +
+ +
+
+ } +} diff --git a/src/components/sidebar/names.rs b/src/components/sidebar/names.rs new file mode 100644 index 0000000..4df6439 --- /dev/null +++ b/src/components/sidebar/names.rs @@ -0,0 +1,28 @@ +use crate::prelude::*; +use leptos::prelude::*; + +#[component] +pub fn Names () -> impl IntoView { + let state = expect_context::(); + + let player = state.player(); + let name = player.name(); + + let first = name.first(); + let last = name.last(); + let alias = name.alias(); + + let name_input_class = "header-input header-input-3"; + + view! { +
+ +
+ "«" + + "»" +
+ +
+ } +} diff --git a/src/components/sidebar/spell_slots.rs b/src/components/sidebar/spell_slots.rs new file mode 100644 index 0000000..0c2994a --- /dev/null +++ b/src/components/sidebar/spell_slots.rs @@ -0,0 +1,43 @@ +use crate::prelude::*; +use leptos::prelude::*; + +#[component] +pub fn SpellSlots () -> impl IntoView { + let state = expect_context::(); + let player = state.player(); + + let slots = player.spell_slots(); + + let process_spell_slot_click = move |level: usize, slot_id: u8| { + slots.update(|s| { + let l = &mut s.0[level]; + if slot_id < l.used { + l.used = slot_id; + } else { + l.used = slot_id + 1; + } + }) + }; + + view! { +
spell slots/ячейки заклинаний:
+
+ +
+ {move || index + 1} + +
+
+
+
+
+
+ } +}