Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

charts are blank while combaining amcharts v3 and reactjs #74

Open
SaraNaifar opened this issue Apr 16, 2018 · 1 comment
Open

charts are blank while combaining amcharts v3 and reactjs #74

SaraNaifar opened this issue Apr 16, 2018 · 1 comment

Comments

@SaraNaifar
Copy link

SaraNaifar commented Apr 16, 2018

I am trying to make an API request (GET) then the received data should be appended on the graph as a statistatics , this is my code when i run it i got nothing on the graph.

import React, {Component} from 'react';
import AmCharts from "@amcharts/amcharts3-react";
import {Bar, Doughnut, Line, Pie, Polar, Radar} from 'react-chartjs-2';
import {CardColumns, Card, CardHeader, CardBody,Row, Col, Button, Modal, ModalHeader, ModalBody, ModalFooter} from 'reactstrap';
import axios from 'axios';
import Modals from '../Notifications/Modals/Modals.js';
import RangedDatePicker from '../DatePicker/RangedDatePicker.js';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import ButtonDropdowns from '../Buttons/ButtonDropdowns/ButtonDropdowns.js';



let loginPath = 'http://127.0.0.1:8000/api/reactions/daily';

let config = { 
  headers: {   
    'Access-Control-Allow-Origin': '*',
    'Authorization': 'Bearer '+localStorage.getItem('token') 
  },
  mode: 'no-cors'
};




class Charts extends Component {

 constructor(props) {

    super(props);

    const minDate = new Date();
    const maxDate = new Date();
    minDate.setFullYear(minDate.getFullYear() - 1);
    minDate.setHours(0, 0, 0, 0);
    maxDate.setFullYear(maxDate.getFullYear() + 1);
    maxDate.setHours(0, 0, 0, 0);

    this.state = {
    dataProvider: [],
    timer: null,
    minDate: minDate,
    maxDate: maxDate,
    autoOk: false,
  };



    this.handleChangeMinDate = this.handleChangeMinDate.bind(this);
    this.handleChangeMaxDate= this.handleChangeMaxDate.bind(this)
    this.getTimeRangeFromCalendar = this.getTimeRangeFromCalendar.bind(this);
    this.generateData=this.generateData.bind(this)
}

 generateData() {
   var successDataCount=[];
    axios.get('http://127.0.0.1:8000/api/reactions/daily?from=2017-01-01 &to=2018-06-04 ', config)
        .then((response )=> {
             
              for(let i=0 ; i<response.data[0].reactions.length;i++)
              { 
                var year =response.data[0].reactions[i].year;
                var month =response.data[0].reactions[i].month;
                var day =response.data[0].reactions[i].day;
                var dateOfReaction = new Date(year,month,day);
                var count = response.data[0].reactions[i].count;

                successDataCount.push({date:dateOfReaction ,count:count });
              }
              
               
               if (successDataCount){
               
               
                this.setState({dataProvider: successDataCount},function(){console.log('++++')});

                  for (var i = 0; i < 100; ++i) {
                    var firstDate = new Date();
                    var date = new Date(firstDate.getTime());
                    date.setDate(i);
                     //console.log(this.state.dataProvider)
                    this.state.dataProvider.push({
                      date: this.state.dataProvider.date,
                      value: this.state.dataProvider.count
                    });
                    }
                   
                  }
             
  })

  .catch((error) => console.log(error))
}

componentDidMount() {
      // Update the chart dataProvider every 3 seconds
     
        this.setState({
          dataProvider: this.generateData()
        });
          this.generateData();
}

componentWillUnmount() {
  clearInterval(this.state.timer);
}





//Getting StartDate and EndDate from calendar to update charts
getTimeRangeFromCalendar(range){

  let from = JSON.stringify(range.startDate._d);
  let to = JSON.stringify(range.endDate._d);

  
  console.log('*************************CHOISEN STATISTICS*************************')
  let config = { 
    headers: {   
      'Access-Control-Allow-Origin': '*',
      'Authorization': 'Bearer '+localStorage.getItem('token') 
    },
    mode: 'no-cors',
    params :{
      from: from,
      to: to
    }

  };

  console.log(config.params)  
  console.log(config.params.to) 
  
  axios.get('http://127.0.0.1:8000/api/reactions/daily', { 
    headers: {   
      'Access-Control-Allow-Origin': '*',
      'Authorization': 'Bearer '+localStorage.getItem('token') 
    },
    mode: 'no-cors',
    params :{
      from: from,
      to: to
    }

  } )
  .then((response )=> console.log(response.data))
  .catch((error) => console.log(error))


}
  handleChangeMinDate(event, date) {
    this.setState({
      minDate: date,
    } , function(){console.log(this.state.minDate)});
  };

  handleChangeMaxDate(event, date) {
    this.setState({
      maxDate: date,
    });
  };

render() {
 const config = {
...
  }],
  "balloon": {
    "borderThickness": 1,
    "shadowAlpha": 0
  },
  "graphs": [{
  ...
  }],
  "chartScrollbar": {
 ...
  },
  "chartCursor": {
  ...
  },
  "valueScrollbar":{
  ...
  },
  "dataProvider": this.state.dataProvider
};
return (

  <div className="animated fadeIn">
  <CardColumns className="cols-2 column-count-1">
  <Row>
  <Col>
  <Card>
  <CardHeader>
  <i className="fa fa-align-justify"></i> Choosing parameters
  </CardHeader>
  <CardBody>


  <MuiThemeProvider>
  <RangedDatePicker  sendMinDate={this.handleChangeMinDate} sendMaxDate= {this.handleChangeMaxDate}/>
  </MuiThemeProvider>
  <ButtonDropdowns/>



  </CardBody>
  </Card>
  </Col>
  </Row>



  <Card>
  <CardHeader>
  Statistics
  <div className="card-actions">
  <a href="http://www.chartjs.org">
  <small className="text-muted">docs</small>
  </a>
  </div>
  </CardHeader>
  <CardBody>

  <div className="App">

  <AmCharts.React style={{ width: "100%", height: "500px" }} options={config} />
  </div>
  </CardBody>
  </Card>


  </CardColumns>
  </div>

  )
}
}

export default Charts;

@Pauan
Copy link
Collaborator

Pauan commented May 20, 2018

@SaraNaifar I apologize for the delay.

Why are you using setState to update the dataProvider and then afterwards pushing into the dataProvider? You should make all your changes first and then call setState.

Similarly, you're calling this.setState({ dataProvider: this.generateData() }); and then afterwards calling this.generateData(); again. You only need to call it once.

Also, I do not understand what this code is doing:

for (var i = 0; i < 100; ++i) {
  var firstDate = new Date();
  var date = new Date(firstDate.getTime());
  date.setDate(i);
  //console.log(this.state.dataProvider)
  this.state.dataProvider.push({
    date: this.state.dataProvider.date,
    value: this.state.dataProvider.count
  });
}

this.state.dataProvider is an array, so it doesn't have a date or count property.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants