From 0e60743d140aff66eca6df712f653ee20f5d4ef3 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Tue, 3 Oct 2023 19:36:03 +0200 Subject: refactor(components): rewrite SocialLink component * replace default label with a label prop * rename name prop to icon prop --- src/components/atoms/links/social-link.module.scss | 43 ------------- src/components/atoms/links/social-link.stories.tsx | 73 ---------------------- src/components/atoms/links/social-link.test.tsx | 19 ------ src/components/atoms/links/social-link.tsx | 51 --------------- src/components/atoms/links/social-link/index.ts | 1 + .../links/social-link/social-link.module.scss | 38 +++++++++++ .../links/social-link/social-link.stories.tsx | 66 +++++++++++++++++++ .../atoms/links/social-link/social-link.test.tsx | 62 ++++++++++++++++++ .../atoms/links/social-link/social-link.tsx | 65 +++++++++++++++++++ .../organisms/widgets/social-media.stories.tsx | 8 +-- .../organisms/widgets/social-media.test.tsx | 12 ++-- src/components/organisms/widgets/social-media.tsx | 10 +-- src/i18n/en.json | 32 ++++++++++ src/i18n/fr.json | 32 ++++++++++ src/pages/contact.tsx | 33 +++++++++- src/pages/cv.tsx | 34 +++++++++- src/pages/projets/[slug].tsx | 37 ++++++++--- 17 files changed, 401 insertions(+), 215 deletions(-) delete mode 100644 src/components/atoms/links/social-link.module.scss delete mode 100644 src/components/atoms/links/social-link.stories.tsx delete mode 100644 src/components/atoms/links/social-link.test.tsx delete mode 100644 src/components/atoms/links/social-link.tsx create mode 100644 src/components/atoms/links/social-link/index.ts create mode 100644 src/components/atoms/links/social-link/social-link.module.scss create mode 100644 src/components/atoms/links/social-link/social-link.stories.tsx create mode 100644 src/components/atoms/links/social-link/social-link.test.tsx create mode 100644 src/components/atoms/links/social-link/social-link.tsx (limited to 'src') diff --git a/src/components/atoms/links/social-link.module.scss b/src/components/atoms/links/social-link.module.scss deleted file mode 100644 index 57dcf42..0000000 --- a/src/components/atoms/links/social-link.module.scss +++ /dev/null @@ -1,43 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.link { - display: flex; - width: var(--link-size, #{fun.convert-px(60)}); - height: var(--link-size, #{fun.convert-px(60)}); - box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) - var(--color-shadow), - fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-1) - var(--color-shadow), - fun.convert-px(3) fun.convert-px(4) fun.convert-px(4) fun.convert-px(-3) - var(--color-shadow), - 0 0 0 0 var(--color-shadow); - transition: all 0.25s linear 0s; - - &:hover, - &:focus { - box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) - var(--color-shadow), - fun.convert-px(1) fun.convert-px(1) fun.convert-px(2) fun.convert-px(-1) - var(--color-shadow-light), - fun.convert-px(3) fun.convert-px(3) fun.convert-px(4) fun.convert-px(-4) - var(--color-shadow-light), - fun.convert-px(6) fun.convert-px(6) fun.convert-px(10) fun.convert-px(-3) - var(--color-shadow); - transform: scale(1.15); - } - - &:focus { - outline: var(--color-primary) dashed fun.convert-px(2); - } - - &:active { - box-shadow: 0 0 0 0 var(--color-shadow); - outline: none; - transform: scale(0.9); - } -} - -.icon { - max-width: 100%; - max-height: 100%; -} diff --git a/src/components/atoms/links/social-link.stories.tsx b/src/components/atoms/links/social-link.stories.tsx deleted file mode 100644 index b627e9f..0000000 --- a/src/components/atoms/links/social-link.stories.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { SocialLink } from './social-link'; - -/** - * SocialLink - Storybook Meta - */ -export default { - title: 'Atoms/Buttons/Social', - component: SocialLink, - argTypes: { - name: { - control: { - type: 'select', - }, - description: 'Social website name.', - options: ['Github', 'Gitlab', 'LinkedIn', 'Twitter'], - type: { - name: 'string', - required: true, - }, - }, - url: { - control: { - type: null, - }, - description: 'Social profile url.', - type: { - name: 'string', - required: true, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Social Link Stories - Github - */ -export const Github = Template.bind({}); -Github.args = { - name: 'Github', - url: '#', -}; - -/** - * Social Link Stories - Gitlab - */ -export const Gitlab = Template.bind({}); -Gitlab.args = { - name: 'Gitlab', - url: '#', -}; - -/** - * Social Link Stories - LinkedIn - */ -export const LinkedIn = Template.bind({}); -LinkedIn.args = { - name: 'LinkedIn', - url: '#', -}; - -/** - * Social Link Stories - Twitter - */ -export const Twitter = Template.bind({}); -Twitter.args = { - name: 'Twitter', - url: '#', -}; diff --git a/src/components/atoms/links/social-link.test.tsx b/src/components/atoms/links/social-link.test.tsx deleted file mode 100644 index d2609ca..0000000 --- a/src/components/atoms/links/social-link.test.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../tests/utils'; -import { SocialLink } from './social-link'; - -/** - * Next.js mock images to use next/image component. So for now, I need to mock - * the svg files manually. - */ -jest.mock('@assets/images/social-media/github.svg', () => 'svg-file'); -jest.mock('@assets/images/social-media/gitlab.svg', () => 'svg-file'); -jest.mock('@assets/images/social-media/linkedin.svg', () => 'svg-file'); -jest.mock('@assets/images/social-media/twitter.svg', () => 'svg-file'); - -describe('SocialLink', () => { - it('render a social link', () => { - render(); - expect(screen.getByRole('link')).toHaveAccessibleName('Github'); - }); -}); diff --git a/src/components/atoms/links/social-link.tsx b/src/components/atoms/links/social-link.tsx deleted file mode 100644 index 9f8feb6..0000000 --- a/src/components/atoms/links/social-link.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { 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 = { - /** - * The social website name. - */ - name: SocialWebsite; - /** - * The social profile url. - */ - url: string; -}; - -/** - * SocialLink component - * - * Render a social icon link. - */ -export const SocialLink: FC = ({ name, url }) => { - /** - * Retrieve a social link icon by id. - * @param {string} id - The social website id. - */ - const getIcon = (id: string) => { - switch (id) { - case 'Github': - return