Account.jsx 3.9KB

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