import { Capacitor } from '@capacitor/core' import { GoogleAuth } from '@codetrix-studio/capacitor-google-auth' import { Settings } from '@mui/icons-material' import GoogleIcon from '@mui/icons-material/Google' import { Avatar, Box, Button, Container, Divider, IconButton, Input, Sheet, Snackbar, Typography, } from '@mui/joy' import Cookies from 'js-cookie' import React from 'react' import { useNavigate } from 'react-router-dom' import { LoginSocialGoogle } from 'reactjs-social-login' import { GOOGLE_CLIENT_ID, REDIRECT_URL } from '../../Config' import { UserContext } from '../../contexts/UserContext' import Logo from '../../Logo' import { useResource } from '../../queries/ResourceQueries' import { GetUserProfile, login } from '../../utils/Fetcher' import { apiManager } from '../../utils/TokenManager' const LoginView = () => { const { userProfile, setUserProfile } = React.useContext(UserContext) const [username, setUsername] = React.useState('') const [password, setPassword] = React.useState('') const [error, setError] = React.useState(null) const { data: resource } = useResource() const Navigate = useNavigate() const handleSubmit = async e => { e.preventDefault() login(username, password) .then(response => { if (response.status === 200) { return response.json().then(data => { localStorage.setItem('ca_token', data.token) localStorage.setItem('ca_expiration', data.expire) const redirectUrl = Cookies.get('ca_redirect') // console.log('redirectUrl', redirectUrl) if (redirectUrl) { Cookies.remove('ca_redirect') Navigate(redirectUrl) } else { Navigate('/my/chores') } }) } else if (response.status === 401) { setError('Wrong username or password') } else { setError('An error occurred, please try again') console.log('Login failed') } }) .catch(err => { setError('Unable to communicate with server, please try again') console.log('Login failed', err) }) } const loggedWithProvider = function (provider, data) { const baseURL = apiManager.getApiURL() return fetch(`${baseURL}/auth/${provider}/callback`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ provider: provider, token: data['access_token'] || // data["access_token"] is for Google data['accessToken'], // data["accessToken"] is for Google Capacitor data: data, }), }).then(response => { if (response.status === 200) { return response.json().then(data => { localStorage.setItem('ca_token', data.token) localStorage.setItem('ca_expiration', data.expire) const redirectUrl = Cookies.get('ca_redirect') if (redirectUrl) { Cookies.remove('ca_redirect') Navigate(redirectUrl) } else { getUserProfileAndNavigateToHome() } }) } return response.json().then(error => { setError("Couldn't log in with Google, please try again") }) }) } const getUserProfileAndNavigateToHome = () => { GetUserProfile().then(data => { data.json().then(data => { setUserProfile(data.res) // check if redirect url is set in cookie: const redirectUrl = Cookies.get('ca_redirect') if (redirectUrl) { Cookies.remove('ca_redirect') Navigate(redirectUrl) } else { Navigate('/my/chores') } }) }) } const handleForgotPassword = () => { Navigate('/forgot-password') } const generateRandomState = () => { const randomState = Math.random().toString(36).substring(7) localStorage.setItem('authState', randomState) return randomState } const handleAuthentikLogin = () => { const authentikAuthorizeUrl = resource?.identity_provider?.auth_url const params = new URLSearchParams({ response_type: 'code', client_id: resource?.identity_provider?.client_id, redirect_uri: `${window.location.origin}/auth/oauth2`, scope: 'openid profile email', // Your scopes state: generateRandomState(), }) console.log('redirect', `${authentikAuthorizeUrl}?${params.toString()}`) window.location.href = `${authentikAuthorizeUrl}?${params.toString()}` } return ( {Capacitor.isNativePlatform() && ( { Navigate('/login/settings') }} > {' '} )} Done tick {userProfile && ( <> Welcome back,{' '} {userProfile?.displayName || userProfile?.username} )} {!userProfile && ( <> Sign in to your account to continue Username { setUsername(e.target.value) }} /> Password: { setPassword(e.target.value) }} /> )} or {import.meta.env.VITE_IS_SELF_HOSTED !== 'true' && ( <> {!Capacitor.isNativePlatform() && ( { loggedWithProvider(provider, data) }} onReject={err => { setError("Couldn't log in with Google, please try again") }} > )} {Capacitor.isNativePlatform() && ( )} )} {resource?.identity_provider?.client_id && ( )} setError(null)} autoHideDuration={3000} message={error} > {error} ) } export default LoginView