feat: auto-select active or next trip by date
Some checks failed
Luggage List Build / build-web (push) Successful in 35s
Luggage List Build / release (push) Has been cancelled
Luggage List Build / build-android (push) Has been cancelled

This commit is contained in:
2026-04-18 14:41:24 +02:00
parent f28ff010d7
commit 2417d2d597
2 changed files with 34 additions and 3 deletions

View File

@@ -13,7 +13,7 @@ import ItemsTab from './tabs/ItemsTab';
import CheckupTab from './tabs/CheckupTab'; import CheckupTab from './tabs/CheckupTab';
import HistoryTab from './tabs/HistoryTab'; import HistoryTab from './tabs/HistoryTab';
import { emptyData, STORAGE_KEY } from './constants'; import { emptyData, STORAGE_KEY } from './constants';
import { findActiveTripId, makeId, parseYMD, todayYMD } from './utils/date'; import { findBestTripId, makeId, parseYMD, todayYMD } from './utils/date';
import { styles } from './styles'; import { styles } from './styles';
const emptyTripForm = () => ({ const emptyTripForm = () => ({
@@ -148,8 +148,8 @@ export default function AppRoot() {
return; return;
} }
const activeTripId = findActiveTripId(data.trips); const bestTripId = findBestTripId(data.trips);
setSelectedTripId(activeTripId || data.trips[0].id); setSelectedTripId(bestTripId || data.trips[0].id);
}, [data.trips, selectedTripId, loaded]); }, [data.trips, selectedTripId, loaded]);
useEffect(() => { useEffect(() => {

View File

@@ -23,3 +23,34 @@ export function findActiveTripId(trips) {
}); });
return active?.id || null; return active?.id || null;
} }
export function findNextTripId(trips) {
const today = parseYMD(todayYMD());
if (!today) return null;
const next = trips
.map((trip) => ({ id: trip.id, start: parseYMD(trip.startDate) }))
.filter((trip) => !!trip.start && trip.start >= today)
.sort((a, b) => a.start - b.start)[0];
return next?.id || null;
}
export function findBestTripId(trips) {
const activeTripId = findActiveTripId(trips);
if (activeTripId) return activeTripId;
const nextTripId = findNextTripId(trips);
if (nextTripId) return nextTripId;
const latestPast = trips
.map((trip) => ({ id: trip.id, end: parseYMD(trip.endDate), start: parseYMD(trip.startDate) }))
.filter((trip) => !!trip.end || !!trip.start)
.sort((a, b) => {
const aTime = (a.end || a.start).getTime();
const bTime = (b.end || b.start).getTime();
return bTime - aTime;
})[0];
return latestPast?.id || null;
}