diff --git a/src/app/api/forum/[id]/route.ts b/src/app/api/forum/[id]/route.ts new file mode 100644 index 00000000..9a18775f --- /dev/null +++ b/src/app/api/forum/[id]/route.ts @@ -0,0 +1,54 @@ +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; + +export { GET }; + +async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const { id } = params; + + const data = await prisma.forum_Posting.findUnique({ + where: { + id: id, + }, + select: { + id: true, + diskusi: true, + isActive: true, + createdAt: true, + authorId: true, + Author: { + select: { + id: true, + username: true, + Profile: true, + }, + }, + + _count: { + select: { + Forum_Komentar: true, + }, + }, + ForumMaster_StatusPosting: true, + forumMaster_StatusPostingId: true, + }, + }); + + return NextResponse.json({ + success: true, + message: "Success get data", + data: data, + }); + } catch (error) { + backendLogger.error("Error get data forum", error); + return NextResponse.json( + { + success: false, + message: "Error get data forum", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/dev/forum/edit/posting/[id]/page.tsx b/src/app/dev/forum/edit/posting/[id]/page.tsx index 292059f4..726a9ff6 100644 --- a/src/app/dev/forum/edit/posting/[id]/page.tsx +++ b/src/app/dev/forum/edit/posting/[id]/page.tsx @@ -1,13 +1,10 @@ import { Forum_EditPosting } from "@/app_modules/forum"; -import { forum_getOnePostingById } from "@/app_modules/forum/fun/get/get_one_posting_by_id"; -export default async function Page({ params }: { params: { id: string } }) { - let postingId = params.id; - const dataPosting = await forum_getOnePostingById(postingId) +export default async function Page() { return ( <> - + ); } diff --git a/src/app_modules/forum/component/api_fetch_forum.ts b/src/app_modules/forum/component/api_fetch_forum.ts index 0db2b443..50338352 100644 --- a/src/app_modules/forum/component/api_fetch_forum.ts +++ b/src/app_modules/forum/component/api_fetch_forum.ts @@ -1,4 +1,4 @@ -export { apiGetAllForum }; +export { apiGetAllForum, apiGetOneForumById }; const apiGetAllForum = async ({ page, @@ -39,3 +39,35 @@ const apiGetAllForum = async ({ throw error; // Re-throw the error to handle it in the calling function } }; + +const apiGetOneForumById = async ({ id }: { id: string }) => { + try { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + const response = await fetch(`/api/forum/${id}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + // Check if the response is OK + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error("Failed to get all forum:", response.statusText, errorData); + throw new Error(errorData?.message || "Failed to get all forum"); + } + + // Return the JSON response + return await response.json(); + } catch (error) { + console.error("Error get all forum", error); + throw error; // Re-throw the error to handle it in the calling function + } +}; diff --git a/src/app_modules/forum/edit/posting/index.tsx b/src/app_modules/forum/edit/posting/index.tsx index d17d721e..5a7ae6f2 100644 --- a/src/app_modules/forum/edit/posting/index.tsx +++ b/src/app_modules/forum/edit/posting/index.tsx @@ -1,35 +1,23 @@ "use client"; -import { - ActionIcon, - Button, - Center, - Group, - Loader, - Paper, - Stack, -} from "@mantine/core"; -import "react-quill/dist/quill.snow.css"; -import "react-quill/dist/quill.bubble.css"; -import { IconPhotoUp } from "@tabler/icons-react"; +import { Button, Group, Paper, Stack } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; -import { useRouter } from "next/navigation"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/_global/loading_page_v2"; +import { useParams, useRouter } from "next/navigation"; +import "react-quill/dist/quill.bubble.css"; +import "react-quill/dist/quill.snow.css"; -import dynamic from "next/dynamic"; -import React, { useState } from "react"; -import { useAtom } from "jotai"; -import { gs_forum_loading_edit_posting } from "../../global_state"; -import { MODEL_FORUM_POSTING } from "../../model/interface"; -import { forum_funEditPostingById } from "../../fun/edit/fun_edit_posting_by_id"; +import { MainColor } from "@/app_modules/_global/color/color_pallet"; +import ComponentGlobal_InputCountDown from "@/app_modules/_global/component/input_countdown"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global/notifikasi_peringatan"; -import ComponentGlobal_InputCountDown from "@/app_modules/_global/component/input_countdown"; -import { - AccentColor, - MainColor, -} from "@/app_modules/_global/color/color_pallet"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { clientLogger } from "@/util/clientLogger"; +import dynamic from "next/dynamic"; +import { useState } from "react"; +import { apiGetOneForumById } from "../../component/api_fetch_forum"; +import { forum_funEditPostingById } from "../../fun/edit/fun_edit_posting_by_id"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; const ReactQuill = dynamic( () => { return import("react-quill"); @@ -37,23 +25,35 @@ const ReactQuill = dynamic( { ssr: false } ); -export default function Forum_EditPosting({ - dataPosting, -}: { - dataPosting: MODEL_FORUM_POSTING; -}) { - const [value, setValue] = useState(dataPosting); +const maxLength = 500; + +export default function Forum_EditPosting() { + const param = useParams<{ id: string }>(); + const [data, setData] = useState(null); const [reload, setReload] = useState(false); useShallowEffect(() => { if (window && window.document) setReload(true); }, []); - if (!reload) - return ( - <> - - - ); + useShallowEffect(() => { + handleLoadData(); + }, []); + + const handleLoadData = async () => { + try { + const response = await apiGetOneForumById({ + id: param.id, + }); + + if (response.success) { + setData(response.data); + } + } catch (error) { + clientLogger.error("Error get data forum", error); + } + }; + + if (!reload || !data) return ; return ( <> @@ -63,10 +63,21 @@ export default function Forum_EditPosting({ theme="bubble" placeholder="Apa yang sedang ingin dibahas ?" style={{ height: 150 }} - value={value.diskusi} + value={data.diskusi} onChange={(val) => { - setValue({ - ...value, + const input = val; + const text = input.replace(/<[^>]+>/g, "").trim(); // Remove HTML tags and trim whitespace + + if (text.length === 0) { + setData({ + ...data, + diskusi: "", + }); + + return; + } + setData({ + ...data, diskusi: val, }); }} @@ -74,15 +85,12 @@ export default function Forum_EditPosting({ - {/* - - */} - + {/*
*/} @@ -104,15 +112,21 @@ function ButtonAction({ if (diskusi === "


" || diskusi === "") return ComponentGlobal_NotifikasiPeringatan("Masukan postingan anda"); - await forum_funEditPostingById(postingId, diskusi).then((res) => { - if (res.status === 200) { - setLoading(true); - ComponentGlobal_NotifikasiBerhasil(res.message); - setTimeout(() => router.back(), 1000); + try { + setLoading(true); + const update = await forum_funEditPostingById(postingId, diskusi); + + if (update.status === 200) { + ComponentGlobal_NotifikasiBerhasil(update.message); + router.back(); } else { - ComponentGlobal_NotifikasiGagal(res.message); + ComponentGlobal_NotifikasiGagal(update.message); } - }); + } catch (error) { + clientLogger.error("Error update forum", error); + } finally { + setLoading(false); + } } return ( @@ -120,23 +134,24 @@ function ButtonAction({