1
1
mirror of https://github.com/theoludwig/theoludwig.git synced 2024-09-19 22:15:53 +02:00
.profile/components/Skills/Skill.tsx

63 lines
1.4 KiB
TypeScript
Raw Normal View History

'use client'
import { useState, useEffect, useMemo } from 'react'
2021-06-24 19:46:44 +02:00
import { useTheme } from 'next-themes'
2021-04-18 01:56:23 +02:00
import Image from 'next/image'
2022-10-20 22:24:01 +02:00
import type { SkillName } from './skills'
2021-04-18 01:56:23 +02:00
import { skills } from './skills'
2021-06-24 19:46:44 +02:00
export interface SkillComponentProps {
2022-10-20 22:24:01 +02:00
skill: SkillName
2021-04-18 01:56:23 +02:00
}
2021-06-24 19:46:44 +02:00
export const SkillComponent: React.FC<SkillComponentProps> = (props) => {
2021-04-18 01:56:23 +02:00
const { skill } = props
2021-04-18 01:56:23 +02:00
const skillProperties = skills[skill]
const [mounted, setMounted] = useState(false)
2021-06-24 19:46:44 +02:00
const { theme } = useTheme()
useEffect(() => {
setMounted(true)
}, [])
2021-06-24 19:46:44 +02:00
const image = useMemo(() => {
2022-10-20 22:24:01 +02:00
if (typeof skillProperties.image === 'string') {
return skillProperties.image
2021-06-24 19:46:44 +02:00
}
if (!mounted) {
return skillProperties.image.dark
}
2022-10-20 22:24:01 +02:00
if (theme === 'light') {
return skillProperties.image.light
}
return skillProperties.image.dark
}, [skillProperties, theme, mounted])
if (!mounted) {
return null
}
2021-04-18 01:56:23 +02:00
return (
<a
href={skillProperties.link}
className='mx-2 max-w-xl text-yellow hover:underline dark:text-yellow-dark'
target='_blank'
rel='noopener noreferrer'
>
<div className='text-center'>
2022-10-27 19:13:29 +02:00
<Image
2023-06-18 12:18:24 +02:00
className='inline h-16 w-16'
2022-10-27 19:13:29 +02:00
quality={100}
2023-06-18 12:18:24 +02:00
width={64}
height={64}
2022-10-27 19:13:29 +02:00
alt={skill}
src={image}
/>
<p className='mt-1'>{skill}</p>
</div>
</a>
2021-04-18 01:56:23 +02:00
)
}