Spaces:
Running
Running
File size: 3,779 Bytes
c10f8f8 ddb7f1c c10f8f8 569d96f c10f8f8 ddb7f1c c10f8f8 569d96f c10f8f8 c2bb873 c10f8f8 ddb7f1c c10f8f8 f1dc792 c565924 f1dc792 c10f8f8 f1dc792 7c1b8e2 813f0e0 7c1b8e2 c10f8f8 92d95b7 c10f8f8 ddb7f1c c10f8f8 |
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
/* eslint-disable @typescript-eslint/no-explicit-any */
"use client";
import { useQuery, useQueryClient } from "@tanstack/react-query";
import { useCookie } from "react-use";
import { useRouter } from "next/navigation";
import { ProjectType, User } from "@/types";
import { api } from "@/lib/api";
import { toast } from "sonner";
import MY_TOKEN_KEY from "@/lib/get-cookie-name";
export const useUser = (initialData?: {
user: User | null;
errCode: number | null;
projects: ProjectType[];
}) => {
const client = useQueryClient();
const router = useRouter();
const [, setCurrentRoute, removeCurrentRoute] = useCookie("deepsite-currentRoute");
const [, setToken, removeToken] = useCookie(MY_TOKEN_KEY());
const { data: { user, errCode } = { user: null, errCode: null }, isLoading } =
useQuery({
queryKey: ["user.me"],
queryFn: async () => {
return { user: initialData?.user || null, errCode: initialData?.errCode || null };
},
refetchOnWindowFocus: false,
refetchOnReconnect: false,
refetchOnMount: false,
retry: false,
initialData: initialData
? { user: initialData?.user, errCode: initialData?.errCode }
: undefined,
enabled: false,
});
const { data: loadingAuth } = useQuery({
queryKey: ["loadingAuth"],
queryFn: async () => false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
refetchOnMount: false,
});
const setLoadingAuth = (value: boolean) => {
client.setQueryData(["setLoadingAuth"], value);
};
const { data: projects } = useQuery({
queryKey: ["me.projects"],
queryFn: async () => [],
refetchOnWindowFocus: false,
refetchOnReconnect: false,
refetchOnMount: false,
initialData: initialData?.projects || [],
});
const setProjects = (projects: ProjectType[]) => {
client.setQueryData(["me.projects"], projects);
};
const openLoginWindow = async () => {
setCurrentRoute(window.location.pathname);
return router.push("/auth");
};
const loginFromCode = async (code: string) => {
setLoadingAuth(true);
if (loadingAuth) return;
await api
.post("/auth", { code })
.then(async (res: any) => {
if (res.data && res.data.access_token) {
const expiresIn = res.data.expires_in || 3600;
const expiresDate = new Date();
expiresDate.setTime(expiresDate.getTime() + expiresIn * 1000);
setToken(res.data.access_token, {
expires: expiresDate,
path: '/',
sameSite: 'lax',
secure: window.location.protocol === 'https:',
});
const meResponse = await api.get("/me");
if (meResponse.data) {
client.setQueryData(["user.me"], {
user: meResponse.data.user,
errCode: null,
});
if (meResponse.data.projects) {
setProjects(meResponse.data.projects);
}
}
// if (currentRoute) {
// router.push(currentRoute);
// removeCurrentRoute();
// } else {
router.push("/");
// }
toast.success("Login successful");
}
})
.catch((err: any) => {
toast.error(err?.data?.message ?? err.message ?? "An error occurred");
})
.finally(() => {
setLoadingAuth(false);
});
};
const logout = async () => {
removeToken();
removeCurrentRoute();
toast.success("Logout successful");
client.clear();
window.location.reload();
};
return {
user,
projects,
setProjects,
errCode,
loading: isLoading || loadingAuth,
openLoginWindow,
loginFromCode,
logout,
};
};
|