2022-02-14 12:35:35 -08:00
import PropTypes from 'prop-types' ;
import React from 'react' ;
import ImmutablePureComponent from 'react-immutable-pure-component' ;
import { defineMessages , FormattedMessage , injectIntl } from 'react-intl' ;
import { connect } from 'react-redux' ;
import { Link } from 'react-router-dom' ;
import { moveAccount } from 'soapbox/actions/security' ;
import snackbar from 'soapbox/actions/snackbar' ;
import ShowablePassword from 'soapbox/components/showable_password' ;
import { FieldsGroup , SimpleForm , TextInput } from 'soapbox/features/forms' ;
import Column from 'soapbox/features/ui/components/column' ;
const messages = defineMessages ( {
heading : { id : 'column.migration' , defaultMessage : 'Account migration' } ,
submit : { id : 'migration.submit' , defaultMessage : 'Move followers' } ,
moveAccountSuccess : { id : 'migration.move_account.success' , defaultMessage : 'Account successfully moved.' } ,
moveAccountFail : { id : 'migration.move_account.fail' , defaultMessage : 'Account migration failed.' } ,
acctFieldLabel : { id : 'migration.fields.acct.label' , defaultMessage : 'Handle of the new account' } ,
acctFieldPlaceholder : { id : 'migration.fields.acct.placeholder' , defaultMessage : 'username@domain' } ,
currentPasswordFieldLabel : { id : 'migration.fields.confirm_password.label' , defaultMessage : 'Current password' } ,
} ) ;
export default @ connect ( )
@ injectIntl
class Migration extends ImmutablePureComponent {
static propTypes = {
dispatch : PropTypes . func . isRequired ,
intl : PropTypes . object . isRequired ,
} ;
state = {
targetAccount : '' ,
password : '' ,
isLoading : false ,
}
handleInputChange = e => {
this . setState ( { [ e . target . name ] : e . target . value } ) ;
}
clearForm = ( ) => {
this . setState ( { targetAccount : '' , password : '' } ) ;
}
handleSubmit = e => {
const { targetAccount , password } = this . state ;
const { dispatch , intl } = this . props ;
this . setState ( { isLoading : true } ) ;
return dispatch ( moveAccount ( targetAccount , password ) ) . then ( ( ) => {
this . clearForm ( ) ;
dispatch ( snackbar . success ( intl . formatMessage ( messages . moveAccountSuccess ) ) ) ;
} ) . catch ( error => {
dispatch ( snackbar . error ( intl . formatMessage ( messages . moveAccountFail ) ) ) ;
} ) . then ( ( ) => {
this . setState ( { isLoading : false } ) ;
} ) ;
}
render ( ) {
const { intl } = this . props ;
return (
2022-03-29 07:26:02 -07:00
< Column label = { intl . formatMessage ( messages . heading ) } >
2022-02-14 12:35:35 -08:00
< SimpleForm onSubmit = { this . handleSubmit } >
< fieldset disabled = { this . state . isLoading } >
< FieldsGroup >
< p className = 'hint' >
< FormattedMessage
id = 'migration.hint'
defaultMessage = 'This will move your followers to the new account. No other data will be moved. To perform migration, you need to {link} on your new account first.'
values = { {
link : (
< Link to = '/settings/aliases' >
< FormattedMessage
id = 'migration.hint.link'
defaultMessage = 'create an account alias'
/ >
< / L i n k >
) ,
} }
/ >
< / p >
< TextInput
label = { intl . formatMessage ( messages . acctFieldLabel ) }
placeholder = { intl . formatMessage ( messages . acctFieldPlaceholder ) }
name = 'targetAccount'
value = { this . state . targetAccount }
onChange = { this . handleInputChange }
/ >
< ShowablePassword
label = { intl . formatMessage ( messages . currentPasswordFieldLabel ) }
name = 'password'
value = { this . state . password }
onChange = { this . handleInputChange }
/ >
< div className = 'actions' >
< button
name = 'button'
type = 'submit'
className = 'btn button button-primary'
disabled = { ! this . state . password || ! this . state . targetAccount }
>
{ intl . formatMessage ( messages . submit ) }
< / b u t t o n >
< / d i v >
< / F i e l d s G r o u p >
< / f i e l d s e t >
< / S i m p l e F o r m >
< / C o l u m n >
) ;
}
}