diff --git a/app/soapbox/components/ui/input/input.tsx b/app/soapbox/components/ui/input/input.tsx index 5314ee583..f30ae5d09 100644 --- a/app/soapbox/components/ui/input/input.tsx +++ b/app/soapbox/components/ui/input/input.tsx @@ -11,7 +11,7 @@ const messages = defineMessages({ hidePassword: { id: 'input.password.hide_password', defaultMessage: 'Hide password' }, }); -interface IInput extends Pick, 'onChange' | 'type'> { +interface IInput extends Pick, 'onChange' | 'type' | 'autoComplete' | 'autoCorrect' | 'autoCapitalize' | 'required'> { autoFocus?: boolean, defaultValue?: string, className?: string, @@ -20,7 +20,7 @@ interface IInput extends Pick, 'onCh placeholder?: string, value?: string, onChange?: (event: React.ChangeEvent) => void, - type: 'text' | 'email' | 'tel' | 'password' + type: 'text' | 'email' | 'tel' | 'password', } const Input = React.forwardRef( diff --git a/app/soapbox/features/auth_login/components/logout.tsx b/app/soapbox/features/auth_login/components/logout.tsx index 1a44f292f..e702e146b 100644 --- a/app/soapbox/features/auth_login/components/logout.tsx +++ b/app/soapbox/features/auth_login/components/logout.tsx @@ -13,7 +13,7 @@ const Logout: React.FC = () => { const [done, setDone] = useState(false); useEffect(() => { - (dispatch(logOut(intl)) as any) + dispatch(logOut(intl) as any) .then(() => setDone(true)) .catch(console.warn); }); diff --git a/app/soapbox/features/external_login/components/external-login-form.tsx b/app/soapbox/features/external_login/components/external-login-form.tsx new file mode 100644 index 000000000..2d6c7d2fa --- /dev/null +++ b/app/soapbox/features/external_login/components/external-login-form.tsx @@ -0,0 +1,70 @@ +import React, { useState, useEffect } from 'react'; +import { useIntl, FormattedMessage, defineMessages } from 'react-intl'; +import { useDispatch } from 'react-redux'; + +import { externalLogin, loginWithCode } from 'soapbox/actions/external_auth'; +import { Button, Form, FormActions, FormGroup, Input, Spinner } from 'soapbox/components/ui'; + +const messages = defineMessages({ + instanceLabel: { id: 'login.fields.instance_label', defaultMessage: 'Instance' }, + instancePlaceholder: { id: 'login.fields.instance_placeholder', defaultMessage: 'example.com' }, +}); + +/** Form for logging into a remote instance */ +const ExternalLoginForm: React.FC = () => { + const code = new URLSearchParams(window.location.search).get('code'); + + const intl = useIntl(); + const dispatch = useDispatch(); + + const [host, setHost] = useState(''); + const [isLoading, setLoading] = useState(false); + + const handleHostChange: React.ChangeEventHandler = ({ currentTarget }) => { + setHost(currentTarget.value); + }; + + const handleSubmit = () => { + setLoading(true); + + dispatch(externalLogin(host) as any) + .then(() => setLoading(false)) + .catch(() => setLoading(false)); + }; + + useEffect(() => { + if (code) { + dispatch(loginWithCode(code)); + } + }); + + if (code) { + return ; + } + + return ( +
+ + + + + + + +
+ ); +}; + +export default ExternalLoginForm; diff --git a/app/soapbox/features/external_login/components/external_login_form.js b/app/soapbox/features/external_login/components/external_login_form.js deleted file mode 100644 index 8cbebc70c..000000000 --- a/app/soapbox/features/external_login/components/external_login_form.js +++ /dev/null @@ -1,82 +0,0 @@ -import React from 'react'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { injectIntl, FormattedMessage, defineMessages } from 'react-intl'; -import { connect } from 'react-redux'; - -import { externalLogin, loginWithCode } from 'soapbox/actions/external_auth'; -import { Spinner } from 'soapbox/components/ui'; -import { SimpleForm, FieldsGroup, TextInput } from 'soapbox/features/forms'; - -const messages = defineMessages({ - instanceLabel: { id: 'login.fields.instance_label', defaultMessage: 'Instance' }, - instancePlaceholder: { id: 'login.fields.instance_placeholder', defaultMessage: 'example.com' }, -}); - -export default @connect() -@injectIntl -class ExternalLoginForm extends ImmutablePureComponent { - - state = { - host: '', - isLoading: false, - } - - handleHostChange = ({ target }) => { - this.setState({ host: target.value }); - } - - handleSubmit = e => { - const { dispatch } = this.props; - const { host } = this.state; - - this.setState({ isLoading: true }); - - dispatch(externalLogin(host)) - .then(() => this.setState({ isLoading: false })) - .catch(() => this.setState({ isLoading: false })); - } - - componentDidMount() { - const code = new URLSearchParams(window.location.search).get('code'); - - if (code) { - this.setState({ code }); - this.props.dispatch(loginWithCode(code)); - } - } - - render() { - const { intl } = this.props; - const { isLoading, code } = this.state; - - if (code) { - return ; - } - - return ( - -
- - - -
-
- -
-
- ); - } - -} diff --git a/app/soapbox/features/external_login/index.js b/app/soapbox/features/external_login/index.js deleted file mode 100644 index 881c2e08f..000000000 --- a/app/soapbox/features/external_login/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - -import ExternalLoginForm from './components/external_login_form'; - -export default class ExternalLoginPage extends ImmutablePureComponent { - - render() { - return ; - } - -} diff --git a/app/soapbox/features/external_login/index.tsx b/app/soapbox/features/external_login/index.tsx new file mode 100644 index 000000000..510014dc2 --- /dev/null +++ b/app/soapbox/features/external_login/index.tsx @@ -0,0 +1,10 @@ +import React from 'react'; + +import ExternalLoginForm from './components/external-login-form'; + +/** Page for logging into a remote instance */ +const ExternalLoginPage: React.FC = () => { + return ; +}; + +export default ExternalLoginPage;