index.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import React, { ChangeEvent, FormEvent } from 'react'
  2. import { connect } from 'react-redux'
  3. import { createStructuredSelector } from 'reselect'
  4. import { makeSelectOauth2Enabled } from 'share/containers/App/selectors'
  5. import LoginForm from 'app/containers/Login/LoginForm'
  6. import Background from 'share/components/Background'
  7. import ExternalLogin from 'share/components/ExternalLogin'
  8. import { AppActions } from 'share/containers/App/actions'
  9. import checkLogin from 'utils/checkLogin'
  10. import { setToken } from 'utils/request'
  11. import { message } from 'antd'
  12. interface ILoginProps {
  13. loading: boolean
  14. shareToken: any
  15. oauth2Enabled: boolean
  16. loginCallback?: () => void
  17. onLogin?: (
  18. username: string,
  19. password: string,
  20. shareToken: any,
  21. resolve: (res) => void,
  22. reject?: () => void
  23. ) => void
  24. logged?: (user) => void
  25. }
  26. interface ILoginStates {
  27. username: string
  28. password: string
  29. }
  30. class Login extends React.PureComponent<ILoginProps, ILoginStates> {
  31. constructor(props) {
  32. super(props)
  33. this.state = {
  34. username: '',
  35. password: ''
  36. }
  37. }
  38. public componentWillMount() {
  39. this.checkNormalLogin()
  40. }
  41. private checkNormalLogin = () => {
  42. const { oauth2Enabled, shareToken, loginCallback } = this.props
  43. if (checkLogin()) {
  44. const token = localStorage.getItem('TOKEN')
  45. const loginUser = localStorage.getItem('loginUser')
  46. setToken(token)
  47. this.props.logged(JSON.parse(loginUser))
  48. if (loginCallback) {
  49. loginCallback()
  50. }
  51. } else if (oauth2Enabled) {
  52. localStorage.setItem('shareToken', shareToken)
  53. localStorage.setItem('shareRoute', window.location.hash)
  54. }
  55. }
  56. private changeUsername = (e: ChangeEvent<HTMLInputElement>) => {
  57. this.setState({
  58. username: e.target.value.trim()
  59. })
  60. }
  61. private changePassword = (e: ChangeEvent<HTMLInputElement>) => {
  62. this.setState({
  63. password: e.target.value
  64. })
  65. }
  66. private doLogin = (e: FormEvent<HTMLFormElement>) => {
  67. e.preventDefault()
  68. const { onLogin, shareToken, loginCallback } = this.props
  69. const { username, password } = this.state
  70. if (username && password) {
  71. onLogin(
  72. username,
  73. password,
  74. shareToken,
  75. () => {
  76. if (loginCallback) {
  77. loginCallback()
  78. }
  79. },
  80. () => {
  81. message.error('该用户无权限')
  82. }
  83. )
  84. }
  85. }
  86. public render() {
  87. const { loading, oauth2Enabled, shareToken } = this.props
  88. const { username, password } = this.state
  89. return (
  90. <Background>
  91. <LoginForm
  92. username={username}
  93. password={password}
  94. loading={loading}
  95. onChangeUsername={this.changeUsername}
  96. onChangePassword={this.changePassword}
  97. onLogin={this.doLogin}
  98. />
  99. {oauth2Enabled && <ExternalLogin />}
  100. </Background>
  101. )
  102. }
  103. }
  104. const mapStateToProps = createStructuredSelector({
  105. oauth2Enabled: makeSelectOauth2Enabled()
  106. })
  107. export function mapDispatchToProps(dispatch) {
  108. return {
  109. onLogin: (
  110. username: string,
  111. password: string,
  112. shareToken: any,
  113. resolve: () => void,
  114. reject?: () => void
  115. ) => dispatch(AppActions.login(username, password, shareToken, resolve, reject)),
  116. logged: (user) => dispatch(AppActions.logged(user))
  117. }
  118. }
  119. export default connect(mapStateToProps, mapDispatchToProps)(Login)