district UI module for handling conversion rates
Clojurescript re-mount module, that handles conversion rates between fiat currencies and cryptocurrencies.
This module currently uses cryptocompare.com API to obtain rates.
It also uses internal caching, so other modules don’t load same rates unnecessarily many times.
Add [district0x/district-ui-conversion-rates "1.0.1"]
into your project.clj
Include [district.ui.conversion-rates]
in your CLJS file, where you use mount/start
Warning: district0x modules are still in early stages, therefore API can change in a future.
This namespace contains conversion-rates mount module.
In case you pass initial configuration, the module will load rates at mount start.
You can pass following args to initiate this module:
:from-currencies
Currencies you’ll be converting from:to-currencies
Currencies you’ll be converting to:request-timeout
Timeout of request to obtain rates, before throwing error (ms). Default: 10000 (10s):request-interval-ms
How often rates should be reloaded. Default: 300000 (5 min.). Pass 0 to disable reloading.:cache-ttl
Time-to-live of the cache. A rate won’t be loaded again until this duration passes since last load of that rate.
(ns my-district.core
(:require [mount.core :as mount]
[district.ui.conversion-rates]))
(-> (mount/with-args
{:conversion-rates {:from-currencies [:ETH :BTC]
:to-currencies [:USD :EUR :DNT]}})
(mount/start))
re-frame subscriptions provided by this module:
::conversion-rates
" class="reference-link">::conversion-rates
Returns conversion rates. You can use 2 forms:
@(subscribe [::subs/conversion-rates])
;; {:ETH {:USD 664.31, :EUR 570.81, :DNT 8873.63}, :BTC {:USD 13601.62, :EUR 11714.62, :DNT 183150.18}}
@(subscribe [::subs/conversion-rates :ETH])
;; {:USD 663.98, :EUR 570.87, :DNT 8871.79}
::conversion-rate
" class="reference-link">::conversion-rate
Returns conversion rate of a pair
@(subscribe [::subs/conversion-rate :ETH :USD])
;; 664.92
::convert
" class="reference-link">::convert
Converts passed value according to rate
@(subscribe [::subs/convert :ETH 2])
;; {:USD 1327.96, :EUR 1141.24, :DNT 17779.82}
@(subscribe [::subs/convert :ETH :USD 2])
;; 1327.9
Complete example might be:
(ns my-district.home-page
(:require [district.ui.conversion-rates.subs :as rates-subs]
[re-frame.core :refer [subscribe]]))
(defn home-page []
(let [converted-eth-usd (subscribe [::rates-subs/convert :ETH :USD 2])]
(fn []
[:div "2 ETH is currently " @converted-eth-usd " USD"])))
re-frame events provided by this module:
::watch-conversion-rates [opts]
" class="reference-link">::watch-conversion-rates [opts]
:from-currencies
:to-currencies
:request-interval-ms
(optional) :request-timeout
(optional) :id
Id of reloading interval, so you can stop it later. ::stop-watching-conversion-rates [id]
" class="reference-link">::stop-watching-conversion-rates [id]
::load-conversion-rates [opts]
" class="reference-link">::load-conversion-rates [opts]
Loads conversion rates from external API.
opts:
:from-currencies
:to-currencies
:request-timeout
(optional) ::set-conversion-rates [conversion-rates]
" class="reference-link">::set-conversion-rates [conversion-rates]
::conversion-rates-load-failed
" class="reference-link">::conversion-rates-load-failed
Event fired when loading failed
DB queries provided by this module:
You should use them in your events, instead of trying to get this module’s
data directly with get-in
into re-frame db.
conversion-rates [db]
" class="reference-link">conversion-rates [db]
Works the same way as sub ::conversion-rates
conversion-rate [db from to]
" class="reference-link">conversion-rate [db from to]
Works the same way as sub ::conversion-rate
convert [db from to value]
" class="reference-link">convert [db from to value]
Works the same way as sub ::convert
(ns my-district.events
(:require [district.ui.conversion-rates.queries :as rates-queries]
[re-frame.core :refer [reg-event-fx]]))
(reg-event-fx
::my-event
(fn [{:keys [:db]}]
(if (< 1500 (rates-queries/convert db :ETH :USD 2))
{:dispatch [::do-something]}
{:dispatch [::do-other-thing]})))
merge-conversion-rates [db conversion-rates]
" class="reference-link">merge-conversion-rates [db conversion-rates]
Merges in new conversion rates and returns new re-frame db.
cache-ttl [db]
" class="reference-link">cache-ttl [db]
assoc-cache-ttl [db cache-ttl]
" class="reference-link">assoc-cache-ttl [db cache-ttl]
Associates new cache-ttl and returns new re-frame db.
lein deps
# To run tests and rerun on changes
lein doo chrome tests