import { useLayoutEffect, useRef, useState } from "react";
import { Link } from "react-router-dom";
import { useStore } from "@/store";
import styles from "./CommercialGroup.module.css";
import Banner from "@/components/Banner";
import ParagraphSection from "@/components/layout/ParagraphSection";
import Section from "@/components/layout/Section";
import TopTabs from "@/components/layout/TopTabsSection/TopTabs";
import SectionTitle from "@/components/layout/SectionTitle";
import ScrollReveal from "@/components/ScrollReveal";
import BottomTabsSection from "@/components/layout/BottomTabsSection";
const FALLBACK_GRADIENT = "linear-gradient(135deg, #1a2a4a 0%, #2d4a7c 100%)";
function PlaceholderImage() {
return
占位图
;
}
export default function BusinessCommercialGroup() {
const appConfig = useStore((s) => s.appConfig);
const { viewDetail = "查看详情" } = appConfig?.__global__?.others
const data = appConfig?.business?.commercialGroup;
const section3Data = data?.section3Data;
const section4Data = data?.section4Data;
const [activeTabIndex, setActiveTabIndex] = useState(0);
const [activeFeaturesTabIndex, setActiveFeaturesTabIndex] = useState(0);
const featuresHeroTabsRef = useRef(null);
const featuresTabItemRefs = useRef<(HTMLDivElement | null)[]>([]);
const [featuresTabIndicator, setFeaturesTabIndicator] = useState({ x: 0, width: 0 });
const featuresFirstBg = section3Data?.tabItems?.[0]?.backgroundImage ?? "";
const [featuresBg, setFeaturesBg] = useState({
a: featuresFirstBg,
b: featuresFirstBg,
showA: true,
});
useLayoutEffect(() => {
if (!section3Data?.tabItems?.length) return;
const next = section3Data.tabItems[activeFeaturesTabIndex]?.backgroundImage ?? "";
setFeaturesBg((prev) => {
const visible = prev.showA ? prev.a : prev.b;
if (next === visible) return prev;
// 数据首帧就绪:直接铺满两层,避免从空图做一次淡入
if (!visible && next) {
return { a: next, b: next, showA: true };
}
if (prev.showA) {
return { ...prev, b: next, showA: false };
}
return { ...prev, a: next, showA: true };
});
}, [activeFeaturesTabIndex, section3Data]);
useLayoutEffect(() => {
if (!section3Data?.tabItems?.length) return;
const root = featuresHeroTabsRef.current;
if (!root) return;
const updateIndicator = () => {
const tab = featuresTabItemRefs.current[activeFeaturesTabIndex];
if (!tab) return;
const rootRect = root.getBoundingClientRect();
const tabRect = tab.getBoundingClientRect();
setFeaturesTabIndicator({
x: tabRect.left - rootRect.left,
width: tabRect.width,
});
};
updateIndicator();
const ro = new ResizeObserver(updateIndicator);
ro.observe(root);
window.addEventListener("resize", updateIndicator);
return () => {
ro.disconnect();
window.removeEventListener("resize", updateIndicator);
};
}, [activeFeaturesTabIndex, section3Data?.tabItems]);
if (!data) return null;
const banner = data.banner;
const section1Data = data.section1Data;
const section2Data = data.section2Data;
return (
{section1Data &&
}
{section3Data &&
}
{
section4Data.hide ? null : (
{section4Data?.title}
{section4Data?.content}
{viewDetail}
)
}
);
}