Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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