|
6 | 6 | from pathlib import Path |
7 | 7 | from typing import Any, ClassVar |
8 | 8 |
|
| 9 | +from reflex.app import UploadFile |
9 | 10 | from reflex.components.base.fragment import Fragment |
10 | 11 | from reflex.components.component import ( |
11 | 12 | Component, |
|
29 | 30 | call_event_fn, |
30 | 31 | call_event_handler, |
31 | 32 | parse_args_spec, |
| 33 | + passthrough_event_spec, |
32 | 34 | run_script, |
| 35 | + upload_files, |
33 | 36 | ) |
34 | 37 | from reflex.style import Style |
35 | 38 | from reflex.utils import format |
@@ -168,16 +171,7 @@ def get_upload_url(file_path: str | Var[str]) -> Var[str]: |
168 | 171 | return Var.create(f"{uploaded_files_url_prefix}/{file_path}") |
169 | 172 |
|
170 | 173 |
|
171 | | -def _on_drop_spec(files: Var) -> tuple[Var[Any]]: |
172 | | - """Args spec for the on_drop event trigger. |
173 | | -
|
174 | | - Args: |
175 | | - files: The files to upload. |
176 | | -
|
177 | | - Returns: |
178 | | - Signature for on_drop handler including the files to upload. |
179 | | - """ |
180 | | - return (files,) |
| 174 | +_on_drop_spec = passthrough_event_spec(list[UploadFile]) |
181 | 175 |
|
182 | 176 |
|
183 | 177 | def _default_drop_rejected(rejected_files: ArrayVar[list[dict[str, Any]]]) -> EventSpec: |
@@ -302,19 +296,21 @@ def create(cls, *children, **props) -> Component: |
302 | 296 | } |
303 | 297 |
|
304 | 298 | # Create the component. |
305 | | - upload_props["id"] = props.get("id", DEFAULT_UPLOAD_ID) |
| 299 | + upload_props["id"] = upload_id = props.get("id", DEFAULT_UPLOAD_ID) |
306 | 300 |
|
307 | 301 | if upload_props.get("on_drop") is None: |
308 | 302 | # If on_drop is not provided, save files to be uploaded later. |
309 | | - upload_props["on_drop"] = upload_file(upload_props["id"]) |
| 303 | + upload_props["on_drop"] = upload_file(upload_id) |
310 | 304 | else: |
311 | 305 | on_drop = ( |
312 | 306 | [on_drop_prop] |
313 | 307 | if not isinstance(on_drop_prop := upload_props["on_drop"], Sequence) |
314 | 308 | else list(on_drop_prop) |
315 | 309 | ) |
316 | 310 | for ix, event in enumerate(on_drop): |
317 | | - if isinstance(event, (EventHandler, EventSpec)): |
| 311 | + if isinstance(event, EventHandler): |
| 312 | + event = event(upload_files(upload_id)) |
| 313 | + if isinstance(event, EventSpec): |
318 | 314 | # Call the lambda to get the event chain. |
319 | 315 | event = call_event_handler(event, _on_drop_spec) |
320 | 316 | elif isinstance(event, Callable): |
|
0 commit comments