diff --git a/reflex/components/el/elements/media.py b/reflex/components/el/elements/media.py index 7d2f0e3e9..4d3458a39 100644 --- a/reflex/components/el/elements/media.py +++ b/reflex/components/el/elements/media.py @@ -1,8 +1,14 @@ """Media classes.""" +import os +import pathlib from typing import Any, Union +import requests +from PIL import Image + from reflex import Component, ComponentNamespace +from reflex.constants.base import Dirs from reflex.constants.colors import Color from reflex.vars.base import Var @@ -130,6 +136,60 @@ class Img(BaseHTML): Returns: The component. """ + + def validate_image(src): + """Validates the 'src' parameter for the Image component. + + Args: + src: The source parameter (local file path, web URL, or Pillow Image). + + Returns: + Valid source (src) or raises an error. + """ + try: + if isinstance(src, str): + if src.startswith("/"): + full_path = ( + pathlib.Path.cwd() / Dirs.APP_ASSETS / src.strip("/") + ) + if os.path.exists(full_path): + return True + else: + raise FileNotFoundError( + f"Local image not found: {full_path}" + ) + elif src.startswith("http"): + try: + response = requests.head(src) + if response.status_code == 200: + return True + else: + raise ValueError(f"Invalid web URL: {src}") + except requests.RequestException: + raise ValueError( + f"Failed to validate web URL: {src}" + ) from requests.RequestException + else: + raise ValueError(f"Unsupported src format: {src}") + elif isinstance(src, Image.Image): + return True + else: + raise ValueError(f"Invalid src type: {type(src)}") + except Exception as e: + print(f"Error: {e}") + return False + + src = props.get("src", "") + if not validate_image(src): + fallback = props.get("fallback", "") + if fallback: + if validate_image(fallback): + props["src"] = fallback + else: + print(f"Invalid fallback image: {fallback}") + else: + print(f"Invalid src image: {src}") + return ( super().create(src=children[0], **props) if children diff --git a/reflex/components/next/image.py b/reflex/components/next/image.py index 20ba5a304..dd3ac1633 100644 --- a/reflex/components/next/image.py +++ b/reflex/components/next/image.py @@ -13,6 +13,7 @@ from .base import NextComponent DEFAULT_W_H = "100%" +# implementing image call back technique here class Image(NextComponent): """Display an image."""