Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16660 | Rev 16724 | 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,
105
  feedShared
106
}) => {
107
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
108
 
109
  const readMoreHandler = () => {
110
    setIsReadMoreActive(!isReadMoreActive)
111
  }
112
 
113
  const htmlParsedText = (fullStringText) => {
114
    const fullText = parse(fullStringText)
115
 
116
    if (fullStringText.length > 500) {
117
      const shortenedString = fullStringText.substr(0, 500)
118
      const shortenedText = parse(`${shortenedString}... `)
119
 
120
      return (
121
        <>
122
          {isReadMoreActive ? fullText : shortenedText}
123
          <button className="btn py-0 px-1" onClick={readMoreHandler}>
124
            {isReadMoreActive ? ' Leer menos' : ' Leer más'}
125
          </button>
126
        </>
127
      )
128
    }
129
 
130
    return fullText
131
  }
132
 
133
  return (
134
    <div className={styles.feed_content}>
135
      {description && htmlParsedText(description)}
136
      {image && (
16660 stevensc 137
        <div className={styles.img_container}>
16666 stevensc 138
          <img src={image} alt="Article image" />
139
          <img src={image} alt="Article image" />
16650 stevensc 140
        </div>
141
      )}
16655 stevensc 142
      {video && (
143
        <video src={video} preload="none" poster={previewImage} controls />
144
      )}
145
      {document && (
146
        <a href={document} target="_blank" rel="noreferrer">
147
          Descargar
148
        </a>
149
      )}
16659 stevensc 150
      {feedShared.owner_description && <FeedTemplate feed={feedShared} />}
16650 stevensc 151
    </div>
152
  )
153
}
154
 
155
FeedTemplate.Header = Header
16655 stevensc 156
FeedTemplate.Content = Body
16650 stevensc 157
 
158
export default React.memo(FeedTemplate)