PersonalContainer.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. uploadedPictureSrc: this.getUploadedPictureSrc(this.appContainer.currentUser),
  22. externalAccounts: [],
  23. isPasswordSet: false,
  24. apiToken: '',
  25. };
  26. }
  27. /**
  28. * Workaround for the mangling in production build to break constructor.name
  29. */
  30. static getClassName() {
  31. return 'PersonalContainer';
  32. }
  33. /**
  34. * retrieve personal data
  35. */
  36. async retrievePersonalData() {
  37. try {
  38. const response = await this.appContainer.apiv3.get('/personal-setting/');
  39. const { currentUser } = response.data;
  40. this.setState({
  41. name: currentUser.name,
  42. email: currentUser.email,
  43. isEmailPublished: currentUser.isEmailPublished,
  44. lang: currentUser.lang,
  45. isGravatarEnabled: currentUser.isGravatarEnabled,
  46. isPasswordSet: (currentUser.password != null),
  47. apiToken: currentUser.apiToken,
  48. });
  49. }
  50. catch (err) {
  51. this.setState({ retrieveError: err });
  52. logger.error(err);
  53. throw new Error('Failed to fetch personal data');
  54. }
  55. }
  56. /**
  57. * define a function for uploaded picture
  58. */
  59. getUploadedPictureSrc(user) {
  60. if (user.image) {
  61. return user.image;
  62. }
  63. if (user.imageAttachment != null) {
  64. return user.imageAttachment.filePathProxied;
  65. }
  66. return '/images/icons/user.svg';
  67. }
  68. /**
  69. * retrieve external accounts that linked me
  70. */
  71. async retrieveExternalAccounts() {
  72. try {
  73. const response = await this.appContainer.apiv3.get('/personal-setting/external-accounts');
  74. const { externalAccounts } = response.data;
  75. this.setState({ externalAccounts });
  76. }
  77. catch (err) {
  78. this.setState({ retrieveError: err });
  79. logger.error(err);
  80. throw new Error('Failed to fetch external accounts');
  81. }
  82. }
  83. /**
  84. * Change name
  85. */
  86. changeName(inputValue) {
  87. this.setState({ name: inputValue });
  88. }
  89. /**
  90. * Change email
  91. */
  92. changeEmail(inputValue) {
  93. this.setState({ email: inputValue });
  94. }
  95. /**
  96. * Change isEmailPublished
  97. */
  98. changeIsEmailPublished(boolean) {
  99. this.setState({ isEmailPublished: boolean });
  100. }
  101. /**
  102. * Change lang
  103. */
  104. changeLang(lang) {
  105. this.setState({ lang });
  106. }
  107. /**
  108. * Change isGravatarEnabled
  109. */
  110. changeIsGravatarEnabled(boolean) {
  111. this.setState({ isGravatarEnabled: boolean });
  112. }
  113. /**
  114. * Update basic info
  115. * @memberOf PersonalContainer
  116. * @return {Array} basic info
  117. */
  118. async updateBasicInfo() {
  119. try {
  120. const response = await this.appContainer.apiv3.put('/personal-setting/', {
  121. name: this.state.name,
  122. email: this.state.email,
  123. isEmailPublished: this.state.isEmailPublished,
  124. lang: this.state.lang,
  125. });
  126. const { updatedUser } = response.data;
  127. this.setState({
  128. name: updatedUser.name,
  129. email: updatedUser.email,
  130. isEmailPublished: updatedUser.isEmailPublished,
  131. lang: updatedUser.lang,
  132. });
  133. }
  134. catch (err) {
  135. this.setState({ retrieveError: err });
  136. logger.error(err);
  137. throw new Error('Failed to update personal data');
  138. }
  139. }
  140. /**
  141. * Update profile image
  142. * @memberOf PersonalContainer
  143. */
  144. async updateProfileImage() {
  145. try {
  146. const response = await this.appContainer.apiv3.put('/personal-setting/image-type', {
  147. isGravatarEnabled: this.state.isGravatarEnabled,
  148. });
  149. const { userData } = response.data;
  150. this.setState({
  151. isGravatarEnabled: userData.isGravatarEnabled,
  152. });
  153. }
  154. catch (err) {
  155. this.setState({ retrieveError: err });
  156. logger.error(err);
  157. throw new Error('Failed to update profile image');
  158. }
  159. }
  160. /**
  161. * Upload image
  162. */
  163. async uploadAttachment() {
  164. try {
  165. // TODO GW-1218 api
  166. }
  167. catch (err) {
  168. this.setState({ retrieveError: err });
  169. logger.error(err);
  170. throw new Error('Failed to upload profile image');
  171. }
  172. }
  173. }