391 lines
13 KiB
TypeScript
391 lines
13 KiB
TypeScript
import {
|
|
Button,
|
|
Card,
|
|
CardBody,
|
|
CardFooter,
|
|
Image,
|
|
Tab,
|
|
Tabs,
|
|
} from "@heroui/react";
|
|
import React, { useEffect, useState } from "react";
|
|
import { Swiper, SwiperSlide } from "swiper/react";
|
|
import "swiper/css";
|
|
import "swiper/css/navigation";
|
|
import "swiper/css/pagination";
|
|
import { Navigation, Pagination } from "swiper/modules";
|
|
import { topNewsMediahub } from "@/service/medol-news-update";
|
|
import Link from "next/link";
|
|
import {
|
|
getImageInp,
|
|
inpLogin,
|
|
topNewsInp,
|
|
topNewsTbn,
|
|
} from "@/service/third-party-service";
|
|
import { convertDateFormatNoTime, textEllipsis } from "@/utils/global";
|
|
import PolriTvWidget from "../ui/social-media/polri-tv";
|
|
import { useTranslations } from "next-intl";
|
|
|
|
export default function MedolUpdate() {
|
|
const [selectedTab, setSelectedTab] = useState<any>("mediahub");
|
|
const [mediahubUpdate, setMediahubUpdate] = useState<any>([]);
|
|
const [tbnUpdate, setTbnUpdate] = useState([]);
|
|
const [inpUpdate, setInpUpdate] = useState([]);
|
|
|
|
const t = useTranslations("Landing");
|
|
|
|
useEffect(() => {
|
|
if (selectedTab === "mediahub" && mediahubUpdate?.length < 1) {
|
|
getMedihubUpdate();
|
|
}
|
|
if (selectedTab === "tbnews" && tbnUpdate?.length < 1) {
|
|
getTbnUpdate();
|
|
}
|
|
if (selectedTab === "inp" && inpUpdate?.length < 1) {
|
|
getInpUpdate();
|
|
}
|
|
}, [selectedTab]);
|
|
|
|
async function getMedihubUpdate() {
|
|
const res = await topNewsMediahub();
|
|
setMediahubUpdate(res?.data?.data?.content);
|
|
}
|
|
|
|
async function getTbnUpdate() {
|
|
const res = await topNewsTbn();
|
|
setTbnUpdate(res?.data?.data);
|
|
}
|
|
async function getInpUpdate() {
|
|
const headers = {
|
|
"content-type": "application/json",
|
|
};
|
|
const resLog = await inpLogin(headers);
|
|
const res = await topNewsInp(resLog?.data?.access_token);
|
|
// setInpUpdate(res?.data);
|
|
setInpUpdate(res?.data?.data);
|
|
|
|
// getDataImage(res?.data);
|
|
}
|
|
|
|
async function getDataImage(data: any) {
|
|
let temp = data;
|
|
for (let i = 0; i < data?.length; i++) {
|
|
const res = await getImageInp(temp[i].id);
|
|
const data = res?.data[0]?.guid?.rendered;
|
|
temp[i].image = data;
|
|
}
|
|
setInpUpdate(temp);
|
|
}
|
|
|
|
const formatDate = (dateString: string): string => {
|
|
const date = new Date(dateString);
|
|
|
|
let timeZone = "Asia/Jakarta";
|
|
let timeZoneAbbr = "WIB";
|
|
|
|
if (dateString.includes("+09:00")) {
|
|
timeZone = "Asia/Jayapura";
|
|
timeZoneAbbr = "WIT";
|
|
} else if (dateString.includes("+08:00")) {
|
|
timeZone = "Asia/Makassar";
|
|
timeZoneAbbr = "WITA";
|
|
}
|
|
|
|
const options: Intl.DateTimeFormatOptions = {
|
|
day: "2-digit",
|
|
month: "2-digit",
|
|
year: "numeric",
|
|
hour: "2-digit",
|
|
minute: "2-digit",
|
|
hour12: false,
|
|
timeZone,
|
|
};
|
|
|
|
// Format tanggal
|
|
const formattedDate = new Intl.DateTimeFormat("id-ID", options)
|
|
.format(date)
|
|
.replace(/\//g, "-"); // Ubah '/' menjadi '-'
|
|
|
|
return `${formattedDate} ${timeZoneAbbr}`;
|
|
};
|
|
|
|
return (
|
|
<div className="border-1 rounded-xl py-2 w-[90%] lg:w-[75%] mx-auto bg-white text-black">
|
|
<div className="text-xl font-semibold w-full ">
|
|
<p className="border-b-2 border-red-600 w-fit mx-auto">Media Update</p>
|
|
</div>
|
|
<div className=" p-1 md:p-5 space-y-5">
|
|
<Tabs
|
|
classNames={{
|
|
tabList: "bg-white shadow-lg border p-2 rounded-lg",
|
|
tab: "group-data-[selected=true]:bg-[#bb3523] bg-white p-0 mx-2",
|
|
tabContent: [
|
|
"group-data-[selected=true]:text-[white] text-[#bb3523]",
|
|
"group-data-[selected=true]:bg-[#bb3523] bg-white rounded-md p-2",
|
|
],
|
|
}}
|
|
aria-label="Options"
|
|
// color="[#bb3523]"
|
|
className="flex justify-center"
|
|
selectedKey={selectedTab}
|
|
onSelectionChange={setSelectedTab}
|
|
>
|
|
<Tab key="mediahub" title="MediaHUB Update">
|
|
<Swiper
|
|
navigation={true}
|
|
modules={[Navigation, Pagination]}
|
|
spaceBetween={40}
|
|
slidesPerView={1}
|
|
breakpoints={{
|
|
// When the window width is less than 640px
|
|
720: {
|
|
slidesPerView: 3, // Set slidesPerView to 1 on mobile
|
|
},
|
|
1080: {
|
|
slidesPerView: 4,
|
|
},
|
|
}}
|
|
pagination={true}
|
|
className="mySwiper"
|
|
onSwiper={(swiper) => {
|
|
swiper.navigation.nextEl?.classList.add(
|
|
"bg-white/70",
|
|
"!text-black",
|
|
"rounded-full",
|
|
"!w-[40px]",
|
|
"!h-[40px]"
|
|
);
|
|
swiper.navigation.prevEl?.classList.add(
|
|
"bg-white/70",
|
|
"!text-black",
|
|
"rounded-full",
|
|
"!w-[40px]",
|
|
"!h-[40px]"
|
|
);
|
|
}}
|
|
>
|
|
{mediahubUpdate?.map((newsItem: any) => (
|
|
<SwiperSlide key={newsItem.title}>
|
|
<Link href={newsItem?.pageUrl} target="_blank">
|
|
<Card
|
|
isPressable
|
|
shadow="sm"
|
|
className=" bg-white text-black border-2 w-full"
|
|
>
|
|
<CardBody className="overflow-visible p-0">
|
|
<Image
|
|
radius="lg"
|
|
width="300%"
|
|
alt="tes"
|
|
className="object-cover !h-[20vh]"
|
|
src={newsItem.thumbnailLink}
|
|
/>
|
|
</CardBody>
|
|
<CardFooter className="flex flex-col items-start text-left">
|
|
<p className="text-xs">
|
|
{formatDate(newsItem?.createdAt)}
|
|
</p>
|
|
<b className="text-sm">
|
|
{textEllipsis(newsItem?.title, 50)}
|
|
</b>
|
|
</CardFooter>
|
|
</Card>
|
|
</Link>
|
|
</SwiperSlide>
|
|
))}
|
|
</Swiper>
|
|
<div className="text-center pt-6">
|
|
<Link href="https://mediahub.polri.go.id" target="_blank">
|
|
<Button
|
|
className="bg-white text-[#bb3523] font-bold w-56"
|
|
size="sm"
|
|
color="danger"
|
|
variant="bordered"
|
|
>
|
|
{t("lebihBanyak")}
|
|
</Button>
|
|
</Link>
|
|
</div>
|
|
</Tab>
|
|
<Tab key="tbnews" title="Tribrata News Update">
|
|
<Swiper
|
|
navigation={true}
|
|
modules={[Navigation, Pagination]}
|
|
spaceBetween={40}
|
|
slidesPerView={1}
|
|
breakpoints={{
|
|
// When the window width is less than 640px
|
|
720: {
|
|
slidesPerView: 3, // Set slidesPerView to 1 on mobile
|
|
},
|
|
1080: {
|
|
slidesPerView: 4,
|
|
},
|
|
}}
|
|
pagination={true}
|
|
className="mySwiper"
|
|
onSwiper={(swiper) => {
|
|
swiper.navigation.nextEl?.classList.add(
|
|
"bg-white/70",
|
|
"!text-black",
|
|
"rounded-full",
|
|
"!w-[40px]",
|
|
"!h-[40px]"
|
|
);
|
|
swiper.navigation.prevEl?.classList.add(
|
|
"bg-white/70",
|
|
"!text-black",
|
|
"rounded-full",
|
|
"!w-[40px]",
|
|
"!h-[40px]"
|
|
);
|
|
}}
|
|
>
|
|
{tbnUpdate?.map((newsItem: any) => (
|
|
<SwiperSlide key={newsItem.title}>
|
|
<Link href={newsItem?.source_url} target="_blank">
|
|
<Card
|
|
isPressable
|
|
shadow="sm"
|
|
className=" bg-white text-black border-2 w-full"
|
|
>
|
|
<CardBody className="overflow-visible p-0">
|
|
<Image
|
|
radius="lg"
|
|
width="300%"
|
|
alt="tes"
|
|
className="object-cover !h-[20vh]"
|
|
src={newsItem?.image}
|
|
/>
|
|
</CardBody>
|
|
<CardFooter className="flex flex-col items-start text-left">
|
|
{/* {convertDateFormatNoTime(newsItem?.date)} */}
|
|
<p className="text-xs">{formatDate(newsItem?.date)}</p>
|
|
<b className="text-sm">
|
|
{textEllipsis(newsItem?.title, 50)}
|
|
</b>
|
|
</CardFooter>
|
|
</Card>
|
|
</Link>
|
|
</SwiperSlide>
|
|
))}
|
|
</Swiper>
|
|
<div className="text-center pt-6">
|
|
<Link href="https://tribratanews.polri.go.id" target="_blank">
|
|
<Button
|
|
className="bg-white text-[#bb3523] font-bold w-56"
|
|
size="sm"
|
|
color="danger"
|
|
variant="bordered"
|
|
>
|
|
{t("lebihBanyak")}
|
|
</Button>
|
|
</Link>
|
|
</div>
|
|
</Tab>
|
|
<Tab key="inp" title="Indonesia Nasional Police Update">
|
|
<Swiper
|
|
navigation={true}
|
|
modules={[Navigation, Pagination]}
|
|
spaceBetween={40}
|
|
slidesPerView={1}
|
|
breakpoints={{
|
|
// When the window width is less than 640px
|
|
720: {
|
|
slidesPerView: 3, // Set slidesPerView to 1 on mobile
|
|
},
|
|
1080: {
|
|
slidesPerView: 4,
|
|
},
|
|
}}
|
|
pagination={true}
|
|
className="mySwiper"
|
|
onSwiper={(swiper) => {
|
|
swiper.navigation.nextEl?.classList.add(
|
|
"bg-white/70",
|
|
"!text-black",
|
|
"rounded-full",
|
|
"!w-[40px]",
|
|
"!h-[40px]"
|
|
);
|
|
swiper.navigation.prevEl?.classList.add(
|
|
"bg-white/70",
|
|
"!text-black",
|
|
"rounded-full",
|
|
"!w-[40px]",
|
|
"!h-[40px]"
|
|
);
|
|
}}
|
|
>
|
|
{inpUpdate?.map((newsItem: any) => (
|
|
<SwiperSlide key={newsItem?.slug}>
|
|
<Link
|
|
href={`https://inp.polri.go.id/artikel/${newsItem?.slug}`}
|
|
target="_blank"
|
|
>
|
|
<Card
|
|
isPressable
|
|
shadow="sm"
|
|
className=" bg-white text-black border-2 w-full"
|
|
>
|
|
<CardBody className="overflow-visible p-0">
|
|
<Image
|
|
radius="lg"
|
|
width="300%"
|
|
alt="tes"
|
|
className="object-cover !h-[20vh]"
|
|
src={newsItem?.thumbnail}
|
|
/>
|
|
</CardBody>
|
|
<CardFooter className="flex flex-col items-start text-left">
|
|
{/* {newsItem?.created_at} */}
|
|
<p className="text-xs">{newsItem?.created_at}</p>
|
|
<b className="text-sm">
|
|
{textEllipsis(newsItem?.judul, 50)}
|
|
</b>
|
|
</CardFooter>
|
|
</Card>
|
|
</Link>
|
|
</SwiperSlide>
|
|
))}
|
|
</Swiper>
|
|
<div className="text-center pt-6">
|
|
<a href="https://inp.polri.go.id/" target="_blank">
|
|
<Button
|
|
className="bg-white text-[#bb3523] font-bold w-56"
|
|
size="sm"
|
|
color="danger"
|
|
variant="bordered"
|
|
>
|
|
{t("lebihBanyak")}
|
|
</Button>
|
|
</a>
|
|
</div>
|
|
</Tab>
|
|
<Tab key="polritv" title="Polri TV Update">
|
|
<div className="w-full">
|
|
<div className="w-[40%] mx-auto">
|
|
<PolriTvWidget />
|
|
</div>
|
|
</div>
|
|
<div className="text-center pt-6">
|
|
<Link
|
|
href="https://www.youtube.com/@TvRadioPolri"
|
|
target="_blank"
|
|
>
|
|
<Button
|
|
className="bg-white text-[#bb3523] font-bold w-56"
|
|
size="sm"
|
|
color="danger"
|
|
variant="bordered"
|
|
>
|
|
{t("lebihBanyak")}
|
|
</Button>
|
|
</Link>
|
|
</div>
|
|
</Tab>
|
|
</Tabs>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|