diff --git a/apps/journal/app/lib/activities.server.ts b/apps/journal/app/lib/activities.server.ts index 7f9f9dc..014362a 100644 --- a/apps/journal/app/lib/activities.server.ts +++ b/apps/journal/app/lib/activities.server.ts @@ -125,13 +125,17 @@ async function getImportSource(activityId: string): Promise<{ provider: string; return row ?? null; } -export async function listActivities(ownerId: string) { +export async function listActivities( + ownerId: string, + sort: "startedAt" | "addedAt" = "startedAt", +) { const db = getDb(); + const order = sort === "addedAt" ? desc(activities.createdAt) : desc(activities.startedAt); const rows = await db .select() .from(activities) .where(eq(activities.ownerId, ownerId)) - .orderBy(desc(activities.createdAt)); + .orderBy(order); const ids = rows.map((r) => r.id); const geojsonMap = ids.length > 0 ? await getSimplifiedActivityGeojsonBatch(ids) : new Map(); diff --git a/apps/journal/app/routes/activities._index.tsx b/apps/journal/app/routes/activities._index.tsx index 78e3526..0cb19e4 100644 --- a/apps/journal/app/routes/activities._index.tsx +++ b/apps/journal/app/routes/activities._index.tsx @@ -10,8 +10,13 @@ export async function loader({ request }: Route.LoaderArgs) { const user = await getSessionUser(request); if (!user) return redirect("/auth/login"); - const userActivities = await listActivities(user.id); + const url = new URL(request.url); + const sortParam = url.searchParams.get("sort"); + const activitySort = sortParam === "addedAt" ? "addedAt" : ("startedAt" as const); + + const userActivities = await listActivities(user.id, activitySort); return data({ + activitySort, activities: userActivities.map((a) => ({ id: a.id, name: a.name, @@ -30,19 +35,37 @@ export function meta(_args: Route.MetaArgs) { } export default function ActivitiesListPage({ loaderData }: Route.ComponentProps) { - const { activities } = loaderData; + const { activities, activitySort } = loaderData; const { t } = useTranslation("journal"); return (