diff --git a/client/src/api/client.js b/client/src/api/client.js index a820ef6..cfcad6d 100644 --- a/client/src/api/client.js +++ b/client/src/api/client.js @@ -166,6 +166,10 @@ export const reservationsApi = { delete: (tripId, id) => apiClient.delete(`/trips/${tripId}/reservations/${id}`).then(r => r.data), } +export const exchangeApi = { + getRates: () => apiClient.get('/exchange-rates').then(r => r.data), +} + export const weatherApi = { get: (lat, lng, date) => apiClient.get('/weather', { params: { lat, lng, date, units: 'metric' } }).then(r => r.data), } diff --git a/client/src/components/Budget/BudgetPanel.jsx b/client/src/components/Budget/BudgetPanel.jsx index c8898f0..f410a4e 100644 --- a/client/src/components/Budget/BudgetPanel.jsx +++ b/client/src/components/Budget/BudgetPanel.jsx @@ -1,8 +1,9 @@ import React, { useState, useEffect, useRef, useMemo } from 'react' import { useTripStore } from '../../store/tripStore' import { useTranslation } from '../../i18n' -import { Plus, Trash2, Calculator, Wallet } from 'lucide-react' +import { Plus, Trash2, Calculator, Wallet, ArrowRightLeft } from 'lucide-react' import CustomSelect from '../shared/CustomSelect' +import { exchangeApi } from '../../api/client' // ── Helpers ────────────────────────────────────────────────────────────────── const CURRENCIES = ['EUR', 'USD', 'GBP', 'JPY', 'CHF', 'CZK', 'PLN', 'SEK', 'NOK', 'DKK', 'TRY', 'THB', 'AUD', 'CAD'] @@ -153,6 +154,15 @@ export default function BudgetPanel({ tripId }) { const { t, locale } = useTranslation() const [newCategoryName, setNewCategoryName] = useState('') const currency = trip?.currency || 'EUR' + const [rates, setRates] = useState(null) + const [convertTo, setConvertTo] = useState(() => { + const saved = localStorage.getItem('budget_convert_to') + return saved || (currency === 'EUR' ? 'USD' : 'EUR') + }) + + useEffect(() => { + exchangeApi.getRates().then(setRates).catch(() => {}) + }, []) const fmt = (v, cur) => fmtNum(v, locale, cur) @@ -351,6 +361,38 @@ export default function BudgetPanel({ tripId }) { {Number(grandTotal).toLocaleString(locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}