Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16725 | Rev 16740 | Ir a la última revisión | | 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
 
4
import SurveyForm from './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
        />
16666 stevensc 64
        <CommentForm
65
          image={feed.owner_image}
66
          profileUrl={feed.owner_url}
67
          sendUrl={feed.comments_link_add}
68
          onSubmit={(data) => {
69
            setTotalComments(data.total_comments)
70
            setComments(data.data)
71
          }}
16650 stevensc 72
        />
16666 stevensc 73
        <CommentsList comments={comments} onDelete={deleteComment} />
16650 stevensc 74
      </article>
75
      <DeleteModal
76
        url={feed.feed_delete_url}
77
        isOpen={showDeleteModal}
16658 stevensc 78
        closeModal={toggleModal}
16650 stevensc 79
        title="Esta seguro de borrar esta publicación?"
80
        action={() => deleteFeed(feed.feed_unique)}
81
        message="La publicación ha sido borrada"
82
      />
83
    </>
84
  )
85
}
86
 
16655 stevensc 87
const Header = ({ image, name, profileUrl, timeElapsed, options = null }) => {
16650 stevensc 88
  return (
89
    <div className={styles.feed_header}>
90
      <img src={image} alt={`${name} profile image`} />
91
 
92
      <div className={styles.feed_info}>
93
        <a href={profileUrl}>
94
          <h2>{name}</h2>
95
        </a>
96
        <span>{timeElapsed}</span>
97
      </div>
98
 
16655 stevensc 99
      {options && <Options options={options} />}
100
    </div>
101
  )
102
}
103
 
104
const Body = ({
105
  description,
106
  image,
107
  video,
108
  previewImage,
109
  document,
16724 stevensc 110
  feedShared,
111
  type
16655 stevensc 112
}) => {
113
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
114
 
115
  const readMoreHandler = () => {
116
    setIsReadMoreActive(!isReadMoreActive)
117
  }
118
 
119
  const htmlParsedText = (fullStringText) => {
120
    const fullText = parse(fullStringText)
121
 
122
    if (fullStringText.length > 500) {
123
      const shortenedString = fullStringText.substr(0, 500)
124
      const shortenedText = parse(`${shortenedString}... `)
125
 
126
      return (
127
        <>
128
          {isReadMoreActive ? fullText : shortenedText}
129
          <button className="btn py-0 px-1" onClick={readMoreHandler}>
130
            {isReadMoreActive ? ' Leer menos' : ' Leer más'}
131
          </button>
132
        </>
133
      )
134
    }
135
 
136
    return fullText
137
  }
138
 
139
  return (
140
    <div className={styles.feed_content}>
16724 stevensc 141
      {type !== 'fast-survey' ? (
142
        htmlParsedText(description)
143
      ) : (
16726 stevensc 144
        <SurveyForm
16724 stevensc 145
          active={description.active}
146
          question={description.question}
147
          answers={[
148
            description.answer1,
149
            description.answer2,
150
            description.answer3,
151
            description.answer4,
152
            description.answer5
153
          ]}
154
          time={description.time_remaining}
155
        />
156
      )}
16655 stevensc 157
      {image && (
16660 stevensc 158
        <div className={styles.img_container}>
16666 stevensc 159
          <img src={image} alt="Article image" />
160
          <img src={image} alt="Article image" />
16650 stevensc 161
        </div>
162
      )}
16655 stevensc 163
      {video && (
164
        <video src={video} preload="none" poster={previewImage} controls />
165
      )}
166
      {document && (
167
        <a href={document} target="_blank" rel="noreferrer">
168
          Descargar
169
        </a>
170
      )}
16659 stevensc 171
      {feedShared.owner_description && <FeedTemplate feed={feedShared} />}
16650 stevensc 172
    </div>
173
  )
174
}
175
 
176
FeedTemplate.Header = Header
16655 stevensc 177
FeedTemplate.Content = Body
16650 stevensc 178
 
179
export default React.memo(FeedTemplate)