@alauda/doom
Version:
Doctor Doom making docs.
63 lines (62 loc) • 2.25 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { NoSSR, useLang, useLocation, useNavigate, useSite, } from '@rspress/core/runtime';
import { useEffect, useMemo, useRef } from 'react';
import siteData from 'virtual-site-data';
import { createXFetch } from 'x-fetch';
import { useCloudAuth } from "../../login/store.js";
import { isLoggedIn } from "../../login/utils.js";
import { useMemoizedFn } from '@alauda/doom/runtime';
const { xfetch } = createXFetch();
const AuthCheck = () => {
const { pathname, search, hash } = useLocation();
const navigate = useNavigate();
const lang = useLang();
const { site } = useSite();
const { authInfo, setAuthBasic } = useCloudAuth();
const pathname_ = useMemo(() => pathname.replace(/\.html$/, ''), [pathname]);
const login = useMemoizedFn(() => {
if (pathname_ === '/login' ||
site.themeConfig.locales.some((l) => pathname_ === `/${l.lang}/login`)) {
return;
}
void navigate(`${lang === site.lang ? '' : `/${lang}`}/login.html?from=${encodeURIComponent(`${pathname}${search}${hash}`)}`);
});
const abortControllerRef = useRef(null);
const authCheck = useMemoizedFn(async () => {
if (!siteData.base.startsWith('/russian/')) {
return;
}
if (!isLoggedIn(authInfo)) {
login();
return;
}
abortControllerRef.current?.abort();
abortControllerRef.current = new AbortController();
const signal = abortControllerRef.current.signal;
try {
await xfetch('https://cloud.alauda.io/api/v1/tenant/info', {
headers: {
Authorization: `Bearer ${authInfo.token}`,
},
signal,
});
}
catch {
if (signal.aborted) {
return;
}
setAuthBasic();
login();
}
});
useEffect(() => {
void authCheck();
}, [authCheck, pathname]);
useEffect(() => {
if (!isLoggedIn(authInfo)) {
void authCheck();
}
}, [authCheck, authInfo]);
return null;
};
export default () => (_jsx(NoSSR, { children: _jsx(AuthCheck, {}) }));