Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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