use copypasta::{ClipboardContext, ClipboardProvider};
use dioxus::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 = ClipboardContext::new().ok();
provide_root_context(Signal::new(clipboard))
}
};
UseClipboard { clipboard }
}