From 9b72e44db4044433633fd6390e3fb86d9d05a99e Mon Sep 17 00:00:00 2001 From: Danielle Huisman Date: Sat, 1 Jun 2024 10:38:46 +0200 Subject: [PATCH] WIP --- Cargo.toml | 1 + .../leptos/context/src/create_context.rs | 81 ++++++++++++++++--- packages/primitives/leptos/context/src/lib.rs | 2 +- packages/primitives/leptos/popper/Cargo.toml | 2 + .../primitives/leptos/popper/src/popper.rs | 20 ++++- 5 files changed, 92 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a944f087..353e1d19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,5 +19,6 @@ console_log = "1.0.0" console_error_panic_hook = "0.1.7" leptos = { version = "0.6.12" } log = "0.4.21" +once_cell = "1.19.0" tailwind_fuse = { version = "0.3.0", features = ["variant"] } web-sys = "0.3.69" diff --git a/packages/primitives/leptos/context/src/create_context.rs b/packages/primitives/leptos/context/src/create_context.rs index 420826c3..e3c7598a 100644 --- a/packages/primitives/leptos/context/src/create_context.rs +++ b/packages/primitives/leptos/context/src/create_context.rs @@ -1,14 +1,73 @@ -// pub fn create_context( -// root_component_name: &str, -// default_context: Option, -// ) { -// } +use std::{iter::Map, marker::PhantomData}; -// pub struct CreateScope {} +pub fn create_context( + root_component_name: &str, + default_context: Option, +) { + // TODO +} -// pub fn create_context_scope(scope_name: &str, create_context_scope_deps: Option>) { -// } +pub struct CreateScope {} -// fn compose_context_scopes(scopes: Vec) -> CreateScope { -// CreateScope {} -// } +pub struct ContextScope { + default_contexts: Vec, +} + +impl ContextScope { + pub fn new() -> Self { + ContextScope { + default_contexts: vec![], + } + } + + pub fn create_context( + &self, + root_component_name: &str, + default_context: Option, + ) -> Context { + Context::new() + } + + pub fn create_scope(&self) {} +} + +impl Default for ContextScope { + fn default() -> Self { + Self::new() + } +} + +pub struct Context { + context_value_type: PhantomData, +} + +impl Context { + pub fn new() -> Self { + Context { + context_value_type: PhantomData, + } + } + + pub fn provider(&self) {} + + pub fn use_context(&self, consumer_name: &str, scope: Option>) {} +} + +impl Default for Context { + fn default() -> Self { + Self::new() + } +} + +pub type Scope = Map; + +pub fn create_context_scope( + scope_name: &str, + create_context_scope_deps: Option>, +) -> ContextScope { + ContextScope::new() +} + +fn compose_context_scopes(scopes: Vec) -> CreateScope { + CreateScope {} +} diff --git a/packages/primitives/leptos/context/src/lib.rs b/packages/primitives/leptos/context/src/lib.rs index 01d9501f..55a677ab 100644 --- a/packages/primitives/leptos/context/src/lib.rs +++ b/packages/primitives/leptos/context/src/lib.rs @@ -1,3 +1,3 @@ mod create_context; -// pub use create_context::*; +pub use create_context::*; diff --git a/packages/primitives/leptos/popper/Cargo.toml b/packages/primitives/leptos/popper/Cargo.toml index 636ce506..9ea3f264 100644 --- a/packages/primitives/leptos/popper/Cargo.toml +++ b/packages/primitives/leptos/popper/Cargo.toml @@ -11,7 +11,9 @@ version.workspace = true [dependencies] floating-ui-leptos = "0.0.9" leptos.workspace = true +once_cell.workspace = true radix-leptos-arrow = { path = "../arrow", version = "0.0.1" } +radix-leptos-context = { path = "../context", version = "0.0.1" } radix-leptos-use-size = { path = "../use-size", version = "0.0.1" } serde = "1.0.198" serde_json = "1.0.116" diff --git a/packages/primitives/leptos/popper/src/popper.rs b/packages/primitives/leptos/popper/src/popper.rs index 578b65df..caca71c9 100644 --- a/packages/primitives/leptos/popper/src/popper.rs +++ b/packages/primitives/leptos/popper/src/popper.rs @@ -10,7 +10,9 @@ use leptos::{ html::{AnyElement, Div}, *, }; +use once_cell::sync::Lazy; use radix_leptos_arrow::Arrow as ArrowPrimitive; +use radix_leptos_context::{create_context_scope, Context, ContextScope, Scope}; use radix_leptos_use_size::use_size; use serde::{Deserialize, Serialize}; use wasm_bindgen::JsCast; @@ -54,13 +56,22 @@ pub enum UpdatePositionStrategy { Always, } +const POPPER_NAME: &str = "Popper"; +static POPPER_CONTEXT_SCOPE: Lazy> = + Lazy::new(|| create_context_scope(POPPER_NAME, None)); +static POPPER_CONTEXT: Lazy> = + Lazy::new(|| POPPER_CONTEXT_SCOPE.create_context(POPPER_NAME, None)); + #[derive(Clone)] -struct PopperContextValue { +pub struct PopperContextValue { pub anchor_ref: NodeRef
, } #[component] -pub fn Popper(children: Children) -> impl IntoView { +pub fn Popper( + #[prop(into, optional)] __scope_popper: MaybeProp>, + children: Children, +) -> impl IntoView { let anchor_ref = create_node_ref::
(); let context_value = PopperContextValue { anchor_ref }; @@ -72,11 +83,16 @@ pub fn Popper(children: Children) -> impl IntoView { } } +const ANCHOR_NAME: &str = "PopperAnchor"; + #[component] pub fn PopperAnchor( + #[prop(into, optional)] __scope_popper: MaybeProp>, #[prop(attrs)] attrs: Vec<(&'static str, Attribute)>, children: Children, ) -> impl IntoView { + let context = POPPER_CONTEXT.use_context(ANCHOR_NAME, __scope_popper.get()); + let context: PopperContextValue = expect_context(); let anchor_ref = context.anchor_ref;