diff options
author | 2020-02-06 05:56:23 +0100 | |
---|---|---|
committer | 2020-02-06 05:56:23 +0100 | |
commit | 36e617ae70cc7a86ce998cbd61f6aa702bb42933 (patch) | |
tree | c3a4ec76931c8153c932c364fa393e25d39d74f0 /examples/todos | |
parent | 679d758627f6500de4b2220c0dba3460871b83b4 (diff) | |
download | iced-36e617ae70cc7a86ce998cbd61f6aa702bb42933.tar.gz iced-36e617ae70cc7a86ce998cbd61f6aa702bb42933.tar.bz2 iced-36e617ae70cc7a86ce998cbd61f6aa702bb42933.zip |
Implement local storage for `todos` example in Wasm
Diffstat (limited to 'examples/todos')
-rw-r--r-- | examples/todos/Cargo.toml | 4 | ||||
-rw-r--r-- | examples/todos/src/main.rs | 29 |
2 files changed, 30 insertions, 3 deletions
diff --git a/examples/todos/Cargo.toml b/examples/todos/Cargo.toml index c905fc38..f945cde5 100644 --- a/examples/todos/Cargo.toml +++ b/examples/todos/Cargo.toml @@ -14,6 +14,10 @@ serde_json = "1.0" async-std = "1.0" directories = "2.0" +[target.'cfg(target_arch = "wasm32")'.dependencies] +web-sys = { version = "0.3", features = ["Window", "Storage"] } +wasm-timer = "0.2" + [package.metadata.deb] assets = [ ["target/release/todos", "usr/bin/iced-todos", "755"], diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs index a4009874..7e866b19 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -557,15 +557,38 @@ impl SavedState { } } -// TODO #[cfg(target_arch = "wasm32")] impl SavedState { + fn storage() -> Option<web_sys::Storage> { + let window = web_sys::window()?; + + window.local_storage().ok()? + } + async fn load() -> Result<SavedState, LoadError> { - Err(LoadError::FileError) + let storage = Self::storage().ok_or(LoadError::FileError)?; + + let contents = storage + .get_item("state") + .map_err(|_| LoadError::FileError)? + .ok_or(LoadError::FileError)?; + + serde_json::from_str(&contents).map_err(|_| LoadError::FormatError) } async fn save(self) -> Result<(), SaveError> { - Err(SaveError::FileError) + let storage = Self::storage().ok_or(SaveError::FileError)?; + + let json = serde_json::to_string_pretty(&self) + .map_err(|_| SaveError::FormatError)?; + + storage + .set_item("state", &json) + .map_err(|_| SaveError::WriteError)?; + + let _ = wasm_timer::Delay::new(std::time::Duration::from_secs(2)).await; + + Ok(()) } } |