From 32c45d04f3cfe57e9eff7635ba206edd72bcadcd Mon Sep 17 00:00:00 2001 From: Ben Grant Date: Tue, 18 May 2021 21:45:12 +1000 Subject: [PATCH] Extract recents to component --- .../src/components/Recents/Recents.tsx | 30 ++++++++++++++++ .../src/components/Recents/recentsStyle.ts | 36 +++++++++++++++++++ crabfit-frontend/src/components/index.ts | 1 + crabfit-frontend/src/pages/Create/Create.tsx | 22 +++--------- crabfit-frontend/src/pages/Home/Home.tsx | 18 ++-------- crabfit-frontend/src/pages/Home/homeStyle.ts | 35 ------------------ 6 files changed, 73 insertions(+), 69 deletions(-) create mode 100644 crabfit-frontend/src/components/Recents/Recents.tsx create mode 100644 crabfit-frontend/src/components/Recents/recentsStyle.ts diff --git a/crabfit-frontend/src/components/Recents/Recents.tsx b/crabfit-frontend/src/components/Recents/Recents.tsx new file mode 100644 index 0000000..70a27bb --- /dev/null +++ b/crabfit-frontend/src/components/Recents/Recents.tsx @@ -0,0 +1,30 @@ +import { useTranslation } from 'react-i18next'; +import { useRecentsStore } from 'stores'; +import dayjs from 'dayjs'; +import relativeTime from 'dayjs/plugin/relativeTime'; + +import { AboutSection, StyledMain } from '../../pages/Home/homeStyle'; +import { Recent } from './recentsStyle'; + +dayjs.extend(relativeTime); + +const Recents = () => { + const recents = useRecentsStore(state => state.recents); + const { t } = useTranslation(['home', 'common']); + + return !!recents.length && ( + + +

{t('home:recently_visited')}

+ {recents.map(event => ( + + {event.name} + {t('common:created')} {dayjs.unix(event.created).fromNow()} + + ))} +
+
+ ); +}; + +export default Recents; diff --git a/crabfit-frontend/src/components/Recents/recentsStyle.ts b/crabfit-frontend/src/components/Recents/recentsStyle.ts new file mode 100644 index 0000000..ee60d92 --- /dev/null +++ b/crabfit-frontend/src/components/Recents/recentsStyle.ts @@ -0,0 +1,36 @@ +import styled from '@emotion/styled'; + +export const Recent = styled.a` + text-decoration: none; + color: inherit; + display: flex; + align-items: center; + justify-content: space-between; + padding: 5px 0; + flex-wrap: wrap; + + & .name { + font-weight: 700; + font-size: 1.1em; + color: ${props => props.theme.primaryDark}; + flex: 1; + display: block; + } + & .date { + font-weight: 400; + opacity: .8; + white-space: nowrap; + } + + &:hover .name { + text-decoration: underline; + } + + @media (max-width: 500px) { + display: block; + + & .date { + white-space: normal; + } + } +`; diff --git a/crabfit-frontend/src/components/index.ts b/crabfit-frontend/src/components/index.ts index a3fcc60..7808dcb 100644 --- a/crabfit-frontend/src/components/index.ts +++ b/crabfit-frontend/src/components/index.ts @@ -17,3 +17,4 @@ export { default as Donate } from './Donate/Donate'; export { default as Settings } from './Settings/Settings'; export { default as Egg } from './Egg/Egg'; export { default as Footer } from './Footer/Footer'; +export { default as Recents } from './Recents/Recents'; diff --git a/crabfit-frontend/src/pages/Create/Create.tsx b/crabfit-frontend/src/pages/Create/Create.tsx index e221521..269a882 100644 --- a/crabfit-frontend/src/pages/Create/Create.tsx +++ b/crabfit-frontend/src/pages/Create/Create.tsx @@ -15,6 +15,7 @@ import { Button, Donate, Error, + Recents, } from 'components'; import { @@ -28,9 +29,6 @@ import { Footer, AboutSection, } from './createStyle'; -import { - Recent, -} from '../Home/homeStyle'; import api from 'services'; import { useRecentsStore } from 'stores'; @@ -54,7 +52,7 @@ const Create = ({ offline }) => { const { push } = useHistory(); - const recentsStore = useRecentsStore(); + const addRecent = useRecentsStore(state => state.addRecent); useEffect(() => { if (window.self === window.top) { @@ -123,7 +121,7 @@ const Create = ({ offline }) => { }, }); setCreatedEvent(response.data); - recentsStore.addRecent({ + addRecent({ id: response.data.id, created: response.data.created, name: response.data.name, @@ -175,19 +173,7 @@ const Create = ({ offline }) => { ) : ( <> - {!!recentsStore.recents.length && ( - - -

Recently visited

- {recentsStore.recents.map(event => ( - - {event.name} - Created {dayjs.unix(event.created).format('D MMMM, YYYY')} - - ))} -
-
- )} + {offline ? ( diff --git a/crabfit-frontend/src/pages/Home/Home.tsx b/crabfit-frontend/src/pages/Home/Home.tsx index 94552cc..c54267f 100644 --- a/crabfit-frontend/src/pages/Home/Home.tsx +++ b/crabfit-frontend/src/pages/Home/Home.tsx @@ -17,6 +17,7 @@ import { Center, Error, Footer, + Recents, } from 'components'; import { @@ -33,11 +34,9 @@ import { StatNumber, StatLabel, OfflineMessage, - Recent, } from './homeStyle'; import api from 'services'; -import { useRecentsStore } from 'stores'; import logo from 'res/logo.svg'; import timezones from 'res/timezones.json'; @@ -60,7 +59,6 @@ const Home = ({ offline }) => { version: 'loading...', }); const { push } = useHistory(); - const recentsStore = useRecentsStore(); const { t } = useTranslation(['common', 'home']); useEffect(() => { @@ -161,19 +159,7 @@ const Home = ({ offline }) => { - {!!recentsStore.recents.length && ( - - -

{t('home:recently_visited')}

- {recentsStore.recents.map(event => ( - - {event.name} - Created {dayjs.unix(event.created).format('D MMMM, YYYY')} - - ))} -
-
- )} + {offline ? ( diff --git a/crabfit-frontend/src/pages/Home/homeStyle.ts b/crabfit-frontend/src/pages/Home/homeStyle.ts index 6225fd7..40133a6 100644 --- a/crabfit-frontend/src/pages/Home/homeStyle.ts +++ b/crabfit-frontend/src/pages/Home/homeStyle.ts @@ -87,38 +87,3 @@ export const OfflineMessage = styled.div` text-align: center; margin: 50px 0 20px; `; - -export const Recent = styled.a` - text-decoration: none; - color: inherit; - display: flex; - align-items: center; - justify-content: space-between; - padding: 5px 0; - flex-wrap: wrap; - - & .name { - font-weight: 700; - font-size: 1.1em; - color: ${props => props.theme.primaryDark}; - flex: 1; - display: block; - } - & .date { - font-weight: 400; - opacity: .8; - white-space: nowrap; - } - - &:hover .name { - text-decoration: underline; - } - - @media (max-width: 500px) { - display: block; - - & .date { - white-space: normal; - } - } -`;