Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
7226 stevensc 1
import React, { useState } from 'react'
6618 stevensc 2
import { useForm } from 'react-hook-form'
7226 stevensc 3
import { useSelector } from 'react-redux'
4
import { Avatar } from '@mui/material'
5
import styled from 'styled-components'
6
import SendIcon from '@mui/icons-material/Send'
6618 stevensc 7
 
7226 stevensc 8
import Options from '../UI/Option'
6618 stevensc 9
import ConfirmModal from '../modals/ConfirmModal'
10
import FormErrorFeedback from '../UI/FormErrorFeedback'
11
 
7226 stevensc 12
const StyledCommentForm = styled.form`
13
  display: flex;
14
  justify-content: flex-start;
15
  align-items: center;
16
  input {
17
    flex-grow: 1;
18
    padding: 0.5rem;
19
    background-color: var(--bg-color-secondary);
20
    border: 1px solid var(--border-primary);
7228 stevensc 21
    border-radius: var(--border-radius) 0 0 var(--border-radius);
7226 stevensc 22
  }
23
  button {
7228 stevensc 24
    border-radius: 0 var(--border-radius) var(--border-radius) 0;
25
    border: 1px solid var(--button-bg) !important;
7226 stevensc 26
  }
27
`
28
 
7228 stevensc 29
const StyledCommentList = styled.ul`
30
  display: flex;
31
  flex-direction: column;
32
  padding-right: 0.5rem;
33
  gap: 0.5rem;
34
  margin-top: 0.5rem;
35
  max-height: 300px;
36
  overflow-y: auto;
7231 stevensc 37
  width: 100%;
7228 stevensc 38
`
39
 
7231 stevensc 40
const StyledComment = styled.div`
7228 stevensc 41
  display: flex;
42
  gap: 0.5rem;
43
  align-items: flex-start;
44
  .content {
45
    background-color: var(--chat-send);
46
    border-radius: var(--border-radius);
47
    display: flex;
48
    flex-direction: column;
49
    flex-grow: 1;
50
    gap: 0.5rem;
7231 stevensc 51
    max-width: 100%;
52
    overflow: hidden;
7228 stevensc 53
    padding: 0.5rem;
7229 stevensc 54
    position: relative;
7231 stevensc 55
    p {
56
      max-width: 100%;
57
      overflow: hidden;
58
      text-overflow: ellipsis;
59
    }
7228 stevensc 60
  }
61
  .info {
7229 stevensc 62
    display: inline-flex;
63
    flex-direction: column;
7228 stevensc 64
    h3 {
65
      color: var(--title-color);
66
      font-weight: 600;
67
    }
68
    span {
69
      color: var(--subtitle-color);
70
      font-size: 0.9rem;
71
    }
72
  }
73
`
74
 
7226 stevensc 75
export const CommentForm = ({
6618 stevensc 76
  image = '/images/avatar.jpg',
7226 stevensc 77
  onSubmit = () => null,
6618 stevensc 78
}) => {
79
  const { register, handleSubmit, errors, reset } = useForm()
7226 stevensc 80
 
6618 stevensc 81
  const labels = useSelector(({ intl }) => intl.labels)
82
 
7226 stevensc 83
  const submitHandler = handleSubmit(async (data) => {
84
    await onSubmit(data)
85
    reset()
86
  })
6618 stevensc 87
 
88
  return (
7226 stevensc 89
    <>
90
      <StyledCommentForm onSubmit={submitHandler}>
7228 stevensc 91
        {image && (
92
          <Avatar
93
            src={image}
94
            alt="Profile image"
95
            sx={{ marginRight: '.5rem', width: '45px', height: '45px' }}
96
          />
97
        )}
6618 stevensc 98
        <input
99
          type="text"
100
          name="comment"
101
          maxLength="256"
102
          placeholder={labels.write_a_comment}
103
          ref={register({ required: 'El campo es requerido' })}
104
        />
7226 stevensc 105
        <button className="btn btn-primary">
106
          <SendIcon />
6618 stevensc 107
        </button>
7226 stevensc 108
      </StyledCommentForm>
6618 stevensc 109
      {errors.comment && (
110
        <FormErrorFeedback>{errors.comment.message}</FormErrorFeedback>
111
      )}
7226 stevensc 112
    </>
6618 stevensc 113
  )
114
}
115
 
7226 stevensc 116
export const CommentsList = ({ comments, onDelete }) => {
6618 stevensc 117
  return (
7228 stevensc 118
    <>
119
      <StyledCommentList>
120
        {comments.map((comment) => {
121
          return (
122
            <li key={comment.unique}>
123
              <CommentsList.Item comment={comment} onDelete={onDelete} />
124
            </li>
125
          )
126
        })}
127
      </StyledCommentList>
128
    </>
6618 stevensc 129
  )
130
}
131
 
7226 stevensc 132
const Comment = ({ onDelete, comment }) => {
133
  const [showConfirmModal, setShowConfirmModal] = useState(false)
134
  const labels = useSelector(({ intl }) => intl.labels)
135
 
6618 stevensc 136
  const {
137
    unique,
138
    user_url,
139
    user_name,
7138 stevensc 140
    // user_image = '/images/avatar.jpg',
6618 stevensc 141
    time_elapsed,
142
    comment: content,
143
    link_delete,
144
  } = comment
145
 
7225 stevensc 146
  const toggleModal = () => {
147
    setShowConfirmModal(!showConfirmModal)
148
  }
6618 stevensc 149
 
150
  return (
7228 stevensc 151
    <>
152
      <StyledComment>
153
        <div className="content">
6618 stevensc 154
          <div className="info">
155
            <a href={user_url}>
156
              <h3>{user_name}</h3>
157
            </a>
7226 stevensc 158
            <span>{time_elapsed}</span>
6618 stevensc 159
          </div>
7228 stevensc 160
          {link_delete && (
161
            <Options
162
              options={[
163
                {
164
                  label: labels.delete,
165
                  action: toggleModal,
166
                },
167
              ]}
7229 stevensc 168
              right="0.5rem"
169
              top="1.5rem"
7228 stevensc 170
            />
171
          )}
6618 stevensc 172
          <p>{content}</p>
173
        </div>
7228 stevensc 174
      </StyledComment>
6618 stevensc 175
      <ConfirmModal
176
        show={showConfirmModal}
177
        onClose={toggleModal}
178
        onAccept={() => onDelete(unique, link_delete)}
179
        acceptLabel={labels.accept}
180
      />
7228 stevensc 181
    </>
6618 stevensc 182
  )
183
}
184
 
7226 stevensc 185
CommentsList.Item = Comment