is_mobile.js 993 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // @ts-check
  2. import { supportsPassiveEvents } from 'detect-passive-events';
  3. import { forceSingleColumn } from 'mastodon/initial_state';
  4. const LAYOUT_BREAKPOINT = 630;
  5. /**
  6. * @param {number} width
  7. * @returns {boolean}
  8. */
  9. export const isMobile = width => width <= LAYOUT_BREAKPOINT;
  10. /**
  11. * @returns {string}
  12. */
  13. export const layoutFromWindow = () => {
  14. if (isMobile(window.innerWidth)) {
  15. return 'mobile';
  16. } else if (forceSingleColumn) {
  17. return 'single-column';
  18. } else {
  19. return 'multi-column';
  20. }
  21. };
  22. const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
  23. const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
  24. let userTouching = false;
  25. const touchListener = () => {
  26. userTouching = true;
  27. window.removeEventListener('touchstart', touchListener, listenerOptions);
  28. };
  29. window.addEventListener('touchstart', touchListener, listenerOptions);
  30. export const isUserTouching = () => userTouching;
  31. export const isIOS = () => iOS;