import { useEffect, useState } from 'react' import Grid from '@material-ui/core/Grid' import Typography from '@material-ui/core/Typography' import Link from '@material-ui/core/Link' import Avatar from '@material-ui/core/Avatar' import Box from '@material-ui/core/Box' import { connect } from 'react-redux' import { bindActionCreators, Dispatch } from 'redux' import { selectAuthState } from '../../../redux/auth/selector' import { showDialog } from '../../../redux/dialog/service' import { ConnectionTexts } from './ConnectionTexts' import { createMagicLink, loginUserByPassword, addConnectionByOauth, addConnectionByPassword, removeConnection } from '../../../redux/auth/service' import MagicLinkEmail from '../Auth/MagicLinkEmail' import PasswordLogin from '../Auth/PasswordLogin' import { User } from '../../../interfaces/User' import { IdentityProviderSeed } from '../../../interfaces/IdentityProvider' import { showAlert } from '../../../redux/alert/actions' import './style.scss' interface Props { auth: any classes: any connectionType: | 'facebook' | 'github' | 'google' | 'email' | 'sms' | 'password' showDialog: typeof showDialog addConnectionByOauth: typeof addConnectionByOauth createMagicLink: typeof createMagicLink loginUserByPassword: typeof loginUserByPassword addConnectionByPassword: typeof addConnectionByPassword removeConnection: typeof removeConnection showAlert: typeof showAlert } const mapStateToProps = (state: any) => { return { auth: selectAuthState(state) } } const mapDispatchToProps = (dispatch: Dispatch) => ({ showDialog: bindActionCreators(showDialog, dispatch), addConnectionByOauth: bindActionCreators(addConnectionByOauth, dispatch), createMagicLink: bindActionCreators(createMagicLink, dispatch), loginUserByPassword: bindActionCreators(loginUserByPassword, dispatch), addConnectionByPassword: bindActionCreators( addConnectionByPassword, dispatch ), removeConnection: bindActionCreators(removeConnection, dispatch), showAlert: bindActionCreators(showAlert, dispatch) }) const SingleConnection = (props: Props) => { const { addConnectionByOauth, auth, classes, connectionType, removeConnection, showAlert, showDialog } = props const initialState = { identityProvider: IdentityProviderSeed, userId: '' } const [state, setState] = useState(initialState) useEffect(() => { const user = auth.get('user') as User if (!user) { return } setState({ ...state, identityProvider: user.identityProviders.find( (v) => v.type === connectionType ) }) }, []) const disconnect = () => { const identityProvider = state.identityProvider const authIdentityProvider = props.auth.get('authUser').identityProvider if (authIdentityProvider.id === identityProvider.id) { showAlert('error', 'Can not remove active Identity Provider') return } removeConnection(identityProvider.id, state.userId) } const connect = () => { const { userId } = state switch (connectionType) { case 'facebook': case 'google': case 'github': addConnectionByOauth(connectionType, userId) break case 'email': showDialog({ children: }) break case 'sms': showDialog({ children: }) break case 'password': showDialog({ children: }) break } } const identityProvider = state.identityProvider let texts let actionBlock if (identityProvider && identityProvider.id) { texts = ConnectionTexts[connectionType].connected actionBlock = ( {identityProvider.token} (disconnect) ) } else { texts = ConnectionTexts[connectionType].not_connected actionBlock = ( Connect ) } return (
{texts.header} {texts.descr.map((descr, index) => { return ( {descr} ) })} {actionBlock}
) } const SingleConnectionWrapper = (props: any) => export default connect( mapStateToProps, mapDispatchToProps )(SingleConnectionWrapper)