JS-201-ReactFundamentals
  • Part 0: App Overview
  • Part 1: Intro to React
    • 1.0: Packages Setup
    • 1.1: Project Setup
    • 1.2: React Router Dom
  • Part 2: JavaScript Concepts
    • 2.0: ES6 Overview
    • 2.1: classes
    • 2.2: constructors
    • 2.3: extends
    • 2.4: super
    • 2.5: interpolation
    • 2.6: map
    • 2.7: filter
  • Part 3: Functional Components
    • 3.0: Functional Components Overview
    • 3.1: Calling Functional Components
    • 3.2: Single Element Rule
    • 3.3: Arrow Functions
    • 3.4: Challenge
    • 3.4: Solution
    • 3.5: Challenge 2
    • 3.5: Solution 2
  • Part 4: JSX Challenge
    • 4.1: JSX Overview
    • 4.1: Challenge Answer
    • 4.2: className
  • Part 5: Class Concepts
    • 5.1: State
    • 5.2: setState
    • 5.3: Class Components Challenge
    • 5.4: Class Components Challenge Answer
  • Part 6: Props Starter
    • 6.0: Props Overview
    • 6.1: Props Demo and Challenge 1
    • 6.2: Props Answer 2
    • 6.3: Props Passing Functions and Challenge 2
    • 6.4: Props Answer 2
    • 6.5: External Props and Mapping Components
    • 6.6: PropTypes
  • Part 7: Lifecycle Methods
    • 7.0: Lifecycle Overview
    • 7.1: Lifecycle Methods
    • 7.2: Mounting Methods
    • 7.3: Update Methods
    • 7.4: Unmount Methods
  • Part 8: Apps
    • 1.0 - Small Timer Apps
      • 1.1 - Simple Timer
      • 1.2 - Clock App
      • 1.3 - Stop Watch App
      • 1.4 - Challenge
    • 2.0 - Concept List
      • 2.1 - Concept Data
      • 2.2 - Concept App Component
      • 2.3 - Concept Component
      • 2.4 - Concept List Component
    • 3.0 - NYT
      • 3.1 - NytApp Component
      • 3.2 - Nyt Results
    • 4.0 - The Friend List App
      • 4.1 - Friend List App Component
      • 4.2 - Friend Component
    • 5.0 - Movie Search Application
      • 5.1 - Form Component
      • 5.2 - Form Results Component
      • 5.3 - Styled Components
    • 6.0 - YouTube Api
      • 6.1 - Video Component
      • 6.2 - Video Component
      • 6.3 - Video Component
    • 7.0 - Github Api Application
      • 7.1 - The Users
      • 7.2 - Github API Component
      • 7.3 - Github API Card
      • 7.4 - Github API Card Form
      • 7.5 - Github API Card List
      • 7.6 - Github API Search
      • 7.7 - Github API Challenge
    • 8.0 - Bitcoin Api Application
      • 8.1 - Bitcoin API Setup
      • 8.2 - Bitcoin API Fetch
      • 8.3 - Bitcoin API Line Chart
      • 8.4 - Bitcoin API Fetching Data
      • 8.5 - Bitcoin API Info Box
      • 8.6 - Bitcoin API Completed Code
    • 9.0 - Google Maps Api Challenge
    • 10.0 - Sound Cloud App Challenge
    • 11.0 - VR App Challenge
    • 12.0 - React Native Intro
  • Part 9: Project
  • Part 10: Notes
    • 10.1 - Resources
    • 10.2 - Troubleshooting
Powered by GitBook
On this page
  • Bitcoin.js
  • LineChart.js
  • InfoBox.js
  1. Part 8: Apps
  2. 8.0 - Bitcoin Api Application

8.6 - Bitcoin API Completed Code

Bitcoin.js

import React, { Component } from 'react';
import LineChart from './LineChart';
import InfoBox from './InfoBox';

export default class Bitcoin extends Component {
  constructor() {
    super();
    this.state = {
      fetchingData: true,
      data: [],
    }
  }

  componentDidMount() {
    const url = 'https://api.coindesk.com/v1/bpi/historical/close.json';
    fetch(url)
      .then(response => response.json())
      .then(bitcoinData => {
        console.log(bitcoinData.bpi);
        this.setState({
          data: bitcoinData.bpi,
          fetchingData: false
        })
      })
      .catch(e => {
        console.log(e);
      })
  }

  render() {
    return (
      <div className='main'>
        <div className='mainDiv'>
          <h1>30 Day Bitcoin Price Chart</h1>
          { !this.state.fetchingData ? <InfoBox data={ this.state.data }/> : null }
          { !this.state.fetchingData ? <LineChart data={ this.state.data }/> : null }
        </div>
      </div>
    );
  }
};

LineChart.js

import React, { Component } from 'react';
import Chart from 'chart.js';
import moment from 'moment';

export default class LineChart extends Component {
  constructor(props) {
    super(props);
    this.state ={
      dates: [],
      payout: []
    }
  }

  componentDidMount() {
    const unsortedData = this.props.data;
    let dates = [];
    let payout = [];
    for (let item in unsortedData) {
      let bitcoinDates = moment(item).format('MMM DD');
      dates.push(bitcoinDates)
      payout.push(unsortedData[item])
    }
    this.setState({
      dates: dates,
      payout: payout
    })
  }

  componentDidMount() {
    var chartContext = document.getElementById('myChart').getContext('2d');
    var myChart = new Chart(chartContext, {
      type: 'line',
      data: {
        labels: this.state.dates,
        datasets: [{
          data: this.state.payout,
          backgroundColor: '#d9514e80', 
          borderColor: '#d9514e',
          borderWidth: 2
        }]
      },
      options: {
        legend: {
          display: false
        },
        scales: {
          yAxis: [{
            ticks: {
              beginAtZero: true
            }
          }]
        }
      }
    });
  }

  render() {
    return (
      <canvas id='myChart'></canvas>
    );
  }
};

InfoBox.js

import React, { Component } from 'react';
import styled from 'styled-components';

const InfoCard = styled.div `
  display: inline-block;
  width: 50%;
  margin-bottom: 1em;
  text-align: center;
  color: #d9514e;
`

export default class InfoBox extends Component {
  constructor(props) {
    super(props);
    this.state ={
      payout: [],
      infoCurrent: [],
      infoPayout: []
    }
  }

  componentDidMount() {
    const infoData = this.props.data;
    let payout = [];
    for (let thing in infoData) {
      payout.push(infoData[thing])
    }
    this.setState({
      payout: payout,
      infoCurrent: payout[30].toLocaleString('us-EN', { style: 'currency', currency: 'USD' }),
      infoPayout: (payout[30] - payout[0]).toLocaleString('us-EN', { style: 'currency', currency: 'USD' })
    })
  }

  render() {
    return (
      <div>
        <InfoCard>
          <div>
            <h3>Current Price:</h3>
          </div>
          <div>
            <h5>{this.state.infoCurrent}</h5>
          </div>
        </InfoCard>
        <InfoCard>
          <div>
            <h3>Change Since Last Month (USD):</h3>
          </div>
          <div>
            <h5>{ this.state.infoPayout }</h5>
          </div>
        </InfoCard>
      </div>
    );
  }
};
Previous8.5 - Bitcoin API Info BoxNext9.0 - Google Maps Api Challenge

Last updated 6 years ago