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