diff --git a/packages/features/shell/Shell.tsx b/packages/features/shell/Shell.tsx index 2a618f9afc..f58f089452 100644 --- a/packages/features/shell/Shell.tsx +++ b/packages/features/shell/Shell.tsx @@ -1,5 +1,6 @@ import type { User } from "@prisma/client"; import { signOut, useSession } from "next-auth/react"; +import dynamic from "next/dynamic"; import Link from "next/link"; import type { NextRouter } from "next/router"; import { useRouter } from "next/router"; @@ -16,7 +17,6 @@ import { TeamsUpgradeBanner } from "@calcom/features/ee/teams/components"; import { useFlagMap } from "@calcom/features/flags/context/provider"; import { KBarContent, KBarRoot, KBarTrigger } from "@calcom/features/kbar/Kbar"; import TimezoneChangeDialog from "@calcom/features/settings/TimezoneChangeDialog"; -import { Tips } from "@calcom/features/tips"; import AdminPasswordBanner from "@calcom/features/users/components/AdminPasswordBanner"; import CustomBranding from "@calcom/lib/CustomBranding"; import classNames from "@calcom/lib/classNames"; @@ -69,6 +69,11 @@ import { import FreshChatProvider from "../ee/support/lib/freshchat/FreshChatProvider"; import { TeamInviteBadge } from "./TeamInviteBadge"; +// need to import without ssr to prevent hydration errors +const Tips = dynamic(() => import("@calcom/features/tips").then((mod) => mod.Tips), { + ssr: false, +}); + /* TODO: Migate this */ export const ONBOARDING_INTRODUCED_AT = dayjs("September 1 2021").toISOString(); diff --git a/packages/features/tips/Tips.tsx b/packages/features/tips/Tips.tsx index 28ae03443b..c26cefd9a1 100644 --- a/packages/features/tips/Tips.tsx +++ b/packages/features/tips/Tips.tsx @@ -1,5 +1,5 @@ import { useAutoAnimate } from "@formkit/auto-animate/react"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { localStorage } from "@calcom/lib/webstorage"; @@ -96,12 +96,30 @@ export const tips = [ }, ]; +const reversedTips = tips.slice(0).reverse(); + export default function Tips() { const [animationRef] = useAutoAnimate(); const { t } = useLocale(); - const [list, setList] = useState([]); + const [list, setList] = useState(() => { + if (typeof window === "undefined") { + return reversedTips; + } + try { + const removedTipsString = localStorage.getItem("removedTipsIds"); + if (removedTipsString !== null) { + const removedTipsIds = removedTipsString.split(",").map((id) => parseInt(id, 10)); + const filteredTips = reversedTips.filter((tip) => removedTipsIds.indexOf(tip.id) === -1); + return filteredTips; + } else { + return reversedTips; + } + } catch { + return reversedTips; + } + }); const handleRemoveItem = (id: number) => { setList((currentItems) => { @@ -117,13 +135,6 @@ export default function Tips() { }); }; - useEffect(() => { - const reversedTips = tips.slice(0).reverse(); - const removedTipsString = localStorage.getItem("removedTipsIds") || ""; - const removedTipsIds = removedTipsString.split(",").map((id) => parseInt(id, 10)); - const filteredTips = reversedTips.filter((tip) => removedTipsIds.indexOf(tip.id) === -1); - setList(() => [...filteredTips]); - }, []); const baseOriginalList = list.slice(0).reverse(); return (
{learnMore && ( - + className="text-xs font-medium"> {learnMore.text} - + )}