diff --git a/src/hooks/useForumConnect.ts b/src/hooks/useForumConnect.ts index 44fa040aa..19e76b870 100644 --- a/src/hooks/useForumConnect.ts +++ b/src/hooks/useForumConnect.ts @@ -1,9 +1,9 @@ import { useCallback, useEffect, useState } from 'react' +import { Web3Provider } from '@ethersproject/providers' import useAuthContext from 'decentraland-gatsby/dist/context/Auth/useAuthContext' import useTrackContext from 'decentraland-gatsby/dist/context/Track/useTrackContext' import useClipboardCopy from 'decentraland-gatsby/dist/hooks/useClipboardCopy' -import useSign from 'decentraland-gatsby/dist/hooks/useSign' import { Governance } from '../clients/Governance' import { AccountType } from '../components/Modal/IdentityConnectModal/AccountsConnectModal' @@ -21,31 +21,18 @@ export const THREAD_URL = `${DISCOURSE_API}${ const VALIDATION_CHECK_INTERVAL = 10 * 1000 // 10 seconds const getMessage = async () => Governance.get().getValidationMessage() + export default function useForumConnect() { const [user, userState] = useAuthContext() const track = useTrackContext() - const [sign, signState] = useSign(user, userState.provider) + + const [message, setMessage] = useState('') + const [signature, setSignature] = useState('') const [copied, clipboardState] = useClipboardCopy(Time.Second) - const [signatureResolution, setSignatureResolution] = useState<{ - resolve: (value: unknown) => void - reject: (reason?: unknown) => void - }>() const { startTimer, resetTimer, time } = useTimer(MESSAGE_TIMEOUT_TIME / 1000 - 1) const [validatingProfile, setValidatingProfile] = useState() const [isValidated, setIsValidated] = useState() - useEffect(() => { - if (signatureResolution && !signState.signing) { - if (!signState.error) { - signatureResolution.resolve(undefined) - } else { - resetTimer() - signatureResolution.reject(signState.error) - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [signatureResolution, signState]) - useEffect(() => { if (time <= 0 && validatingProfile) { clearInterval(validatingProfile) @@ -60,29 +47,33 @@ export default function useForumConnect() { }, [isValidated, resetTimer]) const getSignedMessage = useCallback(async () => { - return new Promise((resolve, reject) => { - getMessage() - .then((message) => { - if (message) { - startTimer() - setIsValidated(undefined) - signState.sign(message) - setSignatureResolution({ resolve, reject }) - } else { - reject(new Error('No message')) - } - }) - .catch(reject) - }) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [signState]) + if (!userState.provider) { + return + } + + const message = await getMessage() + if (!message) { + throw new Error('No message') + } + + setMessage(message) + const signer = new Web3Provider(userState.provider).getSigner() + startTimer() + setIsValidated(undefined) + const signedMessage = await signer.signMessage(message) + if (!signedMessage) { + throw new Error('Failed to sign message') + } + + setSignature(signedMessage) + return signedMessage + }, [startTimer, userState.provider]) const copyMessageToClipboard = useCallback(() => { - const { message, signature } = sign if (message && signature) { clipboardState.copy(`${message}\nSignature: ${signature}`) } - }, [clipboardState, sign]) + }, [clipboardState, message, signature]) const openThread = () => { openUrl(THREAD_URL)