Files
lcbp3/frontend/.ignored_node_modules/next-auth/lib/client.js
2025-11-27 17:08:49 +07:00

96 lines
2.9 KiB
JavaScript

"use client";
import * as React from "react";
import { AuthError } from "@auth/core/errors";
/** @todo */
class ClientFetchError extends AuthError {
}
/** @todo */
export class ClientSessionError extends AuthError {
}
// ------------------------ Internal ------------------------
/**
* If passed 'appContext' via getInitialProps() in _app.js
* then get the req object from ctx and use that for the
* req value to allow `fetchData` to
* work seemlessly in getInitialProps() on server side
* pages *and* in _app.js.
* @internal
*/
export async function fetchData(path, __NEXTAUTH, logger, req = {}) {
const url = `${apiBaseUrl(__NEXTAUTH)}/${path}`;
try {
const options = {
headers: {
"Content-Type": "application/json",
...(req?.headers?.cookie ? { cookie: req.headers.cookie } : {}),
},
};
if (req?.body) {
options.body = JSON.stringify(req.body);
options.method = "POST";
}
const res = await fetch(url, options);
const data = await res.json();
if (!res.ok)
throw data;
return data;
}
catch (error) {
logger.error(new ClientFetchError(error.message, error));
return null;
}
}
/** @internal */
export function apiBaseUrl(__NEXTAUTH) {
if (typeof window === "undefined") {
// Return absolute path when called server side
return `${__NEXTAUTH.baseUrlServer}${__NEXTAUTH.basePathServer}`;
}
// Return relative path when called client side
return __NEXTAUTH.basePath;
}
/** @internal */
export function useOnline() {
const [isOnline, setIsOnline] = React.useState(typeof navigator !== "undefined" ? navigator.onLine : false);
const setOnline = () => setIsOnline(true);
const setOffline = () => setIsOnline(false);
React.useEffect(() => {
window.addEventListener("online", setOnline);
window.addEventListener("offline", setOffline);
return () => {
window.removeEventListener("online", setOnline);
window.removeEventListener("offline", setOffline);
};
}, []);
return isOnline;
}
/**
* Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC.
* @internal
*/
export function now() {
return Math.floor(Date.now() / 1000);
}
/**
* Returns an `URL` like object to make requests/redirects from server-side
* @internal
*/
export function parseUrl(url) {
const defaultUrl = new URL("http://localhost:3000/api/auth");
if (url && !url.startsWith("http")) {
url = `https://${url}`;
}
const _url = new URL(url || defaultUrl);
const path = (_url.pathname === "/" ? defaultUrl.pathname : _url.pathname)
// Remove trailing slash
.replace(/\/$/, "");
const base = `${_url.origin}${path}`;
return {
origin: _url.origin,
host: _url.host,
path,
base,
toString: () => base,
};
}