PersonalContainer.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { Container } from 'unstated';
  2. import loggerFactory from '@alias/logger';
  3. // eslint-disable-next-line no-unused-vars
  4. const logger = loggerFactory('growi:services:PersonalContainer');
  5. /**
  6. * Service container for personal settings page (PersonalSettings.jsx)
  7. * @extends {Container} unstated Container
  8. */
  9. export default class PersonalContainer extends Container {
  10. constructor(appContainer) {
  11. super();
  12. this.appContainer = appContainer;
  13. this.state = {
  14. retrieveError: null,
  15. name: '',
  16. email: '',
  17. registrationWhiteList: this.appContainer.getConfig().registrationWhiteList,
  18. isEmailPublished: false,
  19. lang: 'en-US',
  20. isGravatarEnabled: false,
  21. externalAccounts: [],
  22. isPasswordSet: false,
  23. apiToken: '',
  24. };
  25. }
  26. /**
  27. * Workaround for the mangling in production build to break constructor.name
  28. */
  29. static getClassName() {
  30. return 'PersonalContainer';
  31. }
  32. /**
  33. * retrieve personal data
  34. */
  35. async retrievePersonalData() {
  36. try {
  37. const response = await this.appContainer.apiv3.get('/personal-setting/');
  38. const { currentUser } = response.data;
  39. this.setState({
  40. name: currentUser.name,
  41. email: currentUser.email,
  42. isEmailPublished: currentUser.isEmailPublished,
  43. lang: currentUser.lang,
  44. isGravatarEnabled: currentUser.isGravatarEnabled,
  45. isPasswordSet: (currentUser.password != null),
  46. apiToken: currentUser.apiToken,
  47. });
  48. }
  49. catch (err) {
  50. this.setState({ retrieveError: err });
  51. logger.error(err);
  52. throw new Error('Failed to fetch personal data');
  53. }
  54. }
  55. /**
  56. * retrieve external accounts that linked me
  57. */
  58. async retrieveExternalAccounts() {
  59. try {
  60. const response = await this.appContainer.apiv3.get('/personal-setting/external-accounts');
  61. const { externalAccounts } = response.data;
  62. this.setState({ externalAccounts });
  63. }
  64. catch (err) {
  65. this.setState({ retrieveError: err });
  66. logger.error(err);
  67. throw new Error('Failed to fetch external accounts');
  68. }
  69. }
  70. /**
  71. * Change name
  72. */
  73. changeName(inputValue) {
  74. this.setState({ name: inputValue });
  75. }
  76. /**
  77. * Change email
  78. */
  79. changeEmail(inputValue) {
  80. this.setState({ email: inputValue });
  81. }
  82. /**
  83. * Change isEmailPublished
  84. */
  85. changeIsEmailPublished(boolean) {
  86. this.setState({ isEmailPublished: boolean });
  87. }
  88. /**
  89. * Change lang
  90. */
  91. changeLang(lang) {
  92. this.setState({ lang });
  93. }
  94. /**
  95. * Change isGravatarEnabled
  96. */
  97. changeIsGravatarEnabled(boolean) {
  98. this.setState({ isGravatarEnabled: boolean });
  99. }
  100. /**
  101. * Update basic info
  102. * @memberOf PersonalContainer
  103. * @return {Array} basic info
  104. */
  105. async updateBasicInfo() {
  106. try {
  107. const response = await this.appContainer.apiv3.put('/personal-setting/', {
  108. name: this.state.name,
  109. email: this.state.email,
  110. isEmailPublished: this.state.isEmailPublished,
  111. lang: this.state.lang,
  112. });
  113. const { updatedUser } = response.data;
  114. this.setState({
  115. name: updatedUser.name,
  116. email: updatedUser.email,
  117. isEmailPublished: updatedUser.isEmailPublished,
  118. lang: updatedUser.lang,
  119. });
  120. }
  121. catch (err) {
  122. this.setState({ retrieveError: err });
  123. logger.error(err);
  124. throw new Error('Failed to update personal data');
  125. }
  126. }
  127. /**
  128. * Update profile image
  129. * @memberOf PersonalContainer
  130. */
  131. async updateProfileImage() {
  132. // TODO create apiV3
  133. }
  134. }