diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-10-03 19:36:03 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-11 18:14:41 +0100 |
| commit | 0e60743d140aff66eca6df712f653ee20f5d4ef3 (patch) | |
| tree | e72bc8bf2314a26ba3c8e27e571d72e203bbf0c8 /src/components/atoms/links/social-link/social-link.tsx | |
| parent | a3fb0aa94717aafae897ac293488c43a099c0b2b (diff) | |
refactor(components): rewrite SocialLink component
* replace default label with a label prop
* rename name prop to icon prop
Diffstat (limited to 'src/components/atoms/links/social-link/social-link.tsx')
| -rw-r--r-- | src/components/atoms/links/social-link/social-link.tsx | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/components/atoms/links/social-link/social-link.tsx b/src/components/atoms/links/social-link/social-link.tsx new file mode 100644 index 0000000..1da1e7d --- /dev/null +++ b/src/components/atoms/links/social-link/social-link.tsx @@ -0,0 +1,65 @@ +import type { AnchorHTMLAttributes, FC } from 'react'; +import GithubIcon from '../../../../assets/images/social-media/github.svg'; +import GitlabIcon from '../../../../assets/images/social-media/gitlab.svg'; +import LinkedInIcon from '../../../../assets/images/social-media/linkedin.svg'; +import TwitterIcon from '../../../../assets/images/social-media/twitter.svg'; +import styles from './social-link.module.scss'; + +export type SocialWebsite = 'Github' | 'Gitlab' | 'LinkedIn' | 'Twitter'; + +export type SocialLinkProps = Omit< + AnchorHTMLAttributes<HTMLAnchorElement>, + '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<SocialLinkProps> = ({ + 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 <GithubIcon aria-hidden className={styles.icon} />; + case 'Gitlab': + return <GitlabIcon aria-hidden className={styles.icon} />; + case 'LinkedIn': + return <LinkedInIcon aria-hidden className={styles.icon} />; + case 'Twitter': + default: + return <TwitterIcon aria-hidden className={styles.icon} />; + } + }; + + return ( + <a {...props} aria-label={label} className={linkClass} href={url}> + {getIcon(icon)} + </a> + ); +}; |
