fix: show membership date for stores without pickups

Treat Foodsharing's zero lastFetch value as no pickup, store memberSince, and
show compact, visible mobile status information without hover tooltips.
This commit is contained in:
2026-08-05 20:22:18 +02:00
parent a64bfe2d3f
commit 61c2488a1e
8 changed files with 121 additions and 35 deletions

View File

@@ -9,14 +9,28 @@ const FILTER_OPTIONS = [
{ value: 'inactive', label: 'Inaktiv' }
];
const formatLastPickup = (value) => {
const date = new Date(value);
if (!value || Number.isNaN(date.getTime())) {
return { relative: 'Unbekannt', exact: null };
const formatDate = (date) => date.toLocaleDateString('de-DE', {
day: '2-digit',
month: '2-digit',
year: 'numeric'
});
const formatLastPickup = (lastPickupAt, memberSinceAt) => {
const date = new Date(lastPickupAt);
if (!lastPickupAt || Number.isNaN(date.getTime()) || date.getTime() <= 0) {
const memberSince = new Date(memberSinceAt);
return {
state: 'never',
memberSince: memberSinceAt && !Number.isNaN(memberSince.getTime())
? formatDate(memberSince)
: null
};
}
const ageDays = (Date.now() - date.getTime()) / (1000 * 60 * 60 * 24);
return {
state: ageDays >= 90 ? 'stale' : 'current',
relative: formatDistanceToNowStrict(date, { addSuffix: true, locale: de }),
exact: date.toLocaleDateString('de-DE')
exact: formatDate(date)
};
};
@@ -97,7 +111,7 @@ const MobileConfigList = ({
{filteredEntries.map((entry) => {
const range = entry.desiredDateRange || (entry.desiredDate ? { start: entry.desiredDate, end: entry.desiredDate } : null);
const slots = formatRegularPickup(regularPickupMap?.[entry.id]);
const lastPickup = formatLastPickup(entry.lastPickupAt);
const lastPickup = formatLastPickup(entry.lastPickupAt, entry.memberSinceAt);
return (
<article
key={entry.id}
@@ -109,8 +123,16 @@ const MobileConfigList = ({
<h3 className="mobile-config-card__title">{entry.label || `Store ${entry.id}`}</h3>
<p className="mobile-config-card__id">#{entry.id}</p>
{slots && <p className="mobile-config-card__slots">Slots: {slots}</p>}
<p className="mobile-config-card__last-pickup" title={lastPickup.exact || undefined}>
Letzte Abholung: <strong>{lastPickup.relative}</strong>
<p className={`mobile-config-card__last-pickup mobile-config-card__last-pickup--${lastPickup.state}`}>
{lastPickup.state === 'never' ? (
<>
Noch nicht abgeholt{lastPickup.memberSince && <> · Beitritt: <strong>{lastPickup.memberSince}</strong></>}
</>
) : (
<>
Letzte Abholung: <strong>{lastPickup.relative}</strong> · {lastPickup.exact}
</>
)}
</p>
</div>
<a