TestComponent.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import React, { Component } from 'react';
  2. import { Router, Route, Link, NavLink} from 'react-router-dom';
  3. import createHistory from 'history/createBrowserHistory';
  4. import { connect } from 'react-redux';
  5. import TestComponentItem from './TestComponentItem';
  6. import FontAwesome from 'react-fontawesome';
  7. class TestComponent extends Component {
  8. constructor(props){
  9. super(props);
  10. this.state = {
  11. readMore: false,
  12. showReadMoreControls: false,
  13. showResults: false,
  14. answerArray: [],
  15. selectedArray: [],
  16. answerNumber: '',
  17. questionNumber: 0,
  18. zIndex: 1,
  19. zIndex2: 0,
  20. questionNumber2: 0,
  21. testObject: this.props.tests[+this.props.match.params.id]
  22. }
  23. }
  24. render(){
  25. if(this.state.readMore){
  26. var isReadMore = (
  27. <div className="read-more-text">
  28. {this.state.testObject.readMore}
  29. <div><FontAwesome name="angle-up" onClick={()=>{this.readMoreUp()}}/></div>
  30. </div>);
  31. }else{
  32. var isReadMore = (
  33. <div>
  34. <span>Read more about {this.state.testObject.keyword}</span>
  35. <FontAwesome name="angle-down" onClick={()=>{this.readMoreDown()}}/>
  36. </div>
  37. );
  38. }
  39. window.TestComponentState = this.state;
  40. if(this.state.showResults){
  41. return(
  42. <div className="results-block">
  43. <div className="result-text">
  44. Your score as a percentage for <span>{this.state.testObject.keyword}</span>:
  45. </div>
  46. <div className="result-number">
  47. {this.state.answerNumber}%
  48. <FontAwesome name="circle-thin" />
  49. </div>
  50. <div className="result-slider">
  51. <div className="result-slider-line" style={{width: `${this.state.answerNumber}%`}}></div>
  52. </div>
  53. <div ref="readMore" className="read-more" style={ this.state.showReadMoreControls ? {maxHeight: '90px', opacity: '1'} : {}}>
  54. {isReadMore}
  55. </div>
  56. </div>
  57. )
  58. }
  59. else{
  60. return(
  61. <div className="test-component">
  62. <TestComponentItem showResults={this.showResults} questionsLength={this.state.testObject.questions.length} answerArray={this.state.selectedArray} answer={this.answer} nextQuestion={this.nextQuestion} questionNumber={this.state.questionNumber2} zIndex={this.state.zIndex2} changeZIndex={this.changeZIndex} info={this.state.testObject.questions[this.state.questionNumber2]} />
  63. <TestComponentItem showResults={this.showResults} questionsLength={this.state.testObject.questions.length} answerArray={this.state.selectedArray} answer={this.answer} nextQuestion2={this.nextQuestion2} questionNumber={this.state.questionNumber} zIndex={this.state.zIndex} changeZIndex={this.changeZIndex} info={this.state.testObject.questions[this.state.questionNumber]} />
  64. </div>
  65. )
  66. }
  67. }
  68. //custom functions
  69. showResults = (canIClick) => {
  70. if(canIClick){
  71. this.setState({showResults: true});
  72. this.resultScore();
  73. }
  74. }
  75. nextQuestion = () => {
  76. this.setState((prevState)=>({questionNumber: prevState.questionNumber + 2}))
  77. }
  78. nextQuestion2 = () => {
  79. if(this.state.questionNumber == 0){
  80. this.setState((prevState)=>({questionNumber2: ++prevState.questionNumber2}))
  81. }
  82. else{
  83. this.setState((prevState)=>({questionNumber2: prevState.questionNumber2 + 2}))
  84. }
  85. }
  86. changeZIndex = () => {
  87. if(this.state.zIndex == 1){
  88. this.setState({zIndex: 0,zIndex2: 1});
  89. }
  90. else{
  91. this.setState({zIndex: 1,zIndex2: 0})
  92. }
  93. }
  94. answer = (questionNumber,res,i) => {
  95. // e.target.previousSibling.className = 'answer-circle answer-circle-active';
  96. var arr = this.state.answerArray;
  97. var arr2 = this.state.selectedArray;
  98. arr[questionNumber] = res;
  99. arr2[questionNumber] = i;
  100. this.setState({answerArray: arr});
  101. }
  102. resultScore = (i = 0) => {
  103. var totalScore = this.state.answerArray.reduce((item1,item2)=>{
  104. return item1 + item2;
  105. })
  106. var percentage = Math.floor(totalScore / (this.state.testObject.questions.length * 4) * 100); // works if only i have 5 questions in each test
  107. this.setState({answerNumber: i});
  108. if(i < percentage){
  109. setTimeout(()=>{
  110. this.resultScore(++i);
  111. },50)
  112. } else{
  113. setTimeout(()=>{
  114. this.setState({showReadMoreControls: true});
  115. },500)
  116. }
  117. }
  118. readMoreDown = () => {
  119. this.refs.readMore.style.opacity = '0';
  120. setTimeout(()=>{
  121. this.refs.readMore.style.transition = 'opacity 1s, max-height 4s ease'
  122. this.refs.readMore.style.maxHeight = '800px';
  123. this.setState({readMore: true});
  124. this.refs.readMore.style.opacity = '1';
  125. },1000)
  126. if(document.documentElement.scrollTop || document.body.scrollTop == 0){
  127. setTimeout(()=>{
  128. this.scrollDown(document.documentElement.scrollTop || document.body.scrollTop)
  129. },1300)
  130. }
  131. }
  132. readMoreUp = (i) => {
  133. this.refs.readMore.style.maxHeight = '90px';
  134. this.refs.readMore.style.opacity = '0';
  135. setTimeout(()=>{
  136. if(this.refs.readMore){
  137. this.setState({readMore: false});
  138. this.refs.readMore.style.opacity = '1';
  139. }
  140. },4000)
  141. // if(i == document.documentElement.scrollTop || document.body.scrollTop){
  142. // this.setState({readMore: false});
  143. // }
  144. // window.scrollTo(0, i);
  145. // if(i < document.body.scrollHeight){
  146. // setTimeout(()=>{
  147. // this.readMoreDown(i - 3);
  148. // },3)
  149. // }
  150. }
  151. scrollDown = (i) => {
  152. window.scrollTo(0, i);
  153. if(i < document.body.scrollHeight){
  154. setTimeout(()=>{
  155. this.scrollDown(i + 3);
  156. },1)
  157. }
  158. }
  159. }
  160. const mapStateToProps = (state) => {
  161. return {
  162. tests: state,
  163. }
  164. }
  165. export default connect(mapStateToProps)(TestComponent);
  166. // if(i < document.body.scrollHeight){
  167. // if(i / document.body.scrollHeight > 0.2){
  168. // setTimeout(()=>{
  169. // this.readMore(i + 1);
  170. // console.log(`from decelerate ${2 * (1 + 4 * (i / document.body.scrollHeight)*(i / document.body.scrollHeight))}`)
  171. // },2 * (1 + 4 * (i / document.body.scrollHeight)*(i / document.body.scrollHeight)))
  172. // } else{
  173. // setTimeout(()=>{
  174. // this.readMore(i + 1);
  175. // console.log(`from accelerate ${5 - (1 + 4 * (i / document.body.scrollHeight)*(i / document.body.scrollHeight))}`)
  176. // },5 - (1 + 4 * (i / document.body.scrollHeight)*(i / document.body.scrollHeight)))
  177. // }
  178. // }