diff --git a/app/apis/common/get-news-by-slug.ts b/app/apis/common/get-news-by-slug.ts index de39135..cf40352 100644 --- a/app/apis/common/get-news-by-slug.ts +++ b/app/apis/common/get-news-by-slug.ts @@ -11,6 +11,8 @@ type TParameters = { slug: string } & THttpServer +export type TNewDetailResponse = z.infer + export const getNewsBySlug = async (parameters: TParameters) => { const { slug, accessToken } = parameters try { diff --git a/app/components/ui/social-share.tsx b/app/components/ui/social-share.tsx index 2e6385e..dc14aee 100644 --- a/app/components/ui/social-share.tsx +++ b/app/components/ui/social-share.tsx @@ -10,6 +10,7 @@ import { XIcon } from '~/components/icons/x' type SocialMediaProperties = { className?: string + slug?: string } const dataSocialMedia = [ diff --git a/app/pages/news-detail/index.tsx b/app/pages/news-detail/index.tsx index 67df854..6542ff8 100644 --- a/app/pages/news-detail/index.tsx +++ b/app/pages/news-detail/index.tsx @@ -1,20 +1,28 @@ import htmlParse from 'html-react-parser' +import { useRouteLoaderData } from 'react-router' -import { Breadcrumb } from '~/components/ui/breadcrumb' +import type { TTagResponse } from '~/apis/common/get-tags' import { Card } from '~/components/ui/card' import { CarouselSection } from '~/components/ui/carousel-section' import { IconsSocial } from '~/components/ui/social-share' import { BERITA } from '~/data/contents' - -import { CONTENT } from './data' +import type { loader } from '~/routes/_news.detail.$slug' +import { formatDate } from '~/utils/formatter' export const NewsDetailPage = () => { - const { title, content, featured, slug, author, date, tags } = CONTENT + const loaderData = useRouteLoaderData( + 'routes/_news.detail.$slug', + ) + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { newsDetailData }: any = loaderData + const { title, content, featured_image, slug, author, live_at, tags } = + newsDetailData + return (
-

{title}

@@ -28,10 +36,8 @@ export const NewsDetailPage = () => { className="h-12 w-12 rounded-full" />
-

{author}

-

- {date.toJSON().slice(0, 10)} . 5 min read{' '} -

+

{author.name}

+

{formatDate(live_at)} . 5 min read

@@ -39,7 +45,7 @@ export const NewsDetailPage = () => { {/* end next planing create component for this section */}
{title} @@ -53,15 +59,18 @@ export const NewsDetailPage = () => {

Share this post

- +
- {tags?.map((tag) => ( + {tags?.map((tag: TTagResponse) => ( - {tag} + {tag.name} ))}
diff --git a/app/routes/_news.detail.$slug.tsx b/app/routes/_news.detail.$slug.tsx index 8bbc788..cad0d64 100644 --- a/app/routes/_news.detail.$slug.tsx +++ b/app/routes/_news.detail.$slug.tsx @@ -1,5 +1,34 @@ +import { getNewsBySlug } from '~/apis/common/get-news-by-slug' +import { getUser } from '~/apis/news/get-user' +import { handleCookie } from '~/libs/cookies' import { NewsDetailPage } from '~/pages/news-detail' +import type { Route } from './+types/_news.detail.$slug' + +export const loader = async ({ request }: Route.LoaderArgs) => { + const { userToken } = await handleCookie(request) + let userData + if (userToken) { + const { data } = await getUser({ + accessToken: userToken, + }) + userData = data + } + // TODO need handel if user not accses non premium data + const { data: newsDetailData } = await getNewsBySlug({ + slug: request.url.split('/').pop() ?? '', + accessToken: userToken, + }) + + // const { data: categoriesData } = await getCategories() + + return { + newsDetailData, + userData, + // categoriesData, + } +} + const NewsDetailLayout = () => export default NewsDetailLayout