vercel / next.js

The React Framework
https://nextjs.org
MIT License
125.92k stars 26.87k forks source link

Next 13.0.5 ismobileJs ( need to window ) #43541

Closed ekabil closed 1 year ago

ekabil commented 1 year ago

Verify canary release

Provide environment information

Operating System: Platform: darwin Arch: x64 Version: Darwin Kernel Version 22.1.0: Sun Oct 9 20:15:09 PDT 2022; root:xnu-8792.41.9~2/RELEASE_ARM64_T6000 Binaries: Node: 14.15.5 npm: 6.14.11 Yarn: 1.22.19 pnpm: N/A Relevant packages: next: 13.0.5 eslint-config-next: 13.0.5 react: 18.2.0 react-dom: 18.2.0

Which area of Next.js is affected? (leave empty if unsure)

No response

Link to reproduction - Issues with a link to complete (but minimal) reproduction code will be addressed faster

none

To Reproduce

none

Describe the Bug

Hello everyone,

Next js ile proje geliştiriyorum. burada eğer mobile cihaz ise bir component render etmek istiyorum. ama bu isMobileDevice değerini jsx içerisinde kullanırsam aşadıdaki hataları alıyorum.

import useTranslation from "next-translate/useTranslation";
import isMobile from "ismobilejs";
import DefaultLayout from "../../components/core/Layouts/Default";
import { MouseIcon, ScrollDownWrapper, ScrollText, SearchBoxWrapper, SliderWrapper, Wrapper } from "./style";
import MainSlider from "../../components/common/MainSlider";
import SearchBox from "../../components/common/SearchBox";

const HomeScreen = () => {
    const { t } = useTranslation("home");
    const isMobileDevice = isMobile()?.any;

    return (
        <DefaultLayout>
            <Wrapper>
                <SearchBoxWrapper>
                    <SearchBox />
                    {isMobileDevice && (
                        <ScrollDownWrapper>
                            <MouseIcon />
                            <ScrollText>{t("scrollDown")}</ScrollText>
                        </ScrollDownWrapper>
                    )}
                </SearchBoxWrapper>
                <SliderWrapper>
                    <MainSlider />
                </SliderWrapper>
            </Wrapper>
        </DefaultLayout>
    );
};

export default HomeScreen;

enter image description here

I want to render the project on client side using "use client" because isMobijeJs needs window object but it doesn't work.

Also i added to .babelrc.js

const plugins = [
  [
    "styled-components",
    {
      "ssr": true,
      "displayName": isDevelopment,
      "fileName": false,
      "preprocess": false
    }
  ]
];

and added to next.config.js

    reactStrictMode: true,
        experimental: {
        esmExternals: "loose",
        styledComponents: true,
    },
        compiler: {
        styledComponents: true,
    },

Can you help me?

Expected Behavior

i want to use ismobile in jsx

Which browser are you using? (if relevant)

No response

How are you deploying your application? (if relevant)

next dev

github-actions[bot] commented 1 year ago

We cannot recreate the issue with the provided information. Please add a reproduction in order for us to be able to investigate.

Why was this issue marked with the please add a complete reproduction label?

To be able to investigate, we need access to a reproduction to identify what triggered the issue. We prefer a link to a public GitHub repository (template), but you can also use a tool like CodeSandbox or StackBlitz.

To make sure the issue is resolved as quickly as possible, please make sure that the reproduction is as minimal as possible. This means that you should remove unnecessary code, files, and dependencies that do not contribute to the issue.

Please test your reproduction against the latest version of Next.js (next@canary) to make sure your issue has not already been fixed.

I added a link, why was it still marked?

Ensure the link is pointing to a codebase that is accessible (e.g. not a private repository). "example.com", "n/a", "will add later", etc. are not acceptable links -- we need to see a public codebase. See the above section for accepted links.

What happens if I don't provide a sufficient minimal reproduction?

Issues with the please add a complete reproduction label that receives no meaningful activity (e.g. new comments with a reproduction link) are automatically closed and locked after 30 days.

If your issue has not been resolved in that time and it has been closed/locked, please open a new issue with the required reproduction.

I did not open this issue, but it is relevant to me, what can I do to help?

Anyone experiencing the same issue is welcome to provide a minimal reproduction following the above steps. Furthermore, you can upvote the issue using the :+1: reaction on the topmost comment (please do not comment "I have the same issue" without repro steps). Then, we can sort issues by votes to prioritize.

I think my reproduction is good enough, why aren't you looking into it quicker?

We look into every Next.js issue and constantly monitor open issues for new comments.

However, sometimes we might miss one or two due to the popularity/high traffic of the repository. We apologize, and kindly ask you to refrain from tagging core maintainers, as that will usually not result in increased priority.

Upvoting issues to show your interest will help us prioritize and address them as quickly as possible. That said, every issue is important to us, and if an issue gets closed by accident, we encourage you to open a new one linking to the old issue and we will look into it.

Useful Resources

SamRoehrich commented 1 year ago

Could you use state and an effect?

const [isMobileDevice, setIsMobileDevice] = useState(null)

useEffect(() => {
    setIsMobileDevice(isMobile())
}, [])

return (
    {isMobileDevice && (...)}
)
ekabil commented 1 year ago

Could you use state and an effect?

const [isMobileDevice, setIsMobileDevice] = useState(null)

useEffect(() => {
    setIsMobileDevice(isMobile())
}, [])

return (
    {isMobileDevice && (...)}
)

yes it works but why? it will be bad to do it this way every time