Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7101 | Rev 7230 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
7065 stevensc 1
import React, { useEffect, useState } from 'react'
7066 stevensc 2
import { axios } from '../../utils'
7062 stevensc 3
import { useParams } from 'react-router-dom'
7066 stevensc 4
import { Col, Container, Row } from 'react-bootstrap'
5
import { addNotification } from '../../redux/notification/notification.actions'
6
import { useDispatch, useSelector } from 'react-redux'
7
import {
8
  Card,
9
  CardActions,
10
  CardContent,
11
  CardMedia,
12
  Typography,
13
} from '@mui/material'
14
import parse from 'html-react-parser'
7065 stevensc 15
import styled from 'styled-components'
7066 stevensc 16
import FileDownloadIcon from '@mui/icons-material/FileDownload'
7062 stevensc 17
 
7066 stevensc 18
import ReactionsButton from '../../components/UI/buttons/ReactionsButton'
7080 stevensc 19
import FeedCommentSection from '../../components/feed/CommentSection'
7066 stevensc 20
 
7065 stevensc 21
const KnowledgeCard = styled(Card)`
22
  background-color: var(--bg-color);
23
  border-radius: var(--border-radius);
7068 stevensc 24
  overflow: visible;
7065 stevensc 25
  height: fit-content;
7068 stevensc 26
 
27
  & > img {
28
    border-top-right-radius: var(--border-radius);
29
    border-top-left-radius: var(--border-radius);
30
  }
7065 stevensc 31
`
32
 
7066 stevensc 33
const KnowledgeActions = styled(CardActions)`
7067 stevensc 34
  & > * {
7066 stevensc 35
    flex: 1;
36
    max-width: calc(100% / 3);
37
  }
38
`
39
 
7062 stevensc 40
const KnowledgeViewPage = () => {
7080 stevensc 41
  const [comments, setComments] = useState([])
7065 stevensc 42
  const [knowledge, setKnowledge] = useState({
43
    category: '',
44
    title: '',
45
    description: '',
46
    link: null,
47
    image: '',
48
    attachment: '',
49
    reaction: '',
50
    routeComments: '',
51
    routeCommentAdd: '',
52
    routeSaveReaction: '',
53
    routeDeleteReaction: '',
54
  })
55
  const labels = useSelector(({ intl }) => intl.labels)
56
  const dispatch = useDispatch()
7062 stevensc 57
  const { uuid } = useParams()
58
 
7066 stevensc 59
  const changeReaction = (reaction) => {
7080 stevensc 60
    setKnowledge((prevKnowledge) => ({ ...prevKnowledge }))
7066 stevensc 61
  }
62
 
7062 stevensc 63
  useEffect(() => {
64
    axios
65
      .get(`/knowledge-area/view/${uuid}`, {
66
        headers: {
67
          'Content-Type': 'application/json',
68
        },
69
      })
7065 stevensc 70
      .then((response) => {
71
        const { data, success } = response.data
72
        if (!success) {
73
          const errorMessage =
7201 stevensc 74
            typeof data === 'string'
75
              ? data
76
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
7065 stevensc 77
 
78
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
79
          return
80
        }
81
 
82
        setKnowledge(data)
83
      })
84
      .catch((err) => {
85
        dispatch(
86
          addNotification({
87
            style: 'danger',
7201 stevensc 88
            msg: 'Error interno. Por favor, inténtelo de nuevo más tarde.',
7065 stevensc 89
          })
90
        )
91
        throw new Error(err)
92
      })
7062 stevensc 93
  }, [uuid])
94
 
7080 stevensc 95
  useEffect(() => {
96
    if (!knowledge.routeComments) return
97
 
98
    axios
99
      .get(knowledge.routeComments)
100
      .then((response) => {
101
        const { data, success } = response.data
102
 
103
        if (!success) {
104
          const errorMessage =
7201 stevensc 105
            typeof data === 'string'
106
              ? data
107
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
7080 stevensc 108
 
109
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
110
          return
111
        }
112
 
113
        setComments(data)
114
      })
115
      .catch((err) => {
116
        dispatch(
117
          addNotification({
118
            style: 'danger',
7201 stevensc 119
            msg: 'Error interno. Por favor, inténtelo de nuevo más tarde.',
7080 stevensc 120
          })
121
        )
122
        throw new Error(err)
123
      })
124
  }, [knowledge])
125
 
7065 stevensc 126
  return (
127
    <Container as="section">
7082 stevensc 128
      <h2 className="text-center mb-3">{labels.knowledge_area_title}</h2>
7066 stevensc 129
      <Row>
130
        <Col className="mx-auto" md="8">
131
          <KnowledgeCard>
132
            <CardMedia
133
              component="img"
7067 stevensc 134
              height="250"
7066 stevensc 135
              image={knowledge.image}
136
              alt={`${knowledge.title} image`}
137
            />
138
            <CardContent>
139
              <Typography variant="h5">{knowledge.title}</Typography>
140
              <Typography variant="subtitle1" color="text.secondary">
141
                {knowledge.category}
142
              </Typography>
143
              {knowledge.description && parse(knowledge.description)}
144
            </CardContent>
7067 stevensc 145
            <KnowledgeActions>
7068 stevensc 146
              <ReactionsButton
147
                onChange={changeReaction}
148
                currentReaction={knowledge.reaction}
149
                withLabel
150
                deleteUrl={knowledge.routeDeleteReaction}
7101 stevensc 151
                saveUrl={knowledge.routeSaveReaction}
7068 stevensc 152
              />
153
 
7066 stevensc 154
              {knowledge.attachment && (
7068 stevensc 155
                <a
156
                  href={knowledge.attachment}
157
                  download
158
                  className="btn reaction-btn"
159
                >
160
                  <FileDownloadIcon />
161
                  {labels.knowledge_area_download_attachment}
162
                </a>
7066 stevensc 163
              )}
164
              {knowledge.link && (
7068 stevensc 165
                <a
166
                  href={knowledge.link}
167
                  className="btn reaction-btn"
168
                  target="_blank"
169
                  rel="noreferrer"
170
                >
171
                  {labels.knowledge_area_go_to_link}
172
                </a>
7066 stevensc 173
              )}
7081 stevensc 174
            </KnowledgeActions>
175
            <div className="px-3">
7080 stevensc 176
              <FeedCommentSection
177
                currentComments={comments}
178
                addUrl={knowledge.routeCommentAdd}
179
                isShow
180
              />
7081 stevensc 181
            </div>
7066 stevensc 182
          </KnowledgeCard>
183
        </Col>
184
      </Row>
7065 stevensc 185
    </Container>
186
  )
7062 stevensc 187
}
188
 
189
export default KnowledgeViewPage