detail
This commit is contained in:
parent
f3b400c38a
commit
cd7955f241
|
|
@ -0,0 +1,22 @@
|
||||||
|
import BreakingNews from "@/components/landing-page/breaking-news";
|
||||||
|
import Footer from "@/components/landing-page/footer";
|
||||||
|
import Header from "@/components/landing-page/header";
|
||||||
|
import HeaderLatest from "@/components/landing-page/header-latest";
|
||||||
|
import Navbar from "@/components/landing-page/navbar";
|
||||||
|
import News from "@/components/landing-page/news";
|
||||||
|
import Opini from "@/components/landing-page/opini";
|
||||||
|
import PopularNews from "@/components/landing-page/popular-news";
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col font-[family-name:var(--font-geist-sans)] bg-white">
|
||||||
|
<Navbar />
|
||||||
|
<div className="flex-1">
|
||||||
|
<HeaderLatest />
|
||||||
|
</div>
|
||||||
|
<BreakingNews />
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
import BreakingNews from "@/components/landing-page/breaking-news";
|
||||||
|
import Footer from "@/components/landing-page/footer";
|
||||||
|
import Header from "@/components/landing-page/header";
|
||||||
|
import HeaderLatest from "@/components/landing-page/header-latest";
|
||||||
|
import Navbar from "@/components/landing-page/navbar";
|
||||||
|
import News from "@/components/landing-page/news";
|
||||||
|
import Opini from "@/components/landing-page/opini";
|
||||||
|
import PopularNews from "@/components/landing-page/popular-news";
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col font-[family-name:var(--font-geist-sans)] bg-white">
|
||||||
|
<Navbar />
|
||||||
|
<div className="flex-1">
|
||||||
|
<HeaderLatest />
|
||||||
|
</div>
|
||||||
|
<BreakingNews />
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
import BreakingNews from "@/components/landing-page/breaking-news";
|
||||||
|
import Footer from "@/components/landing-page/footer";
|
||||||
|
import Header from "@/components/landing-page/header";
|
||||||
|
import HeaderLatest from "@/components/landing-page/header-latest";
|
||||||
|
import Navbar from "@/components/landing-page/navbar";
|
||||||
|
import News from "@/components/landing-page/news";
|
||||||
|
import Opini from "@/components/landing-page/opini";
|
||||||
|
import PopularNews from "@/components/landing-page/popular-news";
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col font-[family-name:var(--font-geist-sans)] bg-white">
|
||||||
|
<Navbar />
|
||||||
|
<div className="flex-1">
|
||||||
|
<HeaderLatest />
|
||||||
|
</div>
|
||||||
|
<BreakingNews />
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
import DetailContent from "@/components/details/details-content";
|
||||||
|
import Footer from "@/components/landing-page/footer";
|
||||||
|
import Navbar from "@/components/landing-page/navbar";
|
||||||
|
import Image from "next/image";
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<div className="relative min-h-screen font-[family-name:var(--font-geist-sans)]">
|
||||||
|
<div className="relative z-10 bg-[#F2F4F3] max-w-7xl mx-auto">
|
||||||
|
<Navbar />
|
||||||
|
<div className="flex-1">
|
||||||
|
<DetailContent />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -154,16 +154,17 @@ export default function DetailContent() {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
initState();
|
initState();
|
||||||
}, [page, showData, startDateValue, selectedCategories]);
|
}, [page, showData]);
|
||||||
|
|
||||||
async function initState() {
|
async function initState() {
|
||||||
// loading();
|
// loading();
|
||||||
const req = {
|
const req = {
|
||||||
limit: showData,
|
limit: showData,
|
||||||
page,
|
page: 1,
|
||||||
search,
|
search: "",
|
||||||
categorySlug: Array.from(selectedCategories).join(","),
|
categorySlug: "",
|
||||||
sort: "desc",
|
sort: "desc",
|
||||||
|
isPublish: true,
|
||||||
sortBy: "created_at",
|
sortBy: "created_at",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -188,22 +189,12 @@ export default function DetailContent() {
|
||||||
setThumbnail(data?.thumbnailUrl);
|
setThumbnail(data?.thumbnailUrl);
|
||||||
setDiseId(data?.aiArticleId);
|
setDiseId(data?.aiArticleId);
|
||||||
setDetailFiles(data?.files);
|
setDetailFiles(data?.files);
|
||||||
setArticleDetail(data); // <-- Add this
|
setArticleDetail(data);
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="flex items-center bg-[#F2F4F3] w-full overflow-hidden mb-4 py-6 px-8">
|
|
||||||
<Image
|
|
||||||
src={"/mikul.png"}
|
|
||||||
alt="Background"
|
|
||||||
width={272}
|
|
||||||
height={90}
|
|
||||||
className="w-full md:w-[272px] h-[90px] object-cover border"
|
|
||||||
priority
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="bg-white grid grid-cols-1 md:grid-cols-3 gap-6 px-8 py-8">
|
<div className="bg-white grid grid-cols-1 md:grid-cols-3 gap-6 px-8 py-8">
|
||||||
<div className="md:col-span-2">
|
<div className="md:col-span-2">
|
||||||
<p className="text-sm text-gray-500 mb-2">Home {">"}Detail</p>
|
<p className="text-sm text-gray-500 mb-2">Home {">"}Detail</p>
|
||||||
|
|
@ -211,7 +202,7 @@ export default function DetailContent() {
|
||||||
{articleDetail?.title}
|
{articleDetail?.title}
|
||||||
</h1>
|
</h1>
|
||||||
<div className="flex items-center space-x-2 text-sm text-gray-500 mb-4">
|
<div className="flex items-center space-x-2 text-sm text-gray-500 mb-4">
|
||||||
<div className="text-[#31942E]">
|
<div className="text-orange-400">
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
width="24"
|
width="24"
|
||||||
|
|
@ -231,7 +222,7 @@ export default function DetailContent() {
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span className="text-[#31942E] font-medium">
|
<span className="text-orange-400 font-medium">
|
||||||
{articleDetail?.createdByName}
|
{articleDetail?.createdByName}
|
||||||
</span>
|
</span>
|
||||||
<span>•</span>
|
<span>•</span>
|
||||||
|
|
@ -337,11 +328,11 @@ export default function DetailContent() {
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 overflow-y-auto">
|
<div className="flex-1 overflow-y-auto">
|
||||||
<p className="text-gray-700 leading-relaxed text-justify">
|
<p className="text-gray-700 leading-relaxed text-justify">
|
||||||
<span className="text-black font-bold text-md">
|
<div
|
||||||
Mikulnews.com -
|
dangerouslySetInnerHTML={{
|
||||||
</span>
|
__html: articleDetail?.htmlDescription || "",
|
||||||
|
}}
|
||||||
{articleDetail?.description}
|
/>
|
||||||
</p>
|
</p>
|
||||||
<Author />
|
<Author />
|
||||||
<div className="flex flex-row gap-2 items-center">
|
<div className="flex flex-row gap-2 items-center">
|
||||||
|
|
@ -360,34 +351,12 @@ export default function DetailContent() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="relative mb-2 h-[120px] overflow-hidden flex items-center border my-8">
|
|
||||||
<Image
|
|
||||||
src={"/image-kolom.png"}
|
|
||||||
alt="Berita Utama"
|
|
||||||
fill
|
|
||||||
className="object-contain"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="mt-10">
|
|
||||||
<div className="flex items-center space-x-4 p-4 border rounded-lg mb-6">
|
|
||||||
<Image
|
|
||||||
src={"/author.png"}
|
|
||||||
alt="Author"
|
|
||||||
width={60}
|
|
||||||
height={60}
|
|
||||||
className="rounded-full"
|
|
||||||
/>
|
|
||||||
<div>
|
|
||||||
<p className="text-green-600 font-bold text-lg">
|
|
||||||
christine natalia
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<div className="mt-10">
|
||||||
<h2 className="text-2xl font-bold mb-2">Tinggalkan Balasan</h2>
|
<h2 className="text-2xl font-bold mb-2">Tinggalkan Balasan</h2>
|
||||||
<p className="text-gray-600 mb-4 text-sm">
|
<p className="text-gray-600 mb-4 text-sm">
|
||||||
Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib
|
Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib
|
||||||
ditandai <span className="text-green-600">*</span>
|
ditandai <span className="text-orange-600">*</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<form className="space-y-6 mt-6">
|
<form className="space-y-6 mt-6">
|
||||||
|
|
@ -396,7 +365,7 @@ export default function DetailContent() {
|
||||||
htmlFor="komentar"
|
htmlFor="komentar"
|
||||||
className="block text-sm font-medium mb-1"
|
className="block text-sm font-medium mb-1"
|
||||||
>
|
>
|
||||||
Komentar <span className="text-green-600">*</span>
|
Komentar <span className="text-orange-600">*</span>
|
||||||
</label>
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
id="komentar"
|
id="komentar"
|
||||||
|
|
@ -410,7 +379,7 @@ export default function DetailContent() {
|
||||||
htmlFor="nama"
|
htmlFor="nama"
|
||||||
className="block text-sm font-medium mb-1"
|
className="block text-sm font-medium mb-1"
|
||||||
>
|
>
|
||||||
Nama <span className="text-green-600">*</span>
|
Nama <span className="text-orange-600">*</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
|
@ -426,7 +395,7 @@ export default function DetailContent() {
|
||||||
htmlFor="email"
|
htmlFor="email"
|
||||||
className="block text-sm font-medium mb-1"
|
className="block text-sm font-medium mb-1"
|
||||||
>
|
>
|
||||||
Email <span className="text-green-600">*</span>
|
Email <span className="text-orange-600">*</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
|
|
@ -465,7 +434,7 @@ export default function DetailContent() {
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="bg-green-600 hover:bg-green-700 text-white font-semibold px-6 py-2 rounded-md transition mt-2"
|
className="bg-orange-600 hover:bg-orange-700 text-white font-semibold px-6 py-2 rounded-md transition mt-2"
|
||||||
>
|
>
|
||||||
KIRIM KOMENTAR
|
KIRIM KOMENTAR
|
||||||
</button>
|
</button>
|
||||||
|
|
@ -584,82 +553,64 @@ export default function DetailContent() {
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
|
{/* Artikel utama (featured) */}
|
||||||
|
{articles.length > 0 && (
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<Image
|
<Image
|
||||||
src={"/gaza.png"}
|
src={articles[0]?.thumbnailUrl || "/default.jpg"}
|
||||||
alt="Recommended Article"
|
alt={articles[0]?.title || "Recommended Article"}
|
||||||
width={400}
|
width={400}
|
||||||
height={200}
|
height={200}
|
||||||
className="rounded-lg w-full h-auto object-cover"
|
className="rounded-lg w-full h-auto object-cover"
|
||||||
/>
|
/>
|
||||||
<div className="absolute bottom-0 left-0 right-0 bg-black bg-opacity-60 text-white p-3 rounded-b-lg">
|
<div className="absolute bottom-0 left-0 right-0 bg-black bg-opacity-60 text-white p-3 rounded-b-lg">
|
||||||
<p className="text-sm font-semibold leading-tight">
|
<p className="text-sm font-semibold leading-tight">
|
||||||
Bom Bunuh Diri Guncang Gereja di Damaskus, 20 Orang Tewas
|
{articles[0]?.title}
|
||||||
dan Puluhan Terluka
|
|
||||||
</p>
|
</p>
|
||||||
<p className="text-xs text-gray-300 mt-1">
|
<p className="text-xs text-gray-300 mt-1">
|
||||||
📅 23 JUNI 2025
|
📅{" "}
|
||||||
|
{new Date(articles[0]?.createdAt).toLocaleDateString(
|
||||||
|
"id-ID",
|
||||||
|
{
|
||||||
|
day: "2-digit",
|
||||||
|
month: "long",
|
||||||
|
year: "numeric",
|
||||||
|
}
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* List artikel lain */}
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="flex space-x-3">
|
{articles.slice(1, 4).map((item) => (
|
||||||
|
<div key={item.id} className="flex space-x-3">
|
||||||
<Image
|
<Image
|
||||||
src={"/perang.png"}
|
src={item.thumbnailUrl || "/default.jpg"}
|
||||||
alt="OPM Serang Gereja"
|
alt={item.title}
|
||||||
width={80}
|
width={80}
|
||||||
height={60}
|
height={60}
|
||||||
className="rounded object-cover w-[80px] h-[60px]"
|
className="rounded object-cover w-[80px] h-[60px]"
|
||||||
/>
|
/>
|
||||||
<div>
|
<div>
|
||||||
<p className="text-sm font-semibold leading-snug">
|
<p className="text-sm font-semibold leading-snug">
|
||||||
OPM Mulai Kehilangan Simpati dari Masyarakat Papua Usai
|
{item.title}
|
||||||
Serang Gereja
|
|
||||||
</p>
|
</p>
|
||||||
<p className="text-xs text-gray-500 mt-1">
|
<p className="text-xs text-gray-500 mt-1">
|
||||||
📅 15 JUNI 2025
|
📅{" "}
|
||||||
</p>
|
{new Date(item.createdAt).toLocaleDateString(
|
||||||
</div>
|
"id-ID",
|
||||||
</div>
|
{
|
||||||
|
day: "2-digit",
|
||||||
<div className="flex space-x-3">
|
month: "long",
|
||||||
<Image
|
year: "numeric",
|
||||||
src={"/jateng.png"}
|
}
|
||||||
alt="Denda Merokok"
|
)}
|
||||||
width={80}
|
|
||||||
height={60}
|
|
||||||
className="rounded object-cover w-[80px] h-[60px]"
|
|
||||||
/>
|
|
||||||
<div>
|
|
||||||
<p className="text-sm font-semibold leading-snug">
|
|
||||||
Jakarta Terapkan Denda Rp 250.000 bagi Warga yang
|
|
||||||
Merokok Sembarangan
|
|
||||||
</p>
|
|
||||||
<p className="text-xs text-gray-500 mt-1">
|
|
||||||
📅 13 JUNI 2025
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex space-x-3">
|
|
||||||
<Image
|
|
||||||
src={"/investasi.jpg"}
|
|
||||||
alt="Pengguna Internet"
|
|
||||||
width={80}
|
|
||||||
height={60}
|
|
||||||
className="rounded object-cover w-[80px] h-[60px]"
|
|
||||||
/>
|
|
||||||
<div>
|
|
||||||
<p className="text-sm font-semibold leading-snug">
|
|
||||||
Warga Indonesia Jadi Pengguna Internet via Ponsel
|
|
||||||
Terbanyak di Dunia
|
|
||||||
</p>
|
|
||||||
<p className="text-xs text-gray-500 mt-1">
|
|
||||||
📅 26 MEI 2025
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -197,8 +197,8 @@ const TinyMCEEditor: React.FC<TinyMCEEditorProps> = ({
|
||||||
height,
|
height,
|
||||||
language,
|
language,
|
||||||
placeholder,
|
placeholder,
|
||||||
readonly: readOnly,
|
// readonly: readOnly,
|
||||||
disabled,
|
// disabled,
|
||||||
branding: false,
|
branding: false,
|
||||||
elementpath: false,
|
elementpath: false,
|
||||||
resize: false,
|
resize: false,
|
||||||
|
|
@ -270,9 +270,9 @@ const TinyMCEEditor: React.FC<TinyMCEEditorProps> = ({
|
||||||
onInit={handleEditorInit}
|
onInit={handleEditorInit}
|
||||||
initialValue={initialData}
|
initialValue={initialData}
|
||||||
onEditorChange={handleEditorChange}
|
onEditorChange={handleEditorChange}
|
||||||
disabled={disabled}
|
disabled={disabled || readOnly}
|
||||||
apiKey={process.env.NEXT_PUBLIC_TINYMCE_API_KEY}
|
apiKey={process.env.NEXT_PUBLIC_TINYMCE_API_KEY}
|
||||||
// init={editorConfig}
|
init={editorConfig}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* Status bar */}
|
{/* Status bar */}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { getListArticle } from "@/service/article";
|
import { getListArticle } from "@/service/article";
|
||||||
|
import Link from "next/link";
|
||||||
|
|
||||||
type Article = {
|
type Article = {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
@ -72,6 +73,7 @@ export default function BreakingNews() {
|
||||||
<div className="md:col-span-2 space-y-6">
|
<div className="md:col-span-2 space-y-6">
|
||||||
{articles.map((item) => (
|
{articles.map((item) => (
|
||||||
<div key={item.id} className="flex gap-4 border-b pb-4">
|
<div key={item.id} className="flex gap-4 border-b pb-4">
|
||||||
|
<Link className="flex gap-4" href={`/detail/${item?.id}`}>
|
||||||
<Image
|
<Image
|
||||||
src={item.thumbnailUrl || "/dummy.jpg"}
|
src={item.thumbnailUrl || "/dummy.jpg"}
|
||||||
alt={item.title}
|
alt={item.title}
|
||||||
|
|
@ -95,6 +97,7 @@ export default function BreakingNews() {
|
||||||
{item.description}
|
{item.description}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -146,6 +149,7 @@ export default function BreakingNews() {
|
||||||
|
|
||||||
{popular.length > 0 && (
|
{popular.length > 0 && (
|
||||||
<div className="space-y-5">
|
<div className="space-y-5">
|
||||||
|
<Link className="flex gap-4" href={`/detail/${popular[0]?.id}`}>
|
||||||
{/* Item pertama tampil besar */}
|
{/* Item pertama tampil besar */}
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<Image
|
<Image
|
||||||
|
|
@ -168,7 +172,7 @@ export default function BreakingNews() {
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
{/* Item sisanya */}
|
{/* Item sisanya */}
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
{popular.slice(1).map((item, i) => (
|
{popular.slice(1).map((item, i) => (
|
||||||
|
|
@ -176,6 +180,7 @@ export default function BreakingNews() {
|
||||||
key={item.id}
|
key={item.id}
|
||||||
className="flex gap-3 items-start border-b pb-2 last:border-b-0"
|
className="flex gap-3 items-start border-b pb-2 last:border-b-0"
|
||||||
>
|
>
|
||||||
|
<Link className="flex gap-4" href={`/detail/${item?.id}`}>
|
||||||
<span className="text-lg font-bold text-gray-400">
|
<span className="text-lg font-bold text-gray-400">
|
||||||
0{i + 2}
|
0{i + 2}
|
||||||
</span>
|
</span>
|
||||||
|
|
@ -185,6 +190,7 @@ export default function BreakingNews() {
|
||||||
</h5>
|
</h5>
|
||||||
<p className="text-xs text-gray-400">0 Shares</p>
|
<p className="text-xs text-gray-400">0 Shares</p>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { getListArticle } from "@/service/article";
|
import { getListArticle } from "@/service/article";
|
||||||
|
import Link from "next/link";
|
||||||
|
|
||||||
type Article = {
|
type Article = {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
@ -50,7 +51,7 @@ export default function HeaderLatest() {
|
||||||
return (
|
return (
|
||||||
<header className="w-full pt-3 flex justify-center">
|
<header className="w-full pt-3 flex justify-center">
|
||||||
<div className="relative max-w-screen-xl w-full h-[320px] md:h-[480px] mx-3 md:mx-5 overflow-hidden group">
|
<div className="relative max-w-screen-xl w-full h-[320px] md:h-[480px] mx-3 md:mx-5 overflow-hidden group">
|
||||||
{/* Gambar utama */}
|
<Link className="flex gap-4" href={`/detail/${article?.id}`}>
|
||||||
<Image
|
<Image
|
||||||
src={article?.thumbnailUrl || "/dummy.jpg"}
|
src={article?.thumbnailUrl || "/dummy.jpg"}
|
||||||
alt={article?.title || "No Title"}
|
alt={article?.title || "No Title"}
|
||||||
|
|
@ -70,6 +71,7 @@ export default function HeaderLatest() {
|
||||||
{article?.title || "Memuat..."}
|
{article?.title || "Memuat..."}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { getListArticle } from "@/service/article";
|
import { getListArticle } from "@/service/article";
|
||||||
|
import Link from "next/link";
|
||||||
|
|
||||||
type Article = {
|
type Article = {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
@ -51,6 +52,7 @@ export default function Header() {
|
||||||
return (
|
return (
|
||||||
<header className="bg-white w-full pt-3 flex justify-center">
|
<header className="bg-white w-full pt-3 flex justify-center">
|
||||||
<div className="relative max-w-screen-xl h-auto md:h-[483px] flex flex-col md:flex-row overflow-hidden shadow-md mx-3 md:mx-3 lg:mx-5">
|
<div className="relative max-w-screen-xl h-auto md:h-[483px] flex flex-col md:flex-row overflow-hidden shadow-md mx-3 md:mx-3 lg:mx-5">
|
||||||
|
<Link className="flex" href={`/detail/${article?.id}`}>
|
||||||
<div className="w-full md:w-1/2 h-[250px] md:h-full">
|
<div className="w-full md:w-1/2 h-[250px] md:h-full">
|
||||||
<Image
|
<Image
|
||||||
src={article?.thumbnailUrl || "/dummy.jpg"}
|
src={article?.thumbnailUrl || "/dummy.jpg"}
|
||||||
|
|
@ -127,6 +129,7 @@ export default function Header() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -41,16 +41,19 @@ export default function Navbar() {
|
||||||
BERITA TERKINI
|
BERITA TERKINI
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/berita-populer"
|
href="/category/popular-news"
|
||||||
className="text-black hover:text-[#795548]"
|
className="text-black hover:text-[#795548]"
|
||||||
>
|
>
|
||||||
BERITA POPULER
|
BERITA POPULER
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="/jaga-negeri" className="text-black hover:text-[#795548]">
|
<Link
|
||||||
|
href="/category/protect"
|
||||||
|
className="text-black hover:text-[#795548]"
|
||||||
|
>
|
||||||
JAGA NEGERI
|
JAGA NEGERI
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/berita-opini"
|
href="/category/opinion-news"
|
||||||
className="text-black hover:text-[#795548]"
|
className="text-black hover:text-[#795548]"
|
||||||
>
|
>
|
||||||
BERITA OPINI
|
BERITA OPINI
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import {
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { getListArticle } from "@/service/article";
|
import { getListArticle } from "@/service/article";
|
||||||
|
import Link from "next/link";
|
||||||
|
|
||||||
type Article = {
|
type Article = {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
@ -88,6 +89,7 @@ export default function News() {
|
||||||
key={item.id}
|
key={item.id}
|
||||||
className="flex flex-col md:flex-row gap-4 pb-6"
|
className="flex flex-col md:flex-row gap-4 pb-6"
|
||||||
>
|
>
|
||||||
|
<Link className="flex gap-4" href={`/detail/${item?.id}`}>
|
||||||
<div className="w-full md:w-[250px]">
|
<div className="w-full md:w-[250px]">
|
||||||
<Image
|
<Image
|
||||||
src={item.thumbnailUrl || "/dummy.jpg"}
|
src={item.thumbnailUrl || "/dummy.jpg"}
|
||||||
|
|
@ -146,6 +148,7 @@ export default function News() {
|
||||||
{truncateText(item.description, 50)}
|
{truncateText(item.description, 50)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { getListArticle } from "@/service/article";
|
import { getListArticle } from "@/service/article";
|
||||||
|
import Link from "next/link";
|
||||||
|
|
||||||
type Article = {
|
type Article = {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
@ -83,6 +84,7 @@ export default function Opini() {
|
||||||
key={item.id}
|
key={item.id}
|
||||||
className="flex items-start gap-4 border-b pb-4"
|
className="flex items-start gap-4 border-b pb-4"
|
||||||
>
|
>
|
||||||
|
<Link className="flex gap-4" href={`/detail/${item?.id}`}>
|
||||||
<Image
|
<Image
|
||||||
src={item.thumbnailUrl || "/dummy.jpg"}
|
src={item.thumbnailUrl || "/dummy.jpg"}
|
||||||
alt={item.title}
|
alt={item.title}
|
||||||
|
|
@ -91,7 +93,9 @@ export default function Opini() {
|
||||||
className="w-[109px] h-16 object-cover"
|
className="w-[109px] h-16 object-cover"
|
||||||
/>
|
/>
|
||||||
<div>
|
<div>
|
||||||
<p className="text-sm font-medium font-serif">{item.title}</p>
|
<p className="text-sm font-medium font-serif">
|
||||||
|
{item.title}
|
||||||
|
</p>
|
||||||
<p className="text-xs text-gray-500 mt-1 flex items-center gap-1">
|
<p className="text-xs text-gray-500 mt-1 flex items-center gap-1">
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
|
@ -129,6 +133,7 @@ export default function Opini() {
|
||||||
0
|
0
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -144,6 +149,7 @@ export default function Opini() {
|
||||||
|
|
||||||
{jagaNegeri.length > 0 && (
|
{jagaNegeri.length > 0 && (
|
||||||
<div className="mt-6 flex flex-col md:flex-row gap-6">
|
<div className="mt-6 flex flex-col md:flex-row gap-6">
|
||||||
|
<Link className="flex" href={`/detail/${jagaNegeri[0]?.id}`}>
|
||||||
<div className="w-full md:w-[455px]">
|
<div className="w-full md:w-[455px]">
|
||||||
<Image
|
<Image
|
||||||
src={jagaNegeri[0].thumbnailUrl || "/dummy.jpg"}
|
src={jagaNegeri[0].thumbnailUrl || "/dummy.jpg"}
|
||||||
|
|
@ -152,7 +158,9 @@ export default function Opini() {
|
||||||
height={400}
|
height={400}
|
||||||
className="w-full h-[330px] object-cover"
|
className="w-full h-[330px] object-cover"
|
||||||
/>
|
/>
|
||||||
<p className="text-lg mt-4 font-serif">{jagaNegeri[0].title}</p>
|
<p className="text-lg mt-4 font-serif">
|
||||||
|
{jagaNegeri[0].title}
|
||||||
|
</p>
|
||||||
<p className="text-xs text-gray-500 mt-1 flex items-center gap-2">
|
<p className="text-xs text-gray-500 mt-1 flex items-center gap-2">
|
||||||
{new Date(jagaNegeri[0].createdAt).toLocaleDateString(
|
{new Date(jagaNegeri[0].createdAt).toLocaleDateString(
|
||||||
"id-ID",
|
"id-ID",
|
||||||
|
|
@ -164,10 +172,12 @@ export default function Opini() {
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
|
|
||||||
<div className="w-full md:w-4/12 flex flex-col gap-4">
|
<div className="w-full md:w-4/12 flex flex-col gap-4">
|
||||||
{jagaNegeri.slice(1).map((item) => (
|
{jagaNegeri.slice(1).map((item) => (
|
||||||
<div key={item.id} className="flex flex-col gap-3">
|
<div key={item.id} className="flex flex-col gap-3">
|
||||||
|
<Link className=" gap-3" href={`/detail/${item?.id}`}>
|
||||||
<Image
|
<Image
|
||||||
src={item.thumbnailUrl || "/dummy.jpg"}
|
src={item.thumbnailUrl || "/dummy.jpg"}
|
||||||
alt={item.title}
|
alt={item.title}
|
||||||
|
|
@ -178,6 +188,7 @@ export default function Opini() {
|
||||||
<p className="text-sm font-serif font-medium leading-snug">
|
<p className="text-sm font-serif font-medium leading-snug">
|
||||||
{item.title}
|
{item.title}
|
||||||
</p>
|
</p>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { getListArticle } from "@/service/article";
|
import { getListArticle } from "@/service/article";
|
||||||
|
import Link from "next/link";
|
||||||
|
|
||||||
type Article = {
|
type Article = {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
@ -65,6 +66,7 @@ export default function PopularNews() {
|
||||||
key={news.id}
|
key={news.id}
|
||||||
className="relative h-[358px] group overflow-hidden"
|
className="relative h-[358px] group overflow-hidden"
|
||||||
>
|
>
|
||||||
|
<Link className=" gap-3" href={`/detail/${news?.id}`}>
|
||||||
<Image
|
<Image
|
||||||
src={news.thumbnailUrl || "/dummy.jpg"}
|
src={news.thumbnailUrl || "/dummy.jpg"}
|
||||||
alt={news.title}
|
alt={news.title}
|
||||||
|
|
@ -73,8 +75,11 @@ export default function PopularNews() {
|
||||||
className="w-full h-[358px] object-cover transition-transform duration-300 group-hover:scale-105"
|
className="w-full h-[358px] object-cover transition-transform duration-300 group-hover:scale-105"
|
||||||
/>
|
/>
|
||||||
<div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/80 to-transparent text-white p-3">
|
<div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/80 to-transparent text-white p-3">
|
||||||
<p className="text-xl font-serif font-medium">{news.title}</p>
|
<p className="text-xl font-serif font-medium">
|
||||||
|
{news.title}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
Loading…
Reference in New Issue