Логика скрипта с resize работает на ios иначе, чем на android

Рейтинг: 1Ответов: 1Опубликовано: 23.08.2023

я начинающий разработчик, разрабатываю проект на Next.js и передо мною встала проблема, что логика компонента (который я опишу ниже) работает на ios иначе, чем на других устройствах.

Компонент отслеживает ширину и высоту экрана, и, если ширина меньше высоты, показывает пользователю модальное окно, с просьбой перевернуть экран. На устройствах android, windows компонент работает как я и планировал, а на устройствах ios модальное окно показывается пользователю в любом случае. Я даже не знаю, почему на ios это может работать не так, как на других устройствах и в каком направлении копать.

Подскажите, пожалуйста, что здесь не так, или стоит реализовать эту фичу как-то по-другому?

Код компонента:

"use client";
import localFont from "next/font/local";
import { Children, PropsWithChildren, useEffect, useState } from "react";
import OrientationScreen from "./OrientationScreen";
import "./loader.css";

const geometriaMedium = localFont({
  src: "../../fonts/Geometria-Medium.woff",
});

const OrientationChange = ({ children }: PropsWithChildren) => {
  const [screenWidth, setScreenWidth] = useState<number>();
  const [screenHeight, setScreenHeight] = useState<number>();

  const [isCorrectOrientation, setIsCorrectOrientation] = useState<boolean>();
  const [loading, setLoading] = useState<boolean>(true);

  useEffect(() => {
    const handleResize = (event: UIEvent) => {
      setScreenWidth(window.screen.width);
      setScreenHeight(window.screen.height);
    };

    window.addEventListener("resize", handleResize, false);
    return () => {
      window.removeEventListener("resize", handleResize);
    };
  }, []);
  
  useEffect(() => {
    setIsCorrectOrientation(window.screen.width > window.screen.height);
    setLoading(false);
  }, [screenWidth, screenHeight]);

  if (loading) {
    return (
      <div className="loader-container">
        <div className="spinner"></div>
        <span
          className="loading text-[20px] mt-2 text-[#dd1181]"
          style={geometriaMedium.style}
        >
          Загрузка...
        </span>
      </div>
    );
  } else {
    return (
      <>
        {!isCorrectOrientation && <OrientationScreen></OrientationScreen>}
        {Children.map(children, (child) => (
          <>{child}</>
        ))}
      </>
    );
  }
};

export default OrientationChange;

Ответы

▲ 0Принят

Мне ответил мой ментор и указал на мою ошибку, на самом деле проблема была в том, что я использовал window.screen.width и window.screen.height, вместо window.innerWidth и window.innerHeight, когда первые две опции возвращают ширину и высоту устройства, а вторые две возвращают ширину и высоту именно отображаемого окна.innerWidth и innerHeight