Compare commits
3 Commits
be63337024
...
aad67720c1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aad67720c1 | ||
|
|
f3be8138c4 | ||
|
|
6e858f1860 |
@ -1,4 +1,5 @@
|
|||||||
import htmlParse from 'html-react-parser'
|
import htmlParse from 'html-react-parser'
|
||||||
|
import { useReadingTime } from 'react-hook-reading-time'
|
||||||
import { useRouteLoaderData } from 'react-router'
|
import { useRouteLoaderData } from 'react-router'
|
||||||
|
|
||||||
import type { TTagResponse } from '~/apis/common/get-tags'
|
import type { TTagResponse } from '~/apis/common/get-tags'
|
||||||
@ -19,6 +20,8 @@ export const NewsDetailPage = () => {
|
|||||||
const { title, content, featured_image, slug, author, live_at, tags } =
|
const { title, content, featured_image, slug, author, live_at, tags } =
|
||||||
newsDetailData || {}
|
newsDetailData || {}
|
||||||
|
|
||||||
|
const { text } = useReadingTime(content || '')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="sm-max:mx-5 relative">
|
<div className="sm-max:mx-5 relative">
|
||||||
<Card>
|
<Card>
|
||||||
@ -45,7 +48,7 @@ export const NewsDetailPage = () => {
|
|||||||
<p className="flex gap-1 text-sm">
|
<p className="flex gap-1 text-sm">
|
||||||
<span>{live_at && `${formatDate(live_at)}`}</span>
|
<span>{live_at && `${formatDate(live_at)}`}</span>
|
||||||
<span>·</span>
|
<span>·</span>
|
||||||
<span>5 min read</span>
|
<span>{text}</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { getNewsBySlug } from '~/apis/common/get-news-by-slug'
|
import { getNewsBySlug } from '~/apis/common/get-news-by-slug'
|
||||||
import { getUser } from '~/apis/news/get-user'
|
import { getUser } from '~/apis/news/get-user'
|
||||||
|
import { APP } from '~/configs/meta'
|
||||||
import { handleCookie } from '~/libs/cookies'
|
import { handleCookie } from '~/libs/cookies'
|
||||||
import { NewsDetailPage } from '~/pages/news-detail'
|
import { NewsDetailPage } from '~/pages/news-detail'
|
||||||
|
|
||||||
@ -14,7 +15,7 @@ export const loader = async ({ request, params }: Route.LoaderArgs) => {
|
|||||||
})
|
})
|
||||||
userData = data
|
userData = data
|
||||||
}
|
}
|
||||||
// TODO need handle if user not access non premium data
|
// TODO: need handle if user not access non premium data
|
||||||
const { data: newsDetailData } = await getNewsBySlug({
|
const { data: newsDetailData } = await getNewsBySlug({
|
||||||
slug: params.slug,
|
slug: params.slug,
|
||||||
accessToken: userToken,
|
accessToken: userToken,
|
||||||
@ -26,6 +27,18 @@ export const loader = async ({ request, params }: Route.LoaderArgs) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const meta = ({ data }: Route.MetaArgs) => {
|
||||||
|
const { newsDetailData } = data
|
||||||
|
const metaTitle = APP.title
|
||||||
|
const title = `${newsDetailData.title} - ${metaTitle}`
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
title,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
const NewsDetailLayout = () => <NewsDetailPage />
|
const NewsDetailLayout = () => <NewsDetailPage />
|
||||||
|
|
||||||
export default NewsDetailLayout
|
export default NewsDetailLayout
|
||||||
|
|||||||
@ -42,6 +42,7 @@
|
|||||||
"react-colorful": "^5.6.1",
|
"react-colorful": "^5.6.1",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"react-hook-form": "^7.54.2",
|
"react-hook-form": "^7.54.2",
|
||||||
|
"react-hook-reading-time": "^1.0.0",
|
||||||
"react-router": "^7.1.3",
|
"react-router": "^7.1.3",
|
||||||
"remix-hook-form": "^6.1.3",
|
"remix-hook-form": "^6.1.3",
|
||||||
"tailwind-merge": "^3.0.1",
|
"tailwind-merge": "^3.0.1",
|
||||||
|
|||||||
15
pnpm-lock.yaml
generated
15
pnpm-lock.yaml
generated
@ -92,6 +92,9 @@ importers:
|
|||||||
react-hook-form:
|
react-hook-form:
|
||||||
specifier: ^7.54.2
|
specifier: ^7.54.2
|
||||||
version: 7.54.2(react@19.0.0)
|
version: 7.54.2(react@19.0.0)
|
||||||
|
react-hook-reading-time:
|
||||||
|
specifier: ^1.0.0
|
||||||
|
version: 1.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
||||||
react-router:
|
react-router:
|
||||||
specifier: ^7.1.3
|
specifier: ^7.1.3
|
||||||
version: 7.1.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
version: 7.1.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
||||||
@ -3888,6 +3891,13 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^16.8.0 || ^17 || ^18 || ^19
|
react: ^16.8.0 || ^17 || ^18 || ^19
|
||||||
|
|
||||||
|
react-hook-reading-time@1.0.0:
|
||||||
|
resolution: {integrity: sha512-kIudDiGHCTzBlV95WM6xPN3EBUViQynJvcul/NL+8My6fsl0BeKoCi9Dp19g69PlyF3WLA3QAyjVL99+Ucgs6A==}
|
||||||
|
engines: {node: '>=8', npm: '>=5'}
|
||||||
|
peerDependencies:
|
||||||
|
react: ^16.13.1
|
||||||
|
react-dom: ^16.13.1
|
||||||
|
|
||||||
react-hotkeys-hook@4.6.1:
|
react-hotkeys-hook@4.6.1:
|
||||||
resolution: {integrity: sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==}
|
resolution: {integrity: sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -8611,6 +8621,11 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
react: 19.0.0
|
react: 19.0.0
|
||||||
|
|
||||||
|
react-hook-reading-time@1.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
|
||||||
|
dependencies:
|
||||||
|
react: 19.0.0
|
||||||
|
react-dom: 19.0.0(react@19.0.0)
|
||||||
|
|
||||||
react-hotkeys-hook@4.6.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
|
react-hotkeys-hook@4.6.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
react: 19.0.0
|
react: 19.0.0
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user