Commit 2db01c10 authored by Lê Bảo Hồng Đức's avatar Lê Bảo Hồng Đức

fix route member,partner

parent edf548f8
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import { useHomePosts } from "@/app/(main)/(home)/lib/use-home-posts"; import { useHomePosts } from "@/app/(main)/(home)/lib/use-home-posts";
import ImageNext from "@/components/shared/image-next"; import ImageNext from "@/components/shared/image-next";
import memberImages from "@/constants/memberImages"; import memberImages from "@/constants/memberImages";
import { MOCK_FEATURED_MEMBERS_RESPONSE } from "@/app/api/mock-data";
import Link from "next/link"; import Link from "next/link";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Autoplay } from "swiper/modules"; import { Autoplay } from "swiper/modules";
...@@ -84,16 +85,28 @@ function Members() { ...@@ -84,16 +85,28 @@ function Members() {
const rows = data.responseData?.rows ?? []; const rows = data.responseData?.rows ?? [];
if (isMounted) { if (isMounted) {
setFeaturedMembers( if (rows.length > 0) {
rows.length > 0 setFeaturedMembers({ status: "ready", rows });
? { status: "ready", rows } } else {
: { status: "empty" }, // API trả về rỗng → dùng mock data
); const mockRows = MOCK_FEATURED_MEMBERS_RESPONSE.responseData?.rows ?? [];
setFeaturedMembers(
mockRows.length > 0
? { status: "ready", rows: mockRows as FeaturedMember[] }
: { status: "empty" },
);
}
} }
} catch (error) { } catch (error) {
console.error(error); console.error(error);
if (isMounted) { if (isMounted) {
setFeaturedMembers({ status: "empty" }); // Fallback: dùng mock data thay vì hiển thị "Chưa có thông tin"
const mockRows = MOCK_FEATURED_MEMBERS_RESPONSE.responseData?.rows ?? [];
setFeaturedMembers(
mockRows.length > 0
? { status: "ready", rows: mockRows as FeaturedMember[] }
: { status: "empty" },
);
} }
} }
}; };
......
...@@ -5,6 +5,7 @@ import ImageNext from "@/components/shared/image-next"; ...@@ -5,6 +5,7 @@ import ImageNext from "@/components/shared/image-next";
import partnerImages from "@/constants/partnerImages"; import partnerImages from "@/constants/partnerImages";
import { ChevronRight, Play } from "lucide-react"; import { ChevronRight, Play } from "lucide-react";
import Link from "next/link"; import Link from "next/link";
import { MOCK_PARTNERS_RESPONSE } from "@/app/api/mock-data";
import { fetchClientVideos } from "@/lib/api/videos"; import { fetchClientVideos } from "@/lib/api/videos";
import { Autoplay } from "swiper/modules"; import { Autoplay } from "swiper/modules";
import { Swiper, SwiperSlide } from "swiper/react"; import { Swiper, SwiperSlide } from "swiper/react";
...@@ -110,24 +111,36 @@ function VideoAndPartners() { ...@@ -110,24 +111,36 @@ function VideoAndPartners() {
const partnersQuery = useQuery({ const partnersQuery = useQuery({
queryKey: ["home-partners"], queryKey: ["home-partners"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(PARTNER_API_URL, { try {
cache: "no-store", const response = await fetch(PARTNER_API_URL, {
}); cache: "no-store",
});
if (!response.ok) {
throw new Error(`Cannot load partners: ${response.status}`); if (!response.ok) {
throw new Error(`Cannot load partners: ${response.status}`);
}
const data = (await response.json()) as PartnerResponse;
const rows = data.responseData?.rows ?? [];
// API trả về rỗng → dùng mock data
if (rows.length === 0) {
return MOCK_PARTNERS_RESPONSE as unknown as PartnerResponse;
}
return data;
} catch (error) {
console.error(error);
// Fallback: dùng mock data thay vì hiển thị "Chưa có thông tin"
return MOCK_PARTNERS_RESPONSE as unknown as PartnerResponse;
} }
return (await response.json()) as PartnerResponse;
}, },
staleTime: 60 * 1000, staleTime: 60 * 1000,
}); });
const videos = videosQuery.data?.rows ?? []; const videos = videosQuery.data?.rows ?? [];
const partners = partnersQuery.data?.responseData?.rows?.slice(0, 12) ?? []; const partners = partnersQuery.data?.responseData?.rows?.slice(0, 12) ?? [];
const hasPartnerError = partnersQuery.isError; const displayPartners = partners;
const displayPartners =
hasPartnerError || partners.length === 0 ? [] : partners;
return ( return (
<section className="flex flex-col gap-6 pb-10 xl:flex-row xl:items-stretch"> <section className="flex flex-col gap-6 pb-10 xl:flex-row xl:items-stretch">
......
...@@ -14,6 +14,7 @@ export type MockMember = { ...@@ -14,6 +14,7 @@ export type MockMember = {
id: string; id: string;
name: string; name: string;
avatar: string | null; avatar: string | null;
org_link?: string | null;
}; };
export type MockPartner = { export type MockPartner = {
...@@ -24,30 +25,49 @@ export type MockPartner = { ...@@ -24,30 +25,49 @@ export type MockPartner = {
}; };
export const MOCK_FEATURED_MEMBERS_RESPONSE = { export const MOCK_FEATURED_MEMBERS_RESPONSE = {
message: "Thành công",
message_en: "Success",
responseData: { responseData: {
count: 12,
rows: [ rows: [
{ id: "mock-member-1", name: "Công ty Cổ phần Vinamilk", avatar: "/home/hoi-vien-tieu-bieu/1.webp" }, { id: "510874bb-c21e-46bb-a10c-4a6a38e8dfaf", name: "CÔNG TY TNHH TS FOOD", avatar: "/images/file-1758697746552-33046631.png", org_link: "cong-ty-tnhh-ts-food" },
{ id: "mock-member-2", name: "Tập đoàn Bất động sản Novaland", avatar: "/home/hoi-vien-tieu-bieu/2.webp" }, { id: "287ae371-026b-47de-b66c-234199587bb6", name: "GIÀY SÀI GÒN", avatar: null, org_link: "giay-sai-gon" },
{ id: "mock-member-3", name: "Công ty TNHH Samsung Electronics Việt Nam", avatar: "/home/hoi-vien-tieu-bieu/3.webp" }, { id: "751244a4-8fd5-4a42-be5c-78fdd65585dd", name: "ĐIỆN TỬ BÌNH HÒA", avatar: "/images/file-1758698015144-415446655.jpg", org_link: "dien-tu-binh-hoa" },
{ id: "mock-member-4", name: "Ngân hàng TMCP Ngoại thương Việt Nam (Vietcombank)", avatar: "/home/hoi-vien-tieu-bieu/4.webp" }, { id: "f64a11ee-120a-463a-98a3-cfe3d18cd314", name: "SX & XNK LÂM SẢN SÀI GÒN", avatar: "/images/file-1758698161010-423507076.jpg", org_link: "sx-and-xnk-lam-san-sai-gon" },
{ id: "mock-member-5", name: "Công ty Cổ phần FPT", avatar: "/home/hoi-vien-tieu-bieu/5.webp" }, { id: "83f256e7-cd72-484b-a67b-58bfa0d554f9", name: "XNK NHÀ BÈ", avatar: null, org_link: "xnk-nha-be" },
{ id: "mock-member-6", name: "Tập đoàn Vingroup", avatar: "/home/hoi-vien-tieu-bieu/6.webp" }, { id: "5598d12b-51f4-4bdb-9181-35f2d00083d9", name: "MAY BÌNH MINH", avatar: "/images/file-1758726645642-332196442.png", org_link: "may-binh-minh" },
{ id: "mock-member-7", name: "Công ty Cổ phần Thủy sản Minh Phú", avatar: "/home/hoi-vien-tieu-bieu/7.webp" }, { id: "4e4b634f-c28c-4399-be79-39aa0fe66690", name: "MAI QUỐC TRƯỞNG", avatar: "/images/file-1758702157261-405990094.png", org_link: "mai-quoc-truong" },
{ id: "mock-member-8", name: "Tập đoàn Dệt may Việt Nam (Vinatex)", avatar: "/home/hoi-vien-tieu-bieu/8.webp" }, { id: "67349914-df32-4109-a147-dc58cd14451c", name: "NHỰA - CƠ KHÍ VÀ THƯƠNG MẠI CHẤN THUẬN THÀNH", avatar: "/images/file-1758702821624-606612949.png", org_link: "nhua-co-khi-va-thuong-mai-chan-thuan-thanh" },
{ id: "mock-member-9", name: "Công ty Cổ phần Hàng không VietJet", avatar: "/home/hoi-vien-tieu-bieu/9.webp" }, { id: "412b822c-7334-41f8-87c9-5aaf827dfbe0", name: "ĐỘNG CƠ VÀ MÁY NÔNG NGHIỆP MIỀN NAM", avatar: "/images/file-1758702582389-590874740.png", org_link: "dong-co-va-may-nong-nghiep-mien-nam" },
{ id: "419b3850-7ed2-4eb9-bb05-281003b90c71", name: "XNK ĐỒNG NAI", avatar: null, org_link: "xnk-dong-nai" },
{ id: "71a8e5cf-261f-4b00-9885-0cfb9f87ffc4", name: "THÉP VIỆT NAM", avatar: "/images/file-1758702464469-173235870.png", org_link: "thep-viet-nam" },
{ id: "3267d46b-9c96-40f7-ac92-be3e5ff87c7d", name: "DV DU LỊCH BẾN THÀNH", avatar: "/images/file-1758702701486-209564591.png", org_link: "dv-du-lich-ben-thanh" },
] satisfies MockMember[], ] satisfies MockMember[],
totalPages: 162,
currentPage: 1,
}, },
status: "success",
timeStamp: "2026-08-13 18:58:05",
violations: null,
}; };
export const MOCK_PARTNERS_RESPONSE = { export const MOCK_PARTNERS_RESPONSE = {
message: "Thành công",
message_en: "Success",
responseData: { responseData: {
count: 1,
rows: [ rows: [
{ id: "mock-partner-1", name: "Đối tác 1", avatar: "/home/doi-tac/1.webp", website: "https://example.com" }, {
{ id: "mock-partner-2", name: "Đối tác 2", avatar: "/home/doi-tac/2.webp", website: "https://example.com" }, id: "015bda60-bf37-4a5e-89f9-db0f53c4e400",
{ id: "mock-partner-3", name: "Đối tác 3", avatar: "/home/doi-tac/3.webp", website: null }, name: "MeU Solutions",
{ id: "mock-partner-4", name: "Đối tác 4", avatar: "/home/doi-tac/4.webp", website: null }, avatar: "/images/file-1744964940742-32154072.jpg",
{ id: "mock-partner-5", name: "Đối tác 5", avatar: "/home/doi-tac/5.webp", website: null }, website: "https://meu-solutions.com/",
{ id: "mock-partner-6", name: "Đối tác 6", avatar: "/home/doi-tac/6.webp", website: null }, },
] satisfies MockPartner[], ] satisfies MockPartner[],
totalPages: 1,
currentPage: 1,
}, },
status: "success",
timeStamp: "2026-08-13 18:57:58",
violations: null,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment