dioxus_std/clipboard/
use_clipboard.rs

1//! Provides a clipboard abstraction to access the target system's clipboard.
2
3use copypasta::{ClipboardContext, ClipboardProvider};
4use dioxus::prelude::*;
5
6#[derive(Debug, PartialEq, Clone)]
7pub enum ClipboardError {
8    FailedToRead,
9    FailedToSet,
10    NotAvailable,
11}
12
13/// Handle to access the ClipboardContext.
14#[derive(Clone, Copy, PartialEq)]
15pub struct UseClipboard {
16    clipboard: Signal<Option<ClipboardContext>>,
17}
18
19impl UseClipboard {
20    // Read from the clipboard
21    pub fn get(&mut self) -> Result<String, ClipboardError> {
22        self.clipboard
23            .write()
24            .as_mut()
25            .ok_or(ClipboardError::NotAvailable)?
26            .get_contents()
27            .map_err(|_| ClipboardError::FailedToRead)
28    }
29
30    // Write to the clipboard
31    pub fn set(&mut self, contents: String) -> Result<(), ClipboardError> {
32        self.clipboard
33            .write()
34            .as_mut()
35            .ok_or(ClipboardError::NotAvailable)?
36            .set_contents(contents)
37            .map_err(|_| ClipboardError::FailedToSet)
38    }
39}
40
41/// Access the clipboard.
42///
43/// # Examples
44///
45/// ```ignore
46/// use dioxus_std::clipboard::use_clipboard;
47///
48/// // Get a handle to the clipboard
49/// let mut clipboard = use_clipboard();
50///
51/// // Read the clipboard content
52/// if let Ok(content) = clipboard.get() {
53///     println!("{}", content);
54/// }
55///
56/// // Write to the clipboard
57/// clipboard.set("Hello, Dioxus!".to_string());;
58///  
59/// ```
60pub fn use_clipboard() -> UseClipboard {
61    let clipboard = match try_consume_context() {
62        Some(rt) => rt,
63        None => {
64            let clipboard = ClipboardContext::new().ok();
65            provide_root_context(Signal::new(clipboard))
66        }
67    };
68    UseClipboard { clipboard }
69}