Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3694 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { lazy, Suspense, useState } from 'react';
import { Badge, IconButton, Avatar as MuiAvatar } from '@mui/material';
import Edit from '@mui/icons-material/Edit';
import colors from '@styles/config/colors';

const ImageModal = lazy(() => import('@components/modals/ImageModal'));

const Avatar = ({
  src = '',
  alt = 'Avatar',
  styles = {},
  uploadUrl = '',
  edit = false,
  size,
  badgeStyles,
  badgeContent,
  onImageChange,
  onClick,
  ...props
}) => {
  const [showModal, setShowModal] = useState(false);
  const [image, setImage] = useState('');

  const toggleModal = () => setShowModal(!showModal);

  const defaultBadgeContent = edit ? (
    <IconButton
      sx={{
        backgroundColor: colors.button.background.primary,
        color: colors.button.text.primary,
        ':hover': {
          backgroundColor: colors.button.background.primary,
          color: colors.button.text.primary,
          opacity: 0.9
        }
      }}
      color='primary'
      onClick={toggleModal}
    >
      <Edit />
    </IconButton>
  ) : null;

  const avatarContent = (
    <MuiAvatar src={image || src} alt={alt} sx={styles} {...props} onClick={onClick} />
  );

  return (
    <>
      {edit || badgeContent ? (
        <Badge
          overlap='circular'
          anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
          sx={badgeStyles}
          badgeContent={badgeContent || defaultBadgeContent}
        >
          {avatarContent}
        </Badge>
      ) : (
        avatarContent
      )}
      {edit && (
        <Suspense fallback={null}>
          <ImageModal
            show={showModal}
            url={uploadUrl}
            message={`Imágenes recomendadas: ${size ?? '200px'} x ${size ?? '200px'}`}
            onClose={toggleModal}
            onComplete={(newImage) => {
              setImage(newImage);
              if (onImageChange) {
                onImageChange(newImage);
              }
            }}
          />
        </Suspense>
      )}
    </>
  );
};

export default Avatar;