-
Notifications
You must be signed in to change notification settings - Fork 30
Throwing "ReferenceError: window is not defined" on Next.js with SSR #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
@ivanproskuryakov I am experiencing the same, let me know if you find a good fix. I am able to use Next's Script tag to load the TWA script and then do the JS there, but I would like to use this SDK. |
@kevcube Sure, I'll open a PR with a patch. |
"use client";
import Script from "next/script";
import { Telegram } from "@twa-dev/types";
declare global {
interface Window {
Telegram: Telegram;
}
}
export default function Page() {
return (
<Script
id="TelegramWebApp"
src="https://telegram.org/js/telegram-web-app.js"
onReady={() => {
window.Telegram.WebApp.MainButton.setParams({
text: `Hello`,
is_visible: true,
});
}}
/>
);
} I'm using Next 14, this can go in |
It didn't work for me. Anyone faced the issue and find a solution other than this? |
Just use telegram-mini-apps/twa.js and join @devs on telegram |
Just check if window is exist, like this:
something like this:
|
still the same issue i faced. No PR with fix merged ? |
The issue is still there! |
Still same + |
I meet this issue, and currently the workaround I used is to dynamic import the component which use
dynamic import the component:
|
You can use @telegram-apps/sdk-react without any problem. |
But some methods do not work with @telegram-apps/sdk-react |
I was having the same issue but with client component, wich as supposed to work, the problem is that next apparently import the packages as ssr by default as you can see in the base errors in the screenshot "at (ssr)" then I just imported the library this way, as I noted the issue on the error was that next was rendering the library at the server sidem then i came to the library and it was trying to access window, so it was nextjs fault, and this import worked to me let WebApp: any;
if (typeof window !== "undefined") {
WebApp = require("@twa-dev/sdk").default;
} Full code provider that I was using after the changes "use client";
import {
createContext,
useContext,
useEffect,
useMemo,
useState,
ReactNode,
} from "react";
import crypto from "crypto";
let WebApp: any;
if (typeof window !== "undefined") {
WebApp = require("@twa-dev/sdk").default;
}
export interface ITelegramContext {
isOnTelegram: boolean;
}
const TelegramContext = createContext<ITelegramContext>({
isOnTelegram: false,
});
export const TelegramProvider: React.FC<{ children: ReactNode }> = ({
children,
}) => {
const [isOnTelegram, setIsOnTelegram] = useState(false);
const [isValid, setIsValid] = useState("invalid");
const [initDataUnsafe, setInitDataUnsafe] = useState<any>();
const [initData, setInitData] = useState<any>();
//Make a api url for this function its not supposed to be here
const verifyInitData = (telegramInitData: string): boolean => {
const urlParams = new URLSearchParams(telegramInitData);
const hash = urlParams.get('hash');
urlParams.delete('hash');
urlParams.sort();
let dataCheckString = '';
for (const [key, value] of urlParams.entries()) {
dataCheckString += `${key}=${value}\n`;
}
dataCheckString = dataCheckString.slice(0, -1);
const secret = crypto.createHmac('sha256', 'WebAppData').update("bot_key");
const calculatedHash = crypto.createHmac('sha256', secret.digest()).update(dataCheckString).digest('hex');
return calculatedHash === hash;
}
useEffect(() => {
if (WebApp.initDataUnsafe.user) {
setIsOnTelegram(true);
setInitDataUnsafe(JSON.stringify(WebApp.initDataUnsafe.user));
const { hash, ...rest } = WebApp.initDataUnsafe.user;
}
if (WebApp?.initData) {
setIsOnTelegram(true);
setInitData(JSON.stringify(WebApp.initData));
setIsValid(verifyInitData(WebApp.initData) ? "valid" : "invalid");
}
}, []);
const value = useMemo(
() => ({ isOnTelegram }),
[isOnTelegram],
);
return (
<TelegramContext.Provider value={value}>
IsValid
{isValid}
<br />
Unsafe
{initDataUnsafe}
<br />
Data
{initData}
{children}
</TelegramContext.Provider>
);
};
export const useTelegram = (): ITelegramContext => useContext(TelegramContext); |
The library fails to work with the Next.js framework ("next": "^12.1.6") while SSR.
The issue is caused by the missing window object within the file node_modules/@twa-dev/sdk/dist/sdk.js, and it occurs at the time of import.
Ref: https://github.com/twa-dev/SDK/blob/master/src/sdk.ts
Transpiled file
Demo app:
Console output
The text was updated successfully, but these errors were encountered: