Proyectos de Subversion LeadersLinked - Backend

Rev

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