import { data, redirect } from "react-router"; import { Link } from "react-router"; import { useTranslation } from "react-i18next"; import type { Route } from "./+types/feed"; import { getSessionUser } from "~/lib/auth/session.server"; import { listSocialFeed, listRecentPublicActivities } from "~/lib/activities.server"; import { ClientDate } from "~/components/ClientDate"; import { ClientMap } from "~/components/ClientMap"; type View = "followed" | "public"; export async function loader({ request }: Route.LoaderArgs) { const user = await getSessionUser(request); if (!user) throw redirect("/auth/login"); const url = new URL(request.url); const view: View = url.searchParams.get("view") === "public" ? "public" : "followed"; const rows = view === "public" ? await listRecentPublicActivities(50) : await listSocialFeed(user.id, 50); return data({ view, activities: rows.map((a) => ({ id: a.id, name: a.name, distance: a.distance, elevationGain: a.elevationGain, duration: a.duration, startedAt: a.startedAt?.toISOString() ?? null, createdAt: a.createdAt.toISOString(), geojson: a.geojson ?? null, ownerUsername: a.ownerUsername, ownerDisplayName: a.ownerDisplayName, })), }); } export function meta({ data: loaderData }: Route.MetaArgs) { const view = loaderData?.view ?? "followed"; const title = view === "public" ? "Public โ trails.cool" : "Following โ trails.cool"; return [{ title }]; } function ToggleLink({ to, active, label, }: { to: string; active: boolean; label: string; }) { return ( {label} ); } export default function Feed({ loaderData }: Route.ComponentProps) { const { view, activities } = loaderData; const { t } = useTranslation("journal"); const heading = view === "public" ? t("social.feed.public.heading") : t("social.feed.heading"); const emptyMessage = view === "public" ? t("social.feed.public.empty") : t("social.feed.empty"); return (
{emptyMessage}
{view === "followed" && ( {t("social.feed.seePublic")} )}