StaffCredit.jsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import loggerFactory from '@alias/logger';
  4. import {
  5. Modal, ModalBody,
  6. } from 'reactstrap';
  7. import contributors from './Contributor';
  8. /**
  9. * Page staff credit component
  10. *
  11. * @export
  12. * @class StaffCredit
  13. * @extends {React.Component}
  14. */
  15. // eslint-disable-next-line no-unused-vars
  16. const logger = loggerFactory('growi:cli:StaffCredit');
  17. export default class StaffCredit extends React.Component {
  18. constructor(props) {
  19. super(props);
  20. this.state = {
  21. isShown: true,
  22. };
  23. this.deleteCredit = this.deleteCredit.bind(this);
  24. }
  25. // to delete the staffCredit and to inform that to Hotkeys.jsx
  26. deleteCredit() {
  27. if (this.state.isShown) {
  28. this.setState({ isShown: false });
  29. }
  30. }
  31. renderMembers(memberGroup, keyPrefix) {
  32. // construct members elements
  33. const members = memberGroup.members.map((member) => {
  34. return (
  35. <div className={memberGroup.additionalClass} key={`${keyPrefix}-${member.name}-container`}>
  36. <span className="dev-position" key={`${keyPrefix}-${member.name}-position`}>
  37. {/* position or '&nbsp;' */}
  38. { member.position || '\u00A0' }
  39. </span>
  40. <p className="dev-name" key={`${keyPrefix}-${member.name}`}>{member.name}</p>
  41. </div>
  42. );
  43. });
  44. return (
  45. <React.Fragment key={`${keyPrefix}-fragment`}>
  46. {members}
  47. </React.Fragment>
  48. );
  49. }
  50. renderContributors() {
  51. if (this.state.isShown) {
  52. const credit = contributors.map((contributor) => {
  53. // construct members elements
  54. const memberGroups = contributor.memberGroups.map((memberGroup, idx) => {
  55. return this.renderMembers(memberGroup, `${contributor.sectionName}-group${idx}`);
  56. });
  57. return (
  58. <React.Fragment key={`${contributor.sectionName}-fragment`}>
  59. <div className={`row ${contributor.additionalClass}`} key={`${contributor.sectionName}-row`}>
  60. <h2 className="col-md-12 dev-team staff-credit-mt-10rem staff-credit-mb-6rem" key={contributor.sectionName}>{contributor.sectionName}</h2>
  61. {memberGroups}
  62. </div>
  63. <div className="clearfix"></div>
  64. </React.Fragment>
  65. );
  66. });
  67. return (
  68. <div className="text-center staff-credit-content" onClick={this.deleteCredit}>
  69. <h1 className="staff-credit-mb-6rem">GROWI Contributors</h1>
  70. <div className="clearfix"></div>
  71. {credit}
  72. </div>
  73. );
  74. }
  75. return null;
  76. }
  77. componentDidMount() {
  78. setTimeout(() => {
  79. // px / sec
  80. const scrollSpeed = 200;
  81. const target = $('.credit-curtain');
  82. const scrollTargetHeight = target.children().innerHeight();
  83. const duration = scrollTargetHeight / scrollSpeed * 1000;
  84. target.animate({ scrollTop: scrollTargetHeight }, duration, 'linear');
  85. target.slimScroll({
  86. height: target.innerHeight(),
  87. // Able to scroll after automatic schooling is complete so set "bottom" to allow scrolling from the bottom.
  88. start: 'bottom',
  89. color: '#FFFFFF',
  90. });
  91. }, 10);
  92. }
  93. render() {
  94. const { onClosed } = this.props;
  95. return (
  96. <Modal
  97. isOpen={this.state.isShown}
  98. onClosed={() => {
  99. if (onClosed != null) {
  100. onClosed();
  101. }
  102. }}
  103. toggle={this.deleteCredit}
  104. scrollable
  105. className="staff-credit"
  106. >
  107. <ModalBody className="credit-curtain">
  108. {this.renderContributors()}
  109. </ModalBody>
  110. </Modal>
  111. );
  112. }
  113. }
  114. StaffCredit.propTypes = {
  115. onClosed: PropTypes.func,
  116. };