Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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