notan_web 0.14.0

Provides a web/wasm32 backend for Notan
Documentation
#![cfg(feature = "clipboard")]
#![cfg(web_sys_unstable_apis)]

use crate::utils::window_add_event_listener;
use crate::window::WebWindowBackend;
use notan_core::events::Event;
use wasm_bindgen::prelude::*;
use web_sys::ClipboardEvent;

#[derive(Default)]
pub struct ClipboardCallbacks {
    on_cut: Option<Closure<dyn FnMut(ClipboardEvent)>>,
    on_copy: Option<Closure<dyn FnMut(ClipboardEvent)>>,
    on_paste: Option<Closure<dyn FnMut(ClipboardEvent)>>,
}

pub fn enable_clipboard(win: &mut WebWindowBackend) -> Result<(), String> {
    let add_evt_copy = win.add_event_fn();
    let add_evt_cut = win.add_event_fn();
    let add_evt_paste = win.add_event_fn();
    let callbacks = &mut win.clipboard_callbacks;
    callbacks.on_copy = Some(window_add_event_listener(
        "copy",
        move |_: ClipboardEvent| {
            add_evt_copy(Event::Copy);
        },
    )?);

    callbacks.on_cut = Some(window_add_event_listener(
        "cut",
        move |_: ClipboardEvent| {
            add_evt_cut(Event::Cut);
        },
    )?);

    callbacks.on_paste = Some(window_add_event_listener(
        "paste",
        move |e: ClipboardEvent| {
            if let Some(data) = e.clipboard_data() {
                if let Ok(text) = data.get_data("text") {
                    let text = text.replace("\r\n", "\n");
                    if !text.is_empty() {
                        add_evt_paste(Event::Paste(text));
                    }
                }
            }
        },
    )?);

    Ok(())
}

pub fn set_clipboard_text(text: &str) {
    if let Some(window) = web_sys::window() {
        let clipboard = window.navigator().clipboard();
        let promise = clipboard.write_text(text);
        let future = wasm_bindgen_futures::JsFuture::from(promise);
        let future = async move {
            if let Err(err) = future.await {
                log::error!("failed to set text on clipboard: {:?}", err);
            }
        };
        wasm_bindgen_futures::spawn_local(future);
    }
}