Merge pull request #3478 from qixing-jk/feat/mail-encypt

feat(email encrypt): implement base64 encoding for contact email config
This commit is contained in:
tangly1024
2025-07-27 21:24:46 +08:00
committed by GitHub
17 changed files with 413 additions and 164 deletions

95
components/CanvasEmail.js Normal file
View File

@@ -0,0 +1,95 @@
import { useEffect, useRef, useState } from 'react'
const CanvasEmail = ({ email, className = '' }) => {
const canvasRef = useRef(null)
const textRef = useRef(null)
const [isCopied, setIsCopied] = useState(false)
useEffect(() => {
if (!textRef.current || !canvasRef.current) return
const canvas = canvasRef.current
const ctx = canvas.getContext('2d')
const textElement = textRef.current
// Get computed styles from the hidden text element
const style = window.getComputedStyle(textElement)
const font = style.font
const color = style.color
// Set canvas font and measure text
ctx.font = font
const metrics = ctx.measureText(email)
const fontSize = parseInt(style.fontSize)
const lineHeight = fontSize * 1.2
// Set canvas dimensions
const scale = window.devicePixelRatio || 1
canvas.width = metrics.width * scale
canvas.height = lineHeight * scale
canvas.style.width = `${metrics.width}px`
canvas.style.height = `${lineHeight}px`
// Redraw with high DPI support
ctx.scale(scale, scale)
ctx.font = font
ctx.fillStyle = color
ctx.textBaseline = 'top' // Changed to 'top' for better vertical alignment
ctx.fillText(email, 0, 0)
// Handle copy to clipboard
const handleCopy = e => {
e.preventDefault()
navigator.clipboard.writeText(email).then(() => {
setIsCopied(true)
setTimeout(() => setIsCopied(false), 2000)
})
}
canvas.style.cursor = 'pointer'
canvas.addEventListener('click', handleCopy)
return () => canvas.removeEventListener('click', handleCopy)
}, [email])
return (
<span
className={`relative inline-block align-middle ${className}`}
style={{ lineHeight: 'normal' }}>
{/* Hidden span for measuring text metrics */}
<span
ref={textRef}
style={{
position: 'absolute',
visibility: 'hidden',
whiteSpace: 'nowrap',
font: 'inherit',
pointerEvents: 'none',
userSelect: 'none',
lineHeight: 'normal'
}}></span>
{/* Canvas that displays the text */}
<canvas
ref={canvasRef}
className='inline-block align-middle'
style={{
verticalAlign: 'middle',
backgroundColor: 'transparent',
pointerEvents: 'auto',
font: 'inherit',
lineHeight: 'normal',
display: 'inline-block',
userSelect: 'none',
WebkitUserSelect: 'none',
msUserSelect: 'none',
MozUserSelect: 'none',
KhtmlUserSelect: 'none'
}}
title={isCopied ? 'Copied!' : 'Click to copy'}
aria-label={`Email: ${email}`}
/>
</span>
)
}
export default CanvasEmail

View File

@@ -3,7 +3,12 @@
*/
module.exports = {
// 社交链接,不需要可留空白,例如 CONTACT_WEIBO:''
CONTACT_EMAIL: process.env.NEXT_PUBLIC_CONTACT_EMAIL || '', // 邮箱地址 例如mail@tangly1024.com
CONTACT_EMAIL:
(process.env.NEXT_PUBLIC_CONTACT_EMAIL &&
btoa(
unescape(encodeURIComponent(process.env.NEXT_PUBLIC_CONTACT_EMAIL))
)) ||
'', // 邮箱地址 例如mail@tangly1024.com
CONTACT_WEIBO: process.env.NEXT_PUBLIC_CONTACT_WEIBO || '', // 你的微博个人主页
CONTACT_TWITTER: process.env.NEXT_PUBLIC_CONTACT_TWITTER || '', // 你的twitter个人主页
CONTACT_GITHUB: process.env.NEXT_PUBLIC_CONTACT_GITHUB || '', // 你的github个人主页 例如 https://github.com/tangly1024

View File

@@ -10,6 +10,7 @@ import { getDateValue, getTextContent } from 'notion-utils'
import { deepClone } from '../utils'
import getAllPageIds from './getAllPageIds'
import { getPage } from './getPostBlocks'
import { encryptEmail } from '@/lib/plugins/mailEncrypt'
/**
* 从Notion中读取Config配置表
@@ -157,9 +158,14 @@ export async function getConfigMapFromConfigPage(allPages) {
// 只导入生效的配置
if (config.enable) {
// console.log('[Notion配置]', config.key, config.value)
notionConfig[config.key] =
parseTextToJson(config.value) || config.value || null
// 配置不能是undefined至少是null
if (config.key === 'CONTACT_EMAIL') {
notionConfig[config.key] =
(config.value && encryptEmail(config.value)) || null
} else {
notionConfig[config.key] =
parseTextToJson(config.value) || config.value || null
// 配置不能是undefined至少是null
}
}
}
}

View File

@@ -0,0 +1,21 @@
export const handleEmailClick = (e, emailIcon, CONTACT_EMAIL) => {
if (CONTACT_EMAIL && emailIcon && !emailIcon.current.href) {
e.preventDefault()
const email = decryptEmail(CONTACT_EMAIL)
emailIcon.current.href = `mailto:${email}`
emailIcon.current.click()
}
}
export const encryptEmail = email => {
return btoa(unescape(encodeURIComponent(email)))
}
export const decryptEmail = encryptedEmail => {
try {
return decodeURIComponent(escape(atob(encryptedEmail)))
} catch (error) {
console.error('解密邮箱失败:', error)
return encryptedEmail
}
}

View File

@@ -4,6 +4,7 @@ import { getPostBlocks } from '@/lib/db/getSiteData'
import { Feed } from 'feed'
import fs from 'fs'
import ReactDOMServer from 'react-dom/server'
import { decryptEmail } from '@/lib/plugins/mailEncrypt'
/**
* 生成RSS内容
@@ -37,7 +38,9 @@ export async function generateRss(props) {
const AUTHOR = NOTION_CONFIG?.AUTHOR || BLOG.AUTHOR
const LANG = NOTION_CONFIG?.LANG || BLOG.LANG
const SUB_PATH = NOTION_CONFIG?.SUB_PATH || BLOG.SUB_PATH
const CONTACT_EMAIL = NOTION_CONFIG?.CONTACT_EMAIL || BLOG.CONTACT_EMAIL
const CONTACT_EMAIL = decryptEmail(
NOTION_CONFIG?.CONTACT_EMAIL || BLOG.CONTACT_EMAIL
)
// 检查 feed 文件是否在10分钟内更新过
if (isFeedRecentlyUpdated('./public/rss/feed.xml', 10)) {

View File

@@ -4,6 +4,9 @@ import CopyRightDate from '@/components/CopyRightDate'
import { siteConfig } from '@/lib/config'
import SmartLink from '@/components/SmartLink'
import CONFIG from '../config'
import { decryptEmail, handleEmailClick } from '@/lib/plugins/mailEncrypt'
import { useRef } from 'react'
import CanvasEmail from '@/components/CanvasEmail'
/**
* 页脚
@@ -18,6 +21,10 @@ const Footer = props => {
parseInt(since) < currentYear ? since + '-' + currentYear : currentYear
const { categoryOptions, customMenu } = props
const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL')
const emailIcon = useRef(null)
return (
<footer
id='footer-wrapper'
@@ -128,14 +135,16 @@ const Footer = props => {
</div>
<div className='text-lg'>
{' '}
{siteConfig('CONTACT_EMAIL') && (
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
onClick={e =>
handleEmailClick(e, emailIcon, CONTACT_EMAIL)
}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope dark:hover:text-red-400 hover:text-red-600' />{' '}
{siteConfig('CONTACT_EMAIL')}
<CanvasEmail email={decryptEmail(CONTACT_EMAIL)} />
</a>
)}
</div>

View File

@@ -1,77 +1,93 @@
import { siteConfig } from '@/lib/config'
import { useRef } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
* @returns {JSX.Element}
* @constructor
*/
const SocialButton = () => {
const CONTACT_GITHUB = siteConfig('CONTACT_GITHUB')
const CONTACT_TWITTER = siteConfig('CONTACT_TWITTER')
const CONTACT_TELEGRAM = siteConfig('CONTACT_TELEGRAM')
const CONTACT_LINKEDIN = siteConfig('CONTACT_LINKEDIN')
const CONTACT_WEIBO = siteConfig('CONTACT_WEIBO')
const CONTACT_INSTAGRAM = siteConfig('CONTACT_INSTAGRAM')
const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL')
const ENABLE_RSS = siteConfig('ENABLE_RSS')
const CONTACT_BILIBILI = siteConfig('CONTACT_BILIBILI')
const CONTACT_YOUTUBE = siteConfig('CONTACT_YOUTUBE')
const emailIcon = useRef(null)
return (
<div className='w-full justify-center flex-wrap flex'>
<div className='space-x-3 text-xl text-gray-600 dark:text-gray-300 '>
{siteConfig('CONTACT_GITHUB') && (
{CONTACT_GITHUB && (
<a
target='_blank'
rel='noreferrer'
title={'github'}
href={siteConfig('CONTACT_GITHUB')}>
href={CONTACT_GITHUB}>
<i className='transform hover:scale-125 duration-150 fab fa-github dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_TWITTER') && (
{CONTACT_TWITTER && (
<a
target='_blank'
rel='noreferrer'
title={'twitter'}
href={siteConfig('CONTACT_TWITTER')}>
href={CONTACT_TWITTER}>
<i className='transform hover:scale-125 duration-150 fab fa-twitter dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_TELEGRAM') && (
{CONTACT_TELEGRAM && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_TELEGRAM')}
href={CONTACT_TELEGRAM}
title={'telegram'}>
<i className='transform hover:scale-125 duration-150 fab fa-telegram dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_LINKEDIN') && (
{CONTACT_LINKEDIN && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_LINKEDIN')}
href={CONTACT_LINKEDIN}
title={'linkIn'}>
<i className='transform hover:scale-125 duration-150 fab fa-linkedin dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_WEIBO') && (
{CONTACT_WEIBO && (
<a
target='_blank'
rel='noreferrer'
title={'weibo'}
href={siteConfig('CONTACT_WEIBO')}>
href={CONTACT_WEIBO}>
<i className='transform hover:scale-125 duration-150 fab fa-weibo dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_INSTAGRAM') && (
{CONTACT_INSTAGRAM && (
<a
target='_blank'
rel='noreferrer'
title={'instagram'}
href={siteConfig('CONTACT_INSTAGRAM')}>
href={CONTACT_INSTAGRAM}>
<i className='transform hover:scale-125 duration-150 fab fa-instagram dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_EMAIL') && (
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{JSON.parse(siteConfig('ENABLE_RSS')) && (
{ENABLE_RSS && (
<a
target='_blank'
rel='noreferrer'
@@ -80,21 +96,21 @@ const SocialButton = () => {
<i className='transform hover:scale-125 duration-150 fas fa-rss dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_BILIBILI') && (
{CONTACT_BILIBILI && (
<a
target='_blank'
rel='noreferrer'
title={'bilibili'}
href={siteConfig('CONTACT_BILIBILI')}>
href={CONTACT_BILIBILI}>
<i className='transform hover:scale-125 duration-150 fab fa-bilibili dark:hover:text-red-400 hover:text-red-600' />
</a>
)}
{siteConfig('CONTACT_YOUTUBE') && (
{CONTACT_YOUTUBE && (
<a
target='_blank'
rel='noreferrer'
title={'youtube'}
href={siteConfig('CONTACT_YOUTUBE')}>
href={CONTACT_YOUTUBE}>
<i className='transform hover:scale-125 duration-150 fab fa-youtube dark:hover:text-red-400 hover:text-red-600' />
</a>
)}

View File

@@ -1,6 +1,7 @@
import QrCode from '@/components/QrCode'
import { siteConfig } from '@/lib/config'
import { useState } from 'react'
import { useRef, useState } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -32,6 +33,9 @@ const SocialButton = () => {
setQrCodeShow(false)
}
const emailIcon = useRef(null)
return (
<div className='w-full justify-center flex-wrap flex'>
<div className='space-x-3 text-xl flex items-center text-gray-600 dark:text-gray-300 '>
@@ -91,10 +95,10 @@ const SocialButton = () => {
)}
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${CONTACT_EMAIL}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope dark:hover:text-green-400 hover:text-green-600' />
</a>
)}

View File

@@ -1,6 +1,7 @@
import QrCode from '@/components/QrCode'
import { siteConfig } from '@/lib/config'
import { useState } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -32,6 +33,9 @@ const SocialButton = () => {
setQrCodeShow(false)
}
const emailIcon = useRef(null)
return (
<div className='w-full justify-center flex-wrap flex'>
<div className='space-x-3 text-xl flex items-center text-gray-600 dark:text-gray-300 '>
@@ -91,10 +95,10 @@ const SocialButton = () => {
)}
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${CONTACT_EMAIL}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope dark:hover:text-green-400 hover:text-green-600' />
</a>
)}

View File

@@ -1,4 +1,6 @@
import { siteConfig } from '@/lib/config'
import { useRef } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -16,6 +18,9 @@ const SocialButton = () => {
const ENABLE_RSS = siteConfig('ENABLE_RSS')
const CONTACT_BILIBILI = siteConfig('CONTACT_BILIBILI')
const CONTACT_YOUTUBE = siteConfig('CONTACT_YOUTUBE')
const emailIcon = useRef(null)
return (
<div className='w-full justify-center flex-wrap flex'>
<div className='space-x-12 text-3xl text-gray-600 dark:text-gray-300 '>
@@ -75,14 +80,14 @@ const SocialButton = () => {
)}
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${CONTACT_EMAIL}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope dark:hover:text-indigo-400 hover:text-indigo-600' />
</a>
)}
{JSON.parse(ENABLE_RSS) && (
{ENABLE_RSS && (
<a
target='_blank'
rel='noreferrer'

View File

@@ -1,6 +1,7 @@
import QrCode from '@/components/QrCode'
import { siteConfig } from '@/lib/config'
import { useState } from 'react'
import { useRef, useState } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -32,6 +33,9 @@ const SocialButton = () => {
const closePopover = () => {
setQrCodeShow(false)
}
const emailIcon = useRef(null)
return (
<div className='w-full justify-center flex-wrap flex'>
<div className='space-x-3 text-xl flex items-center text-gray-600 dark:text-gray-300 '>
@@ -91,10 +95,10 @@ const SocialButton = () => {
)}
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${CONTACT_EMAIL}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope dark:hover:text-indigo-400 hover:text-indigo-600' />
</a>
)}

View File

@@ -1,6 +1,7 @@
import QrCode from '@/components/QrCode'
import { siteConfig } from '@/lib/config'
import { useState } from 'react'
import { useRef, useState } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -31,6 +32,9 @@ const SocialButton = () => {
setQrCodeShow(false)
}
const emailIcon = useRef(null)
return (
<div className='w-full justify-center flex-wrap flex'>
<div className='space-x-3 text-xl flex items-center text-white dark:text-gray-300 '>
@@ -90,10 +94,10 @@ const SocialButton = () => {
)}
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${CONTACT_EMAIL}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope dark:hover:text-green-400 hover:text-green-600' />
</a>
)}

View File

@@ -1,5 +1,6 @@
import { siteConfig } from '@/lib/config'
import { useState } from 'react'
import { useRef, useState } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组 可折叠的组件
@@ -12,6 +13,20 @@ const SocialButton = () => {
setShow(!show)
}
const CONTACT_GITHUB = siteConfig('CONTACT_GITHUB')
const CONTACT_TWITTER = siteConfig('CONTACT_TWITTER')
const CONTACT_TELEGRAM = siteConfig('CONTACT_TELEGRAM')
const CONTACT_LINKEDIN = siteConfig('CONTACT_LINKEDIN')
const CONTACT_WEIBO = siteConfig('CONTACT_WEIBO')
const CONTACT_INSTAGRAM = siteConfig('CONTACT_INSTAGRAM')
const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL')
const ENABLE_RSS = siteConfig('ENABLE_RSS')
const CONTACT_BILIBILI = siteConfig('CONTACT_BILIBILI')
const CONTACT_YOUTUBE = siteConfig('CONTACT_YOUTUBE')
const emailIcon = useRef(null)
return (
<div className='flex flex-col transform hover:scale-105 duration-200 text-white text-center bg-indigo-700 rounded-full dark:bg-black cursor-pointer py-2.5'>
{!show && (
@@ -22,70 +37,70 @@ const SocialButton = () => {
)}
{show && (
<>
{siteConfig('CONTACT_GITHUB') && (
{CONTACT_GITHUB && (
<a
target='_blank'
rel='noreferrer'
title={'github'}
href={siteConfig('CONTACT_GITHUB')}>
href={CONTACT_GITHUB}>
<i className='transform hover:scale-125 duration-150 fab fa-github ' />
</a>
)}
{siteConfig('CONTACT_TWITTER') && (
{CONTACT_TWITTER && (
<a
target='_blank'
rel='noreferrer'
title={'twitter'}
href={siteConfig('CONTACT_TWITTER')}>
href={CONTACT_TWITTER}>
<i className='transform hover:scale-125 duration-150 fab fa-twitter ' />
</a>
)}
{siteConfig('CONTACT_TELEGRAM') && (
{CONTACT_TELEGRAM && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_TELEGRAM')}
href={CONTACT_TELEGRAM}
title={'telegram'}>
<i className='transform hover:scale-125 duration-150 fab fa-telegram ' />
</a>
)}
{siteConfig('CONTACT_LINKEDIN') && (
{CONTACT_LINKEDIN && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_LINKEDIN')}
href={CONTACT_LINKEDIN}
title={'linkIn'}>
<i className='transform hover:scale-125 duration-150 fab fa-linkedin ' />
</a>
)}
{siteConfig('CONTACT_WEIBO') && (
{CONTACT_WEIBO && (
<a
target='_blank'
rel='noreferrer'
title={'weibo'}
href={siteConfig('CONTACT_WEIBO')}>
href={CONTACT_WEIBO}>
<i className='transform hover:scale-125 duration-150 fab fa-weibo ' />
</a>
)}
{siteConfig('CONTACT_INSTAGRAM') && (
{CONTACT_INSTAGRAM && (
<a
target='_blank'
rel='noreferrer'
title={'instagram'}
href={siteConfig('CONTACT_INSTAGRAM')}>
href={CONTACT_INSTAGRAM}>
<i className='transform hover:scale-125 duration-150 fab fa-instagram ' />
</a>
)}
{siteConfig('CONTACT_EMAIL') && (
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='transform hover:scale-125 duration-150 fas fa-envelope ' />
</a>
)}
{JSON.parse(siteConfig('ENABLE_RSS')) && (
{ENABLE_RSS && (
<a
target='_blank'
rel='noreferrer'
@@ -94,21 +109,21 @@ const SocialButton = () => {
<i className='transform hover:scale-125 duration-150 fas fa-rss ' />
</a>
)}
{siteConfig('CONTACT_BILIBILI') && (
{CONTACT_BILIBILI && (
<a
target='_blank'
rel='noreferrer'
title={'bilibili'}
href={siteConfig('CONTACT_BILIBILI')}>
href={CONTACT_BILIBILI}>
<i className='fab fa-bilibili transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_YOUTUBE') && (
{CONTACT_YOUTUBE && (
<a
target='_blank'
rel='noreferrer'
title={'youtube'}
href={siteConfig('CONTACT_YOUTUBE')}>
href={CONTACT_YOUTUBE}>
<i className='fab fa-youtube transform hover:scale-125 duration-150' />
</a>
)}

View File

@@ -1,4 +1,6 @@
import { siteConfig } from '@/lib/config'
import { useRef } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -6,72 +8,85 @@ import { siteConfig } from '@/lib/config'
* @constructor
*/
const SocialButton = () => {
const CONTACT_GITHUB = siteConfig('CONTACT_GITHUB')
const CONTACT_TWITTER = siteConfig('CONTACT_TWITTER')
const CONTACT_TELEGRAM = siteConfig('CONTACT_TELEGRAM')
const CONTACT_LINKEDIN = siteConfig('CONTACT_LINKEDIN')
const CONTACT_WEIBO = siteConfig('CONTACT_WEIBO')
const CONTACT_INSTAGRAM = siteConfig('CONTACT_INSTAGRAM')
const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL')
const ENABLE_RSS = siteConfig('ENABLE_RSS')
const CONTACT_BILIBILI = siteConfig('CONTACT_BILIBILI')
const CONTACT_YOUTUBE = siteConfig('CONTACT_YOUTUBE')
const emailIcon = useRef(null)
return (
<div className='space-x-3 text-xl text-gray-600 dark:text-gray-400 flex-wrap flex justify-center '>
{siteConfig('CONTACT_GITHUB') && (
{CONTACT_GITHUB && (
<a
target='_blank'
rel='noreferrer'
title={'github'}
href={siteConfig('CONTACT_GITHUB')}>
href={CONTACT_GITHUB}>
<i className='fab fa-github transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_TWITTER') && (
{CONTACT_TWITTER && (
<a
target='_blank'
rel='noreferrer'
title={'twitter'}
href={siteConfig('CONTACT_TWITTER')}>
href={CONTACT_TWITTER}>
<i className='fab fa-twitter transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_TELEGRAM') && (
{CONTACT_TELEGRAM && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_TELEGRAM')}
href={CONTACT_TELEGRAM}
title={'telegram'}>
<i className='fab fa-telegram transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_LINKEDIN') && (
{CONTACT_LINKEDIN && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_LINKEDIN')}
href={CONTACT_LINKEDIN}
title={'linkedIn'}>
<i className='transform hover:scale-125 duration-150 fab fa-linkedin dark:hover:text-indigo-400 hover:text-indigo-600' />
</a>
)}
{siteConfig('CONTACT_WEIBO') && (
{CONTACT_WEIBO && (
<a
target='_blank'
rel='noreferrer'
title={'weibo'}
href={siteConfig('CONTACT_WEIBO')}>
href={CONTACT_WEIBO}>
<i className='fab fa-weibo transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_INSTAGRAM') && (
{CONTACT_INSTAGRAM && (
<a
target='_blank'
rel='noreferrer'
title={'instagram'}
href={siteConfig('CONTACT_INSTAGRAM')}>
href={CONTACT_INSTAGRAM}>
<i className='fab fa-instagram transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_EMAIL') && (
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='fas fa-envelope transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{JSON.parse(siteConfig('ENABLE_RSS')) && (
{ENABLE_RSS && (
<a
target='_blank'
rel='noreferrer'
@@ -80,21 +95,21 @@ const SocialButton = () => {
<i className='fas fa-rss transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_BILIBILI') && (
{CONTACT_BILIBILI && (
<a
target='_blank'
rel='noreferrer'
title={'bilibili'}
href={siteConfig('CONTACT_BILIBILI')}>
href={CONTACT_BILIBILI}>
<i className='fab fa-bilibili transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_YOUTUBE') && (
{CONTACT_YOUTUBE && (
<a
target='_blank'
rel='noreferrer'
title={'youtube'}
href={siteConfig('CONTACT_YOUTUBE')}>
href={CONTACT_YOUTUBE}>
<i className='fab fa-youtube transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}

View File

@@ -1,4 +1,6 @@
import { siteConfig } from '@/lib/config'
import { useRef } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -6,72 +8,83 @@ import { siteConfig } from '@/lib/config'
* @constructor
*/
const SocialButton = () => {
const CONTACT_GITHUB = siteConfig('CONTACT_GITHUB')
const CONTACT_TWITTER = siteConfig('CONTACT_TWITTER')
const CONTACT_TELEGRAM = siteConfig('CONTACT_TELEGRAM')
const CONTACT_LINKEDIN = siteConfig('CONTACT_LINKEDIN')
const CONTACT_WEIBO = siteConfig('CONTACT_WEIBO')
const CONTACT_INSTAGRAM = siteConfig('CONTACT_INSTAGRAM')
const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL')
const ENABLE_RSS = siteConfig('ENABLE_RSS')
const emailIcon = useRef(null)
return (
<div className='space-x-3 text-xl text-gray-600 dark:text-gray-400 flex-wrap flex justify-center '>
{siteConfig('CONTACT_GITHUB') && (
{CONTACT_GITHUB && (
<a
target='_blank'
rel='noreferrer'
title={'github'}
href={siteConfig('CONTACT_GITHUB')}>
href={CONTACT_GITHUB}>
<i className='fab fa-github transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_TWITTER') && (
{CONTACT_TWITTER && (
<a
target='_blank'
rel='noreferrer'
title={'twitter'}
href={siteConfig('CONTACT_TWITTER')}>
href={CONTACT_TWITTER}>
<i className='fab fa-twitter transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_TELEGRAM') && (
{CONTACT_TELEGRAM && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_TELEGRAM')}
href={CONTACT_TELEGRAM}
title={'telegram'}>
<i className='fab fa-telegram transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_LINKEDIN') && (
{CONTACT_LINKEDIN && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_LINKEDIN')}
href={CONTACT_LINKEDIN}
title={'linkedIn'}>
<i className='transform hover:scale-125 duration-150 fab fa-linkedin dark:hover:text-indigo-400 hover:text-indigo-600' />
</a>
)}
{siteConfig('CONTACT_WEIBO') && (
{CONTACT_WEIBO && (
<a
target='_blank'
rel='noreferrer'
title={'weibo'}
href={siteConfig('CONTACT_WEIBO')}>
href={CONTACT_WEIBO}>
<i className='fab fa-weibo transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_INSTAGRAM') && (
{CONTACT_INSTAGRAM && (
<a
target='_blank'
rel='noreferrer'
title={'instagram'}
href={siteConfig('CONTACT_INSTAGRAM')}>
href={CONTACT_INSTAGRAM}>
<i className='fab fa-instagram transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{siteConfig('CONTACT_EMAIL') && (
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='fas fa-envelope transform hover:scale-125 duration-150 hover:text-green-600' />
</a>
)}
{JSON.parse(siteConfig('ENABLE_RSS')) && (
{ENABLE_RSS && (
<a
target='_blank'
rel='noreferrer'

View File

@@ -1,4 +1,6 @@
import { siteConfig } from '@/lib/config'
import { useRef } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -6,73 +8,86 @@ import { siteConfig } from '@/lib/config'
* @constructor
*/
const SocialButton = () => {
const CONTACT_GITHUB = siteConfig('CONTACT_GITHUB')
const CONTACT_TWITTER = siteConfig('CONTACT_TWITTER')
const CONTACT_TELEGRAM = siteConfig('CONTACT_TELEGRAM')
const CONTACT_LINKEDIN = siteConfig('CONTACT_LINKEDIN')
const CONTACT_WEIBO = siteConfig('CONTACT_WEIBO')
const CONTACT_INSTAGRAM = siteConfig('CONTACT_INSTAGRAM')
const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL')
const ENABLE_RSS = siteConfig('ENABLE_RSS')
const CONTACT_BILIBILI = siteConfig('CONTACT_BILIBILI')
const CONTACT_YOUTUBE = siteConfig('CONTACT_YOUTUBE')
const emailIcon = useRef(null)
return (
<div className='justify-start flex-wrap flex mx-1'>
<div className='space-x-3 text-2xl text-gray-600 dark:text-gray-400 text-center'>
{siteConfig('CONTACT_GITHUB') && (
{CONTACT_GITHUB && (
<a
target='_blank'
rel='noreferrer'
title={'github'}
href={siteConfig('CONTACT_GITHUB')}>
href={CONTACT_GITHUB}>
<i className='fab fa-github transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_TWITTER') && (
{CONTACT_TWITTER && (
<a
target='_blank'
rel='noreferrer'
title={'twitter'}
href={siteConfig('CONTACT_TWITTER')}>
href={CONTACT_TWITTER}>
<i className='fab fa-twitter transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_TELEGRAM') && (
{CONTACT_TELEGRAM && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_TELEGRAM')}
href={CONTACT_TELEGRAM}
title={'telegram'}>
<i className='fab fa-telegram transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_LINKEDIN') && (
{CONTACT_LINKEDIN && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_LINKEDIN')}
href={CONTACT_LINKEDIN}
title={'linkedIn'}>
<i className='transform hover:scale-125 duration-150 fab fa-linkedin dark:hover:text-indigo-400 hover:text-indigo-600' />
</a>
)}
{siteConfig('CONTACT_WEIBO') && (
{CONTACT_WEIBO && (
<a
target='_blank'
rel='noreferrer'
title={'weibo'}
href={siteConfig('CONTACT_WEIBO')}>
href={CONTACT_WEIBO}>
<i className='fab fa-weibo transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_INSTAGRAM') && (
{CONTACT_INSTAGRAM && (
<a
target='_blank'
rel='noreferrer'
title={'instagram'}
href={siteConfig('CONTACT_INSTAGRAM')}>
href={CONTACT_INSTAGRAM}>
<i className='fab fa-instagram transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_EMAIL') && (
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='fas fa-envelope transform hover:scale-125 duration-150' />
</a>
)}
{JSON.parse(siteConfig('ENABLE_RSS')) && (
{ENABLE_RSS && (
<a
target='_blank'
rel='noreferrer'
@@ -81,21 +96,21 @@ const SocialButton = () => {
<i className='fas fa-rss transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_BILIBILI') && (
{CONTACT_BILIBILI && (
<a
target='_blank'
rel='noreferrer'
title={'bilibili'}
href={siteConfig('CONTACT_BILIBILI')}>
href={CONTACT_BILIBILI}>
<i className='fab fa-bilibili transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_YOUTUBE') && (
{CONTACT_YOUTUBE && (
<a
target='_blank'
rel='noreferrer'
title={'youtube'}
href={siteConfig('CONTACT_YOUTUBE')}>
href={CONTACT_YOUTUBE}>
<i className='fab fa-youtube transform hover:scale-125 duration-150' />
</a>
)}

View File

@@ -1,4 +1,6 @@
import { siteConfig } from '@/lib/config'
import { useRef } from 'react'
import { handleEmailClick } from '@/lib/plugins/mailEncrypt'
/**
* 社交联系方式按钮组
@@ -6,73 +8,86 @@ import { siteConfig } from '@/lib/config'
* @constructor
*/
const SocialButton = () => {
const CONTACT_GITHUB = siteConfig('CONTACT_GITHUB')
const CONTACT_TWITTER = siteConfig('CONTACT_TWITTER')
const CONTACT_TELEGRAM = siteConfig('CONTACT_TELEGRAM')
const CONTACT_LINKEDIN = siteConfig('CONTACT_LINKEDIN')
const CONTACT_WEIBO = siteConfig('CONTACT_WEIBO')
const CONTACT_INSTAGRAM = siteConfig('CONTACT_INSTAGRAM')
const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL')
const ENABLE_RSS = siteConfig('ENABLE_RSS')
const CONTACT_BILIBILI = siteConfig('CONTACT_BILIBILI')
const CONTACT_YOUTUBE = siteConfig('CONTACT_YOUTUBE')
const emailIcon = useRef(null)
return (
<div className='w-52 justify-center flex-wrap flex my-2'>
<div className='space-x-5 md:text-xl text-3xl text-gray-600 dark:text-gray-400 text-center'>
{siteConfig('CONTACT_GITHUB') && (
{CONTACT_GITHUB && (
<a
target='_blank'
rel='noreferrer'
title={'github'}
href={siteConfig('CONTACT_GITHUB')}>
href={CONTACT_GITHUB}>
<i className='fab fa-github transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_TWITTER') && (
{CONTACT_TWITTER && (
<a
target='_blank'
rel='noreferrer'
title={'twitter'}
href={siteConfig('CONTACT_TWITTER')}>
href={CONTACT_TWITTER}>
<i className='fab fa-twitter transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_TELEGRAM') && (
{CONTACT_TELEGRAM && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_TELEGRAM')}
href={CONTACT_TELEGRAM}
title={'telegram'}>
<i className='fab fa-telegram transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_LINKEDIN') && (
{CONTACT_LINKEDIN && (
<a
target='_blank'
rel='noreferrer'
href={siteConfig('CONTACT_LINKEDIN')}
href={CONTACT_LINKEDIN}
title={'linkedIn'}>
<i className='fab fa-linkedin transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_WEIBO') && (
{CONTACT_WEIBO && (
<a
target='_blank'
rel='noreferrer'
title={'weibo'}
href={siteConfig('CONTACT_WEIBO')}>
href={CONTACT_WEIBO}>
<i className='fab fa-weibo transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_INSTAGRAM') && (
{CONTACT_INSTAGRAM && (
<a
target='_blank'
rel='noreferrer'
title={'instagram'}
href={siteConfig('CONTACT_INSTAGRAM')}>
href={CONTACT_INSTAGRAM}>
<i className='fab fa-instagram transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_EMAIL') && (
{CONTACT_EMAIL && (
<a
target='_blank'
rel='noreferrer'
title={'email'}
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
onClick={e => handleEmailClick(e, emailIcon, CONTACT_EMAIL)}
title='email'
className='cursor-pointer'
ref={emailIcon}>
<i className='fas fa-envelope transform hover:scale-125 duration-150' />
</a>
)}
{JSON.parse(siteConfig('ENABLE_RSS')) && (
{ENABLE_RSS && (
<a
target='_blank'
rel='noreferrer'
@@ -81,21 +96,21 @@ const SocialButton = () => {
<i className='fas fa-rss transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_BILIBILI') && (
{CONTACT_BILIBILI && (
<a
target='_blank'
rel='noreferrer'
title={'bilibili'}
href={siteConfig('CONTACT_BILIBILI')}>
href={CONTACT_BILIBILI}>
<i className='fab fa-bilibili transform hover:scale-125 duration-150' />
</a>
)}
{siteConfig('CONTACT_YOUTUBE') && (
{CONTACT_YOUTUBE && (
<a
target='_blank'
rel='noreferrer'
title={'youtube'}
href={siteConfig('CONTACT_YOUTUBE')}>
href={CONTACT_YOUTUBE}>
<i className='fab fa-youtube transform hover:scale-125 duration-150' />
</a>
)}