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
}
);