Spaces:
Running
Running
File size: 1,967 Bytes
61e6dfe | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import { useQuery, useQueryClient } from "@tanstack/react-query";
import { useEffect } from "react";
import { getProject, ProjectWithCommits } from "@/actions/projects";
import { File } from "@/lib/type";
export const useProject = (
initialProject?: ProjectWithCommits | null,
initialFiles?: File[] | null,
isNew?: boolean
) => {
const queryClient = useQueryClient();
useEffect(() => {
if (isNew) {
queryClient.setQueryData(["project"], null);
queryClient.setQueryData(["files"], []);
} else if (initialProject) {
queryClient.setQueryData(["project"], initialProject);
if (initialFiles) {
queryClient.setQueryData(["files"], initialFiles);
}
}
}, [initialProject, initialFiles, isNew, queryClient]);
const {
data: project,
isLoading,
error,
} = useQuery({
queryKey: ["project"],
initialData: initialProject,
queryFn: async () => {
if (isNew) return null;
const datas = await getProject(initialProject?.name as string);
if (datas?.files) {
setFiles(datas.files);
}
return datas?.project ?? null;
},
refetchOnWindowFocus: false,
refetchOnMount: false,
refetchOnReconnect: false,
refetchInterval: false,
refetchIntervalInBackground: false,
});
const { data: files } = useQuery({
queryKey: ["files"],
initialData: initialFiles,
queryFn: () => {
return [];
},
refetchOnWindowFocus: false,
refetchOnMount: false,
refetchOnReconnect: false,
refetchInterval: false,
refetchIntervalInBackground: false,
});
const setFiles = (newFiles: File[]) => {
queryClient.setQueryData<File[]>(["files"], (oldFiles: File[] = []) => {
const currentFiles = oldFiles.filter(
(file) => !newFiles.some((f) => f.path === file.path)
);
return [...currentFiles, ...newFiles];
});
};
return {
project,
isLoading,
error,
files,
};
};
|