Skip to content

Commit ba0fe85

Browse files
authored
Merge pull request #937 from brjens/Currency-Converter
Currency Calc
2 parents 3a7793e + 006aebb commit ba0fe85

File tree

5 files changed

+209
-7
lines changed

5 files changed

+209
-7
lines changed

src/App.js

+18-6
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ const WipeLength = React.lazy(() => import('./pages/wipe-length/index.js'));
7878
const Achievements = React.lazy(() => import('./pages/achievements/index.js'));
7979
const Players = React.lazy(() => import('./pages/players/index.js'));
8080
const Player = React.lazy(() => import('./pages/player/index.js'));
81+
const Converter = React.lazy(() => import('./pages/converter/index.js'));
8182
const About = React.lazy(() => import('./pages/about/index.js'));
8283

8384
const APIDocs = React.lazy(() => import('./pages/api-docs/index.js'));
@@ -129,7 +130,7 @@ function App() {
129130
const useTarkovTracker = useSelector(
130131
(state) => state.settings.useTarkovTracker,
131132
);
132-
133+
133134
const progressStatus = useSelector((state) => {
134135
return state.settings.progressStatus;
135136
});
@@ -177,7 +178,7 @@ function App() {
177178
};
178179

179180
const connect = function connect() {
180-
socket = new WebSocket(socketServer+`?sessionid=${encodeURIComponent(sessionID)}`);
181+
socket = new WebSocket(socketServer + `?sessionid=${encodeURIComponent(sessionID)}`);
181182

182183
const heartbeat = function heartbeat() {
183184
clearTimeout(socket.pingTimeout);
@@ -248,7 +249,8 @@ function App() {
248249
// Wait a bit if we're not connected
249250
setTimeout(() => {
250251
socket.send(
251-
JSON.stringify({ sessionID: controlId,
252+
JSON.stringify({
253+
sessionID: controlId,
252254
...messageData,
253255
}),
254256
);
@@ -828,14 +830,14 @@ function App() {
828830
remoteControlSessionElement,
829831
]}
830832
/>
831-
<Route
832-
path={'/control'}
833+
<Route
834+
path={'/control'}
833835
key="control-route"
834836
element={[
835837
<Suspense fallback={<Loading />} key="suspense-control-wrapper">
836838
<Control send={send} />
837839
</Suspense>,
838-
]}
840+
]}
839841
/>
840842
<Route
841843
path={'/tasks/'}
@@ -887,6 +889,16 @@ function App() {
887889
remoteControlSessionElement,
888890
]}
889891
/>
892+
<Route
893+
path={'/converter'}
894+
key="converter-route"
895+
element={[
896+
<Suspense fallback={<Loading />} key="suspense-converter-wrapper">
897+
<Converter key="converter-wrapper" />
898+
</Suspense>,
899+
remoteControlSessionElement,
900+
]}
901+
/>
890902
<Route
891903
path="*"
892904
element={[

src/components/menu/index.js

+8
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,14 @@ const Menu = () => {
323323
{t('Players')}
324324
</Link>
325325
</li>
326+
<li className="submenu-wrapper submenu-items overflow-member" key="menu-converter" data-targetid="converter">
327+
<Link
328+
to="/converter"
329+
//onClick={setIsOpen.bind(this, false)}
330+
>
331+
{t('Currency Converter')}
332+
</Link>
333+
</li>
326334
<li className="submenu-wrapper submenu-items overflow-member" key="menu-api" data-targetid="api">
327335
<Link
328336
to="/api/"

src/pages/converter/index.css

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
.reset-button {
2+
padding: .2rem;
3+
border-radius: 4px;
4+
margin-top: 20px;
5+
}
6+
7+
.currency-input {
8+
display: flex;
9+
}
10+
11+
.currency-input .icon-with-text {
12+
margin: 10px;
13+
}
14+
.currency-input {
15+
margin-right: 10px;
16+
width: 264px;
17+
margin-top: 10px;
18+
}
19+
20+
.error {
21+
color: #cd1e2f;
22+
}

src/pages/converter/index.js

+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
import { useEffect, useState } from 'react';
2+
import { Icon } from '@mdi/react';
3+
import { mdiCashSync } from '@mdi/js';
4+
import { mdiCurrencyUsd } from '@mdi/js';
5+
import { mdiCurrencyEur } from '@mdi/js';
6+
import { mdiCurrencyRub } from '@mdi/js';
7+
import { useTranslation } from 'react-i18next';
8+
import SEO from '../../components/SEO.jsx';
9+
import { InputFilter } from '../../components/filter/index.js';
10+
import useItemsData from '../../features/items/index.js';
11+
import itemSearch from '../../modules/item-search.js';
12+
import useKeyPress from '../../hooks/useKeyPress.jsx';
13+
14+
import './index.css';
15+
16+
function Converter() {
17+
const { t } = useTranslation();
18+
19+
const [RUBFilter, setRUBFilter] = useState();
20+
const [USDFilter, setUSDFilter] = useState();
21+
const [EURFilter, setEURFilter] = useState();
22+
const [EURRate, setEURRate] = useState(159);
23+
const [USDRate, setUSDRate] = useState(149);
24+
const { data: items } = useItemsData();
25+
26+
27+
const enterPress = useKeyPress('Enter');
28+
29+
useEffect(() => {
30+
let euroConversion;
31+
let dollarConversion;
32+
const dollarsearch = itemSearch(items, 'Dollars');
33+
const dollarItem = dollarsearch.find(item => item.name === 'Dollars');
34+
if (dollarItem) {
35+
dollarConversion = dollarItem.buyForBest.price;
36+
}
37+
const euroSearch = itemSearch(items, 'Euros');
38+
const euroItem = euroSearch.find(item => item.name === 'Euros');
39+
if (euroItem) {
40+
euroConversion = euroItem.buyForBest.price;
41+
}
42+
setEURRate(euroConversion);
43+
setUSDRate(dollarConversion);
44+
}, [items, setEURRate, setUSDRate]);
45+
46+
useEffect(() => {
47+
if (enterPress) {
48+
resetInput();
49+
}
50+
}, [enterPress]);
51+
52+
function exchangeRate() {
53+
const exchangeRates = {
54+
USD: { EUR: USDRate / EURRate, RUB: USDRate },
55+
EUR: { USD: EURRate / USDRate, RUB: EURRate },
56+
RUB: { USD: 1 / USDRate, EUR: 1 / EURRate },
57+
};
58+
return exchangeRates;
59+
}
60+
61+
function inputFilter(fromCurrency, amount) {
62+
if (fromCurrency === 'RUB') {
63+
setRUBFilter(amount);
64+
convertCurrency(fromCurrency, amount);
65+
} else if (fromCurrency === 'USD') {
66+
setUSDFilter(amount);
67+
convertCurrency(fromCurrency, amount);
68+
} else if (fromCurrency === 'EUR') {
69+
setEURFilter(amount);
70+
convertCurrency(fromCurrency, amount);
71+
}
72+
}
73+
74+
function convertCurrency(fromCurrency, amount) {
75+
if (fromCurrency === 'RUB') {
76+
let convertedAmount = Math.floor(amount * (exchangeRate()[fromCurrency]['USD']));
77+
setUSDFilter(convertedAmount);
78+
convertedAmount = Math.floor(amount * (exchangeRate()[fromCurrency]['EUR']));
79+
setEURFilter(convertedAmount);
80+
}
81+
else if (fromCurrency === 'USD') {
82+
let convertedAmount = Math.floor(amount * (exchangeRate()[fromCurrency]['EUR']));
83+
setEURFilter(convertedAmount);
84+
convertedAmount = Math.floor(amount * (exchangeRate()[fromCurrency]['RUB']));
85+
setRUBFilter(convertedAmount);
86+
} else if (fromCurrency === 'EUR') {
87+
let convertedAmount = Math.floor(amount * (exchangeRate()[fromCurrency]['USD']));
88+
setUSDFilter(convertedAmount);
89+
convertedAmount = Math.floor(amount * (exchangeRate()[fromCurrency]['RUB']));
90+
setRUBFilter(convertedAmount);
91+
}
92+
}
93+
94+
function resetInput() {
95+
setRUBFilter('');
96+
setUSDFilter('');
97+
setEURFilter('');
98+
}
99+
100+
return [
101+
<SEO
102+
title={`${t('Converter')} - ${t('Escape from Tarkov')} - ${t('Tarkov.dev')}`}
103+
description={t('converter-page-description', 'Search Escape from Tarkov players. Convert from one currancy to another.')}
104+
key="seo-wrapper"
105+
/>,
106+
<div className={'page-wrapper'} key="converter-page-wrapper">
107+
<div className="converter-headline-wrapper" key="converter-headline">
108+
<h1 className="converter-page-title">
109+
<Icon path={mdiCashSync} size={1.5} className="icon-with-text" />
110+
{t('Converter')}
111+
</h1>
112+
</div>
113+
<div>
114+
<p>
115+
{t('Convert one currency to another')}
116+
</p>
117+
</div>
118+
<div className='currency-input'>
119+
<InputFilter
120+
value={RUBFilter}
121+
placeholder={'0'}
122+
type="number"
123+
onChange={(event) => {
124+
inputFilter('RUB', event.target.value);
125+
}}
126+
/>
127+
<Icon path={mdiCurrencyRub} size={1.5} className="icon-with-text" />
128+
</div>
129+
<div className='currency-input'>
130+
<InputFilter
131+
value={USDFilter}
132+
placeholder={'0'}
133+
type="number"
134+
onChange={(event) => {
135+
inputFilter('USD', event.target.value);
136+
}}
137+
/>
138+
<Icon path={mdiCurrencyUsd} size={1.5} className="icon-with-text" />
139+
</div>
140+
<div className='currency-input'>
141+
<InputFilter
142+
value={EURFilter}
143+
placeholder={'0'}
144+
type="number"
145+
onChange={(event) => {
146+
inputFilter('EUR', event.target.value);
147+
}}
148+
/>
149+
<Icon path={mdiCurrencyEur} size={1.5} className="icon-with-text" />
150+
</div>
151+
<button className="reset-button" onClick={resetInput}>{t('Reset')}</button>
152+
</div>
153+
154+
];
155+
156+
}
157+
export default Converter;

src/translations/en/translation.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -602,5 +602,8 @@
602602
"wipe-length-description": "Get the latest information on the average wipe length in Escape from Tarkov. Find out how long wipes typically last, and prepare for the next wipe.",
603603
"Average Wipe Length among last 6 wipes:": "Average Wipe Length among last 6 wipes:",
604604
"Trader Ammo": "Trader Ammo",
605-
"Only show ammo available from traders on your settings": "Only show ammo available from traders on your settings"
605+
"Only show ammo available from traders on your settings": "Only show ammo available from traders on your settings",
606+
"Reset": "Reset",
607+
"Convert one currency to another": "Convert one currency to another",
608+
"Currency Converter": "Currency Converter"
606609
}

0 commit comments

Comments
 (0)