From 94bc646189bdd75717263c2e21b261c07e3aa1dc Mon Sep 17 00:00:00 2001 From: Artem Golub Date: Sun, 10 Jul 2022 14:47:59 +0300 Subject: [PATCH] feat: project pagination --- .../src/components/Projects/index.tsx | 100 +++++++++++++----- services/frontend/src/hooks/useProject.ts | 20 ++-- services/frontend/src/hooks/useProjects.ts | 13 ++- 3 files changed, 91 insertions(+), 42 deletions(-) diff --git a/services/frontend/src/components/Projects/index.tsx b/services/frontend/src/components/Projects/index.tsx index 3471745..510ff48 100644 --- a/services/frontend/src/components/Projects/index.tsx +++ b/services/frontend/src/components/Projects/index.tsx @@ -1,11 +1,16 @@ +import { useState } from "react"; import { Link } from "react-router-dom"; +import { PROJECTS_FETCH_LIMIT } from "../../constants"; import { IProject } from "../../types"; import Spinner from "../../components/global/Spinner"; import PreviewBlock from "./PreviewBlock"; import { useProjects } from "../../hooks/useProjects"; const Projects = () => { - const { data, error, isFetching } = useProjects(); + const [limit] = useState(PROJECTS_FETCH_LIMIT); + const [offset, setOffset] = useState(0); + const { isLoading, isError, error, data, isFetching, isPreviousData } = + useProjects(limit, offset); return ( <> @@ -33,37 +38,80 @@ const Projects = () => { )} {!isFetching && ( -
- {error && ( -
-

- Something went wrong... -

+ <> +
+ {error && ( +
+

+ Something went wrong... +

+
+ )} + +
+ {data.results.length > 0 && + data.results.map((project: IProject) => { + return ( +
+ +
+ ); + })}
- )} -
- {data.results.length > 0 && - data.results.map((project: IProject) => { - return ( -
- -
- ); - })} + {data.results.length === 0 && ( +
+

+ Nothing here +

+

+ Get started by creating a project. +

+
+ )}
- {data.results.length === 0 && ( -
-

- Nothing here -

-

- Get started by creating a project. -

+ {data.count > PROJECTS_FETCH_LIMIT && ( +
+ +
)} -
+ )}
diff --git a/services/frontend/src/hooks/useProject.ts b/services/frontend/src/hooks/useProject.ts index b5dd6e1..0cc69d6 100644 --- a/services/frontend/src/hooks/useProject.ts +++ b/services/frontend/src/hooks/useProject.ts @@ -164,19 +164,21 @@ export const useDeleteProject = (uuid: string | undefined) => { }, { onSuccess: () => { - // could just invalidate the query here and refetch everything - // queryClient.invalidateQueries(['projects']); - queryClient.cancelQueries("projects"); const previousProjects = queryClient.getQueryData( "projects" ) as IProjectsReturn; - const filtered = _.filter(previousProjects.results, (project) => { - return project.uuid !== uuid; - }); - previousProjects.count = filtered.length; - previousProjects.results = filtered; - queryClient.setQueryData("projects", previousProjects); + + if (previousProjects) { + const filtered = _.filter(previousProjects.results, (project) => { + return project.uuid !== uuid; + }); + previousProjects.count = filtered.length; + previousProjects.results = filtered; + queryClient.setQueryData("projects", previousProjects); + } else { + queryClient.invalidateQueries(["projects"]); + } } } ); diff --git a/services/frontend/src/hooks/useProjects.ts b/services/frontend/src/hooks/useProjects.ts index d58867e..6dcee41 100644 --- a/services/frontend/src/hooks/useProjects.ts +++ b/services/frontend/src/hooks/useProjects.ts @@ -3,12 +3,12 @@ import { useQuery } from "react-query"; import { API_SERVER_URL } from "../constants"; import { getLocalStorageJWTKeys } from "../utils"; -const fetchProjects = async () => { +export const fetchProjects = async (limit: number, offset: number) => { const jwtKeys = getLocalStorageJWTKeys(); const response = await axios({ method: "get", - url: `${API_SERVER_URL}/projects/`, + url: `${API_SERVER_URL}/projects/?limit=${limit}&offset=${offset}`, headers: { "Content-Type": "application/json", Authorization: `Bearer ${jwtKeys.access_token}` @@ -17,13 +17,12 @@ const fetchProjects = async () => { return response.data; }; -export const useProjects = () => { +export const useProjects = (limit: number, offset: number) => { return useQuery( - ["projects"], - async () => { - return await fetchProjects(); - }, + ["projects", limit, offset], + () => fetchProjects(limit, offset), { + keepPreviousData: true, staleTime: Infinity } );