diff --git a/Cargo.lock b/Cargo.lock index 510e8b4..f8b8667 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,7 +22,6 @@ dependencies = [ "serde", "serde-wasm-bindgen", "thiserror 2.0.12", - "tokio", "wasm-bindgen", "web-sys", ] diff --git a/crates/aceditor/Cargo.toml b/crates/aceditor/Cargo.toml index f50062b..15b054f 100644 --- a/crates/aceditor/Cargo.toml +++ b/crates/aceditor/Cargo.toml @@ -8,6 +8,5 @@ js-sys = "0.3.77" serde = { version = "1.0.219", features = ["derive"] } serde-wasm-bindgen = "0.6.5" thiserror = "2.0.12" -tokio = { version = "1.45.0", features = ["sync"] } wasm-bindgen = "0.2.100" web-sys = { version = "0.3.77", features = ["HtmlElement"] } diff --git a/crates/aceditor/src/lib.rs b/crates/aceditor/src/lib.rs index 1d50d80..d5b9643 100644 --- a/crates/aceditor/src/lib.rs +++ b/crates/aceditor/src/lib.rs @@ -1,5 +1,3 @@ -use std::sync::Arc; - use js_sys::{Object, Reflect}; use serde::{Deserialize, Serialize}; use wasm_bindgen::{JsCast, JsValue, prelude::Closure}; @@ -7,19 +5,12 @@ use wasm_bindgen::{JsCast, JsValue, prelude::Closure}; // mod bindgen { use js_sys::Object; - use wasm_bindgen::{ - JsValue, - prelude::{Closure, wasm_bindgen}, - }; + use wasm_bindgen::{JsValue, prelude::wasm_bindgen}; #[wasm_bindgen] extern "C" { #[wasm_bindgen(js_namespace = ace, js_name = edit, catch)] pub fn edit(element: &str, options: Option) -> Result; - - #[wasm_bindgen(js_namespace = ["ace", "config"], js_name = loadModule)] - pub fn load_module(module: &str, callback: &Closure); - #[wasm_bindgen(js_namespace = ace, js_name = require, catch)] pub fn require(module: &str) -> Result; } @@ -32,7 +23,7 @@ mod bindgen { pub fn set_theme(this: &Editor, theme: &str) -> Result<(), JsValue>; #[wasm_bindgen(method, js_name = setKeyboardHandler, catch)] - pub fn set_keyboard_handler(this: &Editor, handler: &str) -> Result<(), JsValue>; + pub fn set_keyboard_handler(this: &Editor, handler: JsValue) -> Result<(), JsValue>; #[wasm_bindgen(method, js_name = getValue)] pub fn get_value(this: &Editor) -> String; @@ -67,8 +58,13 @@ impl EditorOptionsBuilder { self } - pub fn keyboard(mut self, value: &str) -> Self { - self.0.keyboard_handler = value.into(); + pub fn keyboard(mut self, value: Option<&str>) -> Self { + let value = if let Some(value) = value { + JsValue::from(value) + } else { + JsValue::null() + }; + self.0.keyboard_handler = value; self } @@ -87,7 +83,8 @@ impl EditorOptionsBuilder { pub struct EditorOptions { pub mode: String, pub theme: String, - pub keyboard_handler: String, + #[serde(with = "serde_wasm_bindgen::preserve")] + pub keyboard_handler: JsValue, pub value: String, } @@ -158,23 +155,19 @@ impl Editor { self.js.set_theme(theme).map_err(EditorError::SetTheme) } - pub fn set_keyboard_handler(&self, handler: &str) -> Result<()> { + pub fn set_keyboard_handler(&self, handler: Option<&str>) -> Result<()> { + let handler = if let Some(handler) = handler { + JsValue::from(handler) + } else { + JsValue::null() + }; + self.js .set_keyboard_handler(handler) .map_err(EditorError::SetKeyboardHandler) } - pub async fn define_vim_w(callback: Box) -> Result<()> { - let notify = Arc::new(tokio::sync::Notify::new()); - let waiter = Arc::clone(¬ify); - - let load_module = Closure::once(move |_: JsValue| { - notify.notify_waiters(); - }); - - bindgen::load_module("ace/keyboard/vim", &load_module); - waiter.notified().await; - + pub fn define_vim_w(callback: Box) -> Result<()> { let value = bindgen::require("ace/keyboard/vim").map_err(EditorError::DefineEx)?; let define_ex = Reflect::get(&value, &JsValue::from("CodeMirror")) diff --git a/index.html b/index.html index b09eebe..89c5d06 100644 --- a/index.html +++ b/index.html @@ -17,6 +17,11 @@ + + + + + diff --git a/src/app/config_menu.rs b/src/app/config_menu.rs index d672e49..13eea85 100644 --- a/src/app/config_menu.rs +++ b/src/app/config_menu.rs @@ -36,7 +36,9 @@ pub fn ConfigMenu() -> impl IntoView { let select = HtmlSelectElement::from(JsValue::from(target)); state.editor_config().write().keyboard = select.value(); if let Some(Err(err)) = state.editor().read().as_ref().map(|editor| { - editor.set_keyboard_handler(&format!("ace/keyboard/{}", select.value())) + let keyboard = select.value(); + let handler = (keyboard != "ace").then_some(format!("ace/keyboard/{keyboard}")); + editor.set_keyboard_handler(handler.as_deref()) }) { state .last_error() diff --git a/src/app/editor.rs b/src/app/editor.rs index 288b222..607ac5a 100644 --- a/src/app/editor.rs +++ b/src/app/editor.rs @@ -3,7 +3,6 @@ use istyles::istyles; use leptos::prelude::*; use reactive_stores::Store; use wasm_bindgen::{JsCast, prelude::Closure}; -use wasm_bindgen_futures::spawn_local; use web_sys::UrlSearchParams; use crate::{ @@ -25,16 +24,20 @@ pub fn Editor() -> impl IntoView { let params = UrlSearchParams::new_with_str(&search).ok()?; params.get("code") }; + let opt = EditorOptionsBuilder::default() .mode("ace/mode/sql") .theme(&format!( "ace/theme/{}", state.editor_config().read_untracked().theme )) - .keyboard(&format!( - "ace/keyboard/{}", - state.editor_config().read_untracked().keyboard - )) + .keyboard( + { + let keyboard = &state.editor_config().read_untracked().keyboard; + (keyboard != "ace").then_some(format!("ace/keyboard/{keyboard}")) + } + .as_deref(), + ) .value(&shared_code().unwrap_or_else(|| state.sql().get_untracked())) .build(); @@ -59,13 +62,11 @@ pub fn Editor() -> impl IntoView { .set(Some(SQLightError::new_ace_editor(err))), } - spawn_local(async move { - if let Err(err) = aceditor::Editor::define_vim_w(execute(state)).await { - state - .last_error() - .set(Some(SQLightError::new_ace_editor(err))); - } - }); + if let Err(err) = aceditor::Editor::define_vim_w(execute(state)) { + state + .last_error() + .set(Some(SQLightError::new_ace_editor(err))); + } }); view! {