mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-14 15:09:22 +00:00
- support object format of href - improve URL string extraction logic - add proper type checking for href prop - ensure external links use string format
53 lines
1.1 KiB
JavaScript
53 lines
1.1 KiB
JavaScript
import Link from 'next/link'
|
|
import { siteConfig } from '@/lib/config'
|
|
|
|
// 过滤 <a> 标签不能识别的 props
|
|
const filterDOMProps = props => {
|
|
const { passHref, legacyBehavior, ...rest } = props
|
|
return rest
|
|
}
|
|
|
|
const SmartLink = ({ href, children, ...rest }) => {
|
|
const LINK = siteConfig('LINK')
|
|
|
|
// 获取 URL 字符串用于判断是否是外链
|
|
let urlString = ''
|
|
|
|
if (typeof href === 'string') {
|
|
urlString = href
|
|
} else if (
|
|
typeof href === 'object' &&
|
|
href !== null &&
|
|
typeof href.pathname === 'string'
|
|
) {
|
|
urlString = href.pathname
|
|
}
|
|
|
|
const isExternal = urlString.startsWith('http') && !urlString.startsWith(LINK)
|
|
|
|
if (isExternal) {
|
|
// 对于外部链接,必须是 string 类型
|
|
const externalUrl =
|
|
typeof href === 'string' ? href : new URL(href.pathname, LINK).toString()
|
|
|
|
return (
|
|
<a
|
|
href={externalUrl}
|
|
target='_blank'
|
|
rel='noopener noreferrer'
|
|
{...filterDOMProps(rest)}>
|
|
{children}
|
|
</a>
|
|
)
|
|
}
|
|
|
|
// 内部链接(可为对象形式)
|
|
return (
|
|
<Link href={href} {...rest}>
|
|
{children}
|
|
</Link>
|
|
)
|
|
}
|
|
|
|
export default SmartLink
|