header-build.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import {Link, Route, Switch} from "react-router-dom";
  2. import {connect} from "react-redux";
  3. import {actionAuthLogin, actionAuthLogout, actionPromise} from "../../reducers";
  4. import {CLoginForm} from "./login";
  5. import {CRegForm} from "./registration";
  6. import {useState} from "react";
  7. import {CAvatar,CAvatarDropZone} from "./avatar";
  8. import {Logo} from "./logo";
  9. import {history} from "../../App";
  10. import {actionFullLogin, gql} from "../../actions";
  11. import {takeEvery, select, call,put} from "redux-saga/effects";
  12. import {promiseWorker} from "../../reducers/promiseReducer";
  13. import {CTrackSearch} from "../tools/search";
  14. import {CProtectedRoute} from "../../reducers/routeReducer";
  15. import {Aside} from "../main";
  16. export const actionSetUserPassword = (password) =>
  17. ({type:'SET_USER_PASSWORD', password})
  18. export function* setUserPasswordWorker (action) {
  19. let {password} = action
  20. let {auth} = yield select()
  21. let userId = auth.payload?.sub?.id
  22. console.log(userId, password)
  23. // yield put (actionAuthLogout())
  24. yield call(promiseWorker,actionPromise('register', gql(`mutation reg($user:UserInput) {
  25. UserUpsert(user:$user) {
  26. _id
  27. }
  28. }`, {user: {userId, password}})))
  29. // yield put (actionFullLogin)
  30. }
  31. export function* setUserPasswordWatcher() {
  32. yield takeEvery ('SET_USER_PASSWORD',setUserPasswordWorker)
  33. }
  34. const ChangePasswordForm = ({onChangePassword}) => {
  35. const [p, setP] = useState ('')
  36. return (
  37. <div>
  38. <input type='password' placeholder='Введите пароль' style={{backgroundColor:"skyblue"}} onChange={e => setP(e.target.value)}></input>
  39. <button onClick={() => {onChangePassword(p); history.push('/')}}>Сменить пароль</button>
  40. </div>
  41. )
  42. }
  43. export const CChangePasswordForm = connect(null,{onChangePassword:actionSetUserPassword})(ChangePasswordForm)
  44. export const Header = () =>
  45. <header className="Header">
  46. <Logo />
  47. <Link to={`/music`}><h2>Все песни</h2></Link>
  48. <Link to={`/mymusic`}> <h2>Моя музыка</h2></Link>
  49. <h2><CTrackSearch /></h2>
  50. <Switch>
  51. <CProtectedRoute roles={["anon", "user"]} path="/login" component={CLoginForm}/>
  52. <CProtectedRoute roles={["anon", "user"]} path="/registration" component={CRegForm}/>
  53. <CProtectedRoute roles={["anon", "user"]} path='*' component={CLoginButtons} exact/>
  54. </Switch>
  55. </header>
  56. const Spoiler = ({ header, children, open=false }) => {
  57. const [openSpoiler, setOpenSpoiler] = useState(open)
  58. return (
  59. <>
  60. <section className="Spoiler" onClick={() => setOpenSpoiler(!openSpoiler)}>
  61. {header}
  62. </section>
  63. {openSpoiler && (
  64. <div className="SpoilerContent">
  65. {children}
  66. </div>
  67. )}
  68. </>
  69. );
  70. };
  71. const LoginButtons = ({onLogout, history, token}) => {
  72. return (
  73. <>
  74. {!token ?
  75. ( <div className='LoginButtons'>
  76. <Link to='/login'><button onClick={() => history.push('/')}>Вход</button></Link>
  77. <Link to='/registration'><button>Регистрация</button></Link></div>) :
  78. (<div className='LoginColumn'>
  79. <Spoiler header={<CAvatar/>}>
  80. <strong>{JSON.parse(atob(token.split(".")[1])).sub.login}</strong>
  81. <CAvatarDropZone />
  82. <CChangePasswordForm/>
  83. <button onClick={() => {onLogout(); history.push('/')}}>Выйти</button>
  84. </Spoiler>
  85. </div>)
  86. }
  87. </>
  88. )
  89. }
  90. export const CLoginButtons = connect(state => ({token: state.auth.token}), {onLogout: actionAuthLogout})(LoginButtons)