diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..79bb4ac --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "configurations": [ + { + "name": "Attach to Hermes application - Experimental", + "request": "attach", + "type": "reactnativedirect", + "cwd": "${workspaceFolder}" + }, + { + "name": "Debug Android Hermes - Experimental", + "request": "launch", + "type": "reactnativedirect", + "cwd": "${workspaceFolder}/rn-bare-example", + "platform": "android" + }, + { + "name": "Debug iOS Hermes - Experimental", + "request": "launch", + "type": "reactnativedirect", + "cwd": "${workspaceFolder}/rn-bare-example", + "platform": "ios" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 1c10ccd..b6dc767 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,13 @@ { + "editor.formatOnSave": true, + "editor.formatOnType": true, + "eslint.alwaysShowStatus": true, + "eslint.debug": false, + "eslint.format.enable": true, + "eslint.lintTask.enable": true, + "editor.codeActionsOnSave": { + "source.fixAll": true + }, "eslint.workingDirectories": [ { "directory": "example", diff --git a/example_general/.bundle/config b/demo/rn-bare-example/.bundle/config similarity index 100% rename from example_general/.bundle/config rename to demo/rn-bare-example/.bundle/config diff --git a/demo/rn-bare-example/.eslintrc.js b/demo/rn-bare-example/.eslintrc.js new file mode 100644 index 0000000..40c6dcd --- /dev/null +++ b/demo/rn-bare-example/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native-community', +}; diff --git a/example_general/.gitignore b/demo/rn-bare-example/.gitignore similarity index 90% rename from example_general/.gitignore rename to demo/rn-bare-example/.gitignore index 2423126..16f8c30 100644 --- a/example_general/.gitignore +++ b/demo/rn-bare-example/.gitignore @@ -31,6 +31,8 @@ local.properties *.iml *.hprof .cxx/ +*.keystore +!debug.keystore # node.js # @@ -38,12 +40,6 @@ node_modules/ npm-debug.log yarn-error.log -# BUCK -buck-out/ -\.buckd/ -*.keystore -!debug.keystore - # fastlane # # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the @@ -62,3 +58,6 @@ buck-out/ # Ruby / CocoaPods /ios/Pods/ /vendor/bundle/ + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* diff --git a/demo/rn-bare-example/.node-version b/demo/rn-bare-example/.node-version new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/demo/rn-bare-example/.node-version @@ -0,0 +1 @@ +18 diff --git a/example_general/.prettierrc.js b/demo/rn-bare-example/.prettierrc.js similarity index 100% rename from example_general/.prettierrc.js rename to demo/rn-bare-example/.prettierrc.js diff --git a/example_general/.watchmanconfig b/demo/rn-bare-example/.watchmanconfig similarity index 100% rename from example_general/.watchmanconfig rename to demo/rn-bare-example/.watchmanconfig diff --git a/demo/rn-bare-example/App.tsx b/demo/rn-bare-example/App.tsx new file mode 100644 index 0000000..d013eeb --- /dev/null +++ b/demo/rn-bare-example/App.tsx @@ -0,0 +1,206 @@ +import React, {useEffect, useState} from 'react'; +import { + StyleSheet, + Text, + View, + Button, + ScrollView, + Dimensions, +} from 'react-native'; +import * as WebBrowser from '@toruslabs/react-native-web-browser'; +import EncryptedStorage from 'react-native-encrypted-storage'; +import Web3Auth, { + LOGIN_PROVIDER, + OPENLOGIN_NETWORK, + IWeb3Auth, + OpenloginUserInfo, +} from '@web3auth/react-native-sdk'; +import RPC from './ethersRPC'; // for using ethers.js + +const scheme = 'web3authrnbareaggregateexample'; // Or your desired app redirection scheme +const resolvedRedirectUrl = `${scheme}://openlogin`; +const clientId = + 'BHr_dKcxC0ecKn_2dZQmQeNdjPgWykMkcodEHkVvPMo71qzOV6SgtoN8KCvFdLN7bf34JOm89vWQMLFmSfIo84A'; + +export default function App() { + const [userInfo, setUserInfo] = useState(); + const [key, setKey] = useState(''); + const [console, setConsole] = useState(''); + const [web3auth, setWeb3Auth] = useState(null); + + const login = async () => { + try { + if (!web3auth) { + setConsole('Web3auth not initialized'); + return; + } + + setConsole('Logging in'); + await web3auth.login({ + loginProvider: LOGIN_PROVIDER.EMAIL_PASSWORDLESS, + redirectUrl: resolvedRedirectUrl, + mfaLevel: 'default', + curve: 'secp256k1', + extraLoginOptions: { + login_hint: 'arch1995@gmail.com', + connection: 'email', + }, + }); + setConsole(`Logged in ${web3auth.privKey}`); + if (web3auth.privKey) { + setUserInfo(web3auth.userInfo()); + setKey(web3auth.privKey); + uiConsole('Logged In'); + } + } catch (e) { + setConsole(e.message); + } + }; + + const logout = async () => { + if (!web3auth) { + setConsole('Web3auth not initialized'); + return; + } + + setConsole('Logging out'); + await web3auth.logout(); + + if (!web3auth.privKey) { + setUserInfo(undefined); + setKey(''); + uiConsole('Logged out'); + } + }; + + useEffect(() => { + const init = async () => { + const auth = new Web3Auth(WebBrowser, EncryptedStorage, { + clientId, + network: OPENLOGIN_NETWORK.TESTNET, // or other networks + useCoreKitKey: false, + loginConfig: {}, + }); + setWeb3Auth(auth); + await auth.init(); + if (auth?.privKey) { + uiConsole('Re logged in'); + setUserInfo(auth.userInfo()); + setKey(auth.privKey); + window.console.log(auth.privKey); + } + }; + init(); + }, []); + + const getChainId = async () => { + setConsole('Getting chain id'); + const networkDetails = await RPC.getChainId(); + uiConsole(networkDetails); + }; + + const getAccounts = async () => { + if (!key) { + setConsole('User not logged in'); + return; + } + setConsole('Getting account'); + const address = await RPC.getAccounts(key); + uiConsole(address); + }; + const getBalance = async () => { + if (!key) { + setConsole('User not logged in'); + return; + } + setConsole('Fetching balance'); + const balance = await RPC.getBalance(key); + uiConsole(balance); + }; + const sendTransaction = async () => { + if (!key) { + setConsole('User not logged in'); + return; + } + setConsole('Sending transaction'); + const tx = await RPC.sendTransaction(key); + uiConsole(tx); + }; + const signMessage = async () => { + if (!key) { + setConsole('User not logged in'); + return; + } + setConsole('Signing message'); + const message = await RPC.signMessage(key); + uiConsole(message); + }; + + const uiConsole = (...args) => { + setConsole(JSON.stringify(args || {}, null, 2) + '\n\n\n\n' + console); + }; + + const loggedInView = ( + +