From 55917395b4c6e81ce5c43aa03ebb6f7f2f184618 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Sat, 16 Oct 2021 03:35:44 +1100 Subject: [PATCH] Refactor recent projects into it's own cell (#558) --- .../ProfileSlashLogin/ProfileSlashLogin.tsx | 28 ++--------- app/web/src/components/Projects/Projects.tsx | 34 +++----------- .../components/ProjectsCell/ProjectsCell.tsx | 15 +----- .../ProjectsOfUserCell/ProjectsOfUserCell.tsx | 12 ++--- .../RecentProjectsCell/RecentProjectsCell.tsx | 46 +++++++++++++++++++ app/web/src/layouts/MainLayout/MainLayout.js | 8 +--- 6 files changed, 66 insertions(+), 77 deletions(-) create mode 100644 app/web/src/components/RecentProjectsCell/RecentProjectsCell.tsx diff --git a/app/web/src/components/ProfileSlashLogin/ProfileSlashLogin.tsx b/app/web/src/components/ProfileSlashLogin/ProfileSlashLogin.tsx index f4102a4..c0ba080 100644 --- a/app/web/src/components/ProfileSlashLogin/ProfileSlashLogin.tsx +++ b/app/web/src/components/ProfileSlashLogin/ProfileSlashLogin.tsx @@ -7,33 +7,13 @@ import { ImageFallback } from 'src/components/ImageUploader' import useUser from 'src/helpers/hooks/useUser' import LoginModal from 'src/components/LoginModal' -import Gravatar from 'src/components/Gravatar/Gravatar' -import ProjectsOfUserCell from 'src/components/ProjectsOfUserCell' +import RecentProjectsCell from 'src/components/RecentProjectsCell' const ProfileSlashLogin = () => { - const { logOut, isAuthenticated, currentUser, client } = useAuth() + const { logOut, isAuthenticated, currentUser } = useAuth() const { user, loading } = useUser() const [isLoginModalOpen, setIsLoginModalOpen] = useState(false) - const [isOpen, setIsOpen] = useState(false) - const [anchorEl, setAnchorEl] = useState(null) - const [popoverId, setPopoverId] = useState(undefined) - const openPopover = (target) => { - setAnchorEl(target) - setPopoverId('simple-popover') - setIsOpen(true) - } - const closePopover = () => { - setAnchorEl(null) - setPopoverId(undefined) - setIsOpen(false) - } - const togglePopover = ({ currentTarget }) => { - if (isOpen) { - return closePopover() - } - openPopover(currentTarget) - } const recordedLogin = () => { ReactGA.event({ category: 'login', @@ -87,9 +67,7 @@ const ProfileSlashLogin = () => {

Recent Projects

- diff --git a/app/web/src/components/Projects/Projects.tsx b/app/web/src/components/Projects/Projects.tsx index 14d541e..8753d40 100644 --- a/app/web/src/components/Projects/Projects.tsx +++ b/app/web/src/components/Projects/Projects.tsx @@ -1,17 +1,15 @@ import { useMemo } from 'react' -import { Link, routes } from '@redwoodjs/router' -import Svg from 'src/components/Svg/Svg' -import CadPackage from 'src/components/CadPackage/CadPackage' - -import { countEmotes } from 'src/helpers/emote' -import ImageUploader from 'src/components/ImageUploader' +import type { Projects_Of_User } from 'types/graphql' import ProjectCard from 'src/components/ProjectCard/ProjectCard' const ProjectsList = ({ projects, shouldFilterProjectsWithoutImage = false, projectLimit = 80, - isMinimal = false, +}: { + projects: Projects_Of_User['projects'] + shouldFilterProjectsWithoutImage: boolean + projectLimit: number }) => { // temporary filtering projects that don't have images until some kind of search is added and there are more things on the website // it helps avoid the look of the website just being filled with dumby data. @@ -34,7 +32,7 @@ const ProjectsList = ({ [projects, shouldFilterProjectsWithoutImage] ) - return !isMinimal ? ( + return (
    ( ) )}
- ) : ( -
-
    - {filteredProjects.map(({ title, user }, index) => ( - -

    {title.replace(/[-_]/g, ' ')}

    - - ))} -
-
) } diff --git a/app/web/src/components/ProjectsCell/ProjectsCell.tsx b/app/web/src/components/ProjectsCell/ProjectsCell.tsx index cccc6fe..55c9101 100644 --- a/app/web/src/components/ProjectsCell/ProjectsCell.tsx +++ b/app/web/src/components/ProjectsCell/ProjectsCell.tsx @@ -27,30 +27,19 @@ export const QUERY = gql` export const Loading = () =>
Loading...
-export const Empty = ({ isMinimal = false }) => { - return !isMinimal ? ( -
- {'No projects yet. '} - - {'Create one?'} - -
- ) : ( -

None yet!

- ) +export const Empty = () => { + return
{'No projects yet.'}
} export const Success = ({ projects, variables: { shouldFilterProjectsWithoutImage, projectLimit }, - isMinimal = false, }) => { return ( ) } diff --git a/app/web/src/components/ProjectsOfUserCell/ProjectsOfUserCell.tsx b/app/web/src/components/ProjectsOfUserCell/ProjectsOfUserCell.tsx index bddd1c2..b199806 100644 --- a/app/web/src/components/ProjectsOfUserCell/ProjectsOfUserCell.tsx +++ b/app/web/src/components/ProjectsOfUserCell/ProjectsOfUserCell.tsx @@ -1,7 +1,5 @@ -import { Link, routes } from '@redwoodjs/router' - +import type { Projects_Of_User } from 'types/graphql' import Projects from 'src/components/Projects/Projects' - export const QUERY = gql` query PROJECTS_OF_USER($userName: String!) { projects(userName: $userName) { @@ -20,6 +18,7 @@ export const QUERY = gql` userName } Reaction { + id emote } } @@ -38,17 +37,18 @@ export const Empty = ({ isMinimal = false }) => { export const Success = ({ projects, - variables: { userName }, shouldFilterProjectsWithoutImage = false, projectLimit = 80, - isMinimal = false, +}: { + projects: Projects_Of_User['projects'] + shouldFilterProjectsWithoutImage: boolean + projectLimit: number }) => { return ( ) } diff --git a/app/web/src/components/RecentProjectsCell/RecentProjectsCell.tsx b/app/web/src/components/RecentProjectsCell/RecentProjectsCell.tsx new file mode 100644 index 0000000..f64c443 --- /dev/null +++ b/app/web/src/components/RecentProjectsCell/RecentProjectsCell.tsx @@ -0,0 +1,46 @@ +import type { CellSuccessProps, CellFailureProps } from '@redwoodjs/web' + +import type { Projects_Of_User } from 'types/graphql' +import { Link, routes } from '@redwoodjs/router' +import { QUERY as _QUERY } from 'src/components/ProjectsOfUserCell/ProjectsOfUserCell' + +export const QUERY = _QUERY + +export const Loading = () =>
Loading...
+ +export const Empty = () =>

None yet!

+ +export const Failure = ({ error }: CellFailureProps) => ( +
Error: {error.message}
+) + +export const Success = ({ projects }: CellSuccessProps) => { + const filteredProjects = React.useMemo( + () => + projects + .slice(0, 3) + .sort( + (a, b) => + new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime() + ), + [projects] + ) + return ( +
+
    + {filteredProjects.map(({ title, user }, index) => ( + +

    {title.replace(/[-_]/g, ' ')}

    + + ))} +
+
+ ) +} diff --git a/app/web/src/layouts/MainLayout/MainLayout.js b/app/web/src/layouts/MainLayout/MainLayout.js index d4c65e1..fd17a0f 100644 --- a/app/web/src/layouts/MainLayout/MainLayout.js +++ b/app/web/src/layouts/MainLayout/MainLayout.js @@ -16,7 +16,7 @@ import Svg from 'src/components/Svg' import { ImageFallback } from 'src/components/ImageUploader' import useUser from 'src/helpers/hooks/useUser' import './MainLayout.css' -import ProjectsOfUserCell from 'src/components/ProjectsOfUserCell' +import RecentProjectsCell from 'src/components/RecentProjectsCell' let previousSubmission = '' @@ -152,11 +152,7 @@ const MainLayout = ({ children, shouldRemoveFooterInIde }) => {

Recent Projects

- + )}