use copypasta::{ClipboardContext, ClipboardProvider};
use dioxus::{core::provide_root_context, prelude::*};
#[derive(Debug, PartialEq, Clone)]
pub enum ClipboardError {
FailedToRead,
FailedToSet,
NotAvailable,
}
#[derive(Clone, Copy, PartialEq)]
pub struct UseClipboard {
clipboard: Signal<Option<ClipboardContext>>,
}
impl UseClipboard {
pub fn get(&mut self) -> Result<String, ClipboardError> {
self.clipboard
.write()
.as_mut()
.ok_or(ClipboardError::NotAvailable)?
.get_contents()
.map_err(|_| ClipboardError::FailedToRead)
}
pub fn set(&mut self, contents: String) -> Result<(), ClipboardError> {
self.clipboard
.write()
.as_mut()
.ok_or(ClipboardError::NotAvailable)?
.set_contents(contents)
.map_err(|_| ClipboardError::FailedToSet)
}
}
pub fn use_clipboard() -> UseClipboard {
let clipboard = match try_consume_context() {
Some(rt) => rt,
None => {
let clipboard_signal =
Signal::new_in_scope(ClipboardContext::new().ok(), ScopeId::ROOT);
provide_root_context(clipboard_signal)
}
};
UseClipboard { clipboard }
}