-
+ {bannerAd ? (
+
+
+
+
+
+ ) : (
+
+ )}
diff --git a/components/form/article/create-article-form.tsx b/components/form/article/create-article-form.tsx
index 4ef5c90..a8fbe78 100644
--- a/components/form/article/create-article-form.tsx
+++ b/components/form/article/create-article-form.tsx
@@ -9,7 +9,7 @@ import { CloudUploadIcon, TimesIcon } from "@/components/icons";
import Image from "next/image";
import ReactSelect from "react-select";
import makeAnimated from "react-select/animated";
-import { htmlToString } from "@/utils/global";
+import { convertDateFormatNoTime, htmlToString } from "@/utils/global";
import { close, error, loading, successToast } from "@/config/swal";
import { useRouter } from "next/navigation";
import Link from "next/link";
@@ -44,6 +44,13 @@ import GenerateSingleArticleForm from "./generate-ai-single-form";
import GenerateContentRewriteForm from "./generate-ai-content-rewrite-form";
import { Textarea } from "@/components/ui/textarea";
import { Badge } from "@/components/ui/badge";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/ui/popover";
+import { Calendar } from "@/components/ui/calendar";
+import DatePicker from "react-datepicker";
const CustomEditor = dynamic(
() => {
@@ -121,8 +128,8 @@ export default function CreateArticleForm() {
"publish"
);
const [isScheduled, setIsScheduled] = useState(false);
-
- const [startDateValue, setStartDateValue] = useState
(null);
+ const [startDateValue, setStartDateValue] = useState();
+ const [startTimeValue, setStartTimeValue] = useState("");
const { getRootProps, getInputProps } = useDropzone({
onDrop: (acceptedFiles) => {
@@ -332,12 +339,34 @@ export default function CreateArticleForm() {
}
}
- if (status === "scheduled") {
+ if (status === "scheduled" && startDateValue) {
+ // ambil waktu, default 00:00 jika belum diisi
+ const [hours, minutes] = startTimeValue
+ ? startTimeValue.split(":").map(Number)
+ : [0, 0];
+
+ // gabungkan tanggal + waktu
+ const combinedDate = new Date(startDateValue);
+ combinedDate.setHours(hours, minutes, 0, 0);
+
+ // format: 2025-10-08 14:30:00
+ const formattedDateTime = `${combinedDate.getFullYear()}-${String(
+ combinedDate.getMonth() + 1
+ ).padStart(2, "0")}-${String(combinedDate.getDate()).padStart(
+ 2,
+ "0"
+ )} ${String(combinedDate.getHours()).padStart(2, "0")}:${String(
+ combinedDate.getMinutes()
+ ).padStart(2, "0")}:00`;
+
const request = {
id: articleId,
- date: `${startDateValue?.year}-${startDateValue?.month}-${startDateValue?.day}`,
+ date: formattedDateTime,
};
+
+ console.log("📤 Sending schedule request:", request);
const res = await createArticleSchedule(request);
+ console.log("✅ Schedule response:", res);
}
close();
@@ -812,32 +841,49 @@ export default function CreateArticleForm() {
- {/* {isScheduled && (
-
-
+ {isScheduled && (
+
+ {/* Pilih tanggal */}
+
Tanggal
-
+ setStartDateValue(date ?? undefined)
+ }
+ dateFormat="yyyy-MM-dd"
+ className="w-full border rounded-lg px-2 py-1 text-black cursor-pointer h-[150px]"
+ placeholderText="Pilih tanggal"
/>
+
+ {/* Pilih waktu */}
+
+
Waktu
+
setStartTimeValue(e.target.value)}
+ className="w-full border rounded-lg px-2 py-[6px] text-black"
+ />
+
- )} */}
+ )}
diff --git a/components/landing-page/headers.tsx b/components/landing-page/headers.tsx
index ee7eaf5..4e062a8 100644
--- a/components/landing-page/headers.tsx
+++ b/components/landing-page/headers.tsx
@@ -6,6 +6,7 @@ import { Calendar, Eye, MessageSquare } from "lucide-react";
import { useEffect, useState } from "react";
import { getListArticle } from "@/service/article";
import Link from "next/link";
+import { getAdvertise } from "@/service/advertisement";
type Article = {
id: number;
@@ -19,10 +20,49 @@ type Article = {
files: { fileUrl: string; file_alt: string }[];
};
+type Advertise = {
+ id: number;
+ title: string;
+ description: string;
+ placement: string;
+ contentFileUrl: string;
+ redirectLink: string;
+};
+
export default function Header() {
const [articles, setArticles] = useState
([]);
const [showData, setShowData] = useState("5");
+ const [bannerAd, setBannerAd] = useState(null);
+
+ useEffect(() => {
+ initStateAdver();
+ }, []);
+
+ async function initStateAdver() {
+ const req = {
+ limit: 100,
+ page: 1,
+ sort: "desc",
+ sortBy: "created_at",
+ isPublish: true,
+ };
+
+ try {
+ const res = await getAdvertise(req);
+ const data: Advertise[] = res?.data?.data || [1];
+
+ // filter iklan dengan placement = "banner"
+ const banner = data.find((ad) => ad.placement === "jumbotron");
+
+ if (banner) {
+ setBannerAd(banner);
+ }
+ } catch (err) {
+ console.error("Error fetching advertisement:", err);
+ }
+ }
+
useEffect(() => {
fetchArticles();
}, [showData]);
@@ -160,12 +200,32 @@ export default function Header() {
{/* Kolom PPS */}
-
+ {bannerAd ? (
+
+
+
+
+
+ ) : (
+
+ )}
diff --git a/components/landing-page/latest-news.tsx b/components/landing-page/latest-news.tsx
index e3bbe75..53d89d7 100644
--- a/components/landing-page/latest-news.tsx
+++ b/components/landing-page/latest-news.tsx
@@ -4,6 +4,7 @@ import Image from "next/image";
import { getListArticle } from "@/service/article";
import Link from "next/link";
import { usePathname } from "next/navigation";
+import { getAdvertise } from "@/service/advertisement";
type Article = {
id: number;
@@ -17,12 +18,49 @@ type Article = {
files: { fileUrl: string; file_alt: string }[];
};
+type Advertise = {
+ id: number;
+ title: string;
+ description: string;
+ placement: string;
+ contentFileUrl: string;
+ redirectLink: string;
+};
+
export default function LatestNews() {
const [articles, setArticles] = useState