Handle login error

This commit is contained in:
Jeremie Pardou-Piquemal 2020-11-07 14:55:46 +01:00 committed by Jérémie Pardou-Piquemal
parent 8cfefc1901
commit d5237ea982
7 changed files with 81 additions and 7 deletions

38
package-lock.json generated
View file

@ -9391,6 +9391,11 @@
} }
} }
}, },
"clsx": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz",
"integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA=="
},
"co": { "co": {
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@ -10532,8 +10537,7 @@
"csstype": { "csstype": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz",
"integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag=="
"dev": true
}, },
"cyclist": { "cyclist": {
"version": "1.0.1", "version": "1.0.1",
@ -11435,6 +11439,15 @@
"utila": "~0.4" "utila": "~0.4"
} }
}, },
"dom-helpers": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz",
"integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==",
"requires": {
"@babel/runtime": "^7.8.7",
"csstype": "^3.0.2"
}
},
"dom-serializer": { "dom-serializer": {
"version": "0.2.2", "version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
@ -25040,6 +25053,27 @@
} }
} }
}, },
"react-toastify": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-6.1.0.tgz",
"integrity": "sha512-Ne+wIoO9A+jZlaqGqgeuXDC/DQfqTuJdyoc7G5SsuCHsr8mNRx7W26417YKtHRH0LcnFFd5ii76tGnmm0cMlLg==",
"requires": {
"clsx": "^1.1.1",
"prop-types": "^15.7.2",
"react-transition-group": "^4.4.1"
}
},
"react-transition-group": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz",
"integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==",
"requires": {
"@babel/runtime": "^7.5.5",
"dom-helpers": "^5.0.1",
"loose-envify": "^1.4.0",
"prop-types": "^15.6.2"
}
},
"react-use-localstorage": { "react-use-localstorage": {
"version": "3.5.3", "version": "3.5.3",
"resolved": "https://registry.npmjs.org/react-use-localstorage/-/react-use-localstorage-3.5.3.tgz", "resolved": "https://registry.npmjs.org/react-use-localstorage/-/react-use-localstorage-3.5.3.tgz",

View file

@ -35,6 +35,7 @@
"react-router": "^5.2.0", "react-router": "^5.2.0",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0",
"react-scripts": "^4.0.0", "react-scripts": "^4.0.0",
"react-toastify": "^6.1.0",
"react-use-localstorage": "^3.4.1", "react-use-localstorage": "^3.4.1",
"react-zoom-pan-pinch": "^1.6.1", "react-zoom-pan-pinch": "^1.6.1",
"recoil": "^0.1.1", "recoil": "^0.1.1",

View file

@ -9,6 +9,9 @@ import {
import { RecoilRoot } from "recoil"; import { RecoilRoot } from "recoil";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import { ToastContainer } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";
import GameListView from "./views/GameListView"; import GameListView from "./views/GameListView";
import GameView from "./views/GameView"; import GameView from "./views/GameView";
@ -42,6 +45,17 @@ function App() {
</Switch> </Switch>
</Router> </Router>
</RecoilRoot> </RecoilRoot>
<ToastContainer
position="top-center"
autoClose={3000}
hideProgressBar={false}
newestOnTop
closeOnClick
rtl={false}
pauseOnFocusLoss
draggable
pauseOnHover
/>
</Suspense> </Suspense>
); );
} }

View file

@ -3,6 +3,8 @@ import { useTranslation } from "react-i18next";
import Modal from "../ui/Modal"; import Modal from "../ui/Modal";
import { sendAuthToken } from "../utils/api"; import { sendAuthToken } from "../utils/api";
import useAuth from "../hooks/useAuth"; import useAuth from "../hooks/useAuth";
import { toast } from "react-toastify";
import Waiter from "../ui/Waiter";
const Account = ({ disabled, ...props }) => { const Account = ({ disabled, ...props }) => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -10,14 +12,23 @@ const Account = ({ disabled, ...props }) => {
const [email, setEmail] = React.useState(""); const [email, setEmail] = React.useState("");
const [emailSent, setEmailSent] = React.useState(false); const [emailSent, setEmailSent] = React.useState(false);
const [showLogin, setShowLogin] = React.useState(false); const [showLogin, setShowLogin] = React.useState(false);
const [loginInProgress, setLoginInProgress] = React.useState(false);
const handleChange = (e) => { const handleChange = (e) => {
setEmail(e.target.value); setEmail(e.target.value);
}; };
const handleSubmit = () => { const handleSubmit = async () => {
sendAuthToken(email); try {
setEmailSent(true); setLoginInProgress(true);
await sendAuthToken(email);
setEmailSent(true);
setLoginInProgress(false);
} catch (e) {
setLoginInProgress(false);
console.log(e);
toast.error(t("Error why logging, verify your email address"));
}
}; };
React.useEffect(() => { React.useEffect(() => {
@ -37,6 +48,12 @@ const Account = ({ disabled, ...props }) => {
); );
} }
const handleKeyDown = (e) => {
if (e.key === "Enter") {
handleSubmit();
}
};
return ( return (
<> <>
<div {...props}> <div {...props}>
@ -46,6 +63,7 @@ const Account = ({ disabled, ...props }) => {
<button onClick={() => setShowLogin(true)}>{t("Login")}</button> <button onClick={() => setShowLogin(true)}>{t("Login")}</button>
)} )}
</div> </div>
{loginInProgress && <Waiter message={t("In progress...")} />}
<Modal show={showLogin} setShow={setShowLogin} title={t("Login")}> <Modal show={showLogin} setShow={setShowLogin} title={t("Login")}>
{!emailSent && ( {!emailSent && (
<> <>
@ -53,6 +71,7 @@ const Account = ({ disabled, ...props }) => {
value={email} value={email}
onChange={handleChange} onChange={handleChange}
placeholder={t("Enter your email here")} placeholder={t("Enter your email here")}
onKeyDown={handleKeyDown}
/> />
<div <div
style={{ style={{

View file

@ -229,7 +229,7 @@ export const SelectedItems = () => {
const onDblClick = React.useCallback( const onDblClick = React.useCallback(
(e) => { (e) => {
const foundElement = insideClass(e.target, "item"); const foundElement = insideClass(e.target, "item");
// We dblclick oustside of an element // We dblclick outside of an element
if (!foundElement) return; if (!foundElement) return;
const filteredActions = availableActions.filter( const filteredActions = availableActions.filter(

View file

@ -58,3 +58,7 @@ h5 {
.tabs a { .tabs a {
color: var(--font-color); color: var(--font-color);
} }
input::placeholder {
color: #2d2f33;
}

View file

@ -9,11 +9,13 @@ const Overlay = styled.div`
top: 0; top: 0;
left: 0; left: 0;
background-color: var(--bg-color); background-color: var(--bg-color);
opacity: 0.7; opacity: 0.9;
color: #606984; color: #606984;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
z-index: 1000;
font-size: 3em;
`; `;
const Waiter = ({ message }) => { const Waiter = ({ message }) => {