| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- import { Container } from 'unstated';
- import loggerFactory from '@alias/logger';
- // eslint-disable-next-line no-unused-vars
- const logger = loggerFactory('growi:services:PersonalContainer');
- const DEFAULT_IMAGE = '/images/icons/user.svg';
- /**
- * Service container for personal settings page (PersonalSettings.jsx)
- * @extends {Container} unstated Container
- */
- export default class PersonalContainer extends Container {
- constructor(appContainer) {
- super();
- this.appContainer = appContainer;
- this.state = {
- retrieveError: null,
- name: '',
- email: '',
- registrationWhiteList: this.appContainer.getConfig().registrationWhiteList,
- isEmailPublished: false,
- lang: 'en-US',
- isGravatarEnabled: false,
- isUploadedPicture: false,
- uploadedPictureSrc: this.getUploadedPictureSrc(this.appContainer.currentUser),
- externalAccounts: [],
- isPasswordSet: false,
- apiToken: '',
- };
- }
- /**
- * Workaround for the mangling in production build to break constructor.name
- */
- static getClassName() {
- return 'PersonalContainer';
- }
- /**
- * retrieve personal data
- */
- async retrievePersonalData() {
- try {
- const response = await this.appContainer.apiv3.get('/personal-setting/');
- const { currentUser } = response.data;
- this.setState({
- name: currentUser.name,
- email: currentUser.email,
- isEmailPublished: currentUser.isEmailPublished,
- lang: currentUser.lang,
- isGravatarEnabled: currentUser.isGravatarEnabled,
- isPasswordSet: (currentUser.password != null),
- apiToken: currentUser.apiToken,
- });
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to fetch personal data');
- }
- }
- /**
- * define a function for uploaded picture
- */
- getUploadedPictureSrc(user) {
- if (user == null) {
- return DEFAULT_IMAGE;
- }
- if (user.image) {
- this.setState({ isUploadedPicture: true });
- return user.image;
- }
- if (user.imageAttachment != null) {
- this.setState({ isUploadedPicture: true });
- return user.imageAttachment.filePathProxied;
- }
- return DEFAULT_IMAGE;
- }
- /**
- * retrieve external accounts that linked me
- */
- async retrieveExternalAccounts() {
- try {
- const response = await this.appContainer.apiv3.get('/personal-setting/external-accounts');
- const { externalAccounts } = response.data;
- this.setState({ externalAccounts });
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to fetch external accounts');
- }
- }
- /**
- * Change name
- */
- changeName(inputValue) {
- this.setState({ name: inputValue });
- }
- /**
- * Change email
- */
- changeEmail(inputValue) {
- this.setState({ email: inputValue });
- }
- /**
- * Change isEmailPublished
- */
- changeIsEmailPublished(boolean) {
- this.setState({ isEmailPublished: boolean });
- }
- /**
- * Change lang
- */
- changeLang(lang) {
- this.setState({ lang });
- }
- /**
- * Change isGravatarEnabled
- */
- changeIsGravatarEnabled(boolean) {
- this.setState({ isGravatarEnabled: boolean });
- }
- /**
- * Update basic info
- * @memberOf PersonalContainer
- * @return {Array} basic info
- */
- async updateBasicInfo() {
- try {
- const response = await this.appContainer.apiv3.put('/personal-setting/', {
- name: this.state.name,
- email: this.state.email,
- isEmailPublished: this.state.isEmailPublished,
- lang: this.state.lang,
- });
- const { updatedUser } = response.data;
- this.setState({
- name: updatedUser.name,
- email: updatedUser.email,
- isEmailPublished: updatedUser.isEmailPublished,
- lang: updatedUser.lang,
- });
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to update personal data');
- }
- }
- /**
- * Update profile image
- * @memberOf PersonalContainer
- */
- async updateProfileImage() {
- try {
- const response = await this.appContainer.apiv3.put('/personal-setting/image-type', {
- isGravatarEnabled: this.state.isGravatarEnabled,
- });
- const { userData } = response.data;
- this.setState({
- isGravatarEnabled: userData.isGravatarEnabled,
- });
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to update profile image');
- }
- }
- /**
- * Upload image
- */
- async uploadAttachment(file) {
- try {
- const formData = new FormData();
- formData.append('file', file);
- formData.append('_csrf', this.appContainer.csrfToken);
- const response = await this.appContainer.apiPost('/attachments.uploadProfileImage', formData);
- this.setState({ isUploadedPicture: true, uploadedPictureSrc: response.attachment.filePathProxied });
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to upload profile image');
- }
- }
- /**
- * Delete image
- */
- async deleteProfileImage() {
- try {
- await this.appContainer.apiPost('/attachments.removeProfileImage', { _csrf: this.appContainer.csrfToken });
- this.setState({ isUploadedPicture: false, uploadedPictureSrc: DEFAULT_IMAGE });
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to delete profile image');
- }
- }
- /**
- * Associate LDAP account
- */
- async associateLdapAccount(account) {
- try {
- await this.appContainer.apiv3.put('/personal-setting/associate-ldap', account);
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to associate ldap account');
- }
- }
- /**
- * Disassociate LDAP account
- */
- async disassociateLdapAccount(account) {
- try {
- await this.appContainer.apiv3.put('/personal-setting/disassociate-ldap', account);
- }
- catch (err) {
- this.setState({ retrieveError: err });
- logger.error(err);
- throw new Error('Failed to disassociate ldap account');
- }
- }
- }
|