From 703e3478303a120cdf80f98331e5fb7bb12ff753 Mon Sep 17 00:00:00 2001 From: Ardeman Date: Thu, 6 Mar 2025 09:30:53 +0800 Subject: [PATCH] feat: implement news fetching API and integrate with dashboard contents --- app/apis/admin/get-news.ts | 48 +++++++++++++++++++ app/pages/dashboard-contents/data.ts | 4 +- app/pages/dashboard-contents/index.tsx | 34 +++++++------ .../_admin.lg-admin._dashboard.contents.tsx | 12 +++++ 4 files changed, 81 insertions(+), 17 deletions(-) create mode 100644 app/apis/admin/get-news.ts diff --git a/app/apis/admin/get-news.ts b/app/apis/admin/get-news.ts new file mode 100644 index 0000000..f0e6cbb --- /dev/null +++ b/app/apis/admin/get-news.ts @@ -0,0 +1,48 @@ +import { z } from 'zod' + +import { HttpServer, type THttpServer } from '~/libs/http-server' + +const newsSchema = z.object({ + data: z.array( + z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + categories: z.array( + z.object({ + id: z.string(), + name: z.string(), + code: z.string(), + created_at: z.string(), + updated_at: z.string(), + }), + ), + tags: z.array( + z.object({ + id: z.string(), + name: z.string(), + code: z.string(), + created_at: z.string(), + updated_at: z.string(), + }), + ), + is_premium: z.boolean(), + slug: z.string(), + featured_image: z.string(), + author_id: z.string(), + live_at: z.string(), + created_at: z.string(), + updated_at: z.string(), + }), + ), +}) + +export const getNews = async (parameters: THttpServer) => { + try { + const { data } = await HttpServer(parameters).get(`/api/news`) + return newsSchema.parse(data) + } catch (error) { + // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject + return Promise.reject(error) + } +} diff --git a/app/pages/dashboard-contents/data.ts b/app/pages/dashboard-contents/data.ts index 5c79f59..93a4c2c 100644 --- a/app/pages/dashboard-contents/data.ts +++ b/app/pages/dashboard-contents/data.ts @@ -1,4 +1,4 @@ -type TContens = { +type TContents = { id: number createdAt: string author: string @@ -8,7 +8,7 @@ type TContens = { status: string } -export const CONTENTS: TContens[] = [ +export const CONTENTS: TContents[] = [ { id: 1, createdAt: '24/10/2024', diff --git a/app/pages/dashboard-contents/index.tsx b/app/pages/dashboard-contents/index.tsx index c6238d7..3d40b19 100644 --- a/app/pages/dashboard-contents/index.tsx +++ b/app/pages/dashboard-contents/index.tsx @@ -1,35 +1,39 @@ import DT from 'datatables.net-dt' import DataTable from 'datatables.net-react' -import { Link } from 'react-router' +import { Link, useRouteLoaderData } from 'react-router' import { Button } from '~/components/ui/button' import { UiTable } from '~/components/ui/table' import { TitleDashboard } from '~/components/ui/title-dashboard' - -import { CONTENTS } from './data' +import type { loader } from '~/routes/_admin.lg-admin._dashboard.contents' export const ContentsPage = () => { + const loaderData = useRouteLoaderData( + 'routes/_admin.lg-admin._dashboard.contents', + ) + const newsData = loaderData?.newsData + DataTable.use(DT) - const dataTable = CONTENTS + const dataTable = newsData const dataColumns = [ { title: 'No', data: 'id' }, - { title: 'Tanggal Kontent', data: 'createdAt' }, - { title: 'Nama Penulis', data: 'author' }, + { title: 'Tanggal Konten', data: 'created_at' }, + { title: 'Nama Penulis', data: 'author_id' }, { title: 'Judul', data: 'title' }, - { title: 'Kategori', data: 'category' }, + // { title: 'Kategori', data: 'category' }, { title: 'Tags', - data: 'tags', + data: 'is_premium', render: (value: string) => { - return value === 'Normal' - ? `${value}` - : `${value}` + return value + ? `Premium` + : `Normal` }, }, - { - title: 'Action', - data: 'id', - }, + // { + // title: 'Action', + // data: 'id', + // }, ] const dataSlot = { 6: (value: string | number) => { diff --git a/app/routes/_admin.lg-admin._dashboard.contents.tsx b/app/routes/_admin.lg-admin._dashboard.contents.tsx index f0d4595..8d7ce89 100644 --- a/app/routes/_admin.lg-admin._dashboard.contents.tsx +++ b/app/routes/_admin.lg-admin._dashboard.contents.tsx @@ -1,4 +1,16 @@ +import { getNews } from '~/apis/admin/get-news' +import { handleCookie } from '~/libs/cookies' import { ContentsPage } from '~/pages/dashboard-contents' +import type { Route } from './+types/_admin.lg-admin._dashboard.contents' + +export const loader = async ({ request }: Route.LoaderArgs) => { + const { staffToken } = await handleCookie(request) + const { data: newsData } = await getNews({ + accessToken: staffToken, + }) + return { newsData } +} + const DashboardContentsLayout = () => export default DashboardContentsLayout