Merge remote-tracking branch 'origin/master' into feature/slicing

This commit is contained in:
fredy.siswanto 2025-03-19 17:16:56 +07:00
commit 9c9d127dfb
5 changed files with 58 additions and 16 deletions

View File

@ -8,6 +8,7 @@ const adResponseSchema = z.object({
url: z.string(), url: z.string(),
start_date: z.string(), start_date: z.string(),
end_date: z.string(), end_date: z.string(),
clicked: z.number(),
}) })
const adsResponseSchema = z.object({ const adsResponseSchema = z.object({
data: z.array(adResponseSchema), data: z.array(adResponseSchema),

View File

@ -39,7 +39,7 @@ export const FOOTER_MENU: TFooterMenu[] = [
url: '/support', url: '/support',
}, },
{ {
title: 'Rquest Topic', title: 'Request Topic',
url: '/request-topic', url: '/request-topic',
}, },
], ],

View File

@ -51,6 +51,10 @@ export const AdvertisementsPage = () => {
return formatDate(data) return formatDate(data)
}, },
}, },
{
title: 'Jumlah Klik',
data: 'clicked',
},
{ {
title: 'Action', title: 'Action',
data: 'id', data: 'id',
@ -66,7 +70,7 @@ export const AdvertisementsPage = () => {
/> />
) )
}, },
5: (value: string, _type: unknown, data: TAdResponse) => ( 6: (value: string, _type: unknown, data: TAdResponse) => (
<div className="flex space-x-2"> <div className="flex space-x-2">
<Button <Button
as="a" as="a"

View File

@ -4,11 +4,13 @@ import { Card } from '~/components/ui/card'
import { CarouselHero } from '~/components/ui/carousel-hero' import { CarouselHero } from '~/components/ui/carousel-hero'
import { CarouselSection } from '~/components/ui/carousel-section' import { CarouselSection } from '~/components/ui/carousel-section'
import { Newsletter } from '~/components/ui/newsletter' import { Newsletter } from '~/components/ui/newsletter'
import type { loader } from '~/routes/_news._index' import { type clientLoader } from '~/routes/_news._index'
import type { TNews } from '~/types/news' import type { TNews } from '~/types/news'
export const NewsPage = () => { export const NewsPage = () => {
const loaderData = useRouteLoaderData<typeof loader>('routes/_news._index') const loaderData = useRouteLoaderData<typeof clientLoader>(
'routes/_news._index',
)
const spotlight: TNews = { const spotlight: TNews = {
title: loaderData?.spotlightCategory?.name || '', title: loaderData?.spotlightCategory?.name || '',
description: loaderData?.spotlightCategory?.description || '', description: loaderData?.spotlightCategory?.description || '',

View File

@ -1,7 +1,9 @@
import { ArrowPathIcon } from '@heroicons/react/24/solid'
import { isRouteErrorResponse } from 'react-router' import { isRouteErrorResponse } from 'react-router'
import { getCategories } from '~/apis/common/get-categories' import { getCategories } from '~/apis/common/get-categories'
import { getNews } from '~/apis/common/get-news' import { getNews } from '~/apis/common/get-news'
import { Card } from '~/components/ui/card'
import { NewsPage } from '~/pages/news' import { NewsPage } from '~/pages/news'
import type { Route } from './+types/_news._index' import type { Route } from './+types/_news._index'
@ -13,35 +15,68 @@ export const loader = async ({}: Route.LoaderArgs) => {
const spotlightCategory = categoriesData.find( const spotlightCategory = categoriesData.find(
(category) => category.code === spotlightCode, (category) => category.code === spotlightCode,
) )
let { data: spotlightNews } = await getNews({ categories: [spotlightCode] })
spotlightNews = spotlightNews.filter(
(news) => new Date(news.live_at) <= new Date(),
)
const beritaCode = 'berita' const beritaCode = 'berita'
const beritaCategory = categoriesData.find( const beritaCategory = categoriesData.find(
(category) => category.code === beritaCode, (category) => category.code === beritaCode,
) )
let { data: beritaNews } = await getNews({ categories: [beritaCode] })
beritaNews = beritaNews.filter((news) => new Date(news.live_at) <= new Date())
const kajianCode = 'kajian' const kajianCode = 'kajian'
const kajianCategory = categoriesData.find( const kajianCategory = categoriesData.find(
(category) => category.code === kajianCode, (category) => category.code === kajianCode,
) )
let { data: kajianNews } = await getNews({ categories: [kajianCode] })
kajianNews = kajianNews.filter((news) => new Date(news.live_at) <= new Date())
return { return {
spotlightCategory, spotlightCategory,
spotlightNews, spotlightCode,
beritaCategory, beritaCategory,
beritaNews, beritaCode,
kajianCategory, kajianCategory,
kajianCode,
}
}
export const clientLoader = async ({
serverLoader,
}: Route.ClientLoaderArgs) => {
const serverData = await serverLoader()
let { data: spotlightNews } = await getNews({
categories: [serverData.spotlightCode],
})
spotlightNews = spotlightNews.filter(
(news) => new Date(news.live_at) <= new Date(),
)
let { data: beritaNews } = await getNews({
categories: [serverData.beritaCode],
})
beritaNews = beritaNews.filter((news) => new Date(news.live_at) <= new Date())
let { data: kajianNews } = await getNews({
categories: [serverData.kajianCode],
})
kajianNews = kajianNews.filter((news) => new Date(news.live_at) <= new Date())
return {
...serverData,
spotlightNews,
beritaNews,
kajianNews, kajianNews,
} }
} }
clientLoader.hydrate = true as const
export const HydrateFallback = () => {
return (
<Card>
<div className="flex h-96 items-center justify-center gap-1">
<ArrowPathIcon className="size-5 animate-spin" />{' '}
<span>Loading...</span>
</div>
</Card>
)
}
export const ErrorBoundary = ({ error }: Route.ErrorBoundaryProps) => { export const ErrorBoundary = ({ error }: Route.ErrorBoundaryProps) => {
let message = 'Oops!' let message = 'Oops!'
let details = 'An unexpected error occurred.' let details = 'An unexpected error occurred.'
@ -59,7 +94,7 @@ export const ErrorBoundary = ({ error }: Route.ErrorBoundaryProps) => {
} }
return ( return (
<div className="container mx-auto p-4"> <Card>
<h1>{message}</h1> <h1>{message}</h1>
<p>{details}</p> <p>{details}</p>
{stack && ( {stack && (
@ -67,7 +102,7 @@ export const ErrorBoundary = ({ error }: Route.ErrorBoundaryProps) => {
<code>{stack}</code> <code>{stack}</code>
</pre> </pre>
)} )}
</div> </Card>
) )
} }