From 691e0bae8e5bb7f55c58e0f4fc97c19d6b253bc3 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Thu, 19 Mar 2026 20:38:40 +0200 Subject: [PATCH] Render nothing for timestamps on the sidebar in SSR (try to fix bad times, hydration weirdness?) --- app/components/StreamListItems.tsx | 4 ++++ app/components/layout/index.tsx | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/components/StreamListItems.tsx b/app/components/StreamListItems.tsx index 9b60b5a8e..e6891bf21 100644 --- a/app/components/StreamListItems.tsx +++ b/app/components/StreamListItems.tsx @@ -4,6 +4,7 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import { useFetcher } from "react-router"; import type { SidebarStream } from "~/features/core/streams/streams.server"; +import { useIsMounted } from "~/hooks/useIsMounted"; import type { LanguageCode } from "~/modules/i18n/config"; import { databaseTimestampToDate, formatDistanceToNow } from "~/utils/dates"; import { navIconUrl, tournamentRegisterPage } from "~/utils/urls"; @@ -24,6 +25,7 @@ export function StreamListItems({ savedTournamentIds?: number[]; }) { const { t, i18n } = useTranslation(["front"]); + const isMounted = useIsMounted(); const formatRelativeDate = (timestamp: number) => { const date = new Date(timestamp * 1000); @@ -92,6 +94,8 @@ export function StreamListItems({ ) : stream.subtitle ? ( stream.subtitle + ) : !isMounted ? ( + Placeholder ) : isUpcoming ? ( formatRelativeDate(stream.startsAt) ) : ( diff --git a/app/components/layout/index.tsx b/app/components/layout/index.tsx index eaae79c41..7f48d0245 100644 --- a/app/components/layout/index.tsx +++ b/app/components/layout/index.tsx @@ -24,6 +24,7 @@ import { Link, useFetcher, useLocation, useMatches } from "react-router"; import { useUser } from "~/features/auth/core/user"; import { useChatContext } from "~/features/chat/useChatContext"; import { FriendMenu } from "~/features/friends/components/FriendMenu"; +import { useIsMounted } from "~/hooks/useIsMounted"; import type { RootLoaderData } from "~/root"; import type { Breadcrumb, SendouRouteHandle } from "~/utils/remix.server"; import { @@ -212,6 +213,7 @@ export function Layout({ const { t } = useTranslation(["front", "common"]); const { formatRelativeDate } = useTimeFormat(); + const isMounted = useIsMounted(); const location = useLocation(); const headerRef = React.useRef(null); const navOffset = useNavOffset(headerRef); @@ -275,7 +277,13 @@ export function Layout({ key={`${event.type}-${event.id}`} to={event.url} imageUrl={event.logoUrl ?? undefined} - subtitle={formatRelativeDate(event.startTime)} + subtitle={ + isMounted ? ( + formatRelativeDate(event.startTime) + ) : ( + Placeholder + ) + } > {event.scrimStatus === "booked" ? t("front:sideNav.scrimVs", { opponent: event.name })