hook.js 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import React, { useCallback, useEffect, useRef, useState } from 'react';
  2. import useResize from '@/utils/hooks/useResize';
  3. export function useFullScreen(elRef) {
  4. const [isFullScreen, setIsFullScreen] = useState(false);
  5. const fullScreenRef = useRef();
  6. fullScreenRef.current = isFullScreen;
  7. const toggleFullScreen = useCallback((e) => {
  8. if (!document.fullscreenElement) {
  9. elRef.current
  10. .requestFullscreen()
  11. .then(() => {
  12. setIsFullScreen(true);
  13. })
  14. .catch((err) => {
  15. console.log(err.message);
  16. });
  17. }
  18. }, []);
  19. useEffect(() => {
  20. const handleFullScreenChange = (e) => {
  21. setIsFullScreen(document.fullscreenElement === fullScreenRef.current);
  22. };
  23. elRef.current.onfullscreenchange = handleFullScreenChange;
  24. // elRef.current.addEventListener('fullscreenchange', handleFullScreenChange);
  25. return elRef.current.removeEventListener('fullscreenchange', handleFullScreenChange);
  26. }, []);
  27. return { isFullScreen, toggleFullScreen };
  28. }
  29. export function useParticlesJs(id) {
  30. useEffect(() => {
  31. window.particlesJS(id, {
  32. particles: {
  33. number: {
  34. value: 20,
  35. density: {
  36. enable: true,
  37. value_area: 400,
  38. },
  39. },
  40. color: {
  41. value: '#2FB3DF',
  42. },
  43. shape: {
  44. type: 'circle',
  45. stroke: {
  46. width: 0,
  47. color: '#000000',
  48. },
  49. polygon: {
  50. nb_sides: 5,
  51. },
  52. image: {
  53. src: 'img/github.svg',
  54. width: 100,
  55. height: 100,
  56. },
  57. },
  58. opacity: {
  59. value: 0.3,
  60. random: false,
  61. anim: {
  62. enable: false,
  63. speed: 1,
  64. opacity_min: 0.1,
  65. sync: false,
  66. },
  67. },
  68. size: {
  69. value: 3,
  70. random: true,
  71. anim: {
  72. enable: false,
  73. speed: 40,
  74. size_min: 0.1,
  75. sync: false,
  76. },
  77. },
  78. line_linked: {
  79. enable: true,
  80. distance: 150,
  81. color: '#2FB3DF',
  82. opacity: 0.3,
  83. width: 2,
  84. },
  85. move: {
  86. enable: true,
  87. speed: 6,
  88. direction: 'none',
  89. random: false,
  90. straight: false,
  91. out_mode: 'out',
  92. bounce: false,
  93. attract: {
  94. enable: false,
  95. rotateX: 600,
  96. rotateY: 1200,
  97. },
  98. },
  99. },
  100. interactivity: {
  101. detect_on: 'canvas',
  102. events: {
  103. onhover: {
  104. enable: false,
  105. mode: 'bubble',
  106. },
  107. onclick: {
  108. enable: false,
  109. mode: 'push',
  110. },
  111. resize: true,
  112. },
  113. modes: {
  114. grab: {
  115. distance: 400,
  116. line_linked: {
  117. opacity: 1,
  118. },
  119. },
  120. bubble: {
  121. distance: 400,
  122. size: 40,
  123. duration: 2,
  124. opacity: 8,
  125. speed: 3,
  126. },
  127. repulse: {
  128. distance: 200,
  129. duration: 0.4,
  130. },
  131. push: {
  132. particles_nb: 4,
  133. },
  134. remove: {
  135. particles_nb: 2,
  136. },
  137. },
  138. },
  139. retina_detect: true,
  140. });
  141. }, []);
  142. }