production-taskbar-client / src / renderer / features / programs / program_button / useLongPressRestart.js
useLongPressRestart.js
Raw
import { useState, useEffect, useCallback } from "react";

export default function useLongPressRestart(
  callback = () => {},
  releaseCallback = () => {},
  ms = 300
) {
  const [startLongPress, setStartLongPress] = useState(false);
  const [isInit, setIsInit] = useState(false);
  const [isTriggered, setIsTriggered] = useState(false);

  useEffect(() => {
    let timerId;
    let initTimerId;
    if (startLongPress) {
      if (isInit) {
        timerId = setTimeout(() => {
          callback();
          setIsTriggered(true);
        }, ms);
        initTimerId = setTimeout(() => {
          setIsInit(false);
        }, ms);
      }
    } else {
      clearTimeout(timerId);
      clearTimeout(initTimerId);
    }

    return () => {
      clearTimeout(timerId);
      clearTimeout(initTimerId);
    };
  }, [callback, ms, startLongPress, isInit]);

  const onStartCallback = useCallback(() => {
    setIsInit(true);
    setStartLongPress(true);
  }, []);

  const onEndCallback = useCallback(() => {
    setIsInit(false);
    setStartLongPress(false);
    if (isTriggered) {
      releaseCallback();
      setIsTriggered(false);
    }
  }, [isTriggered, releaseCallback]);

  return {
    events: {
      onMouseDown: onStartCallback,
      onTouchStart: onStartCallback,
      onMouseUp: onEndCallback,
      onMouseLeave: onEndCallback,
      onTouchEnd: onEndCallback,
    },
  };
}