useEdgeGesture.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import {useEffect, useState} from "react";
  2. import {toast} from "react-toastify";
  3. import {localStorageGet, localStorageSet} from "@utils/helpers";
  4. const objInfo={
  5. timer:null
  6. }
  7. const useEdgeGesture = () => {
  8. const [isSideGesture, setIsSideGesture] = useState(false);
  9. const getSidedGesture = () => {
  10. let isguesture=parseInt(localStorageGet("IOS_GUESTURE",0));
  11. if (isguesture===1){
  12. return 1;
  13. }
  14. return 0;
  15. }
  16. const setSidedGesture = (isGuesture=0) => {
  17. setIsSideGesture(isGuesture);
  18. localStorageSet("IOS_GUESTURE",isGuesture);
  19. }
  20. let isEdgeGesture=false;
  21. let isTouchingEdge = false;
  22. const handleGesture=(e)=>{
  23. if (global.isIOS){
  24. // 获取触摸点的坐标
  25. const touchX = e.touches[0].clientX;
  26. const touchY = e.touches[0].clientY;
  27. // 假设边缘手势区域的阈值为 20px
  28. const edgeThreshold = 20;
  29. // 检查触摸点是否在屏幕边缘
  30. const isGesture = touchX < edgeThreshold || touchX > window.innerWidth - edgeThreshold ||
  31. touchY < edgeThreshold || touchY > window.innerHeight - edgeThreshold;
  32. isEdgeGesture=isGesture;
  33. if (isEdgeGesture) {
  34. isTouchingEdge = false;
  35. // 如果触摸点在边缘区域内
  36. removeTouchMove();
  37. document.addEventListener("touchmove",handleGestureMove);
  38. } else {
  39. // 如果触摸点不在边缘区域内,重置触摸边缘的状态
  40. isTouchingEdge = false;
  41. setSidedGesture(0);
  42. removeTouchMove();
  43. }
  44. }
  45. }
  46. const handleGestureMove=(e)=>{
  47. if (isEdgeGesture){
  48. if (!isTouchingEdge) {
  49. // 如果之前没有触摸边缘,记录触摸边缘的状态,并设置一个定时器
  50. isTouchingEdge = true;
  51. resetTimer();
  52. objInfo.timer=setTimeout(function() {
  53. if (isTouchingEdge) {
  54. // console.log('用户执行了边缘手势');
  55. // // 这里可以执行相应的逻辑
  56. setSidedGesture(1);
  57. // toast.success("11111111");
  58. isTouchingEdge = false;
  59. removeTouchMove();
  60. }
  61. }, 60); // 设置一个时间阈值,例如 300 毫秒
  62. }
  63. }
  64. }
  65. const resetTimer=()=>{
  66. if (objInfo.timer!=null){
  67. clearTimeout(objInfo.timer);
  68. objInfo.timer=null;
  69. }
  70. }
  71. const removeTouchMove=()=>{
  72. document.removeEventListener('touchmove', handleGestureMove);
  73. }
  74. useEffect(() => {
  75. // 监听 touchstart 事件
  76. document.addEventListener('touchstart', handleGesture);
  77. // document.addEventListener('touchmove', handleGesture);
  78. return ()=>{
  79. document.removeEventListener('touchstart', handleGesture);
  80. removeTouchMove();
  81. resetTimer();
  82. }
  83. }, []);
  84. return {isSideGesture,setIsSideGesture,getSidedGesture,setSidedGesture};
  85. }
  86. export default useEdgeGesture;