Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3719 stevensc 1
import React, { lazy, Suspense, useState } from 'react';
2
import { Badge, IconButton, Avatar as MuiAvatar } from '@mui/material';
3
import Edit from '@mui/icons-material/Edit';
4
import colors from '@styles/config/colors';
5
 
6
const ImageModal = lazy(() => import('@components/modals/ImageModal'));
7
 
8
const Avatar = ({
9
  src = '',
10
  alt = 'Avatar',
11
  styles = {},
12
  uploadUrl = '',
13
  edit = false,
14
  size,
15
  badgeStyles,
16
  badgeContent,
17
  onImageChange,
18
  onClick,
19
  ...props
20
}) => {
21
  const [showModal, setShowModal] = useState(false);
22
  const [image, setImage] = useState('');
23
 
24
  const toggleModal = () => setShowModal(!showModal);
25
 
26
  const defaultBadgeContent = edit ? (
27
    <IconButton
28
      sx={{
29
        backgroundColor: colors.button.background.primary,
30
        color: colors.button.text.primary,
31
        ':hover': {
32
          backgroundColor: colors.button.background.primary,
33
          color: colors.button.text.primary,
34
          opacity: 0.9
35
        }
36
      }}
37
      color='primary'
38
      onClick={toggleModal}
39
    >
40
      <Edit />
41
    </IconButton>
42
  ) : null;
43
 
44
  const avatarContent = (
45
    <MuiAvatar src={image || src} alt={alt} sx={styles} {...props} onClick={onClick} />
46
  );
47
 
48
  return (
49
    <>
50
      {edit || badgeContent ? (
51
        <Badge
52
          overlap='circular'
53
          anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
54
          sx={badgeStyles}
55
          badgeContent={badgeContent || defaultBadgeContent}
56
        >
57
          {avatarContent}
58
        </Badge>
59
      ) : (
60
        avatarContent
61
      )}
62
      {edit && (
63
        <Suspense fallback={null}>
64
          <ImageModal
65
            show={showModal}
66
            url={uploadUrl}
67
            message={`Imágenes recomendadas: ${size ?? '200px'} x ${size ?? '200px'}`}
68
            onClose={toggleModal}
69
            onComplete={(newImage) => {
70
              setImage(newImage);
71
              if (onImageChange) {
72
                onImageChange(newImage);
73
              }
74
            }}
75
          />
76
        </Suspense>
77
      )}
78
    </>
79
  );
80
};
81
 
82
export default Avatar;