import React, { Component, useLayoutEffect, useState, useEffect, FunctionComponent } from 'react'; import { Container, Col, Row, Navbar, Button, ButtonGroup, ToggleButton, Form, InputGroup } from 'react-bootstrap'; import '../App.css'; import ProgressBar from "@ramonak/react-progress-bar"; import Countdown from 'react-countdown'; import AreaChartMini from "../components/areaChart-mini"; import BarChartMini from "../components/barChart-mini"; import BubbleChartMini from "../components/bubbleChart-mini"; import ChoroplethMini from "../components/choropleth-mini"; import HistogramMini from "../components/histogram-mini"; import LineChartMini from "../components/linechart-mini"; import PieChartMini from "../components/pieChart-mini"; import ScatterPlotMini from "../components/scatterplot-mini"; import StackedBarChartMini from "../components/stacked100bar-mini"; import StackedAreaPlotMini from "../components/stackedArea-mini"; import StackedBarChart2Mini from "../components/stackedbar-mini"; import TreeMapMini from "../components/treeMap-mini"; import axios from 'axios'; import img1 from '../components/data/VLAT-Pics/Scatterplot.png' import img2 from '../components/data/VLAT-Pics/StackedBar.png' import img3 from '../components/data/VLAT-Pics/BubbleChart.png' import img4 from '../components/data/VLAT-Pics/TreeMap.png' import img5 from '../components/data/VLAT-Pics/StackedBar100.png' import img6 from '../components/data/VLAT-Pics/Histogram.png' import img7 from '../components/data/VLAT-Pics/StackedArea.png' import img8 from '../components/data/VLAT-Pics/Choropleth.png' import img9 from '../components/data/VLAT-Pics/BarGraph.png' import img10 from '../components/data/VLAT-Pics/AreaChart.png' import img11 from '../components/data/VLAT-Pics/Pie.png' import img12 from '../components/data/VLAT-Pics/LineChart.png' let minivis = [ { 'vis': LineChartMini, 'type': 'Лінійна діаграма', 'question': 'Яким був ціновий діапазон бареля нафти у 2020 році?', 'options': ["$16.55 - $57.52", "$19.52 - $59.00", "$23.43 - $60.72", "$21.82 - $87.52", "Пропустити"], 'correct_answer': 0, 'cimage': img12 }, { 'vis': BarChartMini, 'type': 'Стовпчикова діаграма (Bar Chart)', 'question': 'Який діапазон середньої швидкості інтернету в Азії?', 'options': ["5.50Mbps - 30.60Mbps", "7.00Mbps - 29.40Mbps", "6.40Mbps - 27.38Mbps", "5.50Mbps - 28.60Mbps", "Пропустити"], 'correct_answer': 3, 'cimage': img9 }, { 'vis': StackedBarChart2Mini, 'type': 'Накопичувальна стовпчикова діаграма (Stacked Bar)', 'question': 'Яка ціна арахісу в Лас Веґасі?', 'options': ["$9.0", "$6.1", "$10.3", "$4.3", "Пропустити"], 'correct_answer': 1, 'cimage': img2 }, { 'vis': PieChartMini, 'type': 'Кругова діаграма (Pie Chart)', 'question': 'Яку приблизно частку ринку смартфонів займає Samsung?', 'options': ["20%", "25%", "30%", "15%", "Пропустити"], 'correct_answer': 1, 'cimage': img11 }, { 'vis': HistogramMini, 'type': 'Гістограма (Histogram)', 'question': 'Скільки людей оцінили таксі рейтингом між 4.2 та 4.4?', 'options': ["270", "190", "300", "290", "Пропустити"], 'correct_answer': 1, 'cimage': img6 }, { 'vis': ScatterPlotMini, 'type': 'Точкова діаграма (Scatterplot)', 'question': 'Існує негативна лінійна залежність між ростом і вагою 85 чоловіків.', 'options': ['Вірно', 'Невірно', "Пропустити"], 'correct_answer': 1, 'cimage': img1 }, { 'vis': AreaChartMini, 'type': 'Площинна діаграма (Area Chart)', 'question': 'Якою була середня ціна фунту кавових бобів в вересні 2013?', 'options': ["$5.15", "$6.2", "$4.8", "$4.3", "Пропустити"], 'correct_answer': 0, 'cimage': img10 }, { 'vis': StackedAreaPlotMini, 'type': 'Накопичувальна площинна діаграма (Stacked Area)', 'question': 'Яку кількість дівчаток назвали «Олівія» у 2010 році у Великобританії?', 'options': ["2000", "2500", "1700", "2400", "Пропустити"], 'correct_answer': 2, 'cimage': img7 }, { 'vis': BubbleChartMini, 'type': 'Бульбашкова діаграма (Bubble Chart)', 'question': 'Яка загальна протяжність системи метро в Пекіні?', 'options': ["525 км", "495 км", "305 км", "475 км", "Пропустити"], 'correct_answer': 0, 'cimage': img3 }, { 'vis': ChoroplethMini, 'type': 'Хороплетна мапа (Choropleth)', 'question': 'У 2015 році рівень безробіття у Вашингтоні (WA) був вищим, ніж у Вісконсині (WI).', 'options': ['Вірно', 'Невірно', "Пропустити"], 'correct_answer': 0, 'cimage': img8 }, { 'vis': TreeMapMini, 'type': 'Деревоподібна діаграма (Treemap)', 'question': 'Для якого сайту кількість унікальних відвідувачів була найбільшою в 2010 році?', 'options': ["Amazon", "Chase", "PayPal", "Citibank", "Пропустити"], 'correct_answer': 3, 'cimage': img4 } ]; var record_ques = {} var score_2 = 0 let initTime = 0 let endTime = 0 var num = 12 class VisQuiz extends Component { constructor(props) { super(props); } componentDidMount() { this.setState({ session_id: this.props.location.state.data.session_id, current_visualization_index: 0, score: 0, current_mini_index: 0, list_of_min_vis: this.shuffle(minivis), responses: {}, mini_responses: {}, resize_bool: true, device_info: '', form_incomplete: false, demographic_questions: { 'sex': null, 'age': null, 'education': null, 'familiarity': null }, demographics_incomplete: true, comment: '', width: 0, height: 0, mini_score: 0, ip_address: "", } ) window.addEventListener('resize', this.handleWindowResize.bind(this)) } handleWindowResize(e) { this.setState({ resize_bool: !this.state.resize_bool }) } handleTextChange(e) { this.setState({ comment: e.target.value }) } handleDemographicChange(e) { console.log(this.state) var new_dq = this.state.demographic_questions new_dq[e.target.id] = e.target.value var incomplete = false for (var key in new_dq) { if (new_dq[key] == null) { incomplete = true } } if (e.value == 'oth') { alert('Hello') } this.setState({ demographic_questions: new_dq, demographics_incomplete: incomplete }) } getData = async () => { //https://medium.com/how-to-react/how-to-get-user-ip-address-in-react-js-73eb295720d0 const res = await axios.get('https://geolocation-db.com/json/') console.log("IP Address: ", res.data); this.setState({ ip_address: res.data.IPv4 }) } clicked_mini_answer(type, question, response, truth, time) { this.getData() if (response === minivis[this.state.current_mini_index]['options'][truth]) { this.state.mini_score = this.state.mini_score + 1 } this.setState({ current_mini_index: this.state.current_mini_index + 1, }) endTime = Math.abs((Date.now() - initTime) / 1000) this.state.mini_responses[question] = { response: response, truth: truth, time: endTime } this.setState({ device_info: navigator.userAgent }) score_2 = this.state.mini_score if (response === minivis[this.state.current_mini_index]['options'][truth]) { record_ques[type] = '✅ Вірно' } else if (response === 'Skip') { record_ques[type] = '⏩ Пропущено' } else { record_ques[type] = '❌ Невірно' } console.log("The dictionary is: ", record_ques) } shuffle(array) { //https://bost.ocks.org/mike/shuffle/ var m = array.length, t, i; // While there remain elements to shuffle… while (m) { // Pick a remaining element… i = Math.floor(Math.random() * m--); // And swap it with the current element. t = array[m]; array[m] = array[i]; array[i] = t; } return array; } on_survey_click() { fetch(`${process.env.REACT_APP_API_URL}//record_responses_to_db`, { headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, method: 'POST', body: JSON.stringify({ session_id: this.state.session_id, responses: this.state.responses, mini_responses: this.state.mini_responses, score: this.state.score, mini_score: this.state.mini_score, device: this.state.device_info, demographic_responses: this.state.demographic_questions, comment: this.state.comment, height: window.innerHeight, width: window.innerWidth, ipaddress: this.state.ip_address }) }) .then(res => res.json()).then(data => { //var message = 'Warning!\n\nNavigating away from this page will delete your text if you haven\'t already saved it.'; //e.returnValue = message; //return message; }) var pageType = { pathname: '/thank_you', state: { data: { 'session_id': this.state.session_id, } } } this.props.history.push(pageType) } timeout() { alert('Чакс вийшов! Натисніть "ОК" щоб перейти до наступного запитання.') this.setState({ current_visualization_index: this.state.current_visualization_index + 1, }) } getRandom() { return Math.random(); } minitimeout() { alert('Чакс вийшов! Натисніть "ОК" щоб перейти до наступного запитання.') this.setState({ current_mini_index: this.state.current_mini_index + 1, }) } render() { const hoursMinSecs = { hours: 0, minutes: 0, seconds: 10 } initTime = Date.now() console.log("Starting Time is : " + initTime) console.log('render') if (this.props.location.state == undefined) { window.location.href = "/"; return (
Невизначена сесія. Будь ласка поверніться на сторінку згоди
) } let ages = [] for (var i = 18; i < 100; i++) { ages.push(i) } if (this.state == null) { return (Loading...
) } if (this.state.current_mini_index < this.state.list_of_min_vis.length) { const options = minivis[this.state.current_mini_index]['options'].map((item, i) => ) let VisComp = minivis[this.state.current_mini_index]['vis'] //console.log(VisComp) return ({minivis[this.state.current_mini_index]['question']}