Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16655 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
16650 stevensc 1
import React, { useState } from 'react'
2
import { deleteFeed } from '../../redux/feed/feed.actions'
3
import DeleteModal from '../../shared/DeleteModal'
4
import CommentSection from './CommentSection'
5
import parse from 'html-react-parser'
6
import styles from './feeds.module.scss'
7
 
8
const FeedTemplate = ({ feed }) => {
9
  const [showDeleteModal, setShowDeleteModal] = useState(false)
10
  const [commentState, setCommentState] = useState(feed.owner_comments)
11
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
12
 
13
  const closeModal = () => setShowDeleteModal(false)
14
 
15
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
16
 
17
  const htmlParsedText = (fullStringText) => {
18
    const fullText = parse(fullStringText)
19
    if (fullStringText.length > 500) {
20
      const shortenedString = fullStringText.substr(0, 500)
21
      const shortenedText = parse(`${shortenedString}... `)
22
      return (
23
        <React.Fragment>
24
          {isReadMoreActive ? fullText : shortenedText}
25
          <button className="btn py-0 px-1" onClick={readMoreHandler}>
26
            {isReadMoreActive ? ' Leer menos' : ' Leer más'}
27
          </button>
28
        </React.Fragment>
29
      )
30
    } else {
31
      return fullText
32
    }
33
  }
34
 
35
  return (
36
    <>
37
      <article className={styles.feed}>
38
        <FeedTemplate.Header
39
          name={feed.owner_name}
40
          image={feed.owner_image}
41
          profileUrl={feed.owner_url}
42
          timeElapsed={feed.owner_time_elapse}
43
          deleteUrl={feed.feed_delete_url}
44
        />
45
        <div className="job_descp">
46
          {feed.owner_description && (
47
            <div className="show-read-more">
48
              {htmlParsedText(feed.owner_description)}
49
            </div>
50
          )}
51
          {feed.owner_file_image && (
52
            <img src={feed.owner_file_image} className="Entradas" />
53
          )}
54
          {feed.owner_file_video && (
55
            <video
56
              src={feed.owner_file_video}
57
              controls
58
              poster={feed.owner_file_image_preview}
59
              preload="none"
60
            />
61
          )}
62
          {feed.owner_file_document && (
63
            <a href={feed.owner_file_document} target="_blank" rel="noreferrer">
64
              Descargar
65
            </a>
66
          )}
67
          {feed.shared_name && (
68
            <div className="shared-post-bar">
69
              <div className="post-bar">
70
                <div className="post_topbar">
71
                  <div className="usy-dt">
72
                    <img
73
                      src={feed.shared_image}
74
                      alt=""
75
                      style={{ width: '50px', height: 'auto' }}
76
                    />
77
                    <div className="usy-name">
78
                      <h3>{feed.shared_name}</h3>
79
                      <span>{feed.shared_time_elapse}</span>
80
                    </div>
81
                  </div>
82
                </div>
83
                <div className="job_descp">
84
                  <div className="show-read-more">
85
                    {htmlParsedText(feed.shared_description)}
86
                  </div>
87
                  {feed.shared_file_image && (
88
                    <img src={feed.shared_file_image} className="Entradas" />
89
                  )}
90
                  {feed.shared_file_video && (
91
                    <video
92
                      src={feed.shared_file_video}
93
                      controls
94
                      poster={feed.shared_file_image_preview}
95
                      preload="none"
96
                    />
97
                  )}
98
                  {feed.shared_file_document && (
99
                    <a
100
                      href={feed.shared_file_document}
101
                      target="_blank"
102
                      rel="noreferrer"
103
                    >
104
                      Descargar
105
                    </a>
106
                  )}
107
                </div>
108
              </div>
109
            </div>
110
          )}
111
        </div>
112
 
113
        <div className="job-status-bar">
114
          <ul
115
            className="d-flex align-items-center justify-content-start"
116
            style={{ gap: '1rem', margin: '10px 0', padding: '0' }}
117
          >
118
            <li>
119
              <i className="btn-indicator fa fa-comments mr-1" />
120
              {commentState}
121
            </li>
122
            <li>
123
              <i className="btn-indicator fa fa-share flip-horizontal ps-1" />
124
              {feed.owner_shared}
125
            </li>
126
          </ul>
127
        </div>
128
        <CommentSection
129
          comments_link_add={feed.comment_add_url}
130
          comments={feed.comments}
131
          owner_image={feed.owner_image}
132
          owner_url={feed.owner_url}
133
          setComment={setCommentState}
134
        />
135
      </article>
136
      <DeleteModal
137
        url={feed.feed_delete_url}
138
        isOpen={showDeleteModal}
139
        closeModal={closeModal}
140
        title="Esta seguro de borrar esta publicación?"
141
        action={() => deleteFeed(feed.feed_unique)}
142
        message="La publicación ha sido borrada"
143
      />
144
    </>
145
  )
146
}
147
 
148
const Header = ({ image, name, profileUrl, timeElapsed, deleteUrl }) => {
149
  const [displayOption, setDisplayOption] = useState(false)
150
 
151
  return (
152
    <div className={styles.feed_header}>
153
      <img src={image} alt={`${name} profile image`} />
154
 
155
      <div className={styles.feed_info}>
156
        <a href={profileUrl}>
157
          <h2>{name}</h2>
158
        </a>
159
        <span>{timeElapsed}</span>
160
      </div>
161
 
162
      {deleteUrl && (
163
        <div className="cursor-pointer d-flex align-items-center">
164
          <i
165
            className="fa fa-ellipsis-v"
166
            onClick={() => setDisplayOption(!displayOption)}
167
            style={{ fontSize: '1.5rem' }}
168
          />
169
          <ul
170
            className={`my-dropdown-menu dropdown-menu-end ${
171
              displayOption ? 'show' : ''
172
            }`}
173
          >
174
            <li className="dropdown-item">
175
              <button className="btn" type="button">
176
                <i className="fa fa-trash pe-2" />
177
                Borrar
178
              </button>
179
            </li>
180
          </ul>
181
        </div>
182
      )}
183
    </div>
184
  )
185
}
186
 
187
FeedTemplate.Header = Header
188
 
189
export default React.memo(FeedTemplate)