Account.jsx 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React from 'react'
  2. import { connect } from 'react-redux'
  3. import Sidebar from './Sidebar.jsx'
  4. import PageWrapper from '../component/common/layout/PageWrapper.jsx'
  5. import PageTitle from '../component/common/layout/PageTitle.jsx'
  6. import PageContent from '../component/common/layout/PageContent.jsx'
  7. import UserInfo from '../component/Account/UserInfo.jsx'
  8. import MenuSubComponent from '../component/Account/MenuSubComponent.jsx'
  9. import PersonalData from '../component/Account/PersonalData.jsx'
  10. import Calendar from '../component/Account/Calendar.jsx'
  11. import Notification from '../component/Account/Notification.jsx'
  12. import { Delimiter } from 'tracim_lib'
  13. import { updateUserWorkspaceSubscriptionNotif } from '../action-creator.sync.js'
  14. import {
  15. getTimezone,
  16. getUserRole
  17. } from '../action-creator.async.js'
  18. class Account extends React.Component {
  19. constructor (props) {
  20. super(props)
  21. this.state = {
  22. subComponentMenu: [{
  23. name: 'personalData',
  24. menuLabel: 'Informations Compte',
  25. active: true
  26. }, {
  27. name: 'calendar',
  28. menuLabel: 'Calendrier',
  29. active: false
  30. }, {
  31. name: 'notification',
  32. menuLabel: 'Notifications',
  33. active: false
  34. }]
  35. }
  36. }
  37. componentDidMount () {
  38. const { user, workspaceList, timezone, dispatch } = this.props
  39. if (user.id !== -1 && workspaceList.length > 0) dispatch(getUserRole(user))
  40. if (timezone.length === 0) dispatch(getTimezone())
  41. }
  42. componentDidUpdate () {
  43. const { user, workspaceList, dispatch } = this.props
  44. if (user.id !== -1 && workspaceList.length > 0 && workspaceList.some(ws => ws.role === undefined)) dispatch(getUserRole(user))
  45. }
  46. handleClickSubComponentMenuItem = subMenuItemName => this.setState(prev => ({
  47. subComponentMenu: prev.subComponentMenu.map(m => ({...m, active: m.name === subMenuItemName}))
  48. }))
  49. handleChangeSubscriptionNotif = (workspaceId, subscriptionNotif) =>
  50. this.props.dispatch(updateUserWorkspaceSubscriptionNotif(workspaceId, subscriptionNotif))
  51. render () {
  52. const subComponent = (() => {
  53. switch (this.state.subComponentMenu.find(({active}) => active).name) {
  54. case 'personalData':
  55. return <PersonalData />
  56. case 'calendar':
  57. return <Calendar user={this.props.user} timezone={this.props.timezone} />
  58. case 'notification':
  59. return <Notification
  60. workspaceList={this.props.workspaceList}
  61. onChangeSubscriptionNotif={this.handleChangeSubscriptionNotif}
  62. />
  63. }
  64. })()
  65. return (
  66. <div className='sidebarpagecontainer'>
  67. <Sidebar />
  68. <PageWrapper customClass='account'>
  69. <PageTitle
  70. parentClass={'account'}
  71. title={'Mon Compte'}
  72. />
  73. <PageContent parentClass='account'>
  74. <UserInfo user={this.props.user} />
  75. <Delimiter customClass={'account__delimiter'} />
  76. <div className='account__userpreference'>
  77. <MenuSubComponent subMenuList={this.state.subComponentMenu} onClickMenuItem={this.handleClickSubComponentMenuItem} />
  78. <div className='account__userpreference__setting'>
  79. { subComponent }
  80. </div>
  81. </div>
  82. </PageContent>
  83. </PageWrapper>
  84. </div>
  85. )
  86. }
  87. }
  88. const mapStateToProps = ({ user, workspaceList, timezone }) => ({ user, workspaceList, timezone })
  89. export default connect(mapStateToProps)(Account)