diff --git a/src/AppRoot.js b/src/AppRoot.js index 6097049..e1c4cd7 100644 --- a/src/AppRoot.js +++ b/src/AppRoot.js @@ -13,7 +13,7 @@ import ItemsTab from './tabs/ItemsTab'; import CheckupTab from './tabs/CheckupTab'; import HistoryTab from './tabs/HistoryTab'; 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'; const emptyTripForm = () => ({ @@ -148,8 +148,8 @@ export default function AppRoot() { return; } - const activeTripId = findActiveTripId(data.trips); - setSelectedTripId(activeTripId || data.trips[0].id); + const bestTripId = findBestTripId(data.trips); + setSelectedTripId(bestTripId || data.trips[0].id); }, [data.trips, selectedTripId, loaded]); useEffect(() => { diff --git a/src/utils/date.js b/src/utils/date.js index 448f50f..99f9fca 100644 --- a/src/utils/date.js +++ b/src/utils/date.js @@ -23,3 +23,34 @@ export function findActiveTripId(trips) { }); 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; +}