Parcourir la source

Move `is_used` to Upload component rather than UploadFilesProvider (#2514)

Masen Furer il y a 1 an
Parent
commit
6d33156d15
3 fichiers modifiés avec 23 ajouts et 27 suppressions
  1. 9 5
      reflex/app.py
  2. 6 17
      reflex/components/core/upload.py
  3. 8 5
      reflex/components/core/upload.pyi

+ 9 - 5
reflex/app.py

@@ -46,7 +46,7 @@ from reflex.components.core.client_side_routing import (
     Default404Page,
     Default404Page,
     wait_for_client_redirect,
     wait_for_client_redirect,
 )
 )
-from reflex.components.core.upload import UploadFilesProvider
+from reflex.components.core.upload import Upload
 from reflex.components.radix import themes
 from reflex.components.radix import themes
 from reflex.config import get_config
 from reflex.config import get_config
 from reflex.event import Event, EventHandler, EventSpec
 from reflex.event import Event, EventHandler, EventSpec
@@ -185,6 +185,7 @@ class App(Base):
         # Set up the API.
         # Set up the API.
         self.api = FastAPI()
         self.api = FastAPI()
         self.add_cors()
         self.add_cors()
+        self.add_default_endpoints()
 
 
         if self.state:
         if self.state:
             # Set up the state manager.
             # Set up the state manager.
@@ -241,12 +242,14 @@ class App(Base):
         return self.api
         return self.api
 
 
     def add_default_endpoints(self):
     def add_default_endpoints(self):
-        """Add the default endpoints."""
+        """Add default api endpoints (ping)."""
         # To test the server.
         # To test the server.
         self.api.get(str(constants.Endpoint.PING))(ping)
         self.api.get(str(constants.Endpoint.PING))(ping)
 
 
+    def add_optional_endpoints(self):
+        """Add optional api endpoints (_upload)."""
         # To upload files.
         # To upload files.
-        if UploadFilesProvider.is_used:
+        if Upload.is_used:
             self.api.post(str(constants.Endpoint.UPLOAD))(upload(self))
             self.api.post(str(constants.Endpoint.UPLOAD))(upload(self))
 
 
     def add_cors(self):
     def add_cors(self):
@@ -655,6 +658,9 @@ class App(Base):
         if constants.Page404.SLUG not in self.pages:
         if constants.Page404.SLUG not in self.pages:
             self.add_custom_404_page()
             self.add_custom_404_page()
 
 
+        # Add the optional endpoints (_upload)
+        self.add_optional_endpoints()
+
         if not self._should_compile():
         if not self._should_compile():
             return
             return
 
 
@@ -824,8 +830,6 @@ class App(Base):
         for output_path, code in compile_results:
         for output_path, code in compile_results:
             compiler_utils.write_page(output_path, code)
             compiler_utils.write_page(output_path, code)
 
 
-        self.add_default_endpoints()
-
     @contextlib.asynccontextmanager
     @contextlib.asynccontextmanager
     async def modify_state(self, token: str) -> AsyncIterator[BaseState]:
     async def modify_state(self, token: str) -> AsyncIterator[BaseState]:
         """Modify the state out of band.
         """Modify the state out of band.

+ 6 - 17
reflex/components/core/upload.py

@@ -98,23 +98,6 @@ class UploadFilesProvider(Component):
     library = f"/{Dirs.CONTEXTS_PATH}"
     library = f"/{Dirs.CONTEXTS_PATH}"
     tag = "UploadFilesProvider"
     tag = "UploadFilesProvider"
 
 
-    is_used: ClassVar[bool] = False
-
-    @classmethod
-    def create(cls, *children, **props) -> Component:
-        """Create an UploadFilesProvider component.
-
-        Args:
-            *children: The children of the component.
-            **props: The properties of the component.
-
-        Returns:
-            The UploadFilesProvider component.
-        """
-        cls.is_used = True
-
-        return super().create(*children, **props)
-
 
 
 class Upload(Component):
 class Upload(Component):
     """A file upload component."""
     """A file upload component."""
@@ -154,6 +137,9 @@ class Upload(Component):
     # Whether to disable using the space/enter keys to upload.
     # Whether to disable using the space/enter keys to upload.
     no_keyboard: Var[bool]
     no_keyboard: Var[bool]
 
 
+    # Marked True when any Upload component is created.
+    is_used: ClassVar[bool] = False
+
     @classmethod
     @classmethod
     def create(cls, *children, **props) -> Component:
     def create(cls, *children, **props) -> Component:
         """Create an upload component.
         """Create an upload component.
@@ -165,6 +151,9 @@ class Upload(Component):
         Returns:
         Returns:
             The upload component.
             The upload component.
         """
         """
+        # Mark the Upload component as used in the app.
+        cls.is_used = True
+
         # get only upload component props
         # get only upload component props
         supported_props = cls.get_props()
         supported_props = cls.get_props()
         upload_props = {
         upload_props = {

+ 8 - 5
reflex/components/core/upload.pyi

@@ -29,8 +29,6 @@ def clear_selected_files(id_: str = DEFAULT_UPLOAD_ID) -> EventSpec: ...
 def cancel_upload(upload_id: str) -> EventSpec: ...
 def cancel_upload(upload_id: str) -> EventSpec: ...
 
 
 class UploadFilesProvider(Component):
 class UploadFilesProvider(Component):
-    is_used: ClassVar[bool] = False
-
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore
@@ -90,7 +88,7 @@ class UploadFilesProvider(Component):
         ] = None,
         ] = None,
         **props
         **props
     ) -> "UploadFilesProvider":
     ) -> "UploadFilesProvider":
-        """Create an UploadFilesProvider component.
+        """Create the component.
 
 
         Args:
         Args:
             *children: The children of the component.
             *children: The children of the component.
@@ -101,14 +99,19 @@ class UploadFilesProvider(Component):
             autofocus: Whether the component should take the focus once the page is loaded
             autofocus: Whether the component should take the focus once the page is loaded
             _rename_props: props to change the name of
             _rename_props: props to change the name of
             custom_attrs: custom attribute
             custom_attrs: custom attribute
-            **props: The properties of the component.
+            **props: The props of the component.
 
 
         Returns:
         Returns:
-            The UploadFilesProvider component.
+            The component.
+
+        Raises:
+            TypeError: If an invalid child is passed.
         """
         """
         ...
         ...
 
 
 class Upload(Component):
 class Upload(Component):
+    is_used: ClassVar[bool] = False
+
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore