mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-24 07:26:50 +00:00
最近评论
This commit is contained in:
@@ -24,6 +24,36 @@ const WalineComponent = (props) => {
|
|||||||
serverURL: BLOG.COMMENT_WALINE_SERVER_URL
|
serverURL: BLOG.COMMENT_WALINE_SERVER_URL
|
||||||
})
|
})
|
||||||
router.events.on('routeChangeComplete', updateWaline)
|
router.events.on('routeChangeComplete', updateWaline)
|
||||||
|
|
||||||
|
const anchor = window.location.hash
|
||||||
|
/** 需要跳转到评论区 */
|
||||||
|
if (anchor) {
|
||||||
|
// 选择需要观察变动的节点
|
||||||
|
const targetNode = document.getElementsByClassName('wl-cards')[0]
|
||||||
|
const commentNode = document.getElementById('comment')
|
||||||
|
commentNode.scrollIntoView({ block: 'start', behavior: 'smooth' })
|
||||||
|
|
||||||
|
// 当观察到变动时执行的回调函数
|
||||||
|
const mutationCallback = (mutations) => {
|
||||||
|
for (const mutation of mutations) {
|
||||||
|
const type = mutation.type
|
||||||
|
if (type === 'childList') {
|
||||||
|
const anchorElement = document.getElementById(anchor.substring(1))
|
||||||
|
if (anchorElement) {
|
||||||
|
anchorElement.scrollIntoView({ block: 'end', behavior: 'smooth' })
|
||||||
|
setTimeout(() => {
|
||||||
|
anchorElement.classList.add('animate__animated')
|
||||||
|
anchorElement.classList.add('animate__bounceIn')
|
||||||
|
}, 300)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 观察子节点 变化
|
||||||
|
new MutationObserver(mutationCallback).observe(targetNode, { childList: true })
|
||||||
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
walineInstanceRef.current?.destroy()
|
walineInstanceRef.current?.destroy()
|
||||||
router.events.off('routeChangeComplete', updateWaline)
|
router.events.off('routeChangeComplete', updateWaline)
|
||||||
|
|||||||
43
components/WalineRecentsComments.js
Normal file
43
components/WalineRecentsComments.js
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { RecentComments } from '@waline/client'
|
||||||
|
import BLOG from '@/blog.config'
|
||||||
|
import Card from '@/themes/hexo/components/Card'
|
||||||
|
import { useGlobal } from '@/lib/global'
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see https://waline.js.org/guide/get-started.html
|
||||||
|
* @param {*} props
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const WalineRecentComment = (props) => {
|
||||||
|
const [comments, updateComments] = React.useState([])
|
||||||
|
const { locale } = useGlobal()
|
||||||
|
const [onLoading, changeLoading] = React.useState(true)
|
||||||
|
React.useEffect(() => {
|
||||||
|
RecentComments({
|
||||||
|
serverURL: BLOG.COMMENT_WALINE_SERVER_URL,
|
||||||
|
count: 5
|
||||||
|
}).then(({ comments }) => {
|
||||||
|
changeLoading(false)
|
||||||
|
updateComments(comments)
|
||||||
|
})
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return <Card >
|
||||||
|
<div className="font-sans mb-2 px-1 justify-between">
|
||||||
|
<i className="mr-2 fas fas fa-comment" />
|
||||||
|
{locale.COMMON.RECENT_COMMENTS}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{onLoading && <div>Loading...<i className='ml-2 fas fa-spinner animate-spin' /></div>}
|
||||||
|
{!onLoading && comments && comments.length === 0 && <div>No Comments</div>}
|
||||||
|
{!onLoading && comments && comments.length > 0 && comments.map((comment) => <div key={comment.objectId} className='pb-2'>
|
||||||
|
<div className='dark:text-gray-200 text-sm waline-recent-content' dangerouslySetInnerHTML={{ __html: comment.comment }} />
|
||||||
|
<div className='dark:text-gray-100 font-sans text-sm text-right cursor-pointer hover:text-red-500 hover:underline pt-1'><Link href={comment.url + '#' + comment.objectId}><a >-- {comment.nick}</a></Link></div>
|
||||||
|
</div>)}
|
||||||
|
|
||||||
|
</Card>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default WalineRecentComment
|
||||||
@@ -34,7 +34,8 @@ export default {
|
|||||||
ARTICLE_LOCK_TIPS: 'Please Enter the password:',
|
ARTICLE_LOCK_TIPS: 'Please Enter the password:',
|
||||||
SUBMIT: 'Submit',
|
SUBMIT: 'Submit',
|
||||||
POST_TIME: 'Post on',
|
POST_TIME: 'Post on',
|
||||||
LAST_EDITED_TIME: 'Last edited'
|
LAST_EDITED_TIME: 'Last edited',
|
||||||
|
RECENT_COMMENTS: 'Recent Comments'
|
||||||
},
|
},
|
||||||
PAGINATION: {
|
PAGINATION: {
|
||||||
PREV: 'Prev',
|
PREV: 'Prev',
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ export default {
|
|||||||
ARTICLE_LOCK_TIPS: '文章已上锁,请输入访问密码',
|
ARTICLE_LOCK_TIPS: '文章已上锁,请输入访问密码',
|
||||||
SUBMIT: '提交',
|
SUBMIT: '提交',
|
||||||
POST_TIME: '发布于',
|
POST_TIME: '发布于',
|
||||||
LAST_EDITED_TIME: '最后更新'
|
LAST_EDITED_TIME: '最后更新',
|
||||||
|
RECENT_COMMENTS: '最新评论'
|
||||||
},
|
},
|
||||||
PAGINATION: {
|
PAGINATION: {
|
||||||
PREV: '上一页',
|
PREV: '上一页',
|
||||||
|
|||||||
@@ -158,3 +158,16 @@ nav {
|
|||||||
.medium-zoom-image--opened{
|
.medium-zoom-image--opened{
|
||||||
width: auto !important;
|
width: auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[data-waline] p {
|
||||||
|
color: var(--waline-color);
|
||||||
|
@apply dark:text-gray-200 !important
|
||||||
|
}
|
||||||
|
|
||||||
|
.waline-recent-content p{
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
}
|
||||||
@@ -6,6 +6,14 @@ import Catalog from './Catalog'
|
|||||||
import { InfoCard } from './InfoCard'
|
import { InfoCard } from './InfoCard'
|
||||||
import { AnalyticsCard } from './AnalyticsCard'
|
import { AnalyticsCard } from './AnalyticsCard'
|
||||||
import CONFIG_HEXO from '../config_hexo'
|
import CONFIG_HEXO from '../config_hexo'
|
||||||
|
import WalineRecentComment from '@/components/WalineRecentsComments'
|
||||||
|
import BLOG from '@/blog.config'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hexo主题右侧栏
|
||||||
|
* @param {*} props
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
export default function SideRight(props) {
|
export default function SideRight(props) {
|
||||||
const {
|
const {
|
||||||
post, currentCategory, categories, latestPosts, tags,
|
post, currentCategory, categories, latestPosts, tags,
|
||||||
@@ -37,8 +45,10 @@ export default function SideRight(props) {
|
|||||||
<LatestPostsGroup {...props} />
|
<LatestPostsGroup {...props} />
|
||||||
</Card>}
|
</Card>}
|
||||||
|
|
||||||
|
{BLOG.COMMENT_WALINE_SERVER_URL && <WalineRecentComment/>}
|
||||||
|
|
||||||
<div className='sticky top-20'>
|
<div className='sticky top-20'>
|
||||||
{post && post.toc && <Card>
|
{post && post.toc && post.toc.length > 1 && <Card>
|
||||||
<Catalog toc={post.toc} />
|
<Catalog toc={post.toc} />
|
||||||
</Card>}
|
</Card>}
|
||||||
{slot}
|
{slot}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import formatDate from '@/lib/formatDate'
|
|||||||
import { useGlobal } from '@/lib/global'
|
import { useGlobal } from '@/lib/global'
|
||||||
import BLOG from '@/blog.config'
|
import BLOG from '@/blog.config'
|
||||||
import NotionPage from '@/components/NotionPage'
|
import NotionPage from '@/components/NotionPage'
|
||||||
|
import React from 'react'
|
||||||
|
|
||||||
export const ArticleDetail = props => {
|
export const ArticleDetail = props => {
|
||||||
const { post, prev, next, siteInfo } = props
|
const { post, prev, next, siteInfo } = props
|
||||||
|
|||||||
Reference in New Issue
Block a user