Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
5115 stevensc 1
/* eslint-disable camelcase */
3943 stevensc 2
/* eslint-disable react/prop-types */
4100 stevensc 3
import React, { useEffect, useRef, useState } from 'react'
4050 stevensc 4
import { axios } from '../../../../utils'
3943 stevensc 5
import { useForm } from 'react-hook-form'
6
import { connect } from 'react-redux'
7
import { addNotification } from '../../../../redux/notification/notification.actions'
3947 stevensc 8
import ConfirmModal from '../../../../shared/confirm-modal/ConfirmModal'
3943 stevensc 9
import FormErrorFeedback from '../../../../shared/form-error-feedback/FormErrorFeedback'
10
 
5577 stevensc 11
const FeedComments = ({
5115 stevensc 12
  isShow = true,
13
  image = '',
14
  addUrl = '',
5577 stevensc 15
  updateTotalComments = function () {},
16
  currentComments = [],
17
  addNotification,
3943 stevensc 18
}) => {
5115 stevensc 19
  const { register, handleSubmit, errors, reset } = useForm()
5584 stevensc 20
  const [comments, setComments] = useState(currentComments)
3943 stevensc 21
 
5577 stevensc 22
  const submitCommet = (data) => {
5115 stevensc 23
    const currentFormData = new FormData()
5577 stevensc 24
    Object.entries(data).forEach(([key, value]) =>
25
      currentFormData.append(key, value)
26
    )
4822 stevensc 27
 
5577 stevensc 28
    axios.post(addUrl, currentFormData).then(({ data: response }) => {
5586 stevensc 29
      const { success, data: message, total_comments } = response
30
 
31
      if (!success) {
32
        addNotification({ style: 'danger', msg: message })
5577 stevensc 33
        return
34
      }
3944 stevensc 35
 
5586 stevensc 36
      updateTotalComments(total_comments)
37
      setComments((prevMessages) => [...prevMessages, message])
5577 stevensc 38
      reset()
39
    })
5115 stevensc 40
  }
3943 stevensc 41
 
5577 stevensc 42
  const deleteComment = (commentUnique, deleteCommentUrl) => {
43
    axios
44
      .post(deleteCommentUrl)
5115 stevensc 45
      .then(({ data: response }) => {
46
        const { success, data, total_comments } = response
3943 stevensc 47
 
5115 stevensc 48
        if (!success) {
49
          return addNotification({ style: 'danger', msg: data })
50
        }
3943 stevensc 51
 
5115 stevensc 52
        updateTotalComments(total_comments)
5577 stevensc 53
        setComments((prevComments) =>
54
          prevComments.filter((comment) => comment.unique !== commentUnique)
55
        )
5115 stevensc 56
        addNotification({ style: 'success', msg: data })
57
      })
5577 stevensc 58
      .catch((error) =>
59
        addNotification({ style: 'danger', msg: error.message })
60
      )
5115 stevensc 61
  }
3943 stevensc 62
 
5609 stevensc 63
  useEffect(() => {
64
    setComments(currentComments)
65
  }, [currentComments])
66
 
5115 stevensc 67
  return (
5577 stevensc 68
    <div className={`comments-container ${isShow ? 'show' : 'hidden'}`}>
69
      <form
70
        className="feedCommentContainer"
71
        onSubmit={handleSubmit(submitCommet)}
72
      >
73
        {image && <img src={image} alt="User profile image" />}
74
        <input
75
          className="commentInput"
76
          type="text"
77
          name="comment"
78
          maxLength="256"
79
          placeholder={LABELS.WRITE_A_COMMENT}
80
          ref={register({ required: 'El campo es requerido' })}
81
        />
82
        <button className="shareIconContainer iconActive">
83
          <img src="/images/icons/send.png" className="fa img-icon" />
84
        </button>
85
      </form>
86
      {errors.comment && (
87
        <FormErrorFeedback>{errors.comment.message}</FormErrorFeedback>
88
      )}
89
      <FeedComments.List comments={comments} onDelete={deleteComment} />
90
    </div>
5115 stevensc 91
  )
3943 stevensc 92
}
93
 
5577 stevensc 94
const CommentsList = ({ comments, onDelete }) => {
95
  return (
96
    <ul className="comment-list">
5596 stevensc 97
      {comments.map((comment) => {
5577 stevensc 98
        return (
99
          <CommentsList.Item
100
            comment={comment}
101
            onDelete={onDelete}
102
            key={comment.unique}
103
          />
104
        )
105
      })}
106
    </ul>
107
  )
108
}
3947 stevensc 109
 
5577 stevensc 110
const CommentTemplate = ({ onDelete, comment }) => {
5582 stevensc 111
  const {
112
    unique,
113
    user_url,
114
    user_name,
115
    user_image,
116
    time_elapsed,
117
    comment: content,
118
    link_delete,
119
  } = comment
5115 stevensc 120
  const [showConfirmModal, setShowConfirmModal] = useState(false)
121
  const [displayOption, setDisplayOption] = useState(false)
122
  const deleteButton = useRef()
3947 stevensc 123
 
5577 stevensc 124
  const toggleModal = () => setShowConfirmModal(!showConfirmModal)
3947 stevensc 125
 
5115 stevensc 126
  useEffect(() => {
127
    const handleClickOutside = (event) => {
5577 stevensc 128
      if (
129
        deleteButton.current &&
130
        !deleteButton.current.contains(event.target)
131
      ) {
5115 stevensc 132
        setDisplayOption(false)
133
      }
134
    }
135
    document.addEventListener('mousedown', handleClickOutside)
3947 stevensc 136
 
5115 stevensc 137
    return () => {
138
      document.removeEventListener('mousedown', handleClickOutside)
139
    }
140
  }, [deleteButton])
4100 stevensc 141
 
5115 stevensc 142
  return (
5577 stevensc 143
    <li>
144
      <div className="comment-container">
5582 stevensc 145
        {user_image && (
146
          <img src={user_image} alt="user-image" className="user-image" />
5577 stevensc 147
        )}
148
        <div className="comment-content">
149
          <div className="info">
5582 stevensc 150
            <a href={user_url}>
151
              <h3>{user_name}</h3>
5577 stevensc 152
            </a>
153
            <span>
5582 stevensc 154
              {time_elapsed}
5577 stevensc 155
              {comment.link_delete && (
156
                <>
157
                  <img
158
                    src="/images/icons/options.png"
159
                    className="cursor-pointer img-icon options-sm"
160
                    onClick={() => setDisplayOption(!displayOption)}
161
                  />
162
                  <div
163
                    className={`comments-options ${
164
                      displayOption ? 'active' : ''
165
                    }`}
166
                  >
167
                    <ul>
168
                      <li>
169
                        <button
170
                          className="option-btn"
171
                          onClick={toggleModal}
172
                          ref={deleteButton}
173
                        >
174
                          <i className="fa fa-trash-o mr-1" />
175
                          {LABELS.DELETE}
176
                        </button>
177
                      </li>
178
                    </ul>
179
                  </div>
180
                </>
181
              )}
182
            </span>
183
          </div>
5582 stevensc 184
          <p>{content}</p>
5577 stevensc 185
        </div>
186
      </div>
187
      <ConfirmModal
188
        show={showConfirmModal}
189
        onClose={toggleModal}
5582 stevensc 190
        onAccept={() => onDelete(unique, link_delete)}
5577 stevensc 191
        acceptLabel={LABELS.ACCEPT}
192
      />
193
    </li>
5115 stevensc 194
  )
195
}
3947 stevensc 196
 
5577 stevensc 197
FeedComments.List = CommentsList
198
CommentsList.Item = CommentTemplate
3943 stevensc 199
 
200
const mapDispatchToProps = {
5577 stevensc 201
  addNotification: (notification) => addNotification(notification),
5115 stevensc 202
}
3943 stevensc 203
 
5577 stevensc 204
export default connect(null, mapDispatchToProps)(FeedComments)