fix issue

A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
This commit is contained in:
2025-12-17 16:36:20 +03:00
parent adcab9eb3c
commit 323a5665fe

View File

@@ -8,7 +8,7 @@ import {
ProjectOutlined, ProjectOutlined,
RocketOutlined, RocketOutlined,
StarOutlined, StarOutlined,
TeamOutlined TeamOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
import { Card, Col, Row, Statistic, Typography } from "antd"; import { Card, Col, Row, Statistic, Typography } from "antd";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
@@ -22,21 +22,26 @@ import styles from "./page.module.css";
const { Title, Paragraph } = Typography; const { Title, Paragraph } = Typography;
export default function Home() { export default function Home() {
const [userPreferences, setUserPreferences] = useState<string[]>(() => { // Keep the initial render identical between server and client to avoid hydration mismatches.
try { // We'll read localStorage after mount.
const storedPreferences = localStorage.getItem("userPreferences"); const [, setUserPreferences] = useState<string[]>([]);
return storedPreferences ? JSON.parse(storedPreferences) : []; const [showPreferences, setShowPreferences] = useState(true);
} catch {
return [];
}
});
const [showPreferences, setShowPreferences] = useState(
() => userPreferences.length === 0,
);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
useEffect(() => { useEffect(() => {
// Reading localStorage can only happen on the client; do it after mount.
try {
const storedPreferences = localStorage.getItem("userPreferences");
if (storedPreferences) {
/* eslint-disable react-hooks/set-state-in-effect */
setUserPreferences(JSON.parse(storedPreferences));
setShowPreferences(false);
/* eslint-enable react-hooks/set-state-in-effect */
}
} catch {
// ignore invalid JSON / access errors
}
// Simulate loading of resources // Simulate loading of resources
const timer = setTimeout(() => { const timer = setTimeout(() => {
setLoading(false); setLoading(false);
@@ -61,7 +66,7 @@ export default function Home() {
<div className={styles.loaderOrb2}></div> <div className={styles.loaderOrb2}></div>
<div className={styles.loaderOrb3}></div> <div className={styles.loaderOrb3}></div>
</div> </div>
<div className={styles.loaderContent}> <div className={styles.loaderContent}>
<div className={styles.logoContainer}> <div className={styles.logoContainer}>
<div className={styles.logoIcon}> <div className={styles.logoIcon}>
@@ -72,7 +77,7 @@ export default function Home() {
<span className={styles.logoSubtitle}>Masters</span> <span className={styles.logoSubtitle}>Masters</span>
</div> </div>
</div> </div>
<div className={styles.loaderAnimation}> <div className={styles.loaderAnimation}>
<div className={styles.loaderDots}> <div className={styles.loaderDots}>
<div className={styles.dot}></div> <div className={styles.dot}></div>
@@ -80,7 +85,7 @@ export default function Home() {
<div className={styles.dot}></div> <div className={styles.dot}></div>
</div> </div>
</div> </div>
<div className={styles.loaderText}> <div className={styles.loaderText}>
<Title level={4} className={styles.loaderTitle}> <Title level={4} className={styles.loaderTitle}>
Preparing Your Experience Preparing Your Experience
@@ -113,10 +118,11 @@ export default function Home() {
Our Services Our Services
</Title> </Title>
<Paragraph className={styles.sectionSubtitle}> <Paragraph className={styles.sectionSubtitle}>
We offer comprehensive solutions to transform your digital presence and drive business growth We offer comprehensive solutions to transform your digital
presence and drive business growth
</Paragraph> </Paragraph>
</div> </div>
<Row gutter={[32, 32]} className={styles.servicesGrid}> <Row gutter={[32, 32]} className={styles.servicesGrid}>
<Col xs={24} sm={12} lg={8}> <Col xs={24} sm={12} lg={8}>
<Card className={styles.serviceCard} hoverable> <Card className={styles.serviceCard} hoverable>
@@ -127,7 +133,8 @@ export default function Home() {
Web Development Web Development
</Title> </Title>
<Paragraph className={styles.serviceDescription}> <Paragraph className={styles.serviceDescription}>
Custom web applications built with modern technologies and best practices for optimal performance and user experience. Custom web applications built with modern technologies and
best practices for optimal performance and user experience.
</Paragraph> </Paragraph>
<ul className={styles.serviceFeatures}> <ul className={styles.serviceFeatures}>
<li>Responsive Design</li> <li>Responsive Design</li>
@@ -137,7 +144,7 @@ export default function Home() {
</ul> </ul>
</Card> </Card>
</Col> </Col>
<Col xs={24} sm={12} lg={8}> <Col xs={24} sm={12} lg={8}>
<Card className={styles.serviceCard} hoverable> <Card className={styles.serviceCard} hoverable>
<div className={styles.serviceIcon}> <div className={styles.serviceIcon}>
@@ -147,7 +154,8 @@ export default function Home() {
Mobile Development Mobile Development
</Title> </Title>
<Paragraph className={styles.serviceDescription}> <Paragraph className={styles.serviceDescription}>
Native and cross-platform mobile applications that deliver exceptional user experiences across all devices. Native and cross-platform mobile applications that deliver
exceptional user experiences across all devices.
</Paragraph> </Paragraph>
<ul className={styles.serviceFeatures}> <ul className={styles.serviceFeatures}>
<li>iOS & Android Apps</li> <li>iOS & Android Apps</li>
@@ -157,7 +165,7 @@ export default function Home() {
</ul> </ul>
</Card> </Card>
</Col> </Col>
<Col xs={24} sm={12} lg={8}> <Col xs={24} sm={12} lg={8}>
<Card className={styles.serviceCard} hoverable> <Card className={styles.serviceCard} hoverable>
<div className={styles.serviceIcon}> <div className={styles.serviceIcon}>
@@ -167,7 +175,8 @@ export default function Home() {
UI/UX Design UI/UX Design
</Title> </Title>
<Paragraph className={styles.serviceDescription}> <Paragraph className={styles.serviceDescription}>
User-centered design solutions that create intuitive, engaging, and conversion-focused digital experiences. User-centered design solutions that create intuitive,
engaging, and conversion-focused digital experiences.
</Paragraph> </Paragraph>
<ul className={styles.serviceFeatures}> <ul className={styles.serviceFeatures}>
<li>User Research</li> <li>User Research</li>
@@ -189,10 +198,11 @@ export default function Home() {
Our Impact Our Impact
</Title> </Title>
<Paragraph className={styles.sectionSubtitle}> <Paragraph className={styles.sectionSubtitle}>
Numbers that speak for themselves - our commitment to excellence in every project Numbers that speak for themselves - our commitment to excellence
in every project
</Paragraph> </Paragraph>
</div> </div>
<Row gutter={[48, 32]} className={styles.statsGrid}> <Row gutter={[48, 32]} className={styles.statsGrid}>
<Col xs={12} sm={6}> <Col xs={12} sm={6}>
<div className={styles.statCard}> <div className={styles.statCard}>
@@ -207,7 +217,7 @@ export default function Home() {
/> />
</div> </div>
</Col> </Col>
<Col xs={12} sm={6}> <Col xs={12} sm={6}>
<div className={styles.statCard}> <div className={styles.statCard}>
<div className={styles.statIcon}> <div className={styles.statIcon}>
@@ -221,7 +231,7 @@ export default function Home() {
/> />
</div> </div>
</Col> </Col>
<Col xs={12} sm={6}> <Col xs={12} sm={6}>
<div className={styles.statCard}> <div className={styles.statCard}>
<div className={styles.statIcon}> <div className={styles.statIcon}>
@@ -236,7 +246,7 @@ export default function Home() {
/> />
</div> </div>
</Col> </Col>
<Col xs={12} sm={6}> <Col xs={12} sm={6}>
<div className={styles.statCard}> <div className={styles.statCard}>
<div className={styles.statIcon}> <div className={styles.statIcon}>