index.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { makeStyles, TextField } from '@material-ui/core'
  2. import ListItemAvatar from '@mui/material/ListItemAvatar';
  3. import Avatar from '@mui/material/Avatar';
  4. import AddAPhotoIcon from '@mui/icons-material/AddAPhoto';
  5. import { useEffect } from 'react';
  6. import { useDropzone } from 'react-dropzone';
  7. import Webcam from "react-webcam";
  8. import { format,firstLetter,prodAwsS3 } from '../../../../../helpers'
  9. import { IAuthorizationState } from '../../../../../typescript/redux/authorization/interfaces'
  10. const useStyles = makeStyles({
  11. container: {
  12. display: 'flex',
  13. alignItems: 'center',
  14. alignContent:'center',
  15. flexDirection: 'column',
  16. width: '100%',
  17. padding: 20,
  18. paddingTop:0,
  19. position: 'relative',
  20. backgroundColor: '#ffffff',
  21. },
  22. imgWrapper: {
  23. cursor: 'pointer',
  24. marginBottom: 30,
  25. position: 'relative',
  26. },
  27. imgDropZoneOverlay: {
  28. position: 'absolute',
  29. width: 120,
  30. height: 120,
  31. borderRadius: '50%',
  32. backgroundColor: '#6868687d',
  33. left: 0,
  34. zIndex: 1,
  35. display: 'flex',
  36. justifyContent: 'center',
  37. alignContent: 'center',
  38. alignItems:'center'
  39. },
  40. addPhoto: {
  41. color: '#ffffff',
  42. transform: 'scale(1.1)',
  43. '&:hover': {
  44. transform: 'scale(1.3)',
  45. },
  46. },
  47. avatarArrow: {
  48. cursor: 'pointer',
  49. alignSelf: 'flex-end',
  50. '&:hover': {
  51. backgroundColor: 'rgb(62, 149, 231)'
  52. }
  53. }
  54. })
  55. interface IEditList {
  56. user: IAuthorizationState,
  57. name: string,
  58. setName: any,
  59. lastName: string,
  60. setLastName: any,
  61. openBtn: boolean,
  62. setOpenBtn: any,
  63. file:any,
  64. setFile: (file:any) => void
  65. }
  66. const EditList = (props: IEditList) => {
  67. const classes = useStyles()
  68. const { user, name, setName, lastName, setLastName,
  69. openBtn, setOpenBtn,setFile } = props
  70. const { avatarUrl, color } = user
  71. const { getRootProps, getInputProps, acceptedFiles } = useDropzone({
  72. noDrag: true,
  73. accept:'image/*'
  74. });
  75. const videoConstraints = {
  76. width: 1280,
  77. height: 720,
  78. facingMode: "user"
  79. };
  80. const handleTextField = (e: React.ChangeEvent<HTMLInputElement>) => {
  81. !openBtn&&setOpenBtn(true)
  82. const value = format(e.target.value)
  83. const name = e.target.name
  84. switch (name) {
  85. case 'name':
  86. setName(value)
  87. break;
  88. case 'lastName':
  89. setLastName(value)
  90. break;
  91. default:
  92. break;
  93. }
  94. }
  95. useEffect(() => {
  96. if (acceptedFiles.slice(-1)[0]) {
  97. setFile(acceptedFiles.slice(-1)[0])
  98. setOpenBtn(true)
  99. }
  100. }, [setFile,setOpenBtn,acceptedFiles])
  101. return (
  102. <div className={classes.container} >
  103. <ListItemAvatar className={classes.imgWrapper}>
  104. <div {...getRootProps({ className: classes.imgDropZoneOverlay })}>
  105. <AddAPhotoIcon className={classes.addPhoto} fontSize='large' />
  106. <input {...getInputProps()}/>
  107. </div>
  108. <Avatar alt={name} src={avatarUrl?`${prodAwsS3}/${avatarUrl}`:undefined}
  109. sx={{ background: color, width: 120, height: 120}}>
  110. {`${firstLetter(name)}${firstLetter(lastName)}`}
  111. </Avatar>
  112. </ListItemAvatar>
  113. <Webcam
  114. audio={false}
  115. height={300}
  116. screenshotFormat="image/jpeg"
  117. width={300}
  118. videoConstraints={videoConstraints}
  119. >
  120. {({ getScreenshot }) => (
  121. <button onClick={() => {
  122. setFile(getScreenshot())
  123. !openBtn&&setOpenBtn(true)
  124. }}>
  125. Capture photo
  126. </button>)}
  127. </Webcam>
  128. <TextField
  129. id="name"
  130. name='name'
  131. label="Name"
  132. value={name}
  133. fullWidth
  134. variant='outlined'
  135. onChange={handleTextField}
  136. style={{marginBottom:20}}
  137. />
  138. <TextField
  139. id="lastName"
  140. name='lastName'
  141. label="LastName"
  142. value={lastName}
  143. fullWidth
  144. variant='outlined'
  145. onChange={handleTextField}
  146. />
  147. </div>
  148. )
  149. };
  150. export default EditList;