Angular ile Döviz Çevirme Uygulaması

Bir döviz çeviri APIsine denk gelince Angular ile basit bir web uygulaması yaparak arayüz eklemek güzel bir pratik olur dedim.

API; http://fixer.io/
Uygulama Github adresi; https://github.com/erdoganbavas/Currency-Converter/
Uygulamanın çalışır hali; https://erdoganbavas.github.io/Currency-Converter/

Hızlı bir pratik olması için yapılmış bir uygulama olduğundan pek çok eksiği veya daha kullanışlı olabilecek özellikleri olabilir.
Uygulamayı Github adresinden çekerek direk çalıştırabilir ve düzenleyebilirsiniz. En baştan başlayarak yapmak isterseniz biraz adımlardan bahsedeyim.

Angular CLI
https://github.com/angular/angular-cli
Angular için en kullanışlı araçlardan biridir. Yeni proje oluşturma, Component ekleme, geliştirme sırasında izleyerek otomatik build etme gibi hayat kurtaran özellikleri var.

Angular CLI aracını kurduktan sonra Windows için aşağıdaki adımlar ile projeyi oluşturup başlayabilirsiniz.

# Bir komut satırı açarak bu komut ile 
# converter adında yeni bir proje oluşturabilirsiniz
ng new converter

# bu komut converter adında bir klasör oluşturur
cd converter

# projeye CSS için bootstrap ekleyerek devam ediyoruz
npm install --save bootstrap

Dosya yapısı an itibari ile şu şekilde, Angular’ın yeni sürümlerinde bu yapı değişebilir.

Dosyalarımız üzerinde çalışmaya hazır. Kullandığımız editör ile (benim tercihim WebStorm) .angular-cli.json dosyasını açarak Bootstrap dosyamızı projemize eklememiz gerekli. styles elemanını bulup aşağıdaki şekilde değiştiriyoruz.

"styles": [
    "styles.css",
    "../node_modules/bootstrap/dist/css/bootstrap.css"
],

Şimdi projemizi tarayıcı üzerinde açarak görmeye başlayabiliriz. Bunun için Angular CLI komutunu komut satırına girmemiz yeterli.

ng serve

Projemiz http://localhost:4200/ adresinde görülebilir hale gelmiş olmalı.

Proje çok basit olduğu için yeni bir Component eklemeden devam ediyoruz. Ana Componentimiz olan app.component.ts dosyasını aşağıdaki şekle getiriyoruz.

import {Component, OnInit} from '@angular/core';
import {CurrencyService} from './currency.service';
import {Response} from '@angular/http';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  // Listelenecek para birimleri ve döviz oranları
  exchanges = [];

  // Varsayılan olarak açılacak miktar ve döviz cinsi
  currentCurrency = 'EUR';
  currentAmount = 1;

  // Burada birazdan oluşturacağımız bir Service i ekleyerek komponent içinde kullanılabilir hale getiriyoruz
  constructor(private currencyService: CurrencyService) {}

  // Class ı tanımlarken implement ettiğimiz OnInit sayesinde component başlarken
  // bu methoda eklediğimiz kodlar da çalıştırılacaktır.
  ngOnInit() {
    // varsayılan değerlerimiz uygulama açılışında yüklensin
    this.onCurrencyClick(this.currencyService.getData(this.currentCurrency));
  }

  // HTML kısmında tanımlayacağımız input için her değer değiştiğinde çağrılacak metot
  onAmountChange(newAmount) {
    newAmount = Number(newAmount);

    if (newAmount > 0) {
      this.currentAmount = newAmount;

      for (let i = 0; i < this.exchanges.length; i++) {
        const newRate = this.exchanges[i].rateOrigin * this.currentAmount;
        this.exchanges[i].rate = newRate.toFixed(4);
      }
    }
  }

  // herhangi bir döviz cinsine tıklandığında hesaplamaları o döviz cinsine göre yapmaya başlayacak
  onCurrencyClick(currency) {
    this.currentCurrency = currency.code;

    // constructor metodunda tanımladığımız servisimizi kullanarak döviz oranlarını çağırıyoruz.
    this.currencyService.getRatesOf(currency.code).subscribe(
      (response: Response) => {
        // reset
        this.exchanges = [];

        // API isteği ile dönen değeri JSON nesnesine çeviriyoruz
        const responseJson = response.json();

        for (const ratedCode in responseJson.rates) {
          if (responseJson.rates.hasOwnProperty(ratedCode)) {
            const ratedData = this.currencyService.getData(ratedCode);
            if (typeof ratedData !== 'undefined') {
              ratedData.rateOrigin = responseJson.rates[ratedCode];
              const newRate = responseJson.rates[ratedCode] * this.currentAmount;
              ratedData.rate = newRate.toFixed(4);
              this.exchanges.push(ratedData);
            }
          }
        }
      }
    );
  }
}

app.component.html

Döviz Dönüştürücü


{{currentCurrency}}

{{exchange.name}} {{exchange.rate}} {{exchange.code}}

currency.service.ts

import {Http} from '@angular/http';
import {Injectable} from '@angular/core';

@Injectable()
export class CurrencyService {
  currencyData = {
    'EUR': {flag: 'https://www.dbs.com.sg/iwov-resources/images/rates/euro_flg.gif', code: 'EUR', name: 'Euro'},
    'USD': {flag: 'http://www.ecb.europa.eu/shared/img/flags/USD.gif', code: 'USD', name: 'US dollar'},
    'JPY': {flag: 'http://www.ecb.europa.eu/shared/img/flags/JPY.gif', code: 'JPY', name: 'Japanese yen'},
    'BGN': {flag: 'http://www.ecb.europa.eu/shared/img/flags/BGN.gif', code: 'BGN', name: 'Bulgarian lev'},
    'CZK': {flag: 'http://www.ecb.europa.eu/shared/img/flags/CZK.gif', code: 'CZK', name: 'Czech koruna'},
    'DKK': {flag: 'http://www.ecb.europa.eu/shared/img/flags/DKK.gif', code: 'DKK', name: 'Danish krone'},
    'GBP': {flag: 'http://www.ecb.europa.eu/shared/img/flags/GBP.gif', code: 'GBP', name: 'Pound sterling'},
    'HUF': {flag: 'http://www.ecb.europa.eu/shared/img/flags/HUF.gif', code: 'HUF', name: 'Hungarian forint'},
    'PLN': {flag: 'http://www.ecb.europa.eu/shared/img/flags/PLN.gif', code: 'PLN', name: 'Polish zloty'},
    'RON': {flag: 'http://www.ecb.europa.eu/shared/img/flags/RON.gif', code: 'RON', name: 'Romanian leu'},
    'SEK': {flag: 'http://www.ecb.europa.eu/shared/img/flags/SEK.gif', code: 'SEK', name: 'Swedish krona'},
    'CHF': {flag: 'http://www.ecb.europa.eu/shared/img/flags/CHF.gif', code: 'CHF', name: 'Swiss franc'},
    'NOK': {flag: 'http://www.ecb.europa.eu/shared/img/flags/NOK.gif', code: 'NOK', name: 'Norwegian krone'},
    'HRK': {flag: 'http://www.ecb.europa.eu/shared/img/flags/HRK.gif', code: 'HRK', name: 'Croatian kuna'},
    'RUB': {flag: 'http://www.ecb.europa.eu/shared/img/flags/RUB.gif', code: 'RUB', name: 'Russian rouble'},
    'TRY': {flag: 'http://www.ecb.europa.eu/shared/img/flags/TRY.gif', code: 'TRY', name: 'Turkish lira'},
    'AUD': {flag: 'http://www.ecb.europa.eu/shared/img/flags/AUD.gif', code: 'AUD', name: 'Australian dollar'},
    'BRL': {flag: 'http://www.ecb.europa.eu/shared/img/flags/BRL.gif', code: 'BRL', name: 'Brazilian real'},
    'CAD': {flag: 'http://www.ecb.europa.eu/shared/img/flags/CAD.gif', code: 'CAD', name: 'Canadian dollar'},
    'CNY': {flag: 'http://www.ecb.europa.eu/shared/img/flags/CNY.gif', code: 'CNY', name: 'Chinese yuan renminbi'},
    'HKD': {flag: 'http://www.ecb.europa.eu/shared/img/flags/HKD.gif', code: 'HKD', name: 'Hong Kong dollar'},
    'IDR': {flag: 'http://www.ecb.europa.eu/shared/img/flags/IDR.gif', code: 'IDR', name: 'Indonesian rupiah'},
    'ILS': {flag: 'http://www.ecb.europa.eu/shared/img/flags/ILS.gif', code: 'ILS', name: 'Israeli shekel'},
    'INR': {flag: 'http://www.ecb.europa.eu/shared/img/flags/INR.gif', code: 'INR', name: 'Indian rupee'},
    'KRW': {flag: 'http://www.ecb.europa.eu/shared/img/flags/KRW.gif', code: 'KRW', name: 'South Korean won'},
    'MXN': {flag: 'http://www.ecb.europa.eu/shared/img/flags/MXN.gif', code: 'MXN', name: 'Mexican peso'},
    'MYR': {flag: 'http://www.ecb.europa.eu/shared/img/flags/MYR.gif', code: 'MYR', name: 'Malaysian ringgit'},
    'NZD': {flag: 'http://www.ecb.europa.eu/shared/img/flags/NZD.gif', code: 'NZD', name: 'New Zealand dollar'},
    'PHP': {flag: 'http://www.ecb.europa.eu/shared/img/flags/PHP.gif', code: 'PHP', name: 'Philippine peso'},
    'SGD': {flag: 'http://www.ecb.europa.eu/shared/img/flags/SGD.gif', code: 'SGD', name: 'Singapore dollar'},
    'THB': {flag: 'http://www.ecb.europa.eu/shared/img/flags/THB.gif', code: 'THB', name: 'Thai baht'},
    'ZAR': {flag: 'http://www.ecb.europa.eu/shared/img/flags/ZAR.gif', code: 'ZAR', name: 'South African rand'}
  };

  constructor(private http: Http) {}

  getData(code: string) {
    return this.currencyData[code];
  }

  getRatesOf(code: string) {
    return this.http.get('https://api.fixer.io/latest?base=' + code);
  }
}

Servisimizi ekledikten sonra şu adımı da yaparak servisi tüm uygulama içinde tek bir oluşum(instance) ile kullanabiliyoruz.
app.module.ts dosyasına,

# import ların yapıldığı üst bölümde servisi import edelim
import {CurrencyService} from './currency.service';

# @NgModule dekoratörünün içindeki providers değerine servisimizi ekleyelim
providers: [CurrencyService]

Gerekli kodları eklerken her kayıt işlemini izleyen “ng serve” komutu projeyi build ederek tarayıcıda görülmeye hazır hale getirecektir.

Bir Cevap Yazın