todo-app

Форк
0
/
use-progress.ts 
51 строка · 1.3 Кб
1
import { useState, useEffect, useMemo } from 'react';
2
import { toDate, clamp } from '@/shared/utils';
3

4
const calculateProgress = (start: Date, end: Date) => {
5
  const duration = end.getTime() - start.getTime();
6
  if (duration > 0) {
7
    const now = Date.now() - start.getTime();
8

9
    return clamp(0, 1, now / duration);
10
  }
11

12
  return 0;
13
};
14

15
export const useProgress = (
16
  start: Date | string,
17
  end: Date | string,
18
  frequency = 1,
19
  autoUpdate = true,
20
) => {
21
  const [progress, setProgress] = useState(0);
22
  const preparedStart = useMemo(() => toDate(start), [start]);
23
  const preparedEnd = useMemo(() => toDate(end), [end]);
24
  const delay = 1000 / frequency;
25

26
  useEffect(() => {
27
    const duration = preparedEnd.getTime() - preparedStart.getTime();
28
    if (duration <= 0) {
29
      return;
30
    }
31

32
    setProgress(calculateProgress(preparedStart, preparedEnd));
33

34
    if (autoUpdate) {
35
      const intervalId = window.setInterval(() => {
36
        const newProgress = calculateProgress(preparedStart, preparedEnd);
37
        setProgress(newProgress);
38

39
        if (newProgress === 1) {
40
          window.clearInterval(intervalId);
41
        }
42
      }, delay);
43

44
      return () => {
45
        window.clearInterval(intervalId);
46
      };
47
    }
48
  }, [preparedStart, preparedEnd, delay, autoUpdate]);
49

50
  return progress;
51
};
52

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.