import React, { useEffect, useState } from "react"; import { Card, CardContent, Typography, Box, ButtonBase, Divider, Dialog, IconButton, } from "@mui/material"; import RefreshIcon from "@mui/icons-material/Refresh"; import OpenInNewIcon from "@mui/icons-material/OpenInNew"; import { CustomLoader } from "../../common/CustomLoader"; import ImageIcon from "@mui/icons-material/Image"; import CloseIcon from "@mui/icons-material/Close"; import { decodeIfEncoded } from "../../utils/decode"; export const ImageCard = ({ image, fetchImage, owner, refresh, openExternal, external, isLoadingParent, errorMsg, encryptionType, }) => { const [isOpen, setIsOpen] = useState(true); const [height, setHeight] = useState('400px') useEffect(() => { if (isOpen) { fetchImage(); } }, [isOpen]); // useEffect(()=> { // if(errorMsg){ // setHeight('300px') // } // }, [errorMsg]) return ( <Card sx={{ backgroundColor: "#1F2023", height: height, transition: "height 0.6s ease-in-out", }} > <Box sx={{ display: "flex", alignItems: "center", justifyContent: "space-between", padding: "16px 16px 0px 16px", }} > <Box sx={{ display: "flex", alignItems: "center", gap: "10px", }} > <ImageIcon sx={{ color: "white", }} /> <Typography>IMAGE embed</Typography> </Box> <Box sx={{ display: "flex", alignItems: "center", gap: "10px", }} > <ButtonBase> <RefreshIcon onClick={refresh} sx={{ fontSize: "24px", color: "white", }} /> </ButtonBase> {external && ( <ButtonBase> <OpenInNewIcon onClick={openExternal} sx={{ fontSize: "24px", color: "white", }} /> </ButtonBase> )} </Box> </Box> <Box sx={{ padding: "8px 16px 8px 16px", }} > <Typography sx={{ fontSize: "12px", color: "white", }} > Created by {decodeIfEncoded(owner)} </Typography> <Typography sx={{ fontSize: "12px", color: "cadetblue", }} > {encryptionType === 'private' ? "ENCRYPTED" : encryptionType === 'group' ? 'GROUP ENCRYPTED' : "Not encrypted"} </Typography> </Box> <Divider sx={{ borderColor: "rgb(255 255 255 / 10%)" }} /> <Box sx={{ display: "flex", flexDirection: "column", width: "100%", alignItems: "center", }} > {isLoadingParent && isOpen && ( <Box sx={{ width: "100%", display: "flex", justifyContent: "center", }} > {" "} <CustomLoader />{" "} </Box> )} {errorMsg && ( <Box sx={{ width: "100%", display: "flex", justifyContent: "center", }} > {" "} <Typography sx={{ fontSize: "14px", color: "var(--danger)", }} > {errorMsg} </Typography>{" "} </Box> )} </Box> <Box> <CardContent> <ImageViewer src={image} /> </CardContent> </Box> </Card> ); }; export function ImageViewer({ src, alt = "" }) { const [isFullscreen, setIsFullscreen] = useState(false); const handleOpenFullscreen = () => setIsFullscreen(true); const handleCloseFullscreen = () => setIsFullscreen(false); return ( <> {/* Image in container */} <Box sx={{ maxWidth: "100%", // Prevent horizontal overflow display: "flex", justifyContent: "center", cursor: "pointer", }} onClick={handleOpenFullscreen} > <img src={src} alt={alt} style={{ maxWidth: "100%", maxHeight: "450px", // Adjust max height for small containers objectFit: "contain", // Preserve aspect ratio }} /> </Box> {/* Fullscreen Viewer */} <Dialog open={isFullscreen} onClose={handleCloseFullscreen} maxWidth="lg" fullWidth fullScreen sx={{ "& .MuiDialog-paper": { margin: 0, maxWidth: "100%", width: "100%", height: "100vh", overflow: "hidden", // Prevent scrollbars }, }} > <Box sx={{ position: "relative", width: "100%", height: "100%", display: "flex", justifyContent: "center", alignItems: "center", backgroundColor: "#000", // Optional: dark background for fullscreen mode }} > {/* Close Button */} <IconButton onClick={handleCloseFullscreen} sx={{ position: "absolute", top: 8, right: 8, zIndex: 10, color: "white", }} > <CloseIcon /> </IconButton> {/* Fullscreen Image */} <img src={src} alt={alt} style={{ maxWidth: "100%", maxHeight: "100%", objectFit: "contain", // Preserve aspect ratio }} /> </Box> </Dialog> </> ); }