Proyectos de Subversion LeadersLinked - SPA

Rev

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

import React, { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { connect } from 'react-redux';
import { Box, IconButton, Modal } from '@mui/material';
import Carousel from 'react-slick';

import { addNotification } from '@app/redux/notification/notification.actions';
import { getSlide, markClose, markCompleted } from '@app/services/micro-learning';

import Button from '@app/components/UI/buttons/Buttons';
import Spinner from '@app/components/UI/Spinner';
import SlideCard from './slide-card';
import { NavigateNext, NavigateBefore } from '@mui/icons-material';
import CapsuleSuccessFeedback from './capsule-success-feedback';

const SlidesCarousel = ({
  show = false,
  onClose = () => null,
  slides: currentSlides = [],
  currentSlideIndex = 0,
  autoPlay = false,
  addNotification
}) => {
  const [loading, setLoading] = useState(false);
  const [slides, setSlides] = useState(currentSlides);
  const [currentSlide, setCurrentSlide] = useState(currentSlideIndex);
  const [showCompleteFeedback, setShowCompletedFeedback] = useState(false);
  const [completedFeedback, setCompletedFeedback] = useState('');

  const navigate = useNavigate();

  const handleComplete = async (url, uuid) => {
    try {
      const response = await markCompleted(url);

      if (response.link_close_capsule) {
        markClose(response?.link_close_capsule).then(() => {
          setCompletedFeedback('Felicidades has terminado una Cápsula');
          setShowCompletedFeedback(true);
        });
      }

      if (response.link_close_topic) {
        markClose(response?.link_close_topic).then((res) => {
          setCompletedFeedback('Felicidades has terminado una capsula y un Topico');
          setShowCompletedFeedback(true);
        });
      }

      const slidesClone = structuredClone(slides);
      const currentSlideIndex = slidesClone.findIndex((slide) => slide.uuid === uuid);

      const currentSlide = slidesClone[currentSlideIndex];
      currentSlide.completed = true;

      slidesClone[currentSlideIndex] = currentSlide;

      setSlides(slidesClone);

      const resMsg = response.message ?? response;

      addNotification({ style: 'success', msg: resMsg });
    } catch (error) {
      addNotification({ style: 'danger', msg: error.message });
    }
  };

  const handleChange = async (index) => {
    const currentSlide = slides[index];
    if (!currentSlide) return;

    setLoading(true);

    getSlide(currentSlide.link_get)
      .then((slide) => {
        setSlides((prevSlides) => {
          const newSlides = [...prevSlides];
          newSlides[index] = { ...currentSlide, ...slide };
          return newSlides;
        });
      })
      .catch((error) => addNotification({ style: 'danger', msg: error.message }))
      .finally(() => setLoading(false));
  };

  useEffect(() => {
    setSlides(currentSlides);
  }, [currentSlides]);

  useEffect(() => {
    handleChange(currentSlide);
  }, [currentSlide]);

  return (
    <Modal open={show} onClose={onClose}>
      <Box
        sx={{
          position: 'absolute',
          top: '50%',
          left: '50%',
          transform: 'translate(-50%, -50%)',
          maxWidth: { xs: '80vw', md: '800px' },
          height: 'fit-content',
          margin: 'auto',
          '& .slick-track': {
            display: 'flex',
            alignItems: 'center'
          }
        }}
      >
        {showCompleteFeedback ? (
          <CapsuleSuccessFeedback
            text={completedFeedback}
            onConfirm={() => navigate('/microlearning')}
          />
        ) : (
          <Carousel
            infinite={false}
            arrows={true}
            dots={false}
            slidesToShow={1}
            slidesToScroll={1}
            initialSlide={currentSlideIndex}
            beforeChange={(_, newIndex) => setCurrentSlide(newIndex)}
            nextArrow={
              <IconButton>
                <NavigateNext />
              </IconButton>
            }
            prevArrow={
              <IconButton>
                <NavigateBefore />
              </IconButton>
            }
          >
            {slides.map((slide) => (
              <Box
                key={slide.uuid}
                sx={{
                  display: 'flex !important',
                  flexDirection: 'column',
                  justifyContent: 'center',
                  alignItems: 'center',
                  margin: 'auto',
                  height: '100%'
                }}
              >
                {loading ? (
                  <Spinner />
                ) : (
                  <SlideCard
                    completed={slide.completed}
                    slide={slide}
                    autoPlay={autoPlay}
                    onComplete={() => handleComplete(slide.link_sync, slide.uuid)}
                  />
                )}

                {slide.type !== 'quiz' ? (
                  <Button
                    color='primary'
                    disabled={slide.completed}
                    onClick={() => handleComplete(slide.link_sync, slide.uuid)}
                    sx={{ width: '100%', mt: 2 }}
                  >
                    Marcar como completado
                  </Button>
                ) : null}
              </Box>
            ))}
          </Carousel>
        )}
      </Box>
    </Modal>
  );
};

const mapDispatchToProps = {
  addNotification: (notification) => addNotification(notification)
};

export default connect(null, mapDispatchToProps)(SlidesCarousel);