From c8aa2fb4c9197461ba0c50ec5c52b5b55595642d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 19 Jan 2026 09:35:57 +0100 Subject: [PATCH] fixed "SequenceNativeReceiver object missing" --- .../WebGLTemplates/SequenceReact/src/App.tsx | 330 +++++++++--------- .../WebGLTemplates/SequenceReact/src/App.tsx | 6 +- Packages/Sequence-Unity/package.json | 2 +- 3 files changed, 171 insertions(+), 167 deletions(-) diff --git a/Assets/WebGLTemplates/SequenceReact/src/App.tsx b/Assets/WebGLTemplates/SequenceReact/src/App.tsx index 3716d805..e5fb631c 100644 --- a/Assets/WebGLTemplates/SequenceReact/src/App.tsx +++ b/Assets/WebGLTemplates/SequenceReact/src/App.tsx @@ -13,64 +13,64 @@ let walletWindow: Window | null = null; let authInput: AuthInput | null = null; interface AuthInput { - url: string; - action: string; - payload: string; + url: string; + action: string; + payload: string; } function App() { - const { - unityProvider, - addEventListener, - removeEventListener, - sendMessage, - isLoaded, - loadingProgression, - } = useUnityContext({ - loaderUrl: "Build/.loader.js", - dataUrl: "Build/.data", - frameworkUrl: "Build/.framework.js", - codeUrl: "Build/.wasm", - }); - - const loadingPercentage = Math.round(loadingProgression * 100); - - const handleSequenceWalletAuth = useCallback((...parameters: ReactUnityEventParameter[]): ReactUnityEventParameter => { - const inputJson = parameters[0] as string; - authInput = JSON.parse(inputJson) as AuthInput; - - const sessionId = generateId(); - walletWindow = window.open( - `${authInput?.url}?dappOrigin=${window.location.origin}&sessionId=${sessionId}`, - "Wallet", - 'width=600,height=600,left=300,top=300'); - - return ''; - }, []); - - const [messageToSend, setMessageToSend] = useState<{ functionName: string; value: string; } | undefined>(undefined); - - useEffect(() => { - if (messageToSend) { - const message = messageToSend; - setMessageToSend(undefined); - sendMessage("SequenceNativeReceiver", message.functionName, message.value); - } - }, [messageToSend]); - - useEffect(() => { - addEventListener("GoogleSignIn", handleGoogleSignIn); - addEventListener("OpenWalletApp", handleSequenceWalletAuth); - window.addEventListener("message", handleMessage); - window.addEventListener("resize", handleResize); - handleResize() - return () => { - removeEventListener("GoogleSignIn", handleGoogleSignIn); - removeEventListener("OpenWalletApp", handleSequenceWalletAuth); - window.removeEventListener("message", handleMessage); - window.removeEventListener("resize", handleResize); - }; - }, []); + const { + unityProvider, + addEventListener, + removeEventListener, + sendMessage, + isLoaded, + loadingProgression, + } = useUnityContext({ + loaderUrl: "Build/.loader.js", + dataUrl: "Build/.data", + frameworkUrl: "Build/.framework.js", + codeUrl: "Build/.wasm", + }); + + const loadingPercentage = Math.round(loadingProgression * 100); + + const handleSequenceWalletAuth = useCallback((...parameters: ReactUnityEventParameter[]): ReactUnityEventParameter => { + const inputJson = parameters[0] as string; + authInput = JSON.parse(inputJson) as AuthInput; + + const sessionId = generateId(); + walletWindow = window.open( + `${authInput?.url}?dappOrigin=${window.location.origin}&sessionId=${sessionId}`, + "Wallet", + 'width=600,height=600,left=300,top=300'); + + return ''; + }, []); + + const [messageToSend, setMessageToSend] = useState<{ gameObject: string; functionName: string; value: string; } | undefined>(undefined); + + useEffect(() => { + if (messageToSend) { + const message = messageToSend; + setMessageToSend(undefined); + sendMessage(message.gameObject, message.functionName, message.value); + } + }, [messageToSend]); + + useEffect(() => { + addEventListener("GoogleSignIn", handleGoogleSignIn); + addEventListener("OpenWalletApp", handleSequenceWalletAuth); + window.addEventListener("message", handleMessage); + window.addEventListener("resize", handleResize); + handleResize() + return () => { + removeEventListener("GoogleSignIn", handleGoogleSignIn); + removeEventListener("OpenWalletApp", handleSequenceWalletAuth); + window.removeEventListener("message", handleMessage); + window.removeEventListener("resize", handleResize); + }; + }, []); const handleGoogleSignIn = useCallback((...parameters: ReactUnityEventParameter[]): ReactUnityEventParameter => { const googleClientId = parameters[0] as string; @@ -83,6 +83,7 @@ function App() { const handleGoogleLogin = async (tokenResponse: CredentialResponse) => { setMessageToSend({ + gameObject: "WebBrowserMessageReceiver", functionName: "OnGoogleSignIn", value: tokenResponse.credential!, }); @@ -94,130 +95,131 @@ function App() { const [nonce, setNonce] = useState(""); const [showLogin, setShowLogin] = useState(false); - const handleMessage = async (event: MessageEvent) => { - if (!walletWindow) { - return; - } + const handleMessage = async (event: MessageEvent) => { + if (!walletWindow) { + return; + } - switch (event.data.type) { - case "WALLET_OPENED": - postMessageToWallet({ - id: generateId(), - type: 'INIT', - sessionId: 'mcyc0abl-8q11zpb', - }); + switch (event.data.type) { + case "WALLET_OPENED": + postMessageToWallet({ + id: generateId(), + type: 'INIT', + sessionId: 'mcyc0abl-8q11zpb', + }); + + console.log(authInput) + postMessageToWallet({ + id: generateId(), + type: 'REQUEST', + action: authInput?.action, + payload: authInput?.payload + }); + + console.log('sent init message') + break; + case "RESPONSE": + let data = event.data; + if (data.payload) { + const parsedPayload = JSON.stringify(data.payload, (_, v) => { + if (typeof v === 'bigint') { + return {_isBigInt: true, data: v.toString()}; + } else if (v instanceof Uint8Array) { + return {_isUint8Array: true, data: bytesToHex(v)}; + } else { + return v; + } + }); + + data = {...data, payload: btoa(parsedPayload)}; + } + + console.log(data); + + setMessageToSend({ + gameObject: "SequenceNativeReceiver", + functionName: "HandleResponse", + value: JSON.stringify(data) + }); + + walletWindow.close(); + break; + } + } - console.log(authInput) - postMessageToWallet({ - id: generateId(), - type: 'REQUEST', - action: authInput?.action, - payload: authInput?.payload - }); + function bytesToHex(bytes: Uint8Array): string { + return '0x' + Array.from(bytes) + .map(b => b.toString(16).padStart(2, "0")) + .join(""); + } - console.log('sent init message') - break; - case "RESPONSE": - let data = event.data; - if (data.payload) { - const parsedPayload = JSON.stringify(data.payload, (_, v) => { - if (typeof v === 'bigint') { - return {_isBigInt: true, data: v.toString()}; - } else if (v instanceof Uint8Array) { - return {_isUint8Array: true, data: bytesToHex(v)}; - } else { - return v; + const postMessageToWallet = (message: any) => { + try { + if (!walletWindow) { + throw new Error("Unable to find wallet"); } - }); - data = {...data, payload: btoa(parsedPayload)}; + const walletOrigin = new URL(authInput?.url || '').origin; + walletWindow.postMessage(message, walletOrigin); + } catch (e) { + console.error(e); } + } - console.log(data); + const handleResize = () => { + const container = document.querySelector('.container') as any; - setMessageToSend({ - functionName: "HandleResponse", - value: JSON.stringify(data) - }); + let w = window.innerWidth * 0.98; + let h = window.innerHeight * 0.98; - walletWindow.close(); - break; - } - } - - function bytesToHex(bytes: Uint8Array): string { - return '0x' + Array.from(bytes) - .map(b => b.toString(16).padStart(2, "0")) - .join(""); - } - - const postMessageToWallet = (message: any) => { - try { - if (!walletWindow) { - throw new Error("Unable to find wallet"); - } - - const walletOrigin = new URL(authInput?.url || '').origin; - walletWindow.postMessage(message, walletOrigin); - } catch (e) { - console.error(e); - } - } + const r = 600 / 960; + if (w * r > window.innerHeight) { + w = Math.min(w, Math.ceil(h / r)); + } - const handleResize = () => { - const container = document.querySelector('.container') as any; + h = Math.floor(w * r); - let w = window.innerWidth * 0.98; - let h = window.innerHeight * 0.98; + container.style.width = w + "px"; + container.style.height = h + "px"; + } - const r = 600 / 960; - if (w * r > window.innerHeight) { - w = Math.min(w, Math.ceil(h / r)); + const generateId = (): string => { + return `${Date.now().toString(36)}-${Math.random() + .toString(36) + .substring(2, 9)}`; } - h = Math.floor(w * r); - - container.style.width = w + "px"; - container.style.height = h + "px"; - } - - const generateId = (): string => { - return `${Date.now().toString(36)}-${Math.random() - .toString(36) - .substring(2, 9)}`; - } - - return ( -
-
- {isLoaded === false && ( -
-

Loading... ({loadingPercentage}%)

-
- )} - + return ( +
+
+ {isLoaded === false && ( +
+

Loading... ({loadingPercentage}%)

+
+ )} + +
+ {showLogin && ( +
+
+

Login with Google

+
+ + { + handleGoogleLogin(response); + }} + shape="circle" + width={230} + nonce={nonce} + /> + +
+
+
+ )}
- {showLogin && ( -
-
-

Login with Google

-
- - { - handleGoogleLogin(response); - }} - shape="circle" - width={230} - nonce={nonce} - /> - -
-
-
- )} -
- ); + ); } export default App; diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReact/src/App.tsx b/Packages/Sequence-Unity/WebGLTemplates/SequenceReact/src/App.tsx index 3716d805..ebb5c5aa 100644 --- a/Packages/Sequence-Unity/WebGLTemplates/SequenceReact/src/App.tsx +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReact/src/App.tsx @@ -48,13 +48,13 @@ function App() { return ''; }, []); - const [messageToSend, setMessageToSend] = useState<{ functionName: string; value: string; } | undefined>(undefined); + const [messageToSend, setMessageToSend] = useState<{ gameObject: string; functionName: string; value: string; } | undefined>(undefined); useEffect(() => { if (messageToSend) { const message = messageToSend; setMessageToSend(undefined); - sendMessage("SequenceNativeReceiver", message.functionName, message.value); + sendMessage(message.gameObject, message.functionName, message.value); } }, [messageToSend]); @@ -83,6 +83,7 @@ function App() { const handleGoogleLogin = async (tokenResponse: CredentialResponse) => { setMessageToSend({ + gameObject: "WebBrowserMessageReceiver", functionName: "OnGoogleSignIn", value: tokenResponse.credential!, }); @@ -136,6 +137,7 @@ function App() { console.log(data); setMessageToSend({ + gameObject: "SequenceNativeReceiver", functionName: "HandleResponse", value: JSON.stringify(data) }); diff --git a/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index bdea05c5..014e4762 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "5.0.9", + "version": "5.0.10", "displayName": "Sequence SDK", "description": "A Unity SDK for Sequence APIs", "unity": "2021.3",