diff --git a/client/src/components/Dashboard/CurrencyWidget.tsx b/client/src/components/Dashboard/CurrencyWidget.tsx index 6162fc0..dbb841f 100644 --- a/client/src/components/Dashboard/CurrencyWidget.tsx +++ b/client/src/components/Dashboard/CurrencyWidget.tsx @@ -4,11 +4,17 @@ import { useTranslation } from '../../i18n' import CustomSelect from '../shared/CustomSelect' const CURRENCIES = [ - 'EUR','USD','GBP','JPY','CHF','CAD','AUD','NZD','CNY','HKD', - 'SGD','THB','TRY','SEK','NOK','DKK','PLN','CZK','HUF','RON', - 'BGN','HRK','ISK','RUB','UAH','BRL','MXN','ARS','CLP','COP', - 'INR','IDR','MYR','PHP','KRW','TWD','VND','ZAR','EGP','MAD', - 'NGN','KES','AED','SAR','QAR','KWD','BHD','OMR','ILS', + 'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', + 'BIF', 'BMD', 'BND', 'BOB', 'BRL', 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHF', 'CLF', 'CLP', + 'CNH', 'CNY', 'COP', 'CRC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB', 'EUR', + 'FJD', 'FKP', 'FOK', 'GBP', 'GEL', 'GGP', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', + 'HTG', 'HUF', 'IDR', 'ILS', 'IMP', 'INR', 'IQD', 'ISK', 'JEP', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', + 'KID', 'KMF', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', + 'MKD', 'MMK', 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', + 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', + 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP', 'SLE', 'SOS', 'SRD', 'SSP', 'STN', 'SYP', 'SZL', 'THB', + 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TVD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'UYU', 'UZS', 'VES', + 'VND', 'VUV', 'WST', 'XAF', 'XCD', 'XDR', 'XOF', 'XPF', 'YER', 'ZAR', 'ZMW', 'ZWL' ] const CURRENCY_OPTIONS = CURRENCIES.map(c => ({ value: c, label: c })) diff --git a/client/src/pages/DashboardPage.tsx b/client/src/pages/DashboardPage.tsx index a0225ca..6206fbc 100644 --- a/client/src/pages/DashboardPage.tsx +++ b/client/src/pages/DashboardPage.tsx @@ -10,6 +10,7 @@ import DemoBanner from '../components/Layout/DemoBanner' import CurrencyWidget from '../components/Dashboard/CurrencyWidget' import TimezoneWidget from '../components/Dashboard/TimezoneWidget' import TripFormModal from '../components/Trips/TripFormModal' +import ConfirmDialog from '../components/shared/ConfirmDialog' import { useToast } from '../components/shared/Toast' import { Plus, Calendar, Trash2, Edit2, Map, ChevronDown, ChevronUp, @@ -435,11 +436,11 @@ function ArchivedRow({ trip, onEdit, onUnarchive, onDelete, onClick, t, locale, return (
onClick(trip)} style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '10px 16px', - borderRadius: 12, border: '1px solid #f3f4f6', background: 'white', cursor: 'pointer', + borderRadius: 12, border: '1px solid var(--border-faint)', background: 'var(--bg-card)', cursor: 'pointer', transition: 'border-color 0.12s', }} - onMouseEnter={e => e.currentTarget.style.borderColor = '#e5e7eb'} - onMouseLeave={e => e.currentTarget.style.borderColor = '#f3f4f6'}> + onMouseEnter={e => e.currentTarget.style.borderColor = 'var(--border-primary)'} + onMouseLeave={e => e.currentTarget.style.borderColor = 'var(--border-faint)'}> {/* Mini cover */}
- {trip.title} - {!trip.is_owner && {t('dashboard.shared')}} + {trip.title} + {!trip.is_owner && {t('dashboard.shared')}}
{trip.start_date && (
@@ -537,6 +538,7 @@ export default function DashboardPage(): React.ReactElement { const [showArchived, setShowArchived] = useState(false) const [showWidgetSettings, setShowWidgetSettings] = useState(false) const [viewMode, setViewMode] = useState<'grid' | 'list'>(() => (localStorage.getItem('trek_dashboard_view') as 'grid' | 'list') || 'grid') + const [deleteTrip, setDeleteTrip] = useState(null) const toggleViewMode = () => { setViewMode(prev => { @@ -606,16 +608,18 @@ export default function DashboardPage(): React.ReactElement { } } - const handleDelete = async (trip) => { - if (!confirm(t('dashboard.confirm.delete', { title: trip.title }))) return + const handleDelete = (trip) => setDeleteTrip(trip) + const confirmDelete = async () => { + if (!deleteTrip) return try { - await tripsApi.delete(trip.id) - setTrips(prev => prev.filter(t => t.id !== trip.id)) - setArchivedTrips(prev => prev.filter(t => t.id !== trip.id)) + await tripsApi.delete(deleteTrip.id) + setTrips(prev => prev.filter(t => t.id !== deleteTrip.id)) + setArchivedTrips(prev => prev.filter(t => t.id !== deleteTrip.id)) toast.success(t('dashboard.toast.deleted')) } catch { toast.error(t('dashboard.toast.deleteError')) } + setDeleteTrip(null) } const handleArchive = async (id) => { @@ -904,6 +908,14 @@ export default function DashboardPage(): React.ReactElement { onCoverUpdate={handleCoverUpdate} /> + setDeleteTrip(null)} + onConfirm={confirmDelete} + title={t('common.delete')} + message={t('dashboard.confirm.delete', { title: deleteTrip?.title || '' })} + /> +