mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-14 15:09:22 +00:00
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:
95
components/CanvasEmail.js
Normal file
95
components/CanvasEmail.js
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
21
lib/plugins/mailEncrypt.js
Normal file
21
lib/plugins/mailEncrypt.js
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user