Files
mattermostest/src/renderer/modals/login/loginModal.tsx
Devin Binnie 4130c2c37d React bootstrap upgrade to v1, migrate to react-beautiful-dnd (#1639)
* Upgrade packages, fix errors, still WIP

* WIP

* Bootstrap v4 upgrade

* Switch to react-beautiful-dnd

* Fixed some issues

* Added to generate signed Mac build for UX

* PR feedback

* Missed one

* PR feedback
2021-07-05 21:19:11 -04:00

169 lines
5.9 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
// Copyright (c) 2015-2016 Yuya Ochiai
import React from 'react';
import {Button, Col, FormLabel, Form, FormGroup, FormControl, Modal} from 'react-bootstrap';
import {LoginModalData} from 'types/auth';
import {ModalMessage} from 'types/modals';
import {AuthenticationResponseDetails, AuthInfo} from 'electron/renderer';
import urlUtils from 'common/utils/url';
import {MODAL_INFO} from 'common/communication';
type Props = {
onCancel: (request: AuthenticationResponseDetails) => void;
onLogin: (request: AuthenticationResponseDetails, username: string, password: string) => void;
getAuthInfo: () => void;
};
type State = {
username: string;
password: string;
request?: AuthenticationResponseDetails;
authInfo?: AuthInfo;
};
export default class LoginModal extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
username: '',
password: '',
};
}
componentDidMount() {
window.addEventListener('message', this.handleAuthInfoMessage);
this.props.getAuthInfo();
}
componentWillUnmount() {
window.removeEventListener('message', this.handleAuthInfoMessage);
}
handleAuthInfoMessage = (event: {data: ModalMessage<LoginModalData>}) => {
switch (event.data.type) {
case MODAL_INFO: {
const {request, authInfo} = event.data.data;
this.setState({request, authInfo});
break;
}
default:
break;
}
}
handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
this.props.onLogin(this.state.request!, this.state.username, this.state.password);
this.setState({
username: '',
password: '',
request: undefined,
authInfo: undefined,
});
}
handleCancel = (event: React.MouseEvent<HTMLButtonElement>) => {
event.preventDefault();
this.props.onCancel(this.state.request!);
this.setState({
username: '',
password: '',
request: undefined,
authInfo: undefined,
});
}
setUsername = (e: React.ChangeEvent<HTMLInputElement>) => {
this.setState({username: e.target.value});
}
setPassword = (e: React.ChangeEvent<HTMLInputElement>) => {
this.setState({password: e.target.value});
}
render() {
let theServer = '';
if (!(this.state.request && this.state.authInfo)) {
theServer = '';
} else if (this.state.authInfo.isProxy) {
theServer = `The proxy ${this.state.authInfo.host}:${this.state.authInfo.port}`;
} else {
const tmpURL = urlUtils.parseURL(this.state.request.url);
theServer = `The server ${tmpURL?.protocol}//${tmpURL?.host}`;
}
const message = `${theServer} requires a username and password.`;
return (
<Modal
show={Boolean(this.state.request && this.state.authInfo)}
>
<Modal.Header>
<Modal.Title>{'Authentication Required'}</Modal.Title>
</Modal.Header>
<Modal.Body>
<p>
{ message }
</p>
<Form
onSubmit={this.handleSubmit}
>
<FormGroup>
<Col
as={FormLabel}
sm={2}
>{'User Name'}</Col>
<Col sm={10}>
<FormControl
type='text'
placeholder='User Name'
onChange={this.setUsername}
value={this.state.username}
onClick={(e: React.MouseEvent<HTMLInputElement>) => {
e.stopPropagation();
}}
/>
</Col>
</FormGroup>
<FormGroup>
<Col
as={FormLabel}
sm={2}
>{'Password'}</Col>
<Col sm={10}>
<FormControl
type='password'
placeholder='Password'
onChange={this.setPassword}
value={this.state.password}
onClick={(e: React.MouseEvent<HTMLInputElement>) => {
e.stopPropagation();
}}
/>
</Col>
</FormGroup>
<FormGroup>
<Col sm={12}>
<div className='pull-right'>
<Button
type='submit'
variant='primary'
>{'Login'}</Button>
{ ' ' }
<Button
variant='link'
onClick={this.handleCancel}
>{'Cancel'}</Button>
</div>
</Col>
</FormGroup>
</Form>
</Modal.Body>
</Modal>
);
}
}