ferraridamiano / ConverterNOW

The Unit Converter app: easy, immediate and multi-platform
https://converter-now.web.app
GNU General Public License v3.0
373 stars 57 forks source link

[new-unit] more currencies using other free exchange rate API #252

Open adrianinsaval opened 9 months ago

adrianinsaval commented 9 months ago

Description A bigger pool of currencies would be nice. Personally would love to have PYG available, I read the disclaimer on the issue template and understand that this app is not in a position to pay for a service, however there are free services available with more currencies than the european central bank, see https://open.er-api.com/v6/latest and it's docs: https://www.exchangerate-api.com/docs/free It's rate limited but the app wouldn't need to access it that often. I would still leave the european bank as fallback API since it's more likely to stay free for posterity, but it would be nice to use this to support less popular currencies.

adrianinsaval commented 9 months ago

chat gpt says to do this on https://github.com/ferraridamiano/ConverterNOW/blob/master/lib/models/currencies.dart

  Future<Currencies> downloadCurrencies() async {
    try {
      var response = await http.get(Uri.parse('https://open.er-api.com/v6/latest'));

      if (response.statusCode == 200) {
        var lastUpdate = DateFormat("yyyy-MM-dd").format(DateTime.now());
        Map<String, dynamic> data = json.decode(response.body);
        Map<String, double> exchangeRates = {'EUR': 1};

        // Update exchange rates from the API response
        for (var currency in defaultExchangeRates.keys) {
          if (currency != 'EUR' && data.containsKey(currency)) {
            exchangeRates[currency] = data[currency];
          }
        }

        pref.setString('currenciesRates', jsonEncode(exchangeRates));
        pref.setString('lastUpdateCurrencies', lastUpdate);
        return Currencies(
          exchangeRates: exchangeRates,
          lastUpdate: lastUpdate,
        );
      }
    } catch (e) {
      debugPrint(e.toString());
    }
    return readSavedCurrencies();
  }

no clue if that is even valid code. I think that API uses USD as base though, might need to change that or use https://open.er-api.com/v6/latest/EUR instead

ferraridamiano commented 9 months ago

It's rate limited but the app wouldn't need to access it that often.

The website you mention says that it includes 1.5k request in the free plan. This app has more than 1.5k MAU with only the installations from the play store.

At the moment the european central bank api is the most trustworthy service without such limitations. I will leave this open for further discussion and new ideas since this is one of the most requestes features.

adrianinsaval commented 9 months ago

But I would imagine the limitation is by IP address not by app, how would it even know it's all from the same app

ferraridamiano commented 9 months ago

Isn't it related to the free API key?

adrianinsaval commented 9 months ago

I assume you looked at the "Free API" card, look at the "Open API" instead. No API key is required, each request would be associated with each individual user not the app itself. The european bank is most definitely the most trustworthy source, but it would be nice to have this as an option for more obscure currencies.

ferraridamiano commented 9 months ago

Oh, right! Yes, technically it is feasible. Maybe we could use the ECB for the current currencies and this service for the other one. I will take a look, if you want to submit a PR I can review it