Skip to content

Commit 5fa8d8d

Browse files
committed
feat(mode): create mode hook
1 parent 0cda215 commit 5fa8d8d

File tree

6 files changed

+54
-18
lines changed

6 files changed

+54
-18
lines changed

crates/midoku-theme/src/mode.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/// Represents the theme modes available in the system.
2+
#[derive(Clone, Copy, PartialEq, Eq)]
23
pub enum Mode {
34
/// Dark theme mode.
45
Dark,

src/hook/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
mod gallery;
2+
mod mode;
23
mod state;
34

45
pub use gallery::*;
6+
pub use mode::*;
57
pub use state::*;

src/hook/mode.rs

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use dioxus::prelude::*;
2+
3+
use crate::model::Mode;
4+
5+
pub fn use_mode_provider() {
6+
let mut mode_signal = Signal::new(Mode::default());
7+
8+
#[cfg(not(target_os = "android"))]
9+
spawn(async move {
10+
use dioxus::desktop::tao::window::Theme;
11+
use midoku_theme::prelude::*;
12+
13+
let window = dioxus::desktop::window();
14+
15+
let mut stream = midoku_theme::subscribe().await;
16+
while let Some(mode) = stream.next().await {
17+
mode_signal.set(mode.into());
18+
match mode {
19+
Mode::Dark => window.set_theme(Some(Theme::Dark)),
20+
Mode::Light => window.set_theme(Some(Theme::Light)),
21+
Mode::Unspecified => window.set_theme(None),
22+
}
23+
}
24+
});
25+
26+
use_context_provider(|| mode_signal);
27+
}
28+
29+
pub fn use_mode() -> Signal<Mode> {
30+
use_context::<Signal<Mode>>()
31+
}

src/main.rs

+2-18
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use const_format::concatcp;
1212
use dioxus::prelude::*;
1313
use rayon::ThreadPool;
1414

15-
use crate::hook::{use_gallery_handler, use_state_provider};
15+
use crate::hook::{use_gallery_handler, use_mode_provider, use_state_provider};
1616
use crate::layout::Navbar;
1717

1818
use crate::page::{
@@ -97,23 +97,7 @@ fn main() {
9797
fn App() -> Element {
9898
use_gallery_handler();
9999
use_state_provider();
100-
101-
#[cfg(not(target_os = "android"))]
102-
spawn(async move {
103-
use dioxus::desktop::tao::window::Theme;
104-
use midoku_theme::prelude::*;
105-
106-
let window = dioxus::desktop::window();
107-
108-
let mut stream = midoku_theme::subscribe().await;
109-
while let Some(mode) = stream.next().await {
110-
match mode {
111-
Mode::Dark => window.set_theme(Some(Theme::Dark)),
112-
Mode::Light => window.set_theme(Some(Theme::Light)),
113-
Mode::Unspecified => window.set_theme(None),
114-
}
115-
}
116-
});
100+
use_mode_provider();
117101

118102
rsx! {
119103
div { class: "flex flex-col h-screen",

src/model/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
mod extension;
22
mod manifest;
3+
mod mode;
34
mod source;
45

56
pub use extension::{Extension, Extensions};
67
pub use manifest::{Manifest, Manifests};
8+
pub use mode::Mode;
79
pub use source::Source;

src/model/mode.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#[derive(Default, Clone, Copy, PartialEq, Eq)]
2+
pub enum Mode {
3+
Dark,
4+
#[default]
5+
Light,
6+
}
7+
8+
impl From<midoku_theme::prelude::Mode> for Mode {
9+
fn from(value: midoku_theme::prelude::Mode) -> Self {
10+
match value {
11+
midoku_theme::prelude::Mode::Dark => Mode::Dark,
12+
midoku_theme::prelude::Mode::Light => Mode::Light,
13+
midoku_theme::prelude::Mode::Unspecified => Mode::default(),
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)