import React, { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { Grid, Typography, Paper, Button, Divider, TextField, } from "@material-ui/core"; import { useAlert } from "react-alert"; import { useTheme } from "@material-ui/core/styles"; import detectEthereumProvider from "@metamask/detect-provider"; const Settings = (props) => { const { globalUrl, isLoaded, userdata, setUserData } = props; const theme = useTheme(); const alert = useAlert(); let navigate = useNavigate(); const [username, setUsername] = useState(""); const [firstname, setFirstname] = useState(""); const [lastname, setLastname] = useState(""); const [email, setEmail] = useState(""); const [currentPassword, setCurrentPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); const [newPassword2, setNewPassword2] = useState(""); // const [file, setFile] = React.useState(""); // const [fileBase64, setFileBase64] = React.useState( // userdata.image === undefined || userdata.image === null // ? theme.palette.defaultImage // : userdata.image // ); const [loadedValidationWorkflows, setLoadedValidationWorkflows] = React.useState([]); const [selfOwnedWorkflows, setSelfOwnedWorkflows] = React.useState([]); const [loadedWorkflowCollections, setLoadedWorkflowCollections] = React.useState([]); // Used for error messages etc const [passwordFormMessage, setPasswordFormMessage] = useState(""); const [firstrequest, setFirstRequest] = useState(true); const [userSettings, setUserSettings] = useState({}); /* const [userdata.eth_info, setEthInfo] = useState(userdata.eth_info !== undefined && userdata.eth_info.account !== undefined && userdata.eth_info.account.length > 0 ? userdata.eth_info : { "account": "", "balance": "", }) */ /* console.log(userdata.eth_info) if (userdata.eth_info.account.length === 0 && userdata.eth_info !== undefined && userdata.eth_info.account !== undefined && userdata.eth_info.account.length > 0) { setEthInfo(userdata.eth_info) } else if (userdata.eth_info.balance.length > 0 && userdata.eth_info.parsed_balance === undefined) { //console.log(window.ethereum) //console.log(window.ethereum.utils.formatEther(userdata.eth_info.balance)) const parsed_balance = parseInt(userdata.eth_info.balance, 16)/1000000000000000000 console.log("Parsed balance: ", parsed_balance) userdata.eth_info.parsed_balance = parsed_balance userdata.eth_info.parsed_balance = parsed_balance setEthInfo(userdata.eth_info) } else if (userdata.eth_info !== undefined && userdata.eth_info.balance !== userdata.eth_info.balance) { console.log("Updating balance: ", userdata.eth_info) setEthInfo(userdata.eth_info) } */ //Returns the value from a storage position at a given address. const isCloud = window.location.host === "localhost:3002" || window.location.host === "shuffler.io" const bodyDivStyle = { margin: "auto", textAlign: "center", width: "1100px", }; const boxStyle = { flex: "1", color: "white", position: "relative", marginLeft: "10px", marginRight: "10px", paddingLeft: "30px", paddingRight: "30px", paddingBottom: "30px", paddingTop: "30px", backgroundColor: theme.palette.surfaceColor, display: "flex", flexDirection: "column", }; const checkOwner = (data, userdata) => { var currentOwner = false; if (data.owner.address === userdata.eth_info.account) { currentOwner = true; } else { if ( data.top_ownerships !== undefined && data.top_ownerships !== null && data.top_ownerships.length === 1 ) { for (var key in data.top_ownerships) { if ( data.top_ownerships[key].owner.address === userdata.eth_info.account ) { currentOwner = true; break; } } } } return currentOwner; }; const onPasswordChange = () => { const data = { username: userSettings.username, currentpassword: currentPassword, newpassword: newPassword, newpassword2: newPassword2, }; const url = globalUrl + "/api/v1/passwordchange"; fetch(url, { mode: "cors", method: "POST", body: JSON.stringify(data), credentials: "include", crossDomain: true, withCredentials: true, headers: { "Content-Type": "application/json; charset=utf-8", }, }) .then((response) => response.json().then((responseJson) => { if (responseJson["success"] === false) { setPasswordFormMessage(responseJson["reason"]); } else { alert.success("Changed password!"); setPasswordFormMessage(""); } }) ) .catch((error) => { setPasswordFormMessage("Something went wrong."); }); }; const loadWorkflowOwnership = () => { fetch( globalUrl + "/api/v1/workflows/collections/untitled-collection-103712081", { method: "GET", headers: { "Content-Type": "application/json", Accept: "application/json", }, credentials: "include", } ) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for WORKFLOW EXECUTION :O!"); } return response.json(); }) .then((responseJson) => { //console.log("Values: ", responseJson) // const [selfOwnedWorkflows, setSelfOwnedWorkflows] = React.useState([]) if (responseJson !== undefined && responseJson !== null) { const filteredOwnerships = responseJson.filter( (data) => checkOwner(data, userdata) === true ); if ( filteredOwnerships !== undefined && filteredOwnerships !== null && filteredOwnerships.length > 0 ) { setSelfOwnedWorkflows(filteredOwnerships); } var collections = []; for (var key in responseJson) { var collectionname = responseJson[key].collection.name; if (!collections.includes(collectionname)) { collections.push(collectionname); } } console.log(collections); setLoadedWorkflowCollections(collections); setLoadedValidationWorkflows(responseJson); setTimeout(() => { window.scrollTo({ top: document.body.scrollHeight, left: 0, behavior: "smooth", }); }, 250); } }) .catch((error) => { console.log(error); }); }; const generateApikey = () => { fetch(globalUrl + "/api/v1/generateapikey", { method: "GET", headers: { "Content-Type": "application/json", Accept: "application/json", }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for WORKFLOW EXECUTION :O!"); } return response.json(); }) .then((responseJson) => { setUserSettings(responseJson); }) .catch((error) => { console.log(error); }); }; const getSettings = () => { fetch(globalUrl + "/api/v1/getsettings", { method: "GET", headers: { "Content-Type": "application/json", Accept: "application/json", }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for WORKFLOW EXECUTION :O!"); } return response.json(); }) .then((responseJson) => { setUserSettings(responseJson); }) .catch((error) => { console.log(error); }); }; // Gotta be a better way of doing this rofl const setFields = () => { if (userdata.username !== undefined) { if (userdata.username.length > 0) { setUsername(userdata.username); } //if (userdata.firstname.length > 0) { // setFirstname(userdata.firstname) //} //if (userdata.lastname.length > 0) { // setLastname(userdata.lastname) //} //if (userdata.title.length > 0) { // setTitle(userdata.title) //} //if (userdata.companyname.length > 0) { // setCompanyname(userdata.companyname) //} //if (userdata.phone.length > 0) { // setPhone(userdata.phone) //} //if (userdata.email.length > 0) { // setEmail(userdata.email) //} } }; // const registerProviders = (userdata) => { // // Register hooks here // detectEthereumProvider().then((provider) => { // if (provider) { // if (!provider.isMetaMask) { // alert.error("Only MetaMask is supported as of now."); // return; // } // // Find the ethereum network // // Get the users' account(s) // //alert.info("Connecting to MetaMask") // //console.log("Connected: ", provider.isConnected()) // if (!provider.isConnected()) { // alert.error("Metamask is not connected."); // return; // } // provider.on("message", (event) => { // alert.info("Ethereum message: ", event); // }); // provider.on("chainChanged", (chainId) => { // console.log("Changed chain to: ", chainId); // const method = "eth_getBalance"; // const params = [userdata.eth_info.account, "latest"]; // provider // .request({ // method: method, // params, // }) // .then((result) => { // console.log("Got result: ", result); // if (result !== undefined && result !== null) { // userdata.eth_info.balance = result; // userdata.eth_info.parsed_balance = result / 1000000000000000000; // console.log("INFO: ", userdata); // setUserData(userdata); // } else { // alert.error("Couldn't find balance: ", result); // } // }) // .catch((error) => { // // If the request fails, the Promise will reject with an error. // alert.error("Failed getting info from ethereum API: " + error); // }); // }); // } // }); // }; // This should "always" have data useEffect(() => { if (firstrequest) { setFirstRequest(false); getSettings(); //registerProviders(userdata) } if ( Object.getOwnPropertyNames(userdata).length > 0 && username === "" && email === "" ) { setFields(); } }); const ParsedWorkflowView = (props) => { const { data } = props; var innerPaperStyle = { backgroundColor: theme.palette.inputColor, display: "flex", flexDirection: "column", padding: "0px 0px 12px 0px", borderRadius: theme.palette.borderRadius, }; const currentOwner = checkOwner(data, userdata); if (currentOwner === true) { innerPaperStyle.border = "3px solid #f86a3e"; } return ( {data.name} {data.collection} {data.name} ); }; const runFlex = userdata.eth_info !== undefined && userdata.eth_info.account !== undefined && userdata.eth_info.account.length > 0 && userdata.eth_info.parsed_balance !== undefined // Random names for type & autoComplete. Didn't research :^) //var imageData = file.length > 0 ? file : fileBase64; //imageData = imageData === undefined || imageData.length === 0 // ? theme.palette.defaultImage // : imageData; const imageData = userSettings.image === undefined || userSettings.image == null || userSettings.image.length === 0 ? theme.palette.defaultImage : userSettings.image const imageInfo = ( { if (imageData !== theme.palette.defaultImage) { navigate(`/creators/${userdata.public_username}`) } else { navigate(`/creators`) } }} style={{ cursor: "pointer", maxWidth: 100, maxHeight: 100, minWidth: 100, minHeight: 100, position: "absolute", top: -80, left: 1020 / 2 - 25, borderRadius: 50, objectFit: "contain", border: "2px solid rgba(255,255,255,0.7)", }} /> ); const landingpageData = (
{imageInfo}

Settings

setUsername(e.target.value)} />
setFirstname(e.target.value)} /> setLastname(e.target.value)} />

APIKEY

What is the API key used for? {/* setTitle(e.target.value)} /> setCompanyname(e.target.value)} />
setEmail(e.target.value)} /> setPhone(e.target.value)} />

{formMessage}

*/}

Password

setCurrentPassword(e.target.value)} />
setNewPassword(e.target.value)} /> setNewPassword2(e.target.value)} />

{passwordFormMessage}

Platform Earnings

{isCloud ? By connecting your Github or Metamask account, you agree to our Terms of Service, and acknowledge that your non-sensitive data will be turned into a creator account. This enables you to earn a passive income from Shuffle. This IS reversible. Support: support@shuffler.io : null}
{userdata.eth_info !== undefined && userdata.eth_info.account !== undefined && userdata.eth_info.account.length > 0 && userdata.eth_info.parsed_balance !== undefined ? (
ethereum-icon {/*window.ethereum.fromWei(userdata.eth_info.balance, "ether")*/} {userdata.eth_info.parsed_balance.toFixed(4)} ETH
) : null}
{userdata.eth_info !== undefined && userdata.eth_info.account !== undefined && userdata.eth_info.account.length > 0 && userdata.eth_info.parsed_balance !== undefined ? (
Owned Workflows {selfOwnedWorkflows.length}
) : null}
{/*userdata !== undefined && userdata.eth_info !== undefined && userdata.eth_info.account !== undefined && userdata.eth_info.account.length > 0 ? (
Network: TBD Address: {userdata.eth_info.account} {loadedWorkflowCollections.length > 0 ? ( Collections:  {loadedWorkflowCollections.map((data, index) => { var collectionname = data.toLowerCase(); collectionname = collectionname.replaceAll("#", ""); collectionname = collectionname.replaceAll(" ", "-"); return ( {data}   ); })} ) : null}
) : ( )*/}
{loadedValidationWorkflows !== undefined && loadedValidationWorkflows !== null ? loadedValidationWorkflows.map((data, index) => { return ( ); }) : null} ); /* 0x1 1 Ethereum Main Network (Mainnet) 0x3 3 Ropsten Test Network 0x4 4 Rinkeby Test Network 0x5 5 Goerli Test Network 0x2a 42 Kovan Test Network */ const setUser = (userId, field, value) => { const data = { user_id: userId }; data[field] = value; fetch(globalUrl + "/api/v1/users/updateuser", { method: "PUT", headers: { "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify(data), credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for WORKFLOW EXECUTION :O!"); } return response.json(); }) .then((responseJson) => { if (!responseJson.success && responseJson.reason !== undefined) { alert.error("Failed updating user: " + responseJson.reason); } }) .catch((error) => { console.log(error); }); }; const handleGithubConnection = () => { console.log("GITHUB CONNECT WOO: ", isCloud) //result = RestClient.post('https://github.com/login/oauth/access_token', console.log("HOST: ", window.location.host); console.log("Location: ", window.location); const redirectUri = isCloud ? window.location.host === "localhost:3002" ? "http%3A%2F%2Flocalhost:3002%2Fset_authentication" : "https%3A%2F%2Fshuffler.io%2Fset_authentication" : window.location.protocol === "http:" ? `http%3A%2F%2F${window.location.host}%2Fset_authentication` : `https%3A%2F%2F${window.location.host}%2Fset_authentication` console.log("redirect: ", redirectUri) const client_id = "3d272b1b782b100b1e61" const username = userdata.id; const scopes = "read:user"; const url = `https://github.com/login/oauth/authorize?access_type=offline&prompt=consent&client_id=${client_id}&redirect_uri=${redirectUri}&response_type=code&scope=${scopes}&state=username%3D${username}%26type%3Dgithub` console.log("URL: ", url); var newwin = window.open(url, "", "width=800,height=600"); // Check whether we got a callback somewhere //var id = setInterval(function () { // fetch( // globalUrl + "/api/v1/triggers/gmail/" + selectedTrigger.id, // { // method: "GET", // headers: { "content-type": "application/json" }, // credentials: "include", // } // ) // .then((response) => { // if (response.status !== 200) { // throw new Error("No trigger info :o!"); // } // return response.json(); // }) // .then((responseJson) => { // console.log("RESPONSE: "); // setTriggerAuthentication(responseJson); // clearInterval(id); // newwin.close(); // setGmailFolders(); // }) // .catch((error) => { // console.log(error.toString()); // }); //}, 2500); //saveWorkflow(workflow); } const handleEthereumTokenCreation = async () => { const provider = await detectEthereumProvider(); if (!provider) { console.log("Please install MetaMask!"); alert.error( "Please download the MetaMask browser extension to authenticate fully!" ); return; } if (!provider.isMetaMask) { alert.error("Only MetaMask is supported as of now."); return; } if (!provider.isConnected()) { alert.error("Metamask is not connected."); return; } console.log("Should make a token"); }; const handleEthereumConnection = async () => { const provider = await detectEthereumProvider(); if (!provider) { console.log("Please install MetaMask!"); alert.error( "Please download the MetaMask browser extension to authenticate fully!" ); return; } if (!provider.isMetaMask) { alert.error("Only MetaMask is supported as of now."); return; } // Find the ethereum network // Get the users' account(s) //alert.info("Connecting to MetaMask") //console.log("Connected: ", provider.isConnected()) if (!provider.isConnected()) { alert.error("Metamask is not connected."); return; } provider.on("message", (event) => { alert.info("Ethereum message: ", event); }); /* params: [ { from: '0xb60e8dd61c5d32be8058bb8eb970870f07233155', to: '0xd46e8dd67c5d32be8058bb8eb970870f07244567', gas: '0x76c0', // 30400 gasPrice: '0x9184e72a000', // 10000000000000 value: '0x9184e72a', // 2441406250 data: '0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675', }, ] */ // https://docs.metamask.io/guide/rpc-api.html // Gets accounts - requires previous permissions //const method = "eth_accounts" //const params = [] // // Asks for permission, and gets the accounts var method = "eth_requestAccounts"; var params = []; provider .request({ method: method, params, }) .then((result) => { if (result !== undefined && result !== null && result.length > 0) { userdata.eth_info.account = result[0]; // Getting and setting balance for the current user method = "eth_getBalance"; params = [userdata.eth_info.account, "latest"]; provider .request({ method: method, params, }) .then((result) => { if ( result !== undefined && result !== null && result.length > 0 ) { userdata.eth_info.balance = result; userdata.eth_info.parsed_balance = result / 1000000000000000000; console.log(userdata.eth_info); setUserData(userdata.eth_info); // Updating //if (userdata.eth_info !== userdata.userdata.eth_info) { //} setUser(userdata.id, "eth_info", userdata.eth_info); userdata.userdata.eth_info = userdata.eth_info; } else { alert.error("Couldn't find balance: ", result); } // The result varies by RPC method. // For example, this method will return a transaction hash hexadecimal string on success. }) .catch((error) => { // If the request fails, the Promise will reject with an error. //setEthInfo(userdata.eth_info) alert.error("Failed getting info from ethereum API: " + error); }); } else { alert.error("Couldn't find any user: ", result); } }) .catch((error) => { // If the request fails, the Promise will reject with an error. alert.error("Failed getting info from ethereum API: " + error); }); // Gets the users' balance in WEI (one quintilionth ETH) }; const loadedCheck = isLoaded && !firstrequest ? (
{landingpageData}
) : (
); return
{loadedCheck}
; }; export default Settings;