import dynamic from 'next/dynamic'; import type { AnchorHTMLAttributes, ComponentType, FC, SVGAttributes, } from 'react'; import styles from './social-link.module.scss'; const GithubIcon: ComponentType> = dynamic( async () => import('../../../../assets/images/social-media/github.svg') ); const GitlabIcon: ComponentType> = dynamic( async () => import('../../../../assets/images/social-media/gitlab.svg') ); const LinkedInIcon: ComponentType> = dynamic( async () => import('../../../../assets/images/social-media/linkedin.svg') ); const TwitterIcon: ComponentType> = dynamic( async () => import('../../../../assets/images/social-media/twitter.svg') ); export type SocialWebsite = 'Github' | 'Gitlab' | 'LinkedIn' | 'Twitter'; export type SocialLinkProps = Omit< AnchorHTMLAttributes, 'aria-label' | 'children' | 'href' > & { /** * The social link icon. */ icon: SocialWebsite; /** * An accessible label for the link. */ label: string; /** * The social profile url. */ url: string; }; /** * SocialLink component * * Render a social icon link. */ export const SocialLink: FC = ({ className = '', icon, label, url, ...props }) => { const linkClass = `${styles.link} ${className}`; /** * Retrieve a social link icon by id. * @param {string} id - The social website id. */ const getIcon = (id: string) => { switch (id) { case 'Github': return ; case 'Gitlab': return ; case 'LinkedIn': return ; case 'Twitter': default: return ; } }; return ( {getIcon(icon)} ); };