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 })