Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 1979 | Rev 2477 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1684 stevensc 1
import React, { useState } from 'react'
679 stevensc 2
import { Link } from 'react-router-dom'
517 stevensc 3
import { useForm } from 'react-hook-form'
1688 stevensc 4
import styled from 'styled-components'
517 stevensc 5
import SendIcon from '@mui/icons-material/Send'
6
import IconButton from '@mui/material/IconButton'
7
import ArrowBackIcon from '@mui/icons-material/ArrowBack'
8
import AttachFileIcon from '@mui/icons-material/AttachFile'
9
import InsertEmoticonIcon from '@mui/icons-material/InsertEmoticon'
5 stevensc 10
 
517 stevensc 11
import Options from '../UI/Option'
12
import Emojione from './emojione/Emojione'
13
import FileModal from '../modals/FileModal'
5 stevensc 14
 
1675 stevensc 15
const ChatContainer = styled.div`
5 stevensc 16
  background-color: var(--bg-color);
17
  border-radius: var(--border-radius);
18
  border: 1px solid var(--border-primary);
19
  height: 80vh;
20
  display: flex;
21
  flex-direction: column;
22
  flex-grow: 1;
440 andreina 23
  padding: 0px 0px !important;
517 stevensc 24
`
5 stevensc 25
 
26
const StyledChatHeader = styled.div`
27
  align-items: center;
28
  border-bottom: 1px solid var(--border-primary);
29
  display: flex;
30
  justify-content: center;
380 andreina 31
  padding: 1rem 0.5rem;
5 stevensc 32
  position: relative;
33
 
34
  & > button:first-child {
35
    position: absolute;
36
    left: 1rem;
37
    top: 50%;
38
    transform: translateY(-50%);
39
    display: inline-flex;
40
 
41
    @media (min-width: 768px) {
42
      display: none;
43
    }
44
  }
517 stevensc 45
`
5 stevensc 46
 
47
const StyledTitle = styled.h2`
517 stevensc 48
  font-size: 16px;
49
  font-weight: 600;
50
  width: fit-content;
51
  max-width: 20ch;
52
  text-align: center;
53
  color: #1d315c;
5 stevensc 54
 
55
  @media (min-width: 768px) {
56
    max-width: 30ch;
57
  }
517 stevensc 58
`
5 stevensc 59
 
60
const StyledForm = styled.form`
61
  border-top: 1px solid var(--border-primary);
62
  padding: 0.5rem;
63
  position: relative;
64
  display: flex;
65
  justify-content: center;
66
  align-items: center;
67
  gap: 0.5rem;
517 stevensc 68
`
5 stevensc 69
 
70
const StyledInput = styled.input`
71
  border: none;
72
  outline: none;
197 stevensc 73
  width: 100%;
5 stevensc 74
  padding: 0.5rem 1rem;
75
  border-radius: 30px;
197 stevensc 76
  background: var(--bg-color-secondary);
5 stevensc 77
 
78
  &:focus {
197 stevensc 79
    background: var(--bg-color-secondary);
5 stevensc 80
  }
517 stevensc 81
`
5 stevensc 82
 
83
const Header = ({ children, options = [], onClose }) => {
84
  return (
85
    <StyledChatHeader>
86
      <IconButton onClick={onClose}>
87
        <ArrowBackIcon />
88
      </IconButton>
89
      {children}
679 stevensc 90
      {!!options.length && <Options options={options} right='1rem' />}
5 stevensc 91
    </StyledChatHeader>
517 stevensc 92
  )
93
}
5 stevensc 94
 
95
const Title = ({ children, url }) => {
96
  if (!url) {
517 stevensc 97
    return <StyledTitle>{children}</StyledTitle>
5 stevensc 98
  }
99
 
100
  return (
517 stevensc 101
    <Link to={url} style={{ width: 'fit-content' }}>
5 stevensc 102
      <StyledTitle>{children}</StyledTitle>
517 stevensc 103
    </Link>
104
  )
105
}
5 stevensc 106
 
2459 stevensc 107
const SubmitForm = ({ onSend }) => {
517 stevensc 108
  const [showEmojione, setShowEmojione] = useState(false)
109
  const [isShowFileModal, setIsShowFileModal] = useState(false)
110
  const [isSending, setIsSending] = useState(false)
5 stevensc 111
 
517 stevensc 112
  const { handleSubmit, setValue, register, reset, getValues } = useForm()
5 stevensc 113
 
114
  const onSubmit = handleSubmit(({ message }) => {
2459 stevensc 115
    onSend(message)
116
    reset()
517 stevensc 117
  })
5 stevensc 118
 
119
  const sendFile = (file) => {
517 stevensc 120
    setIsSending(true)
2459 stevensc 121
    onSend(file)
517 stevensc 122
  }
5 stevensc 123
 
124
  const toggleEmojione = () => {
517 stevensc 125
    setShowEmojione(!showEmojione)
126
  }
5 stevensc 127
 
128
  const toggleFileModal = () => {
517 stevensc 129
    setIsShowFileModal(!isShowFileModal)
130
  }
5 stevensc 131
 
132
  const onClickEmoji = (event) => {
517 stevensc 133
    const shortname = event.currentTarget.dataset.shortname
134
    const currentMessage = getValues('message')
5 stevensc 135
    // eslint-disable-next-line no-undef
517 stevensc 136
    const unicode = emojione.shortnameToUnicode(shortname)
137
    setValue('message', `${currentMessage}${unicode}`)
138
  }
5 stevensc 139
 
140
  return (
141
    <>
142
      <StyledForm onSubmit={onSubmit}>
143
        {showEmojione && <Emojione onClickEmoji={onClickEmoji} />}
230 stevensc 144
        <IconButton onClick={toggleFileModal}>
5 stevensc 145
          <AttachFileIcon />
146
        </IconButton>
147
        <IconButton onClick={toggleEmojione}>
148
          <InsertEmoticonIcon />
149
        </IconButton>
150
        <StyledInput
679 stevensc 151
          type='text'
152
          name='message'
153
          placeholder='Escribe un mensaje'
5 stevensc 154
          ref={register({ required: true })}
155
        />
679 stevensc 156
        <IconButton type='submit'>
5 stevensc 157
          <SendIcon />
158
        </IconButton>
159
      </StyledForm>
160
      <FileModal
161
        isShow={isShowFileModal}
162
        onHide={toggleFileModal}
163
        onComplete={sendFile}
164
        loading={isSending}
165
      />
166
    </>
517 stevensc 167
  )
168
}
5 stevensc 169
 
1675 stevensc 170
ChatContainer.Header = Header
171
ChatContainer.Title = Title
1684 stevensc 172
 
1675 stevensc 173
ChatContainer.SubmitForm = SubmitForm
5 stevensc 174
 
1675 stevensc 175
export default ChatContainer