index.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import Stack from '@mui/material/Stack';
  2. import IconButton from '@mui/material/IconButton';
  3. import MenuItem from '@mui/material/MenuItem';
  4. import ListItemText from '@mui/material/ListItemText';
  5. import CloseIcon from '@mui/icons-material/Close';
  6. import { makeStyles } from '@material-ui/core'
  7. import { useDispatch,useSelector } from 'react-redux';
  8. import { useState,useEffect} from 'react';
  9. import { TMessages,TMessage } from '../../../../../typescript/redux/messages/types';
  10. import { getMessagesMemo } from '../../../../../redux/messages/selector';
  11. import { firstLetter,slicedWord,handleSort } from '../../../../../helpers';
  12. const useStyles = makeStyles({
  13. container: {
  14. marginLeft: 20,
  15. display: 'flex',
  16. alignContent: 'center',
  17. alignItems:'center'
  18. },
  19. iconClose: {
  20. '&:hover': {
  21. transform: 'rotate(180deg)',
  22. transition: 'all 250ms ease-out ',
  23. }
  24. },
  25. listWrapper: {
  26. background: '#fdfdfd',
  27. width: 400,
  28. padding:0
  29. },
  30. })
  31. const PinnedBar = () => {
  32. const classes = useStyles()
  33. const dispatch = useDispatch()
  34. const messagesMemo = useSelector(getMessagesMemo)
  35. const [pinnedArr, setPinnedArr] = useState<TMessages>([])
  36. const [openedPin, setOpenedPin] = useState<TMessage | null>(null)
  37. const [openIndex, setOpenIndex] = useState<number>(0)
  38. const handleActivePin = () => setOpenIndex(openIndex => openIndex + 1)
  39. useEffect(() => {
  40. const messages = messagesMemo.filter((el) => el.pinned === true)
  41. setPinnedArr(handleSort('updatedAt', messages, true))
  42. }, [messagesMemo])
  43. useEffect(() => {
  44. const pinnedObj = pinnedArr[openIndex]
  45. if (pinnedObj) setOpenedPin(pinnedObj)
  46. else setOpenIndex(0)
  47. }, [openIndex,pinnedArr])
  48. return openedPin ?
  49. <Stack className={classes.container} direction="row">
  50. <ul className={classes.listWrapper}>
  51. <MenuItem onClick={handleActivePin}>
  52. <ListItemText primary={`${firstLetter(openedPin.name)}${slicedWord(openedPin.name, 15, 1)}
  53. ${firstLetter(openedPin.lastName)}${slicedWord(openedPin.lastName, 15, 1)}`}
  54. primaryTypographyProps={{fontSize:16 }}
  55. secondary={slicedWord(openedPin.message, 40, 1)}
  56. secondaryTypographyProps={{fontSize: 12 }} />
  57. <ListItemText primary={`Pinned Message #${openIndex+1}`}
  58. primaryTypographyProps={{ color: "#0379af",fontSize:16 }}
  59. secondary={`Type : ${openedPin.type}`}
  60. secondaryTypographyProps={{ fontSize:16 }}/>
  61. </MenuItem>
  62. </ul>
  63. <IconButton aria-label="delete" size="medium">
  64. <CloseIcon className={classes.iconClose} fontSize='medium'/>
  65. </IconButton>
  66. </Stack> :
  67. null
  68. }
  69. export default PinnedBar