Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3481 stevensc 1
import React, { useCallback, useEffect, useRef, useState } from 'react';
3505 stevensc 2
 
3481 stevensc 3
import { useSelector } from 'react-redux';
4
import { Box, Typography } from '@mui/material';
5
 
6
import { useNearScreen, useMicroLearning } from '@hooks';
3505 stevensc 7
import { api } from '@shared/libs';
8
import { List, Spinner } from '@shared/components';
9
import DetailTag from '@microlearning/components/DetailTag';
3481 stevensc 10
 
3505 stevensc 11
export function TimelinePage() {
3481 stevensc 12
  const { link_timeline: linkTimeline } = useMicroLearning();
13
  const [items, setItems] = useState([]);
14
  const [isLoading, setIsLoading] = useState(false);
15
  const [totalPages, setTotalPages] = useState(1);
16
  const [currentPage, setCurrentPage] = useState(2);
17
  const loaderRef = useRef(null);
18
  const [isIntercepting] = useNearScreen({
19
    externalRef: loaderRef,
20
    once: false,
21
    rootMargin: '20px'
22
  });
23
 
24
  const fetchData = useCallback(
25
    (url = '') => {
26
      if (isLoading || !url) return;
27
 
28
      setIsLoading(true);
29
 
3505 stevensc 30
      api
3481 stevensc 31
        .get(`${url}?page=${currentPage}`)
3505 stevensc 32
        .then((data) => {
3481 stevensc 33
          setCurrentPage((prevCurrentPage) => prevCurrentPage + 1);
34
          setTotalPages(data.total.pages);
35
          setItems((prevItems) => [...prevItems, ...data.current.items]);
36
        })
37
        .catch((err) => console.log(err.message))
38
        .finally(() => setIsLoading(false));
39
    },
40
    [currentPage, isLoading, totalPages, linkTimeline]
41
  );
42
 
43
  useEffect(() => {
44
    if (isIntercepting) fetchData(linkTimeline);
45
  }, [isIntercepting]);
46
 
47
  useEffect(() => {
48
    const getData = (url = '') => {
49
      setIsLoading(true);
50
 
3505 stevensc 51
      api
3481 stevensc 52
        .get(url)
53
        .then((response) => {
54
          const { data, success } = response.data;
55
 
56
          if (!success) {
57
            throw new Error(data);
58
          }
59
 
60
          setTotalPages(data.total.pages);
61
          setItems(data.current.items);
62
        })
63
        .catch((err) => console.log(err.message))
64
        .finally(() => setIsLoading(false));
65
    };
66
 
67
    getData(linkTimeline);
68
  }, [linkTimeline]);
69
 
70
  return (
71
    <>
72
      <Typography variant='h2'>Linea de tiempo</Typography>
73
 
74
      <Box
75
        display='flex'
76
        flexDirection='column'
77
        gap={1}
78
        width='100%'
79
        mt={2}
80
        maxHeight='60vh'
81
        overflow='auto'
82
      >
83
        <TimelineList items={items} />
84
 
85
        <div ref={loaderRef}>{currentPage < totalPages ? <Spinner /> : null}</div>
86
      </Box>
87
    </>
88
  );
3505 stevensc 89
}
3481 stevensc 90
 
91
const TimelineList = ({ items = [] }) => {
92
  const labels = useSelector(({ intl }) => intl.labels);
93
 
94
  return (
3505 stevensc 95
    <List
96
      items={items}
97
      emptyMessage={labels.datatable_szerorecords}
98
      renderItem={({ activity, added_on }, i) => (
3481 stevensc 99
        <DetailTag key={i} title={activity} label={added_on} />
3505 stevensc 100
      )}
101
    />
3481 stevensc 102
  );
103
};