diff --git a/concurrency/public/style.css b/concurrency/public/style.css index 4e36b11..db6a7ea 100644 --- a/concurrency/public/style.css +++ b/concurrency/public/style.css @@ -1,6 +1,7 @@ .grid-container { display: grid; grid-template-columns: auto auto; + } div.wrapper{ @@ -10,13 +11,8 @@ div.wrapper{ padding: 10px; } -.convert-button { - position: relative; - left: auto; - right: auto; -} - -input + input { +/* All inputs preceded by another input */ +input + input { margin-left: 1.5rem; } diff --git a/concurrency/src/Exchanger.tsx b/concurrency/src/Exchanger.tsx index f481f06..05ddf52 100644 --- a/concurrency/src/Exchanger.tsx +++ b/concurrency/src/Exchanger.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import axios from "axios"; import Rates from "./Rates"; @@ -6,24 +6,25 @@ import Rates from "./Rates"; function Exchanger() { let [rates, setRates] = useState({} as Rates); - let [inputOne, setInputOne] = useState("0"); + let [inputOne, setInputOne] = useState(""); let [selectedOne, setSelectedOne] = useState("USD"); let [selectedTwo, setSelectedTwo] = useState("EUR"); let [result, setResult] = useState("0.00"); + const isFirstRender = useRef(true); useEffect(() => { - let saved = Number(localStorage.getItem("saved")); + const saved = Number(localStorage.getItem("saved")); if (Math.floor(Date.now() / 1000) - saved > 86400) { // If it's been more tha 24 hours, fetch new rates // The timeout is 24 hours because that's how often the exchangerate-api refreshes its data axios.get(process.env.API_URL).then(resp => { setRates(resp.data); - localStorage.setItem("saved", Math.floor(Date.now() / 1000).toString()); + localStorage.setItem("saved", Math.floor(Date.now() / 1000).toString()); // convert milliseconds to seconds localStorage.setItem("rates", JSON.stringify(resp.data)); }); } else { // Otherwise, just grab them from localstorage - let data = JSON.parse(localStorage.getItem("rates")); + const data = JSON.parse(localStorage.getItem("rates")); setRates(data); } }, []); @@ -40,7 +41,13 @@ function Exchanger() { setSelectedTwo(event.target.value); } - function handleConvertClick() { + useEffect(() => { + if (isFirstRender.current) { + // Do nothing if it's the first render + // This will ensure this effect will only fire on state updates, not the initial state + isFirstRender.current = false; + return; + } let inp = Number(inputOne); if (Number.isNaN(inp)) { alert("Input must be a number!"); @@ -57,7 +64,7 @@ function Exchanger() { // Then, convert the USD to the chosen output currency exchange_rate = rates.conversion_rates[outCurrency]; setResult((usd * exchange_rate).toFixed(2)); // Round to 2 decimal places - } + }, [rates, inputOne, selectedOne, selectedTwo]); // Only run this effect if one of these changed function handleSwapClick() { const temp1 = selectedOne; @@ -72,14 +79,15 @@ function Exchanger() { if (Object.keys(rates).length) { return <>
- + +
@@ -87,7 +95,6 @@ function Exchanger() {
-
} else { diff --git a/concurrency/src/Rates.ts b/concurrency/src/Rates.ts index 1599e3d..3176d86 100644 --- a/concurrency/src/Rates.ts +++ b/concurrency/src/Rates.ts @@ -12,168 +12,6 @@ type Rates = { time_next_update_utc: string, base_code: string, conversion_rates: ConversionRate - // conversion_rates: { - // USD: number, - // AED: number, - // AFN: number, - // ALL: number, - // AMD: number, - // ANG: number, - // AOA: number, - // ARS: number, - // AUD: number, - // AWG: number, - // AZN: number, - // BAM: number, - // BBD: number, - // BDT: number, - // BGN: number, - // BHD: number, - // BIF: number, - // BMD: number, - // BND: number, - // BOB: number, - // BRL: number, - // BSD: number, - // BTN: number, - // BWP: number, - // BYN: number, - // BZD: number, - // CAD: number, - // CDF: number, - // CHF: number, - // CLP: number, - // CNY: number, - // COP: number, - // CRC: number, - // CUC: number, - // CUP: number, - // CVE: number, - // CZK: number, - // DJF: number, - // DKK: number, - // DOP: number, - // DZD: number, - // EGP: number, - // ERN: number, - // ETB: number, - // EUR: number, - // FJD: number, - // FKP: number, - // FOK: number, - // GBP: number, - // GEL: number, - // GGP: number, - // GHS: number, - // GIP: number, - // GMD: number, - // GNF: number, - // GTQ: number, - // GYD: number, - // HKD: number, - // HNL: number, - // HRK: number, - // HTG: number, - // HUF: number, - // IDR: number, - // ILS: number, - // IMP: number, - // INR: number, - // IQD: number, - // IRR: number, - // ISK: number, - // JMD: number, - // JOD: number, - // JPY: number, - // KES: number, - // KGS: number, - // KHR: number, - // KID: number, - // KMF: number, - // KRW: number, - // KWD: number, - // KYD: number, - // KZT: number, - // LAK: number, - // LBP: number, - // LKR: number, - // LRD: number, - // LSL: number, - // LYD: number, - // MAD: number, - // MDL: number, - // MGA: number, - // MKD: number, - // MMK: number, - // MNT: number, - // MOP: number, - // MRU: number, - // MUR: number, - // MVR: number, - // MWK: number, - // MXN: number, - // MYR: number, - // MZN: number, - // NAD: number, - // NGN: number, - // NIO: number, - // NOK: number, - // NPR: number, - // NZD: number, - // OMR: number, - // PAB: number, - // PEN: number, - // PGK: number, - // PHP: number, - // PKR: number, - // PLN: number, - // PYG: number, - // QAR: number, - // RON: number, - // RSD: number, - // RUB: number, - // RWF: number, - // SAR: number, - // SBD: number, - // SCR: number, - // SDG: number, - // SEK: number, - // SGD: number, - // SHP: number, - // SLL: number, - // SOS: number, - // SRD: number, - // SSP: number, - // STN: number, - // SYP: number, - // SZL: number, - // THB: number, - // TJS: number, - // TMT: number, - // TND: number, - // TOP: number, - // TRY: number, - // TTD: number, - // TVD: number, - // TWD: number, - // TZS: number, - // UAH: number, - // UGX: number, - // UYU: number, - // UZS: number, - // VES: number, - // VND: number, - // VUV: number, - // WST: number, - // XAF: number, - // XCD: number, - // XDR: number, - // XOF: number, - // XPF: number, - // YER: number, - // ZAR: number, - // ZMW: number - // } } export default Rates; \ No newline at end of file