/* GoToSocial Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ "use strict"; const Promise = require("bluebird"); const React = require("react"); const Redux = require("react-redux"); const { setInstance } = require("../redux/reducers/oauth").actions; const api = require("../lib/api"); module.exports = function Login({error}) { const dispatch = Redux.useDispatch(); const [ instanceField, setInstanceField ] = React.useState(""); const [ errorMsg, setErrorMsg ] = React.useState(); const instanceFieldRef = React.useRef(""); React.useEffect(() => { // check if current domain runs an instance let currentDomain = window.location.origin; Promise.try(() => { return dispatch(api.instance.fetchWithoutStore(currentDomain)); }).then(() => { if (instanceFieldRef.current.length == 0) { // user hasn't started typing yet dispatch(setInstance(currentDomain)); instanceFieldRef.current = currentDomain; setInstanceField(currentDomain); } }).catch((e) => { console.log("Current domain does not host a valid instance: ", e); }); }, []); function tryInstance() { let domain = instanceFieldRef.current; Promise.try(() => { return dispatch(api.instance.fetchWithoutStore(domain)).catch((e) => { // TODO: clearer error messages for common errors console.log(e); throw e; }); }).then(() => { dispatch(setInstance(domain)); return dispatch(api.oauth.register()).catch((e) => { console.log(e); throw e; }); }).then(() => { return dispatch(api.oauth.authorize()); // will send user off-page }).catch((e) => { setErrorMsg( <> {e.type} {e.message} ); }); } function updateInstanceField(e) { if (e.key == "Enter") { tryInstance(instanceField); } else { setInstanceField(e.target.value); instanceFieldRef.current = e.target.value; } } return (

OAUTH Login:

{error}
e.preventDefault()}> {errorMsg &&
{errorMsg}
}
); };