feat:new landing

This commit is contained in:
Rama Priyanto 2025-02-24 19:24:58 +07:00
parent 80fd365755
commit f94e21d953
15 changed files with 852 additions and 395 deletions

View File

@ -1,4 +1,5 @@
"use client";
import BannerHumasNew from "@/components/landing/banner-new";
import BannerHumas from "@/components/landing/BannerHumas";
import BodyLayout from "@/components/landing/BodyLayout";
import HeaderNews from "@/components/landing/HeaderNews";
@ -18,7 +19,7 @@ export default function Home() {
return (
<>
<HumasLayout>
<BannerHumas />
<BannerHumasNew />
<HeaderNews />
<BodyLayout />
</HumasLayout>

View File

@ -331,7 +331,7 @@ export const ChevronUpIcon = ({
{...props}
>
<path
className="fill-default-400"
className={fill}
d="m6.293 13.293 1.414 1.414L12 10.414l4.293 4.293 1.414-1.414L12 7.586z"
></path>
</svg>

View File

@ -1,26 +1,27 @@
"use client";
import CategorySatker from "./CategorySatker";
import ENewsPolri from "./ENewsPolri";
import MediaSocial from "./MediaSocial";
import AddsCarousel from "./adds-carousel";
import MedolUpdate from "./MedolUpdate";
import PolriApps from "./PolriApps";
import RegionalNews from "./RegionalNews";
import SidebarNav from "./SidebarNav";
import SocialMediaNew from "./social-media";
export default function BodyLayout() {
return (
<>
<div className="lg:flex bg-white text-black p-2 lg:p-8 gap-9">
<div className="lg:w-[75%] space-y-7">
<div className="lg:flex bg-white dark:bg-black text-black p-2 lg:p-8 gap-9">
{/* <div className="lg:w-[75%] space-y-7">
<CategorySatker />
<RegionalNews />
<PolriApps />
<MedolUpdate />
<MediaSocial />
{/* <ENewsPolri /> */}
</div>
<div className="w-full lg:w-[25%]">
<ENewsPolri />
</div> */}
{/* <div className="w-full lg:w-[25%]">
<SidebarNav />
</div> */}
<div className="w-full space-y-5">
<AddsCarousel />
<MedolUpdate />
<SocialMediaNew />
</div>
</div>
</>

View File

@ -57,308 +57,323 @@ export default function HeaderNews() {
limit: "10",
sortBy: "view_count",
sort: "desc",
isPublish: true,
};
const response = await getListArticle(req);
setHotNews(response?.data?.data);
console.log("sadadasdasd", response?.data?.data);
}
return (
<div className="flex flex-col lg:flex-row gap-3 lg:gap-8 bg-white p-1 lg:p-8 lg:h-[70vh]">
<div className="lg:hidden w-full h-full">
{article ? (
<Swiper
centeredSlides={true}
autoplay={{
delay: 5000,
disableOnInteraction: false,
}}
navigation={true}
className="mySwiper"
modules={[Autoplay, Controller, Navigation]}
onSwiper={(swiper) => {
swiper.navigation.nextEl?.classList.add(
"bg-white/70",
"!text-black",
"rounded-full",
"!w-[24px]",
"!h-[24px]"
);
swiper.navigation.prevEl?.classList.add(
"bg-white/70",
"!text-black",
"rounded-full",
"!w-[24px]",
"!h-[24px]"
);
}}
>
{article?.map((newsItem: any, index: number) => (
<SwiperSlide key={newsItem?.id}>
<Card isFooterBlurred radius="lg" className="border-none">
<Image
width={1920}
height={1080}
alt="headernews"
src={
newsItem?.thumbnailUrl == ""
? "/no-image.jpg"
: newsItem?.thumbnailUrl
}
className="h-[25vh] object-cover"
/>
<CardFooter className="before:bg-white/10 border-white/20 border-1 overflow-hidden py-1 md:absolute before:rounded-xl rounded-large bottom-1 w-[calc(100%_-_8px)] shadow-small ml-1 z-10">
<div className="text-black dark:text-white">
<Link
href={`news/detail/${newsItem.id}-${newsItem?.slug}`}
>
<p className="text-left font-semibold">
{textEllipsis(newsItem.title, 40)}
</p>
</Link>
<p className="py-[2px] text-left text-sm">
{convertDateFormat(newsItem.createdAt)} WIB
</p>
<p className="flex items-center gap-1 text-sm">
<EyeIcon className="text-black dark:text-white" />
{newsItem.viewCount === null ? 0 : newsItem.viewCount}
</p>
</div>
</CardFooter>
</Card>
</SwiperSlide>
))}
</Swiper>
) : (
<CircularProgress aria-label="Loading..." size="lg" />
)}
</div>
<div className="w-auto lg:w-[25%] p-2 dark:bg-stone-800 bg-[#f0f0f0] shadow-lg dark:text-white text-black rounded-xl mb-2 md:mb-0 h-[50vh] lg:h-[67vh]">
<p className="text-lg font-bold h-10 text-center dark:text-white text-black">
{t("berita")}
</p>
<ScrollShadow hideScrollBar className="h-[34vh] lg:h-[53vh] ">
{hotNews?.map((data: any, index: number) => (
<div
className="text-xs text-left m-2 p-2 dark:bg-[#1E1616] bg-white rounded-md flex flex-row gap-2"
key={data?.id}
<div className="w-full">
<div className="flex flex-col lg:flex-row gap-3 lg:gap-8 bg-white dark:bg-black p-1 lg:p-8 lg:h-[55vh] w-[75%] lg:mx-auto">
<div className="lg:hidden w-full h-full">
{article ? (
<Swiper
centeredSlides={true}
autoplay={{
delay: 5000,
disableOnInteraction: false,
}}
navigation={true}
className="mySwiper"
modules={[Autoplay, Controller, Navigation]}
onSwiper={(swiper) => {
swiper.navigation.nextEl?.classList.add(
"bg-white/70",
"!text-black",
"rounded-full",
"!w-[24px]",
"!h-[24px]"
);
swiper.navigation.prevEl?.classList.add(
"bg-white/70",
"!text-black",
"rounded-full",
"!w-[24px]",
"!h-[24px]"
);
}}
>
<Image
height={480}
width={480}
alt="headernews"
src={
data?.thumbnailUrl == ""
? "/no-image.jpg"
: data?.thumbnailUrl
}
className="object-cover w-[60px] h-[60px] rounded-md"
/>
<div>
<Link
href={`/news/detail/${data?.id}-${data?.slug}`}
className="lg:hidden"
>
{textEllipsis(data.title, 40)}
</Link>
<Link
href={`/news/detail/${data?.id}-${data?.slug}`}
key={data?.id}
className="hidden lg:block"
>
{textEllipsis(data.title, 66)}
</Link>
<div className="flex flex-row gap-2 text-[10px]">
<p className="py-[2px]">
{convertDateFormat(data.createdAt)} WIB
</p>
<p className="flex items-center gap-1">
<EyeIcon size={14} />
{data.viewCount === null ? 0 : data.viewCount}
</p>
</div>
</div>
</div>
))}
</ScrollShadow>
<div className="m-2">
<Link href="/news/all">
<Button
className="w-full bg-gradient-to-r from-red-700 to-[#bb3523] text-white font-bold rounded-md focus:outline-none"
radius="none"
>
{t("semua")}
</Button>
</Link>
</div>
</div>
{article?.map((newsItem: any, index: number) => (
<SwiperSlide key={newsItem?.id}>
<Card isFooterBlurred radius="lg" className="border-none">
{/* <Image
width={1920}
height={1080}
alt="headernews"
src={
newsItem?.thumbnailUrl == ""
? "/no-image.jpg"
: newsItem?.thumbnailUrl
}
className="h-[25vh] object-cover"
/> */}
<div className="hidden lg:block w-full lg:w-[50%] h-[67vh]">
{article ? (
<Swiper
centeredSlides={true}
autoplay={{
delay: 5000,
disableOnInteraction: false,
}}
navigation={true}
modules={[Autoplay, Controller, Navigation]}
className="mySwiper"
onSwiper={(swiper) => {
swiper.navigation.nextEl?.classList.add(
"bg-white/70",
"!text-black",
"rounded-full",
"!w-[48px]",
"!h-[48px]"
);
swiper.navigation.prevEl?.classList.add(
"bg-white/70",
"!text-black",
"rounded-full",
"!w-[48px]",
"!h-[48px]"
);
}}
>
{article?.map((newsItem: any, index: number) => (
<SwiperSlide key={newsItem?.id} className="h-[67vh]">
<Card
isFooterBlurred
radius="lg"
className="border-none h-[67vh] shadow-none"
>
<Image
alt="headernews"
width={1440}
height={1080}
src={
newsItem?.thumbnailUrl == ""
? "/no-image.jpg"
: newsItem?.thumbnailUrl
}
className="w-full !h-[67vh] object-cover rounded-lg"
/>
<CardFooter className="mb-1 max-h-[20vh] before:bg-white/10 border-white/20 border-1 overflow-hidden py-1 md:absolute before:rounded-xl rounded-large bottom-1 w-[calc(100%_-_8px)] shadow-small ml-1 z-10">
<div className="text-white">
<Link
href={`news/detail/${newsItem.id}-${newsItem?.slug}`}
>
<p className="text-left font-semibold text-lg lg:text-2xl">
{newsItem.title}
</p>
</Link>
<div className="flex flex-row gap-1">
<CardFooter className="before:bg-white/10 border-white/20 border-1 overflow-hidden py-1 md:absolute before:rounded-xl rounded-large bottom-1 w-[calc(100%_-_8px)] shadow-small ml-1 z-10">
<div className="text-black dark:text-white">
<Link
href={`news/detail/${newsItem.id}-${newsItem?.slug}`}
>
<p className="text-left font-semibold">
{textEllipsis(newsItem.title, 40)}
</p>
</Link>
<p className="py-[2px] text-left text-sm">
{convertDateFormat(newsItem.createdAt)} WIB
</p>
<p className="flex items-center gap-1 text-sm">
<EyeIcon />
<EyeIcon className="text-black dark:text-white" />
{newsItem.viewCount === null ? 0 : newsItem.viewCount}
</p>
</div>
</div>
</CardFooter>
</Card>
</SwiperSlide>
))}
</Swiper>
) : (
<CircularProgress aria-label="Loading..." size="lg" />
)}
</div>
<div className="lg:w-[25%] h-[67vh] rounded-md text-white dark:text-black ">
{/* <GPRKominfo /> */}
<div className="text-[15px] flex flex-row gap-10">
<a
onClick={() => setSelectedTab("media")}
className={
selectedTab === "media"
? "text-black border-b-3 border-red-400 cursor-pointer py-2"
: "text-slate-300 cursor-pointer py-2"
}
>
{t("terkini")}
</a>
<a
onClick={() => setSelectedTab("video")}
className={
selectedTab === "video"
? "text-black border-b-3 border-red-400 cursor-pointer py-2"
: "text-slate-300 cursor-pointer py-2"
}
>
Video Virtual
</a>
</CardFooter>
</Card>
</SwiperSlide>
))}
</Swiper>
) : (
<CircularProgress aria-label="Loading..." size="lg" />
)}
</div>
{selectedTab === "media" ? (
<div className="lg:!h-[62vh] p-2 dark:bg-stone-800 bg-[#f0f0f0] dark:text-white text-black rounded-lg">
<ScrollShadow hideScrollBar className=" h-[54vh]">
{article?.map((list: any, index: number) => (
<div
key={list?.id}
className="text-xs text-left m-2 p-2 dark:bg-[#1E1616] bg-white rounded-md"
>
<Link href={`news/detail/${list?.id}`}>
<p className="text-left font-semibold">{list?.title}</p>
<div className="w-auto lg:w-[25%] p-2 dark:bg-stone-800 bg-[#f0f0f0] dark:text-white text-black rounded-xl mb-2 md:mb-0 h-[37vh] lg:h-[50vh]">
<p className="text-base font-bold text-center dark:text-white text-black">
{t("berita")}
</p>
<ScrollShadow hideScrollBar className="h-[33vh] lg:h-[39vh] ">
{hotNews?.map((data: any, index: number) => (
<div
className="text-xs text-left m-2 p-2 dark:bg-[#1E1616] bg-white rounded-md flex flex-row gap-2"
key={data?.id}
>
{/* <Image
height={480}
width={480}
alt="headernews"
src={
data?.thumbnailUrl == ""
? "/no-image.jpg"
: data?.thumbnailUrl
}
className="object-cover w-[60px] h-[60px] rounded-md"
/> */}
<div>
<Link
href={`/news/detail/${data?.id}-${data?.slug}`}
className="lg:hidden"
>
{textEllipsis(data.title, 40)}
</Link>
<div className="flex flex-row gap-1">
<p className="py-[2px] text-left text-xs">
{convertDateFormat(list?.createdAt)} WIB
<Link
href={`/news/detail/${data?.id}-${data?.slug}`}
key={data?.id}
className="hidden lg:block"
>
{textEllipsis(data.title, 66)}
</Link>
<div className="flex flex-row gap-2 text-[10px]">
<p className="py-[2px]">
{convertDateFormat(data.createdAt)} WIB
</p>
<p className="flex items-center gap-1 text-xs">
<EyeIcon />
{list?.viewCount === null ? 0 : list?.viewCount}
<p className="flex items-center gap-1">
<EyeIcon size={14} />
{data.viewCount === null ? 0 : data.viewCount}
</p>
</div>
</div>
</div>
))}
</ScrollShadow>
<div className="m-2">
<Link href="/news/all">
<Button
className="w-full bg-gradient-to-r from-red-700 to-[#bb3523] text-white font-bold rounded-md focus:outline-none"
radius="none"
>
{t("semua")}
</Button>
</Link>
</div>
</div>
<div className="hidden lg:block w-full lg:w-[50%] h-[50vh]">
{article ? (
<Swiper
centeredSlides={true}
autoplay={{
delay: 5000,
disableOnInteraction: false,
}}
navigation={true}
modules={[Autoplay, Controller, Navigation]}
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]"
);
}}
>
{article?.map((newsItem: any, index: number) => (
<SwiperSlide key={newsItem?.id} className="h-[50vh]">
<Card
isFooterBlurred
radius="lg"
className="border-none h-[50vh] shadow-none"
>
<Image
alt="headernews"
width={1440}
height={1080}
src={
newsItem?.thumbnailUrl == ""
? "/no-image.jpg"
: newsItem?.thumbnailUrl
}
className="w-full !h-[50vh] object-cover rounded-lg"
/>
<CardFooter className="mb-1 max-h-[20vh] before:bg-white/10 border-white/20 border-1 overflow-hidden py-1 md:absolute before:rounded-xl rounded-large bottom-1 w-[calc(100%_-_8px)] shadow-small ml-1 z-10">
<div className="text-white">
<Link
href={`news/detail/${newsItem.id}-${newsItem?.slug}`}
>
<p className="text-left font-semibold text-lg lg:text-2xl">
{newsItem.title}
</p>
</Link>
<div className="flex flex-row gap-1">
<p className="py-[2px] text-left text-sm">
{convertDateFormat(newsItem.createdAt)} WIB
</p>
<p className="flex items-center gap-1 text-sm">
<EyeIcon />
{newsItem.viewCount === null
? 0
: newsItem.viewCount}
</p>
</div>
</div>
</CardFooter>
</Card>
</SwiperSlide>
))}
</ScrollShadow>
<Button
className="w-full bg-gradient-to-r from-red-700 to-[#bb3523] text-white font-bold rounded-md focus:outline-none"
radius="none"
>
Lihat Semua
</Button>
</div>
) : (
<div className="lg:!h-[62vh] dark:bg-stone-800 bg-[#f0f0f0] dark:text-white text-black rounded-lg flex flex-col p-2 lg:p-8 gap-2 lg:gap-5">
<Link
target="_blank"
href="https://www.youtube.com/watch?v=6_g_PyiFcNo"
className="border-b-2 py-2 lg:py-4"
>
IKLAN LAYANAN MASYARAKAT DIVHUMAS POLRI - POLRI PRESISI UNTUK
INDONESIA
</Link>
<Link
target="_blank"
href="https://www.youtube.com/watch?v=p0AJEwvJ7gU"
className="border-b-2 py-2 lg:py-4"
>
ILM DIVHUMAS POLRI - POLRI PRESISI MENGAWAL PROSES VAKSINASI UNTUK
MENGATASI PANDEMI COVID 19
</Link>
<Link
target="_blank"
href="https://www.youtube.com/watch?v=jaihQPjxcy4"
className="border-b-2 py-2 lg:py-4"
>
IKLAN LAYANAN MASYARAKAT DIVHUMAS POLRI - INDONESIA MENOLAK
RADIKALISME
</Link>
<Link
target="_blank"
href="https://www.youtube.com/watch?v=umPEo0FYTQk"
className="border-b-2 py-2 lg:py-4"
>
IKLAN LAYANAN MASYARAKAT DIVHUMAS POLRI - BHABINKAMTIBMAS SAHABAT
MASYARAKAT
</Link>
</div>
)}
</Swiper>
) : (
<CircularProgress aria-label="Loading..." size="lg" />
)}
</div>
<div className="lg:w-[25%] h-[50vh] rounded-md text-white dark:text-black ">
{/* <GPRKominfo /> */}
{selectedTab === "media" ? (
<div className="lg:!h-[50vh] p-2 dark:bg-stone-800 bg-[#f0f0f0] dark:text-white text-black rounded-lg">
<div className="text-sm flex flex-row gap-3 mx-2 mb-2">
<a
onClick={() => setSelectedTab("media")}
className={
"text-black border-b-3 border-red-400 cursor-pointer p-0"
}
>
{t("terkini")}
</a>
<a
onClick={() => setSelectedTab("video")}
className={"text-slate-300 cursor-pointer"}
>
Video Virtual
</a>
</div>
<ScrollShadow hideScrollBar className="h-[39vh]">
{article?.map((list: any, index: number) => (
<div
key={list?.id}
className="text-xs text-left m-2 p-2 dark:bg-[#1E1616] bg-white rounded-md"
>
<Link href={`news/detail/${list?.id}`}>
<p className="text-left font-semibold">{list?.title}</p>
</Link>
<div className="flex flex-row gap-1">
<p className="py-[2px] text-left text-xs">
{convertDateFormat(list?.createdAt)} WIB
</p>
<p className="flex items-center gap-1 text-xs">
<EyeIcon />
{list?.viewCount === null ? 0 : list?.viewCount}
</p>
</div>
</div>
))}
</ScrollShadow>
<Button
className="w-full bg-gradient-to-r from-red-700 to-[#bb3523] text-white font-bold rounded-md focus:outline-none"
radius="none"
>
Lihat Semua
</Button>
</div>
) : (
<div className="lg:!h-[35vh] dark:bg-stone-800 bg-[#f0f0f0] dark:text-white text-black rounded-lg flex flex-col p-2 lg:p-8 gap-2 lg:gap-5">
<div className="text-[15px] flex flex-row gap-10">
<a
onClick={() => setSelectedTab("media")}
className={"text-slate-300 cursor-pointer py-2"}
>
{t("terkini")}
</a>
<a
onClick={() => setSelectedTab("video")}
className={
"text-black border-b-3 border-red-400 cursor-pointer py-2"
}
>
Video Virtual
</a>
</div>
<Link
target="_blank"
href="https://www.youtube.com/watch?v=6_g_PyiFcNo"
className="border-b-2 py-2 lg:py-4"
>
IKLAN LAYANAN MASYARAKAT DIVHUMAS POLRI - POLRI PRESISI UNTUK
INDONESIA
</Link>
<Link
target="_blank"
href="https://www.youtube.com/watch?v=p0AJEwvJ7gU"
className="border-b-2 py-2 lg:py-4"
>
ILM DIVHUMAS POLRI - POLRI PRESISI MENGAWAL PROSES VAKSINASI
UNTUK MENGATASI PANDEMI COVID 19
</Link>
<Link
target="_blank"
href="https://www.youtube.com/watch?v=jaihQPjxcy4"
className="border-b-2 py-2 lg:py-4"
>
IKLAN LAYANAN MASYARAKAT DIVHUMAS POLRI - INDONESIA MENOLAK
RADIKALISME
</Link>
<Link
target="_blank"
href="https://www.youtube.com/watch?v=umPEo0FYTQk"
className="border-b-2 py-2 lg:py-4"
>
IKLAN LAYANAN MASYARAKAT DIVHUMAS POLRI - BHABINKAMTIBMAS
SAHABAT MASYARAKAT
</Link>
</div>
)}
</div>
</div>
</div>
);

View File

@ -21,7 +21,7 @@ import {
topNewsInp,
topNewsTbn,
} from "@/service/third-party-service";
import { convertDateFormatNoTime } from "@/utils/global";
import { convertDateFormatNoTime, textEllipsis } from "@/utils/global";
import PolriTvWidget from "../ui/social-media/polri-tv";
import { useTranslations } from "next-intl";
@ -62,7 +62,6 @@ export default function MedolUpdate() {
const res = await topNewsInp(resLog?.data?.access_token);
// setInpUpdate(res?.data);
setInpUpdate(res?.data?.data);
console.log("reelog", res?.data?.data);
// getDataImage(res?.data);
}
@ -77,15 +76,47 @@ export default function MedolUpdate() {
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-2 rounded-lg py-2">
<div className="text-2xl font-semibold underline underline-offset-4 text-center decoration-red-600 ">
Top 5 News Update
<div className="border-1 rounded-xl py-2 w-[75%] mx-auto">
<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="bg-white text-black p-1 md:p-5 space-y-5">
<Tabs
classNames={{
tabList: "bg-white shadow-lg border p-2 rounded-md",
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]",
@ -107,7 +138,10 @@ export default function MedolUpdate() {
breakpoints={{
// When the window width is less than 640px
720: {
slidesPerView: 2, // Set slidesPerView to 1 on mobile
slidesPerView: 3, // Set slidesPerView to 1 on mobile
},
1080: {
slidesPerView: 4,
},
}}
pagination={true}
@ -142,15 +176,17 @@ export default function MedolUpdate() {
radius="lg"
width="300%"
alt="tes"
className="object-cover !h-[30vh]"
className="object-cover !h-[20vh]"
src={newsItem.thumbnailLink}
/>
</CardBody>
<CardFooter className="flex flex-col items-start text-left">
<p className="text-xs">
{convertDateFormatNoTime(newsItem?.createdAt)}
{formatDate(newsItem?.createdAt)}
</p>
<b className="">{newsItem?.title}</b>
<b className="text-sm">
{textEllipsis(newsItem?.title, 50)}
</b>
</CardFooter>
</Card>
</Link>
@ -179,7 +215,10 @@ export default function MedolUpdate() {
breakpoints={{
// When the window width is less than 640px
720: {
slidesPerView: 2, // Set slidesPerView to 1 on mobile
slidesPerView: 3, // Set slidesPerView to 1 on mobile
},
1080: {
slidesPerView: 4,
},
}}
pagination={true}
@ -214,13 +253,16 @@ export default function MedolUpdate() {
radius="lg"
width="300%"
alt="tes"
className="object-cover !h-[30vh]"
className="object-cover !h-[20vh]"
src={newsItem?.image}
/>
</CardBody>
<CardFooter className="flex flex-col items-start text-left">
{convertDateFormatNoTime(newsItem?.date)}
<b className="">{newsItem?.title}</b>
{/* {convertDateFormatNoTime(newsItem?.date)} */}
<p className="text-xs">{formatDate(newsItem?.date)}</p>
<b className="text-sm">
{textEllipsis(newsItem?.title, 50)}
</b>
</CardFooter>
</Card>
</Link>
@ -249,7 +291,10 @@ export default function MedolUpdate() {
breakpoints={{
// When the window width is less than 640px
720: {
slidesPerView: 2, // Set slidesPerView to 1 on mobile
slidesPerView: 3, // Set slidesPerView to 1 on mobile
},
1080: {
slidesPerView: 4,
},
}}
pagination={true}
@ -287,13 +332,16 @@ export default function MedolUpdate() {
radius="lg"
width="300%"
alt="tes"
className="object-cover !h-[30vh]"
className="object-cover !h-[20vh]"
src={newsItem?.thumbnail}
/>
</CardBody>
<CardFooter className="flex flex-col items-start text-left">
{newsItem?.created_at}
<b className="">{newsItem?.judul}</b>
{/* {newsItem?.created_at} */}
<p className="text-xs">{newsItem?.created_at}</p>
<b className="text-sm">
{textEllipsis(newsItem?.judul, 50)}
</b>
</CardFooter>
</Card>
</Link>

View File

@ -51,31 +51,33 @@ export default function NewsTicker() {
<span className="mr-2"></span> BREAKING NEWS
<div className="absolute right-0 top-0 h-full w-4 bg-[#bb3523] transform translate-x-full clipPath-triangle"></div>
</div>
<div
className={`w-full px-5 py-1 flex flex-col gap-1 transition-transform duration-300 ${
animate ? "opacity-0 translate-y-5" : "opacity-100 translate-y-0"
}`}
>
<Link
href={`news/detail/${article[currentNewsIndex]?.id}-${article[currentNewsIndex]?.slug}`}
className="hidden lg:block"
{article && (
<div
className={`w-full px-5 py-1 flex flex-col gap-1 transition-transform duration-300 ${
animate ? "opacity-0 translate-y-5" : "opacity-100 translate-y-0"
}`}
>
<p className="text-sm lg:text-base">
{article[currentNewsIndex]?.title}
<Link
href={`news/detail/${article[currentNewsIndex]?.id}-${article[currentNewsIndex]?.slug}`}
className="hidden lg:block"
>
<p className="text-sm lg:text-base">
{article[currentNewsIndex]?.title}
</p>
</Link>
<Link
href={`news/detail/${article[currentNewsIndex]?.id}-${article[currentNewsIndex]?.slug}`}
className="lg:hidden"
>
<p className="text-sm lg:text-base">
{textEllipsis(article[currentNewsIndex]?.title, 28)}
</p>
</Link>
<p className="text-xs">
{convertDateFormat(article[currentNewsIndex]?.createdAt)}
</p>
</Link>
<Link
href={`news/detail/${article[currentNewsIndex]?.id}-${article[currentNewsIndex]?.slug}`}
className="lg:hidden"
>
<p className="text-sm lg:text-base">
{textEllipsis(article[currentNewsIndex]?.title, 28)}
</p>
</Link>
<p className="text-xs">
{convertDateFormat(article[currentNewsIndex]?.createdAt)}
</p>
</div>
</div>
)}
<div className="flex flex-row text-white h-full gap-[1px]">
<a
className="bg-[#bb3523] h-full flex items-center"

View File

@ -0,0 +1,76 @@
"use client";
import Image from "next/image";
import {
Button,
Card,
CardFooter,
CircularProgress,
ScrollShadow,
} from "@heroui/react";
import { ChevronLeftIcon, ChevronRightIcon, EyeIcon } from "../icons";
import { Swiper, SwiperSlide, useSwiper } from "swiper/react";
import "swiper/css";
import "swiper/css/navigation";
import Link from "next/link";
import { Autoplay, Pagination, Navigation, Controller } from "swiper/modules";
const datas = [
{ id: 1, src: "/props-1.png" },
{ id: 2, src: "/props-2.png" },
{ id: 2, src: "/props-3.png" },
];
export default function AddsCarousel() {
return (
<div className="w-[75%] mx-auto">
{datas ? (
<Swiper
centeredSlides={true}
autoplay={{
delay: 5000,
disableOnInteraction: false,
}}
navigation={true}
modules={[Autoplay, Controller, Navigation]}
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]"
);
}}
>
{datas?.map((newsItem: any, index: number) => (
<SwiperSlide key={newsItem?.id} className="h-[50vh]">
<Card
isFooterBlurred
radius="lg"
className="border-none h-[50vh] shadow-none"
>
<Image
alt="headernews"
width={1440}
height={1080}
src={newsItem?.src == "" ? "/no-image.jpg" : newsItem?.src}
className="w-full !h-[50vh] object-cover rounded-lg"
/>
</Card>
</SwiperSlide>
))}
</Swiper>
) : (
<CircularProgress aria-label="Loading..." size="lg" />
)}
</div>
);
}

View File

@ -0,0 +1,233 @@
"use client";
import { useTranslations } from "next-intl";
import Image from "next/image";
import React, { useEffect, useState } from "react";
import {
ChevronDownIcon,
ChevronLeftIcon,
ChevronRightIcon,
ChevronUpIcon,
FbIconNav,
IdnIcon,
IgIcon,
SearchIcon,
SearchIcons,
TtIcon,
TwIcon,
UKIcon,
YtIcon,
} from "../icons";
import Link from "next/link";
import {
Dropdown,
DropdownTrigger,
DropdownMenu,
DropdownItem,
Button,
Input,
} from "@heroui/react";
import storedLanguage from "@/store/language-store";
import { ThemeSwitch } from "../theme-switch";
const images = [
"/landing-1.jpg",
"/landing-2.jpg",
"/landing-3.jpg",
"/landing-4.jpg",
];
export default function BannerHumasNew() {
const t = useTranslations("Banner");
const [currentIndex, setCurrentIndex] = useState(0);
const [resetTimer, setResetTimer] = useState(0);
const [onOpen, setOnOpen] = useState(false);
const [searchValue, setSearchValue] = useState("");
const language = storedLanguage((state) => state.locale);
const setLanguage = storedLanguage((state) => state.setLocale);
useEffect(() => {
const interval = setInterval(() => {
setCurrentIndex((prevIndex) => (prevIndex + 1) % images.length);
}, 25000);
return () => clearInterval(interval);
}, [resetTimer]);
const nextImage = () => {
setCurrentIndex((prevIndex) => (prevIndex + 1) % images.length);
setResetTimer((prev) => prev + 1);
};
const prevImage = () => {
setCurrentIndex(
(prevIndex) => (prevIndex - 1 + images.length) % images.length
);
setResetTimer((prev) => prev + 1);
};
return (
<div className="h-fit relative text-white overflow-hidden">
<div
className="flex w-full h-[78vh] lg:h-[60vh] transition-transform duration-700 ease-in-out"
style={{ transform: `translateX(-${currentIndex * 100}%)` }}
>
{images.map((img, index) => (
<Link href="" key={index} className="w-full shrink-0">
<Image
src={img}
width={1440}
height={1080}
alt={`humasbanner-${index}`}
className="w-full h-full object-cover object-center opacity-[25] dark:opacity-70"
/>
</Link>
))}
</div>
<div className="absolute inset-0 bg-black bg-opacity-40" />
<div className="absolute z-50 lg:mt-[50px] top-44 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-center w-full lg:w-[75%]">
<div className="flex flex-col gap-3 justify-between">
<div className="flex justify-between items-center mb-10">
<div className="flex flex-col gap-1 justify-start items-start">
<p className="text-5xl font-bold text-left leading-0">
SELAMAT DATANG DI WEBSITE RESMI DIVISI HUMAS POLRI
</p>
<p>OBYEKTIF - DIPERCAYA - PARTISIPASI</p>
</div>
<Image
src="/divhumas.png"
width={720}
height={720}
alt="logo-humas"
className="w-[200px]"
/>
</div>
<div className="flex justify-between">
<div className="flex flex-row gap-6">
<Dropdown onOpenChange={setOnOpen}>
<DropdownTrigger>
<Button
className="w-[200px] bg-white dark:bg-stone-900"
radius="sm"
endContent={
onOpen ? <ChevronUpIcon /> : <ChevronDownIcon />
}
>
<p className="text-left w-full font-bold text-md">Menu</p>
</Button>
</DropdownTrigger>
<DropdownMenu>
<DropdownItem key="pemas">Pelayanan Masyarakat</DropdownItem>
<DropdownItem key="info">Informasi Publik</DropdownItem>
<DropdownItem key="tentang">Tentang</DropdownItem>
<DropdownItem key="apps">Aplikasi Polri</DropdownItem>
</DropdownMenu>
</Dropdown>
<Link href={`https://eppid.polri.go.id/`}>
<Button className="bg-white dark:bg-stone-900" radius="sm">
<p className="font-bold w-full ">e-PPID Polri</p>
</Button>{" "}
</Link>
</div>
<Input
label=""
placeholder="Temukkan Informasi Publik Terkini Dari Polri"
type="text"
value={searchValue}
onValueChange={setSearchValue}
className="max-w-md"
endContent={
<Link
href={`/news/all?search=${searchValue}`}
className="text-black"
>
<SearchIcons />
</Link>
}
/>
</div>
</div>
{/* <p className="text-[30px] lg:text-[42px] lg:leading-10 font-bold pb-1 md:pb-5">
{t("jumbotron")}
</p> */}
{/* <p className="text-xs md:text-medium">{`"${t("phrase")}"`}</p> */}
</div>
<button
onClick={prevImage}
className="absolute left-4 top-1/2 transform -translate-y-1/2 bg-black/50 text-white px-2 py-2 rounded-full hover:bg-black/70 transition"
>
<ChevronLeftIcon />
</button>
<button
onClick={nextImage}
className="absolute right-4 top-1/2 transform -translate-y-1/2 bg-black/50 text-white px-2 py-2 rounded-full hover:bg-black/70 transition"
>
<ChevronRightIcon />
</button>
<div className="absolute bottom-4 right-60">
<div className="flex">
<div className="flex gap-1 lg:gap-3 items-center">
<Link
href="https://www.facebook.com/DivHumasPolri?_rdc=1&_rdr"
target="_blank"
>
<div className="bg-white p-1.5 rounded-md">
<FbIconNav size={16} />
</div>
</Link>
<Link
href="https://www.instagram.com/divisihumaspolri/"
target="_blank"
>
<div className="bg-white p-0.5 rounded-md">
<IgIcon size={24} />
</div>
</Link>
<Link
href="https://www.youtube.com/user/pidhumaspolri"
target="_blank"
>
<div className="bg-white p-0.5 rounded-md">
<YtIcon size={24} />
</div>
</Link>
<Link href="https://twitter.com/DivHumas_Polri" target="_blank">
<div className="bg-white p-1 rounded-md">
<TwIcon size={20} />
</div>
</Link>
<Link href="https://www.tiktok.com/@divhumas_polri" target="_blank">
<div className="bg-white p-0.5 rounded-md">
<TtIcon size={24} />
</div>
</Link>
<div className="bg-white rounded-md py-0.5 px-1">
<ThemeSwitch />
</div>
<a
className="cursor-pointer"
onClick={() =>
language === "id" ? setLanguage("en") : setLanguage("id")
}
>
{language === "id" ? <IdnIcon /> : <UKIcon />}
</a>
</div>
</div>
</div>
</div>
// <div
// className={`w-full h-[60vh] bg-cover bg-center rounded-lg shadow-lg`}
// style={{ backgroundImage: `url('/landing-3.jpg')` }}
// />
// <div
// className={`w-full h-[60vh] bg-cover bg-center rounded-lg shadow-lg relative`}
// >
// <div
// className="absolute inset-0 bg-black bg-opacity-100 bg-cover bg-center object-cover"
// style={{ backgroundImage: `url('/landing-3.jpg')` }}
// />
// <div className="flex flex-row p-4">Your Text Here</div>
// </div>
);
}

View File

@ -20,7 +20,7 @@ export default function FooterNew() {
return (
<div className="mb-[60px] relative text-xs leading-4 md:leading-loose lg:leading-8 font-semibold">
<div className="py-10 px-36 flex flex-col gap-4 text-white bg-gradient-to-r from-red-400 via-[#bd4434] to-[#bb3523] from-3% via-50% to-70% ">
<div className="py-10 px-36 flex flex-col gap-4 text-white bg-gradient-to-r from-[#A88155] via-[#ad1719] to-[#AA0004] from-3% via-50% to-70% ">
<div className="flex justify-center text-2xl">Channel Humas Polri</div>
<div className="flex flex-row gap-4 justify-around items-center">
<Link href="">
@ -159,7 +159,7 @@ export default function FooterNew() {
<Button className="mt-1 text-black bg-white ">
<p className="text-xs">Kontributor Wilayah</p>
</Button>
</Link>{" "}
</Link>
</div>
</div>
</div>

View File

@ -0,0 +1,75 @@
"use client";
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";
import TwitterWidget from "../ui/social-media/twitter";
import InstagramWidget from "../ui/social-media/instagram";
import YoutubeWidget from "../ui/social-media/youtube";
export default function SocialMediaNew() {
const [selectedTab, setSelectedTab] = useState<any>("x");
const [mediahubUpdate, setMediahubUpdate] = useState<any>([]);
const [tbnUpdate, setTbnUpdate] = useState([]);
const [inpUpdate, setInpUpdate] = useState([]);
const t = useTranslations("Landing");
return (
<div className="border-1 rounded-xl py-2 w-[75%] mx-auto">
<div className="text-xl font-semibold w-full">
<p className="border-b-2 border-red-600 w-fit mx-auto">
Media Sosial Humas
</p>
</div>
<div className="bg-white text-black 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 px-4 py-2",
],
}}
aria-label="Options"
// color="[#bb3523]"
className="flex justify-center"
selectedKey={selectedTab}
onSelectionChange={setSelectedTab}
>
<Tab key="x" title="X">
<TwitterWidget />
</Tab>
<Tab key="ig" title="Instagram">
<InstagramWidget />
</Tab>
<Tab key="yt" title="Youtube">
<YoutubeWidget />
</Tab>
</Tabs>
</div>
</div>
);
}

View File

@ -21,8 +21,8 @@ export const HumasLayout = ({ children }: Props) => {
if (!hasMounted) return null;
return (
<section className="flex flex-col">
<NavbarHumas size="sm" />
<NavbarHumas size="lg" />
{/* <NavbarHumas size="sm" /> */}
{/* <NavbarHumas size="lg" /> */}
<NewsTicker />
{children}

View File

@ -10,68 +10,74 @@ import clsx from "clsx";
import { SunFilledIcon, MoonFilledIcon } from "@/components/icons";
export interface ThemeSwitchProps {
className?: string;
classNames?: SwitchProps["classNames"];
className?: string;
classNames?: SwitchProps["classNames"];
}
export const ThemeSwitch: FC<ThemeSwitchProps> = ({
className,
classNames,
className,
classNames,
}) => {
const { theme, setTheme } = useTheme();
const isSSR = useIsSSR();
const { theme, setTheme } = useTheme();
const isSSR = useIsSSR();
const onChange = () => {
theme === "light" ? setTheme("dark") : setTheme("light");
};
const onChange = () => {
theme === "light" ? setTheme("dark") : setTheme("light");
};
const {
Component,
slots,
isSelected,
getBaseProps,
getInputProps,
getWrapperProps,
} = useSwitch({
isSelected: theme === "light" || isSSR,
"aria-label": `Switch to ${theme === "light" || isSSR ? "dark" : "light"} mode`,
onChange,
});
const {
Component,
slots,
isSelected,
getBaseProps,
getInputProps,
getWrapperProps,
} = useSwitch({
isSelected: theme === "light" || isSSR,
"aria-label": `Switch to ${
theme === "light" || isSSR ? "dark" : "light"
} mode`,
onChange,
});
return (
<Component
{...getBaseProps({
className: clsx(
"px-px transition-opacity hover:opacity-80 cursor-pointer",
className,
classNames?.base
),
})}
>
<VisuallyHidden>
<input {...getInputProps()} />
</VisuallyHidden>
<div
{...getWrapperProps()}
className={slots.wrapper({
class: clsx(
[
"w-auto h-auto",
"bg-transparent",
"rounded-lg",
"flex items-center justify-center",
"group-data-[selected=true]:bg-transparent",
"!text-default-500",
"pt-px",
"px-0",
"mx-0",
],
classNames?.wrapper
),
})}
>
{!isSelected || isSSR ? <SunFilledIcon size={22} /> : <MoonFilledIcon size={22} />}
</div>
</Component>
);
return (
<Component
{...getBaseProps({
className: clsx(
"px-px transition-opacity hover:opacity-80 cursor-pointer",
className,
classNames?.base
),
})}
>
<VisuallyHidden>
<input {...getInputProps()} />
</VisuallyHidden>
<div
{...getWrapperProps()}
className={slots.wrapper({
class: clsx(
[
"w-auto h-auto",
"bg-transparent",
"rounded-lg",
"flex items-center justify-center",
"group-data-[selected=true]:bg-transparent",
"!text-default-500",
"pt-px",
"px-0",
"mx-0",
],
classNames?.wrapper
),
})}
>
{!isSelected || isSSR ? (
<SunFilledIcon size={16} />
) : (
<MoonFilledIcon size={16} />
)}
</div>
</Component>
);
};

BIN
public/props-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

BIN
public/props-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 KiB

BIN
public/props-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB