Files
2022-06-27 09:08:26 -05:00

74 lines
1.5 KiB
JavaScript

import { useState, useEffect } from "react";
export async function fetchUser(cookie = "") {
if (typeof window !== "undefined" && window.__user) {
return window.__user;
}
const res = await fetch(
"/api/v1/me",
cookie
? {
headers: {
cookie,
},
}
: {}
);
if (!res.ok) {
delete window.__user;
return null;
}
const json = await res.json();
if (typeof window !== "undefined") {
window.__user = json;
}
return json;
}
export function useFetchUser({ required } = {}) {
const [loading, setLoading] = useState(
() => !(typeof window !== "undefined" && window.__user)
);
const [user, setUser] = useState(() => {
if (typeof window === "undefined") {
return null;
}
return window.__user || null;
});
useEffect(
() => {
if (!loading && user) {
return;
}
setLoading(true);
let isMounted = true;
fetchUser().then((user) => {
// Only set the user if the component is still mounted
if (isMounted) {
// When the user is not logged in but login is required
if (required && !user) {
window.location.href = "/api/v1/login";
return;
}
setUser(user);
setLoading(false);
}
});
return () => {
isMounted = false;
};
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
return { user, loading };
}