Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
7212 stevensc 1
import React, { useEffect, useRef, useState } from 'react'
7209 stevensc 2
import { axios } from '../../utils'
7213 stevensc 3
import { useHistory, useLocation } from 'react-router-dom'
7209 stevensc 4
import { addNotification } from '../../redux/notification/notification.actions'
7212 stevensc 5
import { useDispatch, useSelector } from 'react-redux'
6
import { Col, Container, Row } from 'react-bootstrap'
7218 stevensc 7
import styled from 'styled-components'
8
 
7212 stevensc 9
import QuestionCard from '../../components/my-coach/QuestionCard'
10
import ConfirmModal from '../../components/modals/ConfirmModal'
7217 stevensc 11
import AnswerCard from '../../components/my-coach/AnswerCard'
7220 stevensc 12
import AnswerModal from '../../components/my-coach/AnswerModal'
7209 stevensc 13
 
7218 stevensc 14
const StyledSection = styled(Col)`
15
  display: flex;
16
  flex-direction: column;
17
  gap: 0.5rem;
18
  margin: auto;
19
`
20
 
7209 stevensc 21
const MyCoachViewPage = () => {
7212 stevensc 22
  const [question, setQuestion] = useState({})
7216 stevensc 23
  const [answers, setAnswers] = useState([])
7212 stevensc 24
  const [modalShow, setModalShow] = useState(null)
25
  const addUrl = useRef('')
26
  const actionUrl = useRef('')
27
  const labels = useSelector(({ intl }) => intl.labels)
7209 stevensc 28
  const dispatch = useDispatch()
29
  const { pathname } = useLocation()
7213 stevensc 30
  const history = useHistory()
7209 stevensc 31
 
32
  const getQuestion = () => {
33
    axios
7211 stevensc 34
      .get(pathname, {
7209 stevensc 35
        headers: {
36
          'Content-Type': 'application/json',
37
        },
38
      })
39
      .then((response) => {
40
        const { data, success } = response.data
41
 
42
        if (!success) {
43
          const errorMessage =
44
            typeof data === 'string'
45
              ? data
46
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
47
 
48
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
49
          return
50
        }
51
 
7212 stevensc 52
        addUrl.current = data.link_answers_add
53
        setQuestion(data)
7209 stevensc 54
      })
55
      .catch((error) => {
56
        dispatch(
57
          addNotification({
58
            style: 'danger',
59
            msg: 'Error interno. Por favor, inténtelo de nuevo más tarde.',
60
          })
61
        )
62
        throw new Error(error)
63
      })
64
  }
65
 
7212 stevensc 66
  const confirmDelete = () => {
67
    axios
68
      .post(actionUrl.current)
69
      .then((response) => {
70
        const { data, success } = response.data
71
 
72
        if (!success) {
73
          const errorMessage =
74
            typeof data === 'string'
75
              ? data
76
              : 'Ha ocurrido un error, por favor intente más tarde.'
77
 
78
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
79
          return
80
        }
81
 
7213 stevensc 82
        closeModal()
7212 stevensc 83
        dispatch(addNotification({ style: 'success', msg: data }))
7214 stevensc 84
        history.replace('/my-coach')
7212 stevensc 85
      })
86
      .catch((error) => {
87
        dispatch(
88
          addNotification({
89
            style: 'danger',
90
            msg: 'Ha ocurrido un error, por favor intente más tarde.',
91
          })
92
        )
93
        throw new Error(error)
94
      })
95
  }
96
 
97
  const deleteQuestion = (url) => {
98
    actionUrl.current = url
99
    setModalShow('delete')
100
  }
101
 
102
  const editQuestion = (url) => {
103
    actionUrl.current = url
104
    setModalShow('edit')
105
  }
106
 
107
  const closeModal = () => {
108
    actionUrl.current = ''
109
    setModalShow(null)
110
  }
111
 
7220 stevensc 112
  const addAnswer = () => {
113
    setModalShow('addAnswer')
114
  }
115
 
116
  const onAddAnswer = ({ answers, item }) => {
117
    setQuestion((prevQuestion) => ({ ...prevQuestion, answers }))
118
    setAnswers((prevAnswers) => [item, ...prevAnswers])
119
  }
120
 
7209 stevensc 121
  useEffect(() => {
122
    getQuestion()
123
  }, [])
124
 
7216 stevensc 125
  useEffect(() => {
126
    if (question.link_answers) {
127
      axios
128
        .get(question.link_answers)
129
        .then((response) => {
130
          const { data, success } = response.data
131
 
132
          if (!success) {
133
            const errorMessage =
134
              typeof data === 'string'
135
                ? data
136
                : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
137
 
138
            dispatch(addNotification({ style: 'danger', msg: errorMessage }))
139
            return
140
          }
141
 
7217 stevensc 142
          setAnswers(data.items)
7216 stevensc 143
        })
144
        .catch((error) => {
145
          dispatch(
146
            addNotification({
147
              style: 'danger',
148
              msg: 'Error interno. Por favor, inténtelo de nuevo más tarde.',
149
            })
150
          )
151
          throw new Error(error)
152
        })
153
    }
154
  }, [question])
155
 
7212 stevensc 156
  return (
157
    <>
158
      <Container as="section" className="companies-info">
159
        <div className="company-title">
160
          <h1 className="title mx-auto">{labels.my_coach}</h1>
161
        </div>
162
        <Row>
7218 stevensc 163
          <StyledSection md="8">
7212 stevensc 164
            <QuestionCard
165
              key={question.uuid}
166
              onEdit={editQuestion}
167
              onDelete={deleteQuestion}
7220 stevensc 168
              onReply={addAnswer}
7212 stevensc 169
              {...question}
170
            />
7217 stevensc 171
            {answers.map((answer) => (
172
              <AnswerCard key={answer.unique} {...answer} />
173
            ))}
7218 stevensc 174
          </StyledSection>
7212 stevensc 175
        </Row>
176
      </Container>
7220 stevensc 177
      <AnswerModal
178
        url={addUrl.current}
179
        show={modalShow === 'addAnswer'}
180
        onClose={closeModal}
181
        onComplete={onAddAnswer}
182
      />
7212 stevensc 183
      <ConfirmModal
184
        show={modalShow === 'delete'}
185
        onClose={closeModal}
186
        onAccept={confirmDelete}
187
      />
188
    </>
189
  )
7209 stevensc 190
}
191
 
192
export default MyCoachViewPage