index.tsx 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { makeStyles } from '@material-ui/core'
  2. import { useSelector } from 'react-redux'
  3. import React, { useState } from 'react'
  4. import List from '@mui/material/List';
  5. import ListItem from '@mui/material/ListItem';
  6. import ListItemText from '@mui/material/ListItemText';
  7. import ListItemAvatar from '@mui/material/ListItemAvatar';
  8. import Avatar from '@mui/material/Avatar';
  9. import Typography from '@mui/material/Typography';
  10. import Divider from '@mui/material/Divider';
  11. import { CopyToClipboard } from 'react-copy-to-clipboard';
  12. import Search from './Search'
  13. import AlertInfo from "../../../../../reusableComponents/AlertInfo";
  14. import { getMessages } from '../../../../../../redux/messages/selector'
  15. import { timeStamp,timeStampFilter,firstLetter,slicedWord,copied } from '../../../../../../helpers'
  16. const useStyles = makeStyles({
  17. containerAbsolute: {
  18. position: 'absolute',
  19. top: 58,
  20. width: 506,
  21. borderLeft: 'solid 0.5px #9c9c9c',
  22. maxHeight: '905px',
  23. minHeight: '905px',
  24. overflowY: 'scroll',
  25. overflowX: 'hidden',
  26. backgroundColor: '#ffffff'
  27. },
  28. listItem: {
  29. '&:hover': {
  30. backgroundColor: '#f0f0f0',
  31. }
  32. },
  33. })
  34. const SearchList= () => {
  35. const classes = useStyles()
  36. const messages = useSelector(getMessages)
  37. const [value, setValue] = useState<string>('')
  38. const [date, setDate] = useState<any>('');
  39. const handleSearch = (e: React.ChangeEvent<HTMLInputElement>): void => setValue(e.target.value)
  40. const filteredMessages = () => messages.filter((el) => {
  41. if (!date) {
  42. return el.message.toLowerCase().includes(value.toLowerCase())
  43. } else if (el.message.toLowerCase().includes(value.toLowerCase())
  44. && timeStampFilter(date) === timeStampFilter(el.createdAt)) {
  45. return el
  46. }
  47. })
  48. const arr = filteredMessages()
  49. return (
  50. <div>
  51. <Search handleSearch={handleSearch} value={value}
  52. setDate={setDate} date={date} />
  53. <div className={classes.containerAbsolute}>
  54. {messages.length > 0 ? arr.length > 0 ?
  55. <List sx={{ width: '100%' }}>
  56. {arr.map(({ name, lastName, avatarUrl, color, message, createdAt }) =>
  57. <div key={createdAt}>
  58. <CopyToClipboard onCopy={() => copied()} text={message}>
  59. <ListItem alignItems="flex-start" className={classes.listItem}>
  60. <ListItemAvatar>
  61. <Avatar alt={name} src={avatarUrl?`http://localhost:3000/${avatarUrl}`:undefined}
  62. sx={{ background: color, width: 44, height: 44, marginRight:2 }}>
  63. {!avatarUrl&&`${firstLetter(name)}${firstLetter(lastName)}`}
  64. </Avatar>
  65. </ListItemAvatar>
  66. <ListItemText
  67. primary={`${firstLetter(name)}${slicedWord(name, 15, 1)}
  68. ${firstLetter(lastName)}${slicedWord(lastName, 15, 1)}`}
  69. secondary={<>
  70. <Typography
  71. sx={{ display: 'block',wordBreak:'break-word' }}
  72. component="span"
  73. variant="body2"
  74. color="text.primary"
  75. >
  76. {message}
  77. </Typography>
  78. {timeStamp(createdAt)}
  79. </>}
  80. />
  81. </ListItem>
  82. </CopyToClipboard>
  83. <Divider variant="inset"/>
  84. </div>)}
  85. </List> :
  86. <AlertInfo name={!date&&value ? `Can not find message by request: ${value}`:
  87. `Can not find message by request: ${value} and DataPicker: ${timeStampFilter(date)}`} />:
  88. <AlertInfo name='You do not have messages yet!' />}
  89. </div>
  90. </div>
  91. )
  92. }
  93. export default SearchList