(#[prop()] tabs: Vec<Tab>)
| 113 | #[tracing::instrument(level = "debug", skip(tabs))] |
| 114 | #[component] |
| 115 | pub fn Sidebar(#[prop()] tabs: Vec<Tab>) -> impl IntoView { |
| 116 | let mut active_write_signals = vec![]; |
| 117 | let mut active_read_signals = vec![]; |
| 118 | for _ in 0..tabs.len() { |
| 119 | let (read, write) = signal(false); |
| 120 | active_read_signals.push(read); |
| 121 | active_write_signals.push(write); |
| 122 | } |
| 123 | |
| 124 | let (active_tab, set_active_tab) = signal(1); |
| 125 | active_write_signals[0].set(true); |
| 126 | |
| 127 | let tab_urls: Vec<String> = tabs.iter().map(|v| v.url.clone()).collect(); |
| 128 | |
| 129 | let navigate = leptos_router::hooks::use_navigate(); |
| 130 | |
| 131 | let ui_store = expect_context::<RwSignal<UiStore>>(); |
| 132 | |
| 133 | let (sidebar_open, set_sidebar_open) = create_slice( |
| 134 | ui_store, |
| 135 | |u| u.get_sidebar_open(), |
| 136 | |u, val| u.set_sidebar_open(val), |
| 137 | ); |
| 138 | |
| 139 | Effect::new(move || { |
| 140 | let active_tab = active_tab.get(); |
| 141 | for (i, signal) in active_write_signals.iter().enumerate() { |
| 142 | signal.set(i == active_tab); |
| 143 | } |
| 144 | let url = tab_urls.get(active_tab); |
| 145 | if let Some(url) = url { |
| 146 | if url == "queue" { |
| 147 | ui_store.update(|s| s.show_queue(true)); |
| 148 | } else { |
| 149 | navigate(url.as_str(), Default::default()); |
| 150 | } |
| 151 | } |
| 152 | }); |
| 153 | |
| 154 | let is_mobile = create_read_slice(ui_store, |u| u.get_is_mobile()).get(); |
| 155 | |
| 156 | view! { |
| 157 | <div class="sidebar-container sidebar" class:sidebar-mobile=is_mobile> |
| 158 | <div tabindex="-1" class="b-sidebar-outer"> |
| 159 | <div |
| 160 | class="b-sidebar gradient sidebar-top-low-spacing" |
| 161 | id="sidebar" |
| 162 | tabindex="-1" |
| 163 | role="dialog" |
| 164 | aria-modal="false" |
| 165 | style:width=move || if sidebar_open.get() { "261px" } else { "70px" } |
| 166 | > |
| 167 | <header class="b-sidebar-header"> |
| 168 | <div class="d-flex w-100 mt-3 justify-content-between"></div> |
| 169 | </header> |
| 170 | <div class="b-sidebar-body"> |
| 171 | <div class="extra-margin-top"> |
| 172 | <div |
nothing calls this directly
no test coverage detected