WIP: Dioxus-webview

This commit is contained in:
Jonathan Kelley committed 2021-01-21 03:22:08 -05:00
1 parent 28ac37a8b2
commit 9c01736895
9 files changed
+113 -20

No files matched your search

+1
View File
@@ -9,6 +9,7 @@ members = [
"packages/core-macro",
"packages/router",
"packages/ssr",
"packages/webview",
# "packages/macro",
# TODO @Jon, share the validation code
# "packages/web",
+4 -1
View File
@@ -12,7 +12,10 @@ fn main() {
/// This macro makes writing functional components elegant, similar to how Rocket parses URIs.
///
/// You don't actually *need* this macro to be productive, but it makes life easier, and components cleaner.
/// This approach also integrates well with tools like Rust-Analyzer
/// This approach also integrates well with tools like Rust-Analyzer.
///
/// Notice that Context is normally generic over props, but RA doesn't care when in proc-macro mode.
/// Also notice that ctx.props still works like you would expect, so migrating to the macro is easy.
#[fc]
fn example(ctx: &Context, name: String) -> VNode {
html! { <div> "Hello, {name}!" </div> }
+2 -1
View File
@@ -76,8 +76,9 @@ async fn fibsum(req: Request<()>) -> tide::Result<tide::Response> {
<div class="font-medium text-6xl">
{format!("{}",fib_n)}
</div>
</div>
// Try another
<div class="flex flex-row justify-between mt-6">
<a href=format!("http://localhost:8080/fib/{}", other_fib_to_try) class="underline">
{"Click to try another number"}
+25 -18
View File
@@ -46,8 +46,6 @@ fn function_component_impl(
// }
let ret_type = quote_spanned!(return_type.span()=> VNode);
// let ret_type = quote_spanned!(return_type.span()=> ::VNode);
// let ret_type = quote_spanned!(return_type.span()=> ::yew::html::Html);
let quoted = quote! {
#[doc(hidden)]
@@ -69,22 +67,6 @@ fn function_component_impl(
}
#[allow(non_snake_case)]
pub use __component_blah::component as #function_name;
// #vis struct #function_name;
// impl ::yew_functional::FunctionProvider for #function_name {
// type TProps = #props_type;
// fn run(#arg) -> #ret_type {
// #block
// }
// }
// #(#attrs)*
// #vis type #component_name = ::yew_functional::FunctionComponent<#function_name>;
};
// let quoted = quote! {
// #[doc(hidden)]
@@ -149,6 +131,31 @@ impl Parse for FunctionComponent {
// Extract the "context" object
let props_type = validate_context_arg(&first_arg)?;
/*
Extract the rest of the function arguments into a struct body
We require all inputs are strongly typed with names so we can destructure into the function body when expanded
*/
// let rest = inputs
// .map(|f| {
// //
// match f {
// FnArg::Typed(pat) => {
// match *pat.pat {
// syn::Pat::Type(asd) => {}
// _ => {}
// };
// //
// }
// FnArg::Receiver(_) => {}
// }
// // let name = f
// let stream = f.into_token_stream();
// (stream)
// })
// .collect::<Vec<_>>();
// Collect the rest of the args into a list of definitions to be used by the inline struct
// Checking after param parsing may make it a little inefficient
+20
View File
@@ -149,9 +149,29 @@ pub mod virtual_dom {
/// }
/// ```
pub struct Context<'source, T> {
/// Direct access to the properties used to create this component.
pub props: &'source T,
}
impl<'a, T> Context<'a, T> {
/// Access a parent context
pub fn parent_context<C>(&self) -> C {
todo!("Context API is not ready yet")
}
/// Create a subscription that schedules a future render for the reference component
pub fn subscribe(&self) -> impl FnOnce() -> () {
todo!("Subscription API is not ready yet");
|| {}
}
/// The `Enter` API is an internal way of tracking the location in the Dioxus Virtual DOM
/// The Context object consumes itself, producing a new lifetime without reallocating
fn enter(self) -> Self {
todo!("Entrance API for reusing Context object not ready yet")
}
}
pub trait Properties {}
// Auto derive for pure components
+5
View File
@@ -0,0 +1,5 @@
# Dioxus-Web
Build interactive user experiences directly in the web browser!
Dioxus-web provides a `WebsysRenderer` for the Dioxus Virtual Dom that handles events, progresses components, and updates the actual DOM using web-sys methods.
+10
View File
@@ -0,0 +1,10 @@
[package]
name = "dioxus-webview"
version = "0.0.0"
authors = ["Jonathan Kelley <jkelleyrtp@gmail.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
webview = "0.1.1"
+39
View File
@@ -0,0 +1,39 @@
# Dioxus-webview
Dioxus-webview bridges virtual and Webview DOMs together to make simple, portable, desktop applications.
Dioxus-webview is an attempt at making a simpler "Tauri" where creating desktop applications is as simple as:
```rust
// main.rs
fn main() {
dioxus_webview::new(|ctx| {
let (count, set_count) = use_state(ctx, || 0);
html! {
<div>
<h1> "Dioxus Desktop Demo" </h1>
<p> "Count is {count}"</p>
<button onclick=|_| set_count(count + 1) >
"Click to increment"
</button>
</div>
}
})
.configure_webview(|view| {
// custom webview config options
})
.launch();
}
```
and then to create a native .app:
```
dioxus bundle --platform macOS
```
## Goals
Because the host VirtualDOM is running in its own native process, native applications can unlock their full potential. Dioxus-webview is designed to be a 100% rust alternative to ElectronJS without the memory overhead or bloat of ElectronJS apps.
By bridging the native process, desktop apps can access full multithreading power, peripheral support, hardware access, and native filesystem controls without the hassle of web technologies. Our goal with Dioxus-webview is to make it easy to ship both a web and native application, and quickly see large performance boosts without having to re-write the whole stack. As the dioxus ecosystem grows, we hope to see 3rd parties providing wrappers for storage, offline mode, etc that supports both web and native technologies.
+7
View File
@@ -0,0 +1,7 @@
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}