Account.jsx 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import React from 'react'
  2. import { connect } from 'react-redux'
  3. import UserInfo from '../component/Account/UserInfo.jsx'
  4. import MenuSubComponent from '../component/Account/MenuSubComponent.jsx'
  5. import PersonalData from '../component/Account/PersonalData.jsx'
  6. // import Calendar from '../component/Account/Calendar.jsx'
  7. import Notification from '../component/Account/Notification.jsx'
  8. import Password from '../component/Account/Password.jsx'
  9. import Timezone from '../component/Account/Timezone.jsx'
  10. import {
  11. Delimiter,
  12. PageWrapper,
  13. PageTitle,
  14. PageContent
  15. } from 'tracim_frontend_lib'
  16. import { updateUserWorkspaceSubscriptionNotif } from '../action-creator.sync.js'
  17. import {
  18. getTimezone,
  19. getUserRole
  20. } from '../action-creator.async.js'
  21. import { translate } from 'react-i18next'
  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. />
  74. // case 'calendar':
  75. // return <Calendar user={this.props.user} />
  76. case 'notification':
  77. return <Notification
  78. workspaceList={this.props.workspaceList}
  79. onChangeSubscriptionNotif={this.handleChangeSubscriptionNotif}
  80. />
  81. case 'password':
  82. return <Password
  83. />
  84. case 'timezone':
  85. return <Timezone timezone={this.props.timezone} onChangeTimezone={this.handleChangeTimezone} />
  86. }
  87. })()
  88. return (
  89. <div className='account'>
  90. <PageWrapper customClass='account'>
  91. <PageTitle
  92. parentClass={'account'}
  93. title={'Mon Compte'}
  94. />
  95. <PageContent parentClass='account'>
  96. <UserInfo user={this.props.user} />
  97. <Delimiter customClass={'account__delimiter'} />
  98. <div className='account__userpreference'>
  99. <MenuSubComponent subMenuList={this.state.subComponentMenu} onClickMenuItem={this.handleClickSubComponentMenuItem} />
  100. <div className='account__userpreference__setting'>
  101. { subComponent }
  102. </div>
  103. </div>
  104. </PageContent>
  105. </PageWrapper>
  106. </div>
  107. )
  108. }
  109. }
  110. const mapStateToProps = ({ user, workspaceList, timezone }) => ({ user, workspaceList, timezone })
  111. export default connect(mapStateToProps)(translate()(Account))