diff --git a/.cargo/config.toml b/.cargo/config.toml index b891103..eac64d8 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,3 +1,3 @@ -[unstable] +[build] rustflags = ["--cfg=web_sys_unstable_apis"] -rustdocflags = ["--cfg=web_sys_unstable_apis"] \ No newline at end of file +rustdocflags = ["--cfg=web_sys_unstable_apis"] diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..b1e6e05 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,82 @@ +on: + push: + # Pattern matched against refs/tags + tags: + - '*' # Push events to every tag not containing / + workflow_dispatch: + +name: CD + +permissions: write-all + +jobs: + publish: + name: Publish + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + profile: minimal + override: true + components: rustfmt, clippy, rust-src + - name: Cache + uses: Swatinem/rust-cache@v2 + - name: Check function count badge + run: python3 docs/generate_count_badge.py --check + - name: Check version in docs + run: python3 docs/add_version_to_docs.py --check + - name: Check formatting + run: cargo fmt --check + - name: Clippy + run: cargo clippy --features docs,math --tests -- -D warnings + - name: Run tests (general) + run: cargo test --features math,docs,ssr + - name: Run tests (axum) + run: cargo test --features math,docs,ssr,axum --doc use_cookie::use_cookie + - name: Run tests (actix) + run: cargo test --features math,docs,ssr,actix --doc use_cookie::use_cookie + + #### mdbook + - name: Install mdbook I + uses: taiki-e/install-action@v2 + with: + tool: cargo-binstall,mdbook + - name: Install mdbook II + run: | + cargo binstall -y mdbook-cmdrun + cargo binstall -y trunk@0.17.5 + rustup target add wasm32-unknown-unknown + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Build mdbook # TODO : run mdbook tests + run: | + cd docs/book + mdbook build + python3 post_build.py + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: ./docs/book/book + - name: Deploy book to github pages + id: deployment + uses: actions/deploy-pages@v2 + ##### mdbook end + + - name: Publish crate leptos-use + uses: katyo/publish-crates@v2 + with: + registry-token: ${{ secrets.CRATES_TOKEN }} + + - uses: CSchoel/release-notes-from-changelog@v1 + - name: Create Release using GitHub CLI + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: > + gh release create + -d + -F RELEASE.md + -t "Version $RELEASE_VERSION" + ${GITHUB_REF#refs/*/} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95f75d3..b44b27e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,82 +1,48 @@ +name: Continuous Integration + on: - push: - # Pattern matched against refs/tags - tags: - - '*' # Push events to every tag not containing / - workflow_dispatch: + pull_request: + branches: + - main + paths: + - "**" + - "!/*.md" + - "!/**.md" -name: CI - -permissions: write-all +concurrency: + group: "${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}" + cancel-in-progress: true jobs: - publish: - name: Publish + integrity: + name: Integrity Checks on Rust ${{ matrix.toolchain }} runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + matrix: + toolchain: + - stable + - nightly + steps: - - uses: actions/checkout@v3 - - uses: actions-rs/toolchain@v1 + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@master with: - toolchain: nightly - profile: minimal - override: true - components: rustfmt, clippy, rust-src - - name: Cache + toolchain: ${{ matrix.toolchain }} + targets: wasm32-unknown-unknown + components: clippy, rustfmt + + - name: Setup Rust Cache uses: Swatinem/rust-cache@v2 - - name: Check function count badge - run: python3 docs/generate_count_badge.py --check - - name: Check version in docs - run: python3 docs/add_version_to_docs.py --check - - name: Check formatting + + - name: Build + run: cargo build + + - name: Format run: cargo fmt --check + - name: Clippy - run: cargo clippy --features docs,math --tests -- -D warnings - - name: Run tests (general) - run: cargo test --features math,docs,ssr - - name: Run tests (axum) - run: cargo test --features math,docs,ssr,axum --doc use_cookie::use_cookie - - name: Run tests (actix) - run: cargo test --features math,docs,ssr,actix --doc use_cookie::use_cookie - - #### mdbook - - name: Install mdbook I - uses: taiki-e/install-action@v2 - with: - tool: cargo-binstall,mdbook - - name: Install mdbook II - run: | - cargo binstall -y mdbook-cmdrun - cargo binstall -y trunk@0.17.5 - rustup target add wasm32-unknown-unknown - - name: Setup Pages - id: pages - uses: actions/configure-pages@v3 - - name: Build mdbook # TODO : run mdbook tests - run: | - cd docs/book - mdbook build - python3 post_build.py - - name: Upload artifact - uses: actions/upload-pages-artifact@v1 - with: - path: ./docs/book/book - - name: Deploy book to github pages - id: deployment - uses: actions/deploy-pages@v2 - ##### mdbook end - - - name: Publish crate leptos-use - uses: katyo/publish-crates@v2 - with: - registry-token: ${{ secrets.CRATES_TOKEN }} - - - uses: CSchoel/release-notes-from-changelog@v1 - - name: Create Release using GitHub CLI - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: > - gh release create - -d - -F RELEASE.md - -t "Version $RELEASE_VERSION" - ${GITHUB_REF#refs/*/} + run: cargo clippy -- -D warnings diff --git a/.idea/leptos-use.iml b/.idea/leptos-use.iml index 7d56fcb..b65a8a2 100644 --- a/.idea/leptos-use.iml +++ b/.idea/leptos-use.iml @@ -77,6 +77,7 @@ + diff --git a/CHANGELOG.md b/CHANGELOG.md index f0ab304..cba1230 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [0.11.0] - 2024-07-27 ### Breaking Changes 🛠 @@ -50,8 +50,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `JsonCodec` has been renamed to `JsonSerdeCodec`. - The feature to enable this codec is now called `json_serde` instead of just `serde`. - `ProstCodec` now encodes as binary data. If you want to keep using it with string data you can wrap it like - this: `Base64`. You have to enable both features `prost` and `base64` for this. + this: `Base64`. - All of these structs, traits and features now live in their own crate called `codee` + - A bunch of new codecs are available. Have a look at the docs for crate `codee`. - `use_websocket`: - `UseWebsocketOptions` has been renamed to `UseWebSocketOptions` (uppercase S) to be consistent with the return type. @@ -70,12 +71,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 to `on_message_raw` and `on_message_raw_bytes`. - The new `UseWebSocketOptions::on_message` takes a `&T`. - `UseWebSocketOptions::on_error` now takes a `UseWebSocketError` instead of a `web_sys::Event`. -- `use_storage` now always saves the default value to storage if the key doesn't exist yet. +- `use_storage` now always saves the default value to storage if the key doesn't exist yet. +- Renamed `BreakpointsSematic` to `BreakpointsSemantic` and `breakpoints_sematic` to `breakpoints_semantic` + (note the `n`) (thanks to @mondeja). ### Fixes 🍕 - Fixed auto-reconnect in `use_websocket` - Fixed typo in compiler error messages in `use_cookie` (thanks to @SleeplessOne1917). +- Fixed potential signal out of scope issue with `use_raf_fn` + +### Other Changes 🔥 + +- Better links in docs that work both in the book and in rustdoc (thanks to @mondeja). +- Better CI/CD (thanks to @EstebanBorai). ## [0.10.10] - 2024-05-10 diff --git a/Cargo.toml b/Cargo.toml index 810b7a0..016d645 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "leptos-use" -version = "0.10.10" +version = "0.11.0" edition = "2021" authors = ["Marc-Stefan Cassola"] categories = ["gui", "web-programming"] diff --git a/README.md b/README.md index 13ff7c3..b432e0f 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Crates.io SSR Docs & Demos - 77 Functions + 79 Functions


@@ -24,7 +24,7 @@ [![Docs](https://docs.rs/leptos-use/badge.svg)](https://docs.rs/leptos-use/) [![MIT/Apache 2.0](https://img.shields.io/badge/license-MIT%2FApache-blue.svg)](https://github.com/synphonyte/leptos-use#license) -[![Build Status](https://github.com/synphonyte/leptos-use/actions/workflows/ci.yml/badge.svg)](https://github.com/synphonyte/leptos-use/actions/workflows/ci.yml) +[![Build Status](https://github.com/synphonyte/leptos-use/actions/workflows/cd.yml/badge.svg)](https://github.com/synphonyte/leptos-use/actions/workflows/cd.yml) [![Discord](https://img.shields.io/discord/1031524867910148188?color=%237289DA&label=discord)](https://discord.com/channels/1031524867910148188/1121154537709895783) ```rust @@ -92,4 +92,4 @@ This will create the function file in the src directory, scaffold an example dir | <= 0.3 | 0.3 | | 0.4, 0.5, 0.6 | 0.4 | | 0.7, 0.8, 0.9 | 0.5 | -| 0.10 | 0.6 | \ No newline at end of file +| 0.10, 0.11 | 0.6 | diff --git a/docs/book/post_build.py b/docs/book/post_build.py index 1abc3a2..20691a8 100644 --- a/docs/book/post_build.py +++ b/docs/book/post_build.py @@ -13,7 +13,8 @@ def main(): if os.path.isdir(category_dir): for file in os.listdir(category_dir): if file.endswith(".md") and (len(sys.argv) == 1 or (sys.argv[1] in file)): - build_and_copy_demo(category, file) + if build_and_copy_demo(category, file): + rewrite_links(category, file) def build_and_copy_demo(category, md_name): @@ -24,7 +25,8 @@ def build_and_copy_demo(category, md_name): code = p.wait() if code != 0: - sys.exit(code, f"failed to build example '{name}'") + sys.stderr.write(f"failed to build example '{name}'\n") + sys.exit(code) example_output_path = os.path.join(example_dir, "dist") target_path = os.path.join("book", category, name, "demo") @@ -49,7 +51,7 @@ def build_and_copy_demo(category, md_name): with open(book_html_path, "w") as f: f.write( - f"""{head_split[0]} + f"""{head_split[0]} {demo_head} {target_head} @@ -60,6 +62,32 @@ def build_and_copy_demo(category, md_name): {body_split[1]}""") + return True + + return False + + +def rewrite_links(category, md_name): + """Rewrite links in generated documentation to make them + compatible between rustdoc and the book. + """ + html_name = f"{md_name[:-3]}.html" + target_path = os.path.join("book", category, html_name) + + with open(target_path, "r") as f: + html = f.read() + + html = html.replace( + "fn@crate::", "", + ).replace( + "crate::", "", + ).replace( + "fn@", "", + ) + + with open(target_path, "w") as f: + f.write(html) + if __name__ == '__main__': main() diff --git a/docs/book/src/introduction.md b/docs/book/src/introduction.md index f12ec1b..cf0098a 100644 --- a/docs/book/src/introduction.md +++ b/docs/book/src/introduction.md @@ -12,6 +12,6 @@ Crates.io SSR Docs & Demos - 77 Functions + 79 Functions

\ No newline at end of file diff --git a/examples/ssr/Cargo.toml b/examples/ssr/Cargo.toml index d0b6e6a..5d71626 100644 --- a/examples/ssr/Cargo.toml +++ b/examples/ssr/Cargo.toml @@ -8,6 +8,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] axum = { version = "0.7", optional = true } +codee = "0.1" console_error_panic_hook = "0.1" console_log = "1" cfg-if = "1" diff --git a/examples/ssr/src/app.rs b/examples/ssr/src/app.rs index 3f25751..fed3766 100644 --- a/examples/ssr/src/app.rs +++ b/examples/ssr/src/app.rs @@ -4,7 +4,7 @@ use leptos::prelude::*; use leptos_meta::*; use leptos_router::*; use leptos_use::storage::{use_local_storage, use_local_storage_with_options, UseStorageOptions}; -use leptos_use::utils::FromToStringCodec; +use codee::string::FromToStringCodec; use leptos_use::{ use_color_mode_with_options, use_cookie_with_options, use_debounce_fn, use_event_listener, use_interval, use_intl_number_format, use_preferred_dark, use_timestamp, use_window, ColorMode, @@ -78,7 +78,7 @@ fn HomePage() -> impl IntoView { let (test_cookie, _) = use_cookie_with_options::( "test-cookie", - UseCookieOptions::::default() + UseCookieOptions::::default() .max_age(3000) .default_value(Some("Bogus string".to_owned())), ); diff --git a/examples/use_broadcast_channel/Cargo.toml b/examples/use_broadcast_channel/Cargo.toml index 6a95089..a7bf756 100644 --- a/examples/use_broadcast_channel/Cargo.toml +++ b/examples/use_broadcast_channel/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] leptos = { version = "0.6", features = ["nightly", "csr"] } +codee = "0.1" console_error_panic_hook = "0.1" console_log = "1" log = "0.4" diff --git a/examples/use_broadcast_channel/src/main.rs b/examples/use_broadcast_channel/src/main.rs index cbec90e..124f8bf 100644 --- a/examples/use_broadcast_channel/src/main.rs +++ b/examples/use_broadcast_channel/src/main.rs @@ -1,6 +1,6 @@ +use codee::string::FromToStringCodec; use leptos::prelude::*; use leptos_use::docs::demo_or_body; -use leptos_use::utils::FromToStringCodec; use leptos_use::{use_broadcast_channel, UseBroadcastChannelReturn}; #[component] @@ -46,8 +46,8 @@ fn Demo() -> impl IntoView {

"Received message: " {move || message().as_ref().unwrap().to_string()}

- -

"Error: " {move || format!("{:?}", error().as_ref().unwrap())}

+ +

"Error: " {move || error.with(|e| format!("{:?}", e.as_ref().unwrap()))}

} diff --git a/examples/use_clipboard/src/main.rs b/examples/use_clipboard/src/main.rs index d54195a..04d0108 100644 --- a/examples/use_clipboard/src/main.rs +++ b/examples/use_clipboard/src/main.rs @@ -1,6 +1,8 @@ use leptos::prelude::*; use leptos_use::docs::{demo_or_body, Note}; -use leptos_use::{use_clipboard, use_permission, UseClipboardReturn}; +use leptos_use::{ + use_clipboard_with_options, use_permission, UseClipboardOptions, UseClipboardReturn, +}; #[component] fn Demo() -> impl IntoView { @@ -11,7 +13,7 @@ fn Demo() -> impl IntoView { text, copied, copy, - } = use_clipboard(); + } = use_clipboard_with_options(UseClipboardOptions::default().read(true)); let permission_read = use_permission("clipboard-read"); let permission_write = use_permission("clipboard-write"); diff --git a/examples/use_cookie/Cargo.toml b/examples/use_cookie/Cargo.toml index 280824f..c645550 100644 --- a/examples/use_cookie/Cargo.toml +++ b/examples/use_cookie/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] leptos = { version = "0.6", features = ["nightly", "csr"] } +codee = "0.1" console_error_panic_hook = "0.1" console_log = "1" log = "0.4" diff --git a/examples/use_cookie/src/main.rs b/examples/use_cookie/src/main.rs index ffff3ff..75fb31c 100644 --- a/examples/use_cookie/src/main.rs +++ b/examples/use_cookie/src/main.rs @@ -1,7 +1,7 @@ use leptos::prelude::*; use leptos_use::docs::demo_or_body; use leptos_use::use_cookie; -use leptos_use::utils::FromToStringCodec; +use codee::string::FromToStringCodec; use rand::prelude::*; #[component] diff --git a/examples/use_storage/Cargo.toml b/examples/use_storage/Cargo.toml index 4a53065..5174789 100644 --- a/examples/use_storage/Cargo.toml +++ b/examples/use_storage/Cargo.toml @@ -4,14 +4,14 @@ version = "0.1.0" edition = "2021" [dependencies] -codee = { path = "../../../codee", features = ["json_serde"] } -leptos = { version = "0.6", features = ["nightly", "csr"] } +codee = { version = "0.1", features = ["json_serde"] } console_error_panic_hook = "0.1" console_log = "1" -log = "0.4" +leptos = { version = "0.6", features = ["nightly", "csr"] } leptos-use = { path = "../..", features = ["docs"] } -web-sys = "0.3" +log = "0.4" serde = "1.0.163" +web-sys = "0.3" [dev-dependencies] wasm-bindgen = "0.2" diff --git a/examples/use_storage/src/main.rs b/examples/use_storage/src/main.rs index 4ae5423..5cdb26e 100644 --- a/examples/use_storage/src/main.rs +++ b/examples/use_storage/src/main.rs @@ -1,7 +1,7 @@ use leptos::prelude::*; use leptos_use::docs::{demo_or_body, Note}; use leptos_use::storage::use_local_storage; -use leptos_use::utils::JsonCodec; +use codee::string::JsonSerdeCodec; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] @@ -25,8 +25,8 @@ impl Default for BananaState { #[component] fn Demo() -> impl IntoView { - let (state, set_state, reset) = use_local_storage::("banana-state"); - let (state2, _, _) = use_local_storage::("banana-state"); + let (state, set_state, reset) = use_local_storage::("banana-state"); + let (state2, _, _) = use_local_storage::("banana-state"); view! { ` where `T` is the web_sys element, /// * a `Signal` where `T` is the web_sys element, /// * a `Signal>` where `T` is the web_sys element, /// * a `NodeRef` -/// into a function. Used for example in [`use_event_listener`]. +/// +/// into a function. Used for example in [`fn@crate::use_event_listener`]. pub enum ElementMaybeSignal where T: Into + Clone + 'static, diff --git a/src/core/elements_maybe_signal.rs b/src/core/elements_maybe_signal.rs index d316944..931c14a 100644 --- a/src/core/elements_maybe_signal.rs +++ b/src/core/elements_maybe_signal.rs @@ -8,12 +8,14 @@ use std::marker::PhantomData; use std::ops::Deref; /// Used as an argument type to make it easily possible to pass either +/// /// * a `web_sys` element that implements `E` (for example `EventTarget` or `Element`), /// * an `Option` where `T` is the web_sys element, /// * a `Signal` where `T` is the web_sys element, /// * a `Signal>` where `T` is the web_sys element, /// * a `NodeRef` -/// into a function. Used for example in [`use_event_listener`]. +/// +/// into a function. Used for example in [`fn@crate::use_event_listener`]. pub enum ElementsMaybeSignal where T: Into + Clone + 'static, diff --git a/src/lib.rs b/src/lib.rs index 41112af..efcf708 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,7 +25,6 @@ mod is_none; mod is_ok; mod is_some; mod on_click_outside; -mod use_user_media; mod signal_debounced; mod signal_throttled; mod sync_signal; @@ -75,6 +74,7 @@ mod use_throttle_fn; mod use_timeout_fn; mod use_timestamp; mod use_to_string; +mod use_user_media; mod use_web_notification; mod use_websocket; mod use_window; @@ -91,7 +91,6 @@ pub use is_none::*; pub use is_ok::*; pub use is_some::*; pub use on_click_outside::*; -pub use use_user_media::*; pub use signal_debounced::*; pub use signal_throttled::*; pub use sync_signal::*; @@ -141,6 +140,7 @@ pub use use_throttle_fn::*; pub use use_timeout_fn::*; pub use use_timestamp::*; pub use use_to_string::*; +pub use use_user_media::*; pub use use_web_notification::*; pub use use_websocket::*; pub use use_window::*; diff --git a/src/on_click_outside.rs b/src/on_click_outside.rs index d3868c9..2099219 100644 --- a/src/on_click_outside.rs +++ b/src/on_click_outside.rs @@ -45,9 +45,9 @@ cfg_if! { if #[cfg(not(feature = "ssr"))] { /// ``` /// /// > This function uses [Event.composedPath()](https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath) -/// which is **not** supported by IE 11, Edge 18 and below. -/// If you are targeting these browsers, we recommend you to include -/// [this code snippet](https://gist.github.com/sibbng/13e83b1dd1b733317ce0130ef07d4efd) on your project. +/// > which is **not** supported by IE 11, Edge 18 and below. +/// > If you are targeting these browsers, we recommend you to include +/// > [this code snippet](https://gist.github.com/sibbng/13e83b1dd1b733317ce0130ef07d4efd) on your project. /// /// ## Excluding Elements /// diff --git a/src/storage/use_local_storage.rs b/src/storage/use_local_storage.rs index 0009439..7305606 100644 --- a/src/storage/use_local_storage.rs +++ b/src/storage/use_local_storage.rs @@ -3,14 +3,19 @@ use codee::{Decoder, Encoder}; use leptos::prelude::wrappers::read::Signal; use leptos::prelude::*; +#[allow(rustdoc::bare_urls)] /// Reactive [LocalStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage). /// -/// LocalStorage stores data in the browser with no expiration time. Access is given to all pages from the same origin (e.g., all pages from "https://example.com" share the same origin). While data doesn't expire the user can view, modify and delete all data stored. Browsers allow 5MB of data to be stored. +/// LocalStorage stores data in the browser with no expiration time. Access is given to all pages +/// from the same origin (e.g., all pages from "https://example.com" share the same origin). +/// While data doesn't expire the user can view, modify and delete all data stored. +/// Browsers allow 5MB of data to be stored. /// -/// This is contrast to [`use_session_storage`] which clears data when the page session ends and is not shared. +/// This is contrast to [`fn@crate::storage::use_session_storage`] which clears data when the page session ends and is not shared. /// /// ## Usage -/// See [`use_storage`] for more details on how to use. +/// +/// See [`fn@crate::storage::use_storage`] for more details on how to use. pub fn use_local_storage( key: impl AsRef, ) -> (Signal, WriteSignal, impl Fn() + Clone) diff --git a/src/storage/use_session_storage.rs b/src/storage/use_session_storage.rs index cce1d65..9fa2767 100644 --- a/src/storage/use_session_storage.rs +++ b/src/storage/use_session_storage.rs @@ -6,10 +6,10 @@ use leptos::prelude::*; /// /// SessionStorages stores data in the browser that is deleted when the page session ends. A page session ends when the browser closes the tab. Data is not shared between pages. While data doesn't expire the user can view, modify and delete all data stored. Browsers allow 5MB of data to be stored. /// -/// Use [`use_local_storage`] to store data that is shared amongst all pages with the same origin and persists between page sessions. +/// Use [`fn@crate::storage::use_local_storage`] to store data that is shared amongst all pages with the same origin and persists between page sessions. /// /// ## Usage -/// See [`use_storage`] for more details on how to use. +/// See [`fn@crate::storage::use_storage`] for more details on how to use. pub fn use_session_storage( key: impl AsRef, ) -> (Signal, WriteSignal, impl Fn() + Clone) diff --git a/src/storage/use_storage.rs b/src/storage/use_storage.rs index 9b709c8..a941eb3 100644 --- a/src/storage/use_storage.rs +++ b/src/storage/use_storage.rs @@ -24,15 +24,15 @@ const INTERNAL_STORAGE_EVENT: &str = "leptos-use-storage"; /// /// Pass a [`StorageType`] to determine the kind of key-value browser storage to use. /// The specified key is where data is stored. All values are stored as UTF-16 strings which -/// is then encoded and decoded via the given [`Codec`]. This value is synced with other calls using -/// the same key on the smae page and across tabs for local storage. +/// is then encoded and decoded via the given `*Codec`. This value is synced with other calls using +/// the same key on the same page and across tabs for local storage. /// See [`UseStorageOptions`] to see how behavior can be further customised. /// /// Values are (en)decoded via the given codec. You can use any of the string codecs or a -/// binary codec wrapped in [`Base64`]. +/// binary codec wrapped in `Base64`. /// /// > Please check [the codec chapter](https://leptos-use.rs/codecs.html) to see what codecs are -/// available and what feature flags they require. +/// > available and what feature flags they require. /// /// ## Example /// @@ -277,13 +277,17 @@ where let notify = Trigger::new(); // Refetch from storage. Keeps track of how many times we've been notified. Does not increment for calls to set_data - let notify_id = Memo::::new(move |prev| { - notify.track(); - match prev { - None => 1, // Avoid async fetch of initial value - Some(prev) => { - fetch_from_storage(); - prev + 1 + let notify_id = Memo::::new({ + let fetch_from_storage = fetch_from_storage.clone(); + + move |prev| { + notify.track(); + match prev { + None => 1, // Avoid async fetch of initial value + Some(prev) => { + fetch_from_storage(); + prev + 1 + } } } }); @@ -392,7 +396,7 @@ pub enum UseStorageError { ItemCodecError(CodecError), } -/// Options for use with [`use_local_storage_with_options`], [`use_session_storage_with_options`] and [`use_storage_with_options`]. +/// Options for use with [`fn@crate::storage::use_local_storage_with_options`], [`fn@crate::storage::use_session_storage_with_options`] and [`use_storage_with_options`]. #[derive(DefaultBuilder)] pub struct UseStorageOptions where diff --git a/src/use_breakpoints.rs b/src/use_breakpoints.rs index 33016ca..3b8e838 100644 --- a/src/use_breakpoints.rs +++ b/src/use_breakpoints.rs @@ -38,6 +38,7 @@ use std::hash::Hash; /// ## Breakpoints /// /// There are many predefined breakpoints for major UI frameworks. The following are provided. +/// /// * [`breakpoints_tailwind`] /// * [`breakpoints_bootstrap_v5`] /// * [`breakpoints_material`] @@ -108,7 +109,7 @@ use std::hash::Hash; /// /// ## Server-Side Rendering /// -/// Since internally this uses [`use_media_query`], which returns always `false` on the server, +/// Since internally this uses [`fn@crate::use_media_query`], which returns always `false` on the server, /// the returned methods also will return `false`. pub fn use_breakpoints( breakpoints: HashMap, @@ -277,7 +278,7 @@ impl UseBreakpointsReturn { /// Breakpoint keys for Tailwind V2 /// -/// See [https://tailwindcss.com/docs/breakpoints] +/// See #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum BreakpointsTailwind { Sm, @@ -289,7 +290,7 @@ pub enum BreakpointsTailwind { /// Breakpoint definitions for Tailwind V2 /// -/// See [https://tailwindcss.com/docs/breakpoints] +/// See pub fn breakpoints_tailwind() -> HashMap { HashMap::from([ (BreakpointsTailwind::Sm, 640), @@ -302,7 +303,7 @@ pub fn breakpoints_tailwind() -> HashMap { /// Breakpoint keys for Bootstrap V5 /// -/// See [https://getbootstrap.com/docs/5.0/layout/breakpoints] +/// See #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum BreakpointsBootstrapV5 { Sm, @@ -314,7 +315,7 @@ pub enum BreakpointsBootstrapV5 { /// Breakpoint definitions for Bootstrap V5 /// -/// See [https://getbootstrap.com/docs/5.0/layout/breakpoints] +/// pub fn breakpoints_bootstrap_v5() -> HashMap { HashMap::from([ (BreakpointsBootstrapV5::Sm, 576), @@ -327,7 +328,7 @@ pub fn breakpoints_bootstrap_v5() -> HashMap { /// Breakpoint keys for Material UI V5 /// -/// See [https://mui.com/material-ui/customization/breakpoints/] +/// See #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum BreakpointsMaterial { Xs, @@ -339,7 +340,7 @@ pub enum BreakpointsMaterial { /// Breakpoint definitions for Material UI V5 /// -/// See [https://mui.com/material-ui/customization/breakpoints/] +/// See pub fn breakpoints_material() -> HashMap { HashMap::from([ (BreakpointsMaterial::Xs, 1), @@ -352,7 +353,7 @@ pub fn breakpoints_material() -> HashMap { /// Breakpoint keys for Ant Design /// -/// See [https://ant.design/components/layout/#breakpoint-width] +/// See #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum BreakpointsAntDesign { Xs, @@ -365,7 +366,7 @@ pub enum BreakpointsAntDesign { /// Breakpoint definitions for Ant Design /// -/// See [https://ant.design/components/layout/#breakpoint-width] +/// See pub fn breakpoints_ant_design() -> HashMap { HashMap::from([ (BreakpointsAntDesign::Xs, 480), @@ -379,7 +380,7 @@ pub fn breakpoints_ant_design() -> HashMap { /// Breakpoint keys for Quasar V2 /// -/// See [https://quasar.dev/style/breakpoints] +/// See #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum BreakpointsQuasar { Xs, @@ -391,7 +392,7 @@ pub enum BreakpointsQuasar { /// Breakpoint definitions for Quasar V2 /// -/// See [https://quasar.dev/style/breakpoints] +/// See pub fn breakpoints_quasar() -> HashMap { HashMap::from([ (BreakpointsQuasar::Xs, 1), @@ -402,32 +403,32 @@ pub fn breakpoints_quasar() -> HashMap { ]) } -/// Breakpoint keys for Sematic UI +/// Breakpoint keys for Semantic UI /// -/// See [https://semantic-ui.com/elements/container.html] +/// See #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum BreakpointsSematic { +pub enum BreakpointsSemantic { Mobile, Tablet, SmallMonitor, LargeMonitor, } -/// Breakpoint definitions for Sematic UI +/// Breakpoint definitions for Semantic UI /// -/// See [https://semantic-ui.com/elements/container.html] -pub fn breakpoints_sematic() -> HashMap { +/// See +pub fn breakpoints_semantic() -> HashMap { HashMap::from([ - (BreakpointsSematic::Mobile, 1), - (BreakpointsSematic::Tablet, 768), - (BreakpointsSematic::SmallMonitor, 992), - (BreakpointsSematic::LargeMonitor, 1200), + (BreakpointsSemantic::Mobile, 1), + (BreakpointsSemantic::Tablet, 768), + (BreakpointsSemantic::SmallMonitor, 992), + (BreakpointsSemantic::LargeMonitor, 1200), ]) } /// Breakpoint keys for Master CSS /// -/// See [https://docs.master.co/css/breakpoints] +/// See #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum BreakpointsMasterCss { Xxxs, @@ -444,7 +445,7 @@ pub enum BreakpointsMasterCss { /// Breakpoint definitions for Master CSS /// -/// See [https://docs.master.co/css/breakpoints] +/// See pub fn breakpoints_master_css() -> HashMap { HashMap::from([ (BreakpointsMasterCss::Xxxs, 360), diff --git a/src/use_broadcast_channel.rs b/src/use_broadcast_channel.rs index 22fe06d..fbfa7f6 100644 --- a/src/use_broadcast_channel.rs +++ b/src/use_broadcast_channel.rs @@ -46,10 +46,10 @@ use wasm_bindgen::JsValue; /// ``` /// /// Values are (en)decoded via the given codec. You can use any of the string codecs or a -/// binary codec wrapped in [`Base64`]. +/// binary codec wrapped in `Base64`. /// /// > Please check [the codec chapter](https://leptos-use.rs/codecs.html) to see what codecs are -/// available and what feature flags they require. +/// > available and what feature flags they require. /// /// ``` /// # use leptos::prelude::*; diff --git a/src/use_clipboard.rs b/src/use_clipboard.rs index f812cd9..42ffc5a 100644 --- a/src/use_clipboard.rs +++ b/src/use_clipboard.rs @@ -12,7 +12,7 @@ use leptos::prelude::*; /// Without user permission, reading or altering the clipboard contents is not permitted. /// /// > This function requires `--cfg=web_sys_unstable_apis` to be activated as -/// [described in the wasm-bindgen guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html). +/// > [described in the wasm-bindgen guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html). /// /// ## Demo /// @@ -30,14 +30,14 @@ use leptos::prelude::*; /// /// view! { /// Your browser does not support Clipboard API

} /// > /// @@ -90,7 +90,7 @@ pub fn use_clipboard_with_options( }; if is_supported.get() && read { - let _ = use_event_listener(window(), copy, update_text.clone()); + let _ = use_event_listener(window(), copy, update_text); let _ = use_event_listener(window(), cut, update_text); } @@ -128,6 +128,8 @@ pub fn use_clipboard_with_options( pub struct UseClipboardOptions { /// When `true` event handlers are added so that the returned signal `text` is updated whenever the clipboard changes. /// Defaults to `false`. + /// + /// > Please note that clipboard changes are only detected when copying or cutting text inside the same document. read: bool, /// After how many milliseconds after copying should the returned signal `copied` be set to `false`? diff --git a/src/use_color_mode.rs b/src/use_color_mode.rs index d233475..fca38fc 100644 --- a/src/use_color_mode.rs +++ b/src/use_color_mode.rs @@ -37,7 +37,7 @@ use wasm_bindgen::JsCast; /// # } /// ``` /// -/// By default, it will match with users' browser preference using [`use_preferred_dark`] (a.k.a. `ColorMode::Auto`). +/// By default, it will match with users' browser preference using [`fn@crate::use_preferred_dark`] (a.k.a. `ColorMode::Auto`). /// When reading the signal, it will by default return the current color mode (`ColorMode::Dark`, `ColorMode::Light` or /// your custom modes `ColorMode::Custom("some-custom")`). The `ColorMode::Auto` variant can /// be included in the returned modes by enabling the `emit_auto` option and using [`use_color_mode_with_options`]. @@ -88,7 +88,7 @@ use wasm_bindgen::JsCast; /// /// To persist color mode in a cookie, use `use_cookie_with_options` and specify `.cookie_enabled(true)`. /// -/// > Note: To work with SSR you have to add the `axum` or `actix` feature as described in [`use_cookie`]. +/// > Note: To work with SSR you have to add the `axum` or `actix` feature as described in [`fn@crate::use_cookie`]. /// /// ```rust /// # use leptos::prelude::*; @@ -117,13 +117,13 @@ use wasm_bindgen::JsCast; /// /// If `cookie_enabled` is set to `true`, cookies will be used and if present this value will be used /// on the server as well as on the client. Please note that you have to add the `axum` or `actix` -/// feature as described in [`use_cookie`]. +/// feature as described in [`fn@crate::use_cookie`]. /// /// ## See also /// -/// * [`use_preferred_dark`] -/// * [`use_storage`] -/// * [`use_cookie`] +/// * [`fn@crate::use_preferred_dark`] +/// * [`fn@crate::storage::use_storage`] +/// * [`fn@crate::use_cookie`] pub fn use_color_mode() -> UseColorModeReturn { use_color_mode_with_options(UseColorModeOptions::default()) } @@ -427,7 +427,7 @@ where /// To get the default behaviour back you can call the provided `default_handler` function. /// It takes two parameters: /// - `mode: ColorMode`: The color mode to change to. - /// -`default_handler: Rc`: The default handler that would have been called if the `on_changed` handler had not been specified. + /// - `default_handler: Rc`: The default handler that would have been called if the `on_changed` handler had not been specified. on_changed: OnChangedFn, /// When provided, `useStorage` will be skipped. @@ -509,9 +509,9 @@ pub struct UseColorModeReturn { /// Main value setter signal of the color mode pub set_mode: WriteSignal, - /// Direct access to the returned signal of [`use_storage`] if enabled or [`UseColorModeOptions::storage_signal`] if provided + /// Direct access to the returned signal of [`fn@crate::storage::use_storage`] if enabled or [`UseColorModeOptions::storage_signal`] if provided pub store: Signal, - /// Direct write access to the returned signal of [`use_storage`] if enabled or [`UseColorModeOptions::storage_signal`] if provided + /// Direct write access to the returned signal of [`fn@crate::storage::use_storage`] if enabled or [`UseColorModeOptions::storage_signal`] if provided pub set_store: WriteSignal, /// Signal of the system's preferred color mode that you would get from a media query diff --git a/src/use_cookie.rs b/src/use_cookie.rs index e624d11..4aa1138 100644 --- a/src/use_cookie.rs +++ b/src/use_cookie.rs @@ -57,10 +57,10 @@ use std::rc::Rc; /// ``` /// /// Values are (en)decoded via the given codec. You can use any of the string codecs or a -/// binary codec wrapped in [`Base64`]. +/// binary codec wrapped in `Base64`. /// /// > Please check [the codec chapter](https://leptos-use.rs/codecs.html) to see what codecs are -/// available and what feature flags they require. +/// > available and what feature flags they require. /// /// ## Cookie attributes /// @@ -136,10 +136,6 @@ use std::rc::Rc; /// # view! {} /// # } /// ``` -/// -/// ## Create Your Own Custom Codec -/// -/// All you need to do is to implement the [`StringCodec`] trait together with `Default` and `Clone`. pub fn use_cookie(cookie_name: &str) -> (Signal>, WriteSignal>) where C: Encoder + Decoder, @@ -363,6 +359,8 @@ where #[cfg(feature = "ssr")] { if !readonly { + let cookie_name = cookie_name.to_owned(); + create_isomorphic_effect(move |_| { let value = cookie .with(|cookie| { @@ -373,20 +371,27 @@ where }) }) .flatten(); - jar.update_value(|jar| { - write_server_cookie( - cookie_name, - value, - jar, - max_age, - expires, - domain, - path, - same_site, - secure, - http_only, - ssr_set_cookie, - ) + + jar.update_value({ + let domain = domain.clone(); + let path = path.clone(); + let ssr_set_cookie = Rc::clone(&ssr_set_cookie); + + |jar| { + write_server_cookie( + &cookie_name, + value, + jar, + max_age, + expires, + domain, + path, + same_site, + secure, + http_only, + ssr_set_cookie, + ) + } }); }); } diff --git a/src/use_element_size.rs b/src/use_element_size.rs index 5bdfb86..0bc97fd 100644 --- a/src/use_element_size.rs +++ b/src/use_element_size.rs @@ -46,7 +46,7 @@ cfg_if! { if #[cfg(not(feature = "ssr"))] { /// /// ## See also /// -/// - [`use_resize_observer`] +/// - [`fn@crate::use_resize_observer`] pub fn use_element_size(target: El) -> UseElementSizeReturn where El: Into> + Clone, diff --git a/src/use_element_visibility.rs b/src/use_element_visibility.rs index e6abaaa..5240ef1 100644 --- a/src/use_element_visibility.rs +++ b/src/use_element_visibility.rs @@ -41,7 +41,7 @@ use leptos::prelude::wrappers::read::Signal; /// /// ## See also /// -/// * [`use_intersection_observer`] +/// * [`fn@crate::use_intersection_observer`] pub fn use_element_visibility(target: El) -> Signal where El: Into>, diff --git a/src/use_event_source.rs b/src/use_event_source.rs index dddf76b..1583c97 100644 --- a/src/use_event_source.rs +++ b/src/use_event_source.rs @@ -21,11 +21,10 @@ use thiserror::Error; /// ## Usage /// /// Values are decoded via the given decoder. You can use any of the string codecs or a -/// binary codec wrapped in [`Base64`]. +/// binary codec wrapped in `Base64`. /// /// > Please check [the codec chapter](https://leptos-use.rs/codecs.html) to see what codecs are -/// available and what feature flags they require. -/// +/// > available and what feature flags they require. /// /// ``` /// # use leptos::prelude::*; @@ -49,10 +48,6 @@ use thiserror::Error; /// # } /// ``` /// -/// ### Create Your Own Custom Codec -/// -/// All you need to do is to implement the [`StringCodec`] trait together with `Default` and `Clone`. -/// /// ### Named Events /// /// You can define named events when using `use_event_source_with_options`. diff --git a/src/use_intersection_observer.rs b/src/use_intersection_observer.rs index 7e3bcea..7aaaad5 100644 --- a/src/use_intersection_observer.rs +++ b/src/use_intersection_observer.rs @@ -53,7 +53,7 @@ cfg_if! { if #[cfg(not(feature = "ssr"))] { /// /// ## See also /// -/// * [`use_element_visibility`] +/// * [`fn@crate::use_element_visibility`] pub fn use_intersection_observer( target: El, callback: F, diff --git a/src/use_intl_number_format.rs b/src/use_intl_number_format.rs index 9fe9aca..3bc0a43 100644 --- a/src/use_intl_number_format.rs +++ b/src/use_intl_number_format.rs @@ -485,7 +485,7 @@ pub struct UseIntlNumberFormatOptions { /// The currency to use in currency formatting. /// Possible values are the ISO 4217 currency codes, such as "USD" for the US dollar, "EUR" for the euro, - /// or "CNY" for the Chinese RMB — see the [Current currency & funds code list](https://www.six-group.com/en/products-services/financial-information/data-standards.html#scrollTo=currency-codes. + /// or "CNY" for the Chinese RMB — see the [Current currency & funds code list](https://www.six-group.com/en/products-services/financial-information/data-standards.html#scrollTo=currency-codes). /// There is no default value; if the style is `Currency`, the currency property must be provided. #[builder(into)] currency: Option, diff --git a/src/use_media_query.rs b/src/use_media_query.rs index f3ad681..17e3c46 100644 --- a/src/use_media_query.rs +++ b/src/use_media_query.rs @@ -37,8 +37,8 @@ use std::rc::Rc; /// /// ## See also /// -/// * [`use_preferred_dark`] -/// * [`use_preferred_contrast`] +/// * [`fn@crate::use_preferred_dark`] +/// * [`fn@crate::use_preferred_contrast`] pub fn use_media_query(query: impl Into>) -> Signal { let query = query.into(); diff --git a/src/use_preferred_contrast.rs b/src/use_preferred_contrast.rs index 7882236..3d979b5 100644 --- a/src/use_preferred_contrast.rs +++ b/src/use_preferred_contrast.rs @@ -26,8 +26,8 @@ use std::fmt::Display; /// /// ## See also /// -/// * [`use_media_query`] -/// * [`use_preferred_dark`] +/// * [`fn@crate::use_media_query`] +/// * [`fn@crate::use_preferred_dark`] pub fn use_preferred_contrast() -> Signal { let is_more = use_media_query("(prefers-contrast: more)"); let is_less = use_media_query("(prefers-contrast: less)"); diff --git a/src/use_preferred_dark.rs b/src/use_preferred_dark.rs index b6dd60a..0db93fa 100644 --- a/src/use_preferred_dark.rs +++ b/src/use_preferred_dark.rs @@ -24,8 +24,8 @@ use leptos::prelude::*; /// /// ## See also /// -/// * [`use_media_query`] -/// * [`use_preferred_contrast`] +/// * [`fn@crate::use_media_query`] +/// * [`fn@crate::use_preferred_contrast`] pub fn use_preferred_dark() -> Signal { use_media_query("(prefers-color-scheme: dark)") } diff --git a/src/use_raf_fn.rs b/src/use_raf_fn.rs index 45fce03..0cbb66a 100644 --- a/src/use_raf_fn.rs +++ b/src/use_raf_fn.rs @@ -90,7 +90,7 @@ pub fn use_raf_fn_with_options( let previous_frame_timestamp = Cell::new(0.0_f64); move |timestamp: f64| { - if !is_active.get_untracked() { + if !is_active.try_get_untracked().unwrap_or_default() { return; } @@ -167,6 +167,6 @@ pub struct UseRafFnCallbackArgs { /// Time elapsed between this and the last frame. pub delta: f64, - /// Time elapsed since the creation of the web page. See [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp#the_time_origin Time origin). + /// Time elapsed since the creation of the web page. See [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp#the_time_origin) Time origin. pub timestamp: f64, } diff --git a/src/use_resize_observer.rs b/src/use_resize_observer.rs index 34bb0c2..04017af 100644 --- a/src/use_resize_observer.rs +++ b/src/use_resize_observer.rs @@ -51,7 +51,7 @@ cfg_if! { if #[cfg(not(feature = "ssr"))] { /// /// ## See also /// -/// - [`use_element_size`] +/// * [`fn@crate::use_element_size`] pub fn use_resize_observer( target: El, // TODO : multiple elements? callback: F, diff --git a/src/use_timestamp.rs b/src/use_timestamp.rs index ecfa7fd..d05639c 100644 --- a/src/use_timestamp.rs +++ b/src/use_timestamp.rs @@ -154,10 +154,10 @@ pub struct UseTimestampOptions { /// Interval type for [`UseTimestampOptions`]. #[derive(Copy, Clone, Eq, PartialEq, Debug)] pub enum TimestampInterval { - /// use [`use_raf_fn`] for updating the timestamp + /// use [`fn@crate::use_raf_fn`] for updating the timestamp RequestAnimationFrame, - /// use [`use_interval_fn`] for updating the timestamp + /// use [`fn@crate::use_interval_fn`] for updating the timestamp Interval(u64), } diff --git a/src/use_websocket.rs b/src/use_websocket.rs index 51b657f..37a6a26 100644 --- a/src/use_websocket.rs +++ b/src/use_websocket.rs @@ -16,6 +16,7 @@ use js_sys::Array; use wasm_bindgen::prelude::*; use web_sys::{BinaryType, CloseEvent, Event, MessageEvent, WebSocket}; +#[allow(rustdoc::bare_urls)] /// Creating and managing a [Websocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) connection. /// /// ## Demo @@ -27,7 +28,7 @@ use web_sys::{BinaryType, CloseEvent, Event, MessageEvent, WebSocket}; /// Values are (en)decoded via the given codec. You can use any of the codecs, string or binary. /// /// > Please check [the codec chapter](https://leptos-use.rs/codecs.html) to see what codecs are -/// available and what feature flags they require. +/// > available and what feature flags they require. /// /// ``` /// # use leptos::prelude::*; @@ -247,6 +248,7 @@ where } /// Version of [`use_websocket`] that takes `UseWebSocketOptions`. See [`use_websocket`] for how to use. +#[allow(clippy::type_complexity)] pub fn use_websocket_with_options( url: &str, options: UseWebSocketOptions< diff --git a/src/use_window.rs b/src/use_window.rs index 84e1c57..a70926b 100644 --- a/src/use_window.rs +++ b/src/use_window.rs @@ -54,7 +54,7 @@ impl UseWindow { navigator(&self) -> Option ); - /// Returns the same as [`use_document`]. + /// Returns the same as [`fn@use_document`]. #[inline(always)] pub fn document(&self) -> UseDocument { use_document() diff --git a/src/utils/use_derive_signal.rs b/src/utils/use_derive_signal.rs index 1e7e9c2..639d100 100644 --- a/src/utils/use_derive_signal.rs +++ b/src/utils/use_derive_signal.rs @@ -1,6 +1,6 @@ /// Macro to easily create helper functions that derive a signal using a piece of code. -/// -/// See [`is_ok`] or [`use_to_string`] as examples. +/// +/// See [`fn@crate::is_ok`] or [`fn@crate::use_to_string`] as examples. #[macro_export] macro_rules! use_derive_signal { ( diff --git a/src/watch_debounced.rs b/src/watch_debounced.rs index c069fcf..61491cd 100644 --- a/src/watch_debounced.rs +++ b/src/watch_debounced.rs @@ -34,7 +34,7 @@ use leptos::prelude::*; /// /// Please note that if the current component is cleaned up before the debounced callback is called, the debounced callback will not be called. /// -/// There's also `watch_debounced_with_options` where you can specify the other watch options (except `filter`). +/// There's also [`watch_debounced_with_options`] where you can specify the other watch options (except `filter`). /// /// ``` /// # use leptos::prelude::*; @@ -70,8 +70,8 @@ use leptos::prelude::*; /// /// ## See also /// -/// * [`watch`] -/// * [`watch_throttled`] +/// * `leptos::watch` +/// * [`fn@crate::watch_throttled`] pub fn watch_debounced(deps: DFn, callback: CFn, ms: f64) -> impl Fn() + Clone where DFn: Fn() -> W + 'static, @@ -82,7 +82,8 @@ where watch_with_options(deps, callback, WatchOptions::default().debounce(ms)) } -/// Version of `watch_debounced` that accepts `WatchDebouncedOptions`. See [`watch_debounced`] for how to use. +/// Version of `watch_debounced` that accepts `WatchDebouncedOptions`. +/// See [`watch_debounced`] for how to use. pub fn watch_debounced_with_options( deps: DFn, callback: CFn, diff --git a/src/watch_pausable.rs b/src/watch_pausable.rs index 07171a2..81ae28b 100644 --- a/src/watch_pausable.rs +++ b/src/watch_pausable.rs @@ -52,7 +52,7 @@ use leptos::prelude::*; /// /// ## See also /// -/// * [`watch`] +/// * `leptos::watch` pub fn watch_pausable( deps: DFn, callback: CFn, diff --git a/src/watch_throttled.rs b/src/watch_throttled.rs index df64855..fc71f46 100644 --- a/src/watch_throttled.rs +++ b/src/watch_throttled.rs @@ -1,7 +1,7 @@ use crate::{watch_with_options, ThrottleOptions, WatchOptions}; use default_struct_builder::DefaultBuilder; -/// A throttled version of [`watch`]. +/// A throttled version of `leptos::watch`. /// /// ## Demo /// @@ -69,8 +69,8 @@ use default_struct_builder::DefaultBuilder; /// /// ## See also /// -/// * [`watch`] -/// * [`watch_debounced`] +/// * `leptos::watch` +/// * [`fn@crate::watch_debounced`] pub fn watch_throttled(deps: DFn, callback: CFn, ms: f64) -> impl Fn() + Clone where DFn: Fn() -> W + 'static, @@ -81,7 +81,7 @@ where watch_with_options(deps, callback, WatchOptions::default().throttle(ms)) } -/// Version of `watch_throttled` that accepts `WatchThrottledOptions`. See [`watch_throttled`] for how to use. +/// Version of [`fn@watch_throttled`] that accepts `WatchThrottledOptions`. See [`watch_throttled`] for how to use. pub fn watch_throttled_with_options( deps: DFn, callback: CFn, diff --git a/src/watch_with_options.rs b/src/watch_with_options.rs index 86e30ca..690271b 100644 --- a/src/watch_with_options.rs +++ b/src/watch_with_options.rs @@ -38,7 +38,8 @@ use std::rc::Rc; /// /// ## Filters /// -/// The callback can be throttled or debounced. Please see [`watch_throttled`] and [`watch_debounced`] for details. +/// The callback can be throttled or debounced. Please see [`fn@crate::watch_throttled`] +/// and [`fn@crate::watch_debounced`] for details. /// /// ``` /// # use leptos::prelude::*; @@ -86,10 +87,8 @@ use std::rc::Rc; /// /// ## See also /// -/// * [`watch_throttled`] -/// * [`watch_debounced`] - -/// Version of `watch` that accepts `WatchOptions`. See [`watch`] for how to use. +/// * [`fn@crate::watch_throttled`] +/// * [`fn@crate::watch_debounced`] pub fn watch_with_options( deps: DFn, callback: CFn, diff --git a/src/whenever.rs b/src/whenever.rs index db83c1d..6cc3722 100644 --- a/src/whenever.rs +++ b/src/whenever.rs @@ -20,7 +20,7 @@ use crate::{watch_with_options, WatchOptions}; /// /// ### Callback Function /// -/// Same as [`watch`], the callback will be called with `callback(input, prev_input, prev_return)`. +/// Same as [`fn@crate::watch`], the callback will be called with `callback(input, prev_input, prev_return)`. /// /// ``` /// # use leptos::prelude::*; @@ -39,7 +39,7 @@ use crate::{watch_with_options, WatchOptions}; /// /// ### Computed /// -/// Same as [`watch`], you can pass a getter function to calculate on each change. +/// Same as [`fn@crate::watch`], you can pass a getter function to calculate on each change. /// /// ``` /// # use leptos::prelude::*; @@ -59,7 +59,7 @@ use crate::{watch_with_options, WatchOptions}; /// /// ### Options /// -/// Options and defaults are same as [`watch_with_options`]. +/// Options and defaults are same as [`fn@watch_with_options`]. /// /// ``` /// # use leptos::prelude::*;