import { h, render, Component } from 'preact'; // eslint-disable-line no-unused-vars
// Content
import content from '../content/module.json';
import questions from '../content/questions.json';
import data from '../content/offline';
// Configuration
import config from '../config';
// Services
import api from '../utilities/api';
// Views
import TitleScreen from './TitleScreen.jsx';
import FinalScreen from './FinalScreen.jsx';
import ChartScreen from './ChartScreen.jsx';
/**
* titlescreen -> chartscreen (*n) -> finalscreen
*/
export default class App extends Component {
// Initialize functions
constructor (props) {
super(props);
this.state = {
route: 'titlescreen', // Current screen
currentQuestion: 0, // Current question
currentStep: 0, // Current graph task
chartMode: 'interaction', // Mode for graph 'interaction', 'presentation' or 'comparison'
questions: [], // Wrapper for all questions
data: [], // Global data wrapper
interactionData: [], // Wrapper for interaction data
comparisonData: [], // Wrapper for comparison data
isFetching: false, // Currently performing XHR?
userId: null, // Current user id for posting
token: null // Current access token
};
// Context binding
this.navigate = this.navigate.bind(this);
this.toNextStep = this.toNextStep.bind(this);
this.setup = this.setup.bind(this);
this.setData = this.setData.bind(this);
}
// Initial setup, get accesToken and userId
setup () {
this.setState({ questions });
if (this.props.isOffline) {
this.setState({ data });
} else {
this.setState({ isFetching: true });
api.getToken().then(accessToken => {
this.setState({ token: accessToken });
// Create user
api.createUser(accessToken)
.then(user => {
this.setState({
userId: user.userId,
isFetching: false
});
// Draw first question
this.drawQuestions();
});
});
}
}
// Navigate to specific route
navigate (route) {
if (route !== 'titlescreen') {
this.setState({ route });
} else {
location.reload();
}
}
// Set data
setData (newData) {
this.setState({ interactionData: newData });
}
// Get number of questions
getNumberQuestions () {
let sum = 0;
for (let i = 0; i < this.state.questions.length; i += 1) {
sum += this.state.questions[i].length;
}
return sum;
}
// Get question set from api
drawQuestions () {
let newData = [ ...this.state.data ];
api.get(config.api.lists.a)
.then(json => {
newData[0] = json;
// })
// .then(() => api.get(config.api.lists.b))
// .then(json => {
// newData[1] = json;
this.setState({ data: newData });
})
.catch(error => {
console.error(error); // eslint-disable-line
});
}
// Update state depending on chart mode and current question
toNextStep () {
const nextQuestion = this.state.currentQuestion < this.state.questions.length - 1;
const nextStep = this.state.currentStep < this.state.questions[this.state.currentQuestion].texts.length - 1;
if (this.state.chartMode === 'interaction') { // If in interaction mode, go to presentation mode
if (!this.props.isOffline) {
api.post(
this.state.currentQuestion === 0 ? config.api.creates.a : config.api.creates.b,
{
userId: this.state.userId,
kontext: this.state.questions[this.state.currentQuestion].yKeys[this.state.currentStep],
punkte: this.state.interactionData
},
this.state.token
)
.then(() => {
this.setState({ chartMode: 'presentation' });
});
} else {
this.setState({ chartMode: 'presentation' });
}
} else if (this.state.chartMode === 'presentation' && !this.props.isOffline) { // If 'online' and in presentation mode, go to comparison mode
api.get(
this.state.currentQuestion === 0 ? config.api.proportions.a : config.api.proportions.b,
{ kontext: this.state.questions[this.state.currentQuestion].yKeys[this.state.currentStep] })
.then(json => {
this.setState({ chartMode: 'comparison', comparisonData: json });
});
} else if (nextStep) {
this.setState({
chartMode: 'interaction',
currentStep: this.state.currentStep + 1,
interactionData: [],
comparisonData: []
});
} else if (nextQuestion) {
this.setState({
chartMode: 'interaction',
currentQuestion: this.state.currentQuestion + 1,
currentStep: 0,
interactionData: [],
comparisonData: []
});
} else {
// Go to finalscreen
this.setState({ route: 'finalscreen' });
}
}
// LIFECYCLE
componentDidMount () {
this.setup();
}
// RENDER
render () {
let outputContent;
switch (this.state.route) {
case 'question':
outputContent = ;
break;
case 'finalscreen':
outputContent = ;
break;
case 'titlescreen':
default:
outputContent = ;
break;
}
return outputContent;
}
}