{"version":3,"sources":["webpack:///./src/images/front-door/front-door-white-sheet-metal.jpg","webpack:///./src/pages/login.js","webpack:///./src/lib/app.js"],"names":["module","exports","VALID_EMAIL_PATTERN","validateEmail","t","email","password","_email$trim","trimmedEmail","trim","length","test","validatePassword","redirectToApp","window","location","process","LoginPage","useTranslation","setEmail","useState","emailError","setEmailError","setPassword","passwordError","setPasswordError","passwordVisible","setPasswordVisible","loading","setLoading","fieldClassNames","erroneous","Boolean","useEffect","app","isAuthenticated","then","isConnected","React","createElement","Fragment","Helmet","bodyAttributes","class","SEO","title","className","src","frontDoorWhiteMetalSheet","alt","Link","to","ArrowLeft24","action","method","onSubmit","event","preventDefault","login","catch","error","_error$response","_error$response2","response","status","FretlinkLogo","type","id","value","onChange","target","onBlur","autoFocus","placeholder","undefined","onClick","Hide24","Show24","Loading30","RightArrow","baseUrl","replace","_ref","fetch","credentials","body","JSON","stringify","headers","ok","text","Error","console","lostPassword","_ref2"],"mappings":"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","file":"component---src-pages-login-js-a468e557791fe72c8d62.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/front-door-white-sheet-metal-4cc2d6de5fc3ce138458b069ab1fd781.jpg\";","/* eslint-disable jsx-a11y/no-autofocus */\n\nimport React, { useState, useEffect } from \"react\";\nimport { graphql } from \"gatsby\";\nimport { Link, useTranslation } from \"gatsby-plugin-react-i18next\";\n\nimport SEO from \"../components/SEO\";\nimport \"../components/FrontDoor.css\";\nimport FretlinkLogo from \"../components/svg-assets/FretlinkLogo\";\nimport { ArrowLeft24, RightArrow, Show24, Hide24, Loading30 } from \"../components/svg-assets/Icons\";\nimport frontDoorWhiteMetalSheet from \"../images/front-door/front-door-white-sheet-metal.jpg\";\nimport app from \"../lib/app\";\nimport { Helmet } from \"react-helmet\";\n\nconst VALID_EMAIL_PATTERN = /.+@.+\\..+/;\n\nconst validateEmail = (t, email, password) => {\n const trimmedEmail = email?.trim() ?? \"\";\n\n if (!trimmedEmail.length) {\n if (password.length) {\n return t(\"login.errors.missing-login\");\n } else {\n // If there is neither the user or the password entered, don‘t annoy the user.\n return null;\n }\n } else if (!VALID_EMAIL_PATTERN.test(trimmedEmail)) {\n return t(\"login.errors.invalid-email\");\n }\n};\n\nconst validatePassword = (t, password) => {\n if (!password?.length) {\n return t(\"login.errors.missing-password\");\n }\n return null;\n};\n\nfunction redirectToApp() {\n window.location = process.env.APP_BASE_URL;\n}\n\nconst LoginPage = () => {\n const { t } = useTranslation();\n const [email, setEmail] = useState(\"\");\n const [emailError, setEmailError] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [passwordError, setPasswordError] = useState(\"\");\n const [passwordVisible, setPasswordVisible] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const fieldClassNames = erroneous =>\n Boolean(erroneous) ? \"fd-field fd-field--erroneous\" : \"fd-field\";\n\n useEffect(() => {\n app()\n .isAuthenticated()\n .then(isConnected => {\n if (isConnected) {\n setLoading(true);\n redirectToApp();\n }\n });\n }, []);\n\n const onSubmit = event => {\n event.preventDefault();\n\n const emailError = validateEmail(t, email, password);\n setEmailError(emailError);\n const passwordError = validatePassword(t, password);\n setPasswordError(passwordError);\n\n if (emailError || passwordError) {\n return;\n } else {\n setLoading(true);\n app()\n .login({\n email: email?.trim(),\n password,\n })\n .then(() => {\n setLoading(false);\n redirectToApp();\n })\n .catch(error => {\n setLoading(false);\n\n if (error?.response?.status === 401) {\n setPasswordError(t(\"login.errors.bad-credentials\"));\n return;\n }\n if (error?.response?.status === 429) {\n setEmailError(t(\"login.errors.too-many-tries\"));\n return;\n }\n\n setEmailError(t(\"login.errors.unknown-error\"));\n });\n }\n };\n\n return (\n <>\n \n \n
\n
\n \"\"\n
\n
\n \n \n {t(\"login.go-back-to-website\")}\n \n
\n \n\n \n\n \n\n

\n {t(\"login.form.password.forgot\")}\n

\n\n \n {loading ? : }\n \n \n
\n
\n \n );\n};\n\nexport default LoginPage;\n\nexport const query = graphql`\n query($language: String!) {\n locales: allLocale(filter: { language: { eq: $language } }) {\n edges {\n node {\n ns\n data\n language\n }\n }\n }\n }\n`;\n","const app = () => {\n const baseUrl = process.env.APP_API_BASE_URL.replace(/\\/$/, \"\");\n\n const login = ({ email, password }) =>\n fetch(`${baseUrl}/auth`, {\n method: \"POST\",\n credentials: \"include\",\n body: JSON.stringify({ email, password }),\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then(response => {\n if (response.ok) {\n return response.text();\n } else {\n const error = Error();\n error.response = response;\n throw error;\n }\n })\n .catch(error => {\n console.error(error);\n throw error;\n });\n\n const isAuthenticated = () =>\n fetch(`${baseUrl}/accounts/whoami`, {\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then(response => response.ok)\n .catch(() => false);\n\n const lostPassword = ({ email }) =>\n fetch(`${baseUrl}/forgottenPassword`, {\n method: \"POST\",\n credentials: \"include\",\n body: JSON.stringify({ email }),\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then(response => {\n if (response.ok) {\n return response.text();\n } else {\n const error = Error();\n error.response = response;\n throw error;\n }\n })\n .catch(error => {\n console.error(error);\n throw error;\n });\n\n return {\n login,\n isAuthenticated,\n lostPassword,\n };\n};\n\nexport default app;\n"],"sourceRoot":""}