Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16740 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
16655 stevensc 1
import React, { useEffect, useState } from 'react'
16726 stevensc 2
import parse from 'html-react-parser'
3
 
16741 stevensc 4
import SurveyForm from './survey/SurveyForm'
16666 stevensc 5
import CommentForm from './CommentForm'
6
import CommentsList from './CommentsList'
16655 stevensc 7
import Options from '../../shared/options/Options'
16726 stevensc 8
import DeleteModal from '../../shared/DeleteModal'
16650 stevensc 9
 
16726 stevensc 10
import { deleteFeed } from '../../redux/feed/feed.actions'
11
 
12
import styles from './feeds.module.scss'
13
 
16650 stevensc 14
const FeedTemplate = ({ feed }) => {
16666 stevensc 15
  const [comments, setComments] = useState(feed.comments)
16
  const [totalComments, setTotalComments] = useState(feed.owner_comments)
16650 stevensc 17
  const [showDeleteModal, setShowDeleteModal] = useState(false)
16655 stevensc 18
  const [options, setOptions] = useState([])
16650 stevensc 19
 
16655 stevensc 20
  const toggleModal = () => {
21
    setShowDeleteModal(!showDeleteModal)
22
  }
16650 stevensc 23
 
16666 stevensc 24
  const deleteComment = (id) => {
25
    setComments((prevComments) =>
26
      prevComments.filter((comment) => comment.unique === id)
27
    )
28
  }
29
 
16655 stevensc 30
  useEffect(() => {
31
    if (feed.feed_delete_url) {
32
      setOptions((prevOptions) =>
33
        prevOptions.concat({ label: 'Borrar', action: toggleModal })
16650 stevensc 34
      )
35
    }
16655 stevensc 36
  }, [])
16650 stevensc 37
 
38
  return (
39
    <>
40
      <article className={styles.feed}>
41
        <FeedTemplate.Header
42
          name={feed.owner_name}
43
          image={feed.owner_image}
44
          profileUrl={feed.owner_url}
45
          timeElapsed={feed.owner_time_elapse}
16655 stevensc 46
          options={options}
16650 stevensc 47
        />
16655 stevensc 48
        <FeedTemplate.Content
49
          description={feed.owner_description}
50
          image={feed.owner_file_image}
51
          previewImage={feed.owner_file_image_preview}
52
          video={feed.owner_file_video}
53
          document={feed.owner_file_document}
54
          feedShared={{
55
            owner_description: feed.shared_description,
56
            owner_file_image: feed.shared_file_image,
57
            owner_file_image_preview: feed.shared_file_image_preview,
58
            owner_file_video: feed.shared_file_video,
59
            owner_file_document: feed.shared_file_document,
16656 stevensc 60
            owner_time_elapse: feed.shared_time_elapse
16655 stevensc 61
          }}
16725 stevensc 62
          type={feed.feed_content_type}
16655 stevensc 63
        />
16740 stevensc 64
        {feed.comments_link_add && (
65
          <>
66
            <CommentForm
67
              image={feed.owner_image}
68
              profileUrl={feed.owner_url}
69
              sendUrl={feed.comments_link_add}
70
              onSubmit={(data) => {
71
                setTotalComments(data.total_comments)
72
                setComments(data.data)
73
              }}
74
            />
75
            <CommentsList comments={comments} onDelete={deleteComment} />
76
          </>
77
        )}
16650 stevensc 78
      </article>
79
      <DeleteModal
80
        url={feed.feed_delete_url}
81
        isOpen={showDeleteModal}
16658 stevensc 82
        closeModal={toggleModal}
16650 stevensc 83
        title="Esta seguro de borrar esta publicación?"
84
        action={() => deleteFeed(feed.feed_unique)}
85
        message="La publicación ha sido borrada"
86
      />
87
    </>
88
  )
89
}
90
 
16655 stevensc 91
const Header = ({ image, name, profileUrl, timeElapsed, options = null }) => {
16650 stevensc 92
  return (
93
    <div className={styles.feed_header}>
94
      <img src={image} alt={`${name} profile image`} />
95
 
96
      <div className={styles.feed_info}>
97
        <a href={profileUrl}>
98
          <h2>{name}</h2>
99
        </a>
100
        <span>{timeElapsed}</span>
101
      </div>
102
 
16740 stevensc 103
      {Boolean(options.length) && <Options options={options} />}
16655 stevensc 104
    </div>
105
  )
106
}
107
 
108
const Body = ({
109
  description,
110
  image,
111
  video,
112
  previewImage,
113
  document,
16724 stevensc 114
  feedShared,
115
  type
16655 stevensc 116
}) => {
117
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
118
 
119
  const readMoreHandler = () => {
120
    setIsReadMoreActive(!isReadMoreActive)
121
  }
122
 
123
  const htmlParsedText = (fullStringText) => {
124
    const fullText = parse(fullStringText)
125
 
126
    if (fullStringText.length > 500) {
127
      const shortenedString = fullStringText.substr(0, 500)
128
      const shortenedText = parse(`${shortenedString}... `)
129
 
130
      return (
131
        <>
132
          {isReadMoreActive ? fullText : shortenedText}
133
          <button className="btn py-0 px-1" onClick={readMoreHandler}>
134
            {isReadMoreActive ? ' Leer menos' : ' Leer más'}
135
          </button>
136
        </>
137
      )
138
    }
139
 
140
    return fullText
141
  }
142
 
143
  return (
144
    <div className={styles.feed_content}>
16724 stevensc 145
      {type !== 'fast-survey' ? (
146
        htmlParsedText(description)
147
      ) : (
16726 stevensc 148
        <SurveyForm
16724 stevensc 149
          active={description.active}
150
          question={description.question}
151
          answers={[
152
            description.answer1,
153
            description.answer2,
154
            description.answer3,
155
            description.answer4,
156
            description.answer5
157
          ]}
16741 stevensc 158
          votes={
159
            description.votes1 && [
160
              description.votes1,
161
              description.votes2,
162
              description.votes3,
163
              description.votes4,
164
              description.votes5
165
            ]
166
          }
16724 stevensc 167
          time={description.time_remaining}
16741 stevensc 168
          resultType={description.result_type}
16724 stevensc 169
        />
170
      )}
16655 stevensc 171
      {image && (
16660 stevensc 172
        <div className={styles.img_container}>
16666 stevensc 173
          <img src={image} alt="Article image" />
174
          <img src={image} alt="Article image" />
16650 stevensc 175
        </div>
176
      )}
16655 stevensc 177
      {video && (
178
        <video src={video} preload="none" poster={previewImage} controls />
179
      )}
180
      {document && (
181
        <a href={document} target="_blank" rel="noreferrer">
182
          Descargar
183
        </a>
184
      )}
16659 stevensc 185
      {feedShared.owner_description && <FeedTemplate feed={feedShared} />}
16650 stevensc 186
    </div>
187
  )
188
}
189
 
190
FeedTemplate.Header = Header
16655 stevensc 191
FeedTemplate.Content = Body
16650 stevensc 192
 
193
export default React.memo(FeedTemplate)