More fullstack fixes (#4737)

* allow `--server` only builds!

* rollback example

* capture `/:route` routes

* fix: properly implement file uploads in forms

* implement desktop form uploads

* Performant serialization of form bytes

* finish up file stuff

* cleanups

* add request headers to streaming context

* remove some unwraps
This commit is contained in:
Jonathan Kelley authored and GitHub committed 2025-10-07 23:07:43 -07:00
1 parent fc01a002fd
commit 92792aded9
47 files changed
+1241 -703

No files matched your search

+35 -5
View File
@@ -1,5 +1,4 @@
use crate::element::DesktopElement;
use crate::file_upload::DesktopFileDragEvent;
use crate::file_upload::{DesktopFileData, DesktopFileDragEvent};
use crate::menubar::DioxusMenu;
use crate::PendingDesktopContext;
use crate::WindowCloseBehaviour;
@@ -9,12 +8,13 @@ use crate::{
DesktopContext, DesktopService,
};
use crate::{document::DesktopDocument, WeakDesktopContext};
use crate::{element::DesktopElement, file_upload::DesktopFormData};
use base64::prelude::BASE64_STANDARD;
use dioxus_core::{consume_context, provide_context, Runtime, ScopeId, VirtualDom};
use dioxus_document::Document;
use dioxus_history::{History, MemoryHistory};
use dioxus_hooks::to_owned;
use dioxus_html::{HtmlEvent, PlatformEventData};
use dioxus_html::{FileData, FormValue, HtmlEvent, PlatformEventData};
use futures_util::{pin_mut, FutureExt};
use std::sync::atomic::AtomicBool;
use std::{cell::OnceCell, time::Duration};
@@ -115,7 +115,7 @@ impl WebviewEdits {
let desktop_context = desktop_context.upgrade().unwrap();
let query = desktop_context.query.clone();
let recent_file = desktop_context.file_hover.clone();
let hovered_file = desktop_context.file_hover.clone();
// check for a mounted event placeholder and replace it with a desktop specific element
let as_any = match data {
@@ -123,9 +123,39 @@ impl WebviewEdits {
let element = DesktopElement::new(element, desktop_context.clone(), query.clone());
Rc::new(PlatformEventData::new(Box::new(element)))
}
dioxus_html::EventData::Form(form) => {
Rc::new(PlatformEventData::new(Box::new(DesktopFormData {
value: form.value,
valid: form.valid,
values: form
.values
.into_iter()
.map(|obj| {
if let Some(text) = obj.text {
return (obj.key, FormValue::Text(text));
}
if let Some(file_data) = obj.file {
if file_data.path.capacity() == 0 {
return (obj.key, FormValue::File(None));
}
return (
obj.key,
FormValue::File(Some(FileData::new(DesktopFileData(
file_data.path,
)))),
);
};
(obj.key, FormValue::Text(String::new()))
})
.collect(),
})))
}
dioxus_html::EventData::Drag(ref drag) => {
// we want to override this with a native file engine, provided by the most recent drag event
let file_event = recent_file.current().unwrap();
let file_event = hovered_file.current().unwrap();
let paths = match file_event {
wry::DragDropEvent::Enter { paths, .. } => paths,
wry::DragDropEvent::Drop { paths, .. } => paths,