Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2388 | Rev 2390 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect, useState } from 'react'
import { useHistory, useParams } from 'react-router-dom'
import { useSelector } from 'react-redux'
import { Container, Grid } from '@mui/material'
import parse from 'html-react-parser'

import useFetch from '@app/hooks/useFetch'

import Widget from '@app/components/UI/Widget'
import SurveyForm from '@app/components/survey-form/SurveyForm'
import AuthNavbar from '@app/components/UI/auth-navbar'
import { axios } from '@app/utils'

function ShorterPostPage() {
  const { id } = useParams()
  const history = useHistory()
  const { data } = useFetch(`/shorter/${id}`, null)
  const [post, setPost] = useState({})
  const { isAuth } = useSelector((state) => state.auth)

  const getPost = async (url) => {
    return await axios.get(url).then((res) => res.data)
  }

  useEffect(() => {
    if (data?.redirect) return history.replace(data?.url)

    getPost(data?.url)
      .then((post) => setPost(post))
      .catch((error) => console.log(error))
  }, [data])

  return (
    <>
      {!isAuth ? <AuthNavbar /> : null}
      <Container>
        <Grid
          container
          sx={{
            display: 'flex',
            justifyContent: 'center',
            alignItems: 'center'
          }}
        >
          <Grid item xs={12} md={8}>
            <Widget>
              <Widget.Header
                avatar={post.shared_image}
                title={post.shared_title}
              />

              <Widget.Body>
                <FeedContent
                  type='description'
                  content={{ owner_description: post.shared_description ?? '' }}
                />
              </Widget.Body>
            </Widget>
          </Grid>
        </Grid>
      </Container>
    </>
  )
}

const FeedContent = ({ type, content }) => {
  const renderContent = ({
    owner_description,
    owner_file_image_preview,
    owner_file_video,
    owner_file_image,
    shared_name,
    shared_image,
    shared_time_elapse,
    feed_vote_url
  }) => {
    switch (type) {
      case 'fast-survey': {
        const answers = []
        const votes = []

        for (let i = 1; i < 6; i++) {
          answers.push(owner_description[`answer${i}`])
          votes.push(owner_description[`votes${i}`])
        }

        return (
          <SurveyForm
            active={owner_description.active}
            question={owner_description.question}
            answers={answers}
            votes={votes}
            time={owner_description.time_remaining}
            voteUrl={feed_vote_url}
            resultType={owner_description.result_type}
          />
        )
      }

      case 'video': {
        return (
          <>
            {parse(owner_description ?? '')}
            <video controls poster={owner_file_image_preview}>
              <source src={owner_file_video} />
            </video>
          </>
        )
      }

      case 'image': {
        return (
          <>
            {parse(owner_description ?? '')}
            <img src={owner_file_image} loading='lazy' />
          </>
        )
      }

      case 'document': {
        return (
          <>
            {parse(owner_description ?? '')}
            <a href={document} target='_blank' rel='noreferrer'>
              <img className='pdf' src='/images/extension/pdf.png' alt='pdf' />
            </a>
          </>
        )
      }

      case 'shared': {
        return (
          <>
            {parse(owner_description ?? '')}
            <Widget>
              <Widget.Header
                avatar={shared_image}
                title={shared_name}
                subheader={shared_time_elapse}
              />

              <Widget.Body>
                {renderContent({
                  owner_description,
                  owner_file_image_preview,
                  owner_file_video,
                  owner_file_image,
                  shared_name,
                  shared_image,
                  shared_time_elapse,
                  feed_vote_url
                })}
              </Widget.Body>
            </Widget>
          </>
        )
      }

      default: {
        return parse(owner_description)
      }
    }
  }

  return <>{renderContent(content)}</>
}

export default ShorterPostPage