StaffCredit.jsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import React from 'react';
  2. import { GlobalHotKeys } from 'react-hotkeys';
  3. import loggerFactory from '@alias/logger';
  4. import {
  5. Modal, ModalBody,
  6. } from 'reactstrap';
  7. import contributors from './Contributor';
  8. // Unit is px / milli sec
  9. const scrollSpeed = 0.3;
  10. /**
  11. * Page staff credit component
  12. *
  13. * @export
  14. * @class StaffCredit
  15. * @extends {React.Component}
  16. */
  17. export default class StaffCredit extends React.Component {
  18. constructor(props) {
  19. super(props);
  20. this.logger = loggerFactory('growi:StaffCredit');
  21. this.state = {
  22. isShown: false,
  23. userCommand: [],
  24. };
  25. this.konamiCommand = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a'];
  26. this.deleteCredit = this.deleteCredit.bind(this);
  27. }
  28. check(event) {
  29. this.logger.debug(`'${event.key}' pressed`);
  30. // compare keydown and next konamiCommand
  31. if (this.konamiCommand[this.state.userCommand.length] === event.key) {
  32. const nextValue = this.state.userCommand.concat(event.key);
  33. if (nextValue.length === this.konamiCommand.length) {
  34. this.setState({
  35. isShown: true,
  36. userCommand: [],
  37. });
  38. const target = $('.credit-curtain');
  39. const scrollTargetHeight = target.children().innerHeight();
  40. const duration = scrollTargetHeight / scrollSpeed;
  41. target.animate({ scrollTop: scrollTargetHeight }, duration, 'linear');
  42. }
  43. else {
  44. // add UserCommand
  45. this.setState({ userCommand: nextValue });
  46. this.logger.debug('userCommand', this.state.userCommand);
  47. }
  48. }
  49. else {
  50. this.setState({ userCommand: [] });
  51. }
  52. }
  53. deleteCredit() {
  54. if (this.state.isShown) {
  55. this.setState({ isShown: false });
  56. }
  57. }
  58. renderMembers(memberGroup, keyPrefix) {
  59. // construct members elements
  60. const members = memberGroup.members.map((member) => {
  61. return (
  62. <div className={memberGroup.additionalClass} key={`${keyPrefix}-${member.name}-container`}>
  63. <span className="dev-position" key={`${keyPrefix}-${member.name}-position`}>
  64. {/* position or '&nbsp;' */}
  65. { member.position || '\u00A0' }
  66. </span>
  67. <p className="dev-name" key={`${keyPrefix}-${member.name}`}>{member.name}</p>
  68. </div>
  69. );
  70. });
  71. return (
  72. <React.Fragment key={`${keyPrefix}-fragment`}>
  73. {members}
  74. </React.Fragment>
  75. );
  76. }
  77. renderContributors() {
  78. if (this.state.isShown) {
  79. const credit = contributors.map((contributor) => {
  80. // construct members elements
  81. const memberGroups = contributor.memberGroups.map((memberGroup, idx) => {
  82. return this.renderMembers(memberGroup, `${contributor.sectionName}-group${idx}`);
  83. });
  84. return (
  85. <React.Fragment key={`${contributor.sectionName}-fragment`}>
  86. <div className={`row staff-credit-my-10 ${contributor.additionalClass}`} key={`${contributor.sectionName}-row`}>
  87. <h2 className="col-md-12 dev-team mt-5 staff-credit-mb-10" key={contributor.sectionName}>{contributor.sectionName}</h2>
  88. {memberGroups}
  89. </div>
  90. <div className="clearfix"></div>
  91. </React.Fragment>
  92. );
  93. });
  94. return (
  95. <div className="text-center" onClick={this.deleteCredit}>
  96. <h1 className="staff-credit-mb-10">GROWI Contributors</h1>
  97. <div className="clearfix"></div>
  98. {credit}
  99. </div>
  100. );
  101. }
  102. return null;
  103. }
  104. render() {
  105. const keyMap = { check: ['up', 'down', 'right', 'left', 'b', 'a'] };
  106. const handlers = { check: (event) => { return this.check(event) } };
  107. return (
  108. <GlobalHotKeys keyMap={keyMap} handlers={handlers}>
  109. <Modal isOpen={this.state.isShown} toggle={this.deleteCredit} scrollable className="staff-credit">
  110. <ModalBody className="credit-curtain">
  111. {this.renderContributors()}
  112. </ModalBody>
  113. </Modal>
  114. </GlobalHotKeys>
  115. );
  116. }
  117. }
  118. StaffCredit.propTypes = {
  119. };