ProfileImageSettings.jsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import md5 from 'md5';
  5. import { toastSuccess, toastError } from '../../util/apiNotification';
  6. import { createSubscribedElement } from '../UnstatedUtils';
  7. import AppContainer from '../../services/AppContainer';
  8. import PersonalContainer from '../../services/PersonalContainer';
  9. class ProfileImageSettings extends React.Component {
  10. constructor(appContainer) {
  11. super();
  12. this.onClickSubmit = this.onClickSubmit.bind(this);
  13. }
  14. async onClickSubmit() {
  15. const { t, personalContainer } = this.props;
  16. try {
  17. await personalContainer.updateProfileImage();
  18. toastSuccess(t('toaster.update_successed', { target: t('Set Profile Image') }));
  19. }
  20. catch (err) {
  21. toastError(err);
  22. }
  23. }
  24. generateGravatarSrc() {
  25. const email = this.props.personalContainer.state.email || '';
  26. const hash = md5(email.trim().toLowerCase());
  27. return `https://gravatar.com/avatar/${hash}`;
  28. }
  29. render() {
  30. const { t, personalContainer } = this.props;
  31. return (
  32. <React.Fragment>
  33. <div className="row">
  34. <div className="col-md-2 col-sm-offset-1 col-sm-4">
  35. <h4>
  36. <div className="radio radio-primary">
  37. <input
  38. type="radio"
  39. id="radioGravatar"
  40. form="formImageType"
  41. name="imagetypeForm[isGravatarEnabled]"
  42. checked={personalContainer.state.isGravatarEnabled}
  43. onChange={() => { personalContainer.changeIsGravatarEnabled(true) }}
  44. />
  45. <label htmlFor="radioGravatar">
  46. <img src="https://gravatar.com/avatar/00000000000000000000000000000000?s=24" /> Gravatar
  47. </label>
  48. <a href="https://gravatar.com/">
  49. <small><i className="icon-arrow-right-circle" aria-hidden="true"></i></small>
  50. </a>
  51. </div>
  52. </h4>
  53. <img src={this.generateGravatarSrc()} width="64" />
  54. </div>
  55. <div className="col-md-4 col-sm-7">
  56. <h4>
  57. <div className="radio radio-primary">
  58. <input
  59. type="radio"
  60. id="radioUploadPicture"
  61. form="formImageType"
  62. name="imagetypeForm[isGravatarEnabled]"
  63. checked={!personalContainer.state.isGravatarEnabled}
  64. onChange={() => { personalContainer.changeIsGravatarEnabled(false) }}
  65. />
  66. <label htmlFor="radioUploadPicture">
  67. { t('Upload Image') }
  68. </label>
  69. </div>
  70. </h4>
  71. <div className="form-group">
  72. <div id="pictureUploadFormMessage"></div>
  73. <label className="col-sm-4 control-label">
  74. { t('Current Image') }
  75. </label>
  76. {/* TDOO GW-1198 uproad profile image */}
  77. </div>
  78. </div>
  79. </div>
  80. <div className="row my-3">
  81. <div className="col-xs-offset-4 col-xs-5">
  82. <button type="button" className="btn btn-primary" onClick={this.onClickSubmit} disabled={personalContainer.state.retrieveError != null}>
  83. {t('Update')}
  84. </button>
  85. </div>
  86. </div>
  87. </React.Fragment>
  88. );
  89. }
  90. }
  91. const ProfileImageSettingsWrapper = (props) => {
  92. return createSubscribedElement(ProfileImageSettings, props, [AppContainer, PersonalContainer]);
  93. };
  94. ProfileImageSettings.propTypes = {
  95. t: PropTypes.func.isRequired, // i18next
  96. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  97. personalContainer: PropTypes.instanceOf(PersonalContainer).isRequired,
  98. };
  99. export default withTranslation()(ProfileImageSettingsWrapper);