use async_trait::async_trait; use dioxus_core::ScopeId; use dioxus_html::prelude::{EvalError, EvalProvider, Evaluator}; use generational_box::{AnyStorage, GenerationalBox, UnsyncStorage}; use std::rc::Rc; /// Provides the SSREvalProvider through [`cx.provide_context`]. pub fn init_eval() { let provider: Rc = Rc::new(SSREvalProvider {}); ScopeId::ROOT.provide_context(provider); } /// Reprents the ssr-target's provider of evaluators. pub struct SSREvalProvider; impl EvalProvider for SSREvalProvider { fn new_evaluator(&self, _: String) -> Result>, EvalError> { let owner = UnsyncStorage::owner(); Ok(owner.insert(Box::new(SSREvaluator) as Box)) } } /// Represents a ssr-target's JavaScript evaluator. pub struct SSREvaluator; // In ssr rendering we never run or resolve evals. #[async_trait(?Send)] impl Evaluator for SSREvaluator { /// Sends a message to the evaluated JavaScript. fn send(&self, _el: serde_json::Value) -> Result<(), EvalError> { Ok(()) } fn poll_recv( &mut self, _cx: &mut std::task::Context<'_>, ) -> std::task::Poll> { std::task::Poll::Pending } fn poll_join( &mut self, _cx: &mut std::task::Context<'_>, ) -> std::task::Poll> { std::task::Poll::Pending } }